X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/e0164e6ca0588a270b77d892702e54ef62c31de2..3438c79639fca7268c397dd3fcfdcf9ca5014a09:/apps/catalogue/views.py diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 8169ad739..13bb5ac18 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -28,7 +28,8 @@ from django.views.generic.list_detail import object_list from catalogue import models from catalogue import forms -from catalogue.utils import split_tags, AttachmentHttpResponse, create_custom_pdf +from catalogue.utils import split_tags, AttachmentHttpResponse, async_build_pdf +from catalogue.tasks import touch_tag from pdcounter import models as pdcounter_models from pdcounter import views as pdcounter_views from suggest.forms import PublishingSuggestForm @@ -55,19 +56,17 @@ class JSONResponse(HttpResponse): super(JSONResponse, self).__init__(data, mimetype="application/json", **kwargs) -def main_page(request): - if request.user.is_authenticated(): - shelves = models.Tag.objects.filter(category='set', user=request.user) - new_set_form = forms.NewSetForm() - - tags = models.Tag.objects.exclude(category__in=('set', 'book')) +def catalogue(request): + tags = models.Tag.objects.exclude( + category__in=('set', 'book')).exclude(book_count=0) + tags = list(tags) for tag in tags: - tag.count = tag.get_count() + tag.count = tag.book_count categories = split_tags(tags) fragment_tags = categories.get('theme', []) form = forms.SearchForm() - return render_to_response('catalogue/main_page.html', locals(), + return render_to_response('catalogue/catalogue.html', locals(), context_instance=RequestContext(request)) @@ -204,9 +203,13 @@ def tagged_object_list(request, tags=''): ) -def book_fragments(request, book_slug, theme_slug): - book = get_object_or_404(models.Book, slug=book_slug) - book_tag = get_object_or_404(models.Tag, slug='l-' + book_slug, category='book') +def book_fragments(request, book, theme_slug): + kwargs = models.Book.split_urlid(book) + if kwargs is None: + raise Http404 + book = get_object_or_404(models.Book, **kwargs) + + book_tag = book.book_tag() theme = get_object_or_404(models.Tag, slug=theme_slug, category='theme') fragments = models.Fragment.tagged.with_all([book_tag, theme]) @@ -215,12 +218,15 @@ def book_fragments(request, book_slug, theme_slug): context_instance=RequestContext(request)) -def book_detail(request, slug): +def book_detail(request, book): + kwargs = models.Book.split_urlid(book) + if kwargs is None: + raise Http404 try: - book = models.Book.objects.get(slug=slug) + book = models.Book.objects.get(**kwargs) except models.Book.DoesNotExist: - return pdcounter_views.book_stub_detail(request, slug) - + return pdcounter_views.book_stub_detail(request, kwargs['slug']) + book_tag = book.book_tag() tags = list(book.tags.filter(~Q(category='set'))) categories = split_tags(tags) @@ -259,8 +265,12 @@ def book_detail(request, slug): context_instance=RequestContext(request)) -def book_text(request, slug): - book = get_object_or_404(models.Book, slug=slug) +def book_text(request, book): + kwargs = models.Book.split_fileid(book) + if kwargs is None: + raise Http404 + book = get_object_or_404(models.Book, **kwargs) + if not book.has_html_file(): raise Http404 book_themes = {} @@ -392,7 +402,7 @@ def books_starting_with(prefix): def find_best_matches(query, user=None): - """ Finds a Book, Tag, BookStub or Author best matching a query. + """ Finds a models.Book, Tag, models.BookStub or Author best matching a query. Returns a with: - zero elements when nothing is found, @@ -494,11 +504,15 @@ def user_shelves(request): context_instance=RequestContext(request)) @cache.never_cache -def book_sets(request, slug): +def book_sets(request, book): if not request.user.is_authenticated(): return HttpResponse(_('
To maintain your shelves you need to be logged in.
')) - book = get_object_or_404(models.Book, slug=slug) + kwargs = models.Book.split_urlid(book) + if kwargs is None: + raise Http404 + book = get_object_or_404(models.Book, **kwargs) + user_sets = models.Tag.objects.filter(category='set', user=request.user) book_sets = book.tags.filter(category='set', user=request.user) @@ -509,12 +523,10 @@ def book_sets(request, slug): new_shelves = [models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] for shelf in [shelf for shelf in old_shelves if shelf not in new_shelves]: - shelf.book_count = None - shelf.save() + touch_tag(shelf) for shelf in [shelf for shelf in new_shelves if shelf not in old_shelves]: - shelf.book_count = None - shelf.save() + touch_tag(shelf) book.tags = new_shelves + list(book.tags.filter(~Q(category='set') | ~Q(user=request.user))) if request.is_ajax(): @@ -533,14 +545,16 @@ def book_sets(request, slug): @require_POST @cache.never_cache def remove_from_shelf(request, shelf, book): - book = get_object_or_404(models.Book, slug=book) + kwargs = models.Book.split_urlid(book) + if kwargs is None: + raise Http404 + book = get_object_or_404(models.Book, **kwargs) + shelf = get_object_or_404(models.Tag, slug=shelf, category='set', user=request.user) if shelf in book.tags: models.Tag.objects.remove_tag(book, shelf) - - shelf.book_count = None - shelf.save() + touch_tag(shelf) return HttpResponse(_('Book was successfully removed from the shelf')) else: @@ -578,31 +592,18 @@ def download_shelf(request, slug): if form.is_valid(): formats = form.cleaned_data['formats'] if len(formats) == 0: - formats = ['pdf', 'epub', 'mobi', 'odt', 'txt'] + formats = models.Book.ebook_formats # Create a ZIP archive temp = tempfile.TemporaryFile() archive = zipfile.ZipFile(temp, 'w') - already = set() for book in collect_books(models.Book.tagged.with_all(shelf)): - if 'pdf' in formats and book.pdf_file: - filename = book.pdf_file.path - archive.write(filename, str('%s.pdf' % book.slug)) - if 'mobi' in formats and book.mobi_file: - filename = book.mobi_file.path - archive.write(filename, str('%s.mobi' % book.slug)) - if book.root_ancestor not in already and 'epub' in formats and book.root_ancestor.epub_file: - filename = book.root_ancestor.epub_file.path - archive.write(filename, str('%s.epub' % book.root_ancestor.slug)) - already.add(book.root_ancestor) - if 'odt' in formats and book.has_media("odt"): - for file in book.get_media("odt"): - filename = file.file.path - archive.write(filename, str('%s.odt' % slughifi(file.name))) - if 'txt' in formats and book.txt_file: - filename = book.txt_file.path - archive.write(filename, str('%s.txt' % book.slug)) + fileid = book.fileid() + for ebook_format in models.Book.ebook_formats: + if ebook_format in formats and book.has_media(ebook_format): + filename = book.get_media(ebook_format).path + archive.write(filename, str('%s.%s' % (fileid, ebook_format))) archive.close() response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed') @@ -621,20 +622,14 @@ def shelf_book_formats(request, shelf): """ shelf = get_object_or_404(models.Tag, slug=shelf, category='set') - formats = {'pdf': False, 'epub': False, 'mobi': False, 'odt': False, 'txt': False} + formats = {} + for ebook_format in models.Book.ebook_formats: + formats[ebook_format] = False for book in collect_books(models.Book.tagged.with_all(shelf)): - if book.pdf_file: - formats['pdf'] = True - if book.root_ancestor.epub_file: - formats['epub'] = True - if book.mobi_file: - formats['mobi'] = True - if book.txt_file: - formats['txt'] = True - for format in ('odt',): - if book.has_media(format): - formats[format] = True + for ebook_format in models.Book.ebook_formats: + if book.has_media(ebook_format): + formats[ebook_format] = True return HttpResponse(LazyEncoder().encode(formats)) @@ -754,32 +749,36 @@ def tag_info(request, id): return HttpResponse(tag.description) -def download_zip(request, format, slug): +def download_zip(request, format, book=None): + kwargs = models.Book.split_fileid(book) + url = None - if format in ('pdf', 'epub', 'mobi'): + if format in models.Book.ebook_formats: url = models.Book.zip_format(format) - elif format == 'audiobook' and slug is not None: - book = models.Book.objects.get(slug=slug) + elif format == 'audiobook' and kwargs is not None: + book = get_object_or_404(models.Book, **kwargs) url = book.zip_audiobooks() else: raise Http404('No format specified for zip package') return HttpResponseRedirect(urlquote_plus(settings.MEDIA_URL + url, safe='/?=')) -def download_custom_pdf(request, slug): - book = models.Book.objects.get(slug=slug) +def download_custom_pdf(request, book_fileid): + kwargs = models.Book.split_fileid(book_fileid) + if kwargs is None: + raise Http404 + book = get_object_or_404(models.Book, **kwargs) + if request.method == 'GET': form = forms.CustomPDFForm(request.GET) if form.is_valid(): cust = form.customizations - h = hash(tuple(cust)) - pdf_name = '%s-custom-%s' % (book.slug, h) - pdf_file = path.join(settings.MEDIA_ROOT, models.get_dynamic_path(None, pdf_name, ext='pdf')) - + pdf_file = models.get_customized_pdf_path(book, cust) + if not path.exists(pdf_file): - result = create_custom_pdf.delay(book.id, cust, pdf_name) + result = async_build_pdf.delay(book.id, cust, pdf_file) result.wait() - return AttachmentHttpResponse(file_name=("%s.pdf" % book.slug), file_path=pdf_file, mimetype="application/pdf") + return AttachmentHttpResponse(file_name=("%s.pdf" % book_fileid), file_path=pdf_file, mimetype="application/pdf") else: raise Http404(_('Incorrect customization options for PDF')) else: