From 26b3ad62551d4c8104f350230b8d0ea13a5fd486 Mon Sep 17 00:00:00 2001 From: Artur Barseghyan Date: Tue, 25 Oct 2016 00:53:52 +0200 Subject: [PATCH] prepare 0.9.4; minor fixes --- CHANGELOG.rst | 8 ++++++++ setup.py | 2 +- src/fobi/__init__.py | 4 ++-- .../fields/select_multiple/fobi_form_elements.py | 3 ++- .../fobi_form_elements.py | 5 ++++- .../fobi_form_elements.py | 5 ++++- .../form_elements/slider_bootstrap3_widget/README.rst | 4 +++- src/fobi/views.py | 11 +++++++++++ 8 files changed, 35 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 251f39a8..746871c0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,14 @@ are used for versioning (schema follows below): 0.3.4 to 0.4). - All backwards incompatible changes are mentioned in this document. +0.9.4 +----- +2016-10-24 + +- Fix issue with `select_multiple`, `select_multiple_model_objects` and + `select_multiple_mptt_model_objects` being invalidated on the last step + of the form wizard. + 0.9.3 ----- 2016-10-24 diff --git a/setup.py b/setup.py index 18aeeeff..92e9e448 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.9.3' +version = '0.9.4' 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 361e3e4c..50b06edc 100644 --- a/src/fobi/__init__.py +++ b/src/fobi/__init__.py @@ -1,6 +1,6 @@ __title__ = 'django-fobi' -__version__ = '0.9.3' -__build__ = 0x000065 +__version__ = '0.9.4' +__build__ = 0x000066 __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/select_multiple/fobi_form_elements.py b/src/fobi/contrib/plugins/form_elements/fields/select_multiple/fobi_form_elements.py index b69ea658..b8e1f45d 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 @@ -86,7 +86,8 @@ class SelectMultipleInputPlugin(FormFieldPlugin): # Overwrite ``cleaned_data`` of the ``form`` with object # qualifier. - form.cleaned_data[self.data.name] = ret_values + if ret_values: + form.cleaned_data[self.data.name] = ret_values # It's critically important to return the ``form`` with updated # ``cleaned_data`` 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 6670fd6a..0debdf35 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 @@ -104,7 +104,10 @@ class SelectMultipleModelObjectsInputPlugin(FormFieldPlugin): values.append(value) # Overwrite ``cleaned_data`` of the ``form`` with object qualifier. - form.cleaned_data[self.data.name] = json.dumps(values) + if values: + form.cleaned_data[self.data.name] = json.dumps(values) + else: + del form.cleaned_data[self.data.name] # It's critically important to return the ``form`` with updated # ``cleaned_data`` 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 27b514c1..94d0c2c1 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 @@ -104,7 +104,10 @@ class SelectMultipleMPTTModelObjectsInputPlugin(FormFieldPlugin): values.append(value) # Overwrite ``cleaned_data`` of the ``form`` with object qualifier. - form.cleaned_data[self.data.name] = json.dumps(values) + if values: + form.cleaned_data[self.data.name] = json.dumps(values) + else: + del form.cleaned_data[self.data.name] # It's critically important to return the ``form`` with updated # ``cleaned_data`` diff --git a/src/fobi/contrib/themes/bootstrap3/widgets/form_elements/slider_bootstrap3_widget/README.rst b/src/fobi/contrib/themes/bootstrap3/widgets/form_elements/slider_bootstrap3_widget/README.rst index a058adab..52af6016 100644 --- a/src/fobi/contrib/themes/bootstrap3/widgets/form_elements/slider_bootstrap3_widget/README.rst +++ b/src/fobi/contrib/themes/bootstrap3/widgets/form_elements/slider_bootstrap3_widget/README.rst @@ -1,7 +1,9 @@ ============================================================================= fobi.contrib.themes.bootstrap3.widgets.form_elements.slider_bootstrap3_widget ============================================================================= -A fancy slider widget to the ``slider`` plugin (for Bootstrap 3 theme). +A fancy slider widget to the ``slider`` plugin (for Bootstrap 3 theme). Based +on `bootstrap-slider.js `_. See the +`github `_ for more. Installation ============ diff --git a/src/fobi/views.py b/src/fobi/views.py index 8c4e80ed..f6016501 100644 --- a/src/fobi/views.py +++ b/src/fobi/views.py @@ -8,6 +8,8 @@ import simplejson as json from collections import OrderedDict +from six import string_types + from django.db import models, IntegrityError from django.contrib import messages from django.contrib.auth.decorators import login_required, permission_required @@ -1523,6 +1525,15 @@ class FormWizardView(DynamicSessionWizardView): and form.data[wizard_form_key]): form.data[wizard_form_key] = field_value + # This is dirty hack to make wizard validate empty multiple + # choice fields. Otherwise it would fail with message + # Select a valid choice. [] is not one of the available + # choices. + if wizard_form_key in form.data: + if not form.data[wizard_form_key]: + if isinstance(form.data[wizard_form_key], list): + del form.data[wizard_form_key] + # if the form is valid, store the cleaned data and files. self.storage.set_step_data(self.steps.current, self.process_step(form))