# Bazaar revision bundle v0.9
#
# message:
#   update select_related tests with proper counts; basically heavy reduction of # of queries required via instance caching tricks in foreign key backref instances
# committer: Brian Harring <ferringb@gmail.com>
# date: Sun 2007-05-27 10:21:20.177999973 -0700

=== modified file django/core/serializers/python.py // last-changed:ferringb@gm
... ail.com-20070525002257-juow7h2cfizoox5u
--- django/core/serializers/python.py
+++ django/core/serializers/python.py
@@ -89,6 +89,7 @@
             else:
                 data[field.name] = field.to_python(field_value)
                 
+        data["disable_inst_caching"] = True
         yield base.DeserializedObject(Model(**data), m2m_data)
 
 def _get_model(model_identifier):

=== modified file django/core/serializers/xml_serializer.py // last-changed:fer
... ringb@gmail.com-20070525001853-wnodu5zd8vdcda59
--- django/core/serializers/xml_serializer.py
+++ django/core/serializers/xml_serializer.py
@@ -170,6 +170,7 @@
                     value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
                 data[field.name] = value
         
+        data["disable_inst_caching"] = True
         # Return a DeserializedObject so that the m2m data has a place to live.
         return base.DeserializedObject(Model(**data), m2m_data)
         
@@ -226,4 +227,4 @@
             inner_text.extend(getInnerText(child))
         else:
            pass
-    return "".join(inner_text)
\ No newline at end of file
+    return "".join(inner_text)

=== modified file django/db/models/base.py // last-changed:ferringb@gmail.com-2
... 0070525001853-wnodu5zd8vdcda59
--- django/db/models/base.py
+++ django/db/models/base.py
@@ -14,6 +14,7 @@
 from django.utils.functional import curry
 from django.conf import settings
 from itertools import izip
+from weakref import WeakValueDictionary
 import types
 import sys
 import os
@@ -76,6 +77,21 @@
         # registered version.
         return get_model(new_class._meta.app_label, name, False)
 
+    def __call__(cls, *args, **kwargs):
+        if not kwargs.pop("disable_inst_caching", False) and cls._meta.has_auto_field:
+            key = cls._get_cache_key(args, kwargs)
+            if key is not None:
+                obj = cls.__instance_cache__.get(key)
+                if obj is None:
+                    obj = super(ModelBase, cls).__call__(*args, **kwargs)
+                    cls.__instance_cache__[key] = obj
+            else:
+                obj = super(ModelBase, cls).__call__(*args, **kwargs)
+        else:
+            obj = super(ModelBase, cls).__call__(*args, **kwargs)
+        return obj
+
+
 class Model(object):
     __metaclass__ = ModelBase
 
@@ -94,6 +110,23 @@
     def __ne__(self, other):
         return not self.__eq__(other)
 
+    def _get_cache_key(cls, args, kwargs):
+        # this should be calculated *once*, but isn't atm
+        pk_position = cls._meta.fields.index(cls._meta.pk)
+        if len(args) > pk_position:
+            return args[pk_position]
+        pk = cls._meta.pk
+        if pk.name in kwargs:
+            return kwargs[pk.name]
+        elif pk.attname in kwargs:
+            return kwargs[pk.attname]
+        return None
+    _get_cache_key = classmethod(_get_cache_key)
+
+    def get_cached_instance(cls, id):
+        return cls.__instance_cache__.get(id)
+    get_cached_instance = classmethod(get_cached_instance)
+
     def __init__(self, *args, **kwargs):
         dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs)
         
@@ -194,6 +227,8 @@
         if hasattr(cls, 'get_absolute_url'):
             cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url)
 
+        cls.__instance_cache__ = WeakValueDictionary()
+
         dispatcher.send(signal=signals.class_prepared, sender=cls)
 
     _prepare = classmethod(_prepare)
@@ -251,6 +286,10 @@
                 setattr(self, self._meta.pk.attname, backend.get_last_insert_id(cursor, self._meta.db_table, self._meta.pk.column))
         transaction.commit_unless_managed()
 
