From 76d3bbd6c7c2dfffb227f8fce87da80c62f61799 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 28 Mar 2025 15:56:36 +0100 Subject: [PATCH] Some new api. --- src/api/urls.py | 1 + src/catalogue/api/serializers.py | 9 +++++++++ src/catalogue/api/urls2.py | 4 ++++ src/catalogue/api/views.py | 15 ++++++++++++++- src/social/api/urls2.py | 16 ++++++++++++++++ src/social/api/views.py | 16 ++++++++++++++++ 6 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/social/api/urls2.py diff --git a/src/api/urls.py b/src/api/urls.py index de3dba77f..62d4fa7f7 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -16,6 +16,7 @@ urlpatterns1 = [ path('login/', csrf_exempt(views.Login2View.as_view())), path('me/', views.UserView.as_view()), path('', include('catalogue.api.urls2')), + path('', include('social.api.urls2')), ] diff --git a/src/catalogue/api/serializers.py b/src/catalogue/api/serializers.py index 60e52a052..059fdd04a 100644 --- a/src/catalogue/api/serializers.py +++ b/src/catalogue/api/serializers.py @@ -352,6 +352,15 @@ class FragmentDetailSerializer(serializers.ModelSerializer): fields = ['book', 'anchor', 'text', 'url', 'themes'] +class FragmentSerializer2(serializers.ModelSerializer): + url = AbsoluteURLField() + html = serializers.CharField(source='text') + + class Meta: + model = Fragment + fields = ['anchor', 'html', 'url'] + + class FilterTagSerializer(serializers.ModelSerializer): class Meta: model = Tag diff --git a/src/catalogue/api/urls2.py b/src/catalogue/api/urls2.py index b16af6651..7dc131d23 100644 --- a/src/catalogue/api/urls2.py +++ b/src/catalogue/api/urls2.py @@ -19,6 +19,10 @@ urlpatterns = [ piwik_track_view(views.BookDetail2.as_view()), name='catalogue_api_book' ), + path('books//fragment/', + piwik_track_view(views.BookFragmentView.as_view()), + name='catalogue_api_book_fragment' + ), path('suggested-tags/', piwik_track_view(views.SuggestedTags.as_view()), diff --git a/src/catalogue/api/views.py b/src/catalogue/api/views.py index 0e758b15e..e45f80e75 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -501,6 +501,19 @@ class SuggestedTags(ListAPIView): def get_queryset(self): tag_ids = self.request.GET.getlist('tag', []) + search = self.request.GET.get('search') tags = [get_object_or_404(Tag, id=tid) for tid in tag_ids] related_tags = list(t.id for t in get_top_level_related_tags(tags)) - return Tag.objects.filter(id__in=related_tags) + tags = Tag.objects.filter(id__in=related_tags) + if search: + tags = tags.filter(name__icontains=search) + return tags + + +class BookFragmentView(RetrieveAPIView): + serializer_class = serializers.FragmentSerializer2 + + def get_object(self): + book = get_object_or_404(Book, slug=self.kwargs['slug']) + return book.choose_fragment() + diff --git a/src/social/api/urls2.py b/src/social/api/urls2.py new file mode 100644 index 000000000..822bea340 --- /dev/null +++ b/src/social/api/urls2.py @@ -0,0 +1,16 @@ +# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. +# +from django.urls import path +from stats.utils import piwik_track_view +from . import views + + +urlpatterns = [ + path('like//', + piwik_track_view(views.LikeView.as_view()), + name='social_api_like'), + path('likes/', views.LikesView.as_view()), +] + + diff --git a/src/social/api/views.py b/src/social/api/views.py index a29930423..2c81286c2 100644 --- a/src/social/api/views.py +++ b/src/social/api/views.py @@ -12,6 +12,7 @@ from catalogue.api.helpers import order_books, books_after from catalogue.api.serializers import BookSerializer from catalogue.models import Book from social.utils import likes +from social.views import get_sets_for_book_ids @vary_on_auth @@ -32,6 +33,21 @@ class LikeView(APIView): return Response({}) +@vary_on_auth +class LikesView(APIView): + permission_classes = [IsAuthenticated] + + def get(self, request): + slugs = request.GET.getlist('slug') + books = Book.objects.filter(slug__in=slugs) + books = {b.id: b.slug for b in books} + ids = books.keys() + res = get_sets_for_book_ids(ids, request.user) + res = {books[bid]: v for bid, v in res.items()} + return Response(res) + + + @vary_on_auth class ShelfView(ListAPIView): permission_classes = [IsAuthenticated] -- 2.20.1