Cop notes.
[wolnelektury.git] / src / catalogue / templatetags / catalogue_tags.py
index ef0ea5d..1a3e0aa 100644 (file)
@@ -8,13 +8,11 @@ from django.contrib.contenttypes.models import ContentType
 from django.conf import settings
 from django import template
 from django.template import Node, Variable, Template, Context
 from django.conf import settings
 from django import template
 from django.template import Node, Variable, Template, Context
-from django.core.urlresolvers import reverse
+from django.urls import reverse
 from django.utils.cache import add_never_cache_headers
 from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext as _
 
 from django.utils.cache import add_never_cache_headers
 from django.utils.safestring import mark_safe
 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 catalogue.helpers import get_audiobook_tags
 from catalogue.models import Book, BookMedia, Fragment, Tag, Source
 from catalogue.constants import LICENSES
@@ -44,8 +42,8 @@ def html_title_from_tags(tags):
     if len(tags) < 2:
         return title_from_tags(tags)
     template = Template("{{ category }}: <a href='{{ tag.get_absolute_url }}'>{{ tag.name }}</a>")
     if len(tags) < 2:
         return title_from_tags(tags)
     template = Template("{{ category }}: <a href='{{ tag.get_absolute_url }}'>{{ tag.name }}</a>")
-    return capfirst(",<br/>".join(
-        template.render(Context({'tag': tag, 'category': _(tag.category)})) for tag in tags))
+    return mark_safe(capfirst(",<br/>".join(
+        template.render(Context({'tag': tag, 'category': _(tag.category)})) for tag in tags)))
 
 
 def simple_title(tags):
 
 
 def simple_title(tags):
@@ -83,48 +81,48 @@ def title_from_tags(tags):
 
     self = split_tags(tags)
 
 
     self = split_tags(tags)
 
-    title = u''
+    title = ''
 
     # Specjalny przypadek oglądania wszystkich lektur na danej półce
     if len(self) == 1 and 'set' in self:
 
     # 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']
+        return '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:
 
     # 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(str(self['epoch']), u'miejscownik')
+        text = 'Twórczość w %s' % flection.get_case(str(self['epoch']), '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:
         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' % (
-            str(self['kind']), flection.get_case(str(self['author']), u'dopełniacz'))
+        text = '%s w twórczości %s' % (
+            str(self['kind']), flection.get_case(str(self['author']), 'dopełniacz'))
         return capfirst(text)
 
     # Przypadki ogólniejsze
     if 'theme' in self:
         return capfirst(text)
 
     # Przypadki ogólniejsze
     if 'theme' in self:
-        title += u'Motyw %s' % str(self['theme'])
+        title += 'Motyw %s' % str(self['theme'])
 
     if 'genre' in self:
         if 'theme' in self:
 
     if 'genre' in self:
         if 'theme' in self:
-            title += u' w %s' % flection.get_case(str(self['genre']), u'miejscownik')
+            title += ' w %s' % flection.get_case(str(self['genre']), 'miejscownik')
         else:
             title += str(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:
         else:
             title += str(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:
-                title += u' w %s ' % flection.get_case(str(self['kind']), u'miejscownik')
+                title += ' w %s ' % flection.get_case(str(self['kind']), 'miejscownik')
             else:
             else:
-                title += u' w twórczości '
+                title += ' w twórczości '
         else:
         else:
-            title += u'%s ' % str(self.get('kind', u'twórczość'))
+            title += '%s ' % str(self.get('kind', 'twórczość'))
 
     if 'author' in self:
 
     if 'author' in self:
-        title += flection.get_case(str(self['author']), u'dopełniacz')
+        title += flection.get_case(str(self['author']), 'dopełniacz')
     elif 'epoch' in self:
     elif 'epoch' in self:
-        title += flection.get_case(str(self['epoch']), u'dopełniacz')
+        title += flection.get_case(str(self['epoch']), 'dopełniacz')
 
     return capfirst(title)
 
 
     return capfirst(title)
 
@@ -277,7 +275,6 @@ class CatalogueURLNode(Node):
 
 # @register.inclusion_tag('catalogue/tag_list.html')
 def tag_list(tags, choices=None, category=None, list_type='books'):
 
 # @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 = []
 
@@ -382,7 +379,7 @@ def related_books(context, instance, limit=6, random=1, taken=0):
         # Reserve one spot for an image.
         max_books -= 1
 
         # Reserve one spot for an image.
         max_books -= 1
 
-    books_qs = Book.objects.all()
+    books_qs = Book.objects.filter(findable=True)
     if not is_picture:
         books_qs = books_qs.exclude(common_slug=instance.common_slug).exclude(ancestor=instance)
     books = Book.tagged.related_to(instance, books_qs)[:max_books]
     if not is_picture:
         books_qs = books_qs.exclude(common_slug=instance.common_slug).exclude(ancestor=instance)
     books = Book.tagged.related_to(instance, books_qs)[:max_books]
@@ -439,6 +436,11 @@ def license_icon(license_url):
     }
 
 
     }
 
 
+@register.simple_tag
+def license_locative(license_url, default):
+    return LICENSES.get(license_url, {}).get('locative', default)
+
+
 @register.filter
 def class_name(obj):
     return obj.__class__.__name__
 @register.filter
 def class_name(obj):
     return obj.__class__.__name__
@@ -456,35 +458,32 @@ def source_name(url):
     return source.name or netloc
 
 
     return source.name or netloc
 
 
-@ssi_variable(register, patch_response=[add_never_cache_headers])
-def catalogue_random_book(request, exclude_ids):
+@register.simple_tag
+def catalogue_random_book(exclude_ids):
     from .. import app_settings
     if random() < app_settings.RELATED_RANDOM_PICTURE_CHANCE:
         return None
     from .. import app_settings
     if random() < app_settings.RELATED_RANDOM_PICTURE_CHANCE:
         return None
-    queryset = Book.objects.exclude(pk__in=exclude_ids)
+    queryset = Book.objects.filter(findable=True).exclude(pk__in=exclude_ids)
     count = queryset.count()
     if count:
     count = queryset.count()
     if count:
-        return queryset[randint(0, count - 1)].pk
+        return queryset[randint(0, count - 1)]
     else:
         return None
 
 
     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()
+@register.simple_tag
+def choose_fragment(book=None, tag_ids=None):
+    if book is not None:
+        fragment = book.choose_fragment()
     else:
         if tag_ids is not None:
             tags = Tag.objects.filter(pk__in=tag_ids)
     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')
+            fragments = Fragment.tagged.with_all(tags).filter(book__findable=True).order_by().only('id')
         else:
         else:
-            fragments = Fragment.objects.all().order_by().only('id')
+            fragments = Fragment.objects.filter(book__findable=True).order_by().only('id')
         fragment_count = fragments.count()
         fragment = fragments[randint(0, fragment_count - 1)] if fragment_count 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
+    return fragment
 
 
 @register.filter
 
 
 @register.filter
@@ -502,3 +501,18 @@ def status(book, user):
         return 'preview'
     else:
         return 'closed'
         return 'preview'
     else:
         return 'closed'
+
+
+@register.inclusion_tag('catalogue/snippets/content_warning.html')
+def content_warning(book):
+    warnings_def = {
+        'wulgaryzmy': _('vulgar language'),
+    }
+    warnings = book.get_extra_info_json().get('content_warnings', [])
+    warnings = sorted(
+        warnings_def.get(w, w)
+        for w in warnings
+    )
+    return {
+        "warnings": warnings
+    }