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