Ticket #11486: xml_serializer_fix.diff

File xml_serializer_fix.diff, 3.9 KB (added by niall, 9 years ago)

Fixes the ticket and adds an explicit test for serialized strings without PKs.

  • django/core/serializers/xml_serializer.py

     
    4242            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
    4343
    4444        self.indent(1)
    45         self.xml.startElement("object", {
    46             "pk"    : smart_unicode(obj._get_pk_val()),
    47             "model" : smart_unicode(obj._meta),
    48         })
     45        obj_pk = obj._get_pk_val()
     46        if obj_pk is None:
     47            attrs = {"model": smart_unicode(obj._meta),}
     48        else:
     49            attrs = {
     50                "pk": smart_unicode(obj._get_pk_val()),
     51                "model": smart_unicode(obj._meta),
     52            }
    4953
     54        self.xml.startElement("object", attrs)
     55
    5056    def end_object(self, obj):
    5157        """
    5258        Called after handling all fields for an object.
     
    166172        # bail.
    167173        Model = self._get_model_from_node(node, "model")
    168174
    169         # Start building a data dictionary from the object.  If the node is
    170         # missing the pk attribute, bail.
    171         pk = node.getAttribute("pk")
    172         if not pk:
    173             raise base.DeserializationError("<object> node is missing the 'pk' attribute")
     175        # Start building a data dictionary from the object.
     176        # If the node is missing the pk set it to None
     177        if node.hasAttribute("pk"):
     178            pk = node.getAttribute("pk")
     179        else:
     180            pk = None
    174181
    175182        data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)}
    176183
  • tests/modeltests/serializers/tests.py

     Index: tests/modeltests/serializers/tests.py
     
    219219        self.assertTrue(date_values)
    220220        assert date_values[0].startswith("0001")
    221221
     222    def test_pkless_serialized_strings(self):
     223        """
     224        Tests that serialized strings without PKs
     225        can be turned into models
     226        """
     227        deserial_objs = list(serializers.deserialize(self.serializer_name,
     228                                                self.pkless_str))
     229        for obj in deserial_objs:
     230            self.assertFalse(obj.object.id)
     231            obj.save()
     232        self.assertEqual(Category.objects.all().count(), 4)
     233
    222234
    223235class XmlSerializerTestCase(SerializersTestBase, TestCase):
    224236    serializer_name = "xml"
     
    241253                            '<field type="CharField" name="name">'
    242254                            'Reference</field></object>'
    243255                            '</django-objects>')
     256    pkless_str = ('<?xml version="1.0" encoding="utf-8"?>'
     257                           '<django-objects version="1.0">'
     258                           '<object model="serializers.category">'
     259                            '<field type="CharField" name="name">'
     260                            'Reference</field></object>'
     261                            '</django-objects>')
    244262
    245263    @staticmethod
    246264    def _validate_output(serial_str):
     
    275293                    '"fields": {"name": "Reference"}},'
    276294                    '{"pk": 1, "model": "serializers.author",'
    277295                    '"fields": {"name": "Agnes"}}]')
     296    pkless_str = ('[{"pk": null, "model": "serializers.category",'
     297                    '"fields": {"name": "Reference"}}]')
    278298
    279299    @staticmethod
    280300    def _validate_output(serial_str):
     
    316336                        '    name: Agnes',
    317337                        '  pk: 1',
    318338                        '  model: serializers.author',])
     339        pkless_str = "\n".join(['- fields:',
     340                        '    name: Reference',
     341                        '  pk: null',
     342                        '  model: serializers.category'])
    319343
    320344        @staticmethod
    321345        def _validate_output(serial_str):
Back to Top