Cache book lists
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 19 Sep 2012 12:27:24 +0000 (14:27 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Wed, 19 Sep 2012 12:27:24 +0000 (14:27 +0200)
apps/catalogue/models/listeners.py
apps/catalogue/templates/catalogue/audiobook_list.html
apps/catalogue/templates/catalogue/book_list.html
apps/catalogue/templates/catalogue/snippets/audiobook_list.html [new file with mode: 0755]
apps/catalogue/templates/catalogue/snippets/book_list.html [new file with mode: 0755]
apps/catalogue/templates/catalogue/snippets/book_list_nav.html [new file with mode: 0755]
apps/catalogue/views.py
apps/wolnelektury_core/templates/superbase.html

index 9e9fcab..7e034a1 100644 (file)
@@ -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):
index 427f899..c74f78c 100644 (file)
 Możecie z niej korzystać bezpłatnie i bez ograniczeń.
 Audiobooki nagrywają znani aktorzy, wśród nich Danuta Stenka i Jan Peszek.{% endblocktrans %}</p>
 {% endblock %}
-
-
-{% block book_list %}
-    {% audiobook_tree orphans books_by_parent %}
-    {% for author, group in books_by_author.items %}
-        {% if group %}
-            <a name="{{ author.slug }}"></a>
-            <div class="group">
-                <h2><a href="{{ author.get_absolute_url }}">{{ author }}</a></h2>
-                {% audiobook_tree group books_by_parent %}
-            </div>
-        {% endif %}
-    {% endfor %}
-{% endblock %}
index a32f60f..ddeb3ce 100644 (file)
@@ -1,6 +1,6 @@
 {% extends "base.html" %}
 {% load i18n %}
-{% load catalogue_tags chunks %}
+{% load catalogue_tags %}
 
 {% block bodyid %}book-a-list{% endblock %}
 
 
     <div id="book-list-nav" class="normal-text">
         {% trans "Table of Content" %}
-        {% for index, authors in books_nav.items %}
-                <ul>
-                    <li><a class="book-list-index" href="#">{{ index|upper }}</a></li>
-                    <ul class="book-list-show-index">
-                    {% for author in authors %}
-                        <li><a href="#{{ author.slug }}">{{ author }}</a></li>
-                    {% endfor %}
-                    </ul>
-                </ul>
-        {% endfor %}    
+        {{ rendered_nav }}
     </div>
     <div id="book-list" class="normal-text">
       {% block book_list %}
-        {% book_tree orphans books_by_parent %}
-        {% for author, group in books_by_author.items %}
-            {% if group %}
-                <a name="{{ author.slug }}"></a>
-                <div class="group">
-                    <h2><a href="{{ author.get_absolute_url }}">{{ author }}</a></h2>
-                    {% book_tree group books_by_parent %}
-                </div>
-            {% endif %}
-        {% endfor %}
+        {{ rendered_book_list }}
       {% endblock %}
     </div>
     <div id="book-list-up">
diff --git a/apps/catalogue/templates/catalogue/snippets/audiobook_list.html b/apps/catalogue/templates/catalogue/snippets/audiobook_list.html
new file mode 100755 (executable)
index 0000000..d7f5992
--- /dev/null
@@ -0,0 +1,12 @@
+{% load catalogue_tags %}
+
+{% audiobook_tree orphans books_by_parent %}
+{% for author, group in books_by_author.items %}
+    {% if group %}
+        <a name="{{ author.slug }}"></a>
+        <div class="group">
+            <h2><a href="{{ author.get_absolute_url }}">{{ author }}</a></h2>
+            {% audiobook_tree group books_by_parent %}
+        </div>
+    {% 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 (executable)
index 0000000..526dcbb
--- /dev/null
@@ -0,0 +1,12 @@
+{% load catalogue_tags %}
+
+{% book_tree orphans books_by_parent %}
+{% for author, group in books_by_author.items %}
+    {% if group %}
+        <a name="{{ author.slug }}"></a>
+        <div class="group">
+            <h2><a href="{{ author.get_absolute_url }}">{{ author }}</a></h2>
+            {% book_tree group books_by_parent %}
+        </div>
+    {% 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 (executable)
index 0000000..258824d
--- /dev/null
@@ -0,0 +1,10 @@
+{% for index, authors in books_nav.items %}
+    <ul>
+        <li><a class="book-list-index" href="#">{{ index|upper }}</a></li>
+        <ul class="book-list-show-index">
+        {% for author in authors %}
+            <li><a href="#{{ author.slug }}">{{ author }}</a></li>
+        {% endfor %}
+        </ul>
+    </ul>
+{% endfor %}
index fc27e02..cc56015 100644 (file)
@@ -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})
 
 
index 79542ec..423befb 100644 (file)
         <div id="main-content">
 
             <div id="nav-line">
-               {% cache 60 catalogue-menu LANGUAGE_CODE %}
+               {% cache 300 catalogue-menu LANGUAGE_CODE %}
                        {% catalogue_menu %}
                {% endcache %}