Skip to content

Commit 6c2df90

Browse files
authored
Feature/minor pre release updates (#156)
[Update logic to make cyber assessor readonly](81c87ed) - Previous solution prevented the assessor from viewing the outcome details as the next step was disabled in the indicator stage. Implemented a new route by enabling the assessor to submit, but not save and just pass to the [Rename download xls to download data](1ec20cd) - This is to avoid the confusion of the users assuming that this is the complete assessment data in excel format. Peer review excel report corrections
2 parents 47812e4 + 2456dc7 commit 6c2df90

File tree

7 files changed

+62
-17
lines changed

7 files changed

+62
-17
lines changed

tests/test_utils/test_to_spreadsheet_peer_review.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,15 +206,15 @@ def test_recommendations_tab_has_risk_columns_for_independent_review(self):
206206
self.assertIn("Recommendation number", headers)
207207

208208
def test_recommendations_tab_no_risk_columns_for_peer_review(self):
209-
"""Test that recommendations tab does NOT include 'Risk' and 'Recommendation number' for peer review."""
209+
"""Test that recommendations tab does NOT include 'Risk' and 'Risk number' for peer review."""
210210
excel_bytes = review_to_excel(self.peer_review)
211211
wb = load_workbook(BytesIO(excel_bytes))
212212
ws = wb["Recommendations"]
213213

214214
# Get header row
215215
headers = [cell.value for cell in ws[1]]
216216
self.assertNotIn("Risk", headers)
217-
self.assertNotIn("Recommendation number", headers)
217+
self.assertNotIn("Risk number", headers)
218218

219219
def test_recommendations_tab_column_count_differs_by_review_type(self):
220220
"""Test that recommendations tab has different column counts for different review types."""
@@ -251,7 +251,7 @@ def test_all_sheets_present_for_both_review_types(self):
251251

252252
def test_recommendations_tab_common_columns_present(self):
253253
"""Test that common columns are present in recommendations tab for both review types."""
254-
common_columns = ["Contributing outcome", "Target CAF profile", "Risk number", "Recommendation"]
254+
common_columns = ["Contributing outcome", "Target CAF profile", "Recommendation number", "Recommendation"]
255255

256256
# Test independent review
257257
excel_bytes = review_to_excel(self.independent_review)
@@ -346,14 +346,14 @@ def test_peer_review_does_not_have_review_comments_column(self):
346346
self.assertNotIn("Review comments", headers)
347347

348348
def test_peer_review_does_not_have_risk_columns(self):
349-
"""Test that peer_review does NOT have 'Risk' and 'Recommendation number' columns."""
349+
"""Test that peer_review does NOT have 'Risk' and 'Risk number' columns."""
350350
review = self.reviews["peer_review"]
351351
excel_bytes = review_to_excel(review)
352352
wb = load_workbook(BytesIO(excel_bytes))
353353
ws = wb["Recommendations"]
354354
headers = [cell.value for cell in ws[1]]
355355
self.assertNotIn("Risk", headers)
356-
self.assertNotIn("Recommendation number", headers)
356+
self.assertNotIn("Risk number", headers)
357357

358358

359359
class TestReviewToExcelDataIntegrity(TestCase):

tests/test_views/test_outcome_indicators_view.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,41 @@ def test_post_outcome_indicators_status(self, form_data, expected_outcome):
9393
self.assessment.refresh_from_db()
9494
self.assertEqual(form_data, self.assessment.assessments_data["A1.a"]["indicators"])
9595

96+
def test_cyber_advisor_does_not_save_indicator_data(self):
97+
cyber_advisor_profile = UserProfile.objects.get(role="cyber_advisor", organisation__name="Big organisation")
98+
self.client.force_login(cyber_advisor_profile.user)
99+
session = self.client.session
100+
session["current_profile_id"] = cyber_advisor_profile.id
101+
session["draft_assessment"] = {"assessment_id": self.assessment.id}
102+
session.save()
103+
104+
original_data = {}
105+
self.assessment.assessments_data = original_data
106+
self.assessment.last_updated_by = None
107+
self.assessment.save()
108+
109+
form_data = {
110+
"achieved_A1.a.5": True,
111+
"achieved_A1.a.6": True,
112+
"achieved_A1.a.7": True,
113+
"achieved_A1.a.8": True,
114+
"not-achieved_A1.a.1": False,
115+
"not-achieved_A1.a.2": False,
116+
"not-achieved_A1.a.3": False,
117+
"not-achieved_A1.a.4": False,
118+
"achieved_A1.a.5_comment": "Achieved comment one",
119+
"achieved_A1.a.6_comment": "",
120+
"achieved_A1.a.7_comment": "",
121+
"achieved_A1.a.8_comment": "",
122+
}
123+
response = self.client.post(self.url, data=form_data, follow=False)
124+
125+
self.assertEqual(response.status_code, 302)
126+
self.assertEqual(response["Location"], self.confirmation_url)
127+
self.assessment.refresh_from_db()
128+
self.assertEqual(self.assessment.assessments_data, original_data)
129+
self.assertIsNone(self.assessment.last_updated_by)
130+
96131
def test_post_confirmation_with_no_summary(self):
97132
"""
98133
Summary:

webcaf/webcaf/caf/views/factory.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from webcaf.webcaf.forms.general import ContinueForm, NextActionForm
1919
from webcaf.webcaf.utils import mask_email
2020
from webcaf.webcaf.utils.caf import CafFormUtil
21+
from webcaf.webcaf.utils.permission import PermissionUtil
2122
from webcaf.webcaf.utils.session import SessionUtil
2223
from webcaf.webcaf.views.general import FormViewWithBreadcrumbs, assessment_required
2324

@@ -141,9 +142,16 @@ def form_valid(self, form):
141142
validation.
142143
:return: The HTTP response returned by the parent class's form_valid method.
143144
"""
145+
146+
current_user_profile = SessionUtil.get_current_user_profile(self.request)
147+
# If the user does not have the edit permissions, then skip the
148+
# update and show the next page.
149+
if not PermissionUtil.current_user_can_edit_assessments(current_user_profile):
150+
self.logger.info("Current user only has view permission, so not saving any data")
151+
return FormView.form_valid(self, form)
152+
144153
assessment = SessionUtil.get_current_assessment(self.request)
145154
if assessment:
146-
current_user_profile = SessionUtil.get_current_user_profile(self.request)
147155
if self.class_id not in assessment.assessments_data:
148156
assessment.assessments_data[self.class_id] = {}
149157
if self.stage not in assessment.assessments_data[self.class_id]:

webcaf/webcaf/templates/caf/confirmation.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{% extends "base.html" %}
2+
{% load permission_extras %}
23
{% load static %}
34
{% load govuk_frontend_django %}
45
{% load csp %}
@@ -153,7 +154,9 @@ <h1 class="govuk-heading-l">{{ view.class_id }} {{ title }} Outcome</h1>
153154
</div>
154155
</div>
155156
<div class="govuk-button-group">
156-
<button type="submit" class="govuk-button" data-module="govuk-button" data-govuk-button-init="">
157+
{% current_user_can_edit_assessments current_profile as can_edit_assessments %}
158+
<button type="submit" class="govuk-button" data-module="govuk-button" data-govuk-button-init=""
159+
{% if not can_edit_assessments %}disabled{% endif %}>
157160
Save and continue
158161
</button>
159162
</div>

webcaf/webcaf/templates/caf/indicators.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,8 @@ <h1 class="govuk-heading-l">{{ view.class_id }} {{ title }}</h1>
101101
<div class="govuk-button-group">
102102
{% current_user_can_edit_assessments current_profile as can_edit_assessments %}
103103
<button type="submit" class="govuk-button" data-module="govuk-button"
104-
{% if not can_edit_assessments %} disabled {% endif %}
105104
data-govuk-button-init="">
106-
Save and continue
105+
{% if not can_edit_assessments %}Continue{% else %}Save and continue{% endif %}
107106
</button>
108107
<a class="govuk-link" href="{% url back_url %}">Back to {{ objective_name }} </a>
109108
</div>

webcaf/webcaf/templates/review/revisions.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ <h1 class="govuk-heading-l">Report history</h1>
6464
href="{% url 'download-report' pk=object.id version=revision_number %}">Download
6565
(PDF)</a> |
6666
<a class="govuk-link"
67-
href="{% url 'download-excel-report' pk=object.id version=revision_number %}">Download
68-
(XLS)</a>
67+
href="{% url 'download-excel-report' pk=object.id version=revision_number %}">Download data
68+
</a>
6969
{% endwith %}
7070
</p>
7171
</div>
@@ -121,8 +121,8 @@ <h1 class="govuk-heading-l">Report history</h1>
121121
href="{% url 'download-report' pk=revision.instance.id version=forloop.revcounter %}">Download
122122
(PDF)</a><br/>
123123
<a class="govuk-link" target="_blank"
124-
href="{% url 'download-excel-report' pk=revision.instance.id version=forloop.revcounter %}">Download
125-
(XLS)</a>
124+
href="{% url 'download-excel-report' pk=revision.instance.id version=forloop.revcounter %}">Download data
125+
</a>
126126
</td>
127127
</tr>
128128
{% endfor %}

webcaf/webcaf/utils/to_spreadsheet.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,17 +276,17 @@ def _add_recommendations_tab(wb: Workbook, review: Review):
276276
[
277277
"Contributing outcome",
278278
"Target CAF profile",
279-
"Risk number",
280279
]
281280
+ (
282281
[
282+
"Risk number",
283283
"Risk",
284-
"Recommendation number",
285284
]
286285
if review.assessment.review_type != "peer_review"
287286
else []
288287
)
289288
+ [
289+
"Recommendation number",
290290
"Recommendation",
291291
]
292292
)
@@ -312,17 +312,17 @@ def _add_recommendations_tab(wb: Workbook, review: Review):
312312
[
313313
contributing_outcome_titles[recommendation.outcome],
314314
profile_met,
315-
f"{prefix}{recommendation_group.group_index}",
316315
]
317316
+ (
318317
[
318+
f"{prefix}{recommendation_group.group_index}",
319319
recommendation.title,
320-
recommendation.id,
321320
]
322321
if review.assessment.review_type != "peer_review"
323322
else []
324323
)
325324
+ [
325+
recommendation.id,
326326
recommendation.text,
327327
]
328328
)

0 commit comments

Comments
 (0)