Skip to content
Merged

Rc #356

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
2468b06
TD-4115 - Number of accessed showing incorrect in the certificate det…
Swapnamol May 3, 2024
56365f6
Merge pull request #338 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 3, 2024
ef7ebe9
TD-3023 fix for deleted blocks which are valid in an active published…
TobiAwe May 7, 2024
26abd61
TD-3023 check for obsolete files before saving new block collection.
TobiAwe May 7, 2024
db74a91
TD-4115: Fixes for the my learning tray in progress activities
Swapnamol May 7, 2024
dbbf1d1
Merge pull request #343 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 7, 2024
8a8d34a
Merge pull request #345 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 7, 2024
72ea324
TD-4121: LH-Issue with 'View certificate' link showing for all the co…
Swapnamol May 9, 2024
b9e1eeb
Removed unwanted condition
Swapnamol May 9, 2024
cc39e55
Merge pull request #349 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 9, 2024
3f711ae
TD-4121: Fixed the issue with the assessment certificate view
Swapnamol May 10, 2024
087cc98
Merge pull request #350 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 10, 2024
6bb737d
TD-3023 QuestionBlock wsi bugfix and draft published case file
OluwatobiAwe May 10, 2024
74ad8bd
Merge pull request #352 from TechnologyEnhancedLearning/Develop/Fixes…
OluwatobiAwe May 10, 2024
6f63913
TD-4115: Issues on showing statuses on 'My accessed Learning' section…
sarathlal-sarangadharan May 13, 2024
e95ee3d
Merge pull request #355 from TechnologyEnhancedLearning/Develop/Fixes…
Swapnamol May 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 31 additions & 16 deletions LearningHub.Nhs.WebUI/Controllers/Api/ContributeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -493,12 +493,12 @@ public async Task<ActionResult> SaveWeblinkDetailAsync([FromBody] WebLinkViewMod
public async Task<ActionResult> SaveCaseDetailAsync([FromBody] CaseViewModel request)
{
var existingResourceState = await this.resourceService.GetResourceVersionExtendedAsync(request.ResourceVersionId);
int resourceVersionId = await this.contributeService.SaveCaseDetailAsync(request);
if (existingResourceState.CaseDetails?.BlockCollection != null)
if (existingResourceState?.CaseDetails?.BlockCollection != null)
{
this.RemoveBlockCollectionFiles(existingResourceState.CaseDetails.BlockCollection, request.BlockCollection);
await this.RemoveBlockCollectionFiles(request.ResourceVersionId, existingResourceState.CaseDetails.BlockCollection, request.BlockCollection);
}

int resourceVersionId = await this.contributeService.SaveCaseDetailAsync(request);
return this.Ok(resourceVersionId);
}

Expand All @@ -512,12 +512,12 @@ public async Task<ActionResult> SaveCaseDetailAsync([FromBody] CaseViewModel req
public async Task<ActionResult> SaveAssessmentDetailAsync([FromBody] AssessmentViewModel request)
{
var existingResourceState = await this.resourceService.GetResourceVersionExtendedAsync(request.ResourceVersionId);
int resourceVersionId = await this.contributeService.SaveAssessmentDetailAsync(request);
if (existingResourceState != null && existingResourceState.AssessmentDetails != null)
{
this.RemoveBlockCollectionFiles(existingResourceState.AssessmentDetails, request);
await this.RemoveBlockCollectionFiles(request.ResourceVersionId, existingResourceState.AssessmentDetails, request);
}

int resourceVersionId = await this.contributeService.SaveAssessmentDetailAsync(request);
return this.Ok(resourceVersionId);
}

Expand Down Expand Up @@ -638,23 +638,24 @@ private async Task<bool> UserCanEditCatalogue(int catalogueId)
return await this.catalogueService.CanCurrentUserEditCatalogue(catalogueId);
}

private void RemoveBlockCollectionFiles(AssessmentViewModel existingModel, AssessmentViewModel newModel)
private async Task RemoveBlockCollectionFiles(int resourceVersionId, AssessmentViewModel existingModel, AssessmentViewModel newModel)
{
if (existingModel is { EndGuidance: { } } && existingModel.EndGuidance.Blocks != null)
{
this.RemoveBlockCollectionFiles(existingModel.EndGuidance, newModel.EndGuidance);
await this.RemoveBlockCollectionFiles(resourceVersionId, existingModel.EndGuidance, newModel.EndGuidance);
}

if (existingModel is { AssessmentContent: { } } && existingModel.AssessmentContent.Blocks != null)
{
this.RemoveBlockCollectionFiles(existingModel.AssessmentContent, newModel.AssessmentContent);
await this.RemoveBlockCollectionFiles(resourceVersionId, existingModel.AssessmentContent, newModel.AssessmentContent);
}
}

private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResource, BlockCollectionViewModel newResource)
private async Task RemoveBlockCollectionFiles(int resourceVersionId, BlockCollectionViewModel existingResource, BlockCollectionViewModel newResource)
{
try
{
var obsoleteFiles = await this.resourceService.GetObsoleteResourceFile(resourceVersionId, true);
var filePaths = new List<string>();
if (existingResource != null)
{
Expand Down Expand Up @@ -706,8 +707,8 @@ private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResourc
{
foreach (var oldblock in existingImages)
{
var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId);
if (entry == null)
var entry = newBlocks.FirstOrDefault(x => x.BlockType == BlockType.Media && x.MediaBlock != null && x.MediaBlock.MediaType == MediaType.Image && x.MediaBlock.Image != null && x.MediaBlock?.Image?.File?.FileId == oldblock.MediaBlock?.Image?.File?.FileId);
if (entry == null)
{
filePaths.Add(oldblock?.MediaBlock?.Image?.File?.FilePath);
}
Expand Down Expand Up @@ -771,7 +772,18 @@ private void RemoveBlockCollectionFiles(BlockCollectionViewModel existingResourc

if (filePaths != null && filePaths.Any())
{
_ = Task.Run(async () => { await this.fileService.PurgeResourceFile(null, filePaths); });
var deleteList = new List<string>();
foreach (var e in filePaths)
{
if (!obsoleteFiles.Contains(e))
{
continue;
}

deleteList.Add(e);
}

_ = Task.Run(async () => { await this.fileService.PurgeResourceFile(null, deleteList); });
}
}
catch (Exception ex)
Expand Down Expand Up @@ -838,12 +850,15 @@ private List<string> CheckQuestionBlock(BlockCollectionViewModel model)
}
else if (questionBlock.BlockType == BlockType.WholeSlideImage && questionBlock.WholeSlideImageBlock != null)
{
var existingWholeSlideImages = questionBlock.WholeSlideImageBlock.WholeSlideImageBlockItems.ToList();
if (existingWholeSlideImages.Any())
var existingWholeSlideImages = questionBlock.WholeSlideImageBlock?.WholeSlideImageBlockItems;
if (existingWholeSlideImages != null && existingWholeSlideImages.Any())
{
foreach (var wsi in existingWholeSlideImages)
{
filePath.Add(wsi.WholeSlideImage?.File?.FilePath);
if (wsi.WholeSlideImage != null && wsi.WholeSlideImage.File != null)
{
filePath.Add(wsi.WholeSlideImage.File.FilePath);
}
}
}
}
Expand Down Expand Up @@ -888,7 +903,7 @@ private List<string> CheckQuestionBlock(BlockCollectionViewModel model)
}
}

return filePath;
return filePath.Where(x => x != null).ToList();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
-- 17 Jan 2024 SA Changes to accomadate activity status changes
-- 27 Feb 2024 SS Fixed missing In progress resources in the My Accessed Learning tray issue
-- 2 May 2024 SA Fixed the issue on showing statuses on 'My accessed Learning' for resource type file
-- 13 May 2024 SA TD-4115
-------------------------------------------------------------------------------

CREATE PROCEDURE [resources].[GetDashboardResources]
Expand Down Expand Up @@ -226,7 +227,7 @@ BEGIN
INSERT INTO @MyActivity
SELECT TOP (@MaxRows) ra.ResourceId, MAX(ra.Id) ResourceActivityId
FROM
(SELECT a.* FROM activity.ResourceActivity a INNER JOIN (SELECT ResourceId, MAX(Id) as id FROM activity.ResourceActivity GROUP BY ResourceId,ActivityStatusId ) AS b ON a.ResourceId = b.ResourceId AND a.id = b.id order by a.Id desc OFFSET 0 ROWS) ra
(SELECT a.* FROM activity.ResourceActivity a INNER JOIN (SELECT ResourceId, MAX(Id) as id FROM activity.ResourceActivity GROUP BY ResourceId) AS b ON a.ResourceId = b.ResourceId AND a.id = b.id order by a.Id desc OFFSET 0 ROWS) ra
JOIN [resources].[Resource] r ON ra.ResourceId = r.Id
JOIN [resources].[ResourceVersion] rv ON rv.Id = ra.ResourceVersionId
LEFT JOIN [resources].[AssessmentResourceVersion] arv ON arv.ResourceVersionId = ra.ResourceVersionId
Expand All @@ -239,11 +240,12 @@ BEGIN
OR (r.ResourceTypeId IN (2, 7) AND (mar.Id IS NULL OR (mar.Id IS NOT NULL AND mar.PercentComplete < 100) OR ra.ActivityStart < '2020-09-07 00:00:00 +00:00'))
OR (r.ResourceTypeId = 6 AND (sa.CmiCoreLesson_status NOT IN (3, 5) AND (ra.ActivityStatusId NOT IN(3, 5))))
OR (r.ResourceTypeId IN (9) AND ra.ActivityStatusId NOT IN (3))
OR (r.ResourceTypeId = 11 AND ((ara.Id IS NOT NULL AND ara.score < arv.PassMark) OR ra.ActivityStatusId = 7))
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 2) AND ((ara.Id IS NOT NULL AND ara.score < arv.PassMark) OR ra.ActivityStatusId IN (7)))
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 1) AND ra.ActivityStatusId IN (7))
)
GROUP BY ra.ResourceId
ORDER BY ResourceActivityId DESC

