From aaf49614f28be6b3df06f9e5b48863e46f7db246 Mon Sep 17 00:00:00 2001 From: seroy Date: Fri, 14 Jul 2017 15:07:48 +0300 Subject: [PATCH] improve functionality of required parameter --- localized_fields/fields/field.py | 46 ++++++++++++--------------- localized_fields/fields/file_field.py | 2 -- localized_fields/forms.py | 7 ++-- tests/test_form.py | 2 +- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/localized_fields/fields/field.py b/localized_fields/fields/field.py index 321a8d7..d23e2dd 100644 --- a/localized_fields/fields/field.py +++ b/localized_fields/fields/field.py @@ -32,6 +32,13 @@ class LocalizedField(HStoreField): super(LocalizedField, self).__init__(*args, **kwargs) + if self.required is None and self.blank: + self.required = [] + elif self.required is None and not self.blank: + self.required = [settings.LANGUAGE_CODE] + elif type(self.required) == bool and self.required: + self.required = [lang_code for lang_code, _ in settings.LANGUAGES] + def contribute_to_class(self, model, name, **kwargs): """Adds this field to the specifed model. @@ -185,8 +192,8 @@ class LocalizedField(HStoreField): return value def validate(self, value: LocalizedValue, *_): - """Validates that the value for the primary language - has been filled in. + """Validates that the values has been filled in for all required + languages Exceptions are raises in order to notify the user of invalid values. @@ -199,17 +206,14 @@ class LocalizedField(HStoreField): if self.null: return - primary_lang_val = getattr(value, settings.LANGUAGE_CODE) + for lang in self.required: + lang_val = getattr(value, settings.LANGUAGE_CODE) - # NOTE(seroy): use check for None, instead of `not primary_lang_val` - # condition, cause in this way we can not save '' value - if primary_lang_val is None: - raise IntegrityError( - 'null value in column "%s.%s" violates not-null constraint' % ( - self.name, - settings.LANGUAGE_CODE - ) - ) + # NOTE(seroy): use check for None, instead of `not lang_val` + # condition, cause in this way we can not save '' value + if lang_val is None: + raise IntegrityError('null value in column "%s.%s" violates' \ + 'not-null constraint' % (self.name, lang)) def formfield(self, **kwargs): """Gets the form field associated with this field.""" @@ -217,18 +221,10 @@ class LocalizedField(HStoreField): defaults = { 'form_class': LocalizedFieldForm } - + if issubclass(kwargs.get('form_class', LocalizedFieldForm), + LocalizedFieldForm): + defaults.update({ + 'required_langs': self.required + }) defaults.update(kwargs) return super().formfield(**defaults) - - def deconstruct(self): - """Gets the values to pass to :see:__init__ when - re-creating this object.""" - - name, path, args, kwargs = super( - LocalizedField, self).deconstruct() - - if self.uniqueness: - kwargs['uniqueness'] = self.uniqueness - - return name, path, args, kwargs diff --git a/localized_fields/fields/file_field.py b/localized_fields/fields/file_field.py index 49bbf86..e6777a8 100644 --- a/localized_fields/fields/file_field.py +++ b/localized_fields/fields/file_field.py @@ -146,8 +146,6 @@ class LocalizedFileField(LocalizedField): def formfield(self, **kwargs): defaults = {'form_class': LocalizedFileFieldForm} - if 'initial' in kwargs: - defaults['required'] = False defaults.update(kwargs) return super().formfield(**defaults) diff --git a/localized_fields/forms.py b/localized_fields/forms.py index c227ba3..4efa1e6 100644 --- a/localized_fields/forms.py +++ b/localized_fields/forms.py @@ -19,16 +19,13 @@ class LocalizedFieldForm(forms.MultiValueField): field_class = forms.fields.CharField value_class = LocalizedValue - def __init__(self, *args, **kwargs): + def __init__(self, *args, required_langs: List[str]=[], **kwargs): """Initializes a new instance of :see:LocalizedFieldForm.""" fields = [] for lang_code, _ in settings.LANGUAGES: - field_options = {'required': False} - - if lang_code == settings.LANGUAGE_CODE: - field_options['required'] = kwargs.get('required', True) + field_options = {'required': lang_code in required_langs} field_options['label'] = lang_code fields.append(self.field_class(**field_options)) diff --git a/tests/test_form.py b/tests/test_form.py index a5b1157..556a8b3 100644 --- a/tests/test_form.py +++ b/tests/test_form.py @@ -12,7 +12,7 @@ class LocalizedFieldFormTestCase(TestCase): """Tests whether the constructor correctly creates a field for every language.""" - form = LocalizedFieldForm() + form = LocalizedFieldForm(required_langs=[settings.LANGUAGE_CODE]) for (lang_code, _), field in zip(settings.LANGUAGES, form.fields): assert field.label == lang_code