+        # if we're a new instance that hasn't been written in; save ourself.
+        if self._meta.has_auto_field:
+            self.__instance_cache__[getattr(self, self._meta.pk.attname)] = self
+
         # Run any post-save hooks.
         dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self)
 

=== modified file django/db/models/fields/related.py // last-changed:ferringb@g
... mail.com-20070524150447-bxe88y4c8ixjsqqa
--- django/db/models/fields/related.py
+++ django/db/models/fields/related.py
@@ -163,12 +163,14 @@
                 if self.field.null:
                     return None
                 raise self.field.rel.to.DoesNotExist
-            other_field = self.field.rel.get_related_field()
-            if other_field.rel:
-                params = {'%s__pk' % self.field.rel.field_name: val}
-            else:
-                params = {'%s__exact' % self.field.rel.field_name: val}
-            rel_obj = self.field.rel.to._default_manager.get(**params)
+            rel_obj = self.field.rel.to.get_cached_instance(val)
+            if rel_obj is None:
+                other_field = self.field.rel.get_related_field()
+                if other_field.rel:
+                    params = {'%s__pk' % self.field.rel.field_name: val}
+                else:
+                    params = {'%s__exact' % self.field.rel.field_name: val}
+                rel_obj = self.field.rel.to._default_manager.get(**params)
             setattr(instance, cache_name, rel_obj)
             return rel_obj
 

=== modified file tests/modeltests/model_forms/models.py // last-changed:ferrin
... gb@gmail.com-20070525002908-88uk1p54t5xwec3w
--- tests/modeltests/model_forms/models.py
+++ tests/modeltests/model_forms/models.py
@@ -244,7 +244,7 @@
 1
 >>> test_art = Article.objects.get(id=1)
 >>> test_art.headline
-'Test headline'
+u'Test headline'
 
 You can create a form over a subset of the available fields 
 by specifying a 'fields' argument to form_for_instance. 
@@ -260,7 +260,7 @@
 1
 >>> new_art = Article.objects.get(id=1)
 >>> new_art.headline
-'New headline'
+u'New headline'
 
 Add some categories and test the many-to-many form output.
 >>> new_art.categories.all()

=== modified file tests/modeltests/select_related/models.py
--- tests/modeltests/select_related/models.py
+++ tests/modeltests/select_related/models.py
@@ -107,13 +107,13 @@
 1
 
 # select_related() also of course applies to entire lists, not just items.
-# Without select_related()
+# Without select_related() (note instance caching still reduces this from 9 to 5)
 >>> db.reset_queries()
 >>> world = Species.objects.all()
 >>> [o.genus.family for o in world]
 [<Family: Drosophilidae>, <Family: Hominidae>, <Family: Fabaceae>, <Family: Amanitacae>]
 >>> len(db.connection.queries)
-9
+5
 
 # With select_related():
 >>> db.reset_queries()
@@ -129,23 +129,23 @@
 >>> pea.genus.family.order.klass.phylum.kingdom.domain
 <Domain: Eukaryota>
 
-# Notice: one few query than above because of depth=1
+# notice: instance caching saves the day; would be 7 without.
 >>> len(db.connection.queries)
-7
+1
 
 >>> db.reset_queries()
 >>> pea = Species.objects.select_related(depth=5).get(name="sativum")
 >>> pea.genus.family.order.klass.phylum.kingdom.domain
 <Domain: Eukaryota>
 >>> len(db.connection.queries)
-3
+1
 
 >>> db.reset_queries()
 >>> world = Species.objects.all().select_related(depth=2)
 >>> [o.genus.family.order for o in world]
 [<Order: Diptera>, <Order: Primates>, <Order: Fabales>, <Order: Agaricales>]
 >>> len(db.connection.queries)
-5
+1
 
 # Reset DEBUG to where we found it.
 >>> settings.DEBUG = False

=== modified directory  // last-changed:ferringb@gmail.com-20070527172120-v7ioq
... dhbiseuxl10
# revision id: ferringb@gmail.com-20070527172120-v7ioqdhbiseuxl10
# sha1: 847aed7b9d435ed66bc244db2108cdaa0dfec925
# inventory sha1: cca6c30feafe35c265943a7c9e047cdb641fbee1
# parent ids:
#   ferringb@gmail.com-20070525002908-88uk1p54t5xwec3w
# base id: ferringb@gmail.com-20070524145714-gag3v8kjbkxjdwso
# properties:
#   branch-nick: django

