diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index ee138d979..1368e05e4 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -3,6 +3,7 @@ from dataclasses import MISSING import re from django.apps import apps +from django.core.cache import cache from django.core.exceptions import PermissionDenied from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -373,6 +374,11 @@ class Review(BookStatus): activity_serializer = activitypub.Review pure_type = "Article" + def save(self, *args, **kwargs): + """clear rating caches""" + cache.delete(f"book-rating-{self.book.parent_work.id}-*") + super().save(*args, **kwargs) + class ReviewRating(Review): """a subtype of review that only contains a rating""" diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py index a3e89d9e5..6e4e8d840 100644 --- a/bookwyrm/templatetags/bookwyrm_tags.py +++ b/bookwyrm/templatetags/bookwyrm_tags.py @@ -13,10 +13,15 @@ register = template.Library() @register.filter(name="rating") def get_rating(book, user): """get the overall rating of a book""" - queryset = models.Review.privacy_filter(user).filter( - book__parent_work__editions=book + return cache.get_or_set( + f"book-rating-{book.parent_work.id}-{user.id}", + lambda u, b: models.Review.privacy_filter(u) + .filter(book__parent_work__editions=b) + .aggregate(Avg("rating"))["rating__avg"], + user, + book, + timeout=15552000, ) - return queryset.aggregate(Avg("rating"))["rating__avg"] @register.filter(name="user_rating")