Skip to content

Commit 3fef1f4

Browse files
committed
Fixed #4558 -- Modified XML serializer to handle whitespace better around None tags. Thanks to Bill Fenner <fenner@gmail.com> for the report and fix.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@5727 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 0827f4a commit 3fef1f4

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

django/core/serializers/xml_serializer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ def _handle_object(self, node):
171171
elif field.rel and isinstance(field.rel, models.ManyToOneRel):
172172
data[field.attname] = self._handle_fk_field_node(field_node, field)
173173
else:
174-
if len(field_node.childNodes) == 1 and field_node.childNodes[0].nodeName == 'None':
174+
if field_node.getElementsByTagName('None'):
175175
value = None
176176
else:
177177
value = field.to_python(getInnerText(field_node).strip())
@@ -185,7 +185,7 @@ def _handle_fk_field_node(self, node, field):
185185
Handle a <field> node for a ForeignKey
186186
"""
187187
# Check if there is a child node named 'None', returning None if so.
188-
if len(node.childNodes) == 1 and node.childNodes[0].nodeName == 'None':
188+
if node.getElementsByTagName('None'):
189189
return None
190190
else:
191191
return field.rel.to._meta.get_field(field.rel.field_name).to_python(
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<django-objects version="1.0">
3+
<object pk="1" model="fixtures_regress.stuff">
4+
<field type="CharField" name="name">
5+
<None/>
6+
</field>
7+
<field to="auth.user" name="owner" rel="ManyToOneRel">
8+
<None/>
9+
</field>
10+
</object>
11+
</django-objects>

tests/regressiontests/fixtures_regress/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.db import models
2+
from django.contrib.auth.models import User
23

34
class Animal(models.Model):
45
name = models.CharField(maxlength=150)
@@ -14,6 +15,13 @@ class Meta:
1415
# For testing when upper case letter in app name; regression for #4057
1516
db_table = "Fixtures_regress_plant"
1617

18+
class Stuff(models.Model):
19+
name = models.CharField(maxlength=20, null=True)
20+
owner = models.ForeignKey(User, null=True)
21+
22+
def __unicode__(self):
23+
return unicode(self.name) + u' is owned by ' + unicode(self.owner)
24+
1725
__test__ = {'API_TESTS':"""
1826
>>> from django.core import management
1927
@@ -26,4 +34,13 @@ class Meta:
2634
>>> animal = Animal(name='Platypus', latin_name='Ornithorhynchus anatinus')
2735
>>> animal.save()
2836
37+
###############################################
38+
# Regression test for ticket #4558 -- pretty printing of XML fixtures
39+
# doesn't affect parsing of None values.
40+
41+
# Load a pretty-printed XML fixture with Nulls.
42+
>>> management.load_data(['pretty.xml'], verbosity=0)
43+
>>> Stuff.objects.all()
44+
[<Stuff: None is owned by None>]
45+
2946
"""}

0 commit comments

Comments
 (0)