def get_setting_edit_handler(model): if hasattr(model, 'edit_handler'): edit_handler = model.edit_handler else: panels = extract_panel_definitions_from_model_class(model, ['site']) edit_handler = ObjectList(panels) return edit_handler.bind_to(model=model)
def _patch_other_models(self, model): translation_registered_fields = translator.get_options_for_model( model).fields if hasattr(model, 'edit_handler'): edit_handler = model.edit_handler for tab in edit_handler.children: tab.children = self._patch_panels(tab.children) elif hasattr(model, 'panels'): model.panels = self._patch_panels(model.panels) else: panels = extract_panel_definitions_from_model_class(model) panels = filter( lambda field: field.field_name not in translation_registered_fields, panels) edit_handler = ObjectList(panels) if VERSION < (2, 5): SNIPPET_EDIT_HANDLERS[model] = edit_handler.bind_to_model( model) else: SNIPPET_EDIT_HANDLERS[model] = edit_handler.bind_to( model=model) # OVERRIDE FIELDS model_fields = model._meta.get_fields() for field in model_fields: if isinstance(field, StreamField ) and field.name in translation_registered_fields: descriptor = getattr(model, field.name) _patch_stream_field_meaningful_value(descriptor)
def get_edit_handler(self): if hasattr(self.model, 'edit_handler'): edit_handler = self.model.edit_handler else: fields_to_exclude = self.model_admin.get_form_fields_exclude(request=self.request) panels = extract_panel_definitions_from_model_class(self.model, exclude=fields_to_exclude) edit_handler = ObjectList(panels) return edit_handler.bind_to(model=self.model)
class TestObjectList(TestCase): def setUp(self): self.request = RequestFactory().get('/') user = AnonymousUser( ) # technically, Anonymous users cannot access the admin self.request.user = user # a custom ObjectList for EventPage self.event_page_object_list = ObjectList([ FieldPanel('title', widget=forms.Textarea), FieldPanel('date_from'), FieldPanel('date_to'), InlinePanel('speakers', label="Speakers"), ], heading='Event details', classname="shiny").bind_to( model=EventPage, request=self.request) def test_get_form_class(self): EventPageForm = self.event_page_object_list.get_form_class() form = EventPageForm() # form must include the 'speakers' formset required by the speakers InlinePanel self.assertIn('speakers', form.formsets) # form must respect any overridden widgets self.assertEqual(type(form.fields['title'].widget), forms.Textarea) def test_render(self): EventPageForm = self.event_page_object_list.get_form_class() event = EventPage(title='Abergavenny sheepdog trials') form = EventPageForm(instance=event) object_list = self.event_page_object_list.bind_to( instance=event, form=form, ) result = object_list.render() # result should contain ObjectList furniture self.assertIn('<ul class="objects">', result) # result should contain h2 headings (including labels) for children self.assertInHTML( '<h2><label for="id_date_from">Start date</label></h2>', result) # result should include help text for children self.assertIn( '<div class="object-help help"><span class="icon-help-inverse" aria-hidden="true"></span>Not required if event is on a single day</div>', result) # result should contain rendered content from descendants self.assertIn('Abergavenny sheepdog trials</textarea>', result) # this result should not include fields that are not covered by the panel definition self.assertNotIn('signup_link', result)
def get_edit_handler(self): if hasattr(self.model, 'edit_handler'): edit_handler = self.model.edit_handler else: fields_to_exclude = self.model_admin.get_form_fields_exclude( request=self.request) panels = extract_panel_definitions_from_model_class( self.model, exclude=fields_to_exclude) edit_handler = ObjectList(panels) return edit_handler.bind_to(model=self.model)
def get_poll_edit_handler(model): if model not in SNIPPET_EDIT_HANDLERS: if hasattr(model, 'edit_handler'): edit_handler = model.edit_handler else: panels = extract_panel_definitions_from_model_class(model) edit_handler = ObjectList(panels) SNIPPET_EDIT_HANDLERS[model] = edit_handler.bind_to(model=model) return SNIPPET_EDIT_HANDLERS[model]
def test_render(self): """ Check that the inline panel renders the panels set on the model when no 'panels' parameter is passed in the InlinePanel definition """ speaker_object_list = ObjectList([ InlinePanel('speakers', label="Speakers", classname="classname-for-speakers") ]).bind_to(model=EventPage, request=self.request) EventPageForm = speaker_object_list.get_form_class() # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset self.assertEqual(['speakers'], list(EventPageForm.formsets.keys())) event_page = EventPage.objects.get(slug='christmas') form = EventPageForm(instance=event_page) panel = speaker_object_list.bind_to(instance=event_page, form=form) result = panel.render_as_field() self.assertIn('<li class="object classname-for-speakers">', result) self.assertIn('<label for="id_speakers-0-first_name">Name:</label>', result) self.assertIn('value="Father"', result) self.assertIn('<label for="id_speakers-0-last_name">Surname:</label>', result) self.assertIn('<label for="id_speakers-0-image">Image:</label>', result) self.assertIn('Choose an image', result) # rendered panel must also contain hidden fields for id, DELETE and ORDER self.assertTagInHTML( '<input id="id_speakers-0-id" name="speakers-0-id" type="hidden">', result, allow_extra_attrs=True) self.assertTagInHTML( '<input id="id_speakers-0-DELETE" name="speakers-0-DELETE" type="hidden">', result, allow_extra_attrs=True) self.assertTagInHTML( '<input id="id_speakers-0-ORDER" name="speakers-0-ORDER" type="hidden">', result, allow_extra_attrs=True) # rendered panel must contain maintenance form for the formset self.assertTagInHTML( '<input id="id_speakers-TOTAL_FORMS" name="speakers-TOTAL_FORMS" type="hidden">', result, allow_extra_attrs=True) # rendered panel must include the JS initializer self.assertIn('var panel = InlinePanel({', result)
def get_snippet_edit_handler(model): if model not in SNIPPET_EDIT_HANDLERS: if hasattr(model, 'edit_handler'): # use the edit handler specified on the page class edit_handler = model.edit_handler else: panels = extract_panel_definitions_from_model_class(model) edit_handler = ObjectList(panels) SNIPPET_EDIT_HANDLERS[model] = edit_handler.bind_to(model=model) return SNIPPET_EDIT_HANDLERS[model]
class TestObjectList(TestCase): def setUp(self): self.request = RequestFactory().get('/') user = AnonymousUser() # technically, Anonymous users cannot access the admin self.request.user = user # a custom ObjectList for EventPage self.event_page_object_list = ObjectList([ FieldPanel('title', widget=forms.Textarea), FieldPanel('date_from'), FieldPanel('date_to'), InlinePanel('speakers', label="Speakers"), ], heading='Event details', classname="shiny").bind_to( model=EventPage, request=self.request) def test_get_form_class(self): EventPageForm = self.event_page_object_list.get_form_class() form = EventPageForm() # form must include the 'speakers' formset required by the speakers InlinePanel self.assertIn('speakers', form.formsets) # form must respect any overridden widgets self.assertEqual(type(form.fields['title'].widget), forms.Textarea) def test_render(self): EventPageForm = self.event_page_object_list.get_form_class() event = EventPage(title='Abergavenny sheepdog trials') form = EventPageForm(instance=event) object_list = self.event_page_object_list.bind_to( instance=event, form=form, ) result = object_list.render() # result should contain ObjectList furniture self.assertIn('<ul class="objects">', result) # result should contain h2 headings (including labels) for children self.assertInHTML('<h2><label for="id_date_from">Start date</label></h2>', result) # result should include help text for children self.assertIn('<div class="object-help help"><span class="icon-help-inverse" aria-hidden="true"></span>Not required if event is on a single day</div>', result) # result should contain rendered content from descendants self.assertIn('Abergavenny sheepdog trials</textarea>', result) # this result should not include fields that are not covered by the panel definition self.assertNotIn('signup_link', result)
def test_render(self): """ Check that the inline panel renders the panels set on the model when no 'panels' parameter is passed in the InlinePanel definition """ speaker_object_list = ObjectList([ InlinePanel('speakers', label="Speakers", classname="classname-for-speakers") ]).bind_to(model=EventPage, request=self.request) EventPageForm = speaker_object_list.get_form_class() # SpeakerInlinePanel should instruct the form class to include a 'speakers' formset self.assertEqual(['speakers'], list(EventPageForm.formsets.keys())) event_page = EventPage.objects.get(slug='christmas') form = EventPageForm(instance=event_page) panel = speaker_object_list.bind_to(instance=event_page, form=form) result = panel.render_as_field() self.assertIn('<li class="object classname-for-speakers">', result) self.assertIn('<label for="id_speakers-0-first_name">Name:</label>', result) self.assertIn('value="Father"', result) self.assertIn('<label for="id_speakers-0-last_name">Surname:</label>', result) self.assertIn('<label for="id_speakers-0-image">Image:</label>', result) self.assertIn('Choose an image', result) # rendered panel must also contain hidden fields for id, DELETE and ORDER self.assertTagInHTML( '<input id="id_speakers-0-id" name="speakers-0-id" type="hidden">', result, allow_extra_attrs=True ) self.assertTagInHTML( '<input id="id_speakers-0-DELETE" name="speakers-0-DELETE" type="hidden">', result, allow_extra_attrs=True ) self.assertTagInHTML( '<input id="id_speakers-0-ORDER" name="speakers-0-ORDER" type="hidden">', result, allow_extra_attrs=True ) # rendered panel must contain maintenance form for the formset self.assertTagInHTML( '<input id="id_speakers-TOTAL_FORMS" name="speakers-TOTAL_FORMS" type="hidden">', result, allow_extra_attrs=True ) # rendered panel must include the JS initializer self.assertIn('var panel = InlinePanel({', result)
def _patch_other_models(self, model): if hasattr(model, 'edit_handler'): edit_handler = model.edit_handler for tab in edit_handler.children: tab.children = self._patch_panels(tab.children) elif hasattr(model, 'panels'): model.panels = self._patch_panels(model.panels) else: panels = extract_panel_definitions_from_model_class(model) translation_registered_fields = translator.get_options_for_model( model).fields panels = filter( lambda field: field.field_name not in translation_registered_fields, panels) edit_handler = ObjectList(panels) SNIPPET_EDIT_HANDLERS[model] = edit_handler.bind_to(model=model)
def get_edit_handler(self): if hasattr(self.model, 'edit_handler'): edit_handler = self.model.edit_handler elif hasattr(self.model, 'panels'): edit_handler = ObjectList(self.model.panels) else: edit_handler = TabbedInterface([ ObjectList(self.model.content_panels, heading=_("Content")), ObjectList(self.model.settings_panels, heading=_("Settings"), classname="settings"), ]) if hasattr(edit_handler, 'bind_to'): # For Wagtail>=2.5 return edit_handler.bind_to(model=self.model) return edit_handler.bind_to_model(self.model)
def get_workflow_edit_handler(): """ Returns an edit handler which provides the "name" and "tasks" fields for workflow. """ # Note. It's a bit of a hack that we use edit handlers here. Ideally, it should be # made easier to reuse the inline panel templates for any formset. # Since this form is internal, we're OK with this for now. We might want to revisit # this decision later if we decide to allow custom fields on Workflows. panels = [ FieldPanel("name", heading=_("Give your workflow a name"), classname="full title"), InlinePanel("workflow_tasks", [ FieldPanel('task', widget=AdminTaskChooser(show_clear_link=False)), ], heading=_("Add tasks to your workflow")), ] edit_handler = ObjectList(panels, base_form_class=WagtailAdminModelForm) return edit_handler.bind_to(model=Workflow)