+def book_html(request, pk, rev_pk=None, preview=False):
+ from librarian.document import Document as SST
+ from librarian.formats.html import HtmlFormat
+
+ doc = get_object_or_404(Document, pk=pk, deleted=False)
+
+ try:
+ published_revision = doc.publish_log.all()[0].revision
+ except IndexError:
+ published_revision = None
+
+ if rev_pk is None:
+ if preview:
+ revision = doc.revision
+ else:
+ if published_revision is not None:
+ revision = published_revision
+ else:
+ # No published version, fallback to preview mode.
+ preview = True
+ revision = doc.revision
+ else:
+ revision = get_object_or_404(Revision, pk=rev_pk)
+
+ was_published = revision == published_revision or doc.publish_log.filter(revision=revision).exists()
+
+ sst = SST.from_string(revision.materialize())
+ html = HtmlFormat(sst).build(files_path='http://%s/media/dynamic/uploads/%s/' % (request.get_host(), pk)).get_string()
+
+ # response = http.HttpResponse(html, content_type='text/html', mimetype='text/html')
+ # return response
+ # book_themes = {}
+ # for fragment in book.fragments.all().iterator():
+ # for theme in fragment.tags.filter(category='theme').iterator():
+ # book_themes.setdefault(theme, []).append(fragment)
+
+ # book_themes = book_themes.items()
+ # book_themes.sort(key=lambda s: s[0].sort_key)
+ return render(request, 'catalogue/book_text.html', {
+ 'doc': doc,
+ 'preview': preview,
+ 'revision': revision,
+ 'published_revision': published_revision,
+ 'specific': rev_pk is not None,
+ 'html': html,
+ 'can_edit': doc.can_edit(request.user) if doc else None,
+ 'was_published': was_published,
+ })
+
+
+@never_cache
+def book_pdf(request, pk, rev_pk):
+ from librarian.utils import Context
+ from librarian.document import Document as SST
+ from librarian.formats.pdf import PdfFormat
+
+ doc = get_object_or_404(Document, pk=pk)
+ rev = get_object_or_404(Revision, pk=rev_pk)
+ # Test
+
+ sst = SST.from_string(rev.materialize())
+
+ ctx = Context(
+ files_path = 'http://%s/media/dynamic/uploads/%s/' % (request.get_host(), pk),
+ source_url = 'http://%s%s' % (request.get_host(), reverse('catalogue_html', args=[doc.pk])),
+ )
+ if doc.owner_organization is not None and doc.owner_organization.logo:
+ ctx.cover_logo = 'http://%s%s' %(request.get_host(), doc.owner_organization.logo.url)
+ pdf_file = PdfFormat(sst).build(ctx)
+
+ from catalogue.ebook_utils import serve_file
+ return serve_file(pdf_file.get_filename(),
+ '%d.pdf' % doc.pk, 'application/pdf')
+
+
+@never_cache
+def book_epub(request, slug):
+ book = get_object_or_404(Book, slug=slug)
+ if not book.accessible(request):
+ return HttpResponseForbidden("Not authorized.")
+
+ # TODO: move to celery
+ doc = book.wldocument()
+ # TODO: error handling
+ epub = doc.as_epub().get_string()
+ response = HttpResponse(mimetype='application/epub+zip')
+ response['Content-Disposition'] = 'attachment; filename=%s' % book.slug + '.epub'
+ response.write(epub)