Author: mtredinnick
Date: 2009-02-26 22:57:33 -0600 (Thu, 26 Feb 2009)
New Revision: 9908

Modified:
   django/trunk/django/contrib/sites/models.py
   django/trunk/django/contrib/sites/tests.py
Log:
Invalidate the appropriate SITE_CACHE entry when saving a Site model.

This avoids the problem of, for example, saving a change to the Site model in
the admin interface and then seeing the wrong instanec returned in the next
call to get_current_site().

It's still possible to end up with an inconsistent cache if update() is used to
change the Site model, but that's pretty unavoidable. It's also a slightly odd
way to update a Site model, so if you really need to do that, you can manage to
call SiteManager.clear() at the same time.

Modified: django/trunk/django/contrib/sites/models.py
===================================================================
--- django/trunk/django/contrib/sites/models.py 2009-02-26 17:18:16 UTC (rev 
9907)
+++ django/trunk/django/contrib/sites/models.py 2009-02-27 04:57:33 UTC (rev 
9908)
@@ -41,12 +41,18 @@
 
     def __unicode__(self):
         return self.domain
-    
+
+    def save(self, *args, **kwargs):
+        super(Site, self).save(*args, **kwargs)
+        # Cached information will likely be incorrect now.
+        if self.id in SITE_CACHE:
+            del SITE_CACHE[self.id]
+
     def delete(self):
         pk = self.pk
         super(Site, self).delete()
         try:
-            del(SITE_CACHE[pk])
+            del SITE_CACHE[pk]
         except KeyError:
             pass
 

Modified: django/trunk/django/contrib/sites/tests.py
===================================================================
--- django/trunk/django/contrib/sites/tests.py  2009-02-26 17:18:16 UTC (rev 
9907)
+++ django/trunk/django/contrib/sites/tests.py  2009-02-27 04:57:33 UTC (rev 
9908)
@@ -3,7 +3,7 @@
 >>> from django.conf import settings
 >>> Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
 
->>> # Make sure that get_current() does not return a deleted Site object.
+# Make sure that get_current() does not return a deleted Site object.
 >>> s = Site.objects.get_current()
 >>> isinstance(s, Site)
 True
@@ -13,4 +13,17 @@
 Traceback (most recent call last):
 ...
 DoesNotExist: Site matching query does not exist.
+
+# After updating a Site object (e.g. via the admin), we shouldn't return a
+# bogus value from the SITE_CACHE.
+>>> _ = Site.objects.create(id=settings.SITE_ID, domain="example.com", 
name="example.com")
+>>> site = Site.objects.get_current()
+>>> site.name
+u"example.com"
+>>> s2 = Site.objects.get(id=settings.SITE_ID)
+>>> s2.name = "Example site"
+>>> s2.save()
+>>> site = Site.objects.get_current()
+>>> site.name
+u"Example site"
 """


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