From 7c9ecf414a5834a3e347d555a830ed53705a279c Mon Sep 17 00:00:00 2001
From: Erin Mullaney <erin.mullaney@torchbox.com>
Date: Wed, 20 Feb 2019 10:10:28 -0500
Subject: [PATCH] #962 review block: don't show _not_reviewed authors if they
 have left an opinion, display opinions for all types of reviews.

---
 .../funds/includes/review_table.html          |  2 +-
 opentech/apply/review/views.py                | 48 +++++++++++--------
 2 files changed, 28 insertions(+), 22 deletions(-)

diff --git a/opentech/apply/funds/templates/funds/includes/review_table.html b/opentech/apply/funds/templates/funds/includes/review_table.html
index e01ffccdc..7b724dae3 100644
--- a/opentech/apply/funds/templates/funds/includes/review_table.html
+++ b/opentech/apply/funds/templates/funds/includes/review_table.html
@@ -33,7 +33,7 @@
         {% if reviews_block.external_reviewed or reviews_block.external_not_reviewed %}
 
             {% for review_data in reviews_block.external_reviewed %}
-                {% include 'funds/includes/review_table_row.html' with review=review_data.review reviewer=review_data.reviewer %}
+                {% include 'funds/includes/review_table_row.html' with review=review_data.review reviewer=review_data.reviewer opinions=review_data.opinions %}
             {% endfor %}
 
             {% for review_data in reviews_block.external_not_reviewed %}
diff --git a/opentech/apply/review/views.py b/opentech/apply/review/views.py
index 03514f515..2fae0ed08 100644
--- a/opentech/apply/review/views.py
+++ b/opentech/apply/review/views.py
@@ -16,6 +16,7 @@ from opentech.apply.review.blocks import RecommendationBlock, RecommendationComm
 from opentech.apply.review.forms import ReviewModelForm, ReviewOpinionForm
 from opentech.apply.stream_forms.models import BaseStreamForm
 from opentech.apply.users.decorators import staff_required
+from opentech.apply.users.models import User
 from opentech.apply.utils.views import CreateOrUpdateView
 
 from .models import Review
@@ -30,44 +31,49 @@ class ReviewContextMixin:
         for review in reviews:
             reviews_dict[review.author.pk] = review
 
+        # Get all the authors of opinions, these authors should not show up in the 'xxx_not_reviewed' lists
+        opinion_authors = set(User.objects.filter(
+            pk__in=ReviewOpinion.objects.filter(review__submission=self.object).values('author__pk')))
+
         reviews_block = defaultdict(list)
         for assigned_reviewer in assigned:
             reviewer = assigned_reviewer.reviewer
             role = assigned_reviewer.role
             review = reviews_dict.get(reviewer.pk, None)
+            key = None
             if role:
                 if review:
                     key = 'role_reviewed'
-                else:
+                elif reviewer not in opinion_authors:
                     key = 'role_not_reviewed'
             elif reviewer.is_apply_staff:
                 if review:
                     key = 'staff_reviewed'
-                else:
+                elif review not in opinion_authors:
                     key = 'staff_not_reviewed'
             else:
                 if review:
                     key = 'external_reviewed'
-                else:
+                elif review not in opinion_authors:
                     key = 'external_not_reviewed'
-
-            review_info_dict = {
-                'reviewer': reviewer,
-                'review': review,
-                'role': role,
-            }
-            opinions_list = []
-            if review and review.opinions:
-                for opinion in review.opinions.all():
-                    author_role = self.object.assigned.with_roles().filter(reviewer=opinion.author).first()
-                    role = author_role.role if author_role else None
-                    opinions_list.append({
-                        'author': opinion.author,
-                        'opinion': opinion.get_opinion_display(),
-                        'role': role,
-                    })
-                review_info_dict['opinions'] = opinions_list
-            reviews_block[key].append(review_info_dict)
+            if key:  # Do not add this reviewer to any list if they haven't reviewed but have left an opinion
+                review_info_dict = {
+                    'reviewer': reviewer,
+                    'review': review,
+                    'role': role,
+                }
+                opinions_list = []
+                if review and review.opinions:
+                    for opinion in review.opinions.all():
+                        author_role = self.object.assigned.with_roles().filter(reviewer=opinion.author).first()
+                        role = author_role.role if author_role else None
+                        opinions_list.append({
+                            'author': opinion.author,
+                            'opinion': opinion.get_opinion_display(),
+                            'role': role,
+                        })
+                    review_info_dict['opinions'] = opinions_list
+                reviews_block[key].append(review_info_dict)
 
         # Calculate the recommendation based on role and staff reviews
         recommendation = self.object.reviews.by_staff().recommendation()
-- 
GitLab