X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/e97becbbb360b14527801bfc22c3e1ab3fd288a1..89edbdb3d37db35ce3c0fc9acd419ceba7b38892:/apps/catalogue/templatetags/catalogue_tags.py diff --git a/apps/catalogue/templatetags/catalogue_tags.py b/apps/catalogue/templatetags/catalogue_tags.py index fd8c8c4b9..f9c69ea7d 100644 --- a/apps/catalogue/templatetags/catalogue_tags.py +++ b/apps/catalogue/templatetags/catalogue_tags.py @@ -2,22 +2,21 @@ # This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # -import datetime -import feedparser from random import randint from urlparse import urlparse from django.conf import settings from django import template from django.template import Node, Variable, Template, Context -from django.core.cache import cache from django.core.urlresolvers import reverse from django.contrib.auth.forms import UserCreationForm, AuthenticationForm +from django.utils.cache import add_never_cache_headers from django.utils.translation import ugettext as _ -from catalogue.utils import related_tag_name as _related_tag_name +from ssify import ssi_variable from catalogue.models import Book, BookMedia, Fragment, Tag, Source from catalogue.constants import LICENSES +from picture.models import Picture register = template.Library() @@ -279,25 +278,6 @@ class CatalogueURLNode(Node): return reverse('main_page') -@register.inclusion_tag('catalogue/latest_blog_posts.html') -def latest_blog_posts(feed_url, posts_to_show=5): - try: - feed = feedparser.parse(str(feed_url)) - posts = [] - for i in range(posts_to_show): - pub_date = feed['entries'][i].published_parsed - published = datetime.date(pub_date[0], pub_date[1], pub_date[2]) - posts.append({ - 'title': feed['entries'][i].title, - 'summary': feed['entries'][i].summary, - 'link': feed['entries'][i].link, - 'date': published, - }) - return {'posts': posts} - except: - return {'posts': []} - - @register.inclusion_tag('catalogue/tag_list.html') def tag_list(tags, choices=None): if choices is None: @@ -319,54 +299,9 @@ def collection_list(collections): @register.inclusion_tag('catalogue/book_info.html') def book_info(book): - return locals() - - -@register.inclusion_tag('catalogue/book_wide.html', takes_context=True) -def book_wide(context, book): - book_themes = book.related_themes() - extra_info = book.extra_info - hide_about = extra_info.get('about', '').startswith('http://wiki.wolnepodreczniki.pl') - stage_note, stage_note_url = book.stage_note() - - return { - 'book': book, - 'main_link': reverse('book_text', args=[book.slug]) if book.html_file else None, - 'related': book.related_info(), - 'extra_info': extra_info, - 'hide_about': hide_about, - 'themes': book_themes, - 'request': context.get('request'), - 'show_lang': book.language_code() != settings.LANGUAGE_CODE, - 'stage_note': stage_note, - 'stage_note_url': stage_note_url, - } - - -@register.inclusion_tag('catalogue/book_short.html', takes_context=True) -def book_short(context, book): - stage_note, stage_note_url = book.stage_note() - - return { - 'book': book, - 'main_link': book.get_absolute_url(), - 'related': book.related_info(), - 'request': context.get('request'), - 'show_lang': book.language_code() != settings.LANGUAGE_CODE, - 'stage_note': stage_note, - 'stage_note_url': stage_note_url, - } - - -@register.inclusion_tag('catalogue/book_mini_box.html') -def book_mini(book, with_link=True): - author_str = ", ".join(related_tag_name(tag) - for tag in book.related_info()['tags'].get('author', ())) return { + 'is_picture': isinstance(book, Picture), 'book': book, - 'author_str': author_str, - 'with_link': with_link, - 'show_lang': book.language_code() != settings.LANGUAGE_CODE, } @@ -376,43 +311,18 @@ def work_list(context, object_list): return locals() -@register.inclusion_tag('catalogue/fragment_promo.html') -def fragment_promo(arg=None): - if arg is None: - fragments = Fragment.objects.all().order_by('?') - fragment = fragments[0] if fragments.exists() else None - elif isinstance(arg, Book): - fragment = arg.choose_fragment() - else: - fragments = Fragment.tagged.with_all(arg).order_by('?') - fragment = fragments[0] if fragments.exists() else None - - return { - 'fragment': fragment, - } - - -@register.inclusion_tag('catalogue/related_books.html') -def related_books(book, limit=6, random=1, taken=0): +@register.inclusion_tag('catalogue/related_books.html', takes_context=True) +def related_books(context, book, limit=6, random=1, taken=0): limit = limit - taken - cache_key = "catalogue.related_books.%d.%d" % (book.id, limit - random) - related = cache.get(cache_key) - if related is None: - related = Book.tagged.related_to(book, - Book.objects.exclude(common_slug=book.common_slug), - ignore_by_tag=book.book_tag())[:limit-random] - cache.set(cache_key, related, 1800) - if 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]) + related = Book.tagged.related_to(book, + Book.objects.exclude(common_slug=book.common_slug) + ).exclude(ancestor=book)[:limit-random] + random_excluded = [b.pk for b in related] + [book.pk] return { + 'request': context['request'], 'books': related, + 'random': random, + 'random_excluded': random_excluded, } @@ -427,24 +337,18 @@ def catalogue_menu(): ]} -@register.simple_tag -def tag_url(category, slug): - return Tag.create_url(category, slug) - - @register.simple_tag def download_audio(book, daisy=True): - related = book.related_info() links = [] - if related['media'].get('mp3'): + if book.has_media('mp3'): links.append("%s" % (reverse('download_zip_mp3', args=[book.slug]), BookMedia.formats['mp3'].name)) - if related['media'].get('ogg'): + if book.has_media('ogg'): links.append("%s" % (reverse('download_zip_ogg', args=[book.slug]), BookMedia.formats['ogg'].name)) - if daisy and related['media'].get('daisy'): + if daisy and book.has_media('daisy'): for dsy in book.get_media('daisy'): links.append("%s" % (dsy.file.url, BookMedia.formats['daisy'].name)) @@ -472,11 +376,6 @@ def license_icon(license_url): } -@register.simple_tag -def related_tag_name(tag, lang=None): - return _related_tag_name(tag, lang) - - @register.filter def class_name(obj): return obj.__class__.__name__ @@ -492,3 +391,31 @@ def source_name(url): return '' source, created = Source.objects.get_or_create(netloc=netloc) return source.name or netloc + + +@ssi_variable(register, patch_response=[add_never_cache_headers]) +def catalogue_random_book(request, exclude_ids): + queryset = Book.objects.exclude(pk__in=exclude_ids) + count = queryset.count() + if count: + return queryset[randint(0, count - 1)].pk + else: + return None + + +@ssi_variable(register, patch_response=[add_never_cache_headers]) +def choose_fragment(request, book_id=None, tag_ids=None, unless=False): + if unless: + return None + + if book_id is not None: + fragment = Book.objects.get(pk=book_id).choose_fragment() + else: + if tag_ids is not None: + tags = Tag.objects.filter(pk__in=tag_ids) + fragments = Fragment.tagged.with_all(tags).order_by().only('id') + else: + fragments = Fragment.objects.all().order_by().only('id') + fragment_count = fragments.count() + fragment = fragments[randint(0, fragment_count - 1)] if fragment_count else None + return fragment.pk if fragment is not None else None