#12 wystawione 20 najpopularniejszych książek
[wolnelektury.git] / src / catalogue / templatetags / catalogue_tags.py
index ce23e54..947fbf2 100644 (file)
@@ -15,6 +15,8 @@ from django.utils.cache import add_never_cache_headers
 from django.utils.translation import ugettext as _
 
 from ssify import ssi_variable
 from django.utils.translation import ugettext as _
 
 from ssify import ssi_variable
+
+from catalogue.helpers import get_audiobook_tags
 from catalogue.models import Book, BookMedia, Fragment, Tag, Source
 from catalogue.constants import LICENSES
 from picture.models import Picture
 from catalogue.models import Book, BookMedia, Fragment, Tag, Source
 from catalogue.constants import LICENSES
 from picture.models import Picture
@@ -24,14 +26,18 @@ register = template.Library()
 
 class RegistrationForm(UserCreationForm):
     def as_ul(self):
 
 class RegistrationForm(UserCreationForm):
     def as_ul(self):
-        "Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
-        return self._html_output(u'<li>%(errors)s%(label)s %(field)s<span class="help-text">%(help_text)s</span></li>', u'<li>%s</li>', '</li>', u' %s', False)
+        """Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."""
+        return self._html_output(
+            u'<li>%(errors)s%(label)s %(field)s<span class="help-text">%(help_text)s</span></li>', u'<li>%s</li>',
+            '</li>', u' %s', False)
 
 
 class LoginForm(AuthenticationForm):
     def as_ul(self):
 
 
 class LoginForm(AuthenticationForm):
     def as_ul(self):
-        "Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."
-        return self._html_output(u'<li>%(errors)s%(label)s %(field)s<span class="help-text">%(help_text)s</span></li>', u'<li>%s</li>', '</li>', u' %s', False)
+        """Returns this form rendered as HTML <li>s -- excluding the <ul></ul>."""
+        return self._html_output(
+            u'<li>%(errors)s%(label)s %(field)s<span class="help-text">%(help_text)s</span></li>', u'<li>%s</li>',
+            '</li>', u' %s', False)
 
 
 def iterable(obj):
 
 
 def iterable(obj):
@@ -108,8 +114,8 @@ def title_from_tags(tags):
     # 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:
     # 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']),
-            flection.get_case(unicode(self['author']), u'dopełniacz'))
+        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
         return capfirst(text)
 
     # Przypadki ogólniejsze
@@ -150,17 +156,20 @@ def book_tree(book_list, books_by_parent):
     else:
         return ''
 
     else:
         return ''
 
+
 @register.simple_tag
 def audiobook_tree(book_list, books_by_parent):
     text = "".join("<li><a class='open-player' href='%s'>%s</a>%s</li>" % (
 @register.simple_tag
 def audiobook_tree(book_list, books_by_parent):
     text = "".join("<li><a class='open-player' href='%s'>%s</a>%s</li>" % (
-        reverse("book_player", args=[book.slug]), book.title, audiobook_tree(books_by_parent.get(book, ()), books_by_parent)
-        ) for book in book_list)
+        reverse("book_player", args=[book.slug]), book.title,
+        audiobook_tree(books_by_parent.get(book, ()), books_by_parent)
+    ) for book in book_list)
 
     if text:
         return "<ol>%s</ol>" % text
     else:
         return ''
 
 
     if text:
         return "<ol>%s</ol>" % text
     else:
         return ''
 
+
 @register.simple_tag
 def book_tree_texml(book_list, books_by_parent, depth=1):
     return "".join("""
 @register.simple_tag
 def book_tree_texml(book_list, books_by_parent, depth=1):
     return "".join("""
@@ -201,6 +210,7 @@ def book_tree_csv(author, book_list, books_by_parent, depth=1, max_depth=3, deli
                 "children": book_tree_csv(author, books_by_parent.get(book.id, ()), books_by_parent, depth + 1)
             } for book in book_list)
 
                 "children": book_tree_csv(author, books_by_parent.get(book.id, ()), books_by_parent, depth + 1)
             } for book in book_list)
 
+
 @register.simple_tag
 def all_editors(extra_info):
     editors = []
 @register.simple_tag
 def all_editors(extra_info):
     editors = []
@@ -234,37 +244,23 @@ def catalogue_url(parser, token):
 
     tags_to_add = []
     tags_to_remove = []
 
     tags_to_add = []
     tags_to_remove = []
