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 %}
-
-
-
- {% 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 %}
-
-
-
- {% 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/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 @@
- {% cache 60 catalogue-menu LANGUAGE_CODE %}
+ {% cache 300 catalogue-menu LANGUAGE_CODE %}
{% catalogue_menu %}
{% endcache %}