Skip to content

Commit 10e7de2

Browse files
authored
Fix cache invalidation (jazzband#131)
1 parent 930ce5c commit 10e7de2

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

dbtemplates/test_cases.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import shutil
33
import tempfile
4+
from unittest import mock
45

56
from django.conf import settings as django_settings
67
from django.core.cache.backends.base import BaseCache
@@ -151,3 +152,24 @@ def test_check_template_syntax(self):
151152
def test_get_cache_name(self):
152153
self.assertEqual(get_cache_key('name with spaces'),
153154
'dbtemplates::name-with-spaces::1')
155+
156+
def test_cache_invalidation(self):
157+
# Add t1 into the cache of site2
158+
self.t1.sites.add(self.site2)
159+
with mock.patch('django.contrib.sites.models.SiteManager.get_current',
160+
return_value=self.site2):
161+
result = loader.get_template("base.html").render()
162+
self.assertEqual(result, 'base')
163+
164+
# Update content
165+
self.t1.content = 'new content'
166+
self.t1.save()
167+
result = loader.get_template("base.html").render()
168+
self.assertEqual(result, 'new content')
169+
170+
# Cache invalidation should work across sites.
171+
# Site2 should see the new content.
172+
with mock.patch('django.contrib.sites.models.SiteManager.get_current',
173+
return_value=self.site2):
174+
result = loader.get_template("base.html").render()
175+
self.assertEqual(result, 'new content')

dbtemplates/utils/cache.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ def get_cache_backend():
2121
cache = get_cache_backend()
2222

2323

24-
def get_cache_key(name):
25-
current_site = Site.objects.get_current()
26-
return f"dbtemplates::{slugify(name)}::{current_site.pk}"
24+
def get_cache_key(name, site=None):
25+
if site is None:
26+
site = Site.objects.get_current()
27+
return f"dbtemplates::{slugify(name)}::{site.pk}"
2728

2829

2930
def get_cache_notfound_key(name):
@@ -57,4 +58,5 @@ def remove_cached_template(instance, **kwargs):
5758
Called via Django's signals to remove cached templates, if the template
5859
in the database was changed or deleted.
5960
"""
60-
cache.delete(get_cache_key(instance.name))
61+
for site in instance.sites.all():
62+
cache.delete(get_cache_key(instance.name, site=site))

0 commit comments

Comments
 (0)