def test_to_python(self): field = HookSelectField() self.assertEqual(field.to_python(None), []) self.assertEqual(field.to_python(""), []) self.assertEqual(field.to_python(["do_foo", "do_bar"]), ["do_foo", "do_bar"]) self.assertEqual(field.to_python("do_foo,do_bar"), ["do_foo", "do_bar"])
def test_db_prep_save(self): field = HookSelectField("test") field.set_attributes_from_name("hooks") self.assertEqual(None, field.get_db_prep_save(None, connection=None)) self.assertEqual( "do_foo,do_bar", field.get_db_prep_save(["do_foo", "do_bar"], connection=None), )
class HookSelectModel(models.Model): hooks = HookSelectField(null=True, blank=True, help_text="Some hooks")
class Form(models.Model): """ The form class. """ title = models.CharField( _('Title'), max_length=255 ) slug = models.SlugField( _('Slug'), allow_unicode=True, max_length=255, unique=True, help_text=_('Used to identify the form in template tags') ) template_name = models.CharField( _('Template'), max_length=255, choices=get_setting('FORM_TEMPLATES') ) fields = FormFieldsStreamField( [], verbose_name=_('Fields') ) submit_button_text = models.CharField( _('Submit button text'), max_length=100, default='Submit' ) success_message = models.CharField( _('Success message'), blank=True, max_length=255, help_text=_('An optional success message to show when the form has been successfully submitted') ) error_message = models.CharField( _('Error message'), blank=True, max_length=255, help_text=_('An optional error message to show when the form has validation errors') ) post_redirect_page = models.ForeignKey( 'wagtailcore.Page', verbose_name=_('Post redirect page'), on_delete=models.SET_NULL, null=True, blank=True, related_name='+', help_text=_('The page to redirect to after a successful submission') ) process_form_submission_hooks = HookSelectField( verbose_name=_('Submission hooks'), blank=True ) settings_panels = [ FieldPanel('title', classname='full'), FieldPanel('slug'), FieldPanel('template_name'), FieldPanel('submit_button_text'), MultiFieldPanel([ FieldPanel('success_message'), FieldPanel('error_message'), ], _('Messages')), FieldPanel('process_form_submission_hooks', classname='choice_field'), PageChooserPanel('post_redirect_page') ] field_panels = [ StreamFieldPanel('fields'), ] edit_handler = TabbedInterface([ ObjectList(settings_panels, heading=_('General')), ObjectList(field_panels, heading=_('Fields')), ]) def __str__(self): return self.title class Meta: ordering = ['title', ] verbose_name = _('Form') verbose_name_plural = _('Forms') def copy(self): """ Copy this form and its fields. """ form_copy = Form( title=self.title, slug=uuid.uuid4(), template_name=self.template_name, fields=self.fields, submit_button_text=self.submit_button_text, success_message=self.success_message, error_message=self.error_message, post_redirect_page=self.post_redirect_page, process_form_submission_hooks=self.process_form_submission_hooks ) form_copy.save() # additionally copy the advanced settings if they exist SettingsModel = get_advanced_settings_model() if SettingsModel: try: advanced = SettingsModel.objects.get(form=self) advanced.pk = None advanced.form = form_copy advanced.save() except SettingsModel.DoesNotExist: pass return form_copy copy.alters_data = True def get_data_fields(self): """ Returns a list of tuples with (field_name, field_label). """ data_fields = [ ('submit_time', _('Submission date')), ] data_fields += [ (get_slug_from_string(field['value']['label']), field['value']['label']) for field in self.get_form_fields() ] return data_fields def get_form(self, *args, **kwargs): """ Returns the form. """ form_class = self.get_form_class() return form_class(*args, **kwargs) def get_form_class(self): """ Returns the form class. """ return FormBuilder(self.get_form_fields()).get_form_class() def get_form_fields(self): """ Returns the form fields stream_data. """ return self.fields.stream_data def get_submission_class(self): """ Returns submission class. """ return FormSubmission def process_form_submission(self, form): """ Runs each hook if selected in the form. """ for fn in hooks.get_hooks('process_form_submission'): if fn.__name__ in self.process_form_submission_hooks: fn(self, form)
class AbstractForm(models.Model): site = models.ForeignKey(Site, on_delete=models.SET_NULL, null=True, blank=True) title = models.CharField(_("Title"), max_length=255) slug = models.SlugField( _("Slug"), allow_unicode=True, max_length=255, unique=True, help_text=_("Used to identify the form in template tags"), ) template_name = models.CharField( _("Template"), max_length=255, choices=get_setting("FORM_TEMPLATES") ) fields = FormFieldsStreamField([], verbose_name=_("Fields")) submit_button_text = models.CharField( _("Submit button text"), max_length=100, default="Submit" ) success_message = models.CharField( _("Success message"), blank=True, max_length=255, help_text=_( "An optional success message to show when the form has been successfully submitted" ), ) error_message = models.CharField( _("Error message"), blank=True, max_length=255, help_text=_( "An optional error message to show when the form has validation errors" ), ) post_redirect_page = models.ForeignKey( "wagtailcore.Page", verbose_name=_("Post redirect page"), on_delete=models.SET_NULL, null=True, blank=True, related_name="+", help_text=_("The page to redirect to after a successful submission"), ) process_form_submission_hooks = HookSelectField( verbose_name=_("Submission hooks"), blank=True ) objects = FormQuerySet.as_manager() settings_panels = [ FieldPanel("title", classname="full"), FieldPanel("slug"), FieldPanel("template_name"), FieldPanel("submit_button_text"), MultiFieldPanel( [FieldPanel("success_message"), FieldPanel("error_message")], _("Messages") ), FieldPanel("process_form_submission_hooks", classname="choice_field"), PageChooserPanel("post_redirect_page"), ] field_panels = [StreamFieldPanel("fields")] edit_handler = TabbedInterface( [ ObjectList(settings_panels, heading=_("General")), ObjectList(field_panels, heading=_("Fields")), ] ) def __str__(self): return self.title class Meta: abstract = True ordering = ["title"] verbose_name = _("Form") verbose_name_plural = _("Forms") def copy(self): """Copy this form and its fields.""" form_copy = Form( site=self.site, title=self.title, slug=uuid.uuid4(), template_name=self.template_name, fields=self.fields, submit_button_text=self.submit_button_text, success_message=self.success_message, error_message=self.error_message, post_redirect_page=self.post_redirect_page, process_form_submission_hooks=self.process_form_submission_hooks, ) form_copy.save() # additionally copy the advanced settings if they exist SettingsModel = get_advanced_settings_model() if SettingsModel: try: advanced = SettingsModel.objects.get(form=self) advanced.pk = None advanced.form = form_copy advanced.save() except SettingsModel.DoesNotExist: pass return form_copy copy.alters_data = True def get_data_fields(self): """Returns a list of tuples with (field_name, field_label).""" data_fields = [("submit_time", _("Submission date"))] data_fields += [ (get_slug_from_string(field["value"]["label"]), field["value"]["label"]) for field in self.get_form_fields() ] return data_fields def get_form(self, *args, **kwargs): """Returns the form.""" form_class = self.get_form_class() return form_class(*args, **kwargs) def get_form_class(self): """Returns the form class.""" return FormBuilder(self.get_form_fields()).get_form_class() def get_form_fields(self): """Returns the form field's stream data.""" if WAGTAIL_VERSION >= (2, 12): form_fields = self.fields.raw_data else: form_fields = self.fields.stream_data for fn in hooks.get_hooks("construct_submission_form_fields"): form_fields = fn(form_fields) return form_fields def get_submission_class(self): """Returns submission class.""" return FormSubmission def process_form_submission(self, form): """Runs each hook if selected in the form.""" for fn in hooks.get_hooks("process_form_submission"): if fn.__name__ in self.process_form_submission_hooks: fn(self, form)
def test_to_python(self): field = HookSelectField() self.assertEqual(field.to_python(None), []) self.assertEqual(field.to_python(''), []) self.assertEqual(field.to_python(['do_foo', 'do_bar']), ['do_foo', 'do_bar']) self.assertEqual(field.to_python('do_foo,do_bar'), ['do_foo', 'do_bar'])