Skip to content

Commit 79e5733

Browse files
authored
Merge pull request #2568 from TechnologyEnhancedLearning/Release-2023.26-Hotfix
Release DLS 2023.26-Hotfix merge to production
2 parents dd924dc + b91a58a commit 79e5733

File tree

13 files changed

+137
-138
lines changed

13 files changed

+137
-138
lines changed

DigitalLearningSolutions.Data/DataServices/CourseContentService.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -269,19 +269,19 @@ FROM Sessions AS S1 WITH (NOLOCK)
269269
{
270270
try
271271
{
272-
return connection.QueryFirst<int>(
273-
@"SELECT ProgressId
274-
FROM Progress
272+
return connection.QueryFirst<int?>(
273+
@"SELECT COALESCE((SELECT ProgressID
274+
FROM Progress
275275
WHERE CandidateID = @candidateId
276276
AND CustomisationID = @customisationId
277277
AND SystemRefreshed = 0
278-
AND RemovedDate IS NULL",
278+
AND RemovedDate IS NULL), NULL) AS ProgressId",
279279
new { candidateId, customisationId }
280280
);
281281
}
282282
catch (InvalidOperationException)
283283
{
284-
return null;
284+
return 0;
285285
}
286286
}
287287
}

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/CandidateAssessmentsDataService.cs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -348,8 +348,10 @@ public CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificat
348348
LearnerDetails.SelfAssessmentID,
349349
LearnerDetails.Vocabulary,
350350
LearnerDetails.SupervisorDelegateId,
351-
LearnerDetails.FormattedDate
351+
LearnerDetails.FormattedDate,
352+
LearnerDetails.NonReportable
352353
FROM(SELECT casv.ID,
354+
ca.NonReportable,
353355
sa.Name AS SelfAssessment,
354356
Learner.FirstName + ' ' + Learner.LastName AS LearnerName,
355357
Learner.ProfessionalRegistrationNumber AS LearnerPRN,
@@ -430,7 +432,7 @@ LEFT OUTER JOIN SelfAssessmentSupervisorRoles AS sasr
430432
INNER JOIN Users AS u ON U.PrimaryEmail = au.Email
431433
WHERE
432434
(sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @DelegateUserID) AND (ca.SelfAssessmentID = @selfAssessmentId)) Accessor
433-
ORDER BY AccessorPRN DESC",
435+
ORDER BY AccessorName, AccessorPRN DESC",
434436
new { selfAssessmentId, delegateUserID }
435437
);
436438
}
@@ -478,21 +480,5 @@ CandidateAssessmentSupervisorVerifications AS casv INNER JOIN
478480
new { CandidateAssessmentSupervisorVerificationsId }
479481
);
480482
}
481-
public int? GetRoleCount(int CandidateId)
482-
{
483-
return connection.QueryFirstOrDefault<int?>(
484-
@"SELECT COUNT(sas1.CompetencyID) AS RoleCount FROM
485-
SelfAssessmentResults AS sar1
486-
LEFT OUTER JOIN
487-
CompetencyAssessmentQuestionRoleRequirements AS caqrr1 ON sar1.Result = caqrr1.LevelValue AND sar1.CompetencyID = caqrr1.CompetencyID AND sar1.SelfAssessmentID = caqrr1.SelfAssessmentID AND
488-
sar1.AssessmentQuestionID = caqrr1.AssessmentQuestionID RIGHT OUTER JOIN
489-
SelfAssessmentStructure AS sas1 INNER JOIN
490-
CandidateAssessments AS ca1 ON sas1.SelfAssessmentID = ca1.SelfAssessmentID INNER JOIN
491-
CompetencyAssessmentQuestions AS caq1 ON sas1.CompetencyID = caq1.CompetencyID ON sar1.SelfAssessmentID =sas1.SelfAssessmentID and sar1.CompetencyID=sas1.CompetencyID AND sar1.AssessmentQuestionID = caq1.AssessmentQuestionID AND sar1.DelegateUserID = ca1.DelegateUserID LEFT OUTER JOIN
492-
CandidateAssessmentOptionalCompetencies AS caoc1 ON sas1.CompetencyID = caoc1.CompetencyID AND sas1.CompetencyGroupID = caoc1.CompetencyGroupID AND ca1.ID = caoc1.CandidateAssessmentID
493-
WHERE (ca1.ID = @CandidateId ) AND (CAOC1.IncludedInSelfAssessment = 1)",
494-
new { CandidateId }
495-
);
496-
}
497483
}
498484
}

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentDataService.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ int GetSelfAssessmentActivityDelegatesExportCount(string searchString, string so
169169
CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
170170
IEnumerable<Accessor> GetAccessor(int selfAssessmentId, int delegateUserID);
171171
ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
172-
int? GetRoleCount(int CandidateId);
173172
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
174173
}
175174

