diff --git a/pom.xml b/pom.xml index c1f0d839839ca3bca33376b7addabd584ae98678..64825c4cabaaf9e74fd92e6adfe5162b676e0ae5 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ <version.selenium>3.13.0</version.selenium> <version.drone>2.5.1</version.drone> <activemq.version>5.15.9</activemq.version> - <qtiworks.version>1.0.13</qtiworks.version> + <qtiworks.version>1.0.14</qtiworks.version> <!-- properties for testing and Q&A --> <!-- by default no tests are executed so far (April 2011). Use appropriate profiles and properties on the command line --> diff --git a/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java b/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java index 23af88426d56847e2b7bb0d036063e1b13bc79be..329a6633fdd7baffe7d7d4c13ddb83ac75993bb2 100644 --- a/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java +++ b/src/main/java/org/olat/admin/user/SystemRolesAndRightsController.java @@ -227,9 +227,9 @@ public class SystemRolesAndRightsController extends FormBasicController { private void initFormRoles(FormItemContainer formLayout, Organisation organisation) { boolean admin = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator) - || managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager) || managerRoles.isSystemAdmin(); boolean userManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager); + boolean rolesManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager); List<String> roleKeys = new ArrayList<>(); List<String> roleValues = new ArrayList<>(); @@ -300,8 +300,26 @@ public class SystemRolesAndRightsController extends FormBasicController { Set<String> disabled = new HashSet<>(roleKeys); disabled.removeAll(enabled); rolesEl.setEnabled(disabled, false); + } else if(rolesManager) { + Set<String> enabled = new HashSet<>(); + enabled.add(OrganisationRoles.invitee.name()); + enabled.add(OrganisationRoles.user.name()); + enabled.add(OrganisationRoles.author.name()); + enabled.add(OrganisationRoles.curriculummanager.name()); + enabled.add(OrganisationRoles.groupmanager.name()); + enabled.add(OrganisationRoles.learnresourcemanager.name()); + enabled.add(OrganisationRoles.lecturemanager.name()); + enabled.add(OrganisationRoles.linemanager.name()); + enabled.add(OrganisationRoles.poolmanager.name()); + enabled.add(OrganisationRoles.qualitymanager.name()); + enabled.add(OrganisationRoles.rolesmanager.name()); + enabled.add(OrganisationRoles.usermanager.name()); + rolesEl.setEnabled(enabled, true); + Set<String> disabled = new HashSet<>(roleKeys); + disabled.removeAll(enabled); + rolesEl.setEnabled(disabled, false); } else { - rolesEl.setEnabled(new HashSet<>(roleKeys), false); + rolesEl.setEnabled(new HashSet<>(), false); } rolesEls.add(rolesEl); @@ -533,8 +551,8 @@ public class SystemRolesAndRightsController extends FormBasicController { private void saveOrganisationRolesFormData(RolesElement wrapper) { Organisation organisation = wrapper.getOrganisation(); boolean iAmUserManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.usermanager); + boolean iAmRolesManager = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager); boolean iAmAdmin = managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.administrator) - || managerRoles.hasRoleInParentLine(organisation, OrganisationRoles.rolesmanager) || managerRoles.isSystemAdmin(); // 2) system roles @@ -547,19 +565,23 @@ public class SystemRolesAndRightsController extends FormBasicController { if (iAmAdmin || iAmUserManager) { wrapper.commit(OrganisationRoles.author, rolesToAdd, rolesToRemove); } - - // manager roles, only allowed by administrator and roles manager - if (iAmAdmin) { + + // managers + if (iAmAdmin || iAmRolesManager) { wrapper.commit(OrganisationRoles.groupmanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.poolmanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.curriculummanager, rolesToAdd, rolesToRemove); - wrapper.commit(OrganisationRoles.principal, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.linemanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.qualitymanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.lecturemanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.usermanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.rolesmanager, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.learnresourcemanager, rolesToAdd, rolesToRemove); + } + + // administration roles, only allowed by administrator + if (iAmAdmin) { + wrapper.commit(OrganisationRoles.principal, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.administrator, rolesToAdd, rolesToRemove); wrapper.commit(OrganisationRoles.sysadmin, rolesToAdd, rolesToRemove); } diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java index d10f07c050188087b246befd4e0568e4252372c6..db5450c3b3eee74d96336df41c408b272539274d 100644 --- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java +++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java @@ -351,7 +351,7 @@ public class UsermanagerUserSearchForm extends FormBasicController { Roles uroles = ureq.getUserSession().getRoles(); TextElement id = uifactory.addTextElement("id", "search.form.id", 128, "", formLayout); - id.setVisible(isAdministrativeUser || uroles.isAdministrator() || uroles.isSystemAdmin()); + id.setVisible(uroles.isAdministrator() || uroles.isSystemAdmin()); id.setElementCssClass("o_sel_user_search_id"); items.put("id", id); diff --git a/src/main/java/org/olat/course/assessment/EfficiencyStatementAssessmentController.java b/src/main/java/org/olat/course/assessment/EfficiencyStatementAssessmentController.java index cf18b3cb740dea393d2da4e043eb7b2e107515e6..753e0c41cf7b40be2fa24d2d6ab772d35f139a17 100644 --- a/src/main/java/org/olat/course/assessment/EfficiencyStatementAssessmentController.java +++ b/src/main/java/org/olat/course/assessment/EfficiencyStatementAssessmentController.java @@ -74,7 +74,7 @@ public class EfficiencyStatementAssessmentController extends FormBasicController boolean enabled = course.getCourseEnvironment().getCourseConfig().isEfficencyStatementEnabled(); String enableStr = this.translate(enabled ? "efficiencystatement.config.on" : "efficiencystatement.config.off"); container.contextPut("enabledStr", enableStr); - container.contextPut("enabled", new Boolean(enabled)); + container.contextPut("enabled", Boolean.valueOf(enabled)); configButton = uifactory.addFormLink("config", "efficiencystatement.config", null, container, Link.BUTTON); recalculateButton = uifactory.addFormLink("recalculate", "efficiencystatement.recalculate", null, container, Link.BUTTON); @@ -124,7 +124,7 @@ public class EfficiencyStatementAssessmentController extends FormBasicController } private void openConfiguration(UserRequest ureq) { - String resourceUrl = "[RepositoryEntry:" + courseEntry.getKey() + "][CertificationSettings:0]"; + String resourceUrl = "[RepositoryEntry:" + courseEntry.getKey() + "][Settings:0][Certificates:0]"; BusinessControl bc = BusinessControlFactory.getInstance().createFromString(resourceUrl); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); NewControllerFactory.getInstance().launch(ureq, bwControl); diff --git a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties index 59a8c19f29df2d571b3911b073201c9ead5cfbef..5bbd444fc6592b76158a39c89f15e9cf65afdbc0 100644 --- a/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/fo/_i18n/LocalStrings_de.properties @@ -19,6 +19,6 @@ preview.canModerate=Forumsbeitr\u00E4ge moderieren m\u00F6glich preview.canPost=Forumsbeitr\u00E4ge schreiben m\u00F6glich preview.canRead=Forumsbeitr\u00E4ge lesen m\u00F6glich preview.header=Rechte im Forum f\u00FCr den simulierten Benutzer -pseudonym.default=Pseudonym im einzelnen Form-Post aktiviert +pseudonym.default=Pseudonym im einzelnen Foum-Post aktiviert warn.forumdelete=Achtung\: Alle Beitr\u00E4ge werden gel\u00F6scht. peekview.allItemsLink = Alle Beitr\u00E4ge \ No newline at end of file diff --git a/src/main/java/org/olat/modules/forms/EvaluationFormReadyToDelete.java b/src/main/java/org/olat/modules/forms/EvaluationFormReadyToDelete.java new file mode 100644 index 0000000000000000000000000000000000000000..94a3e7a14e892526f109eb89e356cfb38a72acc0 --- /dev/null +++ b/src/main/java/org/olat/modules/forms/EvaluationFormReadyToDelete.java @@ -0,0 +1,40 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.forms; + +import java.util.Locale; + +import org.olat.repository.ErrorList; +import org.olat.repository.RepositoryEntry; + +/** + * + * Ask providers if the evaluation form can be deleted. If no + * explain why in the error list. + * + * Initial date: 15 avr. 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface EvaluationFormReadyToDelete { + + public boolean readyToDelete(RepositoryEntry entry, Locale locale, ErrorList errors); + +} diff --git a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java index 4090a33bf8a5d4e5911116c9d7c442c2b4f6ae54..b30ff4001b3d0d4d5045603f38457c2def85b172 100644 --- a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java +++ b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java @@ -32,7 +32,9 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; import java.util.Locale; +import java.util.Map; +import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.stack.TooledStackedPanel; @@ -56,6 +58,7 @@ import org.olat.core.util.PathUtils.YesMatcher; import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.LockResult; +import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.xml.XStreamHelper; import org.olat.fileresource.FileResourceManager; @@ -63,6 +66,7 @@ import org.olat.fileresource.types.FileResource; import org.olat.fileresource.types.ResourceEvaluation; import org.olat.modules.ceditor.DataStorage; import org.olat.modules.forms.EvaluationFormManager; +import org.olat.modules.forms.EvaluationFormReadyToDelete; import org.olat.modules.forms.EvaluationFormsModule; import org.olat.modules.forms.model.xml.Form; import org.olat.modules.forms.model.xml.FormXStream; @@ -79,6 +83,7 @@ import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; +import org.olat.resource.references.ReferenceManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -96,6 +101,8 @@ public class EvaluationFormHandler implements RepositoryHandler { @Autowired private DB dbInstance; @Autowired + private ReferenceManager referenceManager; + @Autowired private EvaluationFormsModule formsModule; @Autowired private RepositoryManager repositoryManager; @@ -234,12 +241,27 @@ public class EvaluationFormHandler implements RepositoryHandler { @Override public boolean readyToDelete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale, ErrorList errors) { - return false; + String referencesSummary = referenceManager.getReferencesToSummary(entry.getOlatResource(), locale); + if (referencesSummary != null) { + Translator translator = Util.createPackageTranslator(RepositoryManager.class, locale); + errors.setError(translator.translate("details.delete.error.references", + new String[] { entry.getDisplayname() })); + return false; + } + + boolean delete = true; + Map<String,EvaluationFormReadyToDelete> deleteDelegates = CoreSpringFactory.getBeansOfType(EvaluationFormReadyToDelete.class); + for(EvaluationFormReadyToDelete delegate:deleteDelegates.values()) { + delete &= delegate.readyToDelete(entry, locale, errors); + } + return delete; } @Override public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res) { - return false; + CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new OLATResourceableJustBeforeDeletedEvent(res), res); + FileResourceManager.getInstance().deleteFileResource(res); + return true; } /** diff --git a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java index e1715e21d087a670c0e74f31f21cbcb5a513ebdb..d6703fb9198b04815e20cdd53043b029aff448d4 100644 --- a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java +++ b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java @@ -49,6 +49,7 @@ import org.olat.modules.portfolio.model.BinderImpl; import org.olat.modules.portfolio.model.EvaluationFormPart; import org.olat.modules.portfolio.model.SectionImpl; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryRef; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -370,7 +371,7 @@ public class AssignmentDAO { } public Assignment loadAssignment(PageBody body) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(256); sb.append("select assignment from pfassignment as assignment") .append(" inner join fetch assignment.page as page") .append(" left join fetch assignment.formEntry as formEntry") @@ -385,7 +386,7 @@ public class AssignmentDAO { } public boolean isAssignmentInUse(Assignment assignment) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(128); sb.append("select assignment.key from pfassignment as assignment") .append(" where assignment.templateReference.key=:assignmentKey"); @@ -395,7 +396,21 @@ public class AssignmentDAO { .setFirstResult(0) .setMaxResults(1) .getResultList(); - return counts != null && counts.size() > 0 && counts.get(0) != null && counts.get(0).intValue() >= 0; + return counts != null && !counts.isEmpty() && counts.get(0) != null && counts.get(0).intValue() >= 0; + } + + public boolean isFormEntryInUse(RepositoryEntryRef formEntry) { + StringBuilder sb = new StringBuilder(128); + sb.append("select assignment.key from pfassignment as assignment") + .append(" where assignment.formEntry.key=:formEntryKey"); + + List<Long> counts = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Long.class) + .setParameter("formEntryKey", formEntry.getKey()) + .setFirstResult(0) + .setMaxResults(1) + .getResultList(); + return counts != null && !counts.isEmpty() && counts.get(0) != null && counts.get(0).intValue() >= 0; } public int deleteAssignmentReference(Assignment assignment) { diff --git a/src/main/java/org/olat/modules/portfolio/manager/AssignmentFormReadyToDelete.java b/src/main/java/org/olat/modules/portfolio/manager/AssignmentFormReadyToDelete.java new file mode 100644 index 0000000000000000000000000000000000000000..38080b5f6d2fc8a93db19dc30eb78cb5fe118f8c --- /dev/null +++ b/src/main/java/org/olat/modules/portfolio/manager/AssignmentFormReadyToDelete.java @@ -0,0 +1,54 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.portfolio.manager; + +import java.util.Locale; + +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.Util; +import org.olat.modules.forms.EvaluationFormReadyToDelete; +import org.olat.modules.portfolio.ui.BinderRuntimeController; +import org.olat.repository.ErrorList; +import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 15 avr. 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class AssignmentFormReadyToDelete implements EvaluationFormReadyToDelete { + + @Autowired + private AssignmentDAO assignmentDao; + + @Override + public boolean readyToDelete(RepositoryEntry entry, Locale locale, ErrorList errors) { + if(assignmentDao.isFormEntryInUse(entry)) { + Translator translator = Util.createPackageTranslator(BinderRuntimeController.class, locale); + errors.setError(translator.translate("details.delete.error.assignments", new String[] { entry.getDisplayname() })); + return false; + } + return true; + } +} diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties index f47caa704c94c2974b61ced59114a2544a1473b2..e8b6dc71f4db6eaea3c8b473cd8dd9a5346b21a5 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties @@ -162,6 +162,7 @@ delete.section.confirm.descr=Wollen Sie wirklich diesem Bereich "{0}" l\u00F6sch delete.section.confirm.title=Bereich l\u00F6schen deleted.entries=Papierkorb deleted.pages.breadcrump=Papierkorb +details.delete.error.assignments=Lernressource "{0}" kann nicht gel\u00F6scht werden. Es wird von Aufgaben in Portfolio ben\u00FCtzt. document.by=von {0} document.creationdate=Hochgeladen\: {0} document.download=Dokument laden\: diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties index 505fbf5aefca810387c33b1714265d5a96fe4e7f..944085f332b02810e78e9e4599880dd224c98633 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties @@ -162,6 +162,7 @@ delete.section.confirm.descr=Do you really want to delete this section "{0}"? delete.section.confirm.title=Delete section deleted.entries=Trash deleted.pages.breadcrump=Trash +details.delete.error.assignments=This learning resource "{0}" cannot be deleted. There are assignment in portfolio which use it. document.by=by {0} document.creationdate=Uploaded\: {0} document.download=Download document\: diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties index 85e55bd4220ac7bab3c4ea95063544b2bab1d8fc..239a47942695686c0fea3fc0e4c59e651a768d05 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_fr.properties @@ -157,6 +157,7 @@ delete.section.confirm.descr=Voulez-vous r\u00E9ellement effacer la section "{0} delete.section.confirm.title=Effacer la section deleted.entries=Poubelle deleted.pages.breadcrump=Poubelle +details.delete.error.assignments=La ressource didactique "{0}" ne peut pas \u00EAtre supprim\u00E9e. Des devoirs de portfolios l'utilisent actuellement. document.by=de {0} document.creationdate=T\u00E9l\u00E9vers\u00E9\: {0} document.download=T\u00E9l\u00E9charger le document\: diff --git a/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorDAO.java b/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorDAO.java index e49769f0cc1f777e94a744318883086cb5d08480..0e0a06708d0c5af1cb5889d2a33ac52b403813b0 100644 --- a/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorDAO.java +++ b/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorDAO.java @@ -35,6 +35,7 @@ import org.olat.modules.quality.generator.QualityGeneratorRef; import org.olat.modules.quality.generator.QualityGeneratorSearchParams; import org.olat.modules.quality.generator.QualityGeneratorView; import org.olat.modules.quality.generator.model.QualityGeneratorImpl; +import org.olat.repository.RepositoryEntryRef; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -92,7 +93,21 @@ public class QualityGeneratorDAO { .createQuery(sb.toString(), QualityGenerator.class) .getResultList(); } - + + boolean isFormEntryInUse(RepositoryEntryRef formEntry) { + StringBuilder sb = new StringBuilder(256); + sb.append("select generator.key"); + sb.append(" from qualitygenerator as generator"); + sb.append(" where generator.formEntry.key=:formEntryKey"); + + List<Long> keys = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Long.class) + .setFirstResult(0) + .setMaxResults(1) + .setParameter("formEntryKey", formEntry.getKey()) + .getResultList(); + return keys != null && !keys.isEmpty() && keys.get(0) != null && keys.get(0).longValue() > 0; + } void delete(QualityGeneratorRef generatorRef) { if (generatorRef == null || generatorRef.getKey() == null) return; diff --git a/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorFormReadyToDelete.java b/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorFormReadyToDelete.java new file mode 100644 index 0000000000000000000000000000000000000000..4d0d7123fc4c75bafa3d883075efe4914e8d6132 --- /dev/null +++ b/src/main/java/org/olat/modules/quality/generator/manager/QualityGeneratorFormReadyToDelete.java @@ -0,0 +1,55 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.quality.generator.manager; + +import java.util.Locale; + +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.Util; +import org.olat.modules.forms.EvaluationFormReadyToDelete; +import org.olat.modules.quality.generator.ui.GeneratorController; +import org.olat.repository.ErrorList; +import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 15 avr. 2019<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +@Service +public class QualityGeneratorFormReadyToDelete implements EvaluationFormReadyToDelete { + + @Autowired + private QualityGeneratorDAO qualityGeneratorDao; + + @Override + public boolean readyToDelete(RepositoryEntry entry, Locale locale, ErrorList errors) { + if(qualityGeneratorDao.isFormEntryInUse(entry)) { + Translator translator = Util.createPackageTranslator(GeneratorController.class, locale); + errors.setError(translator.translate("details.delete.error.quality.form.entry", new String[] { entry.getDisplayname() })); + return false; + } + + return true; + } +} diff --git a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_de.properties index e1cc9bf8f3a7dca5c1a44df0499369c4200f571a..42e2b33538210b678bbc802b2f781643b619173d 100644 --- a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_de.properties @@ -15,6 +15,7 @@ curriculum.element.select.curriculum=Curriculum curriculum.element.select.curriculum.element=Curriculumelement curriculum.element.select.title=Curriculumelement hinzuf\u00FCgen curriculum.element.type.name=Typ +details.delete.error.quality.form.entry=Lernressource "{0}" kann nicht gel\u00F6scht werden. Es wird von einen Datenerhebungen ben\u00FCtzt. generator.configuration=Konfiguration generator.create=Generator erstellen generator.create.button=Erstellen diff --git a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_en.properties index f273c6996425c814da8a343e5c5983a33e2f4a43..9ab67696d14e4e2b61ecd450870759538f3a359c 100644 --- a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_en.properties @@ -16,6 +16,7 @@ curriculum.element.select.curriculum.element=Curriculum element curriculum.element.select.curriculum=Curriculum curriculum.element.select.title=Add curriculum element curriculum.element.type.name=Type +details.delete.error.quality.form.entry=This learning resource "{0}" cannot be deleted. There are data collections which need it. generator.configuration=Configuration generator.create.button=Create generator.create.create=Create diff --git a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_fr.properties index 92f85acf9bf8f70750f6eb9c264d3d73933b8897..1af634718a5fca15fbe4f13db6949225561617fc 100644 --- a/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/quality/generator/ui/_i18n/LocalStrings_fr.properties @@ -15,6 +15,7 @@ curriculum.element.select.curriculum=Cursus curriculum.element.select.curriculum.element=El\u00E9ment de cursus curriculum.element.select.title=Ajouter un \u00E9l\u00E9ment de cursus curriculum.element.type.name=Type +details.delete.error.quality.form.entry=La ressource didactique "{0}" ne peut pas \u00EAtre supprim\u00E9e. Elle est utilis\u00E9e pour collecter des donn\u00E9es. generator.configuration=Configuration generator.create=Cr\u00E9er un g\u00E9n\u00E9rateur generator.create.button=Cr\u00E9er 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 94f7a8d9ff8f76c14de2cfbadbda1ff42659ec91..f13fbfb6f9fd4c34ff2151b18fcec36881631871 100644 --- a/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java +++ b/src/main/java/org/olat/repository/ui/author/ConfirmDeletePermanentlyController.java @@ -100,7 +100,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController { protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { if(formLayout instanceof FormLayoutContainer) { FormLayoutContainer layout = (FormLayoutContainer)formLayout; - layout.contextPut("notAllDeleteable", new Boolean(notAllDeleteable)); + layout.contextPut("notAllDeleteable", Boolean.valueOf(notAllDeleteable)); layout.contextPut("numOfMembers", Integer.toString(numOfMembers)); FormLayoutContainer layoutCont = FormLayoutContainer.createDefaultFormLayout("confirm", getTranslator()); @@ -247,7 +247,7 @@ public class ConfirmDeletePermanentlyController extends FormBasicController { Collection<String> selectedKeys = referencesEl.getSelectedKeys(); List<RepositoryEntry> referencesToDelete = new ArrayList<>(selectedKeys.size()); for(String selectedRefKey:selectedKeys) { - Long key = new Long(selectedRefKey); + Long key = Long.valueOf(selectedRefKey); ReferenceInfos refInfos = referencesMap.get(key); if(refInfos != null && refInfos.isOrphan() && refInfos.isOwner() && !refInfos.isManaged()) { referencesToDelete.add(referencesMap.get(key).getEntry()); diff --git a/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java b/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java index 6f2aec6d26d46cd4035bcb779e1ece6a110c8193..eea7bb4b83e6b88e9025bca1c096cb487c90972b 100644 --- a/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java +++ b/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java @@ -28,6 +28,7 @@ import org.olat.basesecurity.OrganisationService; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; import org.olat.core.id.Organisation; +import org.olat.modules.forms.manager.EvaluationFormTestsHelper; import org.olat.modules.portfolio.Assignment; import org.olat.modules.portfolio.AssignmentStatus; import org.olat.modules.portfolio.AssignmentType; @@ -64,6 +65,8 @@ public class AssignmentDAOTest extends OlatTestCase { private RepositoryService repositoryService; @Autowired private OrganisationService organisationService; + @Autowired + private EvaluationFormTestsHelper evaTestHelper; @Test public void createBinderWithAssignment() { @@ -312,6 +315,38 @@ public class AssignmentDAOTest extends OlatTestCase { Assert.assertTrue(assignmentInUse); } + @Test + public void isFormEntryInUse() { + Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("port-u-10"); + RepositoryEntry templateEntry = createTemplate(owner, "Template", "TE"); + RepositoryEntry formEntry = evaTestHelper.createSurvey().getFormEntry(); + dbInstance.commitAndCloseSession(); + + //1 section + Binder templateBinder = portfolioService.getBinderByResource(templateEntry.getOlatResource()); + SectionRef sectionRef = portfolioService.getSections(templateBinder).get(0); + dbInstance.commit(); + + //make 1 assignment + Section templateSection = portfolioService.getSection(sectionRef); + portfolioService.addAssignment("1 Assignment", "", "", AssignmentType.essay, false, templateSection, null, false, false, false, formEntry); + dbInstance.commit(); + + // check the method + boolean formEntryNotInUse = assignmentDao.isFormEntryInUse(formEntry); + Assert.assertTrue(formEntryNotInUse); + } + + @Test + public void isFormEntryInUse_notUsed() { + RepositoryEntry notUsedFormEntry = evaTestHelper.createSurvey().getFormEntry(); + dbInstance.commitAndCloseSession(); + + // check the method + boolean formEntryNotInUse = assignmentDao.isFormEntryInUse(notUsedFormEntry); + Assert.assertFalse(formEntryNotInUse); + } + @Test public void loadAssignment_pageBody() { Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("port-u-10");