-def serve_xml(request, book, slug):
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
- xml = book.materialize(publishable=True)
- response = http.HttpResponse(xml, content_type='application/xml')
- response['Content-Disposition'] = 'attachment; filename=%s.xml' % slug
- return response
-
-
-@never_cache
-def book_xml(request, slug):
- book = get_object_or_404(Book, slug=slug)
- return serve_xml(request, book, slug)
-
-
-@never_cache
-def book_xml_dc(request, slug):
- book = get_object_or_404(Book, dc_slug=slug)
- return serve_xml(request, book, slug)
-
-
-@never_cache
-def book_txt(request, slug):
- book = get_object_or_404(Book, slug=slug)
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
-
- doc = book.wldocument()
- text = doc.as_text().get_bytes()
- response = http.HttpResponse(text, content_type='text/plain')
- response['Content-Disposition'] = 'attachment; filename=%s.txt' % slug
- return response
-
-
-@never_cache
-def book_html(request, slug):
- book = get_object_or_404(Book, slug=slug)
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
-
- doc = book.wldocument(parse_dublincore=False)
- html = doc.as_html(options={'gallery': "'%s'" % book.gallery_url()})
-
- html = html.get_bytes() if html is not None else ''
- # response = http.HttpResponse(html, content_type='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', locals())
-
-
-@never_cache
-def book_pdf(request, slug, mobile=False):
- 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
- customizations = ['26pt', 'nothemes', 'nomargins', 'notoc'] if mobile else None
- pdf_file = doc.as_pdf(cover=True, ilustr_path=book.gallery_path(), customizations=customizations)
- from catalogue.ebook_utils import serve_file
- return serve_file(pdf_file.get_filename(),
- book.slug + '.pdf', '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(ilustr_path=book.gallery_path()).get_bytes()
- response = HttpResponse(content_type='application/epub+zip')
- response['Content-Disposition'] = 'attachment; filename=%s' % book.slug + '.epub'
- response.write(epub)
- return response
-
-
-@never_cache
-def book_mobi(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
- mobi = doc.as_mobi(ilustr_path=book.gallery_path()).get_bytes()
- response = HttpResponse(content_type='application/x-mobipocket-ebook')
- response['Content-Disposition'] = 'attachment; filename=%s' % book.slug + '.mobi'
- response.write(mobi)
- return response
-
-
-@never_cache
-def revision(request, slug, chunk=None):
- try:
- doc = Chunk.get(slug, chunk)
- except (Chunk.MultipleObjectsReturned, Chunk.DoesNotExist):
- raise Http404
- if not doc.book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
- return http.HttpResponse(str(doc.revision()))
-
-
-def book(request, slug):
- book = get_object_or_404(Book, slug=slug)
- if not book.accessible(request):
- return HttpResponseForbidden("Not authorized.")
-
- if request.user.has_perm('catalogue.change_book'):
- if request.method == "POST":
- form = forms.BookForm(request.POST, instance=book)
- if form.is_valid():
- form.save()
- return http.HttpResponseRedirect(book.get_absolute_url())
- else:
- form = forms.BookForm(instance=book)
- publish_options_form = forms.PublishOptionsForm()
- editable = True
- else:
- form = forms.ReadonlyBookForm(instance=book)
- publish_options_form = forms.PublishOptionsForm()
- editable = False
-
- publish_error = book.publishable_error()
- publishable = publish_error is None
-
- return render(request, "catalogue/book_detail.html", {
- "book": book,
- "publishable": publishable,
- "publishable_error": publish_error,
- "form": form,
- "publish_options_form": publish_options_form,
- "editable": editable,
- })