-    for bit in bits[1:]:
-        if bit[0] == '-':
-            tags_to_remove.append(bit[1:])
-        else:
-            tags_to_add.append(bit)
-
-    return CatalogueURLNode(tags_to_add, tags_to_remove)
-
-
-@register.tag
-def catalogue_url_gallery(parser, token):
-    bits = token.split_contents()
-
-    tags_to_add = []
-    tags_to_remove = []
-    for bit in bits[1:]:
+    for bit in bits[2:]:
         if bit[0] == '-':
             tags_to_remove.append(bit[1:])
         else:
             tags_to_add.append(bit)
 
         if bit[0] == '-':
             tags_to_remove.append(bit[1:])
         else:
             tags_to_add.append(bit)
 
-    return CatalogueURLNode(tags_to_add, tags_to_remove, gallery=True)
+    return CatalogueURLNode(bits[1], tags_to_add, tags_to_remove)
 
 
 class CatalogueURLNode(Node):
 
 
 class CatalogueURLNode(Node):
-    def __init__(self, tags_to_add, tags_to_remove, gallery=False):
+    def __init__(self, list_type, 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]
         self.tags_to_add = [Variable(tag) for tag in tags_to_add]
         self.tags_to_remove = [Variable(tag) for tag in tags_to_remove]
-        self.gallery = gallery
+        self.list_type_var = Variable(list_type)
 
     def render(self, context):
 
     def render(self, context):
+        list_type = self.list_type_var.resolve(context)
         tags_to_add = []
         tags_to_remove = []
 
         tags_to_add = []
         tags_to_remove = []
 
@@ -290,17 +286,24 @@ class CatalogueURLNode(Node):
                 pass
 
         if len(tag_slugs) > 0:
                 pass
 
         if len(tag_slugs) > 0:
-            if self.gallery:
+            if list_type == 'gallery':
                 return reverse('tagged_object_list_gallery', kwargs={'tags': '/'.join(tag_slugs)})
                 return reverse('tagged_object_list_gallery', kwargs={'tags': '/'.join(tag_slugs)})
+            elif list_type == 'audiobooks':
+                return reverse('tagged_object_list_audiobooks', kwargs={'tags': '/'.join(tag_slugs)})
             else:
                 return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)})
         else:
             else:
                 return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)})
         else:
-            return reverse('book_list')
+            if list_type == 'gallery':
+                return reverse('gallery')
+            elif list_type == 'audiobooks':
+                return reverse('audiobook_list')
+            else:
+                return reverse('book_list')
 
 
 
 
-@register.inclusion_tag('catalogue/tag_list.html')
-def tag_list(tags, choices=None, category=None, gallery=False):
-    print(tags, choices, category)
+@register.inclusion_tag('catalogue/tag_list.html')
+def tag_list(tags, choices=None, category=None, list_type='books'):
+    print(tags, choices, category)
     if choices is None:
         choices = []
 
     if choices is None:
         choices = []
 
@@ -311,24 +314,38 @@ def tag_list(tags, choices=None, category=None, gallery=False):
 
     if len(tags) == 1 and category not in [t.category for t in choices]:
         one_tag = tags[0]
 
     if len(tags) == 1 and category not in [t.category for t in choices]:
         one_tag = tags[0]
+    else:
+        one_tag = None
 
     if category is not None:
 
     if category is not None:
-        other = Tag.objects.filter(category=category).exclude(pk__in=[t.pk for t in tags]).exclude(pk__in=[t.pk for t in category_choices])
+        other = Tag.objects.filter(category=category).exclude(pk__in=[t.pk for t in tags])\
+            .exclude(pk__in=[t.pk for t in category_choices])
         # Filter out empty tags.
         # Filter out empty tags.
-        ct = ContentType.objects.get_for_model(Picture if gallery else Book)
+        ct = ContentType.objects.get_for_model(Picture if list_type == 'gallery' else Book)
         other = other.filter(items__content_type=ct).distinct()
         other = other.filter(items__content_type=ct).distinct()
+        if list_type == 'audiobooks':
+            other = other.filter(id__in=get_audiobook_tags())
+    else:
+        other = []
 
 
-    return locals()
+    return {
+        'one_tag': one_tag,
+        'choices': choices,
+        'category_choices': category_choices,
+        'tags': tags,
+        'other': other,
+        'list_type': list_type,
+    }
 
 
 @register.inclusion_tag('catalogue/inline_tag_list.html')
 
 
 @register.inclusion_tag('catalogue/inline_tag_list.html')
-def inline_tag_list(tags, choices=None, category=None, gallery=False):
-    return tag_list(tags, choices, category, gallery)
+def inline_tag_list(tags, choices=None, category=None, list_type='books'):
+    return tag_list(tags, choices, category, list_type)
 
 
 @register.inclusion_tag('catalogue/collection_list.html')
 def collection_list(collections):
 
 
 @register.inclusion_tag('catalogue/collection_list.html')
 def collection_list(collections):
