From 0dd4ec654f4b22854df841d9ea8f463fdbdf99c3 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Fri, 27 Feb 2009 04:57:33 +0000 Subject: [PATCH] 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. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9908 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/sites/models.py | 10 ++++++++-- django/contrib/sites/tests.py | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/django/contrib/sites/models.py b/django/contrib/sites/models.py index c8b395e36b..9b1697e251 100644 --- a/django/contrib/sites/models.py +++ b/django/contrib/sites/models.py @@ -41,12 +41,18 @@ class Site(models.Model): 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 diff --git a/django/contrib/sites/tests.py b/django/contrib/sites/tests.py index b607f021d5..e3fa81b9d1 100644 --- a/django/contrib/sites/tests.py +++ b/django/contrib/sites/tests.py @@ -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 @@ True 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" """