X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/94bfc24e8c353a678b72f37c86adf9a4a7a78ffd..263e2a71c685149e406d7bee1de93b362970a88f:/apps/catalogue/views.py diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index b61d5e803..d0896a2b3 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# import tempfile import zipfile +import sys +import pprint +import traceback from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 @@ -95,7 +101,12 @@ def tagged_object_list(request, tags=''): queryset_or_model=model, tags=tags, template_name='catalogue/tagged_object_list.html', - extra_context = {'categories': categories, 'shelf_is_set': shelf_is_set, 'user_is_owner': user_is_owner }, + extra_context = { + 'categories': categories, + 'shelf_is_set': shelf_is_set, + 'user_is_owner': user_is_owner, + 'formats_form': forms.DownloadFormatsForm(), + }, ) @@ -248,6 +259,19 @@ def remove_from_shelf(request, shelf, book): return HttpResponse('Usunieto') +def collect_books(books): + """ + Returns all real books in collection. + """ + result = [] + for book in books: + if len(book.children.all()) == 0: + result.append(book) + else: + result += collect_books(book.children.all()) + return result + + @cache.never_cache def download_shelf(request, slug): """" @@ -256,31 +280,34 @@ def download_shelf(request, slug): be used for large dynamic PDF files. """ shelf = get_object_or_404(models.Tag, slug=slug, category='set') - + + formats = [] + form = forms.DownloadFormatsForm(request.GET) + if form.is_valid(): + formats = form.cleaned_data['formats'] + if len(formats) == 0: + formats = ['pdf', 'odt', 'txt', 'mp3', 'ogg'] + # Create a ZIP archive temp = temp = tempfile.TemporaryFile() archive = zipfile.ZipFile(temp, 'w') - # Collect all books to include in ZIP archive - def collect_books(books): - result = [] - for book in books: - if len(book.children.all()) == 0: - result.append(book) - else: - result += collect_books(book.children.all()) - return result - for book in collect_books(models.Book.tagged.with_all(shelf)): - if book.pdf_file: + if 'pdf' in formats and book.pdf_file: filename = book.pdf_file.path archive.write(filename, str('%s.pdf' % book.slug)) - if book.odt_file: + if 'odt' in formats and book.odt_file: filename = book.odt_file.path archive.write(filename, str('%s.odt' % book.slug)) - if book.txt_file: + if 'txt' in formats and book.txt_file: filename = book.txt_file.path archive.write(filename, str('%s.txt' % book.slug)) + if 'mp3' in formats and book.mp3_file: + filename = book.mp3_file.path + archive.write(filename, str('%s.mp3' % book.slug)) + if 'ogg' in formats and book.ogg_file: + filename = book.ogg_file.path + archive.write(filename, str('%s.ogg' % book.slug)) archive.close() response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed') @@ -292,6 +319,30 @@ def download_shelf(request, slug): return response +@cache.never_cache +def shelf_book_formats(request, shelf): + """" + Returns a list of formats of books in shelf. + """ + shelf = get_object_or_404(models.Tag, slug=shelf, category='set') + + formats = {'pdf': False, 'odt': False, 'txt': False, 'mp3': False, 'ogg': False} + + for book in collect_books(models.Book.tagged.with_all(shelf)): + if book.pdf_file: + formats['pdf'] = True + if book.odt_file: + formats['odt'] = True + if book.txt_file: + formats['txt'] = True + if book.mp3_file: + formats['mp3'] = True + if book.ogg_file: + formats['ogg'] = True + + return HttpResponse(LazyEncoder().encode(formats)) + + @login_required @require_POST @cache.never_cache @@ -369,10 +420,13 @@ def import_book(request): """docstring for import_book""" book_import_form = forms.BookImportForm(request.POST, request.FILES) if book_import_form.is_valid(): - # try: - book_import_form.save() - # except: - # return HttpResponse("Error importing book: %r" % (sys.exc_info(),)) + try: + book_import_form.save() + except: + info = sys.exc_info() + exception = pprint.pformat(info[1]) + tb = '\n'.join(traceback.format_tb(info[2])) + return HttpResponse("An error occurred: %s\n\n%s" % (exception, tb), mimetype='text/plain') return HttpResponse("Book imported successfully") else: return HttpResponse("Error importing file: %r" % book_import_form.errors) \ No newline at end of file