diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java index 082e9ade7..970d95b28 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java @@ -46,9 +46,9 @@ public class QuickWizardController extends BaseController { Funder funderEntity; //Create Funder if (quickWizard.getFunder() == null) { - throw new Exception("Funder is a mandatory entity"); + funderEntity = null; } else if (quickWizard.getFunder().getExistFunder() == null && quickWizard.getFunder().getLabel() == null) { - throw new Exception("Funder is a mandatory entity"); + funderEntity = null; } else if (quickWizard.getFunder().getExistFunder() == null && quickWizard.getFunder().getLabel() != null) { funderEntity = this.quickWizardManager.createOrUpdate(quickWizard.getFunder().toDataFunder(), principal); } else { @@ -58,9 +58,9 @@ public class QuickWizardController extends BaseController { eu.eudat.data.entities.Grant grantEntity; //Create Grant if (quickWizard.getGrant() == null) { - throw new Exception("Grant is a mandatory entity"); + grantEntity = null; } else if (quickWizard.getGrant().getExistGrant() == null && quickWizard.getGrant().getLabel() == null) { - throw new Exception("Grant is a mandatory entity"); + grantEntity = null; } else if (quickWizard.getGrant().getExistGrant() == null) { grantEntity = this.quickWizardManager.createOrUpdate(quickWizard.getGrant().toDataGrant(), principal); } else { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 4f5c76f66..cab65310f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -91,7 +91,9 @@ public class DashBoardManager { for (DMP dmp : dmps) { numberOfDatasets = numberOfDatasets + dmp.getDataset().stream() .filter(item -> item.getStatus() == Dataset.Status.FINALISED.getValue()).count(); - grants.add(dmp.getGrant()); + if (dmp.getGrant() != null) { + grants.add(dmp.getGrant()); + } } statistics.setTotalDataManagementPlanCount((long) dmps.size()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 6fddb00a3..bd1c93ac5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -53,6 +53,7 @@ import eu.eudat.models.data.doi.Doi; import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue; import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.*; import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.FieldCategory; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.SystemFieldType; import eu.eudat.models.data.funder.FunderDMPEditorModel; import eu.eudat.models.data.grant.GrantDMPEditorModel; import eu.eudat.models.data.helpermodels.Tuple; @@ -110,6 +111,7 @@ public class DataManagementPlanManager { private ApiContext apiContext; private DatasetManager datasetManager; + private DataManagementProfileManager dataManagementProfileManager; private DatabaseRepository databaseRepository; private Environment environment; private RDAManager rdaManager; @@ -119,10 +121,11 @@ public class DataManagementPlanManager { private List repositoriesDeposit; @Autowired - public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment, RDAManager rdaManager, UserManager userManager, + public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, DataManagementProfileManager dataManagementProfileManager, Environment environment, RDAManager rdaManager, UserManager userManager, MetricsManager metricsManager, ConfigLoader configLoader, List repositoriesDeposit) { this.apiContext = apiContext; this.datasetManager = datasetManager; + this.dataManagementProfileManager = dataManagementProfileManager; this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); this.environment = environment; this.rdaManager = rdaManager; @@ -486,14 +489,24 @@ public class DataManagementPlanManager { UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); newDmp.setCreator(user); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao(), user); - createFunderIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao()); - createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); - if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { - newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.ORGANIZATIONS, principal)) { + createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.RESEARCHERS, principal)) { + createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao(), user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + createFunderIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + if (newDmp.getProject() != null && newDmp.getGrant() != null && (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty())) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao()); + } } - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao()); DMP dmp; if (dataManagementPlan.getId() != null) { @@ -513,12 +526,18 @@ public class DataManagementPlanManager { } } - if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) { - checkIfUserCanEditGrant(newDmp, user); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) { + checkIfUserCanEditGrant(newDmp, user); + } + assignGrandUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + assignFunderUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + assignProjectUserIfInternal(newDmp, user); } - assignGrandUserIfInternal(newDmp, user); - assignFunderUserIfInternal(newDmp, user); - assignProjectUserIfInternal(newDmp, user); if(newDmp.getId() != null){ for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){ @@ -526,7 +545,9 @@ public class DataManagementPlanManager { } } - apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); + } newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); for(DMPDatasetProfile dmpDatasetProfile : newDmp.getAssociatedDmps()){ @@ -622,10 +643,18 @@ public class DataManagementPlanManager { checkDmpValidationRules(tempDMP); } UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); - createOrganisationsIfTheyDontExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao(), user); - createFunderIfItDoesntExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao()); - createGrantIfItDoesntExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); + if(this.dataManagementProfileManager.fieldInBlueprint(tempDMP.getProfile(), SystemFieldType.ORGANIZATIONS, principal)) { + createOrganisationsIfTheyDontExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(tempDMP.getProfile(), SystemFieldType.RESEARCHERS, principal)) { + createResearchersIfTheyDontExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao(), user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(tempDMP.getProfile(), SystemFieldType.FUNDER, principal)) { + createFunderIfItDoesntExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(tempDMP.getProfile(), SystemFieldType.GRANT, principal)) { + createGrantIfItDoesntExist(tempDMP, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); + } DMP result = createOrUpdate(dataManagementPlan, principal); @@ -660,31 +689,50 @@ public class DataManagementPlanManager { DMP newDmp = dataManagementPlan.toDataModel(); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); newDmp.setCreator(user); - createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user); - - createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); - createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); - if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { - newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.ORGANIZATIONS, principal)) { + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.RESEARCHERS, principal)) { + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + if (newDmp.getProject() != null && newDmp.getGrant() != null && (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty())) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); + } } - createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); newDmp.setGroupId(oldDmp.getGroupId()); newDmp.setVersion(oldDmp.getVersion() + 1); newDmp.setId(null); - checkIfUserCanEditGrant(newDmp, user); - assignGrandUserIfInternal(newDmp, user); - assignFunderUserIfInternal(newDmp, user); - assignProjectUserIfInternal(newDmp, user); - if (newDmp.getGrant().getStartdate() == null) { - newDmp.getGrant().setStartdate(new Date()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) { + checkIfUserCanEditGrant(newDmp, user); + } + assignGrandUserIfInternal(newDmp, user); } - if (newDmp.getGrant().getEnddate() == null) { - newDmp.getGrant().setEnddate(Date.from(Instant.now().plus(365, ChronoUnit.DAYS))); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + assignFunderUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + assignProjectUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + if (newDmp.getGrant().getStartdate() == null) { + newDmp.getGrant().setStartdate(new Date()); + } + if (newDmp.getGrant().getEnddate() == null) { + newDmp.getGrant().setEnddate(Date.from(Instant.now().plus(365, ChronoUnit.DAYS))); + } + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); } - databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); newDmp.setId(tempDmp.getId()); @@ -721,25 +769,44 @@ public class DataManagementPlanManager { UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); newDmp.setCreator(user); - createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user); - - createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); - createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); - if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { - newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.ORGANIZATIONS, principal)) { + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.RESEARCHERS, principal)) { + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao(), user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + if (newDmp.getProject() != null && newDmp.getGrant() != null && (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty())) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); + } } - createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); newDmp.setGroupId(UUID.randomUUID()); newDmp.setVersion(0); newDmp.setId(null); - checkIfUserCanEditGrant(newDmp, user); - assignGrandUserIfInternal(newDmp, user); - assignFunderUserIfInternal(newDmp, user); - assignProjectUserIfInternal(newDmp, user); - databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + if (newDmp.getGrant().getType().equals(Grant.GrantType.INTERNAL.getValue())) { + checkIfUserCanEditGrant(newDmp, user); + } + assignGrandUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.FUNDER, principal)) { + assignFunderUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.PROJECT, principal)) { + assignProjectUserIfInternal(newDmp, user); + } + if(this.dataManagementProfileManager.fieldInBlueprint(newDmp.getProfile(), SystemFieldType.GRANT, principal)) { + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + } DMP tempDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); newDmp.setId(tempDmp.getId()); @@ -882,7 +949,7 @@ public class DataManagementPlanManager { } private void createFunderIfItDoesntExist(DMP newDmp, FunderDao funderDao) { - if (newDmp.getGrant().getFunder() != null) { + if (newDmp.getGrant() != null && newDmp.getGrant().getFunder() != null) { Funder funder = newDmp.getGrant().getFunder(); FunderCriteria criteria = new FunderCriteria(); if (funder.getReference() != null) { @@ -1005,7 +1072,9 @@ public class DataManagementPlanManager { datasetElastic.setStatus(dataset1.getStatus()); datasetElastic.setDmp(dataset1.getDmp().getId()); datasetElastic.setGroup(dataset1.getDmp().getGroupId()); - datasetElastic.setGrant(dataset1.getDmp().getGrant().getId()); + if(this.dataManagementProfileManager.fieldInBlueprint(dataset1.getDmp().getProfile(), SystemFieldType.GRANT, null)) { + datasetElastic.setGrant(dataset1.getDmp().getGrant().getId()); + } if (dataset1.getDmp().getUsers() != null) { datasetElastic.setCollaborators(dataset1.getDmp().getUsers().stream().map(user -> { Collaborator collaborator = new Collaborator(); @@ -1026,7 +1095,9 @@ public class DataManagementPlanManager { }).collect(Collectors.toList())); } datasetElastic.setPublic(dataset1.getDmp().isPublic()); - datasetElastic.setGrantStatus(dataset1.getDmp().getGrant().getStatus()); + if(this.dataManagementProfileManager.fieldInBlueprint(dataset1.getDmp().getProfile(), SystemFieldType.GRANT, null)) { + datasetElastic.setGrantStatus(dataset1.getDmp().getGrant().getStatus()); + } try { eu.eudat.elastic.entities.Dataset oldDatasetElastic = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().findDocument(dataset.getId().toString()); @@ -1660,53 +1731,59 @@ public class DataManagementPlanManager { // Funder. Element funder = xmlDoc.createElement("funder"); - Element funderLabel = xmlDoc.createElement("label"); - Element funderId = xmlDoc.createElement("id"); - funderLabel.setTextContent(dmp.getGrant().getFunder().getLabel()); - funderId.setTextContent(dmp.getGrant().getFunder().getId().toString()); - funder.appendChild(funderLabel); - funder.appendChild(funderId); - if(dmp.getGrant().getFunder().getReference() != null){ - String referencePrefix = dmp.getGrant().getFunder().getReference().split(":")[0]; - String shortReference = dmp.getGrant().getFunder().getReference().substring(referencePrefix.length() + 1); - Element funderReference = xmlDoc.createElement("reference"); - funderReference.setTextContent(shortReference); - funder.appendChild(funderReference); + if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal) && this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.FUNDER, principal)) { + Element funderLabel = xmlDoc.createElement("label"); + Element funderId = xmlDoc.createElement("id"); + funderLabel.setTextContent(dmp.getGrant().getFunder().getLabel()); + funderId.setTextContent(dmp.getGrant().getFunder().getId().toString()); + funder.appendChild(funderLabel); + funder.appendChild(funderId); + if (dmp.getGrant().getFunder().getReference() != null) { + String referencePrefix = dmp.getGrant().getFunder().getReference().split(":")[0]; + String shortReference = dmp.getGrant().getFunder().getReference().substring(referencePrefix.length() + 1); + Element funderReference = xmlDoc.createElement("reference"); + funderReference.setTextContent(shortReference); + funder.appendChild(funderReference); + } } dmpElement.appendChild(funder); // Grant. Element grant = xmlDoc.createElement("grant"); - Element grantLabel = xmlDoc.createElement("label"); - Element grantId = xmlDoc.createElement("id"); - grantLabel.setTextContent(dmp.getGrant().getLabel()); - grantId.setTextContent(dmp.getGrant().getId().toString()); - grant.appendChild(grantLabel); - grant.appendChild(grantId); - if(dmp.getGrant().getReference() != null) { - String referencePrefix = dmp.getGrant().getReference().split(":")[0]; - String shortReference = dmp.getGrant().getReference().substring(referencePrefix.length() + 1); - Element grantReference = xmlDoc.createElement("reference"); - grantReference.setTextContent(shortReference); - grant.appendChild(grantReference); + if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.GRANT, principal)) { + Element grantLabel = xmlDoc.createElement("label"); + Element grantId = xmlDoc.createElement("id"); + grantLabel.setTextContent(dmp.getGrant().getLabel()); + grantId.setTextContent(dmp.getGrant().getId().toString()); + grant.appendChild(grantLabel); + grant.appendChild(grantId); + if (dmp.getGrant().getReference() != null) { + String referencePrefix = dmp.getGrant().getReference().split(":")[0]; + String shortReference = dmp.getGrant().getReference().substring(referencePrefix.length() + 1); + Element grantReference = xmlDoc.createElement("reference"); + grantReference.setTextContent(shortReference); + grant.appendChild(grantReference); + } } dmpElement.appendChild(grant); // Project. Element project = xmlDoc.createElement("project"); - Element projectId = xmlDoc.createElement("id"); - Element projectLabel = xmlDoc.createElement("label"); - Element projectDescription = xmlDoc.createElement("description"); - Element projectStartDate = xmlDoc.createElement("start"); - Element projectEndDate = xmlDoc.createElement("end"); - projectId.setTextContent(dmp.getProject().getId().toString()); - projectLabel.setTextContent(dmp.getProject().getLabel()); - projectDescription.setTextContent(dmp.getProject().getDescription()); - projectStartDate.setTextContent(dmp.getProject().getStartdate().toString()); - projectEndDate.setTextContent(dmp.getProject().getEnddate().toString()); - project.appendChild(projectId); - project.appendChild(projectLabel); - project.appendChild(projectDescription); - project.appendChild(projectStartDate); - project.appendChild(projectEndDate); + if (this.dataManagementProfileManager.fieldInBlueprint(dmp.getProfile(), SystemFieldType.PROJECT, principal)) { + Element projectId = xmlDoc.createElement("id"); + Element projectLabel = xmlDoc.createElement("label"); + Element projectDescription = xmlDoc.createElement("description"); + Element projectStartDate = xmlDoc.createElement("start"); + Element projectEndDate = xmlDoc.createElement("end"); + projectId.setTextContent(dmp.getProject().getId().toString()); + projectLabel.setTextContent(dmp.getProject().getLabel()); + projectDescription.setTextContent(dmp.getProject().getDescription()); + projectStartDate.setTextContent(dmp.getProject().getStartdate().toString()); + projectEndDate.setTextContent(dmp.getProject().getEnddate().toString()); + project.appendChild(projectId); + project.appendChild(projectLabel); + project.appendChild(projectDescription); + project.appendChild(projectStartDate); + project.appendChild(projectEndDate); + } dmpElement.appendChild(project); Element organisationsElement = xmlDoc.createElement("organisations"); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java index 667dbbd2e..fb0427993 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java @@ -13,8 +13,9 @@ import eu.eudat.logic.utilities.builders.XmlBuilder; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; import eu.eudat.logic.utilities.documents.xml.dmpXml.ExportXmlBuilderDmpProfile; import eu.eudat.logic.utilities.documents.xml.dmpXml.ImportXmlBuilderDmpProfile; -import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DmpProfileExternalAutoComplete; -import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.*; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.FieldCategory; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.SystemFieldType; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.AutoCompleteLookupItem; import eu.eudat.models.data.helpers.common.DataTableData; @@ -101,13 +102,29 @@ public class DataManagementProfileManager { return dataManagementPlanProfileListingModel; } - public DataManagementPlanBlueprintListingModel getSingleBlueprint(String id, Principal principal) throws InstantiationException, IllegalAccessException { + public DataManagementPlanBlueprintListingModel getSingleBlueprint(String id, Principal principal) { DMPProfile dmpProfile = databaseRepository.getDmpProfileDao().find(UUID.fromString(id)); DataManagementPlanBlueprintListingModel dataManagementPlanBlueprintListingModel = new DataManagementPlanBlueprintListingModel(); dataManagementPlanBlueprintListingModel.fromDataModel(dmpProfile); return dataManagementPlanBlueprintListingModel; } + public boolean fieldInBlueprint(DMPProfile dmpProfile, SystemFieldType type, Principal principal) { + DataManagementPlanBlueprintListingModel dmpBlueprint = new DataManagementPlanBlueprintListingModel(); + dmpBlueprint.fromDataModel(dmpProfile); + for(Section section: dmpBlueprint.getDefinition().getSections()){ + for(FieldModel field: section.getFields()){ + if(field.getCategory().equals(FieldCategory.SYSTEM)){ + SystemField systemField = field.toSystemField(); + if(systemField.getType().equals(type)){ + return true; + } + } + } + } + return false; + } + public List getWithCriteria(DataManagementPlanProfileCriteriaRequest dataManagementPlanProfileCriteriaRequest) throws IllegalAccessException, InstantiationException { QueryableList items = databaseRepository.getDmpProfileDao().getWithCriteria(dataManagementPlanProfileCriteriaRequest.getCriteria()); List datamanagementPlans = items.select(item -> new DataManagementPlanProfileListingModel().fromDataModel(item)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java index 96eae1dca..d799a4b10 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java @@ -50,7 +50,9 @@ public class DatasetMapper { elastic.setStatus(dataset.getStatus()); elastic.setDmp(dataset.getDmp().getId()); elastic.setGroup(dataset.getDmp().getGroupId()); - elastic.setGrant(dataset.getDmp().getGrant().getId()); + if (dataset.getDmp().getGrant() != null) { + elastic.setGrant(dataset.getDmp().getGrant().getId()); + } elastic.setCreated(dataset.getCreated()); elastic.setModified(dataset.getModified()); elastic.setFinalizedAt(dataset.getFinalizedAt()); @@ -74,7 +76,9 @@ public class DatasetMapper { elastic.setOrganizations(dataset.getDmp().getOrganisations().stream().map(OrganizationMapper::toElastic).collect(Collectors.toList())); } elastic.setPublic(dataset.getDmp().isPublic()); - elastic.setGrantStatus(dataset.getDmp().getGrant().getStatus()); + if (dataset.getDmp().getGrant() != null) { + elastic.setGrantStatus(dataset.getDmp().getGrant().getStatus()); + } elastic.setFormData(datasetManager.getWordDocumentText(dataset)); return elastic; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java index cd0961ae5..a1b10170a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DmpMapper.java @@ -37,7 +37,9 @@ public class DmpMapper { elastic.setCollaborators(dmp.getUsers().stream().map(user -> CollaboratorMapper.toElastic(user.getUser(), user.getRole())).collect(Collectors.toList())); } elastic.setDescription(dmp.getDescription()); - elastic.setGrant(dmp.getGrant().getId()); + if (dmp.getGrant() != null) { + elastic.setGrant(dmp.getGrant().getId()); + } elastic.setLabel(dmp.getLabel()); elastic.setPublic(dmp.isPublic()); elastic.setStatus(dmp.getStatus()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java index b6f1cc533..4c6eeb975 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java @@ -37,7 +37,9 @@ public class DMPToDepositMapper { deposit.setUsers(entity.getUsers().stream().map(DMPToDepositMapper::fromUserDMP).collect(Collectors.toSet())); deposit.setOrganisations(entity.getOrganisations().stream().map(DMPToDepositMapper::fromOrganisation).collect(Collectors.toSet())); deposit.setResearchers(entity.getResearchers().stream().map(DMPToDepositMapper::fromResearcher).collect(Collectors.toSet())); - deposit.setGrant(fromGrant(entity.getGrant())); + if (entity.getGrant() != null) { + deposit.setGrant(fromGrant(entity.getGrant())); + } deposit.setPdfFile(pdfFile); deposit.setRdaJsonFile(jsonFile); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java index 002cd9bf8..3811ead04 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlan.java @@ -242,9 +242,14 @@ public class DataManagementPlan implements DataModel { this.version = entity.getVersion(); this.groupId = this.groupId == null ? null : entity.getGroupId(); this.label = entity.getLabel(); - this.grant = new Grant(); this.properties = entity.getProperties() != null ? new org.json.JSONObject(entity.getProperties()).toMap() : null; - this.grant.fromDataModel(entity.getGrant()); + if(entity.getGrant() != null) { + this.grant = new Grant(); + this.grant.fromDataModel(entity.getGrant()); + } + else { + this.grant = null; + } this.creator = new eu.eudat.models.data.userinfo.UserInfo(); this.groupId = entity.getGroupId(); this.lockable = entity.getDataset() != null && entity.getDataset().stream().findAny().isPresent(); @@ -296,7 +301,7 @@ public class DataManagementPlan implements DataModel { this.project = new Project().fromDataModel(entity.getProject()); } - if (entity.getGrant().getFunder() != null) { + if (entity.getGrant() != null && entity.getGrant().getFunder() != null) { this.funder = new Funder(); this.funder.fromDataModel(entity.getGrant().getFunder()); } @@ -362,7 +367,6 @@ public class DataManagementPlan implements DataModel { this.researchers = entity.getResearchers() != null ? entity.getResearchers().stream().filter(Objects::nonNull).map(item -> new Researcher().fromDataModel(item)).collect(Collectors.toList()) : new ArrayList<>(); this.version = entity.getVersion(); this.label = entity.getLabel(); - this.grant = new Grant(); this.properties = entity.getProperties() != null ? new org.json.JSONObject(entity.getProperties()).toMap() : null; this.creator = new eu.eudat.models.data.userinfo.UserInfo(); this.groupId = entity.getGroupId(); @@ -398,13 +402,19 @@ public class DataManagementPlan implements DataModel { this.associatedUsers = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserListingModel().fromDataModel(item.getUser())).collect(Collectors.toList()) : new ArrayList<>(); this.users = entity.getUsers() != null ? entity.getUsers().stream().map(item -> new UserInfoListingModel().fromDataModel(item)).collect(Collectors.toList()) : new ArrayList<>(); this.dois = entity.getDois() != null ? entity.getDois().stream().map(item -> new Doi().fromDataModel(item)).collect(Collectors.toList()): new ArrayList<>(); - this.grant.fromDataModel(entity.getGrant()); + if(entity.getGrant() != null) { + this.grant = new Grant(); + this.grant.fromDataModel(entity.getGrant()); + } + else { + this.grant = null; + } if (entity.getProject() != null) { this.project = new Project(); this.project = new Project().fromDataModel(entity.getProject()); } - if (entity.getGrant().getFunder() != null) { + if (entity.getGrant() != null && entity.getGrant().getFunder() != null) { this.funder = new Funder(); this.funder.fromDataModel(entity.getGrant().getFunder()); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java index 4f3f0b644..babf28de9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dmp/DataManagementPlanEditorModel.java @@ -314,13 +314,7 @@ public class DataManagementPlanEditorModel implements DataModel new DatasetUrlListing().fromDataModel(x)).collect(Collectors.toList()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 22b7dc0d9..29e823cb1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -104,7 +104,9 @@ public class DmpRDAMapper { } // rda.getContributor().addAll(dmp.getUsers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList())); rda.setDataset(dmp.getDataset().stream().filter(dataset -> dataset.getStatus() != eu.eudat.elastic.entities.Dmp.DMPStatus.DELETED.getValue()).map(dataset -> datasetRDAMapper.toRDA(dataset, rda)).collect(Collectors.toList())); - rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant()))); + if (dmp.getProject() != null) { + rda.setProject(Collections.singletonList(ProjectRDAMapper.toRDA(dmp.getProject(), dmp.getGrant()))); + } rda.setAdditionalProperty("templates", dmp.getAssociatedDmps().stream().map(datasetProfile -> datasetProfile.getId().toString()).toArray()); return rda; } diff --git a/dmp-db-scema/main/dmp-dump.sql b/dmp-db-scema/main/dmp-dump.sql index 5852e0e75..936045b17 100644 --- a/dmp-db-scema/main/dmp-dump.sql +++ b/dmp-db-scema/main/dmp-dump.sql @@ -94,7 +94,7 @@ CREATE TABLE public."DMP" ( "GroupId" uuid, "Label" character varying(250) NOT NULL, "Version" integer NOT NULL, - "Grant" uuid NOT NULL, + "Grant" uuid, "AssociatedDmps" xml, "Profile" uuid, "Status" smallint DEFAULT 0 NOT NULL, @@ -130,7 +130,7 @@ CREATE TABLE public."DMPDatasetProfile" ( "ID" uuid DEFAULT public.uuid_generate_v4() NOT NULL, dmp uuid NOT NULL, datasetprofile uuid NOT NULL, - "data" text + "data" text NOT NULL ); @@ -236,7 +236,7 @@ CREATE TABLE public."Dataset" ( "ID" uuid DEFAULT public.uuid_generate_v4() NOT NULL, "Label" character varying(250) NOT NULL, "DMP" uuid, - "DmpSectionIndex" integer, + "DmpSectionIndex" integer NOT NULL, "Uri" character varying(250), "Properties" text, "Profile" uuid, diff --git a/dmp-db-scema/updates/00.00.017_Make_grant_not_null.sql b/dmp-db-scema/updates/00.00.017_Make_grant_not_null.sql new file mode 100644 index 000000000..bf162c963 --- /dev/null +++ b/dmp-db-scema/updates/00.00.017_Make_grant_not_null.sql @@ -0,0 +1,12 @@ +DO $$DECLARE + this_version CONSTANT varchar := '00.00.017'; +BEGIN + PERFORM * FROM "DBVersion" WHERE version = this_version; + IF FOUND THEN RETURN; END IF; + +ALTER TABLE public."DMP" + ALTER COLUMN "Grant" DROP NOT NULL; + +INSERT INTO public."DBVersion" VALUES ('DMPDB', '00.00.017', '2023-09-18 12:00:00.000000+02', now(), 'Make grant column of dmp table not null.'); + +END$$; \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts index cd27eceb3..be658a829 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp-editor-blueprint/dmp-editor-blueprint.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { AbstractControl, FormArray, FormControl, FormGroup, Validators } from '@angular/forms'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; -import { DmpBlueprintDefinition, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint'; +import { DmpBlueprintDefinition, FieldCategory, SystemFieldType } from '@app/core/model/dmp/dmp-blueprint/dmp-blueprint'; import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; @@ -178,6 +178,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im .pipe(takeUntil(this._destroyed)) .subscribe(result => { this.selectedDmpBlueprintDefinition = result.definition; + this.checkForGrant(); + this.checkForFunder(); + this.checkForProject(); this.formGroup.get('profile').setValue(result); this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.step = 1; @@ -784,6 +787,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im .subscribe(Option => { if (Option instanceof Object) { this.selectedDmpBlueprintDefinition = Option.definition; + this.checkForGrant(); + this.checkForFunder(); + this.checkForProject(); this.addProfiles(); } else { @@ -792,6 +798,48 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im }) } + private checkForGrant() { + let hasGrant = false; + this.selectedDmpBlueprintDefinition.sections.forEach(section => section.fields.forEach( + field => { + if (field.category === FieldCategory.SYSTEM && field.type === SystemFieldType.GRANT) { + hasGrant = true; + } + } + )); + if (!hasGrant) { + this.formGroup.removeControl('grant'); + } + } + + private checkForFunder() { + let hasFunder = false; + this.selectedDmpBlueprintDefinition.sections.forEach(section => section.fields.forEach( + field => { + if (field.category === FieldCategory.SYSTEM && field.type === SystemFieldType.FUNDER) { + hasFunder = true; + } + } + )); + if (!hasFunder) { + this.formGroup.removeControl('funder'); + } + } + + private checkForProject() { + let hasProject = false; + this.selectedDmpBlueprintDefinition.sections.forEach(section => section.fields.forEach( + field => { + if (field.category === FieldCategory.SYSTEM && field.type === SystemFieldType.PROJECT) { + hasProject = true; + } + } + )); + if (!hasProject) { + this.formGroup.removeControl('project'); + } + } + private addProfiles(profiles?: DmpDatasetProfile[]) { for(let i = 0; i < this.selectedDmpBlueprintDefinition.sections.length; i++){ this.sectionTemplates.push(new Array()); diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts index 008f10bd2..8c7547485 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.model.ts @@ -134,9 +134,9 @@ export class DmpEditorModel { baseContext.validation.push({ key: 'version', validators: [BackendErrorValidator(this.validationErrorModel, 'version')] }); baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'status')] }); baseContext.validation.push({ key: 'description', validators: [BackendErrorValidator(this.validationErrorModel, 'description')] }); - baseContext.validation.push({ key: 'grant', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'grant')] }); + baseContext.validation.push({ key: 'grant', validators: [BackendErrorValidator(this.validationErrorModel, 'grant')] }); baseContext.validation.push({ key: 'project', validators: [BackendErrorValidator(this.validationErrorModel, 'project')] }); - baseContext.validation.push({ key: 'funder', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'funder')] }); + baseContext.validation.push({ key: 'funder', validators: [BackendErrorValidator(this.validationErrorModel, 'funder')] }); baseContext.validation.push({ key: 'organisations', validators: [BackendErrorValidator(this.validationErrorModel, 'organisations')] }); baseContext.validation.push({ key: 'researchers', validators: [BackendErrorValidator(this.validationErrorModel, 'researchers')] }); baseContext.validation.push({ key: 'profiles', validators: [Validators.required, ValidJsonValidator, BackendErrorValidator(this.validationErrorModel, 'profiles')] });