From 52145ca7d3968d96e5ab88bf8a425c4a8c3c5e9e Mon Sep 17 00:00:00 2001 From: Bogdan Hopulele Date: Thu, 23 Mar 2017 17:32:26 +0200 Subject: [PATCH 1/4] Add experimental features flag for LocalizedField With the flag set, LocalizedField will return None if there is no database value. --- README.rst | 10 ++++++++++ localized_fields/fields/localized_field.py | 10 +++++++--- localized_fields/models.py | 2 +- settings.py | 2 ++ tests/test_localized_field.py | 18 +++++++++++++++--- 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/README.rst b/README.rst index 577b359..fc1bed1 100644 --- a/README.rst +++ b/README.rst @@ -244,6 +244,16 @@ Besides ``LocalizedField``, there's also: title = LocalizedField() description = LocalizedBleachField() +Experimental feature +^^^^^^^^^^^^^^^^^^^^ + Enables the following experimental features: + * ``LocalizedField`` will return ``None`` instead of an empty ``LocalizedValue`` if there is no database value. + + .. code-block:: python + + LOCALIZED_FIELDS_EXPERIMENTAL = True + + Frequently asked questions (FAQ) -------------------------------- diff --git a/localized_fields/fields/localized_field.py b/localized_fields/fields/localized_field.py index 34ae876..6a3b909 100644 --- a/localized_fields/fields/localized_field.py +++ b/localized_fields/fields/localized_field.py @@ -1,8 +1,8 @@ from django.conf import settings from django.db.utils import IntegrityError +from psqlextra.fields import HStoreField from localized_fields import LocalizedFieldForm -from psqlextra.fields import HStoreField from ..localized_value import LocalizedValue @@ -36,11 +36,15 @@ class LocalizedField(HStoreField): """ if not value: - return LocalizedValue() + if getattr(settings, 'LOCALIZED_FIELDS_EXPERIMENTAL', False): + return None + else: + return LocalizedValue() return LocalizedValue(value) - def to_python(self, value: dict) -> LocalizedValue: + @staticmethod + def to_python(value: dict) -> LocalizedValue: """Turns the specified database value into its Python equivalent. diff --git a/localized_fields/models.py b/localized_fields/models.py index 2f681f8..d06d585 100644 --- a/localized_fields/models.py +++ b/localized_fields/models.py @@ -15,7 +15,7 @@ class LocalizedModel(PostgresModel): Here we set all the fields that are of :see:LocalizedField to an instance of :see:LocalizedValue in case they are none - so that the user doesn't explicitely have to do so.""" + so that the user doesn't explicitly have to do so.""" super(LocalizedModel, self).__init__(*args, **kwargs) diff --git a/settings.py b/settings.py index 99fc1c2..4cdade5 100644 --- a/settings.py +++ b/settings.py @@ -27,3 +27,5 @@ INSTALLED_APPS = ( # set to a lower number than the default, since # we want the tests to be fast, default is 100 LOCALIZED_FIELDS_MAX_RETRIES = 3 + +LOCALIZED_FIELDS_EXPERIMENTAL = False diff --git a/tests/test_localized_field.py b/tests/test_localized_field.py index f557422..ca92323 100644 --- a/tests/test_localized_field.py +++ b/tests/test_localized_field.py @@ -1,9 +1,9 @@ from django.conf import settings +from django.db.utils import IntegrityError from django.test import TestCase from django.utils import translation -from django.db.utils import IntegrityError -from localized_fields import LocalizedField, LocalizedValue, LocalizedFieldForm +from localized_fields import LocalizedField, LocalizedFieldForm, LocalizedValue def get_init_values() -> dict: @@ -179,7 +179,7 @@ class LocalizedFieldTestCase(TestCase): @staticmethod def test_from_db_value_none(): - """Tests whether the :see:from_db_valuei function + """Tests whether the :see:from_db_value function correctly handles None values.""" localized_value = LocalizedField.from_db_value(None) @@ -187,6 +187,18 @@ class LocalizedFieldTestCase(TestCase): for lang_code, _ in settings.LANGUAGES: assert localized_value.get(lang_code) is None + @staticmethod + def test_from_db_value_none_return_none(): + """Tests whether the :see:from_db_value function + correctly handles None values when LOCALIZED_FIELDS_EXPERIMENTAL + is set to True.""" + + settings.LOCALIZED_FIELDS_EXPERIMENTAL = True + localized_value = LocalizedField.from_db_value(None) + settings.LOCALIZED_FIELDS_EXPERIMENTAL = False + + assert localized_value is None + @staticmethod def test_to_python(): """Tests whether the :see:to_python function From 8ba33695f9c6c234c7112d9d41267f03594e43bc Mon Sep 17 00:00:00 2001 From: Bogdan Hopulele Date: Fri, 24 Mar 2017 14:20:22 +0200 Subject: [PATCH 2/4] Export LocalizedModel --- localized_fields/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/localized_fields/__init__.py b/localized_fields/__init__.py index 083453f..f9325cd 100644 --- a/localized_fields/__init__.py +++ b/localized_fields/__init__.py @@ -1,13 +1,15 @@ -from .util import get_language_codes from .forms import LocalizedFieldForm, LocalizedFieldWidget -from .fields import (LocalizedField, LocalizedAutoSlugField, +from .fields import (LocalizedAutoSlugField, LocalizedField, LocalizedUniqueSlugField) -from .mixins import AtomicSlugRetryMixin from .localized_value import LocalizedValue +from .mixins import AtomicSlugRetryMixin +from .models import LocalizedModel +from .util import get_language_codes __all__ = [ 'get_language_codes', 'LocalizedField', + 'LocalizedModel', 'LocalizedValue', 'LocalizedAutoSlugField', 'LocalizedUniqueSlugField', From add3c1e1d4c64d0cbb0cde0a56fc0450ac487731 Mon Sep 17 00:00:00 2001 From: Bogdan Hopulele Date: Fri, 24 Mar 2017 14:39:06 +0200 Subject: [PATCH 3/4] Bump up the library version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c23b9c0..898e656 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: setup( name='django-localized-fields', - version='3.5', + version='3.6', packages=find_packages(), include_package_data=True, license='MIT License', From 8bdfee0666796ee2a49149e9ddef7bf76714d7bc Mon Sep 17 00:00:00 2001 From: Bogdan Hopulele Date: Fri, 24 Mar 2017 14:48:33 +0200 Subject: [PATCH 4/4] Implement review suggestions --- tests/test_localized_field.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/test_localized_field.py b/tests/test_localized_field.py index ca92323..a6af0c7 100644 --- a/tests/test_localized_field.py +++ b/tests/test_localized_field.py @@ -187,15 +187,13 @@ class LocalizedFieldTestCase(TestCase): for lang_code, _ in settings.LANGUAGES: assert localized_value.get(lang_code) is None - @staticmethod - def test_from_db_value_none_return_none(): + def test_from_db_value_none_return_none(self): """Tests whether the :see:from_db_value function correctly handles None values when LOCALIZED_FIELDS_EXPERIMENTAL is set to True.""" - settings.LOCALIZED_FIELDS_EXPERIMENTAL = True - localized_value = LocalizedField.from_db_value(None) - settings.LOCALIZED_FIELDS_EXPERIMENTAL = False + with self.settings(LOCALIZED_FIELDS_EXPERIMENTAL=True): + localized_value = LocalizedField.from_db_value(None) assert localized_value is None