From ccc46e1899d3b53d7ac5326a11daa36adbd282cc Mon Sep 17 00:00:00 2001 From: Swen Kooij Date: Sat, 31 Mar 2018 16:53:10 +0300 Subject: [PATCH] Allow raw dicts to be used in update statements --- localized_fields/fields/field.py | 5 ++++ tests/test_query_set.py | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/test_query_set.py diff --git a/localized_fields/fields/field.py b/localized_fields/fields/field.py index 6a57a2f..333b374 100644 --- a/localized_fields/fields/field.py +++ b/localized_fields/fields/field.py @@ -131,6 +131,8 @@ class LocalizedField(HStoreField): specified, we'll treat it as an empty :see:LocalizedValue instance, on which the validation will fail. + Dictonaries are converted into :see:LocalizedValue instances. + Arguments: value: The :see:LocalizedValue instance to serialize @@ -141,6 +143,9 @@ class LocalizedField(HStoreField): extracted from the specified value. """ + if isinstance(value, dict): + value = LocalizedValue(value) + # default to None if this is an unknown type if not isinstance(value, LocalizedValue) and value: value = None diff --git a/tests/test_query_set.py b/tests/test_query_set.py new file mode 100644 index 0000000..3ed9c79 --- /dev/null +++ b/tests/test_query_set.py @@ -0,0 +1,47 @@ +from django.conf import settings +from django.test import TestCase +from django.utils import translation + +from localized_fields.fields import LocalizedField + +from .fake_model import get_fake_model + + +class LocalizedQuerySetTestCase(TestCase): + """Tests query sets with models containing :see:LocalizedField.""" + + Model = None + + @classmethod + def setUpClass(cls): + """Creates the test models in the database.""" + + super(LocalizedQuerySetTestCase, cls).setUpClass() + + cls.Model = get_fake_model( + { + 'title': LocalizedField(), + } + ) + + @classmethod + def test_assign_raw_dict(cls): + inst = cls.Model() + inst.title = dict(en='Bread', ro='Paine') + inst.save() + + inst = cls.Model.objects.get(pk=inst.pk) + assert inst.title.en == 'Bread' + assert inst.title.ro == 'Paine' + + @classmethod + def test_assign_raw_dict_update(cls): + inst = cls.Model.objects.create( + title=dict(en='Bread', ro='Paine')) + + cls.Model.objects.update( + title=dict(en='Beer', ro='Bere')) + + inst = cls.Model.objects.get(pk=inst.pk) + assert inst.title.en == 'Beer' + assert inst.title.ro == 'Bere'