From f3bec5cd528bf40dafce738b2ebeb9da30cf54d7 Mon Sep 17 00:00:00 2001
From: Fredrik Jonsson <frjo@xdeb.org>
Date: Mon, 19 Aug 2019 14:12:28 +0200
Subject: [PATCH] Count NA as 0 when calculating review score.

---
 opentech/apply/review/forms.py                |  6 +-
 .../0020_review_score_calc_update.py          | 62 +++++++++++++++++++
 2 files changed, 66 insertions(+), 2 deletions(-)
 create mode 100644 opentech/apply/review/migrations/0020_review_score_calc_update.py

diff --git a/opentech/apply/review/forms.py b/opentech/apply/review/forms.py
index ba6e382d6..8cf02101b 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 000000000..a56907972
--- /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),
+    ]
-- 
GitLab