From 71f9ae84e60eda666f2940790c9c759ad23df7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alieh=20Ryma=C5=A1e=C5=ADski?= Date: Sun, 14 Feb 2021 14:47:47 +0000 Subject: [PATCH] Return MSFList, not plain list, from form field (#118) --- multiselectfield/db/fields.py | 18 ++---------------- multiselectfield/forms/fields.py | 6 +++++- multiselectfield/utils.py | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/multiselectfield/db/fields.py b/multiselectfield/db/fields.py index 6e94bd2..7d4eef6 100644 --- a/multiselectfield/db/fields.py +++ b/multiselectfield/db/fields.py @@ -23,7 +23,7 @@ from django.utils.text import capfirst from django.core import exceptions from ..forms.fields import MultiSelectFormField, MinChoicesValidator, MaxChoicesValidator -from ..utils import get_max_length +from ..utils import MSFList, get_max_length from ..validators import MaxValueMultiFieldValidator if sys.version_info < (3,): @@ -46,21 +46,6 @@ def add_metaclass(metaclass): return wrapper -class MSFList(list): - - def __init__(self, choices, *args, **kwargs): - self.choices = choices - super(MSFList, self).__init__(*args, **kwargs) - - def __str__(msgl): - msg_list = [msgl.choices.get(int(i)) if i.isdigit() else msgl.choices.get(i) for i in msgl] - return u', '.join([string_type(s) for s in msg_list]) - - if sys.version_info < (3,): - def __unicode__(self, msgl): - return self.__str__(msgl) - - class MultiSelectField(models.CharField): """ Choice values can not contain commas. """ @@ -130,6 +115,7 @@ class MultiSelectField(models.CharField): 'label': capfirst(self.verbose_name), 'help_text': self.help_text, 'choices': self.choices, + 'flat_choices': self.flatchoices, 'max_length': self.max_length, 'max_choices': self.max_choices} if self.has_default(): diff --git a/multiselectfield/forms/fields.py b/multiselectfield/forms/fields.py index 12d4133..7c37acf 100644 --- a/multiselectfield/forms/fields.py +++ b/multiselectfield/forms/fields.py @@ -16,7 +16,7 @@ from django import forms -from ..utils import get_max_length +from ..utils import MSFList, get_max_length from ..validators import MaxValueMultiFieldValidator, MinChoicesValidator, MaxChoicesValidator @@ -27,6 +27,7 @@ class MultiSelectFormField(forms.MultipleChoiceField): self.min_choices = kwargs.pop('min_choices', None) self.max_choices = kwargs.pop('max_choices', None) self.max_length = kwargs.pop('max_length', None) + self.flat_choices = kwargs.pop('flat_choices') super(MultiSelectFormField, self).__init__(*args, **kwargs) self.max_length = get_max_length(self.choices, self.max_length) self.validators.append(MaxValueMultiFieldValidator(self.max_length)) @@ -34,3 +35,6 @@ class MultiSelectFormField(forms.MultipleChoiceField): self.validators.append(MaxChoicesValidator(self.max_choices)) if self.min_choices is not None: self.validators.append(MinChoicesValidator(self.min_choices)) + + def to_python(self, value): + return MSFList(dict(self.flat_choices), super(MultiSelectFormField, self).to_python(value)) diff --git a/multiselectfield/utils.py b/multiselectfield/utils.py index 56c5d93..35d28c0 100644 --- a/multiselectfield/utils.py +++ b/multiselectfield/utils.py @@ -25,6 +25,21 @@ else: string_type = string +class MSFList(list): + + def __init__(self, choices, *args, **kwargs): + self.choices = choices + super(MSFList, self).__init__(*args, **kwargs) + + def __str__(msgl): + msg_list = [msgl.choices.get(int(i)) if i.isdigit() else msgl.choices.get(i) for i in msgl] + return u', '.join([string_type(s) for s in msg_list]) + + if sys.version_info < (3,): + def __unicode__(self, msgl): + return self.__str__(msgl) + + def get_max_length(choices, max_length, default=200): if max_length is None: if choices: