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
from django.utils.encoding import force_unicode
from django.utils.http import urlquote_plus
from django.views.decorators import cache
+from django.utils import translation
from django.utils.translation import ugettext as _
from django.views.generic.list_detail import object_list
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
form = forms.SearchForm()
books_by_parent = {}
- books = models.Book.objects.all().order_by('parent_number', 'title').only('title', 'parent', 'slug')
+ books = models.Book.objects.all().order_by('parent_number', 'sort_key').only('title', 'parent', 'slug')
if filter:
books = books.filter(filter).distinct()
book_ids = set((book.pk for book in books))
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:
+ mt['size'] = sum(b.file.size for b in models.BookMedia.objects.filter(type=mt['type']))
+ mt['deprecated'] = models.BookMedia.objects.filter(
+ type=mt['type'], source_sha1=None).count() if mt['type'] in ('mp3', 'ogg') else '-'
+
+ 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:])
context_instance=RequestContext(request))
-def tagged_object_list(request, tags='', api=False):
+def tagged_object_list(request, tags=''):
try:
tags = models.Tag.get_tag_list(tags)
except models.Tag.DoesNotExist:
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:
objects = fragments
else:
- # get relevant books and their tags
- objects = models.Book.tagged.with_all(tags)
- if not shelf_is_set:
- # eliminate descendants
- l_tags = models.Tag.objects.filter(category='book', slug__in=[book.book_tag_slug() for book in objects])
- descendants_keys = [book.pk for book in models.Book.tagged.with_any(l_tags)]
- if descendants_keys:
- objects = objects.exclude(pk__in=descendants_keys)
+ if shelf_is_set:
+ objects = models.Book.tagged.with_all(tags)
+ else:
+ objects = models.Book.tagged_top_level(tags)
# get related tags from `tag_counter` and `theme_counter`
related_counts = {}
only_author = len(tags) == 1 and tags[0].category == 'author'
objects = models.Book.objects.none()
- if api:
- print objects
- return objects
- else:
- return object_list(
- request,
- objects,
- template_name='catalogue/tagged_object_list.html',
- extra_context={
- 'categories': categories,
- 'only_shelf': only_shelf,
- 'only_author': only_author,
- 'only_my_shelf': only_my_shelf,
- 'formats_form': forms.DownloadFormatsForm(),
- 'tags': tags,
- }
- )
+ return object_list(
+ request,
+ objects,
+ template_name='catalogue/tagged_object_list.html',
+ extra_context={
+ 'categories': categories,
+ 'only_shelf': only_shelf,
+ 'only_author': only_author,
+ 'only_my_shelf': only_my_shelf,
+ 'formats_form': forms.DownloadFormatsForm(),
+ 'tags': tags,
+ }
+ )
def book_fragments(request, book_slug, theme_slug):
book_tag = book.book_tag()
tags = list(book.tags.filter(~Q(category='set')))
categories = split_tags(tags)
- book_children = book.children.all().order_by('parent_number', 'title')
+ book_children = book.children.all().order_by('parent_number', 'sort_key')
_book = book
parents = []
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))
{'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))
# ==================
# = Authentication =
# ==================
-
-@cache.never_cache
-def simple_login(request):
- if request.method == "GET":
- #next = request.REQUEST.get('next', '')
- #if next == '':
- form = AuthenticationForm(prefix='login')
- return render_to_response('auth/login.html', locals(),
- context_instance=RequestContext(request))
- #else:
- # return HttpResponseRedirect("/"+next)
-
- elif request.method == "POST":
- form = AuthenticationForm(data=request.POST, prefix='login')
- if form.is_valid():
- auth.login(request, form.get_user())
- url = request.META['HTTP_REFERER'].split("next=")[1]
- url = url.replace("%3F","?").replace("%3D","=")
- return HttpResponseRedirect(url)
-
-
@require_POST
@cache.never_cache
def login(request):
return HttpResponse(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
-@cache.never_cache
-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')
-
- for book in models.Book.objects.all():
- archive.write(book.xml_file.path, str('%s.xml' % book.slug))
- archive.close()
+# info views for API
- response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed')
- response['Content-Disposition'] = 'attachment; filename=xmls.zip'
- response['Content-Length'] = temp.tell()
+def book_info(request, id, lang='pl'):
+ book = get_object_or_404(models.Book, id=id)
+ # set language by hand
+ translation.activate(lang)
+ return render_to_response('catalogue/book_info.html', locals(),
+ context_instance=RequestContext(request))
- temp.seek(0)
- response.write(temp.read())
- return response
+def tag_info(request, id):
+ tag = get_object_or_404(models.Tag, id=id)
+ return HttpResponse(tag.description)