mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-05-15 16:33:08 +00:00
Add descriptor test.
This commit is contained in:
parent
89bfa0bdbe
commit
14fdaa59fa
3 changed files with 92 additions and 3 deletions
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
Loading…
Reference in a new issue