From af8a54f4fbb7956ffbdb4e7b2aaddd7659de4f57 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Mon, 22 Dec 2025 11:26:09 +0100 Subject: [PATCH] Stub recommendation api --- src/catalogue/api/urls2.py | 3 +++ src/catalogue/api/views.py | 12 ++++++++++++ src/catalogue/models/book.py | 6 ++++++ src/catalogue/templates/catalogue/book_detail.html | 2 +- src/catalogue/templatetags/catalogue_tags.py | 12 ++---------- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/catalogue/api/urls2.py b/src/catalogue/api/urls2.py index 46f2a36b5..3353b25e5 100644 --- a/src/catalogue/api/urls2.py +++ b/src/catalogue/api/urls2.py @@ -31,6 +31,9 @@ urlpatterns = [ path('books//sync/', views.BookSyncView.as_view() ), + path('books//recommended/', + views.BookRecommendationsView.as_view() + ), 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 0f3a95fa2..8cd2b6e80 100644 --- a/src/catalogue/api/views.py +++ b/src/catalogue/api/views.py @@ -226,6 +226,18 @@ class BookList2(ListAPIView): 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 diff --git a/src/catalogue/models/book.py b/src/catalogue/models/book.py index ee3aecb02..eae021b18 100644 --- a/src/catalogue/models/book.py +++ b/src/catalogue/models/book.py @@ -1001,6 +1001,12 @@ class Book(models.Model): 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`. diff --git a/src/catalogue/templates/catalogue/book_detail.html b/src/catalogue/templates/catalogue/book_detail.html index ccce18bf8..2f51787eb 100644 --- a/src/catalogue/templates/catalogue/book_detail.html +++ b/src/catalogue/templates/catalogue/book_detail.html @@ -444,7 +444,7 @@ {% 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 %}
diff --git a/src/catalogue/templatetags/catalogue_tags.py b/src/catalogue/templatetags/catalogue_tags.py index e79563cb3..6c2368d21 100644 --- a/src/catalogue/templatetags/catalogue_tags.py +++ b/src/catalogue/templatetags/catalogue_tags.py @@ -309,16 +309,8 @@ def plain_list(context, object_list, with_initials=True, by_author=False, choice @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 -- 2.20.1