diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 091f0089..266ea8e8 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,23 @@ are used for versioning (schema follows below): 0.3.4 to 0.4). - All backwards incompatible changes are mentioned in this document. +0.9 +--- +2016-10-24 + +Note, that this release contain minor backwards incompatible changes, that +may break your existing code (your data is left intact). If you have written +custom form element plugins you should update your code! + +- The :method:`get_form_field_instances` + and :method:`_get_form_field_instances` of + the :class:`fobi.base.FormElementPlugin` both accept two new optional + arguments: `form_entry` and `form_element_entries` as well as **kwargs. + Make sure to update your custom plugins if you have written any. +- Minor fixes in the form wizards: forms in intermediate steps do receive + updates from the `submit_plugin_form_data` of the plugins. +- Fixed issue in the `base_bulk_change_plugins` function on Django 1.10. + 0.8.10 ------ 2016-10-22 diff --git a/README.rst b/README.rst index e1df292a..e1617efc 100644 --- a/README.rst +++ b/README.rst @@ -89,7 +89,7 @@ Roadmap ======= Some of the upcoming/in-development features/improvements are: -- Integration with `django-rest-framework` (in version 0.9). +- Integration with `django-rest-framework` (in version 0.10). See the `TODOS `_ for the full list of planned-, pending- in-development- or to-be-implemented diff --git a/ROADMAP.rst b/ROADMAP.rst index fd2e8935..bc9bf6e7 100644 --- a/ROADMAP.rst +++ b/ROADMAP.rst @@ -1,7 +1,7 @@ Roadmap of upcoming releases ============================ -0.9 ---- +0.10 +---- yyyy-mm-ddd (upcoming). This release contains minor backwards incompatible changes, related to the diff --git a/TODOS.rst b/TODOS.rst index 813cb090..47021ca3 100644 --- a/TODOS.rst +++ b/TODOS.rst @@ -36,7 +36,7 @@ Regarding the form wizards issue in "Uncategorised". - Rethink the new navigation of forms and form wizards. - Add support for form wizard conditions. -- Fixed broken dependencies for docs. ++ Fixed broken dependencies for docs. Roadmap ------- diff --git a/examples/simple/override_radio_plugin/fobi_form_elements.py b/examples/simple/override_radio_plugin/fobi_form_elements.py index aef17dd0..347221fb 100644 --- a/examples/simple/override_radio_plugin/fobi_form_elements.py +++ b/examples/simple/override_radio_plugin/fobi_form_elements.py @@ -21,12 +21,13 @@ class RadioInputPlugin(FormFieldPlugin): group = _("Fields") form = RadioInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) widget_attrs = {'class': theme.form_radio_element_html_class} - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -35,7 +36,7 @@ class RadioInputPlugin(FormFieldPlugin): 'widget': RadioSelect(attrs=widget_attrs), } - return [(self.data.name, ChoiceField, kwargs)] + return [(self.data.name, ChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/examples/simple/override_select_model_object_plugin/fobi_form_elements.py b/examples/simple/override_select_model_object_plugin/fobi_form_elements.py index 93a48f71..2353f2d3 100644 --- a/examples/simple/override_select_model_object_plugin/fobi_form_elements.py +++ b/examples/simple/override_select_model_object_plugin/fobi_form_elements.py @@ -22,13 +22,14 @@ class SelectModelObjectInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectModelObjectInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" app_label, model_name = self.data.model.split('.') model = models.get_model(app_label, model_name) queryset = model._default_manager.all() - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -37,7 +38,7 @@ class SelectModelObjectInputPlugin(FormFieldPlugin): 'widget': Select(attrs={'class': theme.form_element_html_class}), } - return [(self.data.name, ModelChoiceField, kwargs)] + return [(self.data.name, ModelChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/examples/tutorial/foo/fobi_form_callbacks.py b/examples/tutorial/foo/fobi_form_callbacks.py index 3219ee1f..7811dcf7 100644 --- a/examples/tutorial/foo/fobi_form_callbacks.py +++ b/examples/tutorial/foo/fobi_form_callbacks.py @@ -1,10 +1,15 @@ from fobi.constants import CALLBACK_FORM_VALID from fobi.base import FormCallback, form_callback_registry + class SampleFooCallback(FormCallback): + """SampleFooCallback.""" + stage = CALLBACK_FORM_VALID def callback(self, form_entry, request, form): + """Callback.""" print("Great! Your form is valid!") + form_callback_registry.register(SampleFooCallback) diff --git a/examples/tutorial/sample_layout/fobi_form_elements.py b/examples/tutorial/sample_layout/fobi_form_elements.py index 33585a30..0a17002a 100644 --- a/examples/tutorial/sample_layout/fobi_form_elements.py +++ b/examples/tutorial/sample_layout/fobi_form_elements.py @@ -2,14 +2,17 @@ from fobi.base import form_element_plugin_widget_registry from sample_textarea.widgets import BaseSampleTextareaPluginWidget + class SampleTextareaPluginWidget(BaseSampleTextareaPluginWidget): - theme_uid = 'sample_layout' # Theme for which the widget is loaded + """SampleTextareaPluginWidget.""" + + theme_uid = 'sample_layout' # Theme for which the widget is loaded media_js = [ 'sample_layout/js/fobi.plugins.form_elements.sample_textarea.js', - ] + ] media_css = [ 'sample_layout/css/fobi.plugins.form_elements.sample_textarea.css', - ] + ] form_element_plugin_widget_registry.register(SampleTextareaPluginWidget) diff --git a/examples/tutorial/sample_mail/fobi_form_handlers.py b/examples/tutorial/sample_mail/fobi_form_handlers.py index 7fa4ea23..32f4d5f0 100644 --- a/examples/tutorial/sample_mail/fobi_form_handlers.py +++ b/examples/tutorial/sample_mail/fobi_form_handlers.py @@ -6,7 +6,10 @@ from fobi.base import FormHandlerPlugin, form_handler_plugin_registry from sample_mail.forms import SampleMailForm + class SampleMailHandlerPlugin(FormHandlerPlugin): + """SampleMailHandlerPlugin.""" + uid = "sample_mail" name = _("Sample mail") form = SampleMailForm @@ -17,14 +20,13 @@ class SampleMailHandlerPlugin(FormHandlerPlugin): json.dumps(form.cleaned_data), self.data.from_email, [self.data.to_email], - fail_silently = True - ) + fail_silently=True + ) def plugin_data_repr(self): - """ - Human readable representation of plugin data. + """Human readable representation of plugin data. - :return string: + :return str: """ return self.data.__dict__ diff --git a/examples/tutorial/sample_textarea/fobi_form_elements.py b/examples/tutorial/sample_textarea/fobi_form_elements.py index c012666a..78a417c9 100644 --- a/examples/tutorial/sample_textarea/fobi_form_elements.py +++ b/examples/tutorial/sample_textarea/fobi_form_elements.py @@ -1,23 +1,28 @@ from django import forms from fobi.base import FormFieldPlugin, form_element_plugin_registry -from sample_textarea.forms import SampleTextareaForm + +from .forms import SampleTextareaForm + class SampleTextareaPlugin(FormFieldPlugin): + """SampleTextareaPlugin.""" + uid = "sample_textarea" name = "Sample Textarea" form = SampleTextareaForm - group = "Samples" # Group to which the plugin belongs to + group = "Samples" # Group to which the plugin belongs to - def get_form_field_instances(self, request=None): - kwargs = { + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): + field_kwargs = { 'required': self.data.required, 'label': self.data.label, 'initial': self.data.initial, - 'widget': forms.widgets.Textarea(attrs={}) + 'widget': forms.widgets.Textarea(attrs={}) } - return [(self.data.name, forms.CharField, kwargs),] + return [(self.data.name, forms.CharField, field_kwargs)] form_element_plugin_registry.register(SampleTextareaPlugin) diff --git a/examples/tutorial/sample_textarea/forms.py b/examples/tutorial/sample_textarea/forms.py index 847cdd4e..055c4511 100644 --- a/examples/tutorial/sample_textarea/forms.py +++ b/examples/tutorial/sample_textarea/forms.py @@ -2,7 +2,10 @@ from django import forms from fobi.base import BasePluginForm + class SampleTextareaForm(forms.Form, BasePluginForm): + """SampleTextareaForm.""" + plugin_data_fields = [ ("name", ""), ("label", ""), diff --git a/examples/tutorial/sample_textarea/widgets.py b/examples/tutorial/sample_textarea/widgets.py index a92ea482..ea34714a 100644 --- a/examples/tutorial/sample_textarea/widgets.py +++ b/examples/tutorial/sample_textarea/widgets.py @@ -1,6 +1,8 @@ from fobi.base import FormElementPluginWidget + class BaseSampleTextareaPluginWidget(FormElementPluginWidget): + """BaseSampleTextareaPluginWidget.""" + # Same as ``uid`` value of the ``SampleTextareaPlugin``. plugin_uid = "sample_textarea" - diff --git a/setup.py b/setup.py index 83a43b2e..e3074666 100644 --- a/setup.py +++ b/setup.py @@ -204,7 +204,7 @@ for locale_dir in locale_dirs: for f in os.listdir(locale_dir)] -version = '0.8.10' +version = '0.9' install_requires = [] # If certain version of Django is already installed, choose version agnostic diff --git a/src/fobi/__init__.py b/src/fobi/__init__.py index f9f6a099..2b68d392 100644 --- a/src/fobi/__init__.py +++ b/src/fobi/__init__.py @@ -1,6 +1,6 @@ __title__ = 'django-fobi' -__version__ = '0.8.10' -__build__ = 0x000061 +__version__ = '0.9' +__build__ = 0x000062 __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/admin.py b/src/fobi/admin.py index e9d01be6..219940eb 100644 --- a/src/fobi/admin.py +++ b/src/fobi/admin.py @@ -3,13 +3,13 @@ from django.contrib import admin from django.contrib import messages from django.contrib.admin import helpers from django.contrib.admin.views.decorators import staff_member_required -from django.shortcuts import render_to_response, redirect +from django.shortcuts import redirect from django.template import RequestContext from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ from django.utils.html import strip_tags -from nine.versions import DJANGO_LTE_1_5 +from nine import versions from .constants import ACTION_CHOICE_REPLACE from .forms import ( @@ -32,6 +32,11 @@ from .models import ( FormWizardHandlerEntry ) +if versions.DJANGO_GTE_1_10: + from django.shortcuts import render +else: + from django.shortcuts import render_to_response + __title__ = 'fobi.admin' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' @@ -97,11 +102,15 @@ def base_bulk_change_plugins(PluginForm, named_url, modeladmin, request, 'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'named_url': named_url, } - return render_to_response( - 'fobi/admin/bulk_change_plugins.html', - context, - context_instance=RequestContext(request) - ) + + template_name = 'fobi/admin/bulk_change_plugins.html' + + if versions.DJANGO_GTE_1_10: + return render(request, template_name, context) + else: + return render_to_response( + template_name, context, context_instance=RequestContext(request) + ) def bulk_change_form_element_plugins(modeladmin, request, queryset): @@ -321,7 +330,7 @@ class FormElementEntryAdmin(admin.ModelAdmin): def __queryset(self, request): """Internal method used in get_queryset or queryset methods.""" - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = super(FormElementEntryAdmin, self).queryset(request) else: queryset = super(FormElementEntryAdmin, self).get_queryset(request) @@ -329,7 +338,7 @@ class FormElementEntryAdmin(admin.ModelAdmin): queryset = queryset.select_related('form_entry', 'form_fieldset_entry') return queryset get_queryset = __queryset - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = __queryset # admin.site.register(FormElementEntry, FormElementEntryAdmin) @@ -361,7 +370,7 @@ class FormHandlerEntryAdmin(admin.ModelAdmin): def __queryset(self, request): """Internal method used in get_queryset or queryset methods.""" - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = super(FormHandlerEntryAdmin, self).queryset(request) else: queryset = super(FormHandlerEntryAdmin, self).get_queryset(request) @@ -369,7 +378,7 @@ class FormHandlerEntryAdmin(admin.ModelAdmin): queryset = queryset.select_related('form_entry',) return queryset get_queryset = __queryset - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = __queryset # admin.site.register(FormHandlerEntry, FormHandlerEntryAdmin) @@ -412,7 +421,7 @@ class BasePluginModelAdmin(admin.ModelAdmin): def __queryset(self, request): """Internal method used in get_queryset or queryset methods.""" - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = super(BasePluginModelAdmin, self).queryset(request) else: queryset = super(BasePluginModelAdmin, self).get_queryset(request) @@ -420,7 +429,7 @@ class BasePluginModelAdmin(admin.ModelAdmin): queryset = queryset.prefetch_related('users', 'groups') return queryset get_queryset = __queryset - if DJANGO_LTE_1_5: + if versions.DJANGO_LTE_1_5: queryset = __queryset def _get_bulk_change_form_class(self): diff --git a/src/fobi/base.py b/src/fobi/base.py index c0527338..9481bf63 100644 --- a/src/fobi/base.py +++ b/src/fobi/base.py @@ -1356,7 +1356,8 @@ class FormElementPlugin(BasePlugin): def _get_form_field_instances(self, form_element_entry=None, origin=None, kwargs_update_func=None, return_func=None, - extra={}, request=None): + extra={}, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances (internal method). Used internally. Do not override this method. Gets the instances of @@ -1366,6 +1367,11 @@ class FormElementPlugin(BasePlugin): :param string origin: :param callable kwargs_update_func: :param callable return_func: + :param dict extra: + :param django.http.HttpRequest request: + :param fobi.models.FormEntry form_entry: + :param django.db.models.QuerySet form_element_entries: Queryset of + :class:`fobi.models.FormElementEntry` instances. :return list: List of Django form field instances. """ # For the moment, this piece of code has to be present here. @@ -1380,12 +1386,18 @@ class FormElementPlugin(BasePlugin): # goes wrong. Otherwise - skip the element. if DEBUG: form_field_instances = self.get_form_field_instances( - request=request + request=request, + form_entry=form_entry, + form_element_entries=form_element_entries, + **kwargs ) else: try: form_field_instances = self.get_form_field_instances( - request=request + request=request, + form_entry=form_entry, + form_element_entries=form_element_entries, + **kwargs ) except AttributeError as e: return [] @@ -1462,10 +1474,14 @@ class FormElementPlugin(BasePlugin): return processed_field_instances - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get the instances of form fields, that plugin contains. :param django.http.HttpRequest request: + :param fobi.models.FormEntry form_entry: + :param django.db.models.QuerySet form_element_entries: Queryset of + :class:`fobi.models.FormElementEntry` instances. :return list: List of Django form field instances. :example: @@ -1530,12 +1546,17 @@ class FormElementPlugin(BasePlugin): :param django.http.HttpRequest request: :param django.forms.Form form: """ - try: + if DEBUG: return self.submit_plugin_form_data( form_entry=form_entry, request=request, form=form ) - except Exception as e: - logger.debug(str(e)) + else: + try: + return self.submit_plugin_form_data( + form_entry=form_entry, request=request, form=form + ) + except Exception as e: + logger.debug(str(e)) def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data. @@ -1895,6 +1916,15 @@ class BaseRegistry(object): self._registry = {} self._forced = [] + @property + def registry(self): + """Shortcut to self._registry.""" + return self._registry + + def items(self): + """Shortcut to self._registry.items().""" + return self._registry.items() + def register(self, cls, force=False): """Registers the plugin in the registry. diff --git a/src/fobi/contrib/plugins/form_elements/content/content_image/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/content/content_image/fobi_form_elements.py index 4146c7f8..e23c9377 100644 --- a/src/fobi/contrib/plugins/form_elements/content/content_image/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/content/content_image/fobi_form_elements.py @@ -55,7 +55,8 @@ class ContentImagePlugin(FormElementPlugin): ) return self.get_cloned_plugin_data(update={'file': cloned_image}) - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" width, height = self.data.size.split('x') crop = get_crop_filter(self.data.fit_method) @@ -75,13 +76,13 @@ class ContentImagePlugin(FormElementPlugin): } rendered_image = render_to_string('content_image/render.html', context) - kwargs = { + field_kwargs = { 'initial': rendered_image, 'required': False, 'label': '', } - return [(self.data.name, NoneField, kwargs)] + return [(self.data.name, NoneField, field_kwargs)] form_element_plugin_registry.register(ContentImagePlugin) diff --git a/src/fobi/contrib/plugins/form_elements/content/content_text/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/content/content_text/fobi_form_elements.py index f329a92b..ca854754 100644 --- a/src/fobi/contrib/plugins/form_elements/content/content_text/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/content/content_text/fobi_form_elements.py @@ -33,15 +33,16 @@ class ContentTextPlugin(FormElementPlugin): """ self.data.name = "{0}_{1}".format(self.uid, uuid4()) - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'initial': "

{0}

".format(smart_str(self.data.text)), 'required': False, 'label': '', } - return [(self.data.name, NoneField, kwargs)] + return [(self.data.name, NoneField, field_kwargs)] form_element_plugin_registry.register(ContentTextPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/content/content_video/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/content/content_video/fobi_form_elements.py index a800bbd0..c9465ebc 100644 --- a/src/fobi/contrib/plugins/form_elements/content/content_video/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/content/content_video/fobi_form_elements.py @@ -34,11 +34,12 @@ class ContentVideoPlugin(FormElementPlugin): """ self.data.name = "{0}_{1}".format(self.uid, uuid4()) - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" width, height = self.data.size.split('x') - kwargs = { + field_kwargs = { 'initial': '
{0}
'.format( render_video(self.data.url, width, height) ), @@ -46,7 +47,7 @@ class ContentVideoPlugin(FormElementPlugin): 'label': '', } - return [(self.data.name, NoneField, kwargs)] + return [(self.data.name, NoneField, field_kwargs)] form_element_plugin_registry.register(ContentVideoPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/boolean/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/boolean/fobi_form_elements.py index 7004a13d..af42d223 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/boolean/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/boolean/fobi_form_elements.py @@ -22,16 +22,17 @@ class BooleanSelectPlugin(FormFieldPlugin): group = _("Fields") form = BooleanSelectForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, 'required': self.data.required, } - return [(self.data.name, BooleanField, kwargs)] + return [(self.data.name, BooleanField, field_kwargs)] form_element_plugin_registry.register(BooleanSelectPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/checkbox_select_multiple/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/checkbox_select_multiple/fobi_form_elements.py index cfcafae8..2834aa69 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/checkbox_select_multiple/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/checkbox_select_multiple/fobi_form_elements.py @@ -30,11 +30,12 @@ class CheckboxSelectMultipleInputPlugin(FormFieldPlugin): group = _("Fields") form = CheckboxSelectMultipleInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -45,7 +46,7 @@ class CheckboxSelectMultipleInputPlugin(FormFieldPlugin): ), } - return [(self.data.name, MultipleChoiceField, kwargs)] + return [(self.data.name, MultipleChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/date/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/date/fobi_form_elements.py index 26f2b50c..9fe33b04 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/date/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/date/fobi_form_elements.py @@ -26,14 +26,15 @@ class DateInputPlugin(FormFieldPlugin): group = _("Fields") form = DateInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'date', } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -44,7 +45,7 @@ class DateInputPlugin(FormFieldPlugin): # if self.data.input_formats: # kwargs['input_formats'] = self.data.input_formats - return [(self.data.name, DateField, kwargs)] + return [(self.data.name, DateField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/fobi_form_elements.py index 68c3cb22..a007664c 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/date_drop_down/fobi_form_elements.py @@ -26,7 +26,8 @@ class DateDropDownInputPlugin(FormFieldPlugin): group = _("Fields") form = DateDropDownInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, @@ -37,7 +38,7 @@ class DateDropDownInputPlugin(FormFieldPlugin): if self.data.year_min and self.data.year_max: years = range(self.data.year_min, self.data.year_max) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -48,7 +49,7 @@ class DateDropDownInputPlugin(FormFieldPlugin): # if self.data.input_formats: # kwargs['input_formats'] = self.data.input_formats - return [(self.data.name, DateField, kwargs)] + return [(self.data.name, DateField, field_kwargs)] form_element_plugin_registry.register(DateDropDownInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/datetime/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/datetime/fobi_form_elements.py index 8ffb142e..44df3f82 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/datetime/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/datetime/fobi_form_elements.py @@ -27,14 +27,15 @@ class DateTimeInputPlugin(FormFieldPlugin): group = _("Fields") form = DateTimeInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'datetime', } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -45,7 +46,7 @@ class DateTimeInputPlugin(FormFieldPlugin): # if self.data.input_formats: # kwargs['input_formats'] = self.data.input_formats - return [(self.data.name, DateTimeField, kwargs)] + return [(self.data.name, DateTimeField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/decimal/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/decimal/fobi_form_elements.py index 52ff6805..21b45b08 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/decimal/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/decimal/fobi_form_elements.py @@ -27,36 +27,37 @@ class DecimalInputPlugin(FormFieldPlugin): group = _("Fields") form = DecimalInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'number', 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, 'required': self.data.required, } if self.data.max_value: - kwargs['max_value'] = self.data.max_value + field_kwargs['max_value'] = self.data.max_value widget_attrs['max'] = self.data.max_value if self.data.min_value: - kwargs['min_value'] = self.data.min_value + field_kwargs['min_value'] = self.data.min_value widget_attrs['min'] = self.data.min_value if self.data.max_digits: - kwargs['max_digits'] = self.data.max_digits + field_kwargs['max_digits'] = self.data.max_digits widget_attrs['max'] = self.data.max_value if self.data.decimal_places: - kwargs['decimal_places'] = self.data.decimal_places + field_kwargs['decimal_places'] = self.data.decimal_places widget_attrs['min'] = self.data.min_value - kwargs['widget'] = NumberInput(attrs=widget_attrs) + field_kwargs['widget'] = NumberInput(attrs=widget_attrs) - return [(self.data.name, DecimalField, kwargs)] + return [(self.data.name, DecimalField, field_kwargs)] form_element_plugin_registry.register(DecimalInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/email/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/email/fobi_form_elements.py index 57591c4d..aadeb46c 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/email/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/email/fobi_form_elements.py @@ -27,7 +27,8 @@ class EmailInputPlugin(FormFieldPlugin): group = _("Fields") form = EmailInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, @@ -35,7 +36,7 @@ class EmailInputPlugin(FormFieldPlugin): 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -43,9 +44,9 @@ class EmailInputPlugin(FormFieldPlugin): 'widget': TextInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, EmailField, kwargs)] + return [(self.data.name, EmailField, field_kwargs)] # For backwards compatibility diff --git a/src/fobi/contrib/plugins/form_elements/fields/file/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/file/fobi_form_elements.py index 99ca6157..354e9786 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/file/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/file/fobi_form_elements.py @@ -27,9 +27,10 @@ class FileInputPlugin(FormFieldPlugin): group = _("Fields") form = FileInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -37,9 +38,9 @@ class FileInputPlugin(FormFieldPlugin): 'widget': ClearableFileInput(attrs={}), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, FileField, kwargs)] + return [(self.data.name, FileField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process file upload. diff --git a/src/fobi/contrib/plugins/form_elements/fields/float/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/float/fobi_form_elements.py index d11ed92a..096c1ad6 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/float/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/float/fobi_form_elements.py @@ -25,29 +25,30 @@ class FloatInputPlugin(FormFieldPlugin): group = _("Fields") form = FloatInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'number', 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, 'required': self.data.required, } if self.data.max_value: - kwargs['max_value'] = self.data.max_value + field_kwargs['max_value'] = self.data.max_value widget_attrs['max'] = self.data.max_value if self.data.min_value: - kwargs['min_value'] = self.data.min_value + field_kwargs['min_value'] = self.data.min_value widget_attrs['min'] = self.data.min_value - kwargs['widget'] = NumberInput(attrs=widget_attrs) + field_kwargs['widget'] = NumberInput(attrs=widget_attrs) - return [(self.data.name, FloatField, kwargs)] + return [(self.data.name, FloatField, field_kwargs)] form_element_plugin_registry.register(FloatInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/hidden/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/hidden/fobi_form_elements.py index 2b0e9132..98f5b33e 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/hidden/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/hidden/fobi_form_elements.py @@ -26,9 +26,10 @@ class HiddenInputPlugin(FormFieldPlugin): form = HiddenInputForm is_hidden = True - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'label': self.data.label, 'initial': self.data.initial, 'required': self.data.required, @@ -37,9 +38,9 @@ class HiddenInputPlugin(FormFieldPlugin): ), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, CharField, kwargs)] + return [(self.data.name, CharField, field_kwargs)] # return [(self.data.name, (CharField, TextInput), kwargs)] diff --git a/src/fobi/contrib/plugins/form_elements/fields/input/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/input/fobi_form_elements.py index c705968b..7825b6bb 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/input/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/input/fobi_form_elements.py @@ -25,7 +25,8 @@ class InputPlugin(FormFieldPlugin): group = _("Fields") form = InputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, @@ -71,7 +72,7 @@ class InputPlugin(FormFieldPlugin): 'reset',): widget_attrs.update({'value': self.data.label}) - kwargs = { + field_kwargs = { 'label': self.data.label if self.data.type_value not in ('submit', 'button', 'reset',) else '', @@ -83,7 +84,7 @@ class InputPlugin(FormFieldPlugin): # if self.data.max_length: # kwargs['max_length'] = self.data.max_length - return [(self.data.name, Field, kwargs)] + return [(self.data.name, Field, field_kwargs)] form_element_plugin_registry.register(InputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/integer/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/integer/fobi_form_elements.py index 0870a391..97eb49a6 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/integer/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/integer/fobi_form_elements.py @@ -25,29 +25,30 @@ class IntegerInputPlugin(FormFieldPlugin): group = _("Fields") form = IntegerInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'number', 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, 'required': self.data.required, } if self.data.max_value: - kwargs['max_value'] = self.data.max_value + field_kwargs['max_value'] = self.data.max_value widget_attrs['max'] = self.data.max_value if self.data.min_value: - kwargs['min_value'] = self.data.min_value + field_kwargs['min_value'] = self.data.min_value widget_attrs['min'] = self.data.min_value - kwargs['widget'] = NumberInput(attrs=widget_attrs) + field_kwargs['widget'] = NumberInput(attrs=widget_attrs) - return [(self.data.name, IntegerField, kwargs)] + return [(self.data.name, IntegerField, field_kwargs)] form_element_plugin_registry.register(IntegerInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/ip_address/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/ip_address/fobi_form_elements.py index 16cb45f0..45d50c0b 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/ip_address/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/ip_address/fobi_form_elements.py @@ -27,14 +27,15 @@ class IPAddressInputPlugin(FormFieldPlugin): group = _("Fields") form = IPAddressInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -42,9 +43,9 @@ class IPAddressInputPlugin(FormFieldPlugin): 'widget': TextInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, GenericIPAddressField, kwargs)] + return [(self.data.name, GenericIPAddressField, field_kwargs)] form_element_plugin_registry.register(IPAddressInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/null_boolean/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/null_boolean/fobi_form_elements.py index 2d360876..fec42fdd 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/null_boolean/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/null_boolean/fobi_form_elements.py @@ -25,9 +25,10 @@ class NullBooleanSelectPlugin(FormFieldPlugin): group = _("Fields") form = NullBooleanSelectForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -37,7 +38,7 @@ class NullBooleanSelectPlugin(FormFieldPlugin): ), } - return [(self.data.name, NullBooleanField, kwargs)] + return [(self.data.name, NullBooleanField, field_kwargs)] form_element_plugin_registry.register(NullBooleanSelectPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/password/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/password/fobi_form_elements.py index 3d219d94..84cebb6a 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/password/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/password/fobi_form_elements.py @@ -25,14 +25,15 @@ class PasswordInputPlugin(FormFieldPlugin): group = _("Fields") form = PasswordInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -40,9 +41,9 @@ class PasswordInputPlugin(FormFieldPlugin): 'widget': PasswordInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, CharField, kwargs)] + return [(self.data.name, CharField, field_kwargs)] form_element_plugin_registry.register(PasswordInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/radio/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/radio/fobi_form_elements.py index 5e0f8b2f..96d57032 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/radio/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/radio/fobi_form_elements.py @@ -30,12 +30,13 @@ class RadioInputPlugin(FormFieldPlugin): group = _("Fields") form = RadioInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) widget_attrs = {'class': theme.form_radio_element_html_class} - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -44,7 +45,7 @@ class RadioInputPlugin(FormFieldPlugin): 'widget': RadioSelect(attrs=widget_attrs), } - return [(self.data.name, ChoiceField, kwargs)] + return [(self.data.name, ChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/range_select/conf.py b/src/fobi/contrib/plugins/form_elements/fields/range_select/conf.py index 22fdc867..c2814585 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/range_select/conf.py +++ b/src/fobi/contrib/plugins/form_elements/fields/range_select/conf.py @@ -2,8 +2,7 @@ from django.conf import settings from . import defaults -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'range_select.conf' +__title__ = 'fobi.contrib.plugins.form_elements.fields.range_select.conf' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/range_select/defaults.py b/src/fobi/contrib/plugins/form_elements/fields/range_select/defaults.py index 461e7d49..3a1c2e65 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/range_select/defaults.py +++ b/src/fobi/contrib/plugins/form_elements/fields/range_select/defaults.py @@ -1,5 +1,4 @@ -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'range_select.defaults' +__title__ = 'fobi.contrib.plugins.form_elements.fields.range_select.defaults' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/range_select/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/range_select/fobi_form_elements.py index d1f3c669..11946833 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/range_select/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/range_select/fobi_form_elements.py @@ -8,8 +8,8 @@ from . import UID from .forms import RangeSelectInputForm from .settings import INITIAL, MAX_VALUE, MIN_VALUE, STEP -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'range_select.fobi_form_elements' +__title__ = 'fobi.contrib.plugins.form_elements.fields.range_select.' \ + 'fobi_form_elements' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' @@ -19,14 +19,15 @@ theme = get_theme(request=None, as_instance=True) class RangeSelectInputPlugin(FormFieldPlugin): - """Percentage field plugin.""" + """Range select input plugin.""" uid = UID name = _("Range select") group = _("Fields") form = RangeSelectInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" initial = self.data.initial if self.data.initial else INITIAL max_value = self.data.max_value if self.data.max_value else MAX_VALUE @@ -36,7 +37,7 @@ class RangeSelectInputPlugin(FormFieldPlugin): _choices = range(min_value, max_value, step) choices = zip(_choices, _choices) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': initial, @@ -45,7 +46,7 @@ class RangeSelectInputPlugin(FormFieldPlugin): 'widget': Select(attrs={'class': theme.form_element_html_class}), } - return [(self.data.name, ChoiceField, kwargs)] + return [(self.data.name, ChoiceField, field_kwargs)] form_element_plugin_registry.register(RangeSelectInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/range_select/settings.py b/src/fobi/contrib/plugins/form_elements/fields/range_select/settings.py index 0e488be4..0f198e68 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/range_select/settings.py +++ b/src/fobi/contrib/plugins/form_elements/fields/range_select/settings.py @@ -1,7 +1,6 @@ from .conf import get_setting -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'range_select.settings' +__title__ = 'fobi.contrib.plugins.form_elements.fields.range_select.settings' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/regex/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/regex/fobi_form_elements.py index fecd4546..4f281f4c 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/regex/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/regex/fobi_form_elements.py @@ -27,14 +27,15 @@ class RegexInputPlugin(FormFieldPlugin): group = _("Fields") form = RegexInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'regex': self.data.regex, @@ -44,9 +45,9 @@ class RegexInputPlugin(FormFieldPlugin): } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, RegexField, kwargs)] + return [(self.data.name, RegexField, field_kwargs)] form_element_plugin_registry.register(RegexInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/select/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select/fobi_form_elements.py index 84f53cbf..c0f77614 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select/fobi_form_elements.py @@ -30,11 +30,12 @@ class SelectInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -43,7 +44,7 @@ class SelectInputPlugin(FormFieldPlugin): 'widget': Select(attrs={'class': theme.form_element_html_class}), } - return [(self.data.name, ChoiceField, kwargs)] + return [(self.data.name, ChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_model_object/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_model_object/fobi_form_elements.py index 5226f072..b24bf424 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_model_object/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_model_object/fobi_form_elements.py @@ -43,13 +43,14 @@ class SelectModelObjectInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectModelObjectInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" app_label, model_name = get_app_label_and_model_name(self.data.model) model = get_model(app_label, model_name) queryset = model._default_manager.all() - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -58,7 +59,7 @@ class SelectModelObjectInputPlugin(FormFieldPlugin): 'widget': Select(attrs={'class': theme.form_element_html_class}), } - return [(self.data.name, ModelChoiceField, kwargs)] + return [(self.data.name, ModelChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_mptt_model_object/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_mptt_model_object/fobi_form_elements.py index 21225fa0..033367df 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_mptt_model_object/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_mptt_model_object/fobi_form_elements.py @@ -44,13 +44,14 @@ class SelectMPTTModelObjectInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectMPTTModelObjectInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" app_label, model_name = get_app_label_and_model_name(self.data.model) model = get_model(app_label, model_name) queryset = model._default_manager.all() - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -59,7 +60,7 @@ class SelectMPTTModelObjectInputPlugin(FormFieldPlugin): 'widget': Select(attrs={'class': theme.form_element_html_class}), } - return [(self.data.name, TreeNodeChoiceField, kwargs)] + return [(self.data.name, TreeNodeChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_multiple/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_multiple/fobi_form_elements.py index 8c7a031e..b69ea658 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_multiple/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_multiple/fobi_form_elements.py @@ -30,11 +30,12 @@ class SelectMultipleInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectMultipleInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -45,7 +46,7 @@ class SelectMultipleInputPlugin(FormFieldPlugin): ), } - return [(self.data.name, MultipleChoiceField, kwargs)] + return [(self.data.name, MultipleChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """ diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_model_objects/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_model_objects/fobi_form_elements.py index 35fdd996..6670fd6a 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_model_objects/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_model_objects/fobi_form_elements.py @@ -44,13 +44,14 @@ class SelectMultipleModelObjectsInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectMultipleModelObjectsInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" app_label, model_name = get_app_label_and_model_name(self.data.model) model = get_model(app_label, model_name) queryset = model._default_manager.all() - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -61,7 +62,7 @@ class SelectMultipleModelObjectsInputPlugin(FormFieldPlugin): ), } - return [(self.data.name, ModelMultipleChoiceField, kwargs)] + return [(self.data.name, ModelMultipleChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """ diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_mptt_model_objects/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_mptt_model_objects/fobi_form_elements.py index 03a79969..27b514c1 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_mptt_model_objects/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_mptt_model_objects/fobi_form_elements.py @@ -45,13 +45,14 @@ class SelectMultipleMPTTModelObjectsInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectMultipleMPTTModelObjectsInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" app_label, model_name = get_app_label_and_model_name(self.data.model) model = get_model(app_label, model_name) queryset = model._default_manager.all() - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -62,7 +63,7 @@ class SelectMultipleMPTTModelObjectsInputPlugin(FormFieldPlugin): ), } - return [(self.data.name, TreeNodeMultipleChoiceField, kwargs)] + return [(self.data.name, TreeNodeMultipleChoiceField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_with_max/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_with_max/fobi_form_elements.py index 84855714..2fbab69a 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/select_multiple_with_max/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/select_multiple_with_max/fobi_form_elements.py @@ -30,11 +30,12 @@ class SelectMultipleWithMaxInputPlugin(FormFieldPlugin): group = _("Fields") form = SelectMultipleWithMaxInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" choices = get_select_field_choices(self.data.choices) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -46,9 +47,9 @@ class SelectMultipleWithMaxInputPlugin(FormFieldPlugin): } if self.data.max_choices: - kwargs['max_choices'] = self.data.max_choices + field_kwargs['max_choices'] = self.data.max_choices - return [(self.data.name, MultipleChoiceWithMaxField, kwargs)] + return [(self.data.name, MultipleChoiceWithMaxField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/conf.py b/src/fobi/contrib/plugins/form_elements/fields/slider/conf.py index ed997c3d..9963d5de 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/conf.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/conf.py @@ -2,8 +2,7 @@ from django.conf import settings from . import defaults -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'slider.conf' +__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.conf' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/defaults.py b/src/fobi/contrib/plugins/form_elements/fields/slider/defaults.py index 37d62ccb..2088236a 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/defaults.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/defaults.py @@ -1,5 +1,4 @@ -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'slider.defaults' +__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.defaults' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/slider/fobi_form_elements.py index 655d53e8..fc655e3b 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/fobi_form_elements.py @@ -18,8 +18,8 @@ from .constants import ( from .forms import SliderInputForm from .settings import INITIAL, MAX_VALUE, MIN_VALUE, STEP -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'slider_percentage.fobi_form_elements' +__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.' \ + 'fobi_form_elements' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' @@ -37,7 +37,8 @@ class SliderInputPlugin(FormFieldPlugin): form = SliderInputForm html_classes = ['slider'] - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" initial = self.data.initial if self.data.initial else INITIAL max_value = self.data.max_value if self.data.max_value else MAX_VALUE @@ -150,7 +151,7 @@ class SliderInputPlugin(FormFieldPlugin): 'append_html': mark_safe(''.join(append_html_list)), }) - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': initial, @@ -159,7 +160,7 @@ class SliderInputPlugin(FormFieldPlugin): 'widget': RichSelect(**widget_kwargs), } - return [(self.data.name, ChoiceField, kwargs)] + return [(self.data.name, ChoiceField, field_kwargs)] form_element_plugin_registry.register(SliderInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/forms.py b/src/fobi/contrib/plugins/form_elements/fields/slider/forms.py index bd227e71..c000573b 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/forms.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/forms.py @@ -28,11 +28,12 @@ theme = get_theme(request=None, as_instance=True) class SliderInputForm(forms.Form, BaseFormFieldPluginForm): - """Form for ``SliderPercentageInputPlugin``.""" + """Form for ``SliderInputPlugin``.""" plugin_data_fields = [ ("label", ""), ("name", ""), + ("initial", INITIAL), ("min_value", MIN_VALUE), ("max_value", MAX_VALUE), ("step", STEP), @@ -44,7 +45,6 @@ class SliderInputForm(forms.Form, BaseFormFieldPluginForm): ("label_end", ""), # ("custom_ticks", ""), ("help_text", ""), - ("initial", INITIAL), ("required", False) ] @@ -62,6 +62,16 @@ class SliderInputForm(forms.Form, BaseFormFieldPluginForm): attrs={'class': theme.form_element_html_class} ) ) + initial = forms.IntegerField( + label=_("Initial"), + required=False, + widget=forms.widgets.TextInput( + attrs={'class': theme.form_element_html_class} + ), + min_value=MIN_VALUE, + max_value=MAX_VALUE, + initial=INITIAL + ) min_value = forms.IntegerField( label=_("Min value"), required=True, @@ -165,16 +175,6 @@ class SliderInputForm(forms.Form, BaseFormFieldPluginForm): attrs={'class': theme.form_element_html_class} ) ) - initial = forms.IntegerField( - label=_("Initial"), - required=False, - widget=forms.widgets.TextInput( - attrs={'class': theme.form_element_html_class} - ), - min_value=MIN_VALUE, - max_value=MAX_VALUE, - initial=INITIAL - ) required = forms.BooleanField( label=_("Required"), required=False, diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/settings.py b/src/fobi/contrib/plugins/form_elements/fields/slider/settings.py index 4ae10942..bd3ca811 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/settings.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/settings.py @@ -1,7 +1,6 @@ from .conf import get_setting -__title__ = 'fobi.contrib.plugins.form_elements.fields.' \ - 'slider.settings' +__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.settings' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/slider/widgets.py b/src/fobi/contrib/plugins/form_elements/fields/slider/widgets.py index 0c5a7eeb..5d29edb2 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slider/widgets.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slider/widgets.py @@ -4,8 +4,7 @@ from fobi.base import FormElementPluginWidget from . import UID -__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.' \ - 'widgets' +__title__ = 'fobi.contrib.plugins.form_elements.fields.slider.widgets' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' __license__ = 'GPL 2.0/LGPL 2.1' diff --git a/src/fobi/contrib/plugins/form_elements/fields/slug/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/slug/fobi_form_elements.py index 1e30ca68..26ac9610 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/slug/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/slug/fobi_form_elements.py @@ -24,14 +24,15 @@ class SlugInputPlugin(FormFieldPlugin): group = _("Fields") form = SlugInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -39,9 +40,9 @@ class SlugInputPlugin(FormFieldPlugin): 'widget': TextInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, SlugField, kwargs)] + return [(self.data.name, SlugField, field_kwargs)] form_element_plugin_registry.register(SlugInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/text/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/text/fobi_form_elements.py index 9ae18818..9ab469f3 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/text/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/text/fobi_form_elements.py @@ -24,14 +24,15 @@ class TextInputPlugin(FormFieldPlugin): group = _("Fields") form = TextInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -39,9 +40,9 @@ class TextInputPlugin(FormFieldPlugin): 'widget': TextInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, CharField, kwargs)] + return [(self.data.name, CharField, field_kwargs)] form_element_plugin_registry.register(TextInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/textarea/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/textarea/fobi_form_elements.py index 6809ca44..3f99ecc5 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/textarea/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/textarea/fobi_form_elements.py @@ -25,13 +25,14 @@ class TextareaPlugin(FormFieldPlugin): group = _("Fields") form = TextareaForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -39,7 +40,7 @@ class TextareaPlugin(FormFieldPlugin): 'widget': Textarea(attrs=widget_attrs) } - return [(self.data.name, CharField, kwargs)] + return [(self.data.name, CharField, field_kwargs)] form_element_plugin_registry.register(TextareaPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/fields/time/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/time/fobi_form_elements.py index 7deae8e5..cfe280ac 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/time/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/time/fobi_form_elements.py @@ -27,14 +27,15 @@ class TimeInputPlugin(FormFieldPlugin): group = _("Fields") form = TimeInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, 'type': 'time', } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -45,7 +46,7 @@ class TimeInputPlugin(FormFieldPlugin): # if self.data.input_formats: # kwargs['input_formats'] = self.data.input_formats - return [(self.data.name, TimeField, kwargs)] + return [(self.data.name, TimeField, field_kwargs)] def submit_plugin_form_data(self, form_entry, request, form): """Submit plugin form data/process. diff --git a/src/fobi/contrib/plugins/form_elements/fields/url/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/url/fobi_form_elements.py index 626038b0..88b7608e 100644 --- a/src/fobi/contrib/plugins/form_elements/fields/url/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/fields/url/fobi_form_elements.py @@ -34,7 +34,8 @@ class URLInputPlugin(FormFieldPlugin): group = _("Fields") form = URLInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, @@ -42,7 +43,7 @@ class URLInputPlugin(FormFieldPlugin): 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, 'initial': self.data.initial, @@ -50,9 +51,9 @@ class URLInputPlugin(FormFieldPlugin): 'widget': URLInput(attrs=widget_attrs), } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length - return [(self.data.name, URLField, kwargs)] + return [(self.data.name, URLField, field_kwargs)] form_element_plugin_registry.register(URLInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/security/captcha/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/security/captcha/fobi_form_elements.py index b6c19b5f..29c71c57 100644 --- a/src/fobi/contrib/plugins/form_elements/security/captcha/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/security/captcha/fobi_form_elements.py @@ -79,14 +79,15 @@ class CaptchaInputPlugin(FormElementPlugin): group = _("Security") form = CaptchaInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, # 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, # 'initial': self.data.initial, @@ -94,7 +95,7 @@ class CaptchaInputPlugin(FormElementPlugin): 'widget': CaptchaTextInput(attrs=widget_attrs), } - return [(self.data.name, CaptchaField, kwargs)] + return [(self.data.name, CaptchaField, field_kwargs)] # Register only if safe to use. diff --git a/src/fobi/contrib/plugins/form_elements/security/honeypot/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/security/honeypot/fobi_form_elements.py index 9f185fd0..b1e04de8 100644 --- a/src/fobi/contrib/plugins/form_elements/security/honeypot/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/security/honeypot/fobi_form_elements.py @@ -28,10 +28,11 @@ class HoneypotInputPlugin(FormElementPlugin): form = HoneypotInputForm is_hidden = True - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'label': self.data.label, 'initial': self.data.initial, # 'help_text': self.data.help_text, @@ -42,10 +43,10 @@ class HoneypotInputPlugin(FormElementPlugin): } if self.data.max_length: - kwargs['max_length'] = self.data.max_length + field_kwargs['max_length'] = self.data.max_length # return [(self.data.name, (HoneypotField, TextInput), kwargs)] - return [(self.data.name, HoneypotField, kwargs)] + return [(self.data.name, HoneypotField, field_kwargs)] form_element_plugin_registry.register(HoneypotInputPlugin) diff --git a/src/fobi/contrib/plugins/form_elements/security/recaptcha/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/security/recaptcha/fobi_form_elements.py index 290173eb..4674f119 100644 --- a/src/fobi/contrib/plugins/form_elements/security/recaptcha/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/security/recaptcha/fobi_form_elements.py @@ -81,14 +81,15 @@ class ReCaptchaInputPlugin(FormElementPlugin): group = _("Security") form = ReCaptchaInputForm - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" widget_attrs = { 'class': theme.form_element_html_class, # 'placeholder': self.data.placeholder, } - kwargs = { + field_kwargs = { 'label': self.data.label, 'help_text': self.data.help_text, # 'initial': self.data.initial, @@ -96,7 +97,7 @@ class ReCaptchaInputPlugin(FormElementPlugin): 'widget': ReCaptchaWidget(attrs=widget_attrs), } - return [(self.data.name, ReCaptchaField, kwargs)] + return [(self.data.name, ReCaptchaField, field_kwargs)] # Register only if safe to use. diff --git a/src/fobi/contrib/plugins/form_elements/test/dummy/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/test/dummy/fobi_form_elements.py index a1b2a752..e33a3832 100644 --- a/src/fobi/contrib/plugins/form_elements/test/dummy/fobi_form_elements.py +++ b/src/fobi/contrib/plugins/form_elements/test/dummy/fobi_form_elements.py @@ -30,9 +30,10 @@ class DummyPlugin(FormElementPlugin): """ self.data.name = "{0}_{1}".format(self.uid, uuid4()) - def get_form_field_instances(self, request=None): + def get_form_field_instances(self, request=None, form_entry=None, + form_element_entries=None, **kwargs): """Get form field instances.""" - kwargs = { + field_kwargs = { 'initial': "

{0}

".format( safe_text(ugettext("Dummy content")) ), @@ -40,10 +41,7 @@ class DummyPlugin(FormElementPlugin): 'label': '', } - form_field_instances = [] - - form_field_instances.append((self.data.name, NoneField, kwargs)) - return form_field_instances + return[(self.data.name, NoneField, field_kwargs)] form_element_plugin_registry.register(DummyPlugin) diff --git a/src/fobi/dynamic.py b/src/fobi/dynamic.py index 4e7e4ae7..2b75fba0 100644 --- a/src/fobi/dynamic.py +++ b/src/fobi/dynamic.py @@ -41,7 +41,8 @@ __all__ = ( def assemble_form_class(form_entry, base_class=BaseForm, request=None, origin=None, origin_kwargs_update_func=None, - origin_return_func=None, form_element_entries=None): + origin_return_func=None, form_element_entries=None, + get_form_field_instances_kwargs={}): """Assemble a form class by given entry. :param form_entry: @@ -52,6 +53,8 @@ def assemble_form_class(form_entry, base_class=BaseForm, request=None, :param callable origin_return_func: :param iterable form_element_entries: If given, used instead of ``form_entry.formelemententry_set.all`` (no additional database hit). + :param dict get_form_field_instances_kwargs: To be passed as **kwargs to + the :method:`get_form_field_instances_kwargs`. """ if form_element_entries is None: form_element_entries = form_entry.formelemententry_set.all() @@ -85,7 +88,10 @@ def assemble_form_class(form_entry, base_class=BaseForm, request=None, kwargs_update_func=origin_kwargs_update_func, return_func=origin_return_func, extra={'counter': creation_counter}, - request=request + request=request, + form_entry=form_entry, + form_element_entries=form_element_entries, + **get_form_field_instances_kwargs ) for form_field_name, form_field_instance \ in plugin_form_field_instances: diff --git a/src/fobi/helpers.py b/src/fobi/helpers.py index c80b7321..e9db70fd 100644 --- a/src/fobi/helpers.py +++ b/src/fobi/helpers.py @@ -55,6 +55,9 @@ __all__ = ( 'get_model_name_for_object', 'get_registered_models', 'get_select_field_choices', + 'get_wizard_form_field_value_from_post', + 'get_wizard_form_field_value_from_request', + 'get_wizard_form_field_value_from_session', 'handle_uploaded_file', 'iterable_to_dict', 'JSONDataExporter', @@ -73,6 +76,8 @@ __all__ = ( logger = logging.getLogger(__name__) +# DEBUG = not True + # ***************************************************************************** # ***************************************************************************** # ********************************** General ********************************** @@ -680,3 +685,170 @@ def get_form_element_entries_for_form_wizard_entry(form_wizard_entry): .form_entry \ .formelemententry_set.all()[:] return form_element_entries + + +def get_wizard_form_field_value_from_session(request, + wizard_view_name, + form_key, + field_name, + fail_silently=True): + """Get wizard form field value from session. + + This is what we could have: + + >>> request.session['wizard_form_wizard_view']['step_data'] + >>> { + >>> 'slider-form': { + >>> 'csrfmiddlewaretoken': ['DhINThGTgQ50e2lDnGG4nYrG0a'], + >>> 'slider-form-test_slider': ['14'], + >>> 'form_wizard_view-current_step': ['slider-form'], + >>> 'slider-form-test_email': ['user@example.com'] + >>> } + >>> } + + Note, that we know nothing about the types here, type conversion should + be done manually. The values returned are strings always. + + :param django.http.HttpRequest request: + :param str wizard_view_name: + :param str form_key: Typically, this would be the step name (form slug). + :param str field_name: Field name. + :param bool fail_silently: If set to True, no errors raised. + :return str: Since everything in session is stored as string. + """ + # Field name in the session contains the form key + session_field_name = "{0}-{1}".format(form_key, field_name) + + if not fail_silently: + + return request.session[wizard_view_name]['step_data'][form_key][ + session_field_name][0] + + else: + + try: + return request.session[wizard_view_name]['step_data'][form_key][ + session_field_name][0] + except (KeyError, IndexError) as err: + logger.error(err) + return None + + +def get_wizard_form_field_value_from_post(request, + wizard_view_name, + form_key, + field_name, + fail_silently=True): + """Get wizard form field value from POST. + + This is what we could have: + + >>> request.POST + >>> { + >>> 'csrfmiddlewaretoken': ['kEprTL218a8HNcC02QefNNnF'], + >>> 'slider-form-test_slider': ['14'], + >>> 'form_wizard_view-current_step': ['slider-form'], + >>> 'slider-form-test_email': ['user@example.com'] + >>> } + + Note, that we know nothing about the types here, type conversion should + be done manually. The values returned are strings always. + + :param django.http.HttpRequest request: + :param str wizard_view_name: + :param str form_key: Typically, this would be the step name (form slug). + :param str field_name: Field name. + :param bool fail_silently: If set to True, no errors raised. + :return str: Since everything in session is stored as string. + """ + # Field name in the POST contains the form key + form_field_name = "{0}-{1}".format(form_key, field_name) + # current_step_name = "{0}-{1}".format(wizard_view_name, form_key) + + if not fail_silently: + + # if not (current_step_name in request.POST and + # request.POST[current_step_name] == form_key): + # return None + return request.POST[form_field_name] + + else: + + try: + # if not (current_step_name in request.POST and + # request.POST[current_step_name] == form_key): + # return None + + return request.POST[form_field_name] + except (KeyError, IndexError) as err: + logger.error(err) + return None + + +def get_wizard_form_field_value_from_request(request, + wizard_view_name, + form_key, + field_name, + fail_silently=True, + session_priority=False): + """Get wizard form field value from request. + + Note, that we know nothing about the types here, type conversion should + be done manually. The values returned are strings always. + + :param django.http.HttpRequest request: + :param str wizard_view_name: + :param str form_key: Typically, this would be the step name (form slug). + :param str field_name: Field name. + :param bool fail_silently: If set to True, no errors raised. + :param bool session_priority: If set to True, first try to read from + session. + :return str: Since everything in session is stored as string. + """ + if session_priority: + # First try session + value = get_wizard_form_field_value_from_session( + request, + wizard_view_name, + form_key, + field_name, + fail_silently + ) + + if value is not None: + return value + + # Then try POST + if 'POST' == request.method: + value = get_wizard_form_field_value_from_post( + request, + wizard_view_name, + form_key, + field_name, + fail_silently + ) + + else: + # First try POST + if 'POST' == request.method: + value = get_wizard_form_field_value_from_post( + request, + wizard_view_name, + form_key, + field_name, + fail_silently + ) + + if value is not None: + return value + + # Then try session + value = get_wizard_form_field_value_from_session( + request, + wizard_view_name, + form_key, + field_name, + fail_silently + ) + + return value diff --git a/src/fobi/tests/test_browser_build_dynamic_forms.py b/src/fobi/tests/test_browser_build_dynamic_forms.py index c4fa21e8..b33e545a 100644 --- a/src/fobi/tests/test_browser_build_dynamic_forms.py +++ b/src/fobi/tests/test_browser_build_dynamic_forms.py @@ -42,6 +42,7 @@ __all__ = ( logger = logging.getLogger(__name__) TIMEOUT = 4 +LONG_TIMEOUT = 8 WAIT = False WAIT_FOR = 0 @@ -384,7 +385,7 @@ class BaseFobiBrowserBuldDynamicFormsTest(LiveServerTestCase): logger.debug(form_element_name) # Wait until the fobi page opens with the form element in. - WebDriverWait(self.selenium, timeout=TIMEOUT).until( + WebDriverWait(self.selenium, timeout=LONG_TIMEOUT).until( lambda driver: driver.find_element_by_xpath( """//div[contains(text(), 'The form element plugin "{0}" was deleted successfully.') and contains(@class, "alert-info")]""".format( form_element_name diff --git a/src/fobi/utils.py b/src/fobi/utils.py index 02dd737a..c77e73a0 100644 --- a/src/fobi/utils.py +++ b/src/fobi/utils.py @@ -513,8 +513,8 @@ def get_assembled_form(form_entry, request=None): :return django.forms.Form: """ # TODO - FormClass = assemble_form_class(form_entry, request=request) - form = FormClass() + form_cls = assemble_form_class(form_entry, request=request) + form = form_cls() return form diff --git a/src/fobi/views.py b/src/fobi/views.py index c4730f4c..67cc3d29 100644 --- a/src/fobi/views.py +++ b/src/fobi/views.py @@ -14,6 +14,7 @@ from django.contrib.auth.decorators import login_required, permission_required from django.core.exceptions import ObjectDoesNotExist from django.core.files.storage import FileSystemStorage from django.core.urlresolvers import reverse +from django.forms import ValidationError from django.http import Http404, HttpResponseRedirect from django.shortcuts import redirect from django.template import RequestContext @@ -85,6 +86,11 @@ if versions.DJANGO_GTE_1_10: else: from django.shortcuts import render_to_response +if versions.DJANGO_GTE_1_8: + from formtools.wizard.forms import ManagementForm +else: + from django.contrib.formtools.wizard.forms import ManagementForm + __title__ = 'fobi.views' __author__ = 'Artur Barseghyan ' __copyright__ = '2014-2016 Artur Barseghyan' @@ -1433,7 +1439,10 @@ class FormWizardView(DynamicSessionWizardView): form_cls = assemble_form_class( form_entry, request=request, - form_element_entries=form_element_entries + form_element_entries=form_element_entries, + get_form_field_instances_kwargs={ + 'form_wizard_entry': form_wizard_entry, + } ) form_list.append( @@ -1458,6 +1467,75 @@ class FormWizardView(DynamicSessionWizardView): 'fobi_theme': theme, } + def post(self, *args, **kwargs): + """POST requests. + + This method handles POST requests. + + The wizard will render either the current step (if form validation + wasn't successful), the next step (if the current step was stored + successful) or the done view (if no more steps are available) + """ + # Look for a wizard_goto_step element in the posted data which + # contains a valid step name. If one was found, render the requested + # form. (This makes stepping back a lot easier). + wizard_goto_step = self.request.POST.get('wizard_goto_step', None) + if wizard_goto_step and wizard_goto_step in self.get_form_list(): + return self.render_goto_step(wizard_goto_step) + + # Check if form was refreshed + management_form = ManagementForm(self.request.POST, prefix=self.prefix) + if not management_form.is_valid(): + raise ValidationError( + _('ManagementForm data is missing or has been tampered.'), + code='missing_management_form', + ) + + form_current_step = management_form.cleaned_data['current_step'] + if (form_current_step != self.steps.current and + self.storage.current_step is not None): + # form refreshed, change current step + self.storage.current_step = form_current_step + + # get the form for the current step + form = self.get_form(data=self.request.POST, files=self.request.FILES) + + # and try to validate + if form.is_valid(): + # Get current form entry + form_entry = self.form_entry_mapping[self.steps.current] + # Fire plugin processors + form = submit_plugin_form_data(form_entry=form_entry, + request=self.request, form=form) + # Form wizards make use of form.data instead of form.cleaned_data. + # Therefore, we update the form.data with values from + # form.cleaned_data. + wizard_field_pattern = "{0}-{1}" + # We can't update values of a `MultiValueDict`, which `QueryDict` + # is, using `update` method. That's why we do it one by one. + for field_key, field_value in form.cleaned_data.items(): + wizard_form_key = wizard_field_pattern.format( + self.steps.current, + field_key + ) + form.data[wizard_form_key] = field_value + + # if the form is valid, store the cleaned data and files. + self.storage.set_step_data(self.steps.current, + self.process_step(form)) + + self.storage.set_step_files(self.steps.current, + self.process_step_files(form)) + + # check if the current step is the last step + if self.steps.current == self.steps.last: + # no more steps, render done view + return self.render_done(form, **kwargs) + else: + # proceed to the next step + return self.render_next_step(form) + return self.render(form) + def render_done(self, form, **kwargs): """Render done. diff --git a/src/fobi/widgets.py b/src/fobi/widgets.py index 3796c74e..b557a6f6 100644 --- a/src/fobi/widgets.py +++ b/src/fobi/widgets.py @@ -3,7 +3,6 @@ from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ - # Safe import of ``NumberInput`` try: from django.forms.widgets import NumberInput @@ -63,20 +62,27 @@ class RichSelect(Select): """ def __init__(self, attrs=None, choices=(), prepend_html=None, - append_html=None): + append_html=None, override_name=None): """Constructor. :param dict attrs: :param tuple choices: :param str prepend_html: :param str append_html: + :param str override_name: """ self.prepend_html = prepend_html if prepend_html else "" self.append_html = append_html if append_html else "" + self.override_name = override_name \ + if override_name is not None \ + else None super(RichSelect, self).__init__(attrs=attrs, choices=choices) def render(self, name, value, attrs=None): """Renders the element, having prepended and appended extra parts.""" + if self.override_name is not None: + name = self.override_name + rendered_select = super(RichSelect, self).render( name=name, value=value,