X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/03819cbf7cedde10e27d18068070c14ca37ff6e8..62ad2a4a9ed68ae6f9f72db516824ff70909bec8:/apps/catalogue/templatetags/catalogue_tags.py diff --git a/apps/catalogue/templatetags/catalogue_tags.py b/apps/catalogue/templatetags/catalogue_tags.py index 3c34e8cdd..94753483c 100644 --- a/apps/catalogue/templatetags/catalogue_tags.py +++ b/apps/catalogue/templatetags/catalogue_tags.py @@ -1,10 +1,17 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# +import feedparser +import datetime + from django import template from django.template import Node, Variable from django.utils.encoding import smart_str from django.core.urlresolvers import reverse from django.contrib.auth.forms import UserCreationForm, AuthenticationForm from django.db.models import Q +from django.conf import settings register = template.Library() @@ -47,13 +54,43 @@ def simple_title(tags): 'kind': u'rodzaj', 'set': u'półka', } - + title = [] for tag in tags: title.append("%s: %s" % (mapping[tag.category], tag.name)) return capfirst(', '.join(title)) +def book_stub_title(book): + return ', '.join((book.author, book.title)) + + +@register.simple_tag +def book_title(book, html_links=False): + try: + names = list(book.tags.filter(category='author')) + except AttributeError: + return book_stub_title(book) + + books = [] + while book: + books.append(book) + book = book.parent + names.extend(reversed(books)) + + if html_links: + names = ['%s' % (tag.get_absolute_url(), tag.name) for tag in names] + else: + names = [tag.name for tag in names] + + return ', '.join(names) + + +@register.simple_tag +def book_title_html(book): + return book_title(book, html_links=True) + + @register.simple_tag def title_from_tags(tags): def split_tags(tags): @@ -61,46 +98,46 @@ def title_from_tags(tags): for tag in tags: result[tag.category] = tag return result - + # TODO: Remove this after adding flection mechanism return simple_title(tags) - + class Flection(object): def get_case(self, name, flection): return name flection = Flection() - + self = split_tags(tags) - + title = u'' - + # Specjalny przypadek oglądania wszystkich lektur na danej półce if len(self) == 1 and 'set' in self: return u'Półka %s' % self['set'] - + # Specjalny przypadek "Twórczość w pozytywizmie", wtedy gdy tylko epoka # jest wybrana przez użytkownika if 'epoch' in self and len(self) == 1: text = u'Twórczość w %s' % flection.get_case(unicode(self['epoch']), u'miejscownik') return capfirst(text) - + # Specjalny przypadek "Dramat w twórczości Sofoklesa", wtedy gdy podane # są tylko rodzaj literacki i autor if 'kind' in self and 'author' in self and len(self) == 2: - text = u'%s w twórczości %s' % (unicode(self['kind']), + text = u'%s w twórczości %s' % (unicode(self['kind']), flection.get_case(unicode(self['author']), u'dopełniacz')) return capfirst(text) - + # Przypadki ogólniejsze if 'theme' in self: title += u'Motyw %s' % unicode(self['theme']) - + if 'genre' in self: if 'theme' in self: title += u' w %s' % flection.get_case(unicode(self['genre']), u'miejscownik') else: title += unicode(self['genre']) - + if 'kind' in self or 'author' in self or 'epoch' in self: if 'genre' in self or 'theme' in self: if 'kind' in self: @@ -109,12 +146,12 @@ def title_from_tags(tags): title += u' w twórczości ' else: title += u'%s ' % unicode(self.get('kind', u'twórczość')) - + if 'author' in self: title += flection.get_case(unicode(self['author']), u'dopełniacz') elif 'epoch' in self: title += flection.get_case(unicode(self['epoch']), u'dopełniacz') - + return capfirst(title) @@ -132,7 +169,11 @@ def authentication_form(): def breadcrumbs(tags, search_form=True): from catalogue.forms import SearchForm context = {'tag_list': tags} - if search_form and len(tags) < 6: + try: + max_tag_list = settings.MAX_TAG_LIST + except AttributeError: + max_tag_list = -1 + if search_form and (max_tag_list == -1 or len(tags) < max_tag_list): context['search_form'] = SearchForm(tags=tags) return context @@ -141,7 +182,7 @@ def breadcrumbs(tags, search_form=True): def catalogue_url(parser, token): bits = token.split_contents() tag_name = bits[0] - + tags_to_add = [] tags_to_remove = [] for bit in bits[1:]: @@ -149,7 +190,7 @@ def catalogue_url(parser, token): tags_to_remove.append(bit[1:]) else: tags_to_add.append(bit) - + return CatalogueURLNode(tags_to_add, tags_to_remove) @@ -157,7 +198,7 @@ class CatalogueURLNode(Node): def __init__(self, tags_to_add, tags_to_remove): self.tags_to_add = [Variable(tag) for tag in tags_to_add] self.tags_to_remove = [Variable(tag) for tag in tags_to_remove] - + def render(self, context): tags_to_add = [] tags_to_remove = [] @@ -175,14 +216,14 @@ class CatalogueURLNode(Node): tags_to_remove += [t for t in tag] else: tags_to_remove.append(tag) - - tag_slugs = [tag.slug for tag in tags_to_add] + + tag_slugs = [tag.url_chunk for tag in tags_to_add] for tag in tags_to_remove: try: - tag_slugs.remove(tag.slug) + tag_slugs.remove(tag.url_chunk) except KeyError: pass - + if len(tag_slugs) > 0: return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)}) else: @@ -191,11 +232,8 @@ class CatalogueURLNode(Node): @register.inclusion_tag('catalogue/latest_blog_posts.html') def latest_blog_posts(feed_url, posts_to_show=5): - import feedparser - import datetime - try: - feed = feedparser.parse(feed_url) + feed = feedparser.parse(str(feed_url)) posts = [] for i in range(posts_to_show): pub_date = feed['entries'][i].updated_parsed @@ -222,11 +260,12 @@ def tag_list(tags, choices=None): @register.inclusion_tag('catalogue/folded_tag_list.html') def folded_tag_list(tags, choices=None): + tags = [tag for tag in tags if tag.count] if choices is None: choices = [] some_tags_hidden = False tag_count = len(tags) - + if tag_count == 1: one_tag = tags[0] else: