-@register.inclusion_tag('catalogue/fragment_promo.html')
-def fragment_promo(arg=None):
- if arg is None:
- fragments = Fragment.objects.all().order_by('?')
- fragment = fragments[0] if fragments.exists() else None
- elif isinstance(arg, Book):
- fragment = arg.choose_fragment()
- else:
- fragments = Fragment.tagged.with_all(arg).order_by('?')
- fragment = fragments[0] if fragments.exists() else None
-
- return {
- 'fragment': fragment,
- }
-
-
-@register.inclusion_tag('catalogue/related_books.html')
-def related_books(book, limit=6, random=1):
- cache_key = "catalogue.related_books.%d.%d" % (book.id, limit - random)
- related = cache.get(cache_key)
- if related is None:
- related = list(Book.objects.filter(
- common_slug=book.common_slug).exclude(pk=book.pk)[:limit])
- limit -= len(related)
- if limit > random:
- related += Book.tagged.related_to(book,
- Book.objects.exclude(common_slug=book.common_slug),
- ignore_by_tag=book.book_tag())[:limit-random]
- cache.set(cache_key, related, 1800)
- if random:
- random_books = Book.objects.exclude(
- pk__in=[b.pk for b in related] + [book.pk])
- if random == 1:
- count = random_books.count()
- if count:
- related.append(random_books[randint(0, count - 1)])
- else:
- related += list(random_books.order_by('?')[:random])
+@register.inclusion_tag('catalogue/related_books.html', takes_context=True)
+def related_books(context, book, limit=6, random=1, taken=0):
+ limit = limit - taken
+ related = Book.tagged.related_to(book,
+ Book.objects.exclude(common_slug=book.common_slug)
+ ).exclude(ancestor=book)[:limit-random]
+ random_excluded = [b.pk for b in related] + [book.pk]