Author: russellm
Date: 2007-03-19 06:57:53 -0500 (Mon, 19 Mar 2007)
New Revision: 4752

Modified:
   django/trunk/django/core/serializers/base.py
   django/trunk/django/db/models/fields/__init__.py
   django/trunk/django/db/models/fields/generic.py
   django/trunk/django/db/models/options.py
   django/trunk/tests/regressiontests/serializers_regress/models.py
   django/trunk/tests/regressiontests/serializers_regress/tests.py
Log:
Fixed #3741 -- Fixed serialization of GenericRelations. Thanks for the report, 
Alexander Solovyov.


Modified: django/trunk/django/core/serializers/base.py
===================================================================
--- django/trunk/django/core/serializers/base.py        2007-03-18 19:16:47 UTC 
(rev 4751)
+++ django/trunk/django/core/serializers/base.py        2007-03-19 11:57:53 UTC 
(rev 4752)
@@ -34,17 +34,17 @@
         for obj in queryset:
             self.start_object(obj)
             for field in obj._meta.fields:
-                if field is obj._meta.pk:
-                    continue
-                elif field.rel is None:
+                if field.serialize:
+                    if field.rel is None:
+                        if self.selected_fields is None or field.attname in 
self.selected_fields:
+                            self.handle_field(obj, field)
+                    else:
+                        if self.selected_fields is None or field.attname[:-3] 
in self.selected_fields:
+                            self.handle_fk_field(obj, field)
+            for field in obj._meta.many_to_many:
+                if field.serialize:
                     if self.selected_fields is None or field.attname in 
self.selected_fields:
-                        self.handle_field(obj, field)
-                else:
-                    if self.selected_fields is None or field.attname[:-3] in 
self.selected_fields:
-                        self.handle_fk_field(obj, field)
-            for field in obj._meta.many_to_many:
-                if self.selected_fields is None or field.attname in 
self.selected_fields:
-                    self.handle_m2m_field(obj, field)
+                        self.handle_m2m_field(obj, field)
             self.end_object(obj)
         self.end_serialization()
         return self.getvalue()

Modified: django/trunk/django/db/models/fields/__init__.py
===================================================================
--- django/trunk/django/db/models/fields/__init__.py    2007-03-18 19:16:47 UTC 
(rev 4751)
+++ django/trunk/django/db/models/fields/__init__.py    2007-03-19 11:57:53 UTC 
(rev 4752)
@@ -67,7 +67,7 @@
 
     def __init__(self, verbose_name=None, name=None, primary_key=False,
         maxlength=None, unique=False, blank=False, null=False, db_index=False,
-        core=False, rel=None, default=NOT_PROVIDED, editable=True,
+        core=False, rel=None, default=NOT_PROVIDED, editable=True, 
serialize=True,
         prepopulate_from=None, unique_for_date=None, unique_for_month=None,
         unique_for_year=None, validator_list=None, choices=None, 
radio_admin=None,
         help_text='', db_column=None):
@@ -78,6 +78,7 @@
         self.blank, self.null = blank, null
         self.core, self.rel, self.default = core, rel, default
         self.editable = editable
+        self.serialize = serialize
         self.validator_list = validator_list or []
         self.prepopulate_from = prepopulate_from
         self.unique_for_date, self.unique_for_month = unique_for_date, 
unique_for_month

Modified: django/trunk/django/db/models/fields/generic.py
===================================================================
--- django/trunk/django/db/models/fields/generic.py     2007-03-18 19:16:47 UTC 
(rev 4751)
+++ django/trunk/django/db/models/fields/generic.py     2007-03-19 11:57:53 UTC 
(rev 4752)
@@ -94,6 +94,7 @@
         
         kwargs['blank'] = True
         kwargs['editable'] = False
+        kwargs['serialize'] = False
         Field.__init__(self, **kwargs)
 
     def get_manipulator_field_objs(self):

