diff --git a/opentech/apply/funds/edit_handlers.py b/opentech/apply/funds/edit_handlers.py index 3098a98f8f7865b4a4eb3bd414ba8cefef620957..5b89c032b384e03bcf6efb42b99ef17cb096c5e6 100644 --- a/opentech/apply/funds/edit_handlers.py +++ b/opentech/apply/funds/edit_handlers.py @@ -1,33 +1,44 @@ +from django.forms import Field from django.forms.utils import pretty_name from django.urls import reverse -from django.utils.html import format_html, mark_safe +from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from wagtail.wagtailcore.models import Page from wagtail.wagtailadmin.edit_handlers import BaseFieldPanel, EditHandler, FieldPanel +class DisplayField(Field): + pass + # widget = + + class BaseReadOnlyPanel(EditHandler): - def render(self): - value = getattr(self.instance, self.attr) + template = 'wagtailadmin/edit_handlers/single_field_panel.html' + field_template = 'wagtailadmin/shared/field.html' + + def context(self): + try: + value = getattr(self.instance, self.attr) + except AttributeError: + self.attr = str(self.instance) + value = self.instance + if callable(value): value = value() - return format_html('<div style="padding-top: 1.2em;">{}</div>', value) + + self.form.initial[self.attr] = value + self.bound_field = DisplayField().get_bound_field(self.form, self.attr) + return { + 'self': self, + 'field': self.bound_field, + } def render_as_object(self): - return format_html( - '<fieldset><legend>{}</legend>' - '<ul class="fields"><li><div class="field">{}</div></li></ul>' - '</fieldset>', - self.heading, self.render()) + return render_to_string(self.template, self.context()) def render_as_field(self): - return format_html( - '<div class="field">' - '<label>{}{}</label>' - '<div class="field-content">{}</div>' - '</div>', - self.heading, _(':'), self.render()) + return render_to_string(self.field_template, self.context()) class ReadOnlyPanel: @@ -37,9 +48,12 @@ class ReadOnlyPanel: self.classname = classname def bind_to_model(self, model): - return type(str(_('ReadOnlyPanel')), (BaseReadOnlyPanel,), - {'attr': self.attr, 'heading': self.heading, - 'classname': self.classname}) + kwargs = { + 'attr': self.attr, + 'heading': self.heading, + 'classname': self.classname, + } + return type(str(_('ReadOnlyPanel')), (BaseReadOnlyPanel,), kwargs) def reverse_edit(obj): @@ -51,27 +65,29 @@ def reverse_edit(obj): class BaseReadOnlyInlinePanel(BaseReadOnlyPanel): - def render(self): + template = 'wagtailadmin/edit_handlers/multi_field_panel.html' + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) values = getattr(self.instance, self.attr).all() - return mark_safe( - ''.join( - '<div style="padding-top: 1.2em;">' - f'{value}<br><a class="button button-small" href="{reverse_edit(value.form)}">Edit</a></div>' - for value in values - ) - ) + self.children = [BaseReadOnlyPanel(value, form=self.form) for value in values] class ReadOnlyInlinePanel: - def __init__(self, attr, heading=None, classname=''): + def __init__(self, attr, heading=None, classname='', help_text=''): self.attr = attr self.heading = pretty_name(self.attr) if heading is None else heading self.classname = classname + self.help_text = help_text def bind_to_model(self, model): - return type(str(_('ReadOnlyPanel')), (BaseReadOnlyInlinePanel,), - {'attr': self.attr, 'heading': self.heading, - 'classname': self.classname}) + kwargs = { + 'attr': self.attr, + 'heading': self.heading, + 'classname': self.classname, + 'help_text': self.help_text + } + return type(str(_('ReadOnlyPanel')), (BaseReadOnlyInlinePanel,), kwargs) class BaseFilteredFieldPanel(BaseFieldPanel):