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 %} - -
-

{{ author }}

- {% audiobook_tree group books_by_parent %} -
- {% endif %} - {% endfor %} -{% endblock %} diff --git a/apps/catalogue/templates/catalogue/book_list.html b/apps/catalogue/templates/catalogue/book_list.html index a32f60f01..ddeb3ce3f 100644 --- a/apps/catalogue/templates/catalogue/book_list.html +++ b/apps/catalogue/templates/catalogue/book_list.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {% load i18n %} -{% load catalogue_tags chunks %} +{% load catalogue_tags %} {% block bodyid %}book-a-list{% endblock %} @@ -19,29 +19,11 @@
{% 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 %} - -
-

{{ author }}

- {% 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 %} + +
+

{{ author }}

+ {% 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 %} + +
+

{{ author }}

+ {% 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 @@