DigitalLearningSolutions.Data/DataServices/SelfAssessmentDataService/SelfAssessmentSupervisorDataService.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ int delegateUserId
7676
{
7777
return connection.Query<SelfAssessmentSupervisor>(
7878
@$"{SelectSelfAssessmentSupervisorQuery}
79-
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)",
79+
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (ca.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)
80+
ORDER BY SupervisorName",
8081
new { selfAssessmentId, delegateUserId }
8182
);
8283
}
@@ -91,7 +92,8 @@ int delegateUserId
9192
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.DelegateUserID = @delegateUserId)
9293
AND (ca.SelfAssessmentID = @selfAssessmentId) AND (sd.SupervisorAdminID IS NOT NULL)
9394
AND (coalesce(sasr.ResultsReview, 1) = 1)
94-
AND au.Active = 1",
95+
AND au.Active = 1
96+
ORDER BY SupervisorName",
9597
new { selfAssessmentId, delegateUserId }
9698
);
9799
}
@@ -119,7 +121,8 @@ FROM SupervisorDelegates AS sd
119121
INNER JOIN DelegateAccounts da ON sd.DelegateUserID = da.UserID and au.CentreID = da.CentreID and da.Active=1
120122
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.SupervisorAdminID IS NOT NULL) AND (sd.DelegateUserID = @delegateUserId)
121123
AND (au.Supervisor = 1 OR au.NominatedSupervisor = 1) AND (au.Active = 1)
122-
AND (ca.SelfAssessmentID <> @selfAssessmentId)",
124+
AND (ca.SelfAssessmentID <> @selfAssessmentId)
125+
ORDER BY SupervisorName",
123126
new { selfAssessmentId, delegateUserId }
124127
);
125128
}
@@ -144,7 +147,8 @@ int delegateUserId
144147
@$"{SelectSelfAssessmentSupervisorQuery}
145148
WHERE (sd.Removed IS NULL) AND (cas.Removed IS NULL) AND (sd.DelegateUserID = @delegateUserId) AND (ca.SelfAssessmentID = @selfAssessmentId)
146149
AND (sd.SupervisorAdminID IS NOT NULL) AND (coalesce(sasr.SelfAssessmentReview, 1) = 1)
147-
AND (cas.ID NOT IN (SELECT CandidateAssessmentSupervisorID FROM CandidateAssessmentSupervisorVerifications WHERE Verified IS NULL))",
150+
AND (cas.ID NOT IN (SELECT CandidateAssessmentSupervisorID FROM CandidateAssessmentSupervisorVerifications WHERE Verified IS NULL))
151+
ORDER BY SupervisorName",
148152
new { selfAssessmentId, delegateUserId }
149153
);
150154
}
@@ -251,7 +255,8 @@ INNER JOIN CandidateAssessments AS ca
251255
AND (cas.Removed IS NULL)
252256
AND (sd.Removed IS NULL)
253257
)
254-
AND (Supervisor = 1 OR NominatedSupervisor = 1) AND (Active = 1) AND (Email LIKE '%@%')",
258+
AND (Supervisor = 1 OR NominatedSupervisor = 1) AND (Active = 1) AND (Email LIKE '%@%')
259+
ORDER BY Forename, Surname",
255260
new { centreId, selfAssessmentId, delegateUserId }
256261
);
257262
}

DigitalLearningSolutions.Data/Models/SelfAssessments/CompetencySelfAssessmentCertificate.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,6 @@ public class CompetencySelfAssessmentCertificate
2626
public string? Vocabulary { get; set; }
2727
public int SupervisorDelegateId { get; set; }
2828
public string FormattedDate { get; set; } = string.Empty;
29+
public bool NonReportable { get; set; }
2930
}
3031
}