SELECT ma.ResourceActivityId, r.Id AS ResourceId
,( SELECT TOP 1 rr.OriginalResourceReferenceId
FROM [resources].[ResourceReference] rr
Expand Down Expand Up @@ -385,7 +387,8 @@ BEGIN
AND (
(r.ResourceTypeId IN (2, 7) AND ra.ActivityStatusId IN (3) OR ra.ActivityStart < '2020-09-07 00:00:00 +00:00' OR mar.Id IS NOT NULL AND mar.PercentComplete = 100)
OR (r.ResourceTypeId = 6 AND (sa.CmiCoreLesson_status IN(3,5) OR (ra.ActivityStatusId IN(3, 5))))
OR (r.ResourceTypeId = 11 AND ara.Score >= arv.PassMark OR ra.ActivityStatusId IN(3, 5))
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType = 2) AND (ara.Score >= arv.PassMark OR ra.ActivityStatusId IN(3, 5)))
OR ((r.ResourceTypeId = 11 AND arv.AssessmentType =1) AND (ara.Score >= arv.PassMark AND ra.ActivityStatusId IN(3, 5)))
OR (r.ResourceTypeId IN (1, 5, 8, 9, 10, 12) AND ra.ActivityStatusId IN (3)))
GROUP BY ra.ResourceId
ORDER BY ResourceActivityId DESC
Expand Down
21 changes: 18 additions & 3 deletions WebAPI/LearningHub.Nhs.Services/MyLearningService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,13 @@ public async Task<Tuple<int, MyLearningDetailedItemViewModel>> GetResourceCertif
activityEntities.RemoveAll(x => x.Resource.ResourceTypeEnum == ResourceTypeEnum.Scorm && (x.ActivityStatusId == (int)ActivityStatusEnum.Downloaded || x.ActivityStatusId == (int)ActivityStatusEnum.Incomplete || x.ActivityStatusId == (int)ActivityStatusEnum.InProgress));
if (activityEntities.Any() && activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Assessment)
{
totalNumberOfAccess = activityQuery.SelectMany(x => x.AssessmentResourceActivity).OrderByDescending(a => a.CreateDate).ToList().Count();
activityEntities = activityEntities.Where(x => x.AssessmentResourceActivity.FirstOrDefault() != null && x.AssessmentResourceActivity.FirstOrDefault().Score.HasValue && ((int)Math.Round(x.AssessmentResourceActivity.FirstOrDefault().Score.Value, MidpointRounding.AwayFromZero) >= x.ResourceVersion.AssessmentResourceVersion.PassMark)).ToList();
}
else if (activityEntities.Any() && (activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Video || activityEntities.FirstOrDefault()?.Resource.ResourceTypeEnum == ResourceTypeEnum.Audio))
{
totalNumberOfAccess = activityQuery.SelectMany(x => x.MediaResourceActivity).OrderByDescending(a => a.CreateDate).ToList().Count();
}

