Stub recommendation api
authorRadek Czajka <rczajka@rczajka.pl>
Mon, 22 Dec 2025 10:26:09 +0000 (11:26 +0100)
committerRadek Czajka <rczajka@rczajka.pl>
Mon, 22 Dec 2025 10:26:09 +0000 (11:26 +0100)
src/catalogue/api/urls2.py
src/catalogue/api/views.py
src/catalogue/models/book.py
src/catalogue/templates/catalogue/book_detail.html
src/catalogue/templatetags/catalogue_tags.py

index 46f2a36..3353b25 100644 (file)
@@ -31,6 +31,9 @@ urlpatterns = [
     path('books/<slug:slug>/sync/',
          views.BookSyncView.as_view()
          ),
     path('books/<slug:slug>/sync/',
          views.BookSyncView.as_view()
          ),
+    path('books/<slug:slug>/recommended/',
+         views.BookRecommendationsView.as_view()
+         ),
 
     path('suggested-tags/',
          piwik_track_view(views.SuggestedTags.as_view()),
 
     path('suggested-tags/',
          piwik_track_view(views.SuggestedTags.as_view()),
index 0f3a95f..8cd2b6e 100644 (file)
@@ -226,6 +226,18 @@ class BookList2(ListAPIView):
         return books
 
 
         return books
 
 
+class BookRecommendationsView(ListAPIView):
+    serializer_class = serializers.BookSerializer2
+    pagination_class = None
+
+    def get_queryset(self):
+        book = get_object_or_404(
+            Book,
+            slug=self.kwargs['slug']
+        )
+        return book.recommended(limit=3)
+
+
 class BookList11Labs(BookList2):
     serializer_class = serializers.BookSerializer11Labs
 
 class BookList11Labs(BookList2):
     serializer_class = serializers.BookSerializer11Labs
 
index ee3aecb..eae021b 100644 (file)
@@ -1001,6 +1001,12 @@ class Book(models.Model):
         elif isinstance(publisher, list):
             return ', '.join(publisher)
 
         elif isinstance(publisher, list):
             return ', '.join(publisher)
 
+    def recommended(self, limit=4):
+        books_qs = type(self).objects.filter(findable=True)
+        books_qs = books_qs.exclude(common_slug=self.common_slug).exclude(ancestor=self)
+        books = type(self).tagged.related_to(self, books_qs)[:limit]
+        return books
+
     @classmethod
     def tagged_top_level(cls, tags):
         """ Returns top-level books tagged with `tags`.
     @classmethod
     def tagged_top_level(cls, tags):
         """ Returns top-level books tagged with `tags`.
index ccce18b..2f51787 100644 (file)
             {% endif %}
 
 
             {% endif %}
 
 
-            {% related_books_2022 book taken=book.other_versions|length as related_books %}
+            {% related_books book taken=book.other_versions|length as related_books %}
             {% for rel in related_books %}
               <article class="l-books__item">
                 <figure class="l-books__item__img">
             {% for rel in related_books %}
               <article class="l-books__item">
                 <figure class="l-books__item__img">
index e79563c..6c2368d 100644 (file)
@@ -309,16 +309,8 @@ def plain_list(context, object_list, with_initials=True, by_author=False, choice
 
 
 @register.simple_tag
 
 
 @register.simple_tag
-def related_books_2022(book=None, limit=4, taken=0):
-    limit -= taken
-    max_books = limit
-
-    books_qs = Book.objects.filter(findable=True)
-    if book is not None:
-        books_qs = books_qs.exclude(common_slug=book.common_slug).exclude(ancestor=book)
-    books = Book.tagged.related_to(book, books_qs)[:max_books]
-
-    return books
+def related_books(book, limit=4, taken=0):
+    return book.recommended(limit=limit - taken)
 
 
 @register.simple_tag
 
 
 @register.simple_tag