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()),
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
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`.
{% 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">
@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