Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions askbot/models/question.py
Original file line number Diff line number Diff line change
Expand Up @@ -1055,6 +1055,13 @@ def reset_cached_data(self):
def clear_cached_data(self):
self.invalidate_cached_post_data()
self.invalidate_cached_summary_html()
self.invalidate_cached_thread_content_html()

def invalidate_cached_thread_content_html(self):
"""Invalidates the template-level cache for the question detail page."""
from django.core.cache.utils import make_template_fragment_key
key = make_template_fragment_key('thread-content-html', [self.id])
cache.cache.delete(key)

def get_public_posts(self):
kwargs = {
Expand Down
3 changes: 3 additions & 0 deletions askbot/setup_templates/settings.py.jinja2
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ TEMPLATES = (
)

MIDDLEWARE = (
'askbot.middleware.cache.UpdateCacheMiddleware', # must be first (response phase)
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # prerequisite for user messages
'django.contrib.messages.middleware.MessageMiddleware', # for user messages
Expand All @@ -148,6 +149,7 @@ MIDDLEWARE = (
'askbot.middleware.forum_mode.ForumModeMiddleware',
'askbot.middleware.cancel.CancelActionMiddleware',
'askbot.middleware.view_log.ViewLogMiddleware',
'askbot.middleware.cache.FetchFromCacheMiddleware', # must be last (request phase)
)

ATOMIC_REQUESTS = True
Expand Down Expand Up @@ -264,6 +266,7 @@ CACHES['default'].update({'KEY_PREFIX': 'askbot',})
LIVESETTINGS_CACHE_TIMEOUT = CACHES['default']['TIMEOUT']
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
CACHE_MIDDLEWARE_SECONDS = 600
CACHE_MIDDLEWARE_ALIAS = 'default'
#If you use memcache you may want to uncomment the following line to enable memcached based sessions
#SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

Expand Down
44 changes: 44 additions & 0 deletions askbot/tests/test_cache_invalidation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""Tests for template cache invalidation."""
from django.core.cache import cache
from django.core.cache.utils import make_template_fragment_key

from askbot.tests.utils import AskbotTestCase


class TemplateCacheInvalidationTests(AskbotTestCase):
"""Tests that thread cache invalidation clears template fragment cache."""

def setUp(self):
self.user = self.create_user('cacheuser')
self.question = self.post_question(user=self.user)
self.thread = self.question.thread

def tearDown(self):
cache.clear()

def test_invalidate_clears_template_cache(self):
"""invalidate_cached_thread_content_html() should delete the
template fragment cache for the thread."""
key = make_template_fragment_key('thread-content-html', [self.thread.id])
cache.set(key, '<html>cached</html>')
self.assertIsNotNone(cache.get(key))

self.thread.invalidate_cached_thread_content_html()
self.assertIsNone(cache.get(key))

def test_clear_cached_data_includes_template_cache(self):
"""clear_cached_data() should also clear the template fragment cache."""
key = make_template_fragment_key('thread-content-html', [self.thread.id])
cache.set(key, '<html>cached</html>')
self.assertIsNotNone(cache.get(key))

self.thread.clear_cached_data()
self.assertIsNone(cache.get(key))

def test_reset_cached_data_includes_template_cache(self):
"""reset_cached_data() should also clear the template fragment cache."""
key = make_template_fragment_key('thread-content-html', [self.thread.id])
cache.set(key, '<html>cached</html>')

self.thread.reset_cached_data()
self.assertIsNone(cache.get(key))
1 change: 1 addition & 0 deletions askbot/views/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -1510,6 +1510,7 @@ def publish_post(request):
else:
message = _('This feature is disabled')

post.thread.clear_cached_data()
request.user.message_set.create(message=message)
return {'redirect_url': post.get_absolute_url()}

Expand Down
2 changes: 1 addition & 1 deletion askbot/views/readers.py
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@ def question(request, id):#refactor - long subroutine. display question body, an
'category_tree_data': askbot_settings.CATEGORY_TREE,
'favorited' : favorited,
'group_read_only': group_read_only,
'is_cacheable': False,#is_cacheable, #temporary, until invalidation fix
'is_cacheable': is_cacheable,
'language_code': translation.get_language(),
'long_time': const.LONG_TIME,#"forever" caching
'show_answer_form': should_show_answer_form(request.user, thread, answers),
Expand Down