-    return locals()
+    return {'collections': collections}
 
 
 @register.inclusion_tag('catalogue/book_info.html')
 
 
 @register.inclusion_tag('catalogue/book_info.html')
@@ -342,14 +359,17 @@ def book_info(book):
 @register.inclusion_tag('catalogue/work-list.html', takes_context=True)
 def work_list(context, object_list):
     request = context.get('request')
 @register.inclusion_tag('catalogue/work-list.html', takes_context=True)
 def work_list(context, object_list):
     request = context.get('request')
-    return locals()
-
+    return {'object_list': object_list, 'request': request}
 
 
 @register.inclusion_tag('catalogue/plain_list.html', takes_context=True)
 
 
 @register.inclusion_tag('catalogue/plain_list.html', takes_context=True)
-def plain_list(context, object_list, with_initials=True, by_author=False, choice=None, book=None, gallery=False, paged=True):
+def plain_list(context, object_list, with_initials=True, by_author=False, choice=None, book=None, list_type='books',
+               paged=True, initial_blocks=False):
     names = [('', [])]
     last_initial = None
     names = [('', [])]
     last_initial = None
+    if len(object_list) < settings.CATALOGUE_MIN_INITIALS and not by_author:
+        with_initials = False
+        initial_blocks = False
     for obj in object_list:
         if with_initials:
             if by_author:
     for obj in object_list:
         if with_initials:
             if by_author:
@@ -360,14 +380,20 @@ def plain_list(context, object_list, with_initials=True, by_author=False, choice
                 last_initial = initial
                 names.append((obj.author_str() if by_author else initial, []))
         names[-1][1].append(obj)
                 last_initial = initial
                 names.append((obj.author_str() if by_author else initial, []))
         names[-1][1].append(obj)
-    return locals()
-
+    return {
+        'paged': paged,
+        'names': names,
+        'initial_blocks': initial_blocks,
+        'book': book,
+        'list_type': list_type,
+        'choice': choice,
+    }
 
 
 # TODO: These are no longer just books.
 @register.inclusion_tag('catalogue/related_books.html', takes_context=True)
 def related_books(context, instance, limit=6, random=1, taken=0):
 
 
 # TODO: These are no longer just books.
 @register.inclusion_tag('catalogue/related_books.html', takes_context=True)
 def related_books(context, instance, limit=6, random=1, taken=0):
-    limit = limit - taken
+    limit -= taken
     max_books = limit - random
     is_picture = isinstance(instance, Picture)
 
     max_books = limit - random
     is_picture = isinstance(instance, Picture)
 
@@ -404,17 +430,14 @@ def related_books(context, instance, limit=6, random=1, taken=0):
 def download_audio(book, daisy=True):
     links = []
     if book.has_media('mp3'):
 def download_audio(book, daisy=True):
     links = []
     if book.has_media('mp3'):
-        links.append("<a href='%s'>%s</a>" %
-            (reverse('download_zip_mp3', args=[book.slug]),
-                BookMedia.formats['mp3'].name))
+        links.append("<a href='%s'>%s</a>" % (
+            reverse('download_zip_mp3', args=[book.slug]), BookMedia.formats['mp3'].name))
     if book.has_media('ogg'):
     if book.has_media('ogg'):
-        links.append("<a href='%s'>%s</a>" %
-            (reverse('download_zip_ogg', args=[book.slug]),
-                BookMedia.formats['ogg'].name))
+        links.append("<a href='%s'>%s</a>" % (
+            reverse('download_zip_ogg', args=[book.slug]), BookMedia.formats['ogg'].name))
     if daisy and book.has_media('daisy'):
         for dsy in book.get_media('daisy'):
     if daisy and book.has_media('daisy'):
         for dsy in book.get_media('daisy'):
-            links.append("<a href='%s'>%s</a>" %
-                (dsy.file.url, BookMedia.formats['daisy'].name))
+            links.append("<a href='%s'>%s</a>" % (dsy.file.url, BookMedia.formats['daisy'].name))
     return "".join(links)
 
 
     return "".join(links)
 
 
@@ -485,3 +508,10 @@ def choose_fragment(request, book_id=None, tag_ids=None, unless=False):
         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
         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
+
+
+@register.filter
+def strip_tag(html, tag_name):
+    # docelowo może być warto zainstalować BeautifulSoup do takich rzeczy
+    import re
+    return re.sub(r"<.?%s\b[^>]*>" % tag_name, "", html)