X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/58e42619354e7837da795974f273ddfa957b5d96..45887278c0295230130017434a734e020bfe104a:/src/api/handlers.py diff --git a/src/api/handlers.py b/src/api/handlers.py index dc84e88b8..3aefcffa9 100644 --- a/src/api/handlers.py +++ b/src/api/handlers.py @@ -164,7 +164,7 @@ class BookDetails(object): @classmethod def cover_color(cls, book): - return WLCover.epoch_colors.get(book.extra_info['epoch'], '#000000') + return WLCover.epoch_colors.get(book.extra_info.get('epoch'), '#000000') class BookDetailHandler(BaseHandler, BookDetails): @@ -204,7 +204,7 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): @piwik_track def read(self, request, tags=None, top_level=False, audiobooks=False, daisy=False, pk=None, recommended=False, newest=False, books=None, - after=None, before=None, count=None): + after=None, count=None): """ Lists all books with given tags. :param tags: filtering tags; should be a path of categories @@ -226,8 +226,6 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): if 'after' in request.GET: after = request.GET['after'] - if 'before' in request.GET: - before = request.GET['before'] if 'count' in request.GET: count = request.GET['count'] @@ -252,20 +250,16 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): if newest: books = books.order_by('-created_at') + # beznadzieja if after: books = books.filter(slug__gt=after) - if before: - books = books.filter(slug__lt=before) books = books.only('slug', 'title', 'cover', 'cover_thumb') for category in book_tag_categories: books = prefetch_relations(books, category) if count: - if before: - books = list(reversed(books.order_by('-slug')[:count])) - else: - books = books[:count] + books = books[:count] return books @@ -276,9 +270,23 @@ class AnonymousBooksHandler(AnonymousBaseHandler, BookDetails): class BooksHandler(BookDetailHandler): allowed_methods = ('GET', 'POST') model = Book - fields = book_list_fields + fields = book_list_fields + ['liked'] anonymous = AnonymousBooksHandler + # hack, because piston is stupid + @classmethod + def liked(cls, book): + return getattr(book, 'liked', None) + + def read(self, request, **kwargs): + books = AnonymousBooksHandler().read(request, **kwargs) + likes = set(Book.tagged.with_any(request.user.tag_set.all()).values_list('id', flat=True)) + + new_books = [ + BookProxy(book).set('liked', book.id in likes) + for book in books] + return QuerySetProxy(new_books) + def create(self, request, *args, **kwargs): if not request.user.has_perm('catalogue.add_book'): return rc.FORBIDDEN @@ -312,15 +320,16 @@ class BookProxy(models.Model): class Meta: managed = False - def __init__(self, book, key): + def __init__(self, book, key=None): self.book = book self.key = key + def set(self, attr, value): + self.__setattr__(attr, value) + return self + def __getattr__(self, item): - if item not in ('book', 'key'): - return self.book.__getattribute__(item) - else: - return self.__getattribute__(item) + return self.book.__getattribute__(item) class QuerySetProxy(models.QuerySet): @@ -331,7 +340,7 @@ class QuerySetProxy(models.QuerySet): return iter(self.list) -class FilterBooksHandler(AnonymousBooksHandler): +class AnonFilterBooksHandler(AnonymousBooksHandler): fields = book_list_fields + ['key'] def parse_bool(self, s): @@ -402,6 +411,23 @@ class FilterBooksHandler(AnonymousBooksHandler): return QuerySetProxy(filtered_books) +class FilterBooksHandler(BooksHandler): + anonymous = AnonFilterBooksHandler + fields = book_list_fields + ['key', 'liked'] + + # hack, because piston is stupid + @classmethod + def liked(cls, book): + return getattr(book, 'liked', None) + + def read(self, request): + qsp = AnonFilterBooksHandler().read(request) + likes = set(Book.tagged.with_any(request.user.tag_set.all()).values_list('id', flat=True)) + for book in qsp.list: + book.set('liked', book.id in likes) + return qsp + + class BookPreviewHandler(BookDetailHandler): fields = BookDetailHandler.fields + ['slug'] @@ -560,7 +586,6 @@ class TagsHandler(BaseHandler, TagDetails): return rc.NOT_FOUND after = request.GET.get('after') - before = request.GET.get('before') count = request.GET.get('count') tags = Tag.objects.filter(category=category_sng).exclude(items=None).order_by('slug') @@ -574,14 +599,9 @@ class TagsHandler(BaseHandler, TagDetails): if after: tags = tags.filter(slug__gt=after) - if before: - tags = tags.filter(slug__lt=before) if count: - if before: - tags = list(reversed(tags.order_by('-slug')[:count])) - else: - tags = tags[:count] + tags = tags[:count] return tags @@ -706,7 +726,7 @@ class UserDataHandler(BaseHandler): class UserShelfHandler(BookDetailHandler): - fields = book_list_fields + fields = book_list_fields + ['liked'] def parse_bool(self, s): if s in ('true', 'false'): @@ -714,9 +734,15 @@ class UserShelfHandler(BookDetailHandler): else: return None + # hack, because piston is stupid + @classmethod + def liked(cls, book): + return getattr(book, 'liked', None) + def read(self, request, state): if not request.user.is_authenticated(): return rc.FORBIDDEN + likes = set(Book.tagged.with_any(request.user.tag_set.all()).values_list('id', flat=True)) if state not in ('reading', 'complete', 'likes'): return rc.NOT_FOUND after = request.GET.get('after') @@ -731,7 +757,10 @@ class UserShelfHandler(BookDetailHandler): books = books.filter(slug__gt=after) if count: books = books[:count] - return books + new_books = [] + for book in books: + new_books.append(BookProxy(book).set('liked', book.id in likes)) + return QuerySetProxy(new_books) class UserLikeHandler(BaseHandler):