From f525e1e2c0180488ca379d9390d3f96fbd1a5c80 Mon Sep 17 00:00:00 2001 From: Dirk Eschler Date: Mon, 6 Sep 2010 12:29:23 +0000 Subject: [PATCH] Removed experimental support for related fields. The code is now available in a separate branch called django-modeltranslation-related-fields. To support related fields properly, deeper changes to the core of modeltranslation are required. These changes are beyond the scope of the next release. --- CHANGELOG.txt | 4 - modeltranslation/fields.py | 109 +------- modeltranslation/tests.py | 485 +-------------------------------- modeltranslation/translator.py | 35 +-- 4 files changed, 15 insertions(+), 618 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 47160cc..37bc68c 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -7,13 +7,9 @@ (thanks to bmihelac, resolves issue 28) ADDED: Setting to override the default language. (thanks to jaap, resolves issue 2) - ADDED: Experimental support for related fields - ForeignKey, - ManyToManyField and OneToOneField. - (resolves issue 15) CHANGED: Improved performance of update_translation_fields command. (thanks to adamsc, resolves issue 43) -CHANGED: Custom fields are extended instead of overridden. CHANGED: Factored out settings into a separate settings.py and consistently used an app specific settings prefix. CHANGED: Refactored creation of translation fields and added handling of diff --git a/modeltranslation/fields.py b/modeltranslation/fields.py index 623cff4..b26892c 100644 --- a/modeltranslation/fields.py +++ b/modeltranslation/fields.py @@ -5,8 +5,6 @@ from warnings import warn from django.conf import settings from django.core.exceptions import ImproperlyConfigured from django.db.models.fields import Field, CharField, TextField -from django.db.models.fields.related import (ForeignKey, OneToOneField, - ManyToManyField) from modeltranslation.settings import * from modeltranslation.utils import (get_language, @@ -19,40 +17,21 @@ def create_translation_field(model, field_name, lang): Translation field factory. Returns a ``TranslationField`` based on a fieldname and a language. - Tries to create an object in the form ``'Translation%s' % cls_name`` - (e.g. ``TranslationForeignKey``, ``TranslationManyToManyField``) based on - ``model`` and ``field_name``. The class is usually a subclass of - ``TranslationField`` and is supposed to be implemented in this module. - - The list of supported fields can be extended. Just define a tuple of field - names in your settings.py like this:: + The list of supported fields can be extended by defining a tuple of field + names in the projects settings.py like this:: MODELTRANSLATION_CUSTOM_FIELDS = ('MyField', 'MyOtherField',) - If the class is a subclass of CharField or TextField then the standard - ``TranslationField`` will be used to instantiate the object. If the class - is neither a subclass of CharField or TextField, nor implemented here, nor + If the class is neither a subclass of CharField or TextField, nor in ``CUSTOM_FIELDS`` an ``ImproperlyConfigured`` exception will be raised. """ field = model._meta.get_field(field_name) cls_name = field.__class__.__name__ # No subclass required for text-like fields - if isinstance(field, (CharField, TextField)) or cls_name in CUSTOM_FIELDS: - return TranslationField(translated_field=field, language=lang) - # Try to instantiate translation field subclass - try: - translation_field = getattr(sys.modules['modeltranslation.fields'], - 'Translation%s' % cls_name) - except AttributeError: + if not (isinstance(field, (CharField, TextField)) or\ + cls_name in CUSTOM_FIELDS): raise ImproperlyConfigured('%s is not supported by ' 'modeltranslation.' % cls_name) - # Handle related fields - if cls_name in ('ForeignKey', 'OneToOneField', 'ManyToManyField'): - warn('Support for related fields is experimental and known to has ' - 'flaws. Only use it if you know what you are doing.', - FutureWarning) - return translation_field(translated_field=field, language=lang, - to=field.rel.to._meta.object_name) return TranslationField(translated_field=field, language=lang) @@ -141,64 +120,6 @@ class TranslationField(Field): return super(TranslationField, self).formfield(*args, **defaults) -class RelatedTranslationField(object): - """ - Mixin class which handles shared init of a translated relation field. - """ - def _related_pre_init(self, translated_field, language, *args, **kwargs): - self.translated_field = translated_field - self.language = language - - self.field_name = self.translated_field.name - self.translated_field_name =\ - build_localized_fieldname(self.translated_field.name, - self.language) - - # Dynamically add a related_name to the original field - translated_field.rel.related_name =\ - '%s%s' % (self.translated_field.model._meta.module_name, - self.field_name) - - TranslationField.__init__(self, self.translated_field, self.language, - *args, **kwargs) - - def _related_post_init(self): - # Dynamically add a related_name to the translation fields - self.rel.related_name =\ - '%s%s' % (self.translated_field.model._meta.module_name, - self.translated_field_name) - - # ForeignKey's init overrides some essential values from - # TranslationField, they have to be reassigned. - TranslationField._post_init(self, self.translated_field, self.language) - - -class TranslationForeignKey(ForeignKey, TranslationField, - RelatedTranslationField): - def __init__(self, translated_field, language, to, to_field=None, *args, - **kwargs): - self._related_pre_init(translated_field, language, *args, **kwargs) - ForeignKey.__init__(self, to, to_field, **kwargs) - self._related_post_init() - - -class TranslationOneToOneField(OneToOneField, TranslationField, - RelatedTranslationField): - def __init__(self, translated_field, language, to, to_field=None, *args, - **kwargs): - self._related_pre_init(translated_field, language, *args, **kwargs) - OneToOneField.__init__(self, to, to_field, **kwargs) - self._related_post_init() - - -class TranslationManyToManyField(ManyToManyField, TranslationField, - RelatedTranslationField): - def __init__(self, translated_field, language, to, *args, **kwargs): - self._related_pre_init(translated_field, language, *args, **kwargs) - ManyToManyField.__init__(self, to, **kwargs) - self._related_post_init() - - class TranslationFieldDescriptor(object): """A descriptor used for the original translated field.""" def __init__(self, name, initial_val="", fallback_value=None): @@ -239,23 +160,3 @@ class TranslationFieldDescriptor(object): related subclasses. """ return instance.__dict__[self.name] - - -class RelatedTranslationFieldDescriptor(TranslationFieldDescriptor): - def __init__(self, name, initial_val="", fallback_value=None): - TranslationFieldDescriptor.__init__(self, name, initial_val="", - fallback_value=None) - - def get_default_instance(self, instance): - # TODO: Implement - pass - - -class ManyToManyTranslationFieldDescriptor(TranslationFieldDescriptor): - def __init__(self, name, initial_val="", fallback_value=None): - TranslationFieldDescriptor.__init__(self, name, initial_val="", - fallback_value=None) - - def get_default_instance(self, instance): - # TODO: Implement - pass diff --git a/modeltranslation/tests.py b/modeltranslation/tests.py index 627bb77..e147bd3 100644 --- a/modeltranslation/tests.py +++ b/modeltranslation/tests.py @@ -29,25 +29,10 @@ class TestModel(models.Model): url = models.URLField(verify_exists=False, blank=True, null=True) email = models.EmailField(blank=True, null=True) xml = models.XMLField(blank=True, null=True) - fk = models.ForeignKey(RelatedModel, blank=True, null=True) - o2o = models.OneToOneField(RelatedModel, blank=True, null=True) - m2m = models.ManyToManyField(RelatedModel, blank=True, null=True) - #boolean = models.BooleanField() - #nullboolean = models.NullBooleanField() - #integer = models.IntegerField(null=True) - #biginteger = models.BigIntegerField(null=True) - #positiveinteger = models.PositiveIntegerField(null=True) - #positivesmallinteger = models.PositiveSmallIntegerField(null=True) - #smallinteger = models.SmallIntegerField(null=True) - #csvinteger = models.CommaSeparatedIntegerField(max_length=255, null=True) class TestTranslationOptions(translator.TranslationOptions): - fields = ('title', 'text', 'url', 'email', 'xml', 'fk', 'o2o', 'm2m',) - #fields = ('title', 'text', 'url', 'email', 'xml', 'boolean', - #'nullboolean', 'integer', 'biginteger', 'positiveinteger', - #'positivesmallinteger', 'smallinteger', - #'csvinteger',) + fields = ('title', 'text', 'url', 'email', 'xml',) translator.translator._registry = {} translator.translator.register(TestModel, TestTranslationOptions) @@ -59,25 +44,10 @@ class TestModelWithFallback(models.Model): url = models.URLField(verify_exists=False, blank=True, null=True) email = models.EmailField(blank=True, null=True) xml = models.XMLField(blank=True, null=True) - fk = models.ForeignKey(RelatedModel, blank=True, null=True) - o2o = models.OneToOneField(RelatedModel, blank=True, null=True) - m2m = models.ManyToManyField(RelatedModel, blank=True, null=True) - #boolean = models.BooleanField() - #nullboolean = models.NullBooleanField() - #integer = models.IntegerField(null=True) - #biginteger = models.BigIntegerField(null=True) - #positiveinteger = models.PositiveIntegerField(null=True) - #positivesmallinteger = models.PositiveSmallIntegerField(null=True) - #smallinteger = models.SmallIntegerField(null=True) - #csvinteger = models.CommaSeparatedIntegerField(max_length=255, null=True) class TestTranslationOptionsWithFallback(translator.TranslationOptions): - fields = ('title', 'text', 'url', 'email', 'xml', 'fk', 'o2o', 'm2m',) - #fields = ('title', 'text', 'url', 'email', 'xml', 'boolean', - #'nullboolean', 'integer', 'biginteger', 'positiveinteger', - #'positivesmallinteger', 'smallinteger', - #'csvinteger',) + fields = ('title', 'text', 'url', 'email', 'xml',) fallback_values = "" translator.translator.register(TestModelWithFallback, @@ -90,25 +60,10 @@ class TestModelWithFallback2(models.Model): url = models.URLField(verify_exists=False, blank=True, null=True) email = models.EmailField(blank=True, null=True) xml = models.XMLField(blank=True, null=True) - fk = models.ForeignKey(RelatedModel, blank=True, null=True) - o2o = models.OneToOneField(RelatedModel, blank=True, null=True) - m2m = models.ManyToManyField(RelatedModel, blank=True, null=True) - #boolean = models.BooleanField() - #nullboolean = models.NullBooleanField() - #integer = models.IntegerField(null=True) - #biginteger = models.BigIntegerField(null=True) - #positiveinteger = models.PositiveIntegerField(null=True) - #positivesmallinteger = models.PositiveSmallIntegerField(null=True) - #smallinteger = models.SmallIntegerField(null=True) - #csvinteger = models.CommaSeparatedIntegerField(max_length=255, null=True) class TestTranslationOptionsWithFallback2(translator.TranslationOptions): - fields = ('title', 'text', 'url', 'email', 'xml', 'fk', 'o2o', 'm2m',) - #fields = ('title', 'text', 'url', 'email', 'xml', 'boolean', - #'nullboolean', 'integer', 'biginteger', 'positiveinteger', - #'positivesmallinteger', 'smallinteger', - #'csvinteger',) + fields = ('title', 'text', 'url', 'email', 'xml',) fallback_values = {'text': ugettext_lazy('Sorry, translation is not ' 'available.')} @@ -170,39 +125,6 @@ class ModeltranslationTest(ModeltranslationTestBase): self.failUnless('xml' in field_names) self.failUnless('xml_de' in field_names) self.failUnless('xml_en' in field_names) - self.failUnless('fk' in field_names) - self.failUnless('fk_de' in field_names) - self.failUnless('fk_en' in field_names) - self.failUnless('o2o' in field_names) - self.failUnless('o2o_de' in field_names) - self.failUnless('o2o_en' in field_names) - self.failUnless('m2m' in field_names) - self.failUnless('m2m_de' in field_names) - self.failUnless('m2m_en' in field_names) - #self.failUnless('boolean' in field_names) - #self.failUnless('boolean_de' in field_names) - #self.failUnless('boolean_en' in field_names) - #self.failUnless('nullboolean' in field_names) - #self.failUnless('nullboolean_de' in field_names) - #self.failUnless('nullboolean_en' in field_names) - #self.failUnless('integer' in field_names) - #self.failUnless('integer_de' in field_names) - #self.failUnless('integer_en' in field_names) - #self.failUnless('biginteger' in field_names) - #self.failUnless('biginteger_de' in field_names) - #self.failUnless('biginteger_en' in field_names) - #self.failUnless('positiveinteger' in field_names) - #self.failUnless('positiveinteger_de' in field_names) - #self.failUnless('positiveinteger_en' in field_names) - #self.failUnless('positivesmallinteger' in field_names) - #self.failUnless('positivesmallinteger_de' in field_names) - #self.failUnless('positivesmallinteger_en' in field_names) - #self.failUnless('smallinteger' in field_names) - #self.failUnless('smallinteger_de' in field_names) - #self.failUnless('smallinteger_en' in field_names) - #self.failUnless('csvinteger' in field_names) - #self.failUnless('csvinteger_de' in field_names) - #self.failUnless('csvinteger_en' in field_names) inst.delete() def test_verbose_name(self): @@ -391,79 +313,6 @@ class ModeltranslationTestRule1(ModeltranslationTestBase): value_de='bar', value_en='baz') - def test_rule1_foreignkey(self): - rel1 = RelatedModel.objects.create(reltitle='German related title') - rel2 = RelatedModel.objects.create(reltitle='English related title') - self._test_field(field_name='fk', - value_de=rel1, - value_en=rel2) - - def test_rule1_onetoone_field(self): - # TODO: Required custom field test - rel1 = RelatedModel.objects.create(reltitle='German related title') - rel2 = RelatedModel.objects.create(reltitle='English related title') - self._test_field(field_name='o2o', - value_de=rel1, - value_en=rel2) - - def test_rule1_manytomany_field(self): - # TODO: Required custom field test - rel1 = RelatedModel.objects.create(reltitle='German related title') - rel2 = RelatedModel.objects.create(reltitle='English related title') - self._test_field(field_name='m2m', - value_de=rel1, - value_en=rel2) - - #def test_rule1_boolean_field(self): - #self._test_field(field_name='boolean', - #value_de=True, - #value_en=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='boolean', - #value_de=False, - #value_en=True) - - #def test_rule1_nullboolean_field(self): - #self._test_field(field_name='nullboolean', - #value_de=True, - #value_en=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='nullboolean', - #value_de=False, - #value_en=True) - - #def test_rule1_integer_field(self): - #self._test_field(field_name='integer', - #value_de=42, - #value_en=-42) - - #def test_rule1_biginteger_field(self): - #self._test_field(field_name='biginteger', - #value_de=1234567890, - #value_en=-1234567890) - - #def test_rule1_positiveinteger_field(self): - #self._test_field(field_name='positiveinteger', - #value_de=23, - #value_en=42) - - #def test_rule1_positivesmallinteger_field(self): - #self._test_field(field_name='positivesmallinteger', - #value_de=1, - #value_en=2) - - #def test_rule1_smallinteger_field(self): - #self._test_field(field_name='smallinteger', - #value_de=1, - #value_en=-1) - - #def test_rule1_csvinteger_field(self): - #self._test_field(field_name='csvinteger', - #value_de='1,2,3,4,5', - #value_en='5,4,3,2,1') - class ModeltranslationTestRule2(ModeltranslationTestBase): """ @@ -556,110 +405,6 @@ class ModeltranslationTestRule2(ModeltranslationTestBase): value2='foo', value3='foo') - def test_rule2_foreignkey(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='fk', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - def test_rule2_onetoone_field(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='o2o', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - def test_rule2_manytomany_field(self): - # TODO: Required custom field test - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='m2m', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - #def test_rule2_boolean_field(self): - #self._test_field(field_name='boolean', - #value1_de=True, - #value1_en=False, - #value2=True, - #value3=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='boolean', - #value1_de=False, - #value1_en=True, - #value2=False, - #value3=True) - - #def test_rule2_nullboolean_field(self): - #self._test_field(field_name='nullboolean', - #value1_de=True, - #value1_en=False, - #value2=True, - #value3=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='nullboolean', - #value1_de=False, - #value1_en=True, - #value2=False, - #value3=True) - - #def test_rule2_integer_field(self): - #self._test_field(field_name='integer', - #value1_de=42, - #value1_en=-42, - #value2=23, - #value3=32) - - #def test_rule2_biginteger_field(self): - #self._test_field(field_name='biginteger', - #value1_de=1234567890, - #value1_en=-1234567890, - #value2=987654321, - #value3=-987654321) - - #def test_rule2_positiveinteger_field(self): - #self._test_field(field_name='positiveinteger', - #value1_de=23, - #value1_en=42, - #value2=123, - #value3=321) - - #def test_rule2_positivesmallinteger_field(self): - #self._test_field(field_name='positivesmallinteger', - #value1_de=1, - #value1_en=2, - #value2=3, - #value3=4) - - #def test_rule2_smallinteger_field(self): - #self._test_field(field_name='smallinteger', - #value1_de=1, - #value1_en=-1, - #value2=2, - #value3=-2) - - #def test_rule2_csvinteger_field(self): - #self._test_field(field_name='csvinteger', - #value1_de='1,2,3,4,5', - #value1_en='5,4,3,2,1', - #value2='6,7,8', - #value3='9,8,10') - class ModeltranslationTestRule3(ModeltranslationTestBase): """ @@ -745,110 +490,6 @@ class ModeltranslationTestRule3(ModeltranslationTestBase): value2='foo', value3='foo') - def test_rule3_foreignkey(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='fk', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - def test_rule3_onetoone_field(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='o2o', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - def test_rule3_manytomany_field(self): - # TODO: Required custom field test - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2 = RelatedModel.objects.create(reltitle='Related title2') - rel3 = RelatedModel.objects.create(reltitle='Related title3') - self._test_field(field_name='m2m', - value1_de=rel1_de, - value1_en=rel1_en, - value2=rel2, - value3=rel3) - - #def test_rule3_boolean_field(self): - #self._test_field(field_name='boolean', - #value1_de=True, - #value1_en=False, - #value2=True, - #value3=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='boolean', - #value1_de=False, - #value1_en=True, - #value2=False, - #value3=True) - - #def test_rule3_nullboolean_field(self): - #self._test_field(field_name='nullboolean', - #value1_de=True, - #value1_en=False, - #value2=True, - #value3=False, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='nullboolean', - #value1_de=False, - #value1_en=True, - #value2=False, - #value3=True) - - #def test_rule3_integer_field(self): - #self._test_field(field_name='integer', - #value1_de=42, - #value1_en=-42, - #value2=23, - #value3=32) - - #def test_rule3_biginteger_field(self): - #self._test_field(field_name='biginteger', - #value1_de=1234567890, - #value1_en=-1234567890, - #value2=987654321, - #value3=-987654321) - - #def test_rule3_positiveinteger_field(self): - #self._test_field(field_name='positiveinteger', - #value1_de=23, - #value1_en=42, - #value2=123, - #value3=321) - - #def test_rule3_positivesmallinteger_field(self): - #self._test_field(field_name='positivesmallinteger', - #value1_de=1, - #value1_en=2, - #value2=3, - #value3=4) - - #def test_rule3_smallinteger_field(self): - #self._test_field(field_name='smallinteger', - #value1_de=1, - #value1_en=-1, - #value2=2, - #value3=-2) - - #def test_rule3_csvinteger_field(self): - #self._test_field(field_name='csvinteger', - #value1_de='1,2,3,4,5', - #value1_en='5,4,3,2,1', - #value2='6,7,8', - #value3='9,8,10') - class ModeltranslationTestRule4(ModeltranslationTestBase): """ @@ -942,126 +583,6 @@ class ModeltranslationTestRule4(ModeltranslationTestBase): value2_en='foo', value3='bar') - def test_rule4_foreignkey(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2_de = RelatedModel.objects.create(reltitle='Rel German title2') - rel2_en = RelatedModel.objects.create(reltitle='Rel English title2') - rel3 = RelatedModel.objects.create(reltitle='Rel title3') - self._test_field(field_name='fk', - value1_de=rel1_de, - value1_en=rel1_en, - value2_de=rel2_de, - value2_en=rel2_en, - value3=rel3) - - def test_rule4_onetoone_field(self): - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2_de = RelatedModel.objects.create(reltitle='Rel German title2') - rel2_en = RelatedModel.objects.create(reltitle='Rel English title2') - rel3 = RelatedModel.objects.create(reltitle='Rel title3') - self._test_field(field_name='o2o', - value1_de=rel1_de, - value1_en=rel1_en, - value2_de=rel2_de, - value2_en=rel2_en, - value3=rel3) - - def test_rule4_manytomany_field(self): - # TODO: Required custom field test - rel1_de = RelatedModel.objects.create(reltitle='German related title') - rel1_en = RelatedModel.objects.create(reltitle='English related title') - rel2_de = RelatedModel.objects.create(reltitle='Rel German title2') - rel2_en = RelatedModel.objects.create(reltitle='Rel English title2') - rel3 = RelatedModel.objects.create(reltitle='Rel title3') - self._test_field(field_name='m2m', - value1_de=rel1_de, - value1_en=rel1_en, - value2_de=rel2_de, - value2_en=rel2_en, - value3=rel3) - - #def test_rule4_boolean_field(self): - #self._test_field(field_name='boolean', - #value1_de=True, - #value1_en=False, - #value2_de=True, - #value2_en=False, - #value3=True, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='boolean', - #value1_de=False, - #value1_en=True, - #value2_de=False, - #value2_en=True, - #value3=True) - - #def test_rule4_nullboolean_field(self): - #self._test_field(field_name='nullboolean', - #value1_de=True, - #value1_en=False, - #value2_de=True, - #value2_en=False, - #value3=True, - #deactivate=False) - ## Now with swapped values - #self._test_field(field_name='nullboolean', - #value1_de=False, - #value1_en=True, - #value2_de=False, - #value2_en=True, - #value3=False) - - #def test_rule4_integer_field(self): - #self._test_field(field_name='integer', - #value1_de=42, - #value1_en=-42, - #value2_de=23, - #value2_en=32, - #value3=33) - - #def test_rule4_biginteger_field(self): - #self._test_field(field_name='biginteger', - #value1_de=1234567890, - #value1_en=-1234567890, - #value2_de=987654321, - #value2_en=-987654321, - #value3=987654322) - - #def test_rule4_positiveinteger_field(self): - #self._test_field(field_name='positiveinteger', - #value1_de=23, - #value1_en=42, - #value2_de=123, - #value2_en=321, - #value3=322) - - #def test_rule4_positivesmallinteger_field(self): - #self._test_field(field_name='positivesmallinteger', - #value1_de=1, - #value1_en=2, - #value2_de=3, - #value2_en=4, - #value3=5) - - #def test_rule4_smallinteger_field(self): - #self._test_field(field_name='smallinteger', - #value1_de=1, - #value1_en=-1, - #value2_de=2, - #value2_en=-2, - #value3=3) - - #def test_rule4_csvinteger_field(self): - #self._test_field(field_name='csvinteger', - #value1_de='1,2,3,4,5', - #value1_en='5,4,3,2,1', - #value2_de='6,7,8', - #value2_en='9,8,10', - #value3='9,8,10,11') - class ModeltranslationTestModelValidation(ModeltranslationTestBase): """ diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 9bf7d73..566b256 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -1,18 +1,12 @@ # -*- coding: utf-8 -*- from django.conf import settings -#from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import signals from django.db.models.base import ModelBase from django.utils.functional import curry from modeltranslation.fields import (TranslationField, - TranslationForeignKey, - TranslationOneToOneField, - TranslationManyToManyField, TranslationFieldDescriptor, - RelatedTranslationFieldDescriptor, - ManyToManyTranslationFieldDescriptor, create_translation_field) from modeltranslation.utils import build_localized_fieldname @@ -36,9 +30,7 @@ class TranslationOptions(object): on. """ def __init__(self, *args, **kwargs): - # self.translation_model = None - #self.model_ct = None - self.localized_fieldnames = list() + self.localized_fieldnames = [] def add_localized_fields(model): @@ -160,31 +152,18 @@ class Translator(object): rev_dict[ln] = orig_name translation_opts.localized_fieldnames_rev = rev_dict - model_fallback_values = getattr(translation_opts, 'fallback_values', - None) + model_fallback_values =\ + getattr(translation_opts, 'fallback_values', None) for field_name in translation_opts.fields: - # TODO: Check if fallback_value is set to a type that the field - # expects and raise ImproperlyConfigured in case it doesn't. if model_fallback_values is None: field_fallback_value = None elif isinstance(model_fallback_values, dict): - field_fallback_value = model_fallback_values.get(field_name, - None) + field_fallback_value =\ + model_fallback_values.get(field_name, None) else: field_fallback_value = model_fallback_values - - field = model._meta.get_field(field_name) - field_class_name = field.rel.__class__.__name__ - if field_class_name in ('ManyToOneRel', 'OneToOneRel'): - descriptor = RelatedTranslationFieldDescriptor(field_name, - fallback_value=field_fallback_value) - elif field_class_name == 'ManyToManyRel': - descriptor = ManyToManyTranslationFieldDescriptor(field_name, - fallback_value=field_fallback_value) - else: - descriptor = TranslationFieldDescriptor(field_name, - fallback_value=field_fallback_value) - setattr(model, field_name, descriptor) + setattr(model, field_name, TranslationFieldDescriptor(field_name,\ + fallback_value=field_fallback_value)) #signals.pre_init.connect(translated_model_initializing, sender=model, #weak=False)