DigitalLearningSolutions.Web.Tests/Controllers/LearningMenu/IndexTests.cs

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -241,49 +241,50 @@ public void Index_unable_to_enrol_should_not_StartOrUpdate_course_sessions()
241241
// Then
242242
A.CallTo(() => sessionService.StartOrUpdateDelegateSession(A<int>._, A<int>._, A<ISession>._)).MustNotHaveHappened();
243243
}
244-
245-
[Test]
246-
public void Index_detects_id_manipulation_no_progress_id()
247-
{
248-
// Given
249-
var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
250-
A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
251-
.Returns(expectedCourseContent);
252-
A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
253-
A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
254-
255-
// When
256-
var result = controller.Index(CustomisationId);
257-
258-
// Then
259-
result.Should()
260-
.BeRedirectToActionResult()
261-
.WithControllerName("LearningSolutions")
262-
.WithActionName("StatusCode")
263-
.WithRouteValue("code", 404);
264-
}
265-
266-
[Test]
267-
public void Index_detects_id_manipulation_self_register_false()
268-
{
269-
// Given
270-
var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
271-
A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
272-
.Returns(expectedCourseContent);
273-
A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
274-
A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
275-
A.CallTo(() => courseDataService.GetSelfRegister(CustomisationId)).Returns(false);
276-
277-
// When
278-
var result = controller.Index(CustomisationId);
279-
280-
// Then
281-
result.Should()
282-
.BeRedirectToActionResult()
283-
.WithControllerName("LearningSolutions")
284-
.WithActionName("StatusCode")
285-
.WithRouteValue("code", 404);
286-
}
244+
//Deprecated in response to TD-3838 - a bug caused by this id manipulation detection functionality
245+
246+
//[Test]
247+
//public void Index_detects_id_manipulation_no_progress_id()
248+
//{
249+
// // Given
250+
// var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
251+
// A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
252+
// .Returns(expectedCourseContent);
253+
// A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
254+
// A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
255+
256+
// // When
257+
// var result = controller.Index(CustomisationId);
258+
259+
// // Then
260+
// result.Should()
261+
// .BeRedirectToActionResult()
262+
// .WithControllerName("LearningSolutions")
263+
// .WithActionName("StatusCode")
264+
// .WithRouteValue("code", 404);
265+
//}
266+
267+
//[Test]
268+
//public void Index_detects_id_manipulation_self_register_false()
269+
//{
270+
// // Given
271+
// var expectedCourseContent = CourseContentHelper.CreateDefaultCourseContent(CustomisationId);
272+
// A.CallTo(() => courseContentService.GetCourseContent(CandidateId, CustomisationId))
273+
// .Returns(expectedCourseContent);
274+
// A.CallTo(() => courseContentService.GetOrCreateProgressId(CandidateId, CustomisationId, CentreId)).Returns(10);
275+
// A.CallTo(() => courseContentService.GetProgressId(CandidateId, CustomisationId)).Returns(null);
276+
// A.CallTo(() => courseDataService.GetSelfRegister(CustomisationId)).Returns(false);
277+
278+
// // When
279+
// var result = controller.Index(CustomisationId);
280+
281+
// // Then
282+
// result.Should()
283+
// .BeRedirectToActionResult()
284+
// .WithControllerName("LearningSolutions")
285+
// .WithActionName("StatusCode")
286+
// .WithRouteValue("code", 404);
287+
//}
287288

288289
[Test]
289290
public void Index_not_detects_id_manipulation_self_register_true()

DigitalLearningSolutions.Web/Controllers/LearningMenuController/LearningMenuController.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,11 @@ public IActionResult Index(int customisationId)
8585
var sectionId = courseContent.Sections.First().Id;
8686
return RedirectToAction("Section", "LearningMenu", new { customisationId, sectionId });
8787
}
88-
if (UniqueIdManipulationDetected(candidateId, customisationId))
89-
{
90-
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
91-
}
88+
// Unique Id Manipulation Detection is being disabled as part of work on TD-3838 - a bug created by its introduction
89+
//if (UniqueIdManipulationDetected(candidateId, customisationId))
90+
//{
91+
// return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
92+
//}
9293
var progressId = courseContentService.GetOrCreateProgressId(candidateId, customisationId, centreId);
9394
if (progressId == null)
9495
{
@@ -97,6 +98,7 @@ public IActionResult Index(int customisationId)
9798
$"Candidate id: {candidateId}, customisation id: {customisationId}, centre id: {centreId}");
9899
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 404 });
99100
}
101+
100102
if (sessionService.StartOrUpdateDelegateSession(candidateId, customisationId, HttpContext.Session) > 0)
101103
{
102104
courseContentService.UpdateProgress(progressId.Value);

DigitalLearningSolutions.Web/Controllers/LearningPortalController/Current.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,6 @@ public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessment
374374
}
375375

376376
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
377-
var roleCount = selfAssessmentService.GetRoleCount(candidateAssessmentId);
378377
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
379378
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
380379
var competencyIds = recentResults.Select(c => c.Id).ToArray();
@@ -413,7 +412,7 @@ public IActionResult CompetencySelfAssessmentCertificate(int candidateAssessment
413412

414413
ViewBag.CompetencySummaries = competencySummaries;
415414
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
416-
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment, roleCount);
415+
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, route, accessors, activitySummaryCompetencySelfAssesment);
417416
ViewBag.LoggedInSupervisorDelegatesId = supervisorDelegateId;
418417
return View("Current/CompetencySelfAssessmentCertificate", model);
419418
}
@@ -435,7 +434,6 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
435434
var delegateUserId = competencymaindata.LearnerId;
436435

437436
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
438-
var roleCount = selfAssessmentService.GetRoleCount(candidateAssessmentId);
439437
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
440438
var activitySummaryCompetencySelfAssesment = selfAssessmentService.GetActivitySummaryCompetencySelfAssesment(competencymaindata.Id);
441439
var assessment = selfAssessmentService.GetSelfAssessmentForCandidateById(delegateUserId, competencymaindata.SelfAssessmentID);
@@ -474,7 +472,7 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
474472
};
475473

476474
ViewBag.CompetencySummaries = competencySummaries;
477-
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment, roleCount);
475+
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, 1, accessors, activitySummaryCompetencySelfAssesment);
478476
var renderedViewHTML = RenderRazorViewToString(this, "Current/DownloadCompetencySelfAssessmentCertificate", model);
479477

480478
var pdfReportResponse = await pdfService.PdfReport(candidateAssessmentId.ToString(), renderedViewHTML, delegateId);

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ public IActionResult StartAddNewSupervisor(int selfAssessmentId)
639639
User.GetCentreIdKnownNotNull(),
640640
selfAssessmentId,
641641
User.GetUserIdKnownNotNull()
642-
).Select(c => new { c.CentreID, c.CentreName }).Distinct().ToList();
642+
).Select(c => new { c.CentreID, c.CentreName }).Distinct().OrderBy(o => o.CentreName).ToList();
643643

644644
if (distinctSupervisorCentres.Count() > 1)
645645
{
@@ -672,7 +672,7 @@ public IActionResult AddNewSupervisor(int selfAssessmentId,
672672
User.GetCentreIdKnownNotNull(),
673673
selfAssessmentId,
674674
User.GetUserIdKnownNotNull()
675-
).OrderBy(s => s.Forename).ToList();
675+
).ToList();
676676

677677
if (sessionAddSupervisor?.CentreID != null)
678678
{

DigitalLearningSolutions.Web/Services/SelfAssessmentService.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ public int GetSelfAssessmentActivityDelegatesExportCount(string searchString, st
147147
CompetencySelfAssessmentCertificate GetCompetencySelfAssessmentCertificate(int candidateAssessmentID);
148148
IEnumerable<Accessor> GetAccessor(int selfAssessmentId, int delegateUserID);
149149
ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAssesment(int CandidateAssessmentSupervisorVerificationsId);
150-
int? GetRoleCount(int CandidateId);
151150
bool IsUnsupervisedSelfAssessment(int selfAssessmentId);
152151
}
153152

@@ -537,11 +536,6 @@ public ActivitySummaryCompetencySelfAssesment GetActivitySummaryCompetencySelfAs
537536
{
538537
return selfAssessmentDataService.GetActivitySummaryCompetencySelfAssesment(CandidateAssessmentSupervisorVerificationsId);
539538

540-
}
541-
public int? GetRoleCount(int CandidateId)
542-
{
543-
return selfAssessmentDataService.GetRoleCount(CandidateId);
544-
545539
}
546540
public bool IsUnsupervisedSelfAssessment(int selfAssessmentId)
547541
{

0 commit comments

Comments
 (0)