diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index dc6e24a476d9..963adafaa049 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -776,12 +776,12 @@ ol.breadcrumbs a:focus, ol.breadcrumbs a:hover { .viewlink, .inlineviewlink { padding-left: 16px; - background: url(../img/icon-viewlink.svg) 0 1px no-repeat; + background: url(../img/icon-viewlink.svg) 0 center no-repeat; } .hidelink { padding-left: 16px; - background: url(../img/icon-hidelink.svg) 0 1px no-repeat; + background: url(../img/icon-hidelink.svg) 0 center no-repeat; } .addlink { diff --git a/django/contrib/admin/static/admin/css/rtl.css b/django/contrib/admin/static/admin/css/rtl.css index 4726aceb9c4d..9164aa0f4b75 100644 --- a/django/contrib/admin/static/admin/css/rtl.css +++ b/django/contrib/admin/static/admin/css/rtl.css @@ -16,7 +16,7 @@ th { .viewlink, .addlink, .changelink, .hidelink { padding-left: 0; padding-right: 16px; - background-position: 100% 1px; + background-position-x: 100%; } .deletelink { diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py index 3d1f79ea0d00..5dfbb76a01cf 100644 --- a/django/core/serializers/xml_serializer.py +++ b/django/core/serializers/xml_serializer.py @@ -48,6 +48,10 @@ def start_serialization(self): """ Start serialization -- open the XML document and the root element. """ + # Increment the indent_level before each startElement() and decrement + # it following each endElement(). If the closing tag should appear on + # its own line, use self.indent(self.indent_level) before endElement(). + self.indent_level = 0 self.xml = SimplerXMLGenerator( self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET) ) @@ -58,7 +62,7 @@ def end_serialization(self): """ End serialization -- end the document. """ - self.indent(0) + self.indent(self.indent_level) self.xml.endElement("django-objects") self.xml.endDocument() @@ -71,7 +75,8 @@ def start_object(self, obj): "Non-model object (%s) encountered during serialization" % type(obj) ) - self.indent(1) + self.indent_level += 1 + self.indent(self.indent_level) attrs = {"model": str(obj._meta)} if not self.use_natural_primary_keys or not self._resolve_natural_key(obj): obj_pk = obj.pk @@ -84,15 +89,17 @@ def end_object(self, obj): """ Called after handling all fields for an object. """ - self.indent(1) + self.indent(self.indent_level) self.xml.endElement("object") + self.indent_level -= 1 def handle_field(self, obj, field): """ Handle each field on an object (except for ForeignKeys and ManyToManyFields). """ - self.indent(2) + self.indent_level += 1 + self.indent(self.indent_level) self.xml.startElement( "field", { @@ -119,6 +126,7 @@ def handle_field(self, obj, field): self.xml.addQuickElement("None") self.xml.endElement("field") + self.indent_level -= 1 def handle_fk_field(self, obj, field): """ @@ -144,6 +152,7 @@ def handle_fk_field(self, obj, field): else: self.xml.addQuickElement("None") self.xml.endElement("field") + self.indent_level -= 1 def handle_m2m_field(self, obj, field): """ @@ -190,6 +199,8 @@ def queryset_iterator(obj, field): else: def handle_m2m(value): + # Put each object on its own line. + self.indent(self.indent_level + 1) self.xml.addQuickElement("object", attrs={"pk": str(value.pk)}) def queryset_iterator(obj, field): @@ -208,14 +219,20 @@ def queryset_iterator(obj, field): field.name, queryset_iterator(obj, field), ) + relobj = None for relobj in m2m_iter: handle_m2m(relobj) - + if relobj: + # If there are related objects (which appear each on their own + # line), put the closing on the next line. + self.indent(self.indent_level) self.xml.endElement("field") + self.indent_level -= 1 def _start_relational_field(self, field): """Output the element for relational fields.""" - self.indent(2) + self.indent_level += 1 + self.indent(self.indent_level) self.xml.startElement( "field", { diff --git a/tests/serializers/test_xml.py b/tests/serializers/test_xml.py index 0ae66f77d018..884746dfac25 100644 --- a/tests/serializers/test_xml.py +++ b/tests/serializers/test_xml.py @@ -24,7 +24,10 @@ class XmlSerializerTestCase(SerializersTestBase, TestCase): %(author_pk)s Poker has no place on ESPN 2006-06-16T11:00:00 - + + + +