# message:
#   tweak the tests; previously relied on the value being basically reformatted by the backend; via caching, that may not occur- for these specific objs, the ref is known to be held, thus we force unicode.  this however indicates a basic flaw with Models.__init__; should reformat args as needed, instead of relying on the db doing so (for the instances allocated, if the specific fields were tested they would fail similarly since unicode -> str isn't forced)
# committer: Brian Harring <ferringb@gmail.com>
# date: Thu 2007-05-24 17:29:08.392999887 -0700

=== modified file tests/modeltests/model_forms/models.py // encoding:base64
LS0tIHRlc3RzL21vZGVsdGVzdHMvbW9kZWxfZm9ybXMvbW9kZWxzLnB5CisrKyB0ZXN0cy9tb2Rl
bHRlc3RzL21vZGVsX2Zvcm1zL21vZGVscy5weQpAQCAtMjQ0LDcgKzI0NCw3IEBACiAxCiA+Pj4g
dGVzdF9hcnQgPSBBcnRpY2xlLm9iamVjdHMuZ2V0KGlkPTEpCiA+Pj4gdGVzdF9hcnQuaGVhZGxp
bmUKLSdUZXN0IGhlYWRsaW5lJwordSdUZXN0IGhlYWRsaW5lJwogCiBZb3UgY2FuIGNyZWF0ZSBh
IGZvcm0gb3ZlciBhIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIGZpZWxkcyAKIGJ5IHNwZWNpZnlp
bmcgYSAnZmllbGRzJyBhcmd1bWVudCB0byBmb3JtX2Zvcl9pbnN0YW5jZS4gCkBAIC0yNjAsNyAr
MjYwLDcgQEAKIDEKID4+PiBuZXdfYXJ0ID0gQXJ0aWNsZS5vYmplY3RzLmdldChpZD0xKQogPj4+
IG5ld19hcnQuaGVhZGxpbmUKLSdOZXcgaGVhZGxpbmUnCit1J05ldyBoZWFkbGluZScKIAogQWRk
IHNvbWUgY2F0ZWdvcmllcyBhbmQgdGVzdCB0aGUgbWFueS10by1tYW55IGZvcm0gb3V0cHV0Lgog
Pj4+IG5ld19hcnQuY2F0ZWdvcmllcy5hbGwoKQoK

=== modified directory  // last-changed:ferringb@gmail.com-20070525002908-88uk1
... p54t5xwec3w
# revision id: ferringb@gmail.com-20070525002908-88uk1p54t5xwec3w
# sha1: 903673454233e00a1ba5fee5811ae48af850cd75
# inventory sha1: 9550bd25cd4fe06144eef15b580d25b23ec1868b
# parent ids:
#   ferringb@gmail.com-20070525002257-juow7h2cfizoox5u
# properties:
#   branch-nick: django

# message:
#   update the default python deserializer to force instance caching off for returned objs
# committer: Brian Harring <ferringb@gmail.com>
# date: Thu 2007-05-24 17:22:57.193000078 -0700

=== modified file django/core/serializers/python.py // encoding:base64
LS0tIGRqYW5nby9jb3JlL3NlcmlhbGl6ZXJzL3B5dGhvbi5weQorKysgZGphbmdvL2NvcmUvc2Vy
aWFsaXplcnMvcHl0aG9uLnB5CkBAIC04OSw2ICs4OSw3IEBACiAgICAgICAgICAgICBlbHNlOgog
ICAgICAgICAgICAgICAgIGRhdGFbZmllbGQubmFtZV0gPSBmaWVsZC50b19weXRob24oZmllbGRf
dmFsdWUpCiAgICAgICAgICAgICAgICAgCisgICAgICAgIGRhdGFbImRpc2FibGVfaW5zdF9jYWNo
aW5nIl0gPSBUcnVlCiAgICAgICAgIHlpZWxkIGJhc2UuRGVzZXJpYWxpemVkT2JqZWN0KE1vZGVs
KCoqZGF0YSksIG0ybV9kYXRhKQogCiBkZWYgX2dldF9tb2RlbChtb2RlbF9pZGVudGlmaWVyKToK
Cg==

