Skip to content

Commit eb244b0

Browse files
timgrahamjacobtylerwalls
authored andcommitted
Refs #37023 -- Removed hardcoded indent levels from XML serializer.
This facilitates nested fields and objects.
1 parent dadf5df commit eb244b0

1 file changed

Lines changed: 16 additions & 5 deletions

File tree

django/core/serializers/xml_serializer.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ def start_serialization(self):
4848
"""
4949
Start serialization -- open the XML document and the root element.
5050
"""
51+
# Increment the indent_level before each startElement() and decrement
52+
# it following each endElement(). If the closing tag should appear on
53+
# its own line, use self.indent(self.indent_level) before endElement().
54+
self.indent_level = 0
5155
self.xml = SimplerXMLGenerator(
5256
self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET)
5357
)
@@ -58,7 +62,7 @@ def end_serialization(self):
5862
"""
5963
End serialization -- end the document.
6064
"""
61-
self.indent(0)
65+
self.indent(self.indent_level)
6266
self.xml.endElement("django-objects")
6367
self.xml.endDocument()
6468

@@ -71,7 +75,8 @@ def start_object(self, obj):
7175
"Non-model object (%s) encountered during serialization" % type(obj)
7276
)
7377

74-
self.indent(1)
78+
self.indent_level += 1
79+
self.indent(self.indent_level)
7580
attrs = {"model": str(obj._meta)}
7681
if not self.use_natural_primary_keys or not self._resolve_natural_key(obj):
7782
obj_pk = obj.pk
@@ -84,15 +89,17 @@ def end_object(self, obj):
8489
"""
8590
Called after handling all fields for an object.
8691
"""
87-
self.indent(1)
92+
self.indent(self.indent_level)
8893
self.xml.endElement("object")
94+
self.indent_level -= 1
8995

9096
def handle_field(self, obj, field):
9197
"""
9298
Handle each field on an object (except for ForeignKeys and
9399
ManyToManyFields).
94100
"""
95-
self.indent(2)
101+
self.indent_level += 1
102+
self.indent(self.indent_level)
96103
self.xml.startElement(
97104
"field",
98105
{
@@ -119,6 +126,7 @@ def handle_field(self, obj, field):
119126
self.xml.addQuickElement("None")
120127

121128
self.xml.endElement("field")
129+
self.indent_level -= 1
122130

123131
def handle_fk_field(self, obj, field):
124132
"""
@@ -144,6 +152,7 @@ def handle_fk_field(self, obj, field):
144152
else:
145153
self.xml.addQuickElement("None")
146154
self.xml.endElement("field")
155+
self.indent_level -= 1
147156

148157
def handle_m2m_field(self, obj, field):
149158
"""
@@ -212,10 +221,12 @@ def queryset_iterator(obj, field):
212221
handle_m2m(relobj)
213222

214223
self.xml.endElement("field")
224+
self.indent_level -= 1
215225

216226
def _start_relational_field(self, field):
217227
"""Output the <field> element for relational fields."""
218-
self.indent(2)
228+
self.indent_level += 1
229+
self.indent(self.indent_level)
219230
self.xml.startElement(
220231
"field",
221232
{

0 commit comments

Comments
 (0)