diff --git a/opentech/apply/review/forms.py b/opentech/apply/review/forms.py index ba6e382d6030f1df4d5308d4977794c679eb94f8..8cf02101bb616dfda5b29b0131bd99b7f57c314c 100644 --- a/opentech/apply/review/forms.py +++ b/opentech/apply/review/forms.py @@ -84,8 +84,10 @@ class ReviewModelForm(StreamBaseForm, forms.ModelForm, metaclass=MixedMetaClass) for field in self.instance.score_fields: score = data.get(field.id)[1] - if score != NA: - scores.append(score) + # Include NA answers as 0. + if score == NA: + score = 0 + scores.append(score) try: return sum(scores) / len(scores) diff --git a/opentech/apply/review/migrations/0020_review_score_calc_update.py b/opentech/apply/review/migrations/0020_review_score_calc_update.py new file mode 100644 index 0000000000000000000000000000000000000000..a5690797240ee06b3d1b4a371b7ec6a968c163ec --- /dev/null +++ b/opentech/apply/review/migrations/0020_review_score_calc_update.py @@ -0,0 +1,62 @@ +# Generated by Django 2.0.13 on 2019-08-19 11:10 + +from django.db import migrations + +from opentech.apply.review.models import Review +from opentech.apply.review.options import NA + + +def review_score_update(apps, schema_editor): + for review in Review.objects.all(): + # Disable auto_now on "updated_at" field so date is not changed. + for field in review._meta.local_fields: + if field.name == 'updated_at': + field.auto_now = False + # Update the score and save. + scores = list() + for field in review.score_fields: + score = review.form_data.get(field.id)[1] + # Include NA answers as 0. + if score == NA: + score = 0 + scores.append(score) + + try: + review.score = sum(scores) / len(scores) + except ZeroDivisionError: + review.score = NA + + review.save() + + +def review_score_revert(apps, schema_editor): + for review in Review.objects.all(): + # Disable auto_now on "updated_at" field so date is not changed. + for field in review._meta.local_fields: + if field.name == 'updated_at': + field.auto_now = False + # Update the score and save. + scores = list() + for field in review.score_fields: + score = review.form_data.get(field.id)[1] + # Exclude NA answers. + if score != NA: + scores.append(score) + + try: + review.score = sum(scores) / len(scores) + except ZeroDivisionError: + review.score = NA + + review.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('review', '0019_replace_existing_author_field'), + ] + + operations = [ + migrations.RunPython(review_score_update, review_score_revert), + ] diff --git a/opentech/apply/review/tests/test_views.py b/opentech/apply/review/tests/test_views.py index 7f4614e629916420299604df7885813e6a302073..63eec5e6e9c70ec94e32dac81bb5ac9dce765d3b 100644 --- a/opentech/apply/review/tests/test_views.py +++ b/opentech/apply/review/tests/test_views.py @@ -163,20 +163,20 @@ class TestReviewScore(BaseViewTestCase): review = self.submit_review_scores() self.assertEqual(review.score, NA) - def test_na_not_included_in_review_average(self): + def test_na_included_in_review_average(self): review = self.submit_review_scores(NA, 5) - self.assertEqual(review.score, 5) + self.assertEqual(review.score, 2.5) - def test_na_not_included_reviews_average(self): + def test_na_included_reviews_average(self): self.submit_review_scores(NA) - self.assertIsNone(Review.objects.score()) + self.assertIsNotNone(Review.objects.score()) - def test_na_not_included_multiple_reviews_average(self): + def test_na_included_multiple_reviews_average(self): self.submit_review_scores(NA) self.submit_review_scores(5) self.assertEqual(Review.objects.count(), 2) - self.assertEqual(Review.objects.score(), 5) + self.assertEqual(Review.objects.score(), 2.5) class UserReviewFormTestCase(BaseViewTestCase):