From 6cfd8eb0e3d51275e90f392d6a20651b406c0ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 30 Nov 2017 15:26:06 +0100 Subject: [PATCH] some more options / features for I18nField --- src/c3nav/editor/forms.py | 9 ++++++++- src/c3nav/mapdata/fields.py | 17 ++++++++++------- src/c3nav/mapdata/models/base.py | 2 +- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/c3nav/editor/forms.py b/src/c3nav/editor/forms.py index d97e3e39..172fb792 100644 --- a/src/c3nav/editor/forms.py +++ b/src/c3nav/editor/forms.py @@ -50,7 +50,8 @@ class EditorFormBase(ModelForm): lang=language_info['name_translated']) new_fields[sub_field_name] = CharField(label=field_title, required=False, - initial=values[language].strip(), max_length=50) + initial=values[language].strip(), + max_length=model_field.i18n_max_length) if has_values: self.i18n_fields.append((model_field, values)) @@ -152,6 +153,12 @@ class EditorFormBase(ModelForm): if not self.cleaned_data.get('geometry'): raise ValidationError('Missing geometry.') + for field, values in self.i18n_fields: + if not field.blank and not any(values.values()): + raise ValidationError(_('You have to choose a value for {field} in at least one language.').format( + field=field.verbose_name + )) + super().clean() def full_clean(self): diff --git a/src/c3nav/mapdata/fields.py b/src/c3nav/mapdata/fields.py index f1df61e5..c87161da 100644 --- a/src/c3nav/mapdata/fields.py +++ b/src/c3nav/mapdata/fields.py @@ -156,7 +156,7 @@ class I18nDescriptor: fallback_value = self.field.fallback_value if fallback_value is not None: - fallback_value = format_lazy(fallback_value, model_name=instance._meta.verbose_name, pk=instance.pk) + fallback_value = format_lazy(fallback_value, model=instance._meta.verbose_name, pk=instance.pk) return lazy_get_i18n_value(getattr(instance, self.field.attname), fallback_language=self.field.fallback_language, fallback_any=self.field.fallback_any, @@ -164,21 +164,24 @@ class I18nDescriptor: class I18nField(JSONField): - def __init__(self, plural_name=None, fallback_language=settings.LANGUAGE_CODE, - fallback_any=False, fallback_value=None, default=None): + def __init__(self, verbose_name=None, plural_name=None, max_length=None, default=None, + fallback_language=settings.LANGUAGE_CODE, fallback_any=False, fallback_value=None, **kwargs): + self.i18n_max_length = max_length self.plural_name = plural_name self.fallback_language = fallback_language self.fallback_any = fallback_any self.fallback_value = fallback_value - super().__init__(default=(dict(default) if default else {}), null=False) + kwargs.pop('null', None) + super().__init__(verbose_name=verbose_name, default=(dict(default) if default else {}), null=False, **kwargs) def deconstruct(self): name, path, args, kwargs = super().deconstruct() - kwargs = {} - if self.default != {}: - kwargs['default'] = self.default + if self.default == {}: + kwargs.pop('default') if self.plural_name is not None: kwargs['plural_name'] = self.plural_name + if self.i18n_max_length is not None: + kwargs['max_length'] = self.i18n_max_length if self.fallback_language != settings.LANGUAGE_CODE: kwargs['fallback_language'] = self.fallback_language if self.fallback_any: diff --git a/src/c3nav/mapdata/models/base.py b/src/c3nav/mapdata/models/base.py index 774eebf5..4a1f5b68 100644 --- a/src/c3nav/mapdata/models/base.py +++ b/src/c3nav/mapdata/models/base.py @@ -47,7 +47,7 @@ class SerializableMixin(models.Model): class TitledMixin(SerializableMixin, models.Model): - title = I18nField(plural_name='titles', fallback_any=True, fallback_value='{model_name} {pk}') + title = I18nField(_('Title'), plural_name='titles', blank=True, fallback_any=True, fallback_value='{model} {pk}') class Meta: abstract = True