if (activityEntities.Any())
{
Expand Down Expand Up @@ -270,9 +275,19 @@ public async Task<List<MyLearningDetailedItemViewModel>> PopulateMyLearningDetai
expectedActivity = latestActivityCheck.Where(x => x.Id == resourceActivity.Id && (x.ActivityStatusId == ((int)ActivityStatusEnum.Completed) || x.ActivityStatusId == ((int)ActivityStatusEnum.Incomplete) || x.ActivityStatusId == ((int)ActivityStatusEnum.Passed) || x.ActivityStatusId == ((int)ActivityStatusEnum.Downloaded))).OrderByDescending(x => x.ActivityStart).FirstOrDefault();
}

if (latestActivityCheck.Any() && expectedActivity != null && resourceActivity.ResourceVersion.CertificateEnabled == true)
if (latestActivityCheck.Any() && expectedActivity != null)
{
viewModel.CertificateEnabled = true;
bool isExpectedActivityIdMatched = false;
if (resourceActivity.Resource.ResourceTypeEnum == ResourceTypeEnum.Audio || resourceActivity.Resource.ResourceTypeEnum == ResourceTypeEnum.Video)
{
isExpectedActivityIdMatched = latestActivityCheck.OrderByDescending(x => x.ActivityStart).FirstOrDefault().Id == expectedActivity.LaunchResourceActivityId;
}
else
{
isExpectedActivityIdMatched = latestActivityCheck.OrderByDescending(x => x.ActivityStart).FirstOrDefault().Id == expectedActivity.Id;
}

viewModel.CertificateEnabled = isExpectedActivityIdMatched && resourceActivity.ResourceVersion.CertificateEnabled.GetValueOrDefault(false);
}
else
{
Expand Down Expand Up @@ -490,7 +505,7 @@ private IQueryable<ResourceActivity> ApplyFilters(IQueryable<ResourceActivity> q

if (requestModel.CertificateEnabled)
{
query = query.Where(x => x.ResourceVersion.CertificateEnabled.Equals(true));
query = query.Where(x => x.ResourceVersion.CertificateEnabled.Equals(true));
}

return query;
Expand Down
Loading