Skip to content

Commit a60bb30

Browse files
authored
Merge pull request #2253 from HicServices/task/RDMP-341-harden-project-specific
Task/rdmp 341 harden project specific
2 parents b9c49a7 + 502ed75 commit a60bb30

File tree

3 files changed

+30
-12
lines changed

3 files changed

+30
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
## [9.0.3] - 2025-11-03
88
- Improve checking for default pipelines
99
- Improve confluence catalogue metadata extraction
10+
- Improve project specific catalogue error handling
1011

1112
## [9.0.2] - 2025-10-21
1213
- Add ability to view logs as a flat list. Default settings can be updated via user settings

Rdmp.Core.Tests/Curation/ProjectspecificCatalogueTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ public void SetupTests(int projectCount = 0, int projectSpecificCount = 0, int e
5151
_activator.Publish(_extractionInfo1);
5252
if (projectCount > 0)
5353
{
54-
_project1 = new Project(DataExportRepository, "Project1");
54+
_project1 = new Project(DataExportRepository, $"Project{projectCount}");
5555
_project1.SaveToDatabase();
5656
_activator.Publish(_project1);
5757

5858
}
5959
if (projectCount > 1)
6060
{
61-
_project2 = new Project(DataExportRepository, "Project1");
61+
_project2 = new Project(DataExportRepository, $"Project{projectCount}");
6262
_project2.SaveToDatabase();
6363
_activator.Publish(_project2);
6464

@@ -204,7 +204,7 @@ public void MakeSingleCatalogueProjectSpecificWhenAlreadyInOtherProjectExtractio
204204
public void MakeSingleCatalogueProjectSpecificWhenAlreadyInOtherProjectAllowExtractionTest()
205205
{
206206
SetupTests(2, 0, 1);
207-
MakeProjectSpecific(_catalogue, _project1, new List<int>() { _project2.ID });
207+
MakeProjectSpecific(_catalogue, _project1, new List<int>() { _project1.ID });
208208
MakeProjectSpecific(_catalogue, _project2, new List<int>() { _project1.ID });
209209
Assert.That(_activator.RepositoryLocator.CatalogueRepository.GetObjectByID<Catalogue>(_catalogue.ID).IsProjectSpecific(_activator.RepositoryLocator.DataExportRepository), Is.True);
210210
Assert.That(_activator.RepositoryLocator.DataExportRepository.GetAllObjectsWhere<ExtractableDataSet>("Catalogue_ID", _catalogue.ID).First().Projects.Count, Is.EqualTo(2));

Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandMakeCatalogueProjectSpecific.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Rdmp.Core.Icons.IconProvision;
1010
using Rdmp.Core.Providers;
1111
using Rdmp.Core.Repositories.Construction;
12+
using Rdmp.Core.ReusableLibraryCode.Checks;
1213
using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision;
1314
using SixLabors.ImageSharp;
1415
using SixLabors.ImageSharp.PixelFormats;
@@ -29,7 +30,7 @@ public class ExecuteCommandMakeCatalogueProjectSpecific : BasicCommandExecution,
2930

3031
[UseWithObjectConstructor]
3132
public ExecuteCommandMakeCatalogueProjectSpecific(IBasicActivateItems itemActivator, ICatalogue catalogue,
32-
IProject project, [DemandsInitialization("Ignore Validation",DemandType.Unspecified,defaultValue:false)]bool force) : this(itemActivator)
33+
IProject project, [DemandsInitialization("Ignore Validation", DemandType.Unspecified, defaultValue: false)] bool force) : this(itemActivator)
3334
{
3435
_catalogue = catalogue;
3536
_project = project;
@@ -49,14 +50,28 @@ public override string GetCommandHelp() =>
4950
public override void Execute()
5051
{
5152
if (_catalogue == null)
52-
SetCatalogue(SelectOne(BasicActivator.RepositoryLocator.CatalogueRepository.GetAllObjects<Catalogue>().ToList()));
53+
{
54+
var catalogues = BasicActivator.RepositoryLocator.CatalogueRepository.GetAllObjects<Catalogue>().ToList();
55+
if (!catalogues.Any())
56+
{
57+
Show($"No valid catalogues found to make project specific.");
58+
return;
59+
}
60+
SetCatalogue(SelectOne(catalogues));
61+
}
5362
if (!_hasRanCatalogueValidation)
5463
{
5564
SetCatalogue(_catalogue);
5665
}
57-
if(_existingProjectIDs is null)
66+
if (_existingProjectIDs is null)
5867
GetExistingProjectIDs();
5968

69+
var projects = GetListOfValidProjects();
70+
if (!projects.Any())
71+
{
72+
Show($"No valid projects found to make {_catalogue.Name} project specific.");
73+
return;
74+
}
6075
_project ??= SelectOne<Project>(GetListOfValidProjects());
6176

6277
if (_project == null || _catalogue == null)
@@ -90,15 +105,17 @@ public IAtomicCommandWithTarget SetTarget(DatabaseEntity target)
90105
private List<Project> GetListOfValidProjects()
91106
{
92107
var dataExportChildProvider = ((DataExportChildProvider)_activator.CoreChildProvider);
93-
94-
var availableProjects = dataExportChildProvider.Projects.Where(p => !dataExportChildProvider.ExtractableDataSetProjects.Where(edsp => edsp.Project_ID == p.ID).Select(edsp => edsp.DataSet.Catalogue).Contains(_catalogue));
95-
return availableProjects.Where(p => ProjectSpecificCatalogueManager.CanMakeCatalogueProjectSpecific(_activator.RepositoryLocator.DataExportRepository, _catalogue, p, _existingProjectIDs)).ToList();
108+
var eds = _activator.RepositoryLocator.DataExportRepository.GetAllObjectsWithParent<ExtractableDataSet>(_catalogue);
109+
var edsp = _activator.RepositoryLocator.DataExportRepository.GetAllObjects<ExtractableDataSetProject>().Where(edsp => eds.Contains(edsp.DataSet));
110+
var pti = edsp.Select(e => e.Project_ID).ToList();
111+
var validProjects = dataExportChildProvider.Projects.Where(p => _force ||(!pti.Contains(p.ID) && ProjectSpecificCatalogueManager.CanMakeCatalogueProjectSpecific(_activator.RepositoryLocator.DataExportRepository, _catalogue, p, pti)));
112+
return validProjects.ToList();
96113
}
97114

98115
private void GetExistingProjectIDs()
99-
{
116+
{
100117
var dataExportChildProvider = ((DataExportChildProvider)_activator.CoreChildProvider);
101-
var existingProjects = dataExportChildProvider.Projects.Where(p => dataExportChildProvider.ExtractableDataSetProjects.Where(edsp => edsp.Project_ID==p.ID).Select(edsp => edsp.DataSet.Catalogue).Contains(_catalogue));
118+
var existingProjects = dataExportChildProvider.Projects.Where(p => dataExportChildProvider.ExtractableDataSetProjects.Where(edsp => edsp.Project_ID == p.ID).Select(edsp => edsp.DataSet.Catalogue).Contains(_catalogue));
102119
_existingProjectIDs = existingProjects.Select(p => p.ID).ToList();
103120
}
104121

@@ -113,7 +130,7 @@ private void SetCatalogue(ICatalogue catalogue)
113130
return;
114131
}
115132
var status = _catalogue.GetExtractabilityStatus(BasicActivator.RepositoryLocator.DataExportRepository);
116-
if (!GetListOfValidProjects().Any() && !_force)
133+
if (!GetListOfValidProjects().Any() && !_force)
117134
{
118135
SetImpossible("No valid Projects available");
119136
}

0 commit comments

Comments
 (0)