=== modified directory  // last-changed:ferringb@gmail.com-20070525002257-juow7
... h2cfizoox5u
# revision id: ferringb@gmail.com-20070525002257-juow7h2cfizoox5u
# sha1: 3974ba95f27f7f4417b8d80915868843f9510c46
# inventory sha1: b52e0b76a4bef6bb79ca920b2b014d5d6b58ba74
# parent ids:
#   ferringb@gmail.com-20070525001853-wnodu5zd8vdcda59
# properties:
#   branch-nick: django

# message:
#   add disable_inst_caching kwarg for Models; basically disables instance reuse for this request- needed for deserialization, both to get a unique obj and to prevent it from being cached till it's actually restored.
#   change save so that that most recent save forces the weakref cache to return that obj from that point on; update xml deserializer to force disable_inst_caching=True
#   
# committer: Brian Harring <ferringb@gmail.com>
# date: Thu 2007-05-24 17:18:53.398999929 -0700

=== modified file django/core/serializers/xml_serializer.py // encoding:base64
LS0tIGRqYW5nby9jb3JlL3NlcmlhbGl6ZXJzL3htbF9zZXJpYWxpemVyLnB5CisrKyBkamFuZ28v
Y29yZS9zZXJpYWxpemVycy94bWxfc2VyaWFsaXplci5weQpAQCAtMTcwLDYgKzE3MCw3IEBACiAg
ICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmllbGQudG9fcHl0aG9uKGdldElubmVyVGV4dChm
aWVsZF9ub2RlKS5zdHJpcCgpLmVuY29kZShzZWxmLmVuY29kaW5nKSkKICAgICAgICAgICAgICAg
ICBkYXRhW2ZpZWxkLm5hbWVdID0gdmFsdWUKICAgICAgICAgCisgICAgICAgIGRhdGFbImRpc2Fi
bGVfaW5zdF9jYWNoaW5nIl0gPSBUcnVlCiAgICAgICAgICMgUmV0dXJuIGEgRGVzZXJpYWxpemVk
T2JqZWN0IHNvIHRoYXQgdGhlIG0ybSBkYXRhIGhhcyBhIHBsYWNlIHRvIGxpdmUuCiAgICAgICAg
IHJldHVybiBiYXNlLkRlc2VyaWFsaXplZE9iamVjdChNb2RlbCgqKmRhdGEpLCBtMm1fZGF0YSkK
ICAgICAgICAgCkBAIC0yMjYsNCArMjI3LDQgQEAKICAgICAgICAgICAgIGlubmVyX3RleHQuZXh0
ZW5kKGdldElubmVyVGV4dChjaGlsZCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhc3MK
LSAgICByZXR1cm4gIiIuam9pbihpbm5lcl90ZXh0KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZp
bGUKKyAgICByZXR1cm4gIiIuam9pbihpbm5lcl90ZXh0KQoK