Modified: django/trunk/django/db/models/options.py
===================================================================
--- django/trunk/django/db/models/options.py    2007-03-18 19:16:47 UTC (rev 
4751)
+++ django/trunk/django/db/models/options.py    2007-03-19 11:57:53 UTC (rev 
4752)
@@ -84,6 +84,7 @@
             self.fields.insert(bisect(self.fields, field), field)
             if not self.pk and field.primary_key:
                 self.pk = field
+                field.serialize = False
 
     def __repr__(self):
         return '<Options for %s>' % self.object_name

Modified: django/trunk/tests/regressiontests/serializers_regress/models.py
===================================================================
--- django/trunk/tests/regressiontests/serializers_regress/models.py    
2007-03-18 19:16:47 UTC (rev 4751)
+++ django/trunk/tests/regressiontests/serializers_regress/models.py    
2007-03-19 11:57:53 UTC (rev 4752)
@@ -6,7 +6,8 @@
 """
 
 from django.db import models
-    
+from django.contrib.contenttypes.models import ContentType
+
 # The following classes are for testing basic data 
 # marshalling, including NULL values.
 
@@ -73,6 +74,22 @@
 class XMLData(models.Model):
     data = models.XMLField(null=True)
     
+class Tag(models.Model):
+    """A tag on an item."""
+    data = models.SlugField()
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.PositiveIntegerField()
+
+    content_object = models.GenericForeignKey()
+
+    class Meta:
+        ordering = ["data"]
+
+class GenericData(models.Model):
+    data = models.CharField(maxlength=30)
+
+    tags = models.GenericRelation(Tag)
+    
 # The following test classes are all for validation
 # of related objects; in particular, forward, backward,
 # and self references.

Modified: django/trunk/tests/regressiontests/serializers_regress/tests.py
===================================================================
--- django/trunk/tests/regressiontests/serializers_regress/tests.py     
2007-03-18 19:16:47 UTC (rev 4751)
+++ django/trunk/tests/regressiontests/serializers_regress/tests.py     
2007-03-19 11:57:53 UTC (rev 4752)
@@ -24,6 +24,14 @@
     instance.data = data
     instance.save()    
     return instance
+
+def generic_create(pk, klass, data):
+    instance = klass(id=pk)
+    instance.data = data[0]
+    instance.save()
+    for tag in data[1:]:
+        instance.tags.create(data=tag)
+    return instance
     
 def fk_create(pk, klass, data):
     instance = klass(id=pk)
@@ -56,6 +64,11 @@
     testcase.assertEqual(data, instance.data, 
                          "Objects with PK=%d not equal; expected '%s' (%s), 
got '%s' (%s)" % (pk,data, type(data), instance.data, type(instance.data)))
 
+def generic_compare(testcase, pk, klass, data):
+    instance = klass.objects.get(id=pk)
+    testcase.assertEqual(data[0], instance.data)
+    testcase.assertEqual(data[1:], [t.data for t in instance.tags.all()])
+    
 def fk_compare(testcase, pk, klass, data):
     instance = klass.objects.get(id=pk)
     testcase.assertEqual(data, instance.data_id)
@@ -76,6 +89,7 @@
 # actually a pair of functions; one to create
 # and one to compare objects of that type
 data_obj = (data_create, data_compare)
+generic_obj = (generic_create, generic_compare)
 fk_obj = (fk_create, fk_compare)
 m2m_obj = (m2m_create, m2m_compare)
 o2o_obj = (o2o_create, o2o_compare)
@@ -140,6 +154,9 @@
     (data_obj, 190, XMLData, "<foo></foo>"),
     (data_obj, 191, XMLData, None),
 
+    (generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']),
+    (generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']),
+
     (data_obj, 300, Anchor, "Anchor 1"),
     (data_obj, 301, Anchor, "Anchor 2"),
 
@@ -222,6 +239,9 @@
     transaction.commit()
     transaction.leave_transaction_management()
 
+    # Add the generic tagged objects to the object list 
+    objects.extend(Tag.objects.all())
+    
     # Serialize the test database
     serialized_data = serializers.serialize(format, objects, indent=2)
 


--~--~---------~--~----~------------~-------~--~----~
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