diff --git a/bookwyrm/templates/about/about.html b/bookwyrm/templates/about/about.html index ae4914c2f..aa2413751 100644 --- a/bookwyrm/templates/about/about.html +++ b/bookwyrm/templates/about/about.html @@ -2,12 +2,17 @@ {% load humanize %} {% load i18n %} {% load utilities %} +{% load bookwyrm_tags %} +{% load cache %} {% block title %} {% trans "About" %} {% endblock %} {% block about_content %} +{# seven day cache #} +{% cache 604800 about_page %} +{% get_book_superlatives as superlatives %}

{% blocktrans with site_name=site.name %}Welcome to {{ site_name }}!{% endblocktrans %} @@ -22,7 +27,7 @@
{% if top_rated %} - {% with book=top_rated.default_edition rating=top_rated.rating %} + {% with book=superlatives.top_rated.default_edition rating=top_rated.rating %}
@@ -41,7 +46,7 @@ {% endif %} {% if wanted %} - {% with book=wanted.default_edition %} + {% with book=superlatives.wanted.default_edition %}
@@ -60,7 +65,7 @@ {% endif %} {% if controversial %} - {% with book=controversial.default_edition %} + {% with book=superlatives.controversial.default_edition %}
@@ -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)