When changing template-site assignments, invalidate cached templates that belonged to sites that got unassigned

This commit is contained in:
Alex Cucu 2012-10-08 11:39:23 +03:00
parent f22ca2c7e0
commit e559006f05
2 changed files with 33 additions and 6 deletions

View file

@ -8,7 +8,8 @@ from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager
from dbtemplates.conf import settings
from dbtemplates.utils.cache import add_template_to_cache, remove_cached_template
from dbtemplates.utils.cache import (add_template_to_cache, remove_cached_template,
invalidate_cache_for_sites)
from dbtemplates.utils.template import get_template_source
try:
@ -84,3 +85,5 @@ def add_default_site(instance, **kwargs):
signals.post_save.connect(add_default_site, sender=Template)
signals.post_save.connect(add_template_to_cache, sender=Template)
signals.pre_delete.connect(remove_cached_template, sender=Template)
signals.m2m_changed.connect(invalidate_cache_for_sites,
sender=Template.sites.through)

View file

@ -12,13 +12,14 @@ def get_cache_backend():
cache = get_cache_backend()
def get_cache_key(name):
current_site = Site.objects.get_current()
return 'dbtemplates::%s::%s' % (slugify(name), current_site.pk)
def get_cache_key(name, site_pk=None):
if site_pk is None:
site_pk = Site.objects.get_current().pk
return 'dbtemplates::%s::%s' % (slugify(name), site_pk)
def get_cache_notfound_key(name):
return get_cache_key(name) + '::notfound'
def get_cache_notfound_key(name, site_pk=None):
return get_cache_key(name, site_pk) + '::notfound'
def remove_notfound_key(instance):
@ -43,6 +44,29 @@ def add_template_to_cache(instance, **kwargs):
cache.set(get_cache_key(instance.name), instance.content)
def invalidate_cache_for_sites(sender, instance, action, reverse,
model, pk_set, **kwargs):
if action != 'post_add':
return
if isinstance(instance, Site):
# model is dbtemplates.models.Template
site = instance
for template in model.objects.all():
if template.pk in pk_set:
cache.delete(get_cache_notfound_key(template.name, site.pk))
else:
cache.delete(get_cache_key(template.name, site.pk))
else:
# instance is of type dbtempaltes.models.Template
# model is django.contrib.sites.models.Site
template = instance
for site in model.objects.all():
if site.pk in pk_set:
cache.delete(get_cache_notfound_key(template.name, site.pk))
else:
cache.delete(get_cache_key(template.name, site.pk))
def remove_cached_template(instance, **kwargs):
"""
Called via Django's signals to remove cached templates, if the template