Skip to content

Commit 629878a

Browse files
committed
Merge branch 'DLS-Release-v1.2.2' into UAT
2 parents ff9534d + 3b9a326 commit 629878a

File tree

7 files changed

+134
-78
lines changed

7 files changed

+134
-78
lines changed

DigitalLearningSolutions.Web.Tests/Controllers/LearningPortal/SelfAssessmentTests.cs

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -871,28 +871,6 @@ public void SelfAssessmentOverview_Should_Return_View_With_Optional_Filter_Appli
871871
result.Should().BeViewResult().ModelAs<SelfAssessmentOverviewViewModel>().CompetencyGroups.ToList()[0].Count().Should().Be(1);
872872
}
873873

874-
[Test]
875-
public void SelfAssessment_should_return_process_agreement_view_when_not_agreed_and_supervised()
876-
{
877-
// Given
878-
var selfAssessment = SelfAssessmentTestHelper.CreateDefaultSelfAssessment();
879-
selfAssessment.IsSupervised = true;
880-
selfAssessment.SelfAssessmentProcessAgreed = false;
881-
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(DelegateUserId, SelfAssessmentId))
882-
.Returns(selfAssessment);
883-
A.CallTo(() => selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(SelfAssessmentId, DelegateUserId))
884-
.Returns(new List<SelfAssessmentSupervisor>());
885-
886-
// When
887-
var result = controller.SelfAssessment(SelfAssessmentId);
888-
889-
// Then
890-
result.Should().BeViewResult()
891-
.WithViewName("SelfAssessments/AgreeSelfAssessmentProcess")
892-
.Model.Should().BeOfType<SelfAssessmentProcessViewModel>()
893-
.Which.SelfAssessmentID.Should().Be(SelfAssessmentId);
894-
}
895-
896874
[Test]
897875
public void SelfAssessment_should_return_description_view_when_process_agreed_or_not_supervised()
898876
{
@@ -931,25 +909,25 @@ public void ProcessAgreed_should_return_agree_view_when_modelstate_invalid()
931909
}
932910

933911
[Test]
934-
public void ProcessAgreed_should_mark_progress_and_return_description_view()
912+
public void ProcessAgreed_should_mark_progress_and_redirect_to_self_assessment()
935913
{
936914
// Given
937915
var selfAssessment = SelfAssessmentTestHelper.CreateDefaultSelfAssessment();
938-
var supervisors = new List<SelfAssessmentSupervisor>();
939916
var model = new SelfAssessmentProcessViewModel { SelfAssessmentID = SelfAssessmentId };
940917
A.CallTo(() => selfAssessmentService.GetSelfAssessmentForCandidateById(DelegateUserId, SelfAssessmentId))
941918
.Returns(selfAssessment);
942-
A.CallTo(() => selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(SelfAssessmentId, DelegateUserId))
943-
.Returns(supervisors);
944919

945920
// When
946921
var result = controller.ProcessAgreed(model);
947922

948923
// Then
949-
A.CallTo(() => selfAssessmentService.MarkProgressAgreed(SelfAssessmentId, DelegateUserId)).MustHaveHappened();
950-
result.Should().BeViewResult()
951-
.WithViewName("SelfAssessments/SelfAssessmentDescription")
952-
.Model.Should().BeEquivalentTo(new SelfAssessmentDescriptionViewModel(selfAssessment, supervisors));
924+
A.CallTo(() => selfAssessmentService.MarkProgressAgreed(SelfAssessmentId, DelegateUserId))
925+
.MustHaveHappenedOnceExactly();
926+
927+
result.Should().BeRedirectToActionResult()
928+
.WithActionName("SelfAssessment")
929+
.WithRouteValue("selfAssessmentId", SelfAssessmentId);
953930
}
931+
954932
}
955933
}

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
using Microsoft.AspNetCore.Mvc.ViewEngines;
2929
using Microsoft.AspNetCore.Mvc.ViewFeatures;
3030
using System.IO;
31-
31+
[ServiceFilter(typeof(RequireProcessAgreementFilter))]
3232
public partial class LearningPortalController
3333
{
3434
private const string CookieName = "DLSSelfAssessmentService";
@@ -68,17 +68,6 @@ public IActionResult SelfAssessment(int selfAssessmentId)
6868
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
6969
}
7070

71-
if (!selfAssessment.SelfAssessmentProcessAgreed && selfAssessment.IsSupervised)
72-
{
73-
var processmodel = new SelfAssessmentProcessViewModel()
74-
{
75-
SelfAssessmentID = selfAssessmentId,
76-
Vocabulary = selfAssessment.Vocabulary,
77-
VocabPlural = FrameworkVocabularyHelper.VocabularyPlural(selfAssessment.Vocabulary)
78-
};
79-
return View("SelfAssessments/AgreeSelfAssessmentProcess", processmodel);
80-
}
81-
8271
selfAssessmentService.IncrementLaunchCount(selfAssessmentId, delegateUserId);
8372
selfAssessmentService.UpdateLastAccessed(selfAssessmentId, delegateUserId);
8473
var supervisors = selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(
@@ -90,7 +79,30 @@ public IActionResult SelfAssessment(int selfAssessmentId)
9079
return View("SelfAssessments/SelfAssessmentDescription", model);
9180
}
9281

93-
[HttpPost]
82+
[Route("/LearningPortal/SelfAssessment/{selfAssessmentId:int}/AgreeProcess")]
83+
public IActionResult AgreeSelfAssessmentProcess(int selfAssessmentId)
84+
{
85+
var delegateUserId = User.GetUserIdKnownNotNull();
86+
var selfAssessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId);
87+
88+
if (selfAssessment == null)
89+
{
90+
logger.LogWarning(
91+
$"Attempt to display self assessment process for user {delegateUserId} with no self assessment"
92+
);
93+
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
94+
}
95+
96+
var processmodel = new SelfAssessmentProcessViewModel()
97+
{
98+
SelfAssessmentID = selfAssessmentId,
99+
Vocabulary = selfAssessment.Vocabulary,
100+
VocabPlural = FrameworkVocabularyHelper.VocabularyPlural(selfAssessment.Vocabulary)
101+
};
102+
return View("SelfAssessments/AgreeSelfAssessmentProcess", processmodel);
103+
}
104+
105+
[HttpPost("/LearningPortal/SelfAssessment/{selfAssessmentId:int}/AgreeProcess")]
94106
public IActionResult ProcessAgreed(SelfAssessmentProcessViewModel model)
95107
{
96108
if (!ModelState.IsValid)
@@ -107,13 +119,9 @@ public IActionResult ProcessAgreed(SelfAssessmentProcessViewModel model)
107119
);
108120
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
109121
}
110-
var supervisors = selfAssessmentService.GetAllSupervisorsForSelfAssessmentId(
111-
selfAssessmentId,
112-
delegateUserId
113-
).ToList();
114-
var selfAssessmentDescriptionViewModel = new SelfAssessmentDescriptionViewModel(selfAssessment, supervisors);
122+
115123
selfAssessmentService.MarkProgressAgreed(selfAssessmentId, delegateUserId);
116-
return View("SelfAssessments/SelfAssessmentDescription", selfAssessmentDescriptionViewModel);
124+
return RedirectToAction("SelfAssessment", new { selfAssessmentId });
117125

118126
}
119127

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
namespace DigitalLearningSolutions.Web.ServiceFilter
2+
{
3+
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.AspNetCore.Mvc.Filters;
5+
using DigitalLearningSolutions.Web.Services;
6+
using DigitalLearningSolutions.Web.Helpers;
7+
using Microsoft.Extensions.Logging;
8+
9+
public class RequireProcessAgreementFilter : IActionFilter
10+
{
11+
private readonly ISelfAssessmentService selfAssessmentService;
12+
private readonly ILogger<RequireProcessAgreementFilter> logger;
13+
14+
public RequireProcessAgreementFilter(
15+
ISelfAssessmentService selfAssessmentService,
16+
ILogger<RequireProcessAgreementFilter> logger
17+
)
18+
{
19+
this.selfAssessmentService = selfAssessmentService;
20+
this.logger = logger;
21+
}
22+
23+
public void OnActionExecuted(ActionExecutedContext context) { }
24+
25+
public void OnActionExecuting(ActionExecutingContext context)
26+
{
27+
if (!(context.Controller is Controller controller))
28+
{
29+
return;
30+
}
31+
32+
if (!context.ActionArguments.ContainsKey("selfAssessmentId"))
33+
{
34+
return;
35+
}
36+
37+
var selfAssessmentId = int.Parse(context.ActionArguments["selfAssessmentId"].ToString()!);
38+
var delegateUserId = controller.User.GetUserIdKnownNotNull();
39+
40+
var selfAssessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, selfAssessmentId);
41+
42+
if (selfAssessment == null)
43+
{
44+
logger.LogWarning(
45+
$"Attempt to access self assessment {selfAssessmentId} by user {delegateUserId}, but no such assessment found"
46+
);
47+
context.Result = new RedirectToActionResult("StatusCode", "LearningSolutions", new { code = 403 });
48+
return;
49+
}
50+
51+
var actionName = context.RouteData.Values["action"]?.ToString();
52+
if (actionName == "AgreeSelfAssessmentProcess" || actionName == "ProcessAgreed")
53+
{
54+
return;
55+
}
56+
57+
if (!selfAssessment.SelfAssessmentProcessAgreed && selfAssessment.IsSupervised)
58+
{
59+
logger.LogInformation(
60+
$"Redirecting user {delegateUserId} to agree process page for self assessment {selfAssessmentId}"
61+
);
62+
63+
context.Result = new RedirectToActionResult(
64+
"AgreeSelfAssessmentProcess",
65+
"LearningPortal",
66+
new { selfAssessmentId }
67+
);
68+
}
69+
}
70+
}
71+
}

DigitalLearningSolutions.Web/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ private static void RegisterWebServiceFilters(IServiceCollection services)
582582
services.AddScoped<VerifyUserHasVerifiedPrimaryEmail>();
583583
services.AddScoped<VerifyAdminAndDelegateUserCentre>();
584584
services.AddScoped<IsCentreAuthorizedSelfAssessment>();
585+
services.AddScoped<RequireProcessAgreementFilter>();
585586
services.AddScoped<VerifyAdminUserCanAccessSelfAssessment>();
586587
}
587588

DigitalLearningSolutions.Web/Styles/learningPortal/selfassessmentcertificate.scss

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,22 @@
9999
width: 100%;
100100
}
101101

102-
.pg-2 {
102+
.certificate .pg-2 {
103103
background-color: white;
104104
width: 100%;
105105
position: relative;
106106
display: flex;
107107
flex-direction: column;
108-
width: 100%;
109108
max-width: 210mm;
110109
min-height: 297mm;
111110
margin: 0;
112111
position: relative;
113112
background: white;
114113
}
115114

116-
.pg-2 .body {
115+
.certificate .pg-2 .body {
117116
padding: 50px;
117+
flex: 1;
118118
}
119119

120120
.activity {
@@ -126,6 +126,7 @@
126126

127127
.activity p, ul {
128128
width: 100%;
129+
word-break: break-word;
129130
}
130131

131132
.activity ul {
@@ -157,12 +158,6 @@
157158
.certificate .pg-1 {
158159
width: 100%;
159160
}
160-
161-
162-
163-
.pg-2 {
164-
width: 100%;
165-
}
166161
}
167162

168163
.certificate h1 {
@@ -378,18 +373,21 @@
378373
.certificate .nhsuk-u-margin-bottom-2 {
379374
margin-bottom: 8px !important;
380375
}
381-
}
376+
}
377+
382378
@media screen and (max-width: 767px) {
383379
.certificate {
384-
width: 95%;
380+
width: 100%;
385381
justify-content: space-around;
386382
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
387383
-webkit-print-color-adjust: exact;
388384
}
385+
389386
.certificate .pg-1 {
390-
width: 95%;
387+
width: 100%;
391388
}
389+
392390
.pg-2 {
393-
width: 95%;
391+
width: 100%;
394392
}
395393
}

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/AgreeSelfAssessmentProcess.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<li>If you don’t fully meet the requirements, you can still document your progress and next steps for future assessment.</li>
3232
</ol>
3333

34-
<form method="post" asp-controller="LearningPortal" asp-action="ProcessAgreed">
34+
<form method="post" asp-controller="LearningPortal" asp-action="ProcessAgreed" asp-route-selfAssessmentId="@Model.SelfAssessmentID">
3535
<div class="nhsuk-checkboxes__item">
3636
<vc:single-checkbox asp-for="@nameof(Model.ActionConfirmed)"
3737
label=" I understand and agree to the self-assessment process described above."

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificate.cshtml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
padding: 0 0;
1212
}
1313
14-
.nhsuk-width-container {
14+
.nhsuk-grid-row {
1515
margin: 0;
1616
}
1717
@@ -49,8 +49,8 @@
4949
{
5050
<li class="nhsuk-breadcrumb__item">
5151
<a class="nhsuk-breadcrumb__link trigger-loader " asp-controller="LearningPortal"
52-
asp-action="SelfAssessmentOverview" asp-route-vocabulary="@Model.VocabPlural"
53-
asp-route-selfAssessmentId="@Model.CompetencySelfAssessmentCertificates.SelfAssessmentID">
52+
asp-action="SelfAssessmentOverview" asp-route-vocabulary="@Model.VocabPlural"
53+
asp-route-selfAssessmentId="@Model.CompetencySelfAssessmentCertificates.SelfAssessmentID">
5454
&lt; Back
5555
</a>
5656
</li>
@@ -59,9 +59,9 @@
5959
{
6060
<li class="nhsuk-breadcrumb__item">
6161
<a class="nhsuk-breadcrumb__link trigger-loader" asp-controller="Supervisor"
62-
asp-action="ReviewDelegateSelfAssessment"
63-
asp-route-supervisorDelegateId="@Model.LoggedInSupervisorDelegateId"
64-
asp-route-candidateAssessmentId="@Model.CompetencySelfAssessmentCertificates.CandidateAssessmentID">
62+
asp-action="ReviewDelegateSelfAssessment"
63+
asp-route-supervisorDelegateId="@Model.LoggedInSupervisorDelegateId"
64+
asp-route-candidateAssessmentId="@Model.CompetencySelfAssessmentCertificates.CandidateAssessmentID">
6565
&lt; Back
6666
</a>
6767
</li>
@@ -76,15 +76,15 @@
7676
<h1>Certificate</h1>
7777

7878
<h2>@Model.CompetencySelfAssessmentCertificates.SelfAssessment - @Model.CompetencySelfAssessmentCertificates.LearnerName </h2>
79-
@if (Model.Vocabulary == "Proficiencies")
79+
@if (Model.Vocabulary == "Proficiencies")
8080
{
8181
<a class="nhsuk-button "
82-
asp-controller="LearningPortal"
83-
asp-route-candidateAssessmentId="@Model.CompetencySelfAssessmentCertificates.CandidateAssessmentID"
84-
asp-action="DownloadCertificate"
85-
role="button">
86-
Download certificate
87-
</a>
82+
asp-controller="LearningPortal"
83+
asp-route-candidateAssessmentId="@Model.CompetencySelfAssessmentCertificates.CandidateAssessmentID"
84+
asp-action="DownloadCertificate"
85+
role="button">
86+
Download certificate
87+
</a>
8888
}
8989
@if (Model.Vocabulary == "ProfileAssessment")
9090
{
@@ -99,9 +99,9 @@
9999
</div>
100100
<div class="certificate nhsuk-grid-column-full">
101101
<partial name="_SelfAssessmentCertificateFirstPage.cshtml" model=Model />
102-
<br /><br />
102+
<br />
103103
<partial name="_SelfAssessmentCertificateSecondPage.cshtml" model=Model />
104-
104+
105105
</div>
106106
</div>
107107
</div>

0 commit comments

Comments
 (0)