From 24b135ddf6bcd87ec53d1a98f653d2abcdd22fa5 Mon Sep 17 00:00:00 2001
From: Radek Czajka
Date: Wed, 19 Sep 2012 14:27:24 +0200
Subject: [PATCH] Cache book lists
---
apps/catalogue/models/listeners.py | 14 +++++++-
.../templates/catalogue/audiobook_list.html | 14 --------
.../templates/catalogue/book_list.html | 24 ++-----------
.../catalogue/snippets/audiobook_list.html | 12 +++++++
.../catalogue/snippets/book_list.html | 12 +++++++
.../catalogue/snippets/book_list_nav.html | 10 ++++++
apps/catalogue/views.py | 36 +++++++++++++------
.../templates/superbase.html | 2 +-
8 files changed, 77 insertions(+), 47 deletions(-)
create mode 100755 apps/catalogue/templates/catalogue/snippets/audiobook_list.html
create mode 100755 apps/catalogue/templates/catalogue/snippets/book_list.html
create mode 100755 apps/catalogue/templates/catalogue/snippets/book_list_nav.html
diff --git a/apps/catalogue/models/listeners.py b/apps/catalogue/models/listeners.py
index 9e9fcabff..7e034a1c6 100644
--- a/apps/catalogue/models/listeners.py
+++ b/apps/catalogue/models/listeners.py
@@ -3,13 +3,17 @@
# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
#
from django.conf import settings
+from django.core.cache import get_cache
from django.db.models.signals import post_save, pre_delete, post_delete
import django.dispatch
-from catalogue.models import Tag, BookMedia, Book, Fragment
+from catalogue.models import Tag, BookMedia, Book, Fragment, Collection
from catalogue import tasks
from newtagging.models import tags_updated
+permanent_cache = get_cache('permanent')
+
+
def _tags_updated_handler(sender, affected_tags, **kwargs):
# reset tag global counter
# we want Tag.changed_at updated for API to know the tag was touched
@@ -40,9 +44,17 @@ def _post_save_handler(sender, instance, **kwargs):
""" refresh all the short_html stuff on BookMedia update """
if sender == BookMedia:
instance.book.save()
+ elif sender == Collection:
+ permanent_cache.delete('catalogue.collection:%s' % instance.slug)
post_save.connect(_post_save_handler)
+def post_publish(sender, **kwargs):
+ permanent_cache.delete_many(['catalogue.book_list',
+ 'catalogue.audiobook_list', 'catalogue.daisy_list'])
+Book.published.connect(post_publish)
+
+
if not settings.NO_SEARCH_INDEX:
@django.dispatch.receiver(post_delete, sender=Book)
def _remove_book_from_index_handler(sender, instance, **kwargs):
diff --git a/apps/catalogue/templates/catalogue/audiobook_list.html b/apps/catalogue/templates/catalogue/audiobook_list.html
index 427f89934..c74f78c74 100644
--- a/apps/catalogue/templates/catalogue/audiobook_list.html
+++ b/apps/catalogue/templates/catalogue/audiobook_list.html
@@ -20,17 +20,3 @@
Możecie z niej korzystaÄ bezpÅatnie i bez ograniczeÅ.
Audiobooki nagrywajÄ
znani aktorzy, wÅród nich Danuta Stenka i Jan Peszek.{% endblocktrans %}
{% endblock %}
-
-
-{% block book_list %}
- {% audiobook_tree orphans books_by_parent %}
- {% for author, group in books_by_author.items %}
- {% if group %}
-
{% trans "Table of Content" %}
- {% for index, authors in books_nav.items %}
-
- {% endfor %}
+ {{ rendered_nav }}
{% block book_list %}
- {% book_tree orphans books_by_parent %}
- {% for author, group in books_by_author.items %}
- {% if group %}
-
-
-
- {% book_tree group books_by_parent %}
-
- {% endif %}
- {% endfor %}
+ {{ rendered_book_list }}
{% endblock %}
diff --git a/apps/catalogue/templates/catalogue/snippets/audiobook_list.html b/apps/catalogue/templates/catalogue/snippets/audiobook_list.html
new file mode 100755
index 000000000..d7f599274
--- /dev/null
+++ b/apps/catalogue/templates/catalogue/snippets/audiobook_list.html
@@ -0,0 +1,12 @@
+{% load catalogue_tags %}
+
+{% audiobook_tree orphans books_by_parent %}
+{% for author, group in books_by_author.items %}
+ {% if group %}
+
+
+
+ {% audiobook_tree group books_by_parent %}
+
+ {% endif %}
+{% endfor %}
diff --git a/apps/catalogue/templates/catalogue/snippets/book_list.html b/apps/catalogue/templates/catalogue/snippets/book_list.html
new file mode 100755
index 000000000..526dcbbcc
--- /dev/null
+++ b/apps/catalogue/templates/catalogue/snippets/book_list.html
@@ -0,0 +1,12 @@
+{% load catalogue_tags %}
+
+{% book_tree orphans books_by_parent %}
+{% for author, group in books_by_author.items %}
+ {% if group %}
+
+
+
+ {% book_tree group books_by_parent %}
+
+ {% endif %}
+{% endfor %}
diff --git a/apps/catalogue/templates/catalogue/snippets/book_list_nav.html b/apps/catalogue/templates/catalogue/snippets/book_list_nav.html
new file mode 100755
index 000000000..258824df3
--- /dev/null
+++ b/apps/catalogue/templates/catalogue/snippets/book_list_nav.html
@@ -0,0 +1,10 @@
+{% for index, authors in books_nav.items %}
+
+{% endfor %}
diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py
index fc27e02f3..cc5601593 100644
--- a/apps/catalogue/views.py
+++ b/apps/catalogue/views.py
@@ -6,7 +6,9 @@ import re
import itertools
from django.conf import settings
+from django.core.cache import get_cache
from django.template import RequestContext
+from django.template.loader import render_to_string
from django.shortcuts import render_to_response, get_object_or_404, redirect
from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
from django.core.urlresolvers import reverse
@@ -29,6 +31,7 @@ from suggest.forms import PublishingSuggestForm
from picture.models import Picture
staff_required = user_passes_test(lambda user: user.is_staff)
+permanent_cache = get_cache('permanent')
def catalogue(request):
@@ -45,27 +48,39 @@ def catalogue(request):
def book_list(request, filter=None, template_name='catalogue/book_list.html',
- context=None):
+ nav_template_name='catalogue/snippets/book_list_nav.html',
+ list_template_name='catalogue/snippets/book_list.html',
+ cache_key='catalogue.book_list',
+ context=None,
+ ):
""" generates a listing of all books, optionally filtered with a test function """
-
- books_by_author, orphans, books_by_parent = models.Book.book_list(filter)
- books_nav = SortedDict()
- for tag in books_by_author:
- if books_by_author[tag]:
- books_nav.setdefault(tag.sort_key[0], []).append(tag)
-
+ cached = permanent_cache.get(cache_key)
+ if cached is not None:
+ rendered_nav, rendered_book_list = cached
+ else:
+ books_by_author, orphans, books_by_parent = models.Book.book_list(filter)
+ books_nav = SortedDict()
+ for tag in books_by_author:
+ if books_by_author[tag]:
+ books_nav.setdefault(tag.sort_key[0], []).append(tag)
+ rendered_nav = render_to_string(nav_template_name, locals())
+ rendered_book_list = render_to_string(list_template_name, locals())
+ permanent_cache.set(cache_key, (rendered_nav, rendered_book_list))
return render_to_response(template_name, locals(),
context_instance=RequestContext(request))
def audiobook_list(request):
return book_list(request, Q(media__type='mp3') | Q(media__type='ogg'),
- template_name='catalogue/audiobook_list.html')
+ template_name='catalogue/audiobook_list.html',
+ list_template_name='catalogue/snippets/audiobook_list.html',
+ cache_key='catalogue.audiobook_list')
def daisy_list(request):
return book_list(request, Q(media__type='daisy'),
- template_name='catalogue/daisy_list.html')
+ template_name='catalogue/daisy_list.html',
+ cache_key='catalogue.daisy_list')
def collection(request, slug):
@@ -76,6 +91,7 @@ def collection(request, slug):
for slug in slugs]
return book_list(request, Q(slug__in=slugs),
template_name='catalogue/collection.html',
+ cache_key='catalogue.collection:%s' % coll.slug,
context={'collection': coll})
diff --git a/apps/wolnelektury_core/templates/superbase.html b/apps/wolnelektury_core/templates/superbase.html
index 79542ecfc..423befbdb 100644
--- a/apps/wolnelektury_core/templates/superbase.html
+++ b/apps/wolnelektury_core/templates/superbase.html
@@ -123,7 +123,7 @@
- {% cache 60 catalogue-menu LANGUAGE_CODE %}
+ {% cache 300 catalogue-menu LANGUAGE_CODE %}
{% catalogue_menu %}
{% endcache %}
--
2.20.1