Add descriptor test.

This commit is contained in:
Jacek Tomaszewski 2013-02-13 11:59:11 +01:00
parent 89bfa0bdbe
commit 14fdaa59fa
3 changed files with 92 additions and 3 deletions

View file

@ -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):
"""

View file

@ -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):

View file

@ -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):