X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/21cd47e315b2e86edeff93bac5d1eca5b5d2c428..fbb8f42993d02108b506028dc85466a0541be359:/src/documents/views.py diff --git a/src/documents/views.py b/src/documents/views.py index 05f8853f..905e885b 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -5,7 +5,7 @@ from collections import defaultdict from datetime import datetime, date, timedelta import logging import os -from urllib.parse import unquote, urlsplit, urlunsplit +from urllib.parse import quote_plus, unquote, urlsplit, urlunsplit from django.conf import settings from django.contrib import auth @@ -19,12 +19,12 @@ from django.http import Http404, HttpResponse, HttpResponseForbidden from django.http.response import HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.utils.encoding import iri_to_uri -from django.utils.http import urlquote_plus -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.decorators.http import require_POST from django_cas_ng.decorators import user_passes_test -from apiclient import NotAuthorizedError +from librarian import epubcheck +from apiclient import api_call, NotAuthorizedError from . import forms from . import helpers from .helpers import active_tab @@ -66,9 +66,17 @@ def my(request): key=lambda x: x[1]['time'], reverse=True) for k, v in last_books: v['time'] = datetime.fromtimestamp(v['time']) + try: + resp = api_call(request.user, 'username/') + except NotAuthorizedError: + wllogin = None + else: + wllogin = resp['username'] + return render(request, 'documents/my_page.html', { 'last_books': last_books, "logout_to": '/', + "wllogin": wllogin, }) @@ -100,7 +108,7 @@ def activity(request, isodate=None): @never_cache def logout_then_redirect(request): auth.logout(request) - return http.HttpResponseRedirect(urlquote_plus(request.GET.get('next', '/'), safe='/?=')) + return http.HttpResponseRedirect(quote_plus(request.GET.get('next', '/'), safe='/?=')) @permission_required('documents.add_book') @@ -263,6 +271,7 @@ def book_html(request, slug): return render(request, 'documents/book_text.html', locals()) +@login_required @never_cache def book_pdf(request, slug, mobile=False): book = get_object_or_404(Book, slug=slug) @@ -273,12 +282,13 @@ def book_pdf(request, slug, mobile=False): 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) + pdf_file = doc.as_pdf(cover=True, base_url=request.build_absolute_uri(book.gallery_path()), customizations=customizations) from .ebook_utils import serve_file return serve_file(pdf_file.get_filename(), book.slug + '.pdf', 'application/pdf') +@login_required @never_cache def book_epub(request, slug): book = get_object_or_404(Book, slug=slug) @@ -286,15 +296,50 @@ def book_epub(request, slug): return HttpResponseForbidden("Not authorized.") # TODO: move to celery - doc = book.wldocument() + doc = book.wldocument(librarian2=True) # TODO: error handling - epub = doc.as_epub(ilustr_path=book.gallery_path()).get_bytes() + + from librarian.builders import EpubBuilder + epub = EpubBuilder( + base_url='file://' + book.gallery_path() + '/', + debug=True + ).build(doc).get_bytes() response = HttpResponse(content_type='application/epub+zip') response['Content-Disposition'] = 'attachment; filename=%s' % book.slug + '.epub' response.write(epub) return response +@login_required +@never_cache +def book_epubcheck(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(librarian2=True) + # TODO: error handling + + from librarian.builders import EpubBuilder + epub = EpubBuilder( + base_url='file://' + book.gallery_path() + '/', + debug=True + ).build(doc) + fname = epub.get_filename() + + messages = epubcheck.epubcheck(fname) + for message in messages: + for location in message.get('locations', []): + if 'wl_chunk' in location: + location['wl_chunk'] = book[location['wl_chunk']] + return render(request, 'documents/book_epubcheck.html', { + 'messages': messages, + 'book': book, + }) + + +@login_required @never_cache def book_mobi(request, slug): book = get_object_or_404(Book, slug=slug) @@ -302,9 +347,12 @@ def book_mobi(request, slug): return HttpResponseForbidden("Not authorized.") # TODO: move to celery - doc = book.wldocument() + doc = book.wldocument(librarian2=True) # TODO: error handling - mobi = doc.as_mobi(ilustr_path=book.gallery_path()).get_bytes() + from librarian.builders import MobiBuilder + mobi = MobiBuilder( + base_url='file://' + book.gallery_path() + '/' + ).build(doc).get_bytes() response = HttpResponse(content_type='application/x-mobipocket-ebook') response['Content-Disposition'] = 'attachment; filename=%s' % book.slug + '.mobi' response.write(mobi) @@ -345,8 +393,21 @@ def book(request, slug): publish_error = book.publishable_error() publishable = publish_error is None + stats = None + try: + doc = book.wldocument(librarian2=True) + except: + doc = None + else: + try: + stats = doc.get_statistics() + except: + pass + return render(request, "documents/book_detail.html", { "book": book, + "doc": doc, + "stats": stats, "publishable": publishable, "publishable_error": publish_error, "form": form, @@ -437,7 +498,7 @@ def chunk_edit(request, slug, chunk): form.save() go_next = request.GET.get('next', None) if go_next: - go_next = urlquote_plus(unquote(iri_to_uri(go_next)), safe='/?=&') + go_next = quote_plus(unquote(iri_to_uri(go_next)), safe='/?=&') else: go_next = doc.book.get_absolute_url() return http.HttpResponseRedirect(go_next) @@ -448,7 +509,7 @@ def chunk_edit(request, slug, chunk): if referer: parts = urlsplit(referer) parts = ['', ''] + list(parts[2:]) - go_next = urlquote_plus(urlunsplit(parts)) + go_next = quote_plus(urlunsplit(parts)) else: go_next = '' @@ -572,16 +633,18 @@ def publish(request, slug): if form.is_valid(): days = form.cleaned_data['days'] beta = form.cleaned_data['beta'] + hidden = form.cleaned_data['hidden'] else: days = 0 beta = False + hidden = False book = get_object_or_404(Book, slug=slug) if not book.accessible(request): return HttpResponseForbidden("Not authorized.") try: protocol = 'https://' if request.is_secure() else 'http://' - book.publish(request.user, host=protocol + request.get_host(), days=days, beta=beta) + book.publish(request.user, host=protocol + request.get_host(), days=days, beta=beta, hidden=hidden) except NotAuthorizedError: return http.HttpResponseRedirect(reverse('apiclient_oauth' if not beta else 'apiclient_beta_oauth')) except BaseException as e: @@ -625,7 +688,7 @@ class GalleryView(UploadView): return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery) -def active_users_list(request): +def active_users_list(request, csv=False): year = int(request.GET.get('y', date.today().year)) by_user = defaultdict(lambda: 0) by_email = defaultdict(lambda: 0) @@ -650,10 +713,24 @@ def active_users_list(request): for email, count in by_email.items(): active_users.append((email, names_by_email[email], count)) active_users.sort(key=lambda x: -x[2]) - return render(request, 'documents/active_users_list.html', { - 'users': active_users, - 'year': year, - }) + if csv: + return http.HttpResponse( + '\n'.join(( + ','.join( + (str(x[2]), x[0], ','.join(x[1])) + ) + for x in active_users + )), + content_type='text/csv', + headers={ + 'Content-Disposition': f'attachment; filename=redakcja-{year}.csv', + } + ) + else: + return render(request, 'documents/active_users_list.html', { + 'users': active_users, + 'year': year, + }) @user_passes_test(lambda u: u.is_superuser)