diff --git a/network-api/networkapi/templates/fragments/buyersguide/average_vote_rating.html b/network-api/networkapi/templates/fragments/buyersguide/average_vote_rating.html index 23273937132..b67b1f941c7 100644 --- a/network-api/networkapi/templates/fragments/buyersguide/average_vote_rating.html +++ b/network-api/networkapi/templates/fragments/buyersguide/average_vote_rating.html @@ -1,8 +1,8 @@ {% load i18n %} - {% with vote_data=product.votes.get_vote_average %} + {% with vote_data=product.average_bin %} {% trans "People voted:" %} - {{ vote_data }} + {{ vote_data.localized }} {% endwith %} diff --git a/network-api/networkapi/wagtailpages/pagemodels/buyersguide/products.py b/network-api/networkapi/wagtailpages/pagemodels/buyersguide/products.py index cddc22e328f..5bbbf2faf1c 100644 --- a/network-api/networkapi/wagtailpages/pagemodels/buyersguide/products.py +++ b/network-api/networkapi/wagtailpages/pagemodels/buyersguide/products.py @@ -390,6 +390,26 @@ def labelled_creepiness_per_bin(self): } return creepiness_per_bin + @property + def average_bin(self): + """Name of the bin corresponding to the average vote""" + total_votes = self.total_votes + # If there's no votes, let the user know (also protects from division by zero errors) + if total_votes == 0: + return { + "label": "No votes", + "localized": gettext("No votes"), + } + + average_vote = self.average_creepiness + mode_bin = round(average_vote / 20) - 1 + label = self.BIN_LABELS[f"bin_{mode_bin}"] + + return { + "label": label["key"], + "localized": label["label"], + } + class ProductPageCategory(TranslatableMixin, Orderable): product = ParentalKey( @@ -741,7 +761,10 @@ def annotated_evaluation(self): if not self.evaluation: return None return ( - ProductPageEvaluation.objects.with_total_creepiness().with_average_creepiness().get(pk=self.evaluation.pk) + ProductPageEvaluation.objects.with_total_votes() + .with_total_creepiness() + .with_average_creepiness() + .get(pk=self.evaluation.pk) ) @property @@ -756,6 +779,10 @@ def creepiness(self): except AttributeError: return self.annotated_evaluation.average_creepiness + @property + def average_bin(self): + return self.annotated_evaluation.average_bin + @property def get_voting_json(self): """ diff --git a/network-api/networkapi/wagtailpages/tests/buyersguide/test_product_page_evaluation.py b/network-api/networkapi/wagtailpages/tests/buyersguide/test_product_page_evaluation.py index 33cf019487a..a6131b7fc79 100644 --- a/network-api/networkapi/wagtailpages/tests/buyersguide/test_product_page_evaluation.py +++ b/network-api/networkapi/wagtailpages/tests/buyersguide/test_product_page_evaluation.py @@ -147,6 +147,9 @@ def test_creepiness_per_bin(self): self.assertEqual(evaluation.average_creepiness, 50) self.assertEqual(evaluation.total_creepiness, 250) self.assertEqual(evaluation.total_votes, 5) + self.assertDictEqual( + evaluation.average_bin, {"label": "A little creepy", "localized": gettext("A little creepy")} + ) def test_creepiness_per_bin_limits(self): product_page = buyersguide_factories.ProductPageFactory(parent=self.bg) @@ -189,6 +192,9 @@ def test_creepiness_per_bin_limits(self): self.assertEqual(evaluation.average_creepiness, 49.5) self.assertEqual(evaluation.total_creepiness, 495) self.assertEqual(evaluation.total_votes, 10) + self.assertDictEqual( + evaluation.average_bin, {"label": "A little creepy", "localized": gettext("A little creepy")} + ) class TestProductPageEvaluationPrefetching(BuyersGuideTestCase):