=== modified file django/db/models/base.py // encoding:base64
LS0tIGRqYW5nby9kYi9tb2RlbHMvYmFzZS5weQorKysgZGphbmdvL2RiL21vZGVscy9iYXNlLnB5
CkBAIC03OCw3ICs3OCw3IEBACiAgICAgICAgIHJldHVybiBnZXRfbW9kZWwobmV3X2NsYXNzLl9t
ZXRhLmFwcF9sYWJlbCwgbmFtZSwgRmFsc2UpCiAKICAgICBkZWYgX19jYWxsX18oY2xzLCAqYXJn
cywgKiprd2FyZ3MpOgotICAgICAgICBpZiBjbHMuX21ldGEuaGFzX2F1dG9fZmllbGQ6CisgICAg
ICAgIGlmIG5vdCBrd2FyZ3MucG9wKCJkaXNhYmxlX2luc3RfY2FjaGluZyIsIEZhbHNlKSBhbmQg
Y2xzLl9tZXRhLmhhc19hdXRvX2ZpZWxkOgogICAgICAgICAgICAga2V5ID0gY2xzLl9nZXRfY2Fj
aGVfa2V5KGFyZ3MsIGt3YXJncykKICAgICAgICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKICAg
ICAgICAgICAgICAgICBvYmogPSBjbHMuX19pbnN0YW5jZV9jYWNoZV9fLmdldChrZXkpCkBAIC0y
ODgsNyArMjg4LDcgQEAKIAogICAgICAgICAjIGlmIHdlJ3JlIGEgbmV3IGluc3RhbmNlIHRoYXQg
aGFzbid0IGJlZW4gd3JpdHRlbiBpbjsgc2F2ZSBvdXJzZWxmLgogICAgICAgICBpZiBzZWxmLl9t
ZXRhLmhhc19hdXRvX2ZpZWxkOgotICAgICAgICAgICAgc2VsZi5fX2luc3RhbmNlX2NhY2hlX18u
c2V0ZGVmYXVsdChnZXRhdHRyKHNlbGYsIHNlbGYuX21ldGEucGsuYXR0bmFtZSksIHNlbGYpCisg
ICAgICAgICAgICBzZWxmLl9faW5zdGFuY2VfY2FjaGVfX1tnZXRhdHRyKHNlbGYsIHNlbGYuX21l
dGEucGsuYXR0bmFtZSldID0gc2VsZgogCiAgICAgICAgICMgUnVuIGFueSBwb3N0LXNhdmUgaG9v
a3MuCiAgICAgICAgIGRpc3BhdGNoZXIuc2VuZChzaWduYWw9c2lnbmFscy5wb3N0X3NhdmUsIHNl
bmRlcj1zZWxmLl9fY2xhc3NfXywgaW5zdGFuY2U9c2VsZikKCg==

=== modified directory  // last-changed:ferringb@gmail.com-20070525001853-wnodu
... 5zd8vdcda59
# revision id: ferringb@gmail.com-20070525001853-wnodu5zd8vdcda59
# sha1: 55840e78e71118722d1d9e4054cd04154c0f08fa
# inventory sha1: 18e2c05f91fc4895b2241b97369a966dc89c2fb4
# parent ids:
#   ferringb@gmail.com-20070524223513-b477j0iz9h8cygsr
# properties:
#   branch-nick: django

# message:
#   correct typo from ticket17 patch; setdefault must be self, not None
# committer: Brian Harring <ferringb@gmail.com>
# date: Thu 2007-05-24 15:35:13.825000048 -0700

=== modified file django/db/models/base.py // encoding:base64
LS0tIGRqYW5nby9kYi9tb2RlbHMvYmFzZS5weQorKysgZGphbmdvL2RiL21vZGVscy9iYXNlLnB5
CkBAIC0yODgsNyArMjg4LDcgQEAKIAogICAgICAgICAjIGlmIHdlJ3JlIGEgbmV3IGluc3RhbmNl
IHRoYXQgaGFzbid0IGJlZW4gd3JpdHRlbiBpbjsgc2F2ZSBvdXJzZWxmLgogICAgICAgICBpZiBz
ZWxmLl9tZXRhLmhhc19hdXRvX2ZpZWxkOgotICAgICAgICAgICAgc2VsZi5fX2luc3RhbmNlX2Nh
Y2hlX18uc2V0ZGVmYXVsdChnZXRhdHRyKHNlbGYsIHNlbGYuX21ldGEucGsuYXR0bmFtZSwgc2Vs
ZikpCisgICAgICAgICAgICBzZWxmLl9faW5zdGFuY2VfY2FjaGVfXy5zZXRkZWZhdWx0KGdldGF0
dHIoc2VsZiwgc2VsZi5fbWV0YS5way5hdHRuYW1lKSwgc2VsZikKIAogICAgICAgICAjIFJ1biBh
bnkgcG9zdC1zYXZlIGhvb2tzLgogICAgICAgICBkaXNwYXRjaGVyLnNlbmQoc2lnbmFsPXNpZ25h
bHMucG9zdF9zYXZlLCBzZW5kZXI9c2VsZi5fX2NsYXNzX18sIGluc3RhbmNlPXNlbGYpCgo=

