From 2df2ec8b365dcc72e6ae52cb255a24c880aedd57 Mon Sep 17 00:00:00 2001 From: Swen Kooij Date: Thu, 25 May 2017 18:45:21 +0300 Subject: [PATCH] Move LocalizedValueDescriptor into its own file --- localized_fields/fields/localized_field.py | 61 +------------------- localized_fields/localized_descriptor.py | 65 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 60 deletions(-) create mode 100644 localized_fields/localized_descriptor.py diff --git a/localized_fields/fields/localized_field.py b/localized_fields/fields/localized_field.py index 316c9af..29a23c8 100644 --- a/localized_fields/fields/localized_field.py +++ b/localized_fields/fields/localized_field.py @@ -4,71 +4,12 @@ from typing import Union from django.conf import settings from django.db.utils import IntegrityError -from django.utils import six, translation from psqlextra.fields import HStoreField from ..forms import LocalizedFieldForm from ..localized_value import LocalizedValue - - -class LocalizedValueDescriptor(object): - """ - The descriptor for the localized value attribute on the model instance. - Returns a :see:LocalizedValue when accessed so you can do stuff like:: - - >>> from myapp.models import MyModel - >>> instance = MyModel() - >>> instance.value.en = 'English value' - - Assigns a strings to active language key in :see:LocalizedValue on - assignment so you can do:: - - >>> from django.utils import translation - >>> from myapp.models import MyModel - - >>> translation.activate('nl') - >>> instance = MyModel() - >>> instance.title = 'dutch title' - >>> print(instance.title.nl) # prints 'dutch title' - """ - def __init__(self, field): - self.field = field - - def __get__(self, instance, cls=None): - if instance is None: - return self - - # This is slightly complicated, so worth an explanation. - # `instance.localizedvalue` needs to ultimately return some instance of - # `LocalizedValue`, probably a subclass. - - # The instance dict contains whatever was originally assigned - # in __set__. - if self.field.name in instance.__dict__: - value = instance.__dict__[self.field.name] - elif instance.pk is not None: - instance.refresh_from_db(fields=[self.field.name]) - value = getattr(instance, self.field.name) - else: - value = None - - if value is None: - attr = self.field.attr_class() - instance.__dict__[self.field.name] = attr - - if isinstance(value, dict): - attr = self.field.attr_class(value) - instance.__dict__[self.field.name] = attr - - return instance.__dict__[self.field.name] - - def __set__(self, instance, value): - if isinstance(value, six.string_types): - self.__get__(instance).set(translation.get_language() or - settings.LANGUAGE_CODE, value) - else: - instance.__dict__[self.field.name] = value +from ..localized_descriptor import LocalizedValueDescriptor class LocalizedField(HStoreField): diff --git a/localized_fields/localized_descriptor.py b/localized_fields/localized_descriptor.py new file mode 100644 index 0000000..5518b70 --- /dev/null +++ b/localized_fields/localized_descriptor.py @@ -0,0 +1,65 @@ +from django.conf import settings +from django.utils import six, translation + + +class LocalizedValueDescriptor: + """ + The descriptor for the localized value attribute on the model instance. + Returns a :see:LocalizedValue when accessed so you can do stuff like:: + + >>> from myapp.models import MyModel + >>> instance = MyModel() + >>> instance.value.en = 'English value' + + Assigns a strings to active language key in :see:LocalizedValue on + assignment so you can do:: + + >>> from django.utils import translation + >>> from myapp.models import MyModel + + >>> translation.activate('nl') + >>> instance = MyModel() + >>> instance.title = 'dutch title' + >>> print(instance.title.nl) # prints 'dutch title' + """ + + def __init__(self, field): + """Initializes a new instance of :see:LocalizedValueDescriptor.""" + + self.field = field + + def __get__(self, instance, cls=None): + if instance is None: + return self + + # This is slightly complicated, so worth an explanation. + # `instance.localizedvalue` needs to ultimately return some instance of + # `LocalizedValue`, probably a subclass. + + # The instance dict contains whatever was originally assigned + # in __set__. + + if self.field.name in instance.__dict__: + value = instance.__dict__[self.field.name] + elif instance.pk is not None: + instance.refresh_from_db(fields=[self.field.name]) + value = getattr(instance, self.field.name) + else: + value = None + + if value is None: + attr = self.field.attr_class() + instance.__dict__[self.field.name] = attr + + if isinstance(value, dict): + attr = self.field.attr_class(value) + instance.__dict__[self.field.name] = attr + + return instance.__dict__[self.field.name] + + def __set__(self, instance, value): + if isinstance(value, six.string_types): + self.__get__(instance).set(translation.get_language() or + settings.LANGUAGE_CODE, value) + else: + instance.__dict__[self.field.name] = value