from django.contrib.sites.models import Site
from django.core.urlresolvers import reverse
from django.utils.functional import lazy
+from django.db import models
from piston.handler import AnonymousBaseHandler, BaseHandler
from piston.utils import rc
from sorl.thumbnail import default
from picture.forms import PictureImportForm
from stats.utils import piwik_track
+from wolnelektury.utils import re_escape
from . import emitters # Register our emitters
book.cover, "139x193").url if book.cover else ''
@classmethod
- def cover_source_image(cls, book):
- url = book.cover_source()
- return url.rstrip('/') + '/file/'
+ def simple_thumb(cls, book):
+ return MEDIA_BASE + book.cover_api_thumb.url if book.cover_api_thumb else ''
+
+ @classmethod
+ def simple_cover(cls, book):
+ return MEDIA_BASE + book.simple_cover.url if book.simple_cover else ''
class BookDetailHandler(BaseHandler, BookDetails):
"""
allowed_methods = ['GET']
fields = ['title', 'parent', 'children'] + Book.formats + [
- 'media', 'url', 'cover', 'cover_thumb', 'fragment_data'] + [
+ 'media', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'simple_cover', 'fragment_data', 'audio_length'] + [
category_plural[c] for c in book_tag_categories]
@piwik_track
"""
allowed_methods = ('GET',)
model = Book
- fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb', 'slug']
+ fields = book_tag_categories + ['href', 'title', 'url', 'cover', 'cover_thumb', 'slug', 'simple_thumb', 'has_audio']
@classmethod
def genres(cls, book):
fields = ('author', 'href', 'title', 'cover') + tuple(Book.ebook_formats) + ('slug',)
+class BookProxy(models.Model):
+ class Meta:
+ managed = False
+
+ def __init__(self, book, key):
+ self.book = book
+ self.key = key
+
+ def __getattr__(self, item):
+ if item not in ('book', 'key'):
+ return self.book.__getattribute__(item)
+ else:
+ return self.__getattribute__(item)
+
+
+class QuerySetProxy(models.QuerySet):
+ def __init__(self, l):
+ self.list = l
+
+ def __iter__(self):
+ return iter(self.list)
+
+
class FilterBooksHandler(AnonymousBooksHandler):
fields = book_tag_categories + [
- 'href', 'title', 'url', 'cover', 'cover_thumb', 'key', 'cover_source_image']
+ 'href', 'title', 'url', 'cover', 'cover_thumb', 'simple_thumb', 'has_audio', 'slug', 'key']
def read(self, request):
key_sep = '$'
is_audiobook = request.GET.get('audiobook')
after = request.GET.get('after')
- count = request.GET.get('count', 50)
+ count = int(request.GET.get('count', 50))
if is_lektura in ('true', 'false'):
is_lektura = is_lektura == 'true'
else:
if (search_string is not None) and len(search_string) < 3:
search_string = None
if search_string:
+ search_string = re_escape(search_string)
books_author = books.filter(cached_author__iregex='\m' + search_string)
books_title = books.filter(title__iregex='\m' + search_string)
books_title = books_title.exclude(id__in=list(books_author.values_list('id', flat=True)))
for category in book_tag_categories:
book_list = prefetch_relations(book_list, category)
remaining_count = count - len(filtered_books)
- new_books = list(book_list[:remaining_count])
- for book in new_books:
- book.key = '%s%s%s' % (label, key_sep, book.slug)
+ new_books = [BookProxy(book, '%s%s%s' % (label, key_sep, book.slug))
+ for book in book_list[:remaining_count]]
filtered_books += new_books
if len(filtered_books) == count:
break
- return filtered_books
+ return QuerySetProxy(filtered_books)
# add categorized tags fields for Book
tags = Tag.objects.filter(category=category_sng).exclude(items=None).order_by('slug')
+ book_only = request.GET.get('book_only') == 'true'
+ picture_only = request.GET.get('picture_only') == 'true'
+ if book_only:
+ tags = tags.filter(for_books=True)
+ if picture_only:
+ tags = tags.filter(for_pictures=True)
+
if after:
tags = tags.filter(slug__gt=after)
if before: