Increased the list of supported fields. Today featuring: Floatfield, DecimalField, IPAddressField and GenericIPAddressField.

This commit is contained in:
Dirk Eschler 2012-11-17 16:19:15 +01:00
parent 0e028f2713
commit 1163765c3b
5 changed files with 125 additions and 8 deletions

View file

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

View file

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

View file

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

View file

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

View file

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