diff --git a/bookwyrm/templatetags/rating_tags.py b/bookwyrm/templatetags/rating_tags.py index cc23d3308..367463a8f 100644 --- a/bookwyrm/templatetags/rating_tags.py +++ b/bookwyrm/templatetags/rating_tags.py @@ -12,6 +12,10 @@ register = template.Library() @register.filter(name="rating") def get_rating(book, user): """get the overall rating of a book""" + # this shouldn't happen, but it CAN + if not book.parent_work: + return None + return cache.get_or_set( f"book-rating-{book.parent_work.id}", lambda u, b: models.Review.objects.filter( diff --git a/bookwyrm/tests/templatetags/test_rating_tags.py b/bookwyrm/tests/templatetags/test_rating_tags.py index 5abfa471a..8c07eeb8f 100644 --- a/bookwyrm/tests/templatetags/test_rating_tags.py +++ b/bookwyrm/tests/templatetags/test_rating_tags.py @@ -71,6 +71,12 @@ class RatingTags(TestCase): ) self.assertEqual(rating_tags.get_rating(self.book, self.local_user), 5) + def test_get_rating_broken_edition(self, *_): + """Don't have a server error if an edition is missing a work""" + broken_book = models.Edition.objects.create(title="Test") + broken_book.parent_work = None + self.assertIsNone(rating_tags.get_rating(broken_book, self.local_user)) + def test_get_user_rating(self, *_): """get a user's most recent rating of a book""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):