=== modified directory  // last-changed:ferringb@gmail.com-20070524223513-b477j
... 0iz9h8cygsr
# revision id: ferringb@gmail.com-20070524223513-b477j0iz9h8cygsr
# sha1: 76b0bc9809a0d05178d1c3c53f779937bdfd486a
# inventory sha1: 3b424c78c8d2061a625031453ea8c3843968c10a
# parent ids:
#   ferringb@gmail.com-20070524150447-bxe88y4c8ixjsqqa
# properties:
#   branch-nick: django

# message:
#   pull in the modified caching patch of my original from ticket 17
# committer: Brian Harring <ferringb@gmail.com>
# date: Thu 2007-05-24 08:04:47.371000051 -0700

=== modified file django/db/models/base.py // encoding:base64
LS0tIGRqYW5nby9kYi9tb2RlbHMvYmFzZS5weQorKysgZGphbmdvL2RiL21vZGVscy9iYXNlLnB5
CkBAIC0xNCw2ICsxNCw3IEBACiBmcm9tIGRqYW5nby51dGlscy5mdW5jdGlvbmFsIGltcG9ydCBj
dXJyeQogZnJvbSBkamFuZ28uY29uZiBpbXBvcnQgc2V0dGluZ3MKIGZyb20gaXRlcnRvb2xzIGlt
cG9ydCBpemlwCitmcm9tIHdlYWtyZWYgaW1wb3J0IFdlYWtWYWx1ZURpY3Rpb25hcnkKIGltcG9y
dCB0eXBlcwogaW1wb3J0IHN5cwogaW1wb3J0IG9zCkBAIC03Niw2ICs3NywyMSBAQAogICAgICAg
ICAjIHJlZ2lzdGVyZWQgdmVyc2lvbi4KICAgICAgICAgcmV0dXJuIGdldF9tb2RlbChuZXdfY2xh
c3MuX21ldGEuYXBwX2xhYmVsLCBuYW1lLCBGYWxzZSkKIAorICAgIGRlZiBfX2NhbGxfXyhjbHMs
ICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGNscy5fbWV0YS5oYXNfYXV0b19maWVsZDoK
KyAgICAgICAgICAgIGtleSA9IGNscy5fZ2V0X2NhY2hlX2tleShhcmdzLCBrd2FyZ3MpCisgICAg
ICAgICAgICBpZiBrZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgb2JqID0gY2xzLl9f
aW5zdGFuY2VfY2FjaGVfXy5nZXQoa2V5KQorICAgICAgICAgICAgICAgIGlmIG9iaiBpcyBOb25l
OgorICAgICAgICAgICAgICAgICAgICBvYmogPSBzdXBlcihNb2RlbEJhc2UsIGNscykuX19jYWxs
X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgICBjbHMuX19pbnN0YW5jZV9j
YWNoZV9fW2tleV0gPSBvYmoKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2Jq
ID0gc3VwZXIoTW9kZWxCYXNlLCBjbHMpLl9fY2FsbF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAg
ICAgZWxzZToKKyAgICAgICAgICAgIG9iaiA9IHN1cGVyKE1vZGVsQmFzZSwgY2xzKS5fX2NhbGxf
XygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBvYmoKKworCiBjbGFzcyBNb2RlbChv
YmplY3QpOgogICAgIF9fbWV0YWNsYXNzX18gPSBNb2RlbEJhc2UKIApAQCAtOTQsNiArMTEwLDIz
IEBACiAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHJldHVybiBub3Qgc2Vs
Zi5fX2VxX18ob3RoZXIpCiAKKyAgICBkZWYgX2dldF9jYWNoZV9rZXkoY2xzLCBhcmdzLCBrd2Fy
Z3MpOgorICAgICAgICAjIHRoaXMgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgKm9uY2UqLCBidXQgaXNu
J3QgYXRtCisgICAgICAgIHBrX3Bvc2l0aW9uID0gY2xzLl9tZXRhLmZpZWxkcy5pbmRleChjbHMu
X21ldGEucGspCisgICAgICAgIGlmIGxlbihhcmdzKSA+IHBrX3Bvc2l0aW9uOgorICAgICAgICAg
ICAgcmV0dXJuIGFyZ3NbcGtfcG9zaXRpb25dCisgICAgICAgIHBrID0gY2xzLl9tZXRhLnBrCisg
ICAgICAgIGlmIHBrLm5hbWUgaW4ga3dhcmdzOgorICAgICAgICAgICAgcmV0dXJuIGt3YXJnc1tw
ay5uYW1lXQorICAgICAgICBlbGlmIHBrLmF0dG5hbWUgaW4ga3dhcmdzOgorICAgICAgICAgICAg
cmV0dXJuIGt3YXJnc1tway5hdHRuYW1lXQorICAgICAgICByZXR1cm4gTm9uZQorICAgIF9nZXRf
Y2FjaGVfa2V5ID0gY2xhc3NtZXRob2QoX2dldF9jYWNoZV9rZXkpCisKKyAgICBkZWYgZ2V0X2Nh
Y2hlZF9pbnN0YW5jZShjbHMsIGlkKToKKyAgICAgICAgcmV0dXJuIGNscy5fX2luc3RhbmNlX2Nh
Y2hlX18uZ2V0KGlkKQorICAgIGdldF9jYWNoZWRfaW5zdGFuY2UgPSBjbGFzc21ldGhvZChnZXRf
Y2FjaGVkX2luc3RhbmNlKQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJn
cyk6CiAgICAgICAgIGRpc3BhdGNoZXIuc2VuZChzaWduYWw9c2lnbmFscy5wcmVfaW5pdCwgc2Vu
ZGVyPXNlbGYuX19jbGFzc19fLCBhcmdzPWFyZ3MsIGt3YXJncz1rd2FyZ3MpCiAgICAgICAgIApA
QCAtMTk0LDYgKzIyNyw4IEBACiAgICAgICAgIGlmIGhhc2F0dHIoY2xzLCAnZ2V0X2Fic29sdXRl
X3VybCcpOgogICAgICAgICAgICAgY2xzLmdldF9hYnNvbHV0ZV91cmwgPSBjdXJyeShnZXRfYWJz
b2x1dGVfdXJsLCBvcHRzLCBjbHMuZ2V0X2Fic29sdXRlX3VybCkKIAorICAgICAgICBjbHMuX19p
bnN0YW5jZV9jYWNoZV9fID0gV2Vha1ZhbHVlRGljdGlvbmFyeSgpCisKICAgICAgICAgZGlzcGF0
Y2hlci5zZW5kKHNpZ25hbD1zaWduYWxzLmNsYXNzX3ByZXBhcmVkLCBzZW5kZXI9Y2xzKQogCiAg
ICAgX3ByZXBhcmUgPSBjbGFzc21ldGhvZChfcHJlcGFyZSkKQEAgLTI1MSw2ICsyODYsMTAgQEAK
ICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIHNlbGYuX21ldGEucGsuYXR0bmFtZSwgYmFj
a2VuZC5nZXRfbGFzdF9pbnNlcnRfaWQoY3Vyc29yLCBzZWxmLl9tZXRhLmRiX3RhYmxlLCBzZWxm
Ll9tZXRhLnBrLmNvbHVtbikpCiAgICAgICAgIHRyYW5zYWN0aW9uLmNvbW1pdF91bmxlc3NfbWFu
YWdlZCgpCiAKKyAgICAgICAgIyBpZiB3ZSdyZSBhIG5ldyBpbnN0YW5jZSB0aGF0IGhhc24ndCBi
ZWVuIHdyaXR0ZW4gaW47IHNhdmUgb3Vyc2VsZi4KKyAgICAgICAgaWYgc2VsZi5fbWV0YS5oYXNf
YXV0b19maWVsZDoKKyAgICAgICAgICAgIHNlbGYuX19pbnN0YW5jZV9jYWNoZV9fLnNldGRlZmF1
bHQoZ2V0YXR0cihzZWxmLCBzZWxmLl9tZXRhLnBrLmF0dG5hbWUsIHNlbGYpKQorCiAgICAgICAg
ICMgUnVuIGFueSBwb3N0LXNhdmUgaG9va3MuCiAgICAgICAgIGRpc3BhdGNoZXIuc2VuZChzaWdu
YWw9c2lnbmFscy5wb3N0X3NhdmUsIHNlbmRlcj1zZWxmLl9fY2xhc3NfXywgaW5zdGFuY2U9c2Vs
ZikKIAoK

