Some new api.
authorRadek Czajka <rczajka@rczajka.pl>
Fri, 28 Mar 2025 14:56:36 +0000 (15:56 +0100)
committerRadek Czajka <rczajka@rczajka.pl>
Fri, 28 Mar 2025 14:56:36 +0000 (15:56 +0100)
src/api/urls.py
src/catalogue/api/serializers.py
src/catalogue/api/urls2.py
src/catalogue/api/views.py
src/social/api/urls2.py [new file with mode: 0644]
src/social/api/views.py

index de3dba7..62d4fa7 100644 (file)
@@ -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('login/', csrf_exempt(views.Login2View.as_view())),
     path('me/', views.UserView.as_view()),
     path('', include('catalogue.api.urls2')),
+    path('', include('social.api.urls2')),
 ]
 
 
 ]
 
 
index 60e52a0..059fdd0 100644 (file)
@@ -352,6 +352,15 @@ class FragmentDetailSerializer(serializers.ModelSerializer):
         fields = ['book', 'anchor', 'text', 'url', 'themes']
 
 
         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
 class FilterTagSerializer(serializers.ModelSerializer):
     class Meta:
         model = Tag
index b16af66..7dc131d 100644 (file)
@@ -19,6 +19,10 @@ urlpatterns = [
          piwik_track_view(views.BookDetail2.as_view()),
          name='catalogue_api_book'
          ),
          piwik_track_view(views.BookDetail2.as_view()),
          name='catalogue_api_book'
          ),
+    path('books/<slug:slug>/fragment/',
+         piwik_track_view(views.BookFragmentView.as_view()),
+         name='catalogue_api_book_fragment'
+         ),
 
     path('suggested-tags/',
          piwik_track_view(views.SuggestedTags.as_view()),
 
     path('suggested-tags/',
          piwik_track_view(views.SuggestedTags.as_view()),
index 0e758b1..e45f80e 100644 (file)
@@ -501,6 +501,19 @@ class SuggestedTags(ListAPIView):
 
     def get_queryset(self):
         tag_ids = self.request.GET.getlist('tag', [])
 
     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))
         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 (file)
index 0000000..822bea3
--- /dev/null
@@ -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/<slug:slug>/',
+        piwik_track_view(views.LikeView.as_view()),
+        name='social_api_like'),
+    path('likes/', views.LikesView.as_view()),
+]
+
+
index a299304..2c81286 100644 (file)
@@ -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 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
 
 
 @vary_on_auth
@@ -32,6 +33,21 @@ class LikeView(APIView):
         return Response({})
 
 
         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]
 @vary_on_auth
 class ShelfView(ListAPIView):
     permission_classes = [IsAuthenticated]