From 6d9ca0d7e8aa3a19e20daaf7f377682c70937a93 Mon Sep 17 00:00:00 2001 From: uhensler <urs.hensler@frentix.com> Date: Wed, 8 Aug 2018 16:46:20 +0200 Subject: [PATCH] OO-3303: Add references between evaluation form resource and quality data collection to avoid deletion of used evaluation form resources --- .../quality/manager/QualityServiceImpl.java | 20 ++++++++++++++++ .../ui/_i18n/LocalStrings_en.properties | 2 +- .../_i18n/LocalStrings_de.properties | 1 + .../_i18n/LocalStrings_en.properties | 1 + .../ui/author/AuthorListController.java | 11 ++++++++- .../ConfirmDeletePermanentlyController.java | 2 +- .../ui/author/_content/references.html | 17 ++++++++++---- .../resource/references/ReferenceManager.java | 23 +++++++++++++++++-- 8 files changed, 67 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java index d63ab78aaf0..9af3287041e 100644 --- a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java +++ b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java @@ -63,6 +63,9 @@ import org.olat.modules.quality.QualityReminderType; import org.olat.modules.quality.QualityService; import org.olat.modules.taxonomy.TaxonomyLevelRef; import org.olat.repository.RepositoryEntry; +import org.olat.resource.OLATResourceManager; +import org.olat.resource.references.Reference; +import org.olat.resource.references.ReferenceManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -97,11 +100,17 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet private QualityMailing qualityMailing; @Autowired private EvaluationFormManager evaluationFormManager; + @Autowired + private OLATResourceManager resourceManager; + @Autowired + private ReferenceManager referenceManager; @Override public QualityDataCollection createDataCollection(RepositoryEntry formEntry) { QualityDataCollection dataCollection = dataCollectionDao.createDataCollection(); evaluationFormManager.createSurvey(dataCollection, null, formEntry); + resourceManager.findOrPersistResourceable(dataCollection); + referenceManager.addReference(dataCollection, formEntry.getOlatResource(), null); return dataCollection; } @@ -167,6 +176,8 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet } EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(dataCollection, null); evaluationFormManager.deleteSurvey(survey); + deleteReferences(dataCollection); + resourceManager.deleteOLATResourceable(dataCollection); dataCollectionDao.deleteDataCollection(dataCollection); log.info("Quality management data collection deleted: " + dataCollection.toString()); } @@ -186,7 +197,16 @@ public class QualityServiceImpl implements QualityService, OrganisationDataDelet @Override public void updateFormEntry(QualityDataCollection dataCollection, RepositoryEntry formEntry) { EvaluationFormSurvey survey = evaluationFormManager.loadSurvey(dataCollection, null); + deleteReferences(dataCollection); + evaluationFormManager.updateSurveyForm(survey, formEntry); + referenceManager.addReference(dataCollection, formEntry.getOlatResource(), null); + } + + private void deleteReferences(QualityDataCollectionLight dataCollection) { + for (Reference reference : referenceManager.getReferences(dataCollection)) { + referenceManager.delete(reference); + } } @Override diff --git a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties index 6af5ec5b19e..63c6537da77 100644 --- a/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/quality/ui/_i18n/LocalStrings_en.properties @@ -2,7 +2,7 @@ admin.config.title=Configuration quality management admin.enabled=Quality management admin.menu.title.alt=$\:admin.menu.title admin.menu.title=Quality management -breadcrumb.data.collections=$\:goto.data.collections.title +breadcrumb.data.collections=$\:goto.data.collection.title breadcrumb.executor.participations=$\:goto.executor.participation.title breadcrumb.root=Quality management data.collection.configuration=Configuration diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties index a191175aa5a..d879fb9d2e0 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties @@ -285,6 +285,7 @@ details.read.only.acknowledge=Best\u00E4tigung details.read.only.acknowledge.error=Bitte best\u00E4tigen. details.read.only.acknowledge.msg=Alle Kursbausteine inklusive Tests, Foren etc. befinden sich im Lesemodus und k\u00F6nnen nicht mehr bearbeitet werden. details.referenceinfo=Referenzen +details.referenceinfo.data.collections=Anzahl Datenerhebungen: {0} details.referenceinfo.txt=Wird in folgenden Kursen eingesetzt\: details.referenceinfoheader=Information zur Verwendung details.summaryprop=Zusammenfassung Einstellungen diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties index 8964c2980de..05958ea60f0 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties @@ -281,6 +281,7 @@ details.read.only.acknowledge=Confirmation details.read.only.acknowledge.error=Please confirm. details.read.only.acknowledge.msg=All course elements inclusive tests... will be in read only mode and cannot be edited anymore. details.referenceinfo=References +details.referenceinfo.data.collections=Number of data collections: {0} details.referenceinfo.txt=Used in the following courses\: details.referenceinfoheader=Information on usage details.summaryprop=Summary of settings diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java index d8b81fd250d..44d9c1d5c88 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java @@ -92,6 +92,7 @@ import org.olat.core.util.coordinate.LockResult; import org.olat.core.util.resource.OresHelper; import org.olat.course.CorruptedCourseException; import org.olat.course.CourseModule; +import org.olat.modules.quality.QualityDataCollectionLight; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryEntryRef; @@ -110,6 +111,7 @@ import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams.OrderBy; import org.olat.repository.model.SearchAuthorRepositoryEntryViewParams.ResourceUsage; import org.olat.repository.ui.RepositoyUIFactory; import org.olat.repository.ui.author.AuthoringEntryDataModel.Cols; +import org.olat.resource.references.Reference; import org.olat.resource.references.ReferenceManager; import org.olat.user.UserManager; import org.olat.util.logging.activity.LoggingResourceable; @@ -782,7 +784,7 @@ public class AuthorListController extends FormBasicController implements Activat private void doSearch(UserRequest ureq, SearchEvent se) { if(se.getTypes() != null && se.getTypes().size() > 0) { - searchParams.setResourceTypes(new ArrayList<String>(se.getTypes())); + searchParams.setResourceTypes(new ArrayList<>(se.getTypes())); } else { searchParams.setResourceTypes(null); } @@ -1185,6 +1187,13 @@ public class AuthorListController extends FormBasicController implements Activat } mainVC.contextPut("referenceLinks", refLinks); + List<Reference> references = referenceManager.getReferencesTo(entry.getOlatResource(), + QualityDataCollectionLight.RESOURCEABLE_TYPE_NAME); + if (!references.isEmpty()) { + mainVC.contextPut("qualityDataCollections", translate("details.referenceinfo.data.collections", + new String[] { String.valueOf(references.size()) })); + } + putInitialPanel(mainVC); } diff --git a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java index be6ff8ca048..bd37f5f3a52 100644 --- a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java +++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java @@ -235,7 +235,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController { private void doCompleteDelete(UserRequest ureq) { List<ErrorList> errorList = new ArrayList<>(); - boolean allOk = deleteEntries(ureq, rows, errorList) ; + boolean allOk = deleteEntries(ureq, rows, errorList); if(allOk && deleteReferencesEl.isVisible() && deleteReferencesEl.isEnabled() && deleteReferencesEl.isOneSelected() && deleteReferencesEl.isSelected(0)) { diff --git a/src/main/java/org/olat/repository/ui/author/_content/references.html b/src/main/java/org/olat/repository/ui/author/_content/references.html index f0015f49fe1..3bacd22ac28 100644 --- a/src/main/java/org/olat/repository/ui/author/_content/references.html +++ b/src/main/java/org/olat/repository/ui/author/_content/references.html @@ -1,6 +1,13 @@ -$r.translate("details.referenceinfo.txt") -<ul class="o_dropdown list-unstyled"> -#foreach($referenceLink in $referenceLinks) - <li>$r.render($referenceLink)</li> +#if(!$referenceLinks.isEmpty()) + $r.translate("details.referenceinfo.txt") + <ul class="o_dropdown list-unstyled"> + #foreach($referenceLink in $referenceLinks) + <li>$r.render($referenceLink)</li> + #end + </ul> #end -</ul> \ No newline at end of file +<div class="o_block_small_top"> + #if($r.isNotNull($qualityDataCollections)) + $qualityDataCollections + #end +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/resource/references/ReferenceManager.java b/src/main/java/org/olat/resource/references/ReferenceManager.java index 827086e1155..8574178638e 100644 --- a/src/main/java/org/olat/resource/references/ReferenceManager.java +++ b/src/main/java/org/olat/resource/references/ReferenceManager.java @@ -108,7 +108,7 @@ public class ReferenceManager { public List<Reference> getReferences(OLATResourceable source) { Long sourceKey = getResourceKey(source); if (sourceKey == null) { - return new ArrayList<Reference> (0); + return new ArrayList<>(0); } return dbInstance.getCurrentEntityManager() .createNamedQuery("referencesBySourceId", Reference.class) @@ -125,7 +125,7 @@ public class ReferenceManager { public List<Reference> getReferencesTo(OLATResourceable target) { Long targetKey = getResourceKey(target); if (targetKey == null) { - return new ArrayList<Reference>(0); + return new ArrayList<>(0); } return dbInstance.getCurrentEntityManager() .createNamedQuery("referencesByTargetId", Reference.class) @@ -133,6 +133,25 @@ public class ReferenceManager { .getResultList(); } + public List<Reference> getReferencesTo(OLATResourceable target, String sourceResName) { + Long targetKey = getResourceKey(target); + if (targetKey == null) { + return new ArrayList<>(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("select v"); + sb.append(" from references as v"); + sb.append(" where v.target.key = :targetKey"); + sb.append(" and v.source.resName = :resName"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Reference.class) + .setParameter("targetKey", targetKey) + .setParameter("resName", sourceResName) + .getResultList(); + } + public List<RepositoryEntry> getRepositoryReferencesTo(OLATResourceable target) { Long targetKey = getResourceKey(target); StringBuilder sb = new StringBuilder(); -- GitLab