=== modified file django/db/models/fields/related.py // encoding:base64
LS0tIGRqYW5nby9kYi9tb2RlbHMvZmllbGRzL3JlbGF0ZWQucHkKKysrIGRqYW5nby9kYi9tb2Rl
bHMvZmllbGRzL3JlbGF0ZWQucHkKQEAgLTE2MywxMiArMTYzLDE0IEBACiAgICAgICAgICAgICAg
ICAgaWYgc2VsZi5maWVsZC5udWxsOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQog
ICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuZmllbGQucmVsLnRvLkRvZXNOb3RFeGlzdAotICAg
ICAgICAgICAgb3RoZXJfZmllbGQgPSBzZWxmLmZpZWxkLnJlbC5nZXRfcmVsYXRlZF9maWVsZCgp
Ci0gICAgICAgICAgICBpZiBvdGhlcl9maWVsZC5yZWw6Ci0gICAgICAgICAgICAgICAgcGFyYW1z
ID0geyclc19fcGsnICUgc2VsZi5maWVsZC5yZWwuZmllbGRfbmFtZTogdmFsfQotICAgICAgICAg
ICAgZWxzZToKLSAgICAgICAgICAgICAgICBwYXJhbXMgPSB7JyVzX19leGFjdCcgJSBzZWxmLmZp
ZWxkLnJlbC5maWVsZF9uYW1lOiB2YWx9Ci0gICAgICAgICAgICByZWxfb2JqID0gc2VsZi5maWVs
ZC5yZWwudG8uX2RlZmF1bHRfbWFuYWdlci5nZXQoKipwYXJhbXMpCisgICAgICAgICAgICByZWxf
b2JqID0gc2VsZi5maWVsZC5yZWwudG8uZ2V0X2NhY2hlZF9pbnN0YW5jZSh2YWwpCisgICAgICAg
ICAgICBpZiByZWxfb2JqIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgb3RoZXJfZmllbGQgPSBz
ZWxmLmZpZWxkLnJlbC5nZXRfcmVsYXRlZF9maWVsZCgpCisgICAgICAgICAgICAgICAgaWYgb3Ro
ZXJfZmllbGQucmVsOgorICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSB7JyVzX19waycgJSBz
ZWxmLmZpZWxkLnJlbC5maWVsZF9uYW1lOiB2YWx9CisgICAgICAgICAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgICAgICAgICAgcGFyYW1zID0geyclc19fZXhhY3QnICUgc2VsZi5maWVsZC5yZWwu
ZmllbGRfbmFtZTogdmFsfQorICAgICAgICAgICAgICAgIHJlbF9vYmogPSBzZWxmLmZpZWxkLnJl
bC50by5fZGVmYXVsdF9tYW5hZ2VyLmdldCgqKnBhcmFtcykKICAgICAgICAgICAgIHNldGF0dHIo
aW5zdGFuY2UsIGNhY2hlX25hbWUsIHJlbF9vYmopCiAgICAgICAgICAgICByZXR1cm4gcmVsX29i
agogCgo=

=== modified directory  // last-changed:ferringb@gmail.com-20070524150447-bxe88
... y4c8ixjsqqa
# revision id: ferringb@gmail.com-20070524150447-bxe88y4c8ixjsqqa
# sha1: 3b7b0d3feca0a7ce0be6f8afca0d712926500417
# inventory sha1: d165199d7177926c717d5304ad4adc4bb6fef7e1
# parent ids:
#   ferringb@gmail.com-20070524145714-gag3v8kjbkxjdwso
# properties:
#   branch-nick: django

