@@ -131,4 +136,6 @@
{% endfor %}
+
+{% endcache %}
{% endblock %}
diff --git a/bookwyrm/templates/snippets/status/content_status.html b/bookwyrm/templates/snippets/status/content_status.html
index 01734cc78..034e29e94 100644
--- a/bookwyrm/templates/snippets/status/content_status.html
+++ b/bookwyrm/templates/snippets/status/content_status.html
@@ -3,6 +3,7 @@
{% load i18n %}
{% load static %}
{% load humanize %}
+{% load cache %}
{% with status_type=status.status_type %}
{% if not hide_book %}
+ {% cache 259200 content_status_book status.id %}
{% with book=status.book|default:status.mention_books.first %}
{% if book %}
@@ -34,6 +36,7 @@
{% endif %}
{% endwith %}
+ {% endcache %}
{% endif %}
diff --git a/bookwyrm/templates/snippets/status/generated_status.html b/bookwyrm/templates/snippets/status/generated_status.html
index e73b9c320..1234ae7ce 100644
--- a/bookwyrm/templates/snippets/status/generated_status.html
+++ b/bookwyrm/templates/snippets/status/generated_status.html
@@ -3,8 +3,10 @@
{% load bookwyrm_tags %}
{% load markdown %}
{% load i18n %}
+{% load cache %}
{% if not hide_book %}
+ {% cache 259200 generated_status_book status.id %}
{% with book=status.book|default:status.mention_books.first %}
{% endwith %}
+ {% endcache %}
{% endif %}
{% endspaceless %}
diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py
index f173e052c..f24219d25 100644
--- a/bookwyrm/templatetags/bookwyrm_tags.py
+++ b/bookwyrm/templatetags/bookwyrm_tags.py
@@ -1,6 +1,6 @@
""" template filters """
from django import template
-from django.db.models import Avg
+from django.db.models import Avg, StdDev, Count, F, Q
from bookwyrm import models
from bookwyrm.views.feed import get_suggested_books
@@ -68,6 +68,57 @@ def load_subclass(status):
return status
+@register.simple_tag(takes_context=False)
+def get_book_superlatives():
+ """get book stats for the about page"""
+ total_ratings = models.Review.objects.filter(local=True, deleted=False).count()
+ data = {}
+ data["top_rated"] = (
+ models.Work.objects.annotate(
+ rating=Avg(
+ "editions__review__rating",
+ filter=Q(editions__review__local=True, editions__review__deleted=False),
+ ),
+ rating_count=Count(
+ "editions__review",
+ filter=Q(editions__review__local=True, editions__review__deleted=False),
+ ),
+ )
+ .annotate(weighted=F("rating") * F("rating_count") / total_ratings)
+ .filter(rating__gt=4, weighted__gt=0)
+ .order_by("-weighted")
+ .first()
+ )
+
+ data["controversial"] = (
+ models.Work.objects.annotate(
+ deviation=StdDev(
+ "editions__review__rating",
+ filter=Q(editions__review__local=True, editions__review__deleted=False),
+ ),
+ rating_count=Count(
+ "editions__review",
+ filter=Q(editions__review__local=True, editions__review__deleted=False),
+ ),
+ )
+ .annotate(weighted=F("deviation") * F("rating_count") / total_ratings)
+ .filter(weighted__gt=0)
+ .order_by("-weighted")
+ .first()
+ )
+
+ data["wanted"] = (
+ models.Work.objects.annotate(
+ shelf_count=Count(
+ "editions__shelves", filter=Q(editions__shelves__identifier="to-read")
+ )
+ )
+ .order_by("-shelf_count")
+ .first()
+ )
+ return data
+
+
@register.simple_tag(takes_context=False)
def related_status(notification):
"""for notifications"""
diff --git a/bookwyrm/views/landing/about.py b/bookwyrm/views/landing/about.py
index 7d53a3a12..9f6236e27 100644
--- a/bookwyrm/views/landing/about.py
+++ b/bookwyrm/views/landing/about.py
@@ -1,6 +1,5 @@
""" non-interactive pages """
from dateutil.relativedelta import relativedelta
-from django.db.models import Avg, StdDev, Count, F, Q
from django.template.response import TemplateResponse
from django.utils import timezone
from django.views.decorators.http import require_GET
@@ -24,51 +23,6 @@ def about(request):
"version": settings.VERSION,
}
- total_ratings = models.Review.objects.filter(local=True, deleted=False).count()
- data["top_rated"] = (
- models.Work.objects.annotate(
- rating=Avg(
- "editions__review__rating",
- filter=Q(editions__review__local=True, editions__review__deleted=False),
- ),
- rating_count=Count(
- "editions__review",
- filter=Q(editions__review__local=True, editions__review__deleted=False),
- ),
- )
- .annotate(weighted=F("rating") * F("rating_count") / total_ratings)
- .filter(rating__gt=4, weighted__gt=0)
- .order_by("-weighted")
- .first()
- )
-
- data["controversial"] = (
- models.Work.objects.annotate(
- deviation=StdDev(
- "editions__review__rating",
- filter=Q(editions__review__local=True, editions__review__deleted=False),
- ),
- rating_count=Count(
- "editions__review",
- filter=Q(editions__review__local=True, editions__review__deleted=False),
- ),
- )
- .annotate(weighted=F("deviation") * F("rating_count") / total_ratings)
- .filter(weighted__gt=0)
- .order_by("-weighted")
- .first()
- )
-
- data["wanted"] = (
- models.Work.objects.annotate(
- shelf_count=Count(
- "editions__shelves", filter=Q(editions__shelves__identifier="to-read")
- )
- )
- .order_by("-shelf_count")
- .first()
- )
-
return TemplateResponse(request, "about/about.html", data)