From 3c383d17a032b1ca7e77b77ba7d71c08bffcd97b Mon Sep 17 00:00:00 2001
From: Pete Andrew <peter.andrew@torchbox.com>
Date: Fri, 1 May 2020 08:29:04 +0100
Subject: [PATCH] Ref 1908: Improve display of view determination action

- Added view determination as as primary action
- Button is only displayed when a submission has been determined
- The button is visible to any user that has access to the submission
---
 hypha/apply/funds/models/submissions.py       |   6 ++
 .../funds/includes/admin_primary_actions.html |   8 ++
 .../includes/generic_primary_actions.html     |   8 ++
 .../funds/templatetags/primaryactions_tags.py |   3 +-
 hypha/apply/funds/tests/test_views.py         | 102 ++++++++++++++++++
 5 files changed, 126 insertions(+), 1 deletion(-)

diff --git a/hypha/apply/funds/models/submissions.py b/hypha/apply/funds/models/submissions.py
index 3cc70395b..857c5daeb 100644
--- a/hypha/apply/funds/models/submissions.py
+++ b/hypha/apply/funds/models/submissions.py
@@ -735,6 +735,12 @@ class ApplicationSubmission(
     def in_external_review_phase(self):
         return self.status in PHASES_MAPPING['external-review']['statuses']
 
+    @property
+    def is_finished(self):
+        accepted = self.status in PHASES_MAPPING['accepted']['statuses']
+        dismissed = self.status in PHASES_MAPPING['dismissed']['statuses']
+        return accepted or dismissed
+
     # Methods for accessing data on the submission
 
     def get_data(self):
diff --git a/hypha/apply/funds/templates/funds/includes/admin_primary_actions.html b/hypha/apply/funds/templates/funds/includes/admin_primary_actions.html
index 4584d969e..17956259b 100644
--- a/hypha/apply/funds/templates/funds/includes/admin_primary_actions.html
+++ b/hypha/apply/funds/templates/funds/includes/admin_primary_actions.html
@@ -28,6 +28,14 @@
     {% endif %}
 {% endif %}
 
+{% if object.is_finished %}
+    {% with determination=object.determinations.last %}
+    {% if determination %}
+        <a class="button button--primary button--full-width button--bottom-space" href="{% url 'apply:submissions:determinations:detail' submission_pk=object.id pk=determination.id %}">View determination</a>
+    {% endif %}
+    {% endwith %}
+{% endif %}
+
 <a data-fancybox data-src="#update-status" class="button button--primary button--full-width {% if progress_form.should_show %}is-not-disabled{% else %}is-disabled{% endif %}" href="#">Update status</a>
 
 
diff --git a/hypha/apply/funds/templates/funds/includes/generic_primary_actions.html b/hypha/apply/funds/templates/funds/includes/generic_primary_actions.html
index f6c6d4478..3a6702dc0 100644
--- a/hypha/apply/funds/templates/funds/includes/generic_primary_actions.html
+++ b/hypha/apply/funds/templates/funds/includes/generic_primary_actions.html
@@ -7,5 +7,13 @@
         {% if object.in_internal_review_phase or object.in_external_review_phase %}
             {% include 'review/includes/review_button.html' with submission=object class="button--full-width button--bottom-space" draft_text="Complete draft review" %}
         {% endif %}
+
+        {% if object.is_finished %}
+            {% with determination=object.determinations.last %}
+            {% if determination %}
+                <a class="button button--primary button--full-width button--bottom-space" href="{% url 'apply:submissions:determinations:detail' submission_pk=object.id pk=determination.id %}">View determination</a>
+            {% endif %}
+            {% endwith %}
+        {% endif %}
     </div>
 {% endif %}
diff --git a/hypha/apply/funds/templatetags/primaryactions_tags.py b/hypha/apply/funds/templatetags/primaryactions_tags.py
index f866f6555..bf131ff83 100644
--- a/hypha/apply/funds/templatetags/primaryactions_tags.py
+++ b/hypha/apply/funds/templatetags/primaryactions_tags.py
@@ -6,8 +6,9 @@ register = template.Library()
 @register.filter
 def should_display_primary_actions_block(user, submission):
     review_primary_action_displayed = submission.can_review(user) and (submission.in_internal_review_phase or submission.in_external_review_phase)
+    view_determination_action_displayed = submission.is_finished
 
-    if review_primary_action_displayed:
+    if review_primary_action_displayed or view_determination_action_displayed:
         return True
     else:
         return False
diff --git a/hypha/apply/funds/tests/test_views.py b/hypha/apply/funds/tests/test_views.py
index b219e16a8..36213ca12 100644
--- a/hypha/apply/funds/tests/test_views.py
+++ b/hypha/apply/funds/tests/test_views.py
@@ -396,6 +396,40 @@ class TestStaffSubmissionView(BaseSubmissionViewTestCase):
         AssignedReviewersFactory(submission=submission, reviewer=ReviewerFactory(), role=reviewer_role)
         assert_assign_reviewers_secondary_displayed(submission)
 
+    def test_can_see_view_determination_primary_action(self):
+        def assert_view_determination_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='js-actions-sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 1)
+
+        # Phase: accepted
+        submission = ApplicationSubmissionFactory(status='accepted')
+        DeterminationFactory(submission=submission, author=self.user, accepted=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+        # Phase: rejected
+        submission = ApplicationSubmissionFactory(status='rejected')
+        DeterminationFactory(submission=submission, author=self.user, rejected=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+    def test_cant_see_view_determination_primary_action(self):
+        def assert_view_determination_not_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='js-actions-sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 0)
+
+        # Phase: received / in_discussion
+        submission = ApplicationSubmissionFactory()
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, no determination
+        submission.perform_transition('determination', self.user)
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, draft determination
+        DeterminationFactory(submission=submission, author=self.user, accepted=True, submitted=False)
+        assert_view_determination_not_displayed(submission)
+
 
 class TestReviewersUpdateView(BaseSubmissionViewTestCase):
     user_factory = StaffFactory
@@ -621,6 +655,40 @@ class TestReviewerSubmissionView(BaseSubmissionViewTestCase):
         buttons = BeautifulSoup(response.content, 'html5lib').find(class_='sidebar').find_all('a', class_='button--white', text='Reviewers')
         self.assertEqual(len(buttons), 0)
 
+    def test_can_see_view_determination_primary_action(self):
+        def assert_view_determination_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='js-actions-sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 1)
+
+        # Phase: accepted
+        submission = ApplicationSubmissionFactory(status='accepted', user=self.applicant, reviewers=[self.user])
+        DeterminationFactory(submission=submission, accepted=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+        # Phase: rejected
+        submission = ApplicationSubmissionFactory(status='rejected', user=self.applicant, reviewers=[self.user])
+        DeterminationFactory(submission=submission, rejected=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+    def test_cant_see_view_determination_primary_action(self):
+        def assert_view_determination_not_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 0)
+
+        # Phase: received / in_discussion
+        submission = ApplicationSubmissionFactory(user=self.applicant, reviewers=[self.user])
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, no determination
+        submission.perform_transition('determination', self.user)
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, draft determination
+        DeterminationFactory(submission=submission, author=self.user, accepted=True, submitted=False)
+        assert_view_determination_not_displayed(submission)
+
 
 class TestApplicantSubmissionView(BaseSubmissionViewTestCase):
     user_factory = ApplicantFactory
@@ -772,6 +840,40 @@ class TestApplicantSubmissionView(BaseSubmissionViewTestCase):
         buttons = BeautifulSoup(response.content, 'html5lib').find(class_='sidebar').find_all('a', class_='button--white', text='Reviewers')
         self.assertEqual(len(buttons), 0)
 
+    def test_can_see_view_determination_primary_action(self):
+        def assert_view_determination_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='js-actions-sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 1)
+
+        # Phase: accepted
+        submission = ApplicationSubmissionFactory(status='accepted', user=self.user)
+        DeterminationFactory(submission=submission, accepted=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+        # Phase: rejected
+        submission = ApplicationSubmissionFactory(status='rejected', user=self.user)
+        DeterminationFactory(submission=submission, rejected=True, submitted=True)
+        assert_view_determination_displayed(submission)
+
+    def test_cant_see_view_determination_primary_action(self):
+        def assert_view_determination_not_displayed(submission):
+            response = self.get_page(submission)
+            buttons = BeautifulSoup(response.content, 'html5lib').find(class_='sidebar').find_all('a', class_='button--primary', text='View determination')
+            self.assertEqual(len(buttons), 0)
+
+        # Phase: received / in_discussion
+        submission = ApplicationSubmissionFactory(user=self.user)
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, no determination
+        submission.perform_transition('determination', self.user)
+        assert_view_determination_not_displayed(submission)
+
+        # Phase: ready-for-determination, draft determination
+        DeterminationFactory(submission=submission, accepted=True, submitted=False)
+        assert_view_determination_not_displayed(submission)
+
 
 class TestRevisionsView(BaseSubmissionViewTestCase):
     user_factory = ApplicantFactory
-- 
GitLab