diff --git a/modeltranslation/tests/__init__.py b/modeltranslation/tests/__init__.py index 163fbda..4027d21 100644 --- a/modeltranslation/tests/__init__.py +++ b/modeltranslation/tests/__init__.py @@ -227,7 +227,7 @@ class ModeltranslationTest(ModeltranslationTestBase): self.failUnless(translator.translator) # Check that all models are registered for translation - self.assertEqual(len(translator.translator.get_registered_models()), 21) + self.assertEqual(len(translator.translator.get_registered_models()), 22) # Try to unregister a model that is not registered self.assertRaises(translator.NotRegistered, @@ -885,6 +885,46 @@ class OtherFieldsTest(ModeltranslationTestBase): self.assertEqual(datetime.time(01, 02, 03), inst.time_de) self.assertEqual(datetime.time(23, 42, 0), inst.time_en) + def test_descriptors(self): + # Descriptor store ints in database and returns string of 'a' of that length + inst = models.DescriptorModel() + # Demonstrate desired behaviour + inst.normal = 2 + self.assertEqual('aa', inst.normal) + inst.normal = 'abc' + self.assertEqual('aaa', inst.normal) + + # Descriptor on translated field works too + self.assertEqual('de', get_language()) + inst.trans = 5 + self.assertEqual('aaaaa', inst.trans) + + inst.save() + db_values = models.DescriptorModel.objects.values('normal', 'trans_en', 'trans_de')[0] + self.assertEqual(3, db_values['normal']) + self.assertEqual(5, db_values['trans_de']) + self.assertEqual(0, db_values['trans_en']) + + # Retrieval from db + inst = models.DescriptorModel.objects.all()[0] + self.assertEqual('aaa', inst.normal) + self.assertEqual('aaaaa', inst.trans) + self.assertEqual('aaaaa', inst.trans_de) + self.assertEqual('', inst.trans_en) + + # Other language + trans_real.activate('en') + self.assertEqual('', inst.trans) + inst.trans = 'q' + self.assertEqual('a', inst.trans) + inst.trans_de = 4 + self.assertEqual('aaaa', inst.trans_de) + inst.save() + db_values = models.DescriptorModel.objects.values('normal', 'trans_en', 'trans_de')[0] + self.assertEqual(3, db_values['normal']) + self.assertEqual(4, db_values['trans_de']) + self.assertEqual(1, db_values['trans_en']) + class ModeltranslationTestRule1(ModeltranslationTestBase): """ diff --git a/modeltranslation/tests/models.py b/modeltranslation/tests/models.py index 25eb129..183b09c 100644 --- a/modeltranslation/tests/models.py +++ b/modeltranslation/tests/models.py @@ -56,6 +56,50 @@ class OtherFieldsModel(models.Model): # genericip = models.GenericIPAddressField(blank=True, null=True) +class FancyDescriptor(object): + """ + Stupid demo descriptor, that store int in database and return string of that length on get. + """ + def __init__(self, field): + self.field = field + + def __get__(self, instance, owner): + length = instance.__dict__[self.field.name] + if length is None: + return '' + return 'a' * length + + def __set__(self, obj, value): + if isinstance(value, int): + obj.__dict__[self.field.name] = value + elif isinstance(value, basestring): + obj.__dict__[self.field.name] = len(value) + else: + obj.__dict__[self.field.name] = 0 + + +class FancyField(models.PositiveIntegerField): + def __init__(self, *args, **kwargs): + kwargs.setdefault('default', '') + super(FancyField, self).__init__(*args, **kwargs) + + def contribute_to_class(self, cls, name): + super(FancyField, self).contribute_to_class(cls, name) + setattr(cls, self.name, FancyDescriptor(self)) + + def pre_save(self, model_instance, add): + value = super(FancyField, self).pre_save(model_instance, add) + # In this part value should be retrieved using descriptor and be a string + assert isinstance(value, basestring) + # We put an int to database + return len(value) + + +class DescriptorModel(models.Model): + normal = FancyField() + trans = FancyField() + + ########## Multitable inheritance testing class MultitableModelA(models.Model): diff --git a/modeltranslation/tests/translation.py b/modeltranslation/tests/translation.py index 49728f0..40a00fc 100644 --- a/modeltranslation/tests/translation.py +++ b/modeltranslation/tests/translation.py @@ -3,8 +3,8 @@ from django.utils.translation import ugettext_lazy from modeltranslation.translator import translator, TranslationOptions from modeltranslation.tests.models import ( - TestModel, FallbackModel, FallbackModel2, FileFieldsModel, OtherFieldsModel, AbstractModelA, - AbstractModelB, Slugged, MetaData, Displayable, Page, RichText, RichTextPage, + TestModel, FallbackModel, FallbackModel2, FileFieldsModel, OtherFieldsModel, DescriptorModel, + AbstractModelA, AbstractModelB, Slugged, MetaData, Displayable, Page, RichText, RichTextPage, MultitableModelA, MultitableModelB, MultitableModelC, ManagerTestModel, CustomManagerTestModel, CustomManager2TestModel, GroupFieldsetsModel, NameModel) @@ -45,6 +45,11 @@ class OtherFieldsModelTranslationOptions(TranslationOptions): translator.register(OtherFieldsModel, OtherFieldsModelTranslationOptions) +class DescriptorModelTranslationOptions(TranslationOptions): + fields = ('trans',) +translator.register(DescriptorModel, DescriptorModelTranslationOptions) + + ########## Multitable inheritance testing class MultitableModelATranslationOptions(TranslationOptions):