From: Jan Szejko Date: Thu, 19 Jul 2018 12:03:07 +0000 (+0200) Subject: add api for likes X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/36fe056c9c23f0843f1d391b100b7f622ccd4ef7?ds=inline add api for likes --- diff --git a/src/api/handlers.py b/src/api/handlers.py index 830f0a99a..606aaa211 100644 --- a/src/api/handlers.py +++ b/src/api/handlers.py @@ -21,6 +21,7 @@ from catalogue.models.tag import prefetch_relations from catalogue.utils import is_subscribed from picture.models import Picture from picture.forms import PictureImportForm +from social.utils import likes from stats.utils import piwik_track from wolnelektury.utils import re_escape @@ -703,13 +704,16 @@ class UserShelfHandler(BookDetailHandler): def read(self, request, state): if not request.user.is_authenticated(): return rc.FORBIDDEN - if state not in ('reading', 'complete'): + if state not in ('reading', 'complete', 'likes'): return rc.NOT_FOUND after = request.GET.get('after') count = int(request.GET.get('count', 50)) - ids = BookUserData.objects.filter(user=request.user, complete=state == 'complete')\ - .values_list('book_id', flat=True) - books = Book.objects.filter(id__in=list(ids)).distinct().order_by('slug') + if state == 'likes': + books = Book.tagged.with_any(request.user.tag_set.all()) + else: + ids = BookUserData.objects.filter(user=request.user, complete=state == 'complete')\ + .values_list('book_id', flat=True) + books = Book.objects.filter(id__in=list(ids)).distinct().order_by('slug') if after: books = books.filter(slug__gt=after) if count: @@ -717,6 +721,33 @@ class UserShelfHandler(BookDetailHandler): return books +class UserLikeHandler(BaseHandler): + fields = [] + allowed_methods = ('GET', 'POST') + + def read(self, request, slug): + if not request.user.is_authenticated(): + return rc.FORBIDDEN + try: + book = Book.objects.get(slug=slug) + except Book.DoesNotExist: + return rc.NOT_FOUND + return {'likes': likes(request.user, book)} + + def create(self, request, slug, action='like'): + if not request.user.is_authenticated(): + return rc.FORBIDDEN + try: + book = Book.objects.get(slug=slug) + except Book.DoesNotExist: + return rc.NOT_FOUND + if action == 'like': + book.like(request.user) + elif action == 'unlike': + book.unlike(request.user) + return {} + + class BlogEntryHandler(BaseHandler): model = Entry fields = ('title', 'lead', 'body', 'place', 'time', 'image_url', 'gallery_urls', 'type', 'key') diff --git a/src/api/urls.py b/src/api/urls.py index 4bbd5f578..e39555352 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -15,15 +15,22 @@ from api.piston_patch import oauth_user_auth auth = OAuthAuthentication(realm="Wolne Lektury") -book_list_resource = CsrfExemptResource(handler=handlers.BooksHandler, authentication=auth) + +def auth_resource(handler): + return CsrfExemptResource(handler=handler, authentication=auth) + + +book_list_resource = auth_resource(handler=handlers.BooksHandler) ebook_list_resource = Resource(handler=handlers.EBooksHandler) # book_list_resource = Resource(handler=handlers.BooksHandler) book_resource = Resource(handler=handlers.BookDetailHandler) filter_book_resource = Resource(handler=handlers.FilterBooksHandler) -epub_resource = Resource(handler=handlers.EpubHandler, authentication=auth) +epub_resource = auth_resource(handler=handlers.EpubHandler) -reading_resource = CsrfExemptResource(handler=handlers.UserDataHandler, authentication=auth) -shelf_resource = Resource(handler=handlers.UserShelfHandler, authentication=auth) +reading_resource = auth_resource(handler=handlers.UserDataHandler) +shelf_resource = auth_resource(handler=handlers.UserShelfHandler) + +like_resource = auth_resource(handler=handlers.UserLikeHandler) collection_resource = Resource(handler=handlers.CollectionDetailHandler) collection_list_resource = Resource(handler=handlers.CollectionsHandler) @@ -34,7 +41,7 @@ tag_resource = Resource(handler=handlers.TagDetailHandler) fragment_resource = Resource(handler=handlers.FragmentDetailHandler) fragment_list_resource = Resource(handler=handlers.FragmentsHandler) -picture_resource = CsrfExemptResource(handler=handlers.PictureHandler, authentication=auth) +picture_resource = auth_resource(handler=handlers.PictureHandler) blog_resource = Resource(handler=handlers.BlogEntryHandler) @@ -84,6 +91,8 @@ urlpatterns = [ url(r'^shelf/(?P[a-z]+)/$', shelf_resource, name='api_shelf'), url(r'^username/$', reading_resource, name='api_username'), + url(r'^like/(?P[a-z0-9-]+)/$', like_resource, name='api_like'), + # objects details url(r'^books/(?P[a-z0-9-]+)/$', book_resource, name="api_book"), url(r'^(?P[a-z0-9-]+)/(?P[a-z0-9-]+)/$',