# 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
""" 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):
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 %}
{% 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">
--- /dev/null
+{% 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 %}
--- /dev/null
+{% 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 %}
--- /dev/null
+{% 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 %}
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
from picture.models import Picture
staff_required = user_passes_test(lambda user: user.is_staff)
+permanent_cache = get_cache('permanent')
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):
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})
<div id="main-content">
<div id="nav-line">
- {% cache 60 catalogue-menu LANGUAGE_CODE %}
+ {% cache 300 catalogue-menu LANGUAGE_CODE %}
{% catalogue_menu %}
{% endcache %}