+def download_zip(request, format, slug=None):
+ url = None
+ if format in models.Book.ebook_formats:
+ url = models.Book.zip_format(format)
+ elif format in ('mp3', 'ogg') and slug is not None:
+ book = get_object_or_404(models.Book, slug=slug)
+ url = book.zip_audiobooks(format)
+ else:
+ raise Http404('No format specified for zip package')
+ return HttpResponseRedirect(urlquote_plus(settings.MEDIA_URL + url, safe='/?='))
+
+
+class CustomPDFFormView(AjaxableFormView):
+ form_class = forms.CustomPDFForm
+ title = ugettext_lazy('Download custom PDF')
+ submit = ugettext_lazy('Download')
+ honeypot = True
+
+ def __call__(self, *args, **kwargs):
+ if settings.NO_CUSTOM_PDF:
+ raise Http404('Custom PDF is disabled')
+ return super(CustomPDFFormView, self).__call__(*args, **kwargs)
+
+ def form_args(self, request, obj):
+ """Override to parse view args and give additional args to the form."""
+ return (obj,), {}
+
+ def get_object(self, request, slug, *args, **kwargs):
+ return get_object_or_404(models.Book, slug=slug)
+
+ def context_description(self, request, obj):
+ return obj.pretty_title()
+
+
+####
+# Includes
+####
+
+
+@ssi_included
+def book_mini(request, pk, with_link=True):
+ book = get_object_or_404(models.Book, pk=pk)
+ author_str = ", ".join(tag.name
+ for tag in book.tags.filter(category='author'))
+ return render(request, 'catalogue/book_mini_box.html', {
+ 'book': book,
+ 'author_str': author_str,
+ 'with_link': with_link,
+ 'show_lang': book.language_code() != settings.LANGUAGE_CODE,
+ })
+
+
+@ssi_included(get_ssi_vars=lambda pk: (lambda ipk: (
+ ('ssify.get_csrf_token',),
+ ('social_tags.likes_book', (ipk,)),
+ ('social_tags.book_shelf_tags', (ipk,)),
+ ))(ssi_expect(pk, int)))
+def book_short(request, pk):
+ book = get_object_or_404(models.Book, pk=pk)
+ stage_note, stage_note_url = book.stage_note()
+
+ return render(request, 'catalogue/book_short.html', {
+ 'book': book,
+ 'has_audio': book.has_media('mp3'),
+ 'main_link': book.get_absolute_url(),
+ 'parents': book.parents(),
+ 'tags': split_tags(book.tags.exclude(category__in=('set', 'theme'))),
+ 'show_lang': book.language_code() != settings.LANGUAGE_CODE,
+ 'stage_note': stage_note,
+ 'stage_note_url': stage_note_url,
+ })
+
+
+@ssi_included(get_ssi_vars=lambda pk: book_short.get_ssi_vars(pk) +
+ (lambda ipk: (
+ ('social_tags.choose_cite', [ipk]),
+ ('catalogue_tags.choose_fragment', [ipk], {
+ 'unless': V('social_tags.choose_cite', [ipk])}),
+ ))(ssi_expect(pk, int)))
+def book_wide(request, pk):
+ book = get_object_or_404(models.Book, pk=pk)
+ stage_note, stage_note_url = book.stage_note()
+ extra_info = book.extra_info
+
+ return render(request, 'catalogue/book_wide.html', {
+ 'book': book,
+ 'has_audio': book.has_media('mp3'),
+ 'parents': book.parents(),
+ 'tags': split_tags(book.tags.exclude(category__in=('set', 'theme'))),
+ 'show_lang': book.language_code() != settings.LANGUAGE_CODE,
+ 'stage_note': stage_note,
+ 'stage_note_url': stage_note_url,
+
+ 'main_link': reverse('book_text', args=[book.slug]) if book.html_file else None,
+ 'extra_info': extra_info,
+ 'hide_about': extra_info.get('about', '').startswith('http://wiki.wolnepodreczniki.pl'),
+ 'themes': book.related_themes(),
+ })
+
+
+@ssi_included
+def fragment_short(request, pk):
+ fragment = get_object_or_404(models.Fragment, pk=pk)
+ return render(request, 'catalogue/fragment_short.html',
+ {'fragment': fragment})
+
+
+@ssi_included
+def fragment_promo(request, pk):
+ fragment = get_object_or_404(models.Fragment, pk=pk)
+ return render(request, 'catalogue/fragment_promo.html', {
+ 'fragment': fragment
+ })