From 2863a338e15d774bda733e5a9c905d20b944f428 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Tue, 17 Dec 2019 00:26:16 +0300 Subject: [PATCH 1/3] translated fields work out --- apps/utils/models.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apps/utils/models.py b/apps/utils/models.py index eb41f7a1..48736030 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -67,11 +67,17 @@ def get_default_locale(): settings.FALLBACK_LOCALE -def translate_field(self, field_name): +def translate_field(self, field_name, toggle_field_name=None): def translate(self): field = getattr(self, field_name) + locale_requested = to_locale(get_language()) + has_toggler = hasattr(self, toggle_field_name) + is_active = getattr(self, toggle_field_name, {}).get(locale_requested) if toggle_field_name else None if isinstance(field, dict): - value = field.get(to_locale(get_language())) + if has_toggler and not is_active: + value = None + else: + value = field.get(locale_requested) # fallback if value is None: value = field.get(get_default_locale()) @@ -114,7 +120,7 @@ class TranslatedFieldsMixin: field_name = field.name if isinstance(field, TJSONField): setattr(cls, f'{field.name}_translated', - property(translate_field(self, field_name))) + property(translate_field(self, field_name, f'locale_to_{field_name}_is_active'))) setattr(cls, f'{field_name}_indexing', property(index_field(self, field_name))) From 900846951ea1c36c8d62a575d378d9ed748becbc Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Tue, 17 Dec 2019 16:08:30 +0300 Subject: [PATCH 2/3] localized description --- apps/utils/models.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/utils/models.py b/apps/utils/models.py index 48736030..00772f72 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -76,6 +76,12 @@ def translate_field(self, field_name, toggle_field_name=None): if isinstance(field, dict): if has_toggler and not is_active: value = None + if locale_requested in field: + field.pop(locale_requested) + try: + return value or next(iter(field.values())) + except StopIteration: + return None else: value = field.get(locale_requested) # fallback From 22aefc2f83ce20111d6119bf000c9577d6d14648 Mon Sep 17 00:00:00 2001 From: Kuroshini Date: Tue, 17 Dec 2019 17:34:20 +0300 Subject: [PATCH 3/3] description is_active logic --- apps/utils/models.py | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/apps/utils/models.py b/apps/utils/models.py index 00772f72..07891330 100644 --- a/apps/utils/models.py +++ b/apps/utils/models.py @@ -70,25 +70,20 @@ def get_default_locale(): def translate_field(self, field_name, toggle_field_name=None): def translate(self): field = getattr(self, field_name) - locale_requested = to_locale(get_language()) - has_toggler = hasattr(self, toggle_field_name) - is_active = getattr(self, toggle_field_name, {}).get(locale_requested) if toggle_field_name else None + toggler = getattr(self, toggle_field_name, None) if isinstance(field, dict): - if has_toggler and not is_active: - value = None - if locale_requested in field: - field.pop(locale_requested) - try: - return value or next(iter(field.values())) - except StopIteration: - return None - else: - value = field.get(locale_requested) + if toggler: + field = {locale: v for locale, v in field.items() if toggler.get(locale) in [True, 'True', 'true']} + value = field.get(to_locale(get_language())) # fallback if value is None: value = field.get(get_default_locale()) if value is None: - value = field.get(next(iter(field.keys()), None)) + try: + value = next(iter(field.values())) + except StopIteration: + # field values are absent + return None return value return None return translate