X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/d99d71844b7b97800dcab7cbb81c3a4185acbb48..f030289137a031a2e78f9aadb9ce075d8de76649:/apps/catalogue/views.py diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 124cd9313..c5eb0c7cc 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -10,15 +10,14 @@ import pprint import traceback import re import itertools -from operator import itemgetter from datetime import datetime from django.conf import settings from django.template import RequestContext from django.shortcuts import render_to_response, get_object_or_404 -from django.http import HttpResponse, HttpResponseRedirect, Http404 +from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect from django.core.urlresolvers import reverse -from django.db.models import Q +from django.db.models import Count, Sum, Q from django.contrib.auth.decorators import login_required, user_passes_test from django.utils.datastructures import SortedDict from django.views.decorators.http import require_POST @@ -31,13 +30,14 @@ from django.utils.http import urlquote_plus from django.views.decorators import cache from django.utils.translation import ugettext as _ from django.views.generic.list_detail import object_list -from django.template.defaultfilters import slugify + from catalogue import models from catalogue import forms from catalogue.utils import split_tags from newtagging import views as newtagging_views from pdcounter import models as pdcounter_models from pdcounter import views as pdcounter_views +from suggest.forms import PublishingSuggestForm from slughifi import slughifi @@ -119,15 +119,45 @@ def book_list(request, filter=None, template_name='catalogue/book_list.html'): def audiobook_list(request): - return book_list(request, Q(medias__type='mp3') | Q(medias__type='ogg'), + return book_list(request, Q(media__type='mp3') | Q(media__type='ogg'), template_name='catalogue/audiobook_list.html') def daisy_list(request): - return book_list(request, Q(medias__type='daisy'), + return book_list(request, Q(media__type='daisy'), template_name='catalogue/daisy_list.html') +def counters(request): + form = forms.SearchForm() + + books = models.Book.objects.count() + books_nonempty = models.Book.objects.exclude(html_file='').count() + books_empty = models.Book.objects.filter(html_file='').count() + books_root = models.Book.objects.filter(parent=None).count() + + media = models.BookMedia.objects.count() + media_types = models.BookMedia.objects.values('type').\ + annotate(count=Count('type')).\ + order_by('type') + for mt in media_types: + size = 0 + deprecated = missing_project = 0 + for b in models.BookMedia.objects.filter(type=mt['type']): + size += b.file.size + if b.type in ('mp3', 'ogg'): + if not b.source_sha1: + deprecated += 1 + if not 'project' in b.get_extra_info_value(): + missing_project += 1 + mt['size'] = size + mt['deprecated'] = deprecated + mt['missing_project'] = missing_project + + return render_to_response('catalogue/counters.html', + locals(), context_instance=RequestContext(request)) + + def differentiate_tags(request, tags, ambiguous_slugs): beginning = '/'.join(tag.url_chunk for tag in tags) unparsed = '/'.join(ambiguous_slugs[1:]) @@ -153,6 +183,8 @@ def tagged_object_list(request, tags=''): raise Http404 except models.Tag.MultipleObjectsReturned, e: return differentiate_tags(request, e.tags, e.ambiguous_slugs) + except models.Tag.UrlDeprecationWarning, e: + return HttpResponsePermanentRedirect(reverse('tagged_object_list', args=['/'.join(tag.url_chunk for tag in e.tags)])) try: if len(tags) > settings.MAX_TAG_LIST: @@ -275,6 +307,18 @@ def book_detail(request, slug): extra_info = book.get_extra_info_value() + projects = set() + for m in book.media.filter(type='mp3'): + # ogg files are always from the same project + meta = m.get_extra_info_value() + project = meta.get('project') + if not project: + # temporary fallback + project = u'CzytamySłuchając' + + projects.add((project, meta.get('funded_by'))) + projects = sorted(projects) + form = forms.SearchForm() return render_to_response('catalogue/book_detail.html', locals(), context_instance=RequestContext(request)) @@ -467,7 +511,9 @@ def search(request): {'tags':tag_list, 'prefix':prefix, 'results':((x, _get_result_link(x, tag_list), _get_result_type(x)) for x in result)}, context_instance=RequestContext(request)) else: - return render_to_response('catalogue/search_no_hits.html', {'tags':tag_list, 'prefix':prefix}, + form = PublishingSuggestForm(initial={"books": prefix + ", "}) + return render_to_response('catalogue/search_no_hits.html', + {'tags':tag_list, 'prefix':prefix, "pubsuggest_form": form}, context_instance=RequestContext(request)) @@ -492,13 +538,14 @@ def json_tags_starting_with(request, callback=None): if len(prefix) < 2: return HttpResponse('') tags_list = [] - result = "" for tag in _tags_starting_with(prefix, request.user): if not tag.name in tags_list: - result += "\n" + tag.name tags_list.append(tag.name) - dict_result = {"matches": tags_list} - return JSONResponse(dict_result, callback) + if request.GET.get('mozhint', ''): + result = [prefix, tags_list] + else: + result = {"matches": tags_list} + return JSONResponse(result, callback) # ==================== # = Shelf management = @@ -592,7 +639,7 @@ def download_shelf(request, slug): if form.is_valid(): formats = form.cleaned_data['formats'] if len(formats) == 0: - formats = ['pdf', 'epub', 'odt', 'txt', 'mp3', 'ogg', 'daisy'] + formats = ['pdf', 'epub', 'odt', 'txt'] # Create a ZIP archive temp = tempfile.TemporaryFile() @@ -610,22 +657,10 @@ def download_shelf(request, slug): 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' % slugify(file.name))) + 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)) - if 'mp3' in formats and book.has_media("mp3"): - for file in book.get_media("mp3"): - filename = file.file.path - archive.write(filename, str('%s.mp3' % slugify(file.name))) - if 'ogg' in formats and book.has_media("ogg"): - for file in book.get_media("ogg"): - filename = file.file.path - archive.write(filename, str('%s.ogg' % slugify(file.name))) - if 'daisy' in formats and book.has_media("daisy"): - for file in book.get_media("daisy"): - filename = file.file.path - archive.write(filename, str('%s.daisy' % slugify(file.name))) archive.close() response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed') @@ -644,23 +679,18 @@ def shelf_book_formats(request, shelf): """ shelf = get_object_or_404(models.Tag, slug=shelf, category='set') - formats = {'pdf': False, 'epub': False, 'odt': False, 'txt': False, 'mp3': False, 'ogg': False, 'daisy': False} + formats = {'pdf': False, 'epub': False, 'odt': False, 'txt': 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.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 - if book.daisy_file: - formats['daisy'] = True + for format in ('odt',): + if book.has_media(format): + formats[format] = True return HttpResponse(LazyEncoder().encode(formats)) @@ -766,6 +796,7 @@ def clock(request): def xmls(request): """" Create a zip archive with all XML files. + This should be removed when we have real API. """ temp = tempfile.TemporaryFile() archive = zipfile.ZipFile(temp, 'w') @@ -781,25 +812,3 @@ def xmls(request): temp.seek(0) response.write(temp.read()) return response - - -@cache.never_cache -def epubs(request): - """" - Create a tar archive with all EPUB files, segregated to directories. - """ - - temp = tempfile.TemporaryFile() - archive = tarfile.TarFile(fileobj=temp, mode='w') - - for book in models.Book.objects.exclude(epub_file=''): - archive.add(book.epub_file.path, (u'%s/%s.epub' % (book.get_extra_info_value()['author'], book.slug)).encode('utf-8')) - archive.close() - - response = HttpResponse(content_type='application/tar', mimetype='application/x-tar') - response['Content-Disposition'] = 'attachment; filename=epubs.tar' - response['Content-Length'] = temp.tell() - - temp.seek(0) - response.write(temp.read()) - return response