-@permission_required('catalogue.add_book')
-@active_tab('upload')
-def upload(request):
- if request.method == "POST":
- form = forms.DocumentsUploadForm(request.POST, request.FILES)
- if form.is_valid():
- from slugify import slugify
-
- if request.user.is_authenticated:
- creator = request.user
- else:
- creator = None
-
- zip = form.cleaned_data['zip']
- skipped_list = []
- ok_list = []
- error_list = []
- slugs = {}
- existing = [book.slug for book in Book.objects.all()]
- for filename in zip.namelist():
- if filename[-1] == '/':
- continue
- title = os.path.basename(filename)[:-4]
- slug = slugify(title)
- if not (slug and filename.endswith('.xml')):
- skipped_list.append(filename)
- elif slug in slugs:
- error_list.append((filename, slug, _('Slug already used for %s' % slugs[slug])))
- elif slug in existing:
- error_list.append((filename, slug, _('Slug already used in repository.')))
- else:
- try:
- zip.read(filename).decode('utf-8') # test read
- ok_list.append((filename, slug, title))
- except UnicodeDecodeError:
- error_list.append((filename, title, _('File should be UTF-8 encoded.')))
- slugs[slug] = filename
-
- if not error_list:
- for filename, slug, title in ok_list:
- book = Book.create(
- text=zip.read(filename).decode('utf-8'),
- creator=creator,
- slug=slug,
- title=title,
- )
-
- return render(request, "catalogue/document_upload.html", {
- "form": form,
- "ok_list": ok_list,
- "skipped_list": skipped_list,
- "error_list": error_list,
-
- "logout_to": '/',
- })
- else:
- form = forms.DocumentsUploadForm()
-
- return render(request, "catalogue/document_upload.html", {
- "form": form,
-
- "logout_to": '/',
- })
-
-
-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,
- })