+
+
+@register.inclusion_tag('catalogue/related_books.html', takes_context=True)
+def related_books(context, book, limit=6, random=1, taken=0):
+ limit = limit - taken
+ 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,
+ }
+
+
+@register.inclusion_tag('catalogue/menu.html')
+def catalogue_menu():
+ return {'categories': [
+ ('author', _('Authors'), 'autorzy'),
+ ('genre', _('Genres'), 'gatunki'),
+ ('kind', _('Kinds'), 'rodzaje'),
+ ('epoch', _('Epochs'), 'epoki'),
+ ('theme', _('Themes'), 'motywy'),
+ ]}
+
+
+@register.simple_tag
+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))
+ if book.has_media('ogg'):
+ 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'):
+ links.append("<a href='%s'>%s</a>" %
+ (dsy.file.url, BookMedia.formats['daisy'].name))
+ return ", ".join(links)
+
+
+@register.inclusion_tag("catalogue/snippets/custom_pdf_link_li.html")
+def custom_pdf_link_li(book):
+ return {
+ 'book': book,
+ 'NO_CUSTOM_PDF': settings.NO_CUSTOM_PDF,
+ }
+
+
+@register.inclusion_tag("catalogue/snippets/license_icon.html")
+def license_icon(license_url):
+ """Creates a license icon, if the license_url is known."""
+ known = LICENSES.get(license_url)
+ if known is None:
+ return {}
+ return {
+ "license_url": license_url,
+ "icon": "img/licenses/%s.png" % known['icon'],
+ "license_description": known['description'],
+ }
+
+
+@register.filter
+def class_name(obj):
+ return obj.__class__.__name__
+
+
+@register.simple_tag
+def source_name(url):
+ url = url.lstrip()
+ netloc = urlparse(url).netloc
+ if not netloc:
+ netloc = urlparse('http://' + url).netloc
+ if not netloc:
+ 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