diff --git a/docs/modeltranslation/registration.rst b/docs/modeltranslation/registration.rst index 3f3ce5a..556f5a7 100644 --- a/docs/modeltranslation/registration.rst +++ b/docs/modeltranslation/registration.rst @@ -165,18 +165,18 @@ Model Field 0.4 0.5 ``BigIntegerField`` |n| |i| ``BooleanField`` |n| |y| ``CharField`` |y| |y| -``CommaSeparatedIntegerField`` |n| |i| +``CommaSeparatedIntegerField`` |n| |y| ``DateField`` |n| |u| ``DateTimeField`` |n| |u| -``DecimalField`` |n| |u| +``DecimalField`` |n| |y| ``EmailField`` |i| |i| ``FileField`` |y| |y| ``FilePathField`` |n| |u| -``FloatField`` |n| |u| +``FloatField`` |n| |y| ``ImageField`` |y| |y| ``IntegerField`` |n| |y| -``IPAddressField`` |n| |u| -``GenericIPAddressField`` |n| |u| +``IPAddressField`` |n| |y| +``GenericIPAddressField`` |n| |y| ``NullBooleanField`` |n| |y| ``PositiveIntegerField`` |n| |i| ``PositiveSmallIntegerField`` |n| |i| diff --git a/modeltranslation/fields.py b/modeltranslation/fields.py index 2efdc9d..02b7a53 100644 --- a/modeltranslation/fields.py +++ b/modeltranslation/fields.py @@ -11,12 +11,18 @@ from modeltranslation.utils import (get_language, SUPPORTED_FIELDS = ( fields.CharField, + # Above implies also CommaSeparatedIntegerField, EmailField, SlugField and URLField + # as they are subclasses of CharField. fields.TextField, fields.IntegerField, - # Above imply also BigIntegerField, SmallIntegerField, PositiveIntegerField and - # PositiveSmallIntegerField, as they are subclasses of IntegerField + # Above implies also BigIntegerField, SmallIntegerField, PositiveIntegerField and + # PositiveSmallIntegerField, as they are subclasses of IntegerField. fields.BooleanField, fields.NullBooleanField, + fields.FloatField, + fields.DecimalField, + fields.IPAddressField, + fields.GenericIPAddressField, fields.files.FileField, fields.files.ImageField, ) diff --git a/modeltranslation/tests/__init__.py b/modeltranslation/tests/__init__.py index d419183..1be7d38 100644 --- a/modeltranslation/tests/__init__.py +++ b/modeltranslation/tests/__init__.py @@ -7,6 +7,7 @@ NOTE: Perhaps ModeltranslationTestBase in tearDownClass should reload some modul """ from __future__ import with_statement # Python 2.5 compatibility +from decimal import Decimal import os import shutil @@ -468,6 +469,18 @@ class OtherFieldsTest(ModeltranslationTestBase): self.failUnless('csi' in field_names) self.failUnless('csi_de' in field_names) self.failUnless('csi_en' in field_names) + self.failUnless('ip' in field_names) + self.failUnless('ip_de' in field_names) + self.failUnless('ip_en' in field_names) + self.failUnless('genericip' in field_names) + self.failUnless('genericip_de' in field_names) + self.failUnless('genericip_en' in field_names) + self.failUnless('float' in field_names) + self.failUnless('float_de' in field_names) + self.failUnless('float_en' in field_names) + self.failUnless('decimal' in field_names) + self.failUnless('decimal_de' in field_names) + self.failUnless('decimal_en' in field_names) inst.delete() def test_translated_models_integer_instance(self): @@ -561,6 +574,99 @@ class OtherFieldsTest(ModeltranslationTestBase): inst.csi = '1;2' self.assertRaises(ValidationError, inst.full_clean) + def test_translated_models_ipaddress_instance(self): + inst = OtherFieldsModel() + inst.ip = '192.0.1.42' + self.assertEqual('de', get_language()) + self.assertEqual('192.0.1.42', inst.ip) + self.assertEqual('192.0.1.42', inst.ip_de) + self.assertEqual(None, inst.ip_en) + + inst.ip = '192.0.23.1' + inst.save() + self.assertEqual('192.0.23.1', inst.ip) + self.assertEqual('192.0.23.1', inst.ip_de) + self.assertEqual(None, inst.ip_en) + + trans_real.activate('en') + inst.ip = '192.0.1.42' + self.assertEqual('192.0.1.42', inst.ip) + self.assertEqual('192.0.23.1', inst.ip_de) + self.assertEqual('192.0.1.42', inst.ip_en) + + # Check if validation is preserved + inst.ip = '1;2' + self.assertRaises(ValidationError, inst.full_clean) + + def test_translated_models_genericipaddress_instance(self): + inst = OtherFieldsModel() + inst.genericip = '2a02:42fe::4' + self.assertEqual('de', get_language()) + self.assertEqual('2a02:42fe::4', inst.genericip) + self.assertEqual('2a02:42fe::4', inst.genericip_de) + self.assertEqual(None, inst.genericip_en) + + inst.genericip = '2a02:23fe::4' + inst.save() + self.assertEqual('2a02:23fe::4', inst.genericip) + self.assertEqual('2a02:23fe::4', inst.genericip_de) + self.assertEqual(None, inst.genericip_en) + + trans_real.activate('en') + inst.genericip = '2a02:42fe::4' + self.assertEqual('2a02:42fe::4', inst.genericip) + self.assertEqual('2a02:23fe::4', inst.genericip_de) + self.assertEqual('2a02:42fe::4', inst.genericip_en) + + # Check if validation is preserved + inst.genericip = '1;2' + self.assertRaises(ValidationError, inst.full_clean) + + def test_translated_models_float_instance(self): + inst = OtherFieldsModel() + inst.float = 0.42 + self.assertEqual('de', get_language()) + self.assertEqual(0.42, inst.float) + self.assertEqual(0.42, inst.float_de) + self.assertEqual(None, inst.float_en) + + inst.float = 0.23 + inst.save() + self.assertEqual(0.23, inst.float) + self.assertEqual(0.23, inst.float_de) + self.assertEqual(None, inst.float_en) + + trans_real.activate('en') + inst.float = 0.42 + self.assertEqual(0.42, inst.float) + self.assertEqual(0.23, inst.float_de) + self.assertEqual(0.42, inst.float_en) + + def test_translated_models_decimal_instance(self): + inst = OtherFieldsModel() + inst.decimal = Decimal('0.42') + self.assertEqual('de', get_language()) + self.assertEqual(Decimal('0.42'), inst.decimal) + self.assertEqual(Decimal('0.42'), inst.decimal_de) + self.assertEqual(None, inst.decimal_en) + + inst.decimal = inst.decimal - Decimal('0.19') + inst.save() + self.assertEqual(Decimal('0.23'), inst.decimal) + self.assertEqual(Decimal('0.23'), inst.decimal_de) + self.assertEqual(None, inst.decimal_en) + + trans_real.activate('en') + self.assertRaises(TypeError, lambda x: inst.decimal + Decimal('0.19')) + self.assertEqual(None, inst.decimal) + self.assertEqual(Decimal('0.23'), inst.decimal_de) + self.assertEqual(None, inst.decimal_en) + + inst.decimal = Decimal('0.42') + self.assertEqual(Decimal('0.42'), inst.decimal) + self.assertEqual(Decimal('0.23'), inst.decimal_de) + self.assertEqual(Decimal('0.42'), inst.decimal_en) + class ModeltranslationTestRule1(ModeltranslationTestBase): """ diff --git a/modeltranslation/tests/models.py b/modeltranslation/tests/models.py index ffd8748..088e48d 100644 --- a/modeltranslation/tests/models.py +++ b/modeltranslation/tests/models.py @@ -41,6 +41,10 @@ class OtherFieldsModel(models.Model): boolean = models.BooleanField() nullboolean = models.NullBooleanField() csi = models.CommaSeparatedIntegerField(max_length=255) + float = models.FloatField(blank=True, null=True) + decimal = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True) + ip = models.IPAddressField(blank=True, null=True) + genericip = models.GenericIPAddressField(blank=True, null=True) class MultitableModelA(models.Model): diff --git a/modeltranslation/tests/translation.py b/modeltranslation/tests/translation.py index 15ce7fc..900a7c2 100644 --- a/modeltranslation/tests/translation.py +++ b/modeltranslation/tests/translation.py @@ -33,7 +33,8 @@ translator.register(FileFieldsModel, FileFieldsModelTranslationOptions) class OtherFieldsModelTranslationOptions(TranslationOptions): - fields = ('int', 'boolean', 'nullboolean', 'csi',) + fields = ('int', 'boolean', 'nullboolean', 'csi', 'float', 'decimal', + 'ip', 'genericip') translator.register(OtherFieldsModel, OtherFieldsModelTranslationOptions)