from django.utils.functional import Promise
from django.utils.encoding import force_unicode
from django.views.decorators import cache
-from django.core.servers.basehttp import FileWrapper
from catalogue import models
from catalogue import forms
related_tags = models.Tag.objects.related_for_model(tags, model, counts=True, extra={'where': [extra_where]})
categories = split_tags(related_tags)
- if not theme_is_set:
+ if not (theme_is_set or shelf_is_set):
model=models.Book.objects.filter(parent=None)
return newtagging_views.tagged_object_list(
# ==========
# = Search =
# ==========
-def search(request):
- query = request.GET.get('q', '')
- tags = request.GET.get('tags', '')
- if tags == '':
- tags = []
-
- try:
- tag_list = models.Tag.get_tag_list(tags)
- tag = models.Tag.objects.get(name=query)
- except models.Tag.DoesNotExist:
- try:
- book = models.Book.objects.get(title=query)
- return HttpResponseRedirect(book.get_absolute_url())
- except models.Book.DoesNotExist:
- return HttpResponseRedirect(reverse('catalogue.views.main_page'))
+def _tags_starting_with(prefix, user):
+ books = models.Book.objects.filter(title__icontains=prefix)
+ tags = models.Tag.objects.filter(name__icontains=prefix)
+ if user.is_authenticated():
+ tags = tags.filter(~Q(category='set') | Q(user=user))
else:
- tag_list.append(tag)
- return HttpResponseRedirect(reverse('catalogue.views.tagged_object_list',
- kwargs={'tags': '/'.join(tag.slug for tag in tag_list)}
- ))
+ tags = tags.filter(~Q(category='set'))
+ return list(books) + list(tags)
+
-def tags_starting_with(request):
+def search(request):
+ tags = request.GET.get('tags', '')
+ prefix = request.GET.get('q', '')
+ # Prefix must have at least 2 characters
+ if len(prefix) < 2:
+ return HttpResponse('')
+
try:
- prefix = request.GET['q']
- if len(prefix) < 2:
- raise KeyError
-
- books = models.Book.objects.filter(title__icontains=prefix)
- tags = models.Tag.objects.filter(name__icontains=prefix)
- if request.user.is_authenticated():
- tags = tags.filter(~Q(category='set') | Q(user=request.user))
+ tag_list = models.Tag.get_tag_list(tags)
+ except:
+ tag_list = []
+
+ result = _tags_starting_with(prefix, request.user)
+ if len(result) > 0:
+ tag = result[0]
+ if isinstance(tag, models.Book):
+ return HttpResponseRedirect(tag.get_absolute_url())
else:
- tags = tags.filter(~Q(category='set'))
-
- completions = [book.title for book in books] + [tag.name for tag in tags]
+ tag_list.append(tag)
+
+ return HttpResponseRedirect(reverse('catalogue.views.tagged_object_list',
+ kwargs={'tags': '/'.join(tag.slug for tag in tag_list)}
+ ))
- return HttpResponse('\n'.join(completions))
- except KeyError:
+def tags_starting_with(request):
+ prefix = request.GET['q']
+ # Prefix must have at least 2 characters
+ if len(prefix) < 2:
return HttpResponse('')
+
+ return HttpResponse('\n'.join(tag.name for tag in _tags_starting_with(prefix, request.user)))
# ====================
context_instance=RequestContext(request))
-@cache.cache_control(must_revalidate=True, max_age=1800)
+@cache.never_cache
def download_shelf(request, slug):
""""
Create a ZIP archive on disk and transmit it in chunks of 8KB,
be used for large dynamic PDF files.
"""
shelf = get_object_or_404(models.Tag, slug=slug, category='set')
-
+
# Create a ZIP archive
- temp = tempfile.TemporaryFile()
- archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
- for book in models.Book.tagged.with_all(shelf):
- filename = book.html_file.path
- archive.write(filename, str('%s.html' % book.slug))
+ 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:
+ filename = book.pdf_file.path
+ archive.write(filename, str('%s.pdf' % book.slug))
+ if book.odt_file:
+ filename = book.odt_file.path
+ archive.write(filename, str('%s.odt' % book.slug))
+ if book.txt_file:
+ filename = book.txt_file.path
+ archive.write(filename, str('%s.txt' % book.slug))
archive.close()
- wrapper = FileWrapper(temp)
- response = HttpResponse(wrapper, content_type='application/zip')
- response['Content-Disposition'] = 'attachment; filename=%s.zip' % shelf.slug
+ response = HttpResponse(content_type='application/zip', mimetype='application/x-zip-compressed')
+ response['Content-Disposition'] = 'attachment; filename=%s.zip' % shelf.sort_key
response['Content-Length'] = temp.tell()
+
temp.seek(0)
+ response.write(temp.read())
return response