Skip to content

Commit

Permalink
[1.0.X] Invalidate the appropriate SITE_CACHE entry when saving a Sit…
Browse files Browse the repository at this point in the history
…e 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
  • Loading branch information
malcolmt committed Feb 27, 2009
1 parent f799959 commit 424d158
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 3 deletions.
10 changes: 8 additions & 2 deletions django/contrib/sites/models.py
Expand Up @@ -41,12 +41,18 @@ class Meta:

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

Expand Down
15 changes: 14 additions & 1 deletion django/contrib/sites/tests.py
Expand Up @@ -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
Expand All @@ -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"
"""

0 comments on commit 424d158

Please sign in to comment.