Skip to content

Commit 96bfc9c

Browse files
authored
Merge pull request #3042 from TechnologyEnhancedLearning/Develop/Features/TD-5216-RefactorImport
TD-5216 refactor import competencies
2 parents d340a01 + e02ef5e commit 96bfc9c

File tree

18 files changed

+421
-365
lines changed

18 files changed

+421
-365
lines changed

DigitalLearningSolutions.Data/DataServices/FrameworkDataService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2404,7 +2404,7 @@ public IEnumerable<BulkCompetency> GetBulkCompetenciesForFramework(int framework
24042404
if (frameworkId < 1)
24052405
{
24062406
return connection.Query<BulkCompetency>(
2407-
@"SELECT NULL AS ID, '' AS CompetencyGroup, '' AS GroupDescription, '' AS Competency, '' AS CompetencyDescription, NULL AS AlwaysShowDescription, '' AS FlagsCsv"
2407+
@"SELECT NULL AS ID, '' AS CompetencyGroup, '' AS GroupDescription, '' AS Competency, '' AS CompetencyDescription, 0 AS AlwaysShowDescription, '' AS FlagsCsv"
24082408
);
24092409
}
24102410
else

DigitalLearningSolutions.Data/Models/Frameworks/Import/CompetencyTableRow.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public CompetencyTableRow(IXLTable table, IXLRangeRow row)
2626

2727
RowNumber = row.RowNumber();
2828
id = row.Cell(1).GetValue<int?>();
29-
CompetencyGroup = FindFieldValue("CompetencyGroup");
30-
Competency = FindFieldValue("Competency");
31-
CompetencyDescription = FindFieldValue("CompetencyDescription");
32-
GroupDescription = FindFieldValue("GroupDescription");
29+
CompetencyGroup = row.Cell(2).GetValue<string?>();
30+
GroupDescription = row.Cell(3).GetValue<string?>();
31+
Competency = row.Cell(4).GetValue<string?>();
32+
CompetencyDescription = row.Cell(5).GetValue<string?>();
3333
AlwaysShowDescriptionRaw = FindFieldValue("AlwaysShowDescription");
3434
AlwaysShowDescription = bool.TryParse(AlwaysShowDescriptionRaw, out var hasPrn) ? hasPrn : (bool?)null;
3535
FlagsCsv = FindFieldValue("FlagsCSV");

DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ IReadOnlyCollection<CompetencyTableRow> competencyTableRows
2222
{
2323
ProcessedCount = competencyTableRows.Count;
2424
CompetencyAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
25+
CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated);
2526
GroupAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyGroupInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
2627
SkippedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.Skipped);
2728
Errors = competencyTableRows.Where(dr => dr.Error.HasValue).Select(dr => (dr.RowNumber, dr.Error!.Value));

DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
using DigitalLearningSolutions.Web.Helpers;
44
using DigitalLearningSolutions.Web.Models;
55
using DigitalLearningSolutions.Web.Services;
6-
using DigitalLearningSolutions.Web.ViewModels.Frameworks;
6+
using DigitalLearningSolutions.Web.ViewModels.Frameworks.Import;
77
using GDS.MultiPageFormData.Enums;
88
using Microsoft.AspNetCore.Mvc;
99
using System.IO;
@@ -16,21 +16,19 @@ public partial class FrameworksController
1616
public IActionResult ImportCompetencies(int frameworkId, string tabname, bool isNotBlank)
1717
{
1818
var adminId = GetAdminId();
19+
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminId);
1920
var userRole = frameworkService.GetAdminUserRoleForFrameworkId(adminId, frameworkId);
2021
if (userRole < 2)
2122
return StatusCode(403);
22-
var model = new ImportCompetenciesViewModel()
23-
{
24-
FrameworkId = frameworkId,
25-
IsNotBlank = isNotBlank
26-
};
27-
return View("Developer/ImportCompetencies", model);
23+
var model = new ImportCompetenciesViewModel(framework, isNotBlank);
24+
25+
return View("Developer/Import/Index", model);
2826
}
29-
public IActionResult DownloadCompetencies(int frameworkId, int DownloadOption)
27+
public IActionResult DownloadCompetencies(int frameworkId, int DownloadOption, string vocabulary)
3028
{
31-
string fileName = DownloadOption == 2 ? $"DLS Competencies for Bulk Update {clockUtility.UtcToday:yyyy-MM-dd}.xlsx" : "DLS Competencies for Bulk Upload.xlsx";
29+
string fileName = DownloadOption == 2 ? $"DLS {FrameworkVocabularyHelper.VocabularyPlural(vocabulary)} for Bulk Update {clockUtility.UtcToday:yyyy-MM-dd}.xlsx" : $"DLS {FrameworkVocabularyHelper.VocabularyPlural(vocabulary)} for Bulk Upload.xlsx";
3230
var content = importCompetenciesFromFileService.GetCompetencyFileForFramework(
33-
frameworkId, DownloadOption == 2 ? false : true
31+
frameworkId, DownloadOption == 2 ? false : true, vocabulary
3432
);
3533
return File(
3634
content,
@@ -40,24 +38,24 @@ public IActionResult DownloadCompetencies(int frameworkId, int DownloadOption)
4038
}
4139
[HttpPost]
4240
[Route("/Framework/{frameworkId}/{tabname}/Import")]
43-
[Route("/Framework/{frameworkId}/{tabname}/ImportCompleted")]
44-
public IActionResult StartImport(ImportCompetenciesViewModel model, string tabname, bool isNotBlank)
41+
[Route("/Framework/{frameworkId}/{tabname}/Import/Uploaded")]
42+
public IActionResult StartImport(ImportCompetenciesFormData model, int frameworkId, string tabname, bool isNotBlank)
4543
{
4644
if (!ModelState.IsValid)
47-
return View("Developer/ImportCompetencies", model);
45+
return View("Developer/Import/Index", model);
4846
try
4947
{
5048
var adminUserID = User.GetAdminIdKnownNotNull();
5149
var workbook = new XLWorkbook(model.ImportFile.OpenReadStream());
5250
if (!workbook.Worksheets.Contains(ImportCompetenciesFromFileService.CompetenciesSheetName))
5351
{
5452
ModelState.AddModelError("ImportFile", CommonValidationErrorMessages.InvalidCompetenciesUploadExcelFile);
55-
return View("Developer/ImportCompetencies", model);
53+
return View("Developer/Import/Index", model);
5654
}
5755
var competenciesFileName = FileHelper.UploadFile(webHostEnvironment, model.ImportFile);
58-
setupBulkUploadData(model.FrameworkId, adminUserID, competenciesFileName, tabname, isNotBlank);
56+
setupBulkUploadData(frameworkId, adminUserID, competenciesFileName, tabname, isNotBlank);
5957

60-
return RedirectToAction("ImportCompleted", "Frameworks", new { frameworkId = model.FrameworkId, tabname });
58+
return RedirectToAction("ImportCompleted", "Frameworks", new { frameworkId, tabname });
6159
}
6260
catch (DocumentFormat.OpenXml.Packaging.OpenXmlPackageException)
6361
{
@@ -66,10 +64,10 @@ public IActionResult StartImport(ImportCompetenciesViewModel model, string tabna
6664
}
6765
catch (InvalidHeadersException)
6866
{
69-
return View("Developer/ImportFailed");
67+
return View("Developer/Import/ImportFailed");
7068
}
7169
}
72-
[Route("/Framework/{frameworkId}/{tabname}/ImportCompleted")]
70+
[Route("/Framework/{frameworkId}/{tabname}/Import/Uploaded")]
7371
public IActionResult ImportCompleted()
7472
{
7573
var data = GetBulkUploadData();
@@ -78,27 +76,34 @@ public IActionResult ImportCompleted()
7876
var workbook = new XLWorkbook(filePath);
7977
try
8078
{
81-
var results = importCompetenciesFromFileService.PreProcessCompetenciesTable(workbook);
82-
var resultsModel = new ImportCompetenciesPreProcessViewModel(results) { IsNotBlank = data.IsNotBlank, TabName = data.TabName };
79+
var results = importCompetenciesFromFileService.PreProcessCompetenciesTable(workbook, data.FrameworkVocubulary);
80+
var resultsModel = new ImportCompetenciesPreProcessViewModel(results, data) { IsNotBlank = data.IsNotBlank, TabName = data.TabName };
8381
data.CompetenciesToProcessCount = resultsModel.ToProcessCount;
8482
data.CompetenciesToAddCount = resultsModel.CompetenciesToAddCount;
8583
data.CompetenciesToUpdateCount = resultsModel.CompetenciesToUpdateCount;
8684
setBulkUploadData(data);
87-
return View("Developer/ImportCompleted", resultsModel);
85+
return View("Developer/Import/ImportCompleted", resultsModel);
8886
}
8987
catch (InvalidHeadersException)
9088
{
9189
FileHelper.DeleteFile(webHostEnvironment, data.CompetenciesFileName);
9290
return View("ImportFailed");
9391
}
9492
}
93+
[Route("/Framework/{frameworkId}/{tabname}/Import/AssessmentQuestions")]
94+
public IActionResult AddAssessmentQuestions()
95+
{
96+
var data = GetBulkUploadData();
9597

98+
return View();
99+
}
96100
private void setupBulkUploadData(int frameworkId, int adminUserID, string competenciessFileName, string tabName, bool isNotBlank)
97101
{
98102
TempData.Clear();
99103
multiPageFormService.ClearMultiPageFormData(MultiPageFormDataFeature.AddCustomWebForm("BulkCompetencyDataCWF"), TempData);
104+
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminUserID);
100105
var today = clockUtility.UtcToday;
101-
var bulkUploadData = new BulkCompetenciesData(frameworkId, adminUserID, competenciessFileName, tabName, isNotBlank);
106+
var bulkUploadData = new BulkCompetenciesData(framework, adminUserID, competenciessFileName, tabName, isNotBlank);
102107
setBulkUploadData(bulkUploadData);
103108
}
104109
private void setBulkUploadData(BulkCompetenciesData bulkUploadData)

DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
1-
using System.Collections.Generic;
1+
using DigitalLearningSolutions.Data.Models.Frameworks;
2+
using System.Collections;
3+
using System.Collections.Generic;
24
using System.Linq;
35

46
namespace DigitalLearningSolutions.Web.Models
57
{
68
public class BulkCompetenciesData
79
{
810
public BulkCompetenciesData() { }
9-
public BulkCompetenciesData(int frameworkId, int adminUserId, string competenciesFileName, string tabName, bool isNotBlank)
11+
public BulkCompetenciesData(DetailFramework framework, int adminUserId, string competenciesFileName, string tabName, bool isNotBlank)
1012
{
11-
FrameworkId = frameworkId;
13+
FrameworkId = framework.ID;
14+
FrameworkName = framework.FrameworkName;
15+
PublishStatusID = framework.PublishStatusID;
16+
FrameworkVocubulary = framework.FrameworkConfig;
1217
AdminUserId = adminUserId;
1318
CompetenciesFileName = competenciesFileName;
1419
TabName = tabName;
1520
IsNotBlank = isNotBlank;
1621
}
1722
public int FrameworkId { get; set; }
23+
public string? FrameworkName { get; set; }
24+
public int PublishStatusID { get; set; }
25+
public string FrameworkVocubulary { get; set; }
1826
public string TabName { get; set; }
1927
public int AdminUserId { get; set; }
2028
public bool IsNotBlank { get; set; }

DigitalLearningSolutions.Web/Services/ImportCompetenciesFromFileService.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,27 @@ namespace DigitalLearningSolutions.Web.Services
1212
using DigitalLearningSolutions.Data.Exceptions;
1313
using DigitalLearningSolutions.Data.Helpers;
1414
using DigitalLearningSolutions.Data.Models.Frameworks.Import;
15-
using DigitalLearningSolutions.Web.Models;
16-
using Microsoft.AspNetCore.Http;
1715

1816
public interface IImportCompetenciesFromFileService
1917
{
20-
byte[] GetCompetencyFileForFramework(int frameworkId, bool v);
21-
public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook);
22-
public ImportCompetenciesResult ProcessCompetenciesFromFile(IXLWorkbook workbook, int adminUserId, int frameworkId);
18+
byte[] GetCompetencyFileForFramework(int frameworkId, bool isBlank, string vocabulary);
19+
public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook, string vocabulary);
20+
public ImportCompetenciesResult ProcessCompetenciesFromFile(IXLWorkbook workbook, int adminUserId, int frameworkId, string vocabulary);
2321
}
2422
public class ImportCompetenciesFromFileService : IImportCompetenciesFromFileService
2523
{
2624
private readonly IFrameworkService frameworkService;
2725
private static readonly XLTableTheme TableTheme = XLTableTheme.TableStyleLight9;
28-
public const string CompetenciesSheetName = "CompetenciesBulkUpload";
26+
public const string CompetenciesSheetName = "FrameworkBulkUpload";
2927
public ImportCompetenciesFromFileService(
3028
IFrameworkService frameworkService
3129
)
3230
{
3331
this.frameworkService = frameworkService;
3432
}
35-
public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook)
33+
public ImportCompetenciesResult PreProcessCompetenciesTable(IXLWorkbook workbook, string vocabulary)
3634
{
37-
var table = OpenCompetenciesTable(workbook);
35+
var table = OpenCompetenciesTable(workbook, vocabulary);
3836
var competencyRows = table.Rows().Skip(1).Select(row => new CompetencyTableRow(table, row)).ToList();
3937
foreach (var competencyRow in competencyRows)
4038
{
@@ -54,14 +52,14 @@ private void PreProcessCompetencyRow(CompetencyTableRow competencyRow)
5452
competencyRow.RowStatus = RowStatus.CompetencyUpdated;
5553
}
5654
}
57-
public ImportCompetenciesResult ProcessCompetenciesFromFile(IXLWorkbook workbook, int adminUserId, int frameworkId)
55+
public ImportCompetenciesResult ProcessCompetenciesFromFile(IXLWorkbook workbook, int adminUserId, int frameworkId, string vocabulary)
5856
{
5957
int maxFrameworkCompetencyId = frameworkService.GetMaxFrameworkCompetencyID();
6058
int maxFrameworkCompetencyGroupId = frameworkService.GetMaxFrameworkCompetencyGroupID();
61-
var table = OpenCompetenciesTable(workbook);
59+
var table = OpenCompetenciesTable(workbook, vocabulary);
6260
return ProcessCompetenciesTable(table, adminUserId, frameworkId, maxFrameworkCompetencyId, maxFrameworkCompetencyGroupId);
6361
}
64-
internal IXLTable OpenCompetenciesTable(IXLWorkbook workbook)
62+
internal IXLTable OpenCompetenciesTable(IXLWorkbook workbook, string vocabulary)
6563
{
6664
var worksheet = workbook.Worksheet(1);
6765
worksheet.Columns(1, 15).Unhide();
@@ -70,7 +68,7 @@ internal IXLTable OpenCompetenciesTable(IXLWorkbook workbook)
7068
throw new InvalidHeadersException();
7169
}
7270
var table = worksheet.Tables.Table(0);
73-
if (!ValidateHeaders(table))
71+
if (!ValidateHeaders(table, vocabulary))
7472
{
7573
throw new InvalidHeadersException();
7674
}
@@ -132,26 +130,26 @@ CompetencyTableRow competencyRow
132130
return maxFrameworkCompetencyGroupId;
133131
}
134132

135-
private static bool ValidateHeaders(IXLTable table)
133+
private static bool ValidateHeaders(IXLTable table, string Vocabulary)
136134
{
137135
var expectedHeaders = new List<string>
138136
{
139137
"ID",
140-
"CompetencyGroup",
138+
Vocabulary + "Group",
141139
"GroupDescription",
142-
"Competency",
143-
"CompetencyDescription",
140+
Vocabulary,
141+
Vocabulary + "Description",
144142
"AlwaysShowDescription",
145143
"FlagsCSV"
146144
}.OrderBy(x => x);
147145
var actualHeaders = table.Fields.Select(x => x.Name).OrderBy(x => x);
148146
return actualHeaders.SequenceEqual(expectedHeaders);
149147
}
150148

151-
public byte[] GetCompetencyFileForFramework(int frameworkId, bool blank)
149+
public byte[] GetCompetencyFileForFramework(int frameworkId, bool blank, string vocabulary)
152150
{
153151
using var workbook = new XLWorkbook();
154-
PopulateCompetenciesSheet(workbook, frameworkId, blank);
152+
PopulateCompetenciesSheet(workbook, frameworkId, blank, vocabulary);
155153
if (blank)
156154
{
157155
ClosedXmlHelper.HideWorkSheetColumn(workbook, "ID");
@@ -167,7 +165,7 @@ public byte[] GetCompetencyFileForFramework(int frameworkId, bool blank)
167165
workbook.SaveAs(stream);
168166
return stream.ToArray();
169167
}
170-
private void PopulateCompetenciesSheet(IXLWorkbook workbook, int frameworkId, bool blank)
168+
private void PopulateCompetenciesSheet(IXLWorkbook workbook, int frameworkId, bool blank, string vocabulary)
171169
{
172170

173171

@@ -184,8 +182,10 @@ private void PopulateCompetenciesSheet(IXLWorkbook workbook, int frameworkId, bo
184182
FlagsCSV = x.FlagsCsv,
185183
}
186184
);
187-
188185
ClosedXmlHelper.AddSheetToWorkbook(workbook, CompetenciesSheetName, competencies, TableTheme);
186+
ClosedXmlHelper.RenameWorksheetColumn(workbook, "CompetencyGroup", vocabulary + "Group");
187+
ClosedXmlHelper.RenameWorksheetColumn(workbook, "Competency", vocabulary);
188+
ClosedXmlHelper.RenameWorksheetColumn(workbook, "CompetencyDescription", vocabulary + "Description");
189189
}
190190
}
191191
}

DigitalLearningSolutions.Web/ViewModels/Frameworks/ImportCompetenciesViewModel.cs renamed to DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesFormData.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks
1+
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
22
{
33
using DigitalLearningSolutions.Web.Attributes;
44
using Microsoft.AspNetCore.Http;
55
using System.ComponentModel.DataAnnotations;
66

7-
public class ImportCompetenciesViewModel
7+
public class ImportCompetenciesFormData
88
{
9-
public int FrameworkId { get; set; }
10-
public bool IsNotBlank { get; set; }
119
[Required(ErrorMessage = "Import competencies file is required")]
1210
[AllowedExtensions(new[] { ".xlsx" }, "Import competencies file must be in xlsx format")]
1311
[MaxFileSize(5 * 1024 * 1024, "Maximum allowed file size is 5MB")]

0 commit comments

Comments
 (0)