Author: russellm
Date: 2008-08-24 03:12:13 -0500 (Sun, 24 Aug 2008)
New Revision: 8515

Added:
   django/trunk/tests/regressiontests/fixtures_regress/fixtures/animal.xml
Modified:
   django/trunk/django/db/models/fields/__init__.py
   django/trunk/tests/regressiontests/fixtures_regress/fixtures/sequence.json
   django/trunk/tests/regressiontests/fixtures_regress/models.py
Log:
Fixed #8298: Added a to_python method for integer fields. This ensures that the 
data from deserialized instances is of correct type prior to saving. Thanks to 
Andrew Badr for the report.

Modified: django/trunk/django/db/models/fields/__init__.py
===================================================================
--- django/trunk/django/db/models/fields/__init__.py    2008-08-24 08:09:27 UTC 
(rev 8514)
+++ django/trunk/django/db/models/fields/__init__.py    2008-08-24 08:12:13 UTC 
(rev 8515)
@@ -786,6 +786,14 @@
     def get_internal_type(self):
         return "IntegerField"
 
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return int(value)
+        except (TypeError, ValueError):
+            raise validators.ValidationError, _("This value must be an 
integer.")
+                
     def formfield(self, **kwargs):
         defaults = {'form_class': forms.IntegerField}
         defaults.update(kwargs)

Added: django/trunk/tests/regressiontests/fixtures_regress/fixtures/animal.xml
===================================================================
--- django/trunk/tests/regressiontests/fixtures_regress/fixtures/animal.xml     
                        (rev 0)
+++ django/trunk/tests/regressiontests/fixtures_regress/fixtures/animal.xml     
2008-08-24 08:12:13 UTC (rev 8515)
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<django-objects version="1.0">
+  <object pk="10" model="fixtures_regress.animal">
+      <field type="CharField" name="name">Emu</field>
+      <field type="CharField" name="latin_name">Dromaius 
novaehollandiae</field>
+      <field type="IntegerField" name="count">42</field>
+  </object>
+</django-objects>
\ No newline at end of file

Modified: 
django/trunk/tests/regressiontests/fixtures_regress/fixtures/sequence.json
===================================================================
--- django/trunk/tests/regressiontests/fixtures_regress/fixtures/sequence.json  
2008-08-24 08:09:27 UTC (rev 8514)
+++ django/trunk/tests/regressiontests/fixtures_regress/fixtures/sequence.json  
2008-08-24 08:12:13 UTC (rev 8515)
@@ -4,7 +4,8 @@
         "model": "fixtures_regress.animal", 
         "fields": {
             "name": "Lion", 
-            "latin_name": "Panthera leo"
+            "latin_name": "Panthera leo",
+            "count": 3
         }
     }
 ]
\ No newline at end of file

Modified: django/trunk/tests/regressiontests/fixtures_regress/models.py
===================================================================
--- django/trunk/tests/regressiontests/fixtures_regress/models.py       
2008-08-24 08:09:27 UTC (rev 8514)
+++ django/trunk/tests/regressiontests/fixtures_regress/models.py       
2008-08-24 08:12:13 UTC (rev 8515)
@@ -6,10 +6,15 @@
 class Animal(models.Model):
     name = models.CharField(max_length=150)
     latin_name = models.CharField(max_length=150)
-
+    count = models.IntegerField()
+    
     def __unicode__(self):
         return self.common_name
 
+def animal_pre_save_check(signal, sender, instance, **kwargs):
+    "A signal that is used to check the type of data loaded from fixtures"
+    print 'Count = %s (%s)' % (instance.count, type(instance.count))
+
 class Plant(models.Model):
     name = models.CharField(max_length=150)
 
@@ -64,7 +69,7 @@
 # Create a new animal. Without a sequence reset, this new object
 # will take a PK of 1 (on Postgres), and the save will fail.
 # This is a regression test for ticket #3790.
->>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus')
+>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus', 
count=2)
 >>> animal.save()
 
 ###############################################
@@ -134,4 +139,14 @@
 >>> articles.values_list('id', flat=True)
 [1, 2, 3, 4, 5, 6, 7, 8]
 
+###############################################
+# Test for ticket #8298 - Field values should be coerced into the correct type
+# by the deserializer, not as part of the database write.
+
+>>> models.signals.pre_save.connect(animal_pre_save_check)
+>>> management.call_command('loaddata', 'animal.xml', verbosity=0)
+Count = 42 (<type 'int'>)
+
+>>> models.signals.pre_save.disconnect(animal_pre_save_check)
+
 """}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to