mirror of
https://github.com/jazzband/django-dbtemplates.git
synced 2026-03-16 22:20:28 +00:00
When changing template-site assignments, invalidate cached templates that belonged to sites that got unassigned
This commit is contained in:
parent
f22ca2c7e0
commit
e559006f05
2 changed files with 33 additions and 6 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue