diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-02-27 05:00:38 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2009-02-27 05:00:38 +0000 |
| commit | 424d158b01a1aeb4cb2104f93a4aa4789882a192 (patch) | |
| tree | a1e40f05917ae1bdfc8475581ffd343cb0c87f78 | |
| parent | f799959008b95f0e770ab35096de5b86659a962d (diff) | |
[1.0.X] 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.
Backport of r9908 from trunk.
git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9909 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/contrib/sites/models.py | 10 | ||||
| -rw-r--r-- | 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" """ |
