From: Radek Czajka Date: Wed, 19 Sep 2012 12:31:57 +0000 (+0200) Subject: Merge branch 'production' X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/739f27c960d11c123e8ba20a282b1755b9fcd358?hp=86e0b03a81484dba7472e587d1499e63d151fa93 Merge branch 'production' --- diff --git a/apps/catalogue/models/book.py b/apps/catalogue/models/book.py index 6a31f4bff..ea85645fa 100644 --- a/apps/catalogue/models/book.py +++ b/apps/catalogue/models/book.py @@ -86,6 +86,11 @@ class Book(models.Model): def get_absolute_url(self): return ('catalogue.views.book_detail', [self.slug]) + @staticmethod + @permalink + def create_url(slug): + return ('catalogue.views.book_detail', [slug]) + @property def name(self): return self.title @@ -482,19 +487,19 @@ class Book(models.Model): def pretty_title(self, html_links=False): book = self - names = list(book.tags.filter(category='author')) - - books = [] - while book: - books.append(book) - book = book.parent - names.extend(reversed(books)) + rel_info = book.related_info() + names = [(name, Tag.create_url('author', slug)) + for name, slug in rel_info['tags']['author']] + if 'parents' in rel_info: + books = [(name, Book.create_url(slug)) + for name, slug in rel_info['parents']] + names.extend(reversed(books)) + names.append((self.title, self.get_absolute_url())) if html_links: - names = ['%s' % (tag.get_absolute_url(), tag.name) for tag in names] + names = ['%s' % (tag[1], tag[0]) for tag in names] else: - names = [tag.name for tag in names] - + names = [tag[0] for tag in names] return ', '.join(names) @classmethod 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/models/tag.py b/apps/catalogue/models/tag.py index 353d567bb..3c4509dda 100644 --- a/apps/catalogue/models/tag.py +++ b/apps/catalogue/models/tag.py @@ -71,6 +71,13 @@ class Tag(TagBase): def get_absolute_url(self): return ('catalogue.views.tagged_object_list', [self.url_chunk]) + @classmethod + @permalink + def create_url(cls, category, slug): + return ('catalogue.views.tagged_object_list', [ + '/'.join((cls.categories_dict[category], slug)) + ]) + def has_description(self): return len(self.description) > 0 has_description.short_description = _('description') 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/templatetags/catalogue_tags.py b/apps/catalogue/templatetags/catalogue_tags.py index ad60962c5..92827c10d 100644 --- a/apps/catalogue/templatetags/catalogue_tags.py +++ b/apps/catalogue/templatetags/catalogue_tags.py @@ -4,6 +4,7 @@ # import datetime import feedparser +from random import randint from django.conf import settings from django import template @@ -388,9 +389,14 @@ def related_books(book, limit=6, random=1): ignore_by_tag=book.book_tag())[:limit-random] cache.set(cache_key, related, 1800) if random: - related += list(Book.objects.exclude( - pk__in=[b.pk for b in related] + [book.pk] - ).order_by('?')[:random]) + random_books = Book.objects.exclude( + pk__in=[b.pk for b in related] + [book.pk]) + if random == 1: + count = random_books.count() + if count: + related.append(random_books[randint(0, count - 1)]) + else: + related += list(random_books.order_by('?')[:random]) return { 'books': related, } @@ -407,9 +413,7 @@ def catalogue_menu(): @register.simple_tag def tag_url(category, slug): - return reverse('catalogue.views.tagged_object_list', args=[ - '/'.join((Tag.categories_dict[category], slug)) - ]) + return Tag.create_url(category, slug) @register.simple_tag 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/oai/urls.py b/apps/oai/urls.py index 38703ab91..406209f7f 100644 --- a/apps/oai/urls.py +++ b/apps/oai/urls.py @@ -2,4 +2,4 @@ from django.conf.urls.defaults import * urlpatterns = patterns('oai.views', - url(r'^$', 'oaipmh')) + url(r'^$', 'oaipmh', name='oaipmh')) diff --git a/apps/social/templatetags/social_tags.py b/apps/social/templatetags/social_tags.py index 889160200..d6d3f7110 100755 --- a/apps/social/templatetags/social_tags.py +++ b/apps/social/templatetags/social_tags.py @@ -2,6 +2,7 @@ # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # +from random import randint from django import template from catalogue.models import Book from social.models import Cite @@ -29,7 +30,16 @@ def choose_cite(context, ctx=None): cites = cites_for_tags([ctx.book_tag()]) else: cites = cites_for_tags(ctx) - cite = cites.order_by('-sticky', '?')[0] if cites.exists() else None + stickies = cites.filter(sticky=True) + count = stickies.count() + if count: + cite = stickies[randint(0, count - 1)] + else: + count = cites.count() + if count: + cite = cites[randint(0, count - 1)] + else: + cite = None return cite diff --git a/apps/wolnelektury_core/templates/main_page.html b/apps/wolnelektury_core/templates/main_page.html index f4ffef1ec..6b7c46aac 100755 --- a/apps/wolnelektury_core/templates/main_page.html +++ b/apps/wolnelektury_core/templates/main_page.html @@ -59,6 +59,7 @@
  • {% trans "Missing a book?" %}
  • {% trans "Publishing plan" %}
  • API
  • +
  • OAI-PMH
  • Leśmianator
  • Materiały do nauki j. polskiego
  • 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 @@