From c0acaf1d43e89b60a27c9580ae820ef96cd06af5 Mon Sep 17 00:00:00 2001 From: Artur Barseghyan Date: Thu, 21 Dec 2017 16:15:06 +0100 Subject: [PATCH] initial work on django 2.0 compatibility --- examples/requirements/django_2_0.txt | 5 +- .../apps/djangocms_integration/models.py | 43 +++- .../apps/feincms_integration/widgets.py | 46 +++- .../apps/mezzanine_integration/models.py | 43 +++- .../apps/wagtail_integration/abstract.py | 50 +++-- .../fields/date_drop_down/base.py | 8 +- .../db_store/migrations/0001_initial.py | 6 +- .../plugins/form_handlers/db_store/models.py | 37 +++- .../management/commands/fobi_sync_plugins.py | 13 ++ src/fobi/migrations/0001_initial.py | 14 +- src/fobi/models.py | 199 +++++++++++++----- src/fobi/tests/data.py | 2 +- src/fobi/validators.py | 10 +- 13 files changed, 354 insertions(+), 122 deletions(-) diff --git a/examples/requirements/django_2_0.txt b/examples/requirements/django_2_0.txt index 5f942b87..c0d04314 100644 --- a/examples/requirements/django_2_0.txt +++ b/examples/requirements/django_2_0.txt @@ -1,18 +1,19 @@ -r common.txt -r test.txt -r style_checkers.txt --r djangorestframework.txt +#-r djangorestframework.txt Django>=2.0,<2.1 django-admin-tools>=0.8.0 +django-autoslug-iplweb django-ckeditor>=5.4.0 django-debug-toolbar>=1.6 django-formtools>=2.0 django-registration-redux>=1.4 django-simple-captcha>=0.5.5 +djangorestframework==3.7.7 easy-thumbnails>=2.4.1 sqlparse>=0.2.2 -https://github.com/neithere/django-autoslug/archive/master.zip # django-formtools, compatible with Django 1.11 #https://github.com/django/django-formtools/archive/master.tar.gz diff --git a/src/fobi/contrib/apps/djangocms_integration/models.py b/src/fobi/contrib/apps/djangocms_integration/models.py index 7a2a4c72..e57cb7ab 100644 --- a/src/fobi/contrib/apps/djangocms_integration/models.py +++ b/src/fobi/contrib/apps/djangocms_integration/models.py @@ -21,54 +21,77 @@ __all__ = ('FobiFormWidget',) class FobiFormWidget(CMSPlugin): """Plugin for storing ``django-fobi`` form reference.""" - form_entry = models.ForeignKey('fobi.FormEntry', verbose_name=_("Form")) + form_entry = models.ForeignKey( + 'fobi.FormEntry', + verbose_name=_("Form"), + on_delete=models.CASCADE + ) form_template_name = models.CharField( - _("Form template name"), max_length=255, null=True, blank=True, + _("Form template name"), + max_length=255, + null=True, + blank=True, choices=get_form_template_choices(), help_text=_("Template to render the form with.") ) hide_form_title = models.BooleanField( - _("Hide form title"), default=False, + _("Hide form title"), + default=False, help_text=_("If checked, no form title is shown.") ) form_title = models.CharField( - _("Form title"), max_length=255, null=True, blank=True, + _("Form title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form title.") ) form_submit_button_text = models.CharField( - _("Submit button text"), max_length=255, null=True, blank=True, + _("Submit button text"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form submit button text.") ) success_page_template_name = models.CharField( - _("Success page template name"), max_length=255, null=True, blank=True, + _("Success page template name"), + max_length=255, + null=True, + blank=True, choices=get_success_page_template_choices(), help_text=_("Template to render the success page with.") ) hide_success_page_title = models.BooleanField( - _("Hide success page title"), default=False, + _("Hide success page title"), + default=False, help_text=_("If checked, no success page title is shown.") ) success_page_title = models.CharField( - _("Succes page title"), max_length=255, null=True, blank=True, + _("Succes page title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default success page title.") ) success_page_text = models.TextField( - _("Succes page text"), null=True, blank=True, + _("Succes page text"), + null=True, + blank=True, help_text=_("Overrides the default success page text.") ) search_fields = ('form_entry__name',) class Meta(object): - """Meta class.""" + """Meta options.""" app_label = 'cms' if CMS_VERSION_GT_3_0: diff --git a/src/fobi/contrib/apps/feincms_integration/widgets.py b/src/fobi/contrib/apps/feincms_integration/widgets.py index 37920b63..8a7a1f2c 100644 --- a/src/fobi/contrib/apps/feincms_integration/widgets.py +++ b/src/fobi/contrib/apps/feincms_integration/widgets.py @@ -30,52 +30,76 @@ class FobiFormWidget(models.Model, IntegrationProcessor): can_redirect = True # The configuration fields - form_entry = models.ForeignKey('fobi.FormEntry', verbose_name=_("Form")) + form_entry = models.ForeignKey( + 'fobi.FormEntry', + verbose_name=_("Form"), + on_delete=models.CASCADE + ) form_template_name = models.CharField( - _("Form template name"), max_length=255, null=True, blank=True, + _("Form template name"), + max_length=255, + null=True, + blank=True, choices=get_form_template_choices(), help_text=_("Template to render the form with.") ) hide_form_title = models.BooleanField( - _("Hide form title"), default=False, + _("Hide form title"), + default=False, help_text=_("If checked, no form title is shown.") ) form_title = models.CharField( - _("Form title"), max_length=255, null=True, blank=True, + _("Form title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form title.") ) form_submit_button_text = models.CharField( - _("Submit button text"), max_length=255, null=True, blank=True, + _("Submit button text"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form submit button text.") ) success_page_template_name = models.CharField( - _("Success page template name"), max_length=255, null=True, blank=True, + _("Success page template name"), + max_length=255, + null=True, + blank=True, choices=get_success_page_template_choices(), help_text=_("Template to render the success page with.") ) hide_success_page_title = models.BooleanField( - _("Hide success page title"), default=False, + _("Hide success page title"), + default=False, help_text=_("If checked, no success page title is shown.") ) success_page_title = models.CharField( - _("Succes page title"), max_length=255, null=True, blank=True, + _("Succes page title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default success page title.") ) success_page_text = models.TextField( - _("Succes page text"), null=True, blank=True, + _("Succes page text"), + null=True, + blank=True, help_text=_("Overrides the default success page text.") ) - class Meta: - """Meta class.""" + class Meta(object): + """Meta options.""" + abstract = True app_label = 'fobi' # db_table = 'page_page_fobiformwidget' diff --git a/src/fobi/contrib/apps/mezzanine_integration/models.py b/src/fobi/contrib/apps/mezzanine_integration/models.py index 1c7f46c7..c1ea9096 100644 --- a/src/fobi/contrib/apps/mezzanine_integration/models.py +++ b/src/fobi/contrib/apps/mezzanine_integration/models.py @@ -26,52 +26,75 @@ class FobiFormPage(Page, RichText): :property str template: If given used for rendering the form. """ - form_entry = models.ForeignKey('fobi.FormEntry', verbose_name=_("Form")) + form_entry = models.ForeignKey( + 'fobi.FormEntry', + verbose_name=_("Form"), + on_delete=models.CASCADE + ) form_template_name = models.CharField( - _("Form template name"), max_length=255, null=True, blank=True, + _("Form template name"), + max_length=255, + null=True, + blank=True, choices=get_form_template_choices(), help_text=_("Template to render the form with.") ) hide_form_title = models.BooleanField( - _("Hide form title"), default=False, + _("Hide form title"), + default=False, help_text=_("If checked, no form title is shown.") ) form_title = models.CharField( - _("Form title"), max_length=255, null=True, blank=True, + _("Form title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form title.") ) form_submit_button_text = models.CharField( - _("Submit button text"), max_length=255, null=True, blank=True, + _("Submit button text"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form submit button text.") ) success_page_template_name = models.CharField( - _("Success page template name"), max_length=255, null=True, blank=True, + _("Success page template name"), + max_length=255, + null=True, + blank=True, choices=get_success_page_template_choices(), help_text=_("Template to render the success page with.") ) hide_success_page_title = models.BooleanField( - _("Hide success page title"), default=False, + _("Hide success page title"), + default=False, help_text=_("If checked, no success page title is shown.") ) success_page_title = models.CharField( - _("Succes page title"), max_length=255, null=True, blank=True, + _("Succes page title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default success page title.") ) success_page_text = models.TextField( - _("Succes page text"), null=True, blank=True, + _("Succes page text"), + null=True, + blank=True, help_text=_("Overrides the default success page text.") ) class Meta(object): - """Meta class.""" + """Meta options.""" app_label = 'fobi' verbose_name = _("Fobi form") diff --git a/src/fobi/contrib/apps/wagtail_integration/abstract.py b/src/fobi/contrib/apps/wagtail_integration/abstract.py index fdb23c49..af28de25 100644 --- a/src/fobi/contrib/apps/wagtail_integration/abstract.py +++ b/src/fobi/contrib/apps/wagtail_integration/abstract.py @@ -77,11 +77,17 @@ class AbstractFobiFormPage(Page): :property fobi.models.FormEntry form_entry: Form entry to be rendered. """ - form_entry = models.ForeignKey('fobi.FormEntry', verbose_name=_("Form"), - on_delete=models.PROTECT) + form_entry = models.ForeignKey( + 'fobi.FormEntry', + verbose_name=_("Form"), + on_delete=models.PROTECT + ) form_template_name = models.CharField( - _("Form template name"), max_length=255, null=True, blank=True, + _("Form template name"), + max_length=255, + null=True, + blank=True, choices=get_form_template_choices(), help_text=_( "Choose an alternative template to render the form with. Leave " @@ -91,22 +97,32 @@ class AbstractFobiFormPage(Page): ) hide_form_title = models.BooleanField( - _("Hide form title"), default=False, + _("Hide form title"), + default=False, help_text=_("If checked, no form title is shown.") ) form_title = models.CharField( - _("Form title"), max_length=255, null=True, blank=True, + _("Form title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form title.") ) form_submit_button_text = models.CharField( - _("Submit button text"), max_length=255, null=True, blank=True, + _("Submit button text"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default form submit button text.") ) success_page_template_name = models.CharField( - _("Success page template name"), max_length=255, null=True, blank=True, + _("Success page template name"), + max_length=255, + null=True, + blank=True, choices=get_success_page_template_choices(), help_text=_( "Choose an alternative template to render the success page with. " @@ -116,17 +132,23 @@ class AbstractFobiFormPage(Page): ) hide_success_page_title = models.BooleanField( - _("Hide success page title"), default=False, + _("Hide success page title"), + default=False, help_text=_("If checked, no success page title is shown.") ) success_page_title = models.CharField( - _("Success page title"), max_length=255, null=True, blank=True, + _("Success page title"), + max_length=255, + null=True, + blank=True, help_text=_("Overrides the default success page title.") ) success_page_text = models.TextField( - _("Success page text"), null=True, blank=True, + _("Success page text"), + null=True, + blank=True, help_text=_("Overrides the default success page text.") ) @@ -160,7 +182,7 @@ class AbstractFobiFormPage(Page): ] class Meta(object): - """Meta class.""" + """Meta options.""" verbose_name = _('Fobi form page') verbose_name_plural = _('Fobi form pages') @@ -223,5 +245,7 @@ class AbstractFobiFormPage(Page): fobi_form_processor.show_thanks_page(request, self) ) else: - return super(AbstractFobiFormPage, self).serve_preview(request, - mode) + return super(AbstractFobiFormPage, self).serve_preview( + request, + mode + ) diff --git a/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/base.py b/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/base.py index 7751effe..0721d71c 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/base.py +++ b/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/base.py @@ -1,14 +1,20 @@ from __future__ import absolute_import -from django.forms.extras.widgets import SelectDateWidget from django.forms.fields import DateField from django.utils.translation import ugettext_lazy as _ +from nine import versions + from fobi.base import FormFieldPlugin, get_theme from . import UID from .forms import DateDropDownInputForm +if versions.DJANGO_LTE_1_11: + from django.forms.extras.widgets import SelectDateWidget +else: + from django.forms.widgets import SelectDateWidget + __title__ = 'fobi.contrib.plugins.form_elements.fields.' \ 'date_drop_down.base' __author__ = 'Artur Barseghyan ' diff --git a/src/fobi/contrib/plugins/form_handlers/db_store/migrations/0001_initial.py b/src/fobi/contrib/plugins/form_handlers/db_store/migrations/0001_initial.py index 23c2d792..9c3aa159 100644 --- a/src/fobi/contrib/plugins/form_handlers/db_store/migrations/0001_initial.py +++ b/src/fobi/contrib/plugins/form_handlers/db_store/migrations/0001_initial.py @@ -27,10 +27,12 @@ class Migration(migrations.Migration): ('form_entry', models.ForeignKey(verbose_name='Form', blank=True, to='fobi.FormEntry', - null=True)), + null=True, + on_delete=models.CASCADE)), ('user', models.ForeignKey(verbose_name='User', blank=True, to=settings.AUTH_USER_MODEL, - null=True)), + null=True, + on_delete=models.CASCADE)), ], options={ 'verbose_name': 'Saved form data entry', diff --git a/src/fobi/contrib/plugins/form_handlers/db_store/models.py b/src/fobi/contrib/plugins/form_handlers/db_store/models.py index 9b09abd8..53a34c50 100644 --- a/src/fobi/contrib/plugins/form_handlers/db_store/models.py +++ b/src/fobi/contrib/plugins/form_handlers/db_store/models.py @@ -31,15 +31,23 @@ AUTH_USER_MODEL = settings.AUTH_USER_MODEL class AbstractSavedFormDataEntry(models.Model): """Abstract saved form data entry.""" - user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_("User"), - null=True, blank=True) - form_data_headers = models.TextField(_("Form data headers"), null=True, - blank=True) + user = models.ForeignKey( + AUTH_USER_MODEL, + verbose_name=_("User"), + null=True, + blank=True, + on_delete=models.CASCADE + ) + form_data_headers = models.TextField( + _("Form data headers"), + null=True, + blank=True + ) saved_data = models.TextField(_("Plugin data"), null=True, blank=True) created = models.DateTimeField(_("Date created"), auto_now_add=True) class Meta(object): - """Meta class.""" + """Meta options.""" abstract = True @@ -72,11 +80,16 @@ class AbstractSavedFormDataEntry(models.Model): class SavedFormDataEntry(AbstractSavedFormDataEntry): """Saved form data.""" - form_entry = models.ForeignKey('fobi.FormEntry', verbose_name=_("Form"), - null=True, blank=True) + form_entry = models.ForeignKey( + 'fobi.FormEntry', + verbose_name=_("Form"), + null=True, + blank=True, + on_delete=models.CASCADE + ) class Meta(object): - """Meta class.""" + """Meta options.""" abstract = False verbose_name = _("Saved form data entry") @@ -92,11 +105,15 @@ class SavedFormWizardDataEntry(AbstractSavedFormDataEntry): """Saved form data.""" form_wizard_entry = models.ForeignKey( - 'fobi.FormWizardEntry', verbose_name=_("Form"), null=True, blank=True + 'fobi.FormWizardEntry', + verbose_name=_("Form"), + null=True, + blank=True, + on_delete=models.CASCADE ) class Meta(object): - """Meta class.""" + """Meta options.""" abstract = False verbose_name = _("Saved form wizard data entry") diff --git a/src/fobi/management/commands/fobi_sync_plugins.py b/src/fobi/management/commands/fobi_sync_plugins.py index 0e8075e9..94e58dd5 100644 --- a/src/fobi/management/commands/fobi_sync_plugins.py +++ b/src/fobi/management/commands/fobi_sync_plugins.py @@ -1,5 +1,7 @@ from django.core.management.base import BaseCommand +from nine import versions + from fobi.utils import sync_plugins @@ -13,6 +15,17 @@ class Command(BaseCommand): - ``fobi.models.FormHandlerPlugin`` """ + if versions.DJANGO_GTE_2_0: + def add_arguments(self, parser): + parser.add_argument( + '--noinput', + '--no-input', + action='store_false', + dest='interactive', + help='Tells Django to NOT prompt the user for input of any ' + 'kind.', + ) + def handle(self, *args, **options): """Handle.""" sync_plugins() diff --git a/src/fobi/migrations/0001_initial.py b/src/fobi/migrations/0001_initial.py index a04a9293..50e85ee2 100644 --- a/src/fobi/migrations/0001_initial.py +++ b/src/fobi/migrations/0001_initial.py @@ -70,7 +70,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('name', models.CharField(max_length=255, verbose_name='Name')), ('is_repeatable', models.BooleanField(default=False, help_text='Makes your form fieldset repeatable.', verbose_name='Is repeatable?')), - ('form_entry', models.ForeignKey(verbose_name='Form', blank=True, to='fobi.FormEntry', null=True)), + ('form_entry', models.ForeignKey(verbose_name='Form', blank=True, to='fobi.FormEntry', null=True, on_delete=models.CASCADE)), ], options={ 'verbose_name': 'Form fieldset entry', @@ -97,7 +97,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('plugin_data', models.TextField(null=True, verbose_name='Plugin data', blank=True)), ('plugin_uid', models.CharField(max_length=255, verbose_name='Plugin name', choices=[(b'db_store', b'DB store'), (b'mail', b'Mail'), (b'http_repost', b'HTTP Repost')])), - ('form_entry', models.ForeignKey(verbose_name='Form', to='fobi.FormEntry')), + ('form_entry', models.ForeignKey(verbose_name='Form', to='fobi.FormEntry', on_delete=models.CASCADE)), ], options={ 'abstract': False, @@ -113,7 +113,7 @@ class Migration(migrations.Migration): ('slug', autoslug.fields.AutoSlugField(verbose_name='Slug', unique=True, editable=False)), ('is_public', models.BooleanField(default=False, help_text='Makes your form wizard visible to the public.', verbose_name='Is public?')), ('is_cloneable', models.BooleanField(default=False, help_text='Makes your form wizard cloneable by other users.', verbose_name='Is cloneable?')), - ('user', models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL)), + ('user', models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)), ], options={ 'verbose_name': 'Form wizard entry', @@ -123,22 +123,22 @@ class Migration(migrations.Migration): migrations.AddField( model_name='formentry', name='form_wizard_entry', - field=models.ForeignKey(verbose_name='Form wizard', blank=True, to='fobi.FormWizardEntry', null=True), + field=models.ForeignKey(verbose_name='Form wizard', blank=True, to='fobi.FormWizardEntry', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='formentry', name='user', - field=models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL), + field=models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), migrations.AddField( model_name='formelemententry', name='form_entry', - field=models.ForeignKey(verbose_name='Form', to='fobi.FormEntry'), + field=models.ForeignKey(verbose_name='Form', to='fobi.FormEntry', on_delete=models.CASCADE), ), migrations.AddField( model_name='formelemententry', name='form_fieldset_entry', - field=models.ForeignKey(verbose_name='Form fieldset', blank=True, to='fobi.FormFieldsetEntry', null=True), + field=models.ForeignKey(verbose_name='Form fieldset', blank=True, to='fobi.FormFieldsetEntry', null=True, on_delete=models.CASCADE), ), migrations.AlterUniqueTogether( name='formwizardentry', diff --git a/src/fobi/models.py b/src/fobi/models.py index 1d5fb7d8..15c2cb6d 100644 --- a/src/fobi/models.py +++ b/src/fobi/models.py @@ -260,33 +260,52 @@ class FormWizardHandler(AbstractPluginModel): class FormWizardEntry(models.Model): """Form wizard entry.""" - user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_("User")) + user = models.ForeignKey( + AUTH_USER_MODEL, + verbose_name=_("User"), + on_delete=models.CASCADE + ) name = models.CharField(_("Name"), max_length=255) - title = models.CharField(_("Title"), max_length=255, null=True, - blank=True, help_text=_("Shown in templates if " - "available.")) - slug = AutoSlugField(populate_from='name', verbose_name=_("Slug"), - unique=True) + title = models.CharField( + _("Title"), + max_length=255, + null=True, + blank=True, + help_text=_("Shown in templates if available.") + ) + slug = AutoSlugField( + populate_from='name', + verbose_name=_("Slug"), + unique=True + ) is_public = models.BooleanField( - _("Is public?"), default=False, + _("Is public?"), + default=False, help_text=_("Makes your form wizard visible to the public.") ) is_cloneable = models.BooleanField( - _("Is cloneable?"), default=False, + _("Is cloneable?"), + default=False, help_text=_("Makes your form wizard cloneable by other users.") ) success_page_title = models.CharField( - _("Success page title"), max_length=255, null=True, blank=True, + _("Success page title"), + max_length=255, + null=True, + blank=True, help_text=_("Custom message title to display after valid form is " "submitted") ) success_page_message = models.TextField( - _("Success page body"), null=True, blank=True, + _("Success page body"), + null=True, + blank=True, help_text=_("Custom message text to display after valid form is " "submitted") ) show_all_navigation_buttons = models.BooleanField( - _("Show all navigation buttons?"), default=False, + _("Show all navigation buttons?"), + default=False, help_text=_("Show all navigation buttons.") ) # action = models.CharField( @@ -295,14 +314,26 @@ class FormWizardEntry(models.Model): # "really necessary.") # ) wizard_type = models.CharField( - _("Type"), max_length=255, null=False, blank=False, - choices=WIZARD_TYPES, default=DEFAULT_WIZARD_TYPE, + _("Type"), + max_length=255, + null=False, + blank=False, + choices=WIZARD_TYPES, + default=DEFAULT_WIZARD_TYPE, help_text=_("Type of the form wizard.") ) - created = models.DateTimeField(_("Created"), null=True, blank=True, - auto_now_add=True) - updated = models.DateTimeField(_("Updated"), null=True, blank=True, - auto_now=True) + created = models.DateTimeField( + _("Created"), + null=True, + blank=True, + auto_now_add=True + ) + updated = models.DateTimeField( + _("Updated"), + null=True, + blank=True, + auto_now=True + ) class Meta(object): """Meta class.""" @@ -343,44 +374,70 @@ class FormEntry(models.Model): - `position` (int): Ordering position in the wizard. """ - user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_("User")) + user = models.ForeignKey( + AUTH_USER_MODEL, + verbose_name=_("User"), + on_delete=models.CASCADE + ) name = models.CharField(_("Name"), max_length=255) - title = models.CharField(_("Title"), max_length=255, null=True, - blank=True, help_text=_("Shown in templates if " - "available.")) + title = models.CharField( + _("Title"), + max_length=255, + null=True, + blank=True, + help_text=_("Shown in templates if available.") + ) slug = AutoSlugField( populate_from='name', verbose_name=_("Slug"), unique=True ) is_public = models.BooleanField( - _("Public?"), default=False, + _("Public?"), + default=False, help_text=_("Makes your form visible to the public.") ) is_cloneable = models.BooleanField( - _("Cloneable?"), default=False, + _("Cloneable?"), + default=False, help_text=_("Makes your form cloneable by other users.") ) # position = models.PositiveIntegerField( # _("Position"), null=True, blank=True # ) success_page_title = models.CharField( - _("Success page title"), max_length=255, null=True, blank=True, + _("Success page title"), + max_length=255, + null=True, + blank=True, help_text=_("Custom message title to display after valid form is " "submitted") ) success_page_message = models.TextField( - _("Success page body"), null=True, blank=True, + _("Success page body"), + null=True, + blank=True, help_text=_("Custom message text to display after valid form is " "submitted") ) action = models.CharField( - _("Action"), max_length=255, null=True, blank=True, + _("Action"), + max_length=255, + null=True, + blank=True, help_text=_("Custom form action; don't fill this field, unless really " "necessary.") ) - created = models.DateTimeField(_("Created"), null=True, blank=True, - auto_now_add=True) - updated = models.DateTimeField(_("Updated"), null=True, blank=True, - auto_now=True) + created = models.DateTimeField( + _("Created"), + null=True, + blank=True, + auto_now_add=True + ) + updated = models.DateTimeField( + _("Updated"), + null=True, + blank=True, + auto_now=True + ) class Meta(object): """Meta class.""" @@ -411,14 +468,25 @@ class FormWizardFormEntry(models.Model): A coupling point between `FormWizardEntry` and `FormEntry`.""" - form_wizard_entry = models.ForeignKey(FormWizardEntry, - verbose_name=_("Form wizard entry"), - null=False, blank=False) - form_entry = models.ForeignKey(FormEntry, - verbose_name=_("Form entry"), - null=False, blank=False) - position = models.PositiveIntegerField(_("Position"), null=True, - blank=True) + form_wizard_entry = models.ForeignKey( + FormWizardEntry, + verbose_name=_("Form wizard entry"), + null=False, + blank=False, + on_delete=models.CASCADE + ) + form_entry = models.ForeignKey( + FormEntry, + verbose_name=_("Form entry"), + null=False, + blank=False, + on_delete=models.CASCADE + ) + position = models.PositiveIntegerField( + _("Position"), + null=True, + blank=True + ) class Meta(object): """Meta class.""" @@ -437,11 +505,17 @@ class FormWizardFormEntry(models.Model): class FormFieldsetEntry(models.Model): """Form fieldset entry.""" - form_entry = models.ForeignKey(FormEntry, verbose_name=_("Form"), - null=True, blank=True) + form_entry = models.ForeignKey( + FormEntry, + verbose_name=_("Form"), + null=True, + blank=True, + on_delete=models.CASCADE + ) name = models.CharField(_("Name"), max_length=255) is_repeatable = models.BooleanField( - _("Is repeatable?"), default=False, + _("Is repeatable?"), + default=False, help_text=_("Makes your form fieldset repeatable.") ) @@ -465,8 +539,11 @@ class BaseAbstractPluginEntry(models.Model): - `plugin_data` (str): JSON formatted string with plugin data. """ - plugin_data = models.TextField(verbose_name=_("Plugin data"), null=True, - blank=True) + plugin_data = models.TextField( + verbose_name=_("Plugin data"), + null=True, + blank=True + ) class Meta(object): """Meta class.""" @@ -558,7 +635,11 @@ class AbstractPluginEntry(BaseAbstractPluginEntry): - `plugin_data` (str): JSON formatted string with plugin data. """ - form_entry = models.ForeignKey(FormEntry, verbose_name=_("Form")) + form_entry = models.ForeignKey( + FormEntry, + verbose_name=_("Form"), + on_delete=models.CASCADE + ) class Meta(object): """Meta class.""" @@ -596,11 +677,18 @@ class FormElementEntry(AbstractPluginEntry): _("Plugin name"), max_length=255, # choices=get_registered_form_element_plugins() ) - form_fieldset_entry = models.ForeignKey(FormFieldsetEntry, - verbose_name=_("Form fieldset"), - null=True, blank=True) - position = models.PositiveIntegerField(_("Position"), null=True, - blank=True) + form_fieldset_entry = models.ForeignKey( + FormFieldsetEntry, + verbose_name=_("Form fieldset"), + null=True, + blank=True, + on_delete=models.CASCADE + ) + position = models.PositiveIntegerField( + _("Position"), + null=True, + blank=True + ) class Meta(object): """Meta class.""" @@ -631,7 +719,8 @@ class FormHandlerEntry(AbstractPluginEntry): """ plugin_uid = models.CharField( - _("Plugin name"), max_length=255, + _("Plugin name"), + max_length=255, # choices=get_registered_form_handler_plugins() ) @@ -662,8 +751,11 @@ class AbstractFormWizardPluginEntry(BaseAbstractPluginEntry): - `plugin_data` (str): JSON formatted string with plugin data. """ - form_wizard_entry = models.ForeignKey(FormWizardEntry, - verbose_name=_("Form wizard")) + form_wizard_entry = models.ForeignKey( + FormWizardEntry, + verbose_name=_("Form wizard"), + on_delete=models.CASCADE + ) class Meta(object): """Meta class.""" @@ -688,7 +780,8 @@ class FormWizardHandlerEntry(AbstractFormWizardPluginEntry): """ plugin_uid = models.CharField( - _("Plugin name"), max_length=255, + _("Plugin name"), + max_length=255, # choices=get_registered_form_handler_plugins() ) diff --git a/src/fobi/tests/data.py b/src/fobi/tests/data.py index 646883d6..ba4a797e 100644 --- a/src/fobi/tests/data.py +++ b/src/fobi/tests/data.py @@ -3,7 +3,7 @@ from collections import OrderedDict import datetime # from decimal import Decimal -from django.utils.text import force_text +from django.utils.encoding import force_text from faker import Faker diff --git a/src/fobi/validators.py b/src/fobi/validators.py index ffa0e93c..df2f6cfc 100644 --- a/src/fobi/validators.py +++ b/src/fobi/validators.py @@ -1,3 +1,7 @@ +from django.conf import settings + +from nine import versions + import requests from requests.exceptions import ( @@ -9,8 +13,10 @@ from requests.exceptions import ( RetryError ) -from django.conf import settings -from django.core.urlresolvers import resolve, Resolver404 +if versions.DJANGO_LTE_1_11: + from django.core.urlresolvers import resolve, Resolver404 +else: + from django.urls import resolve, Resolver404 try: from localeurl.utils import strip_path