From e7f47347596d15906b4c5bc907a31fa8549ada95 Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Fri, 17 May 2019 17:19:02 +0200 Subject: [PATCH] OO-4058: refactor curriculum roles --- .../site/ui/_i18n/LocalStrings_de.properties | 4 +- .../site/ui/_i18n/LocalStrings_en.properties | 4 +- .../site/ui/_i18n/LocalStrings_fr.properties | 4 +- .../ui/_i18n/LocalStrings_pt_BR.properties | 3 +- .../bulkChange/UserBulkChangeManager.java | 2 +- .../user/course/CourseOverviewController.java | 2 +- .../nodes/portfolio/PortfolioConfigForm.java | 2 +- .../nodes/video/VideoEditController.java | 4 +- .../site/ui/CourseSiteAdminController.java | 4 +- .../BusinessGroupEditResourceController.java | 2 +- .../ui/main/EditMembershipController.java | 2 +- .../BGConfigResourcesStepController.java | 2 +- .../CurriculumElementMembership.java | 2 +- .../modules/curriculum/CurriculumRoles.java | 1 + .../CurriculumSecurityCallback.java | 16 +++- .../CurriculumSecurityCallbackFactory.java | 50 ++++++++-- .../modules/curriculum/CurriculumService.java | 6 +- .../curriculum/manager/CurriculumDAO.java | 47 ++++++---- .../manager/CurriculumElementDAO.java | 21 ++++- .../manager/CurriculumServiceImpl.java | 25 +++-- .../CurriculumElementMembershipChange.java | 16 ++-- .../CurriculumElementMembershipImpl.java | 12 +-- .../model/CurriculumSearchParameters.java | 24 +++-- .../restapi/CurriculumElementsWebService.java | 17 ++-- .../restapi/CurriculumsWebService.java | 16 ++-- ...iculumManagerAndOwnerSecurityCallback.java | 2 +- .../CurriculumManagerSecurityCallback.java | 2 +- .../ui/CurriculumComposerController.java | 47 +++++----- ...rriculumElementResourceListController.java | 13 ++- ...iculumElementUserManagementController.java | 8 +- .../ui/CurriculumListManagerController.java | 17 +++- .../curriculum/ui/CurriculumTreeModel.java | 11 ++- .../CurriculumUserManagementController.java | 2 +- .../ui/EditCurriculumElementController.java | 22 +++-- .../ui/MoveCurriculumElementController.java | 19 +++- .../ui/_i18n/LocalStrings_de.properties | 1 + .../ui/_i18n/LocalStrings_en.properties | 1 + .../portfolio/ui/BinderListController.java | 2 +- .../qpool/ui/QuestionListController.java | 2 +- .../RepositoryEntryWhiteListController.java | 2 +- .../wizard/AddCourseUserSearchController.java | 2 +- .../olat/portfolio/ui/EPMapRunController.java | 2 +- .../olat/repository/RepositoryManager.java | 40 ++++---- .../ReferencableEntriesSearchController.java | 19 ++-- .../RepositorySearchController.java | 32 +++---- .../handlers/WebDocumentHandler.java | 14 +-- .../repository/ui/RepositoryTableModel.java | 9 +- .../ui/WebDocumentRunController.java | 4 +- .../repository/ui/author/AccessRenderer.java | 15 +++ .../catalog/CatalogNodeManagerController.java | 2 +- .../java/org/olat/upgrade/OLATUpgrade.java | 3 - .../org/olat/upgrade/OLATUpgrade_13_3_0.java | 91 +++++++++++++++++-- .../OrganisationResourceListController.java | 2 +- .../curriculum/manager/CurriculumDAOTest.java | 40 ++++++-- .../manager/CurriculumElementDAOTest.java | 8 +- .../manager/CurriculumMemberQueriesTest.java | 8 +- .../manager/CurriculumServiceTest.java | 2 +- .../manager/EPStructureManagerTest.java | 2 +- .../repository/RepositoryManagerTest.java | 4 +- .../CurriculumElementsWebServiceTest.java | 13 +-- .../restapi/CurriculumsWebServiceTest.java | 26 +++--- 61 files changed, 502 insertions(+), 275 deletions(-) diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties index 10cdf153d91..1bed045c4e5 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_de.properties @@ -13,8 +13,8 @@ CourseSiteDef4=Infoseite n\u00b04 CourseSiteDef=Infoseite n\u00b01 courseSiteForbiddenAlt=Forbidden ctrl. CurriculumAdminSiteDef=Curriculumverwaltung -curriculumManagerAndOwnerSiteSecurityCallback=Curriculumverwalter und Kursbesitzer -curriculumManagerSiteSecurityCallback=Curriculumverwalter +curriculumManagerAndOwnerSiteSecurityCallback=Curriculumverwalter bis zu Kursbesitzer +curriculumManagerSiteSecurityCallback=Curriculumverwalter und Curriculumbesitzer defaultSiteSecurityCallback=Alle inklusive G\u00e4ste und eP-Einladung disabledSiteSecurityCallback=Deaktiviert DocumentPoolSiteDef=Dokumentenpool diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties index e36579aa971..10db52e1583 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_en.properties @@ -25,8 +25,8 @@ adminSiteSecurityCallback=Administrators only authorAndPoolPrivateMembersSiteSecurityCallback=Authors, question bank admins and members catalogManagerSiteSecurityCallback=Catalog manager and learning resource managers courseSiteForbiddenAlt=Forbidden ctrl. -curriculumManagerAndOwnerSiteSecurityCallback=Curriculum managers and course owners -curriculumManagerSiteSecurityCallback=Curriculum managers +curriculumManagerAndOwnerSiteSecurityCallback=Curriculum managers up to course owners +curriculumManagerSiteSecurityCallback=Curriculum managers and curriculum owners defaultSiteSecurityCallback=All, including guests and invitee disabledSiteSecurityCallback=Disabled down=Down diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties index d5e11ac3e26..569aee5ef5e 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_fr.properties @@ -27,8 +27,8 @@ adminSiteSecurityCallback=Administrateurs authorAndPoolPrivateMembersSiteSecurityCallback=Auteurs, membres et administrateurs de pool de questions catalogManagerSiteSecurityCallback=Administrateurs du catalogue et des ressources didactiques courseSiteForbiddenAlt=Acc\u00E8s interdit -curriculumManagerAndOwnerSiteSecurityCallback=Administrateurs de cursus et propri\u00E9taires de cours -curriculumManagerSiteSecurityCallback=Administrateurs de cursus +curriculumManagerAndOwnerSiteSecurityCallback=Administrateurs de cursus jusqu'\u00E0 propri\u00E9taires de cours +curriculumManagerSiteSecurityCallback=Administrateurs de cursus et propri\u00E9taires de cursus defaultSiteSecurityCallback=Tous y compris les invit\u00E9 et les invitations eP disabledSiteSecurityCallback=D\u00E9sactiv\u00E9 down=En bas diff --git a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties index 9940e37df93..4660d9c4b7f 100644 --- a/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/admin/site/ui/_i18n/LocalStrings_pt_BR.properties @@ -27,8 +27,7 @@ adminSiteSecurityCallback=Administradores authorAndPoolPrivateMembersSiteSecurityCallback=Autores, admins de banco de perguntas e membros catalogManagerSiteSecurityCallback=Gestores de cat\u00E1logo e recursos did\u00E1ticos courseSiteForbiddenAlt=Ctrl Proibido. -curriculumManagerAndOwnerSiteSecurityCallback=Gestores de curr\u00EDculo e propriet\u00E1rios de cursos -curriculumManagerSiteSecurityCallback=Gestores de curr\u00EDculo +curriculumManagerSiteSecurityCallback=Gestores de curr\u00EDculo e propriet\u00E1rios de curr\u00EDculo defaultSiteSecurityCallback=Todos disabledSiteSecurityCallback=Inativo down=Para baixo diff --git a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java index 4594c29f863..4cef2ade28a 100644 --- a/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java +++ b/src/main/java/org/olat/admin/user/bulkChange/UserBulkChangeManager.java @@ -312,7 +312,7 @@ public class UserBulkChangeManager implements InitializingBean { String internalGender = ((GenderPropertyHandler)handler).getInternalValue(identity.getUser()); if(StringHelper.containsNonWhitespace(internalGender)) { Translator userPropTrans = userManager.getUserPropertiesConfig().getTranslator(translator); - gender = userPropTrans.translate("form.name.gender.salutation." + internalGender); + gender = userPropTrans.translate("form.name.gender.salutation." + internalGender.toLowerCase()); } } diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java index 7127820f914..5e2f5b33c80 100644 --- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java +++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java @@ -375,7 +375,7 @@ public class CourseOverviewController extends BasicController { RepositoryEntryFilter filter = new ManagedEntryfilter(); repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() }, filter, - translate("choose"), false, false, true, true, Can.all); + translate("choose"), false, false, true, false, true, Can.all); repoSearchCtr.setUserObject(type); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), diff --git a/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java b/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java index 1bdf8f2ea41..19f1289cf37 100644 --- a/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java +++ b/src/main/java/org/olat/course/nodes/portfolio/PortfolioConfigForm.java @@ -248,7 +248,7 @@ public class PortfolioConfigForm extends FormBasicController { searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ EPTemplateMapResource.TYPE_NAME, BinderTemplateResource.TYPE_NAME}, - translate("select.map2"), false, true, false, false); + translate("select.map2"), false, true, false, false, false); listenTo(searchController); cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent(), true, translate("select.map")); diff --git a/src/main/java/org/olat/course/nodes/video/VideoEditController.java b/src/main/java/org/olat/course/nodes/video/VideoEditController.java index 28c5de2f91c..71ba02dc3dd 100644 --- a/src/main/java/org/olat/course/nodes/video/VideoEditController.java +++ b/src/main/java/org/olat/course/nodes/video/VideoEditController.java @@ -232,7 +232,9 @@ public class VideoEditController extends ActivateableTabbableDefaultController i removeAsListenerAndDispose(cmc); removeAsListenerAndDispose(searchController); - searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[] {VideoFileResource.TYPE_NAME}, translate(NLS_COMMAND_CHOOSEVIDEO), true, false, false, false); + searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, + new String[] {VideoFileResource.TYPE_NAME}, translate(NLS_COMMAND_CHOOSEVIDEO), + true, false, false, false, false); listenTo(searchController); cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent(), true, translate(NLS_COMMAND_CHOOSEVIDEO)); diff --git a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java index 66e426c58ad..e12f40aec60 100644 --- a/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java +++ b/src/main/java/org/olat/course/site/ui/CourseSiteAdminController.java @@ -222,7 +222,7 @@ public class CourseSiteAdminController extends FormBasicController { private void doSelecCourse(UserRequest ureq, LanguageConfigurationRow row) { removeAsListenerAndDispose(selectCtrl); selectCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ "CourseModule" }, translate("select"), - true, true, false, true); + true, true, false, false, true); selectCtrl.setUserObject(row); listenTo(selectCtrl); @@ -238,7 +238,7 @@ public class CourseSiteAdminController extends FormBasicController { } public CourseSiteConfiguration saveConfiguration() { - List<LanguageConfiguration> langConfigList = new ArrayList<LanguageConfiguration>(); + List<LanguageConfiguration> langConfigList = new ArrayList<>(); for(LanguageConfigurationRow row:model.getObjects()) { if(StringHelper.containsNonWhitespace(row.getSoftKey())) { langConfigList.add(row.getRawObject()); diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java index 4d2978ee119..65278e558fc 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java @@ -143,7 +143,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme RepositoryEntryFilter filter = new ManagedEntryfilter(); repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() }, filter, - translate("resources.add"), true, true, true, true, Can.referenceable); + translate("resources.add"), true, true, true, false, true, Can.referenceable); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("resources.add.title")); listenTo(cmc); diff --git a/src/main/java/org/olat/group/ui/main/EditMembershipController.java b/src/main/java/org/olat/group/ui/main/EditMembershipController.java index dde0edb1896..1f5c8cd4f85 100644 --- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java +++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java @@ -542,7 +542,7 @@ public class EditMembershipController extends FormBasicController { change.setCoach(rePermission.isTutor() == cCoach ? null : Boolean.valueOf(cCoach)); boolean cParticipant = option.getParticipant().isAtLeastSelected(1); change.setParticipant(rePermission.isParticipant() == cParticipant ? null : Boolean.valueOf(cParticipant)); - if(change.getCurriculumManager() != null || change.getRepositoryEntryOwner() != null || change.getCoach() != null || change.getParticipant() != null) { + if(change.getCurriculumElementOwner() != null || change.getRepositoryEntryOwner() != null || change.getCoach() != null || change.getParticipant() != null) { changes.add(change); } } diff --git a/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java b/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java index 9fec71b6cfd..af28862a274 100644 --- a/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java +++ b/src/main/java/org/olat/group/ui/wizard/BGConfigResourcesStepController.java @@ -155,7 +155,7 @@ public class BGConfigResourcesStepController extends StepFormBasicController { removeAsListenerAndDispose(cmc); repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{CourseModule.getCourseTypeName()}, - translate("resources.add"), true, true, true, true); + translate("resources.add"), true, true, true, false, true); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), this.repoSearchCtr.getInitialComponent(), true, translate("resources.add.title")); listenTo(cmc); diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java b/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java index 07b6bbc1539..ee5e7ccb6f2 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumElementMembership.java @@ -37,7 +37,7 @@ public interface CurriculumElementMembership { public boolean isParticipant(); - public boolean isCurriculumManager(); + public boolean isCurriculumElementOwner(); /** * @return true if the identity has at least one role on the curriculum element diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java b/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java index 8cadc674d26..a251b9131f0 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumRoles.java @@ -35,6 +35,7 @@ public enum CurriculumRoles { curriculummanager, curriculumowner,// own a piece of a curriculum + curriculumelementowner,// own a piece of curriculum owner, //same as GroupRoles coach, //same as GroupRoles participant; //same as GroupRoles diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java index 61ab3e77756..da9e227045b 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallback.java @@ -35,11 +35,21 @@ public interface CurriculumSecurityCallback { public boolean canNewCurriculumElement(); - public boolean canEditCurriculumElement(); + public boolean canEditCurriculumElements(); - public boolean canManagerCurriculumElementUsers(); + /** + * @param element The curriculum element + * @return true if the user can edit the specified curriculum element + */ + public boolean canEditCurriculumElement(CurriculumElement element); - public boolean canManagerCurriculumElementResources(); + public boolean canEditCurriculumTree(); + + public boolean canManagerCurriculumElementsUsers(); + + public boolean canManagerCurriculumElementUsers(CurriculumElement element); + + public boolean canManagerCurriculumElementResources(CurriculumElement element); public boolean canViewAllCalendars(); diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java index 5fa97c42b9a..4f58624415f 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumSecurityCallbackFactory.java @@ -19,6 +19,11 @@ */ package org.olat.modules.curriculum; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import org.olat.core.id.Roles; /** @@ -37,24 +42,28 @@ public class CurriculumSecurityCallbackFactory { * @return A security callback without any administration permissions. */ public static final CurriculumSecurityCallback createDefaultCallback() { - return new DefaultCurriculumSecurityCallback(false); + return new DefaultCurriculumSecurityCallback(false, Collections.emptyList()); } public static final CurriculumSecurityCallback createCallback(Roles roles) { boolean admin = roles.isCurriculumManager() || roles.isAdministrator(); - return new DefaultCurriculumSecurityCallback(admin); + return new DefaultCurriculumSecurityCallback(admin, Collections.emptyList()); } - public static final CurriculumSecurityCallback createCallback(boolean canManage) { - return new DefaultCurriculumSecurityCallback(canManage); + public static final CurriculumSecurityCallback createCallback(boolean canManage, List<CurriculumElementRef> ownedRefs) { + return new DefaultCurriculumSecurityCallback(canManage, ownedRefs); } private static class DefaultCurriculumSecurityCallback implements CurriculumSecurityCallback { private final boolean admin; + private final Set<Long> ownedElementKeys; - public DefaultCurriculumSecurityCallback(boolean admin) { + public DefaultCurriculumSecurityCallback(boolean admin, List<CurriculumElementRef> ownedElementRefs) { this.admin = admin; + ownedElementKeys = ownedElementRefs.stream() + .map(CurriculumElementRef::getKey) + .collect(Collectors.toSet()); } @Override @@ -78,20 +87,43 @@ public class CurriculumSecurityCallbackFactory { } @Override - public boolean canEditCurriculumElement() { - return admin; + public boolean canEditCurriculumElements() { + return admin || !ownedElementKeys.isEmpty(); + } + + @Override + public boolean canEditCurriculumElement(CurriculumElement element) { + if(element == null) return false; + if(admin) return true; + + for(CurriculumElement el=element ; el != null; el=el.getParent()) { + if(ownedElementKeys.contains(el.getKey())) { + return true; + } + } + return false; } @Override - public boolean canManagerCurriculumElementUsers() { + public boolean canEditCurriculumTree() { return admin; } @Override - public boolean canManagerCurriculumElementResources() { + public boolean canManagerCurriculumElementsUsers() { return admin; } + @Override + public boolean canManagerCurriculumElementUsers(CurriculumElement element) { + return element != null && (admin || ownedElementKeys.contains(element.getKey())); + } + + @Override + public boolean canManagerCurriculumElementResources(CurriculumElement element) { + return element != null && (admin || ownedElementKeys.contains(element.getKey())); + } + @Override public boolean canViewAllCalendars() { return admin; diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumService.java b/src/main/java/org/olat/modules/curriculum/CurriculumService.java index 6237bbd9069..7c9b1c8c995 100644 --- a/src/main/java/org/olat/modules/curriculum/CurriculumService.java +++ b/src/main/java/org/olat/modules/curriculum/CurriculumService.java @@ -127,14 +127,14 @@ public interface CurriculumService { * @param identity The identity * @return true if the identity is manager of at least one curriculum */ - public boolean isCurriculumManager(IdentityRef identity); + public boolean isCurriculumOwner(IdentityRef identity); /** * @param identity The identity * @return true if the identity is manager of at least one curriculum or * is course owner of a course in a curriculum. */ - public boolean isCurriculumManagerOrOwner(IdentityRef identity); + public boolean isCurriculumOwnerUptoEntryOwner(IdentityRef identity); /** * Add a member to the curriculum with the specified role. @@ -357,6 +357,8 @@ public interface CurriculumService { */ public List<Identity> getMembersIdentity(CurriculumElementRef element, CurriculumRoles role); + public List<CurriculumElementMembership> getCurriculumElementMemberships(Curriculum curriculum, Identity identity); + public List<CurriculumElementMembership> getCurriculumElementMemberships(Collection<CurriculumElement> elements, Identity... identities); public void updateCurriculumElementMemberships(Identity doer, Roles roles, List<CurriculumElementMembershipChange> changes); diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java index 735988d98a1..2089919a597 100644 --- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java +++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java @@ -76,6 +76,16 @@ public class CurriculumDAO { return curriculum; } + public List<Curriculum> loadAllCurriculums() { + StringBuilder sb = new StringBuilder(128); + sb.append("select cur from curriculum cur") + .append(" left join fetch cur.organisation org") + .append(" inner join fetch cur.group baseGroup"); + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Curriculum.class) + .getResultList(); + } + public Curriculum loadByKey(Long key) { StringBuilder sb = new StringBuilder(128); sb.append("select cur from curriculum cur") @@ -174,12 +184,12 @@ public class CurriculumDAO { sb.append(")"); } - if(params.getManagerIdentity() != null) { + if(params.getCurriculumAdmin() != null) { sb.and() .append("exists (select membership.key from bgroupmember as membership") .append(" where membership.identity.key=:managerKey") .append(" and (membership.group.key=baseGroup.key or organis.group.key=baseGroup.key)") - .append(" and role in ('").append(CurriculumRoles.curriculummanager).append("')") + .append(" and role ").in(CurriculumRoles.curriculummanager, CurriculumRoles.curriculumowner) .append(")"); } @@ -199,8 +209,8 @@ public class CurriculumDAO { if(fuzzyRef != null) { query.setParameter("fuzzyRef", fuzzyRef); } - if(params.getManagerIdentity() != null) { - query.setParameter("managerKey", params.getManagerIdentity().getKey()); + if(params.getCurriculumAdmin() != null) { + query.setParameter("managerKey", params.getCurriculumAdmin().getKey()); } return query.getResultList(); } @@ -242,29 +252,34 @@ public class CurriculumDAO { sb.append(")"); } - if(params.getOwnerIdentity() != null || params.getManagerIdentity() != null) { + if(params.getElementOwner() != null || params.getCurriculumAdmin() != null) { sb.and() .append("("); - if(params.getOwnerIdentity() != null) { - sb.append("exists (select courseMembership.key from curriculumelement as courseCurEl") + if(params.getElementOwner() != null) { + sb.append("exists (select courseCurEl.key from curriculumelement as courseCurEl") .append(" inner join repoentrytogroup as curRelGroup on (courseCurEl.group.key=curRelGroup.group.key)") .append(" inner join repoentrytogroup as courseRelGroup on (courseRelGroup.entry.key=curRelGroup.entry.key)") .append(" inner join courseRelGroup.group as courseBaseGroup") .append(" inner join courseBaseGroup.members as courseMembership") .append(" where courseMembership.identity.key=:ownerKey and courseMembership.role='").append(GroupRoles.owner.name()).append("'") .append(" and courseCurEl.curriculum.key=cur.key") + .append(") or exists (select ownedCurEl.key from curriculumelement as ownedCurEl") + .append(" inner join ownedCurEl.group as ownedBaseGroup") + .append(" inner join ownedBaseGroup.members as ownedMembership") + .append(" where ownedMembership.identity.key=:ownerKey and ownedMembership.role ").in(CurriculumRoles.curriculumelementowner, CurriculumRoles.owner) + .append(" and ownedCurEl.curriculum.key=cur.key") .append(")"); } - if(params.getManagerIdentity() != null) { - if(params.getOwnerIdentity() != null) { + if(params.getCurriculumAdmin() != null) { + if(params.getElementOwner() != null) { sb.append(" or "); } sb.append("exists (select membership.key from bgroupmember as membership") .append(" where membership.identity.key=:managerKey") .append(" and (membership.group.key=baseGroup.key or membership.group.key=organis.group.key)") - .append(" and role in ('").append(CurriculumRoles.curriculummanager).append("','").append(OrganisationRoles.administrator).append("','").append(OrganisationRoles.principal).append("')") + .append(" and role ").in(CurriculumRoles.curriculummanager, OrganisationRoles.administrator, OrganisationRoles.principal) .append(")"); } @@ -287,11 +302,11 @@ public class CurriculumDAO { if(fuzzyRef != null) { query.setParameter("fuzzyRef", fuzzyRef); } - if(params.getManagerIdentity() != null) { - query.setParameter("managerKey", params.getManagerIdentity().getKey()); + if(params.getCurriculumAdmin() != null) { + query.setParameter("managerKey", params.getCurriculumAdmin().getKey()); } - if(params.getOwnerIdentity() != null) { - query.setParameter("ownerKey", params.getOwnerIdentity().getKey()); + if(params.getElementOwner() != null) { + query.setParameter("ownerKey", params.getElementOwner().getKey()); } List<Object[]> rawObjects = query.getResultList(); @@ -340,8 +355,8 @@ public class CurriculumDAO { return has != null && !has.isEmpty() && has.get(0) != null; } - public boolean hasOwnerRoleInCurriculum(IdentityRef identity) { - StringBuilder sb = new StringBuilder(256); + public boolean hasOwnerRoleInCurriculumElement(IdentityRef identity) { + QueryBuilder sb = new QueryBuilder(256); sb.append("select v.key from repositoryentry v") .append(" inner join v.groups as relGroup") .append(" inner join relGroup.group as baseGroup") diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java index 5c172fe8d2a..1dc5277223d 100644 --- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java +++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java @@ -39,6 +39,7 @@ import javax.persistence.TypedQuery; import org.olat.basesecurity.Group; import org.olat.basesecurity.GroupMembership; import org.olat.basesecurity.GroupRoles; +import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.OrganisationRoles; import org.olat.basesecurity.manager.GroupDAO; import org.olat.core.commons.persistence.DB; @@ -797,6 +798,22 @@ public class CurriculumElementDAO { .getResultList(); } + public boolean hasCurriculumElementRole(IdentityRef identity, String role) { + QueryBuilder sb = new QueryBuilder(256); + sb.append("select el.key from curriculumelement el") + .append(" inner join el.group baseGroup") + .append(" inner join baseGroup.members membership") + .append(" where membership.identity.key=:identityKey and membership.role=:role"); + List<Long> has = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Long.class) + .setParameter("identityKey", identity.getKey()) + .setParameter("role", role) + .setFirstResult(0) + .setMaxResults(1) + .getResultList(); + return has != null && !has.isEmpty() && has.get(0) != null; + } + public List<Identity> getMembers(List<CurriculumElementRef> elements, String... roles) { if(elements == null || elements.isEmpty()) return new ArrayList<>(); @@ -870,8 +887,8 @@ public class CurriculumElementDAO { CurriculumElementMembershipImpl membership = memberships .computeIfAbsent(key, k -> new CurriculumElementMembershipImpl(k.getIdentityKey(), k.getCurriculumElementKey())); - if(CurriculumRoles.curriculummanager.name().equals(role)) { - membership.setCurriculumManager(true); + if(CurriculumRoles.curriculumelementowner.name().equals(role)) { + membership.setCurriculumElementOwner(true); } else if(CurriculumRoles.owner.name().equals(role)) { membership.setRepositoryEntryOwner(true); } else if(CurriculumRoles.coach.name().equals(role)) { diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java index 5159c8ea214..f8ba5b3ac81 100644 --- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java +++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java @@ -157,14 +157,15 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat } @Override - public boolean isCurriculumManager(IdentityRef identity) { - return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculummanager.name()); + public boolean isCurriculumOwner(IdentityRef identity) { + return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculumowner.name()); } @Override - public boolean isCurriculumManagerOrOwner(IdentityRef identity) { - return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculummanager.name()) - || curriculumDao.hasOwnerRoleInCurriculum(identity); + public boolean isCurriculumOwnerUptoEntryOwner(IdentityRef identity) { + return curriculumDao.hasCurriculumRole(identity, CurriculumRoles.curriculumowner.name()) + || curriculumDao.hasOwnerRoleInCurriculumElement(identity) + || curriculumElementDao.hasCurriculumElementRole(identity, CurriculumRoles.curriculumelementowner.name()); } @Override @@ -453,6 +454,12 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat return curriculumElementDao.getMembersIdentity(element, role.name()); } + @Override + public List<CurriculumElementMembership> getCurriculumElementMemberships(Curriculum curriculum, Identity identity) { + if(identity == null) return new ArrayList<>(); + return curriculumElementDao.getMembershipInfos(Collections.singletonList(curriculum), null, identity); + } + @Override public List<CurriculumElementMembership> getCurriculumElementMemberships(Collection<CurriculumElement> elements, Identity... identities) { return curriculumElementDao.getMembershipInfos(null, elements, identities); @@ -483,11 +490,11 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat private void updateCurriculumElementMembership(CurriculumElementMembershipChange changes) { CurriculumElement element = changes.getElement(); - if(changes.getCurriculumManager() != null) { - if(changes.getCurriculumManager().booleanValue()) { - addMember(element, changes.getMember(), CurriculumRoles.curriculummanager); + if(changes.getCurriculumElementOwner() != null) { + if(changes.getCurriculumElementOwner().booleanValue()) { + addMember(element, changes.getMember(), CurriculumRoles.curriculumelementowner); } else { - removeMember(element, changes.getMember(), CurriculumRoles.curriculummanager); + removeMember(element, changes.getMember(), CurriculumRoles.curriculumelementowner); } } diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java index bccd21458f3..8f770b5d716 100644 --- a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java +++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipChange.java @@ -36,7 +36,7 @@ public class CurriculumElementMembershipChange extends Event { private CurriculumElement element; private final Long groupKey; - private Boolean curriculumManager; + private Boolean curriculumElementOwner; private Boolean repositoryEntryOwner; private Boolean coach; private Boolean participant; @@ -48,7 +48,7 @@ public class CurriculumElementMembershipChange extends Event { public CurriculumElementMembershipChange(Identity member, CurriculumElementMembershipChange origin) { this(member, origin.getElement()); - curriculumManager = origin.curriculumManager; + curriculumElementOwner = origin.curriculumElementOwner; repositoryEntryOwner = origin.repositoryEntryOwner; participant = origin.participant; coach = origin.coach; @@ -80,12 +80,12 @@ public class CurriculumElementMembershipChange extends Event { this.participant = participant; } - public Boolean getCurriculumManager() { - return curriculumManager; + public Boolean getCurriculumElementOwner() { + return curriculumElementOwner; } - public void setCurriculumManager(Boolean curriculumManager) { - this.curriculumManager = curriculumManager; + public void setCurriculumElementOwner(Boolean curriculumElementOwner) { + this.curriculumElementOwner = curriculumElementOwner; } public Boolean getRepositoryEntryOwner() { @@ -103,8 +103,4 @@ public class CurriculumElementMembershipChange extends Event { public void setCoach(Boolean coach) { this.coach = coach; } - - - - } diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java index fe3a9ed331c..969ede28918 100644 --- a/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java +++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumElementMembershipImpl.java @@ -32,7 +32,7 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers private final Long identityKey; private final Long curriculumElementKey; - private boolean curriculumManager; + private boolean curriculumElementOwner; private boolean repositoryEntryOwner; private boolean coach; private boolean participant; @@ -55,7 +55,7 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers @Override public boolean hasMembership() { - return repositoryEntryOwner || coach || participant || curriculumManager; + return repositoryEntryOwner || coach || participant || curriculumElementOwner; } @Override @@ -86,12 +86,12 @@ public class CurriculumElementMembershipImpl implements CurriculumElementMembers } @Override - public boolean isCurriculumManager() { - return curriculumManager; + public boolean isCurriculumElementOwner() { + return curriculumElementOwner; } - public void setCurriculumManager(boolean curriculumManager) { - this.curriculumManager = curriculumManager; + public void setCurriculumElementOwner(boolean curriculumElementOwner) { + this.curriculumElementOwner = curriculumElementOwner; } @Override diff --git a/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java b/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java index 872ed15cba5..fc44967fc02 100644 --- a/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java +++ b/src/main/java/org/olat/modules/curriculum/model/CurriculumSearchParameters.java @@ -34,7 +34,7 @@ import org.olat.core.id.OrganisationRef; public class CurriculumSearchParameters { private String searchString; - private Identity ownerIdentity; + private Identity elementOwner; private Identity managerIdentity; private List<? extends OrganisationRef> organisations; @@ -57,19 +57,29 @@ public class CurriculumSearchParameters { this.searchString = searchString; } - public Identity getManagerIdentity() { + public Identity getCurriculumAdmin() { return managerIdentity; } - public void setManagerIdentity(Identity managerIdentity) { + /** + * Set for curriculum owners and managers + * + * @param managerIdentity + */ + public void setCurriculumAdmin(Identity managerIdentity) { this.managerIdentity = managerIdentity; } - public Identity getOwnerIdentity() { - return ownerIdentity; + public Identity getElementOwner() { + return elementOwner; } - public void setOwnerIdentity(Identity ownerIdentity) { - this.ownerIdentity = ownerIdentity; + /** + * Set for repository entry owners and curriculum elements owners + * + * @param elementOwner + */ + public void setElementOwner(Identity elementOwner) { + this.elementOwner = elementOwner; } } diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java index f5cc47b7ecc..76bfaa7d450 100644 --- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java +++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java @@ -285,7 +285,6 @@ public class CurriculumElementsWebService { } else if(moveAsCurriculumRoot) { dbInstance.commit();// make sure all is flushed on the database before such a move curriculum = curriculumService.getCurriculum(curriculum); - System.out.println(curriculum.getDisplayName()); savedElement = curriculumService.moveCurriculumElement(savedElement, curriculum); } return savedElement; @@ -703,10 +702,10 @@ public class CurriculumElementsWebService { * @return It returns an array of <code>UserVO</code> */ @GET - @Path("{curriculumElementKey}/curriculummanagers") + @Path("{curriculumElementKey}/curriculumelementowners") @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getCurriculumManagers(@PathParam("curriculumElementKey") Long curriculumElementKey) { - return getMembers(curriculumElementKey, CurriculumRoles.curriculummanager); + return getMembers(curriculumElementKey, CurriculumRoles.curriculumelementowner); } private Response getMembers(Long curriculumElementKey, CurriculumRoles role) { @@ -784,9 +783,9 @@ public class CurriculumElementsWebService { * @return Nothing */ @PUT - @Path("{curriculumElementKey}/curriculummanagers/{identityKey}") + @Path("{curriculumElementKey}/curriculumelementowners/{identityKey}") public Response putCurriculumManager(@PathParam("curriculumElementKey") Long curriculumElementKey, @PathParam("identityKey") Long identityKey) { - return putMember(curriculumElementKey, identityKey, CurriculumRoles.curriculummanager); + return putMember(curriculumElementKey, identityKey, CurriculumRoles.curriculumelementowner); } private Response putMember(Long curriculumElementKey, Long identityKey, CurriculumRoles role) { @@ -888,10 +887,10 @@ public class CurriculumElementsWebService { * @return Nothing */ @PUT - @Path("{curriculumElementKey}/curriculummanagers") + @Path("{curriculumElementKey}/curriculumelementowners") @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response putCurriculumManagers(@PathParam("curriculumElementKey") Long curriculumElementKey, UserVO[] coaches) { - return putMembers(curriculumElementKey, coaches, CurriculumRoles.curriculummanager); + return putMembers(curriculumElementKey, coaches, CurriculumRoles.curriculumelementowner); } private Response putMembers(Long curriculumElementKey, UserVO[] members, CurriculumRoles role) { @@ -974,10 +973,10 @@ public class CurriculumElementsWebService { * @return Nothing */ @DELETE - @Path("{curriculumElementKey}/curriculummanagers/{identityKey}") + @Path("{curriculumElementKey}/curriculumelementowners/{identityKey}") public Response deleteCurriculumManager(@PathParam("curriculumElementKey") Long curriculumElementKey, @PathParam("identityKey") Long identityKey) { - return deleteMember(curriculumElementKey, identityKey, CurriculumRoles.curriculummanager); + return deleteMember(curriculumElementKey, identityKey, CurriculumRoles.curriculumelementowner); } private Response deleteMember(Long curriculumElementKey, Long identityKey, CurriculumRoles role) { diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java index ff0469e5736..0ab4beac467 100644 --- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java +++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java @@ -96,7 +96,7 @@ public class CurriculumsWebService { } /** - * Return the curriculums an administrative user is allowed to see. + * Return the curriculums a manager user is allowed to see. * * @response.representation.200.qname {http://www.example.com}curriculumVO * @response.representation.200.mediaType application/xml, application/json @@ -346,9 +346,9 @@ public class CurriculumsWebService { * @return It returns an array of <code>UserVO</code> */ @GET - @Path("{curriculumKey}/curriculummanagers") + @Path("{curriculumKey}/curriculumowners") public Response getCurriculumManagers(@PathParam("curriculumKey") Long curriculumKey, @Context HttpServletRequest httpRequest) { - return getMembers(curriculumKey, CurriculumRoles.curriculummanager, httpRequest); + return getMembers(curriculumKey, CurriculumRoles.curriculumowner, httpRequest); } private Response getMembers(Long curriculumKey, CurriculumRoles role, HttpServletRequest httpRequest) { @@ -379,10 +379,10 @@ public class CurriculumsWebService { * @return Nothing */ @PUT - @Path("{curriculumKey}/curriculummanagers/{identityKey}") - public Response putCurriculumManager(@PathParam("curriculumKey") Long curriculumKey, + @Path("{curriculumKey}/curriculumowners/{identityKey}") + public Response putCurriculumOwner(@PathParam("curriculumKey") Long curriculumKey, @PathParam("identityKey") Long identityKey, @Context HttpServletRequest httpRequest) { - return putMember(curriculumKey, identityKey, CurriculumRoles.curriculummanager, httpRequest); + return putMember(curriculumKey, identityKey, CurriculumRoles.curriculumowner, httpRequest); } private Response putMember(Long curriculumKey, Long identityKey, CurriculumRoles role, HttpServletRequest httpRequest) { @@ -413,10 +413,10 @@ public class CurriculumsWebService { * @return Nothing */ @DELETE - @Path("{curriculumKey}/curriculummanagers/{identityKey}") + @Path("{curriculumKey}/curriculumowners/{identityKey}") public Response deleteCurriculumManager(@PathParam("curriculumKey") Long curriculumKey, @PathParam("identityKey") Long identityKey, @Context HttpServletRequest httpRequest) { - return deleteMember(curriculumKey, identityKey, CurriculumRoles.curriculummanager, httpRequest); + return deleteMember(curriculumKey, identityKey, CurriculumRoles.curriculumowner, httpRequest); } private Response deleteMember(Long curriculumKey, Long identityKey, CurriculumRoles role, HttpServletRequest httpRequest) { diff --git a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java index 7231ff054d8..0638078d3cd 100644 --- a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java +++ b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerAndOwnerSecurityCallback.java @@ -46,6 +46,6 @@ public class CurriculumManagerAndOwnerSecurityCallback implements SiteSecurityCa Roles roles = usess.getRoles(); return roles != null && (roles.isAdministrator() || roles.isPrincipal() || roles.isCurriculumManager() - || curriculumService.isCurriculumManagerOrOwner(ureq.getIdentity())); + || curriculumService.isCurriculumOwnerUptoEntryOwner(ureq.getIdentity())); } } diff --git a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java index 9754944822b..3f8c03d52ba 100644 --- a/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java +++ b/src/main/java/org/olat/modules/curriculum/site/CurriculumManagerSecurityCallback.java @@ -46,6 +46,6 @@ public class CurriculumManagerSecurityCallback implements SiteSecurityCallback { Roles roles = usess.getRoles(); return roles != null && (roles.isAdministrator() || roles.isPrincipal() || roles.isCurriculumManager() - || curriculumService.isCurriculumManager(ureq.getIdentity())); + || curriculumService.isCurriculumOwner(ureq.getIdentity())); } } diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java index 924ca282a86..7f84447b50a 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumComposerController.java @@ -163,7 +163,7 @@ public class CurriculumComposerController extends FormBasicController implements @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - if(secCallback.canManagerCurriculumElementUsers()) { + if(secCallback.canManagerCurriculumElementsUsers()) { if(managed && isAllowedToOverrideManaged(ureq)) { overrideLink = uifactory.addFormLink("override.member", formLayout, Link.BUTTON); overrideLink.setIconLeftCSS("o_icon o_icon-fw o_icon_refresh"); @@ -205,7 +205,7 @@ public class CurriculumComposerController extends FormBasicController implements zoomColumn.setExportable(false); zoomColumn.setAlwaysVisible(true); columnsModel.addFlexiColumnModel(zoomColumn); - if(secCallback.canEditCurriculumElement()) { + if(secCallback.canEditCurriculumElements()) { DefaultFlexiColumnModel toolsColumn = new DefaultFlexiColumnModel(ElementCols.tools); toolsColumn.setExportable(false); toolsColumn.setAlwaysVisible(true); @@ -299,8 +299,12 @@ public class CurriculumComposerController extends FormBasicController implements } private CurriculumElementRow forgeRow(CurriculumElementInfos element) { - FormLink toolsLink = uifactory.addFormLink("tools_" + (++counter), "tools", "", null, null, Link.NONTRANSLATED); - toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg"); + FormLink toolsLink = null; + boolean tooled = secCallback.canEditCurriculumTree() || secCallback.canEditCurriculumElement(element.getCurriculumElement()); + if(tooled) { + toolsLink = uifactory.addFormLink("tools_" + (++counter), "tools", "", null, null, Link.NONTRANSLATED); + toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg"); + } FormLink resourcesLink = null; if(element.getNumOfResources() > 0) { @@ -309,7 +313,9 @@ public class CurriculumComposerController extends FormBasicController implements CurriculumElementRow row = new CurriculumElementRow(element.getCurriculumElement(), element.getNumOfResources(), element.getNumOfParticipants(), element.getNumOfCoaches(), element.getNumOfOwners(), toolsLink, resourcesLink); - toolsLink.setUserObject(row); + if(toolsLink != null) { + toolsLink.setUserObject(row); + } if(resourcesLink != null) { resourcesLink.setUserObject(row); } @@ -535,7 +541,7 @@ public class CurriculumComposerController extends FormBasicController implements showWarning("warning.curriculum.element.deleted"); } else { List<CurriculumElement> elementsToMove = Collections.singletonList(element); - moveElementCtrl = new MoveCurriculumElementController(ureq, getWindowControl(), elementsToMove, curriculum); + moveElementCtrl = new MoveCurriculumElementController(ureq, getWindowControl(), elementsToMove, curriculum, secCallback); listenTo(moveElementCtrl); String title = translate("move.element.title", new String[] { StringHelper.escapeHtml(row.getDisplayName() )}); @@ -694,22 +700,21 @@ public class CurriculumComposerController extends FormBasicController implements this.row = row; mainVC = createVelocityContainer("tools"); - + List<String> links = new ArrayList<>(4); - - //edit - editLink = addLink("edit", "o_icon_edit", links); - if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.move)) { - moveLink = addLink("move.element", "o_icon_move", links); - } - if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.addChildren)) { - newLink = addLink("add.element.under", "o_icon_levels", links); - } - copyLink = addLink("copy.element", "o_icon_copy", links); - - if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.delete)) { - links.add("-"); - deleteLink = addLink("delete", "o_icon_delete_item", links); + if(secCallback.canEditCurriculumElement(element)) { + editLink = addLink("edit", "o_icon_edit", links); + if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.move)) { + moveLink = addLink("move.element", "o_icon_move", links); + } + if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.addChildren)) { + newLink = addLink("add.element.under", "o_icon_levels", links); + } + copyLink = addLink("copy.element", "o_icon_copy", links); + if(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.delete)) { + links.add("-"); + deleteLink = addLink("delete", "o_icon_delete_item", links); + } } mainVC.contextPut("links", links); diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java index 533a4e98014..7156c7189e0 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementResourceListController.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; import org.olat.NewControllerFactory; +import org.olat.basesecurity.OrganisationRoles; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -46,6 +47,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.course.CourseModule; import org.olat.login.LoginModule; @@ -106,7 +108,7 @@ public class CurriculumElementResourceListController extends FormBasicController @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - if(!resourcesManaged && secCallback.canManagerCurriculumElementResources()) { + if(!resourcesManaged && secCallback.canManagerCurriculumElementResources(curriculumElement)) { addResourcesButton = uifactory.addFormLink("add.resources", formLayout, Link.BUTTON); addResourcesButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add"); @@ -228,9 +230,14 @@ public class CurriculumElementResourceListController extends FormBasicController private void doChooseResources(UserRequest ureq) { if(repoSearchCtr != null) return; + Roles roles = ureq.getUserSession().getRoles(); + boolean adminSearch = roles.hasRole(OrganisationRoles.administrator) + || roles.hasRole(OrganisationRoles.learnresourcemanager) + || roles.hasRole(OrganisationRoles.curriculummanager); + boolean orgSearch = secCallback.canEditCurriculumElement(curriculumElement) && !adminSearch; repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, - new String[]{ CourseModule.getCourseTypeName() }, null, - translate("add.resources"), false, false, true, true, Can.referenceable); + new String[]{ CourseModule.getCourseTypeName() }, null, translate("add.resources"), + false, false, true, orgSearch, adminSearch, Can.referenceable); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("add.resources")); diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java index 39a80c775ce..a102a9332d1 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java @@ -120,7 +120,7 @@ public class CurriculumElementUserManagementController extends FormBasicControll @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - if(!membersManaged && secCallback.canManagerCurriculumElementUsers()) { + if(!membersManaged && secCallback.canManagerCurriculumElementUsers(curriculumElement)) { addMemberButton = uifactory.addFormLink("add.member", formLayout, Link.BUTTON); addMemberButton.setIconLeftCSS("o_icon o_icon-fw o_icon_add_member"); addMemberButton.setIconRightCSS("o_icon o_icon_caret"); @@ -266,7 +266,11 @@ public class CurriculumElementUserManagementController extends FormBasicControll removeAsListenerAndDispose(roleListCtrl); String title = translate("add.member"); - roleListCtrl = new RoleListController(ureq, getWindowControl(), CurriculumRoles.values()); + CurriculumRoles[] roles = new CurriculumRoles[] { + CurriculumRoles.curriculumelementowner, + CurriculumRoles.owner, CurriculumRoles.coach, CurriculumRoles.participant + }; + roleListCtrl = new RoleListController(ureq, getWindowControl(), roles); listenTo(roleListCtrl); calloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), roleListCtrl.getInitialComponent(), addMemberButton, title, true, null); diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java index 4e6d196a5b5..1bb56c42409 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumListManagerController.java @@ -56,10 +56,13 @@ import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.resource.OresHelper; import org.olat.modules.curriculum.Curriculum; +import org.olat.modules.curriculum.CurriculumElementMembership; +import org.olat.modules.curriculum.CurriculumElementRef; import org.olat.modules.curriculum.CurriculumManagedFlag; import org.olat.modules.curriculum.CurriculumSecurityCallback; import org.olat.modules.curriculum.CurriculumSecurityCallbackFactory; import org.olat.modules.curriculum.CurriculumService; +import org.olat.modules.curriculum.model.CurriculumElementRefImpl; import org.olat.modules.curriculum.model.CurriculumInfos; import org.olat.modules.curriculum.model.CurriculumSearchParameters; import org.olat.modules.curriculum.ui.CurriculumManagerDataModel.CurriculumCols; @@ -141,14 +144,14 @@ public class CurriculumListManagerController extends FormBasicController impleme private void loadModel(String searchString, boolean reset) { CurriculumSearchParameters managerParams = new CurriculumSearchParameters(); managerParams.setSearchString(searchString); - managerParams.setManagerIdentity(getIdentity()); + managerParams.setCurriculumAdmin(getIdentity()); List<CurriculumInfos> managerCurriculums = curriculumService.getCurriculumsWithInfos(managerParams); List<CurriculumRow> rows = managerCurriculums.stream() .map(this::forgeManagedRow).collect(Collectors.toList()); CurriculumSearchParameters ownerParams = new CurriculumSearchParameters(); ownerParams.setSearchString(searchString); - ownerParams.setOwnerIdentity(getIdentity()); + ownerParams.setElementOwner(getIdentity()); List<CurriculumInfos> reOwnersCurriculums = curriculumService.getCurriculumsWithInfos(ownerParams); List<CurriculumRow> reOwnerRows = reOwnersCurriculums.stream() .filter(c -> !managerCurriculums.contains(c)) @@ -167,8 +170,6 @@ public class CurriculumListManagerController extends FormBasicController impleme toolsLink.setUserObject(row); return row; } - - @Override protected void doDispose() { @@ -309,7 +310,13 @@ public class CurriculumListManagerController extends FormBasicController impleme showWarning("warning.curriculum.deleted"); } else { WindowControl swControl = addToHistory(ureq, OresHelper.createOLATResourceableInstance(Curriculum.class, row.getKey()), null); - CurriculumSecurityCallback curriculumSecCallback = CurriculumSecurityCallbackFactory.createCallback(row.canManage()); + boolean canManage = row.canManage(); + List<CurriculumElementMembership> memberships = curriculumService.getCurriculumElementMemberships(curriculum, getIdentity()); + List<CurriculumElementRef> ownedElements = memberships.stream() + .filter(CurriculumElementMembership::isCurriculumElementOwner) + .map(m -> new CurriculumElementRefImpl(m.getCurriculumElementKey())) + .collect(Collectors.toList()); + CurriculumSecurityCallback curriculumSecCallback = CurriculumSecurityCallbackFactory.createCallback(canManage, ownedElements); composerCtrl = new CurriculumComposerController(ureq, swControl, toolbarPanel, curriculum, curriculumSecCallback); listenTo(composerCtrl); toolbarPanel.pushController(row.getDisplayName(), composerCtrl); diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java index 3795fad39e7..2c6efc716c7 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumTreeModel.java @@ -24,6 +24,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.gui.components.tree.GenericTreeNode; @@ -66,8 +67,16 @@ public class CurriculumTreeModel extends GenericTreeModel implements InsertionTr } public void loadTreeModel(List<CurriculumElement> elements) { + loadTreeModel(elements, c -> true); + } + + public void loadTreeModel(List<CurriculumElement> elements, Predicate<CurriculumElement> filter) { Map<Long,GenericTreeNode> fieldKeyToNode = new HashMap<>(); for(CurriculumElement element:elements) { + if(!filter.test(element)) { + continue; + } + Long key = element.getKey(); GenericTreeNode node = fieldKeyToNode.computeIfAbsent(key, k -> { GenericTreeNode newNode = new GenericTreeNode(nodeKey(element)); @@ -78,7 +87,7 @@ public class CurriculumTreeModel extends GenericTreeModel implements InsertionTr }); CurriculumElement parentElement = element.getParent(); - if(parentElement == null) { + if(parentElement == null || !filter.test(parentElement)) { //this is a root getRootNode().addChild(node); } else { diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java index 2619bae9677..6e96e5d1b12 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java @@ -263,7 +263,7 @@ public class CurriculumUserManagementController extends FormBasicController { removeAsListenerAndDispose(roleListCtrl); String title = translate("add.member"); - roleListCtrl = new RoleListController(ureq, getWindowControl(), new CurriculumRoles[] { CurriculumRoles.curriculummanager }); + roleListCtrl = new RoleListController(ureq, getWindowControl(), new CurriculumRoles[] { CurriculumRoles.curriculumowner }); listenTo(roleListCtrl); calloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), roleListCtrl.getInitialComponent(), addMemberButton, title, true, null); diff --git a/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java index 4af2d8df1f8..44e5892a728 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/EditCurriculumElementController.java @@ -149,9 +149,11 @@ public class EditCurriculumElementController extends FormBasicController { uifactory.addStaticTextElement("curriculum.element.external.id", externalId, formLayout); } + boolean canEdit = element == null ? true : secCallback.canEditCurriculumElement(element); + String identifier = element == null ? "" : element.getIdentifier(); identifierEl = uifactory.addTextElement("identifier", "curriculum.element.identifier", 255, identifier, formLayout); - identifierEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.identifier) && secCallback.canEditCurriculumElement()); + identifierEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.identifier) && canEdit); identifierEl.setMandatory(true); if(identifierEl.isEnabled() && !StringHelper.containsNonWhitespace(identifier)) { identifierEl.setFocus(true); @@ -159,14 +161,14 @@ public class EditCurriculumElementController extends FormBasicController { String displayName = element == null ? "" : element.getDisplayName(); displayNameEl = uifactory.addTextElement("displayName", "curriculum.element.displayName", 255, displayName, formLayout); - displayNameEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.displayName) && secCallback.canEditCurriculumElement()); + displayNameEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.displayName) && canEdit); displayNameEl.setMandatory(true); String[] statusValues = new String[] { translate("status.active"), translate("status.inactive"), translate("status.deleted") }; statusEl = uifactory.addRadiosHorizontal("status", "curriculum.element.status", formLayout, statusKey, statusValues); - statusEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.status) && secCallback.canEditCurriculumElement() ); + statusEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.status) && canEdit); if(element == null || element.getElementStatus() == null) { statusEl.select(CurriculumElementStatus.active.name(), true); } else { @@ -183,7 +185,7 @@ public class EditCurriculumElementController extends FormBasicController { typeValues[i+1] = types.get(i).getDisplayName(); } curriculumElementTypeEl = uifactory.addDropdownSingleselect("type", "curriculum.element.type", formLayout, typeKeys, typeValues, null); - curriculumElementTypeEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.type) && secCallback.canEditCurriculumElement()); + curriculumElementTypeEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.type) && canEdit); curriculumElementTypeEl.addActionListener(FormEvent.ONCHANGE); boolean typeFound = false; CurriculumElementType elementType = element == null ? null : element.getType(); @@ -202,12 +204,12 @@ public class EditCurriculumElementController extends FormBasicController { } calendarsEnabledEl = uifactory.addRadiosHorizontal("type.calendars.enabled", formLayout, new String[0], new String[0]); - calendarsEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.calendars) && secCallback.canEditCurriculumElement()); + calendarsEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.calendars) && canEdit); CurriculumCalendars calendarsEnabled = element == null ? CurriculumCalendars.inherited : element.getCalendars(); updateCalendarsEnabled(calendarsEnabled, elementType); lecturesEnabledEl = uifactory.addRadiosHorizontal("type.lectures.enabled", formLayout, new String[0], new String[0]); - lecturesEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.lectures) && secCallback.canEditCurriculumElement()); + lecturesEnabledEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.lectures) && canEdit); CurriculumLectures lecturesEnabled = element == null ? CurriculumLectures.inherited : element.getLectures(); updateLecturesEnabled(lecturesEnabled, elementType); @@ -223,22 +225,22 @@ public class EditCurriculumElementController extends FormBasicController { Date begin = element == null ? null : element.getBeginDate(); beginEl = uifactory.addDateChooser("start", "curriculum.element.begin", begin, formLayout); - beginEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && secCallback.canEditCurriculumElement()); + beginEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && canEdit); Date end = element == null ? null : element.getEndDate(); endEl = uifactory.addDateChooser("end", "curriculum.element.end", end, formLayout); - endEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && secCallback.canEditCurriculumElement()); + endEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.dates) && canEdit); endEl.setDefaultValue(beginEl); String description = element == null ? "" : element.getDescription(); descriptionEl = uifactory.addRichTextElementForStringDataCompact("curriculum.description", "curriculum.description", description, 10, 60, null, formLayout, ureq.getUserSession(), getWindowControl()); - descriptionEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.description) && secCallback.canEditCurriculumElement()); + descriptionEl.setEnabled(!CurriculumElementManagedFlag.isManaged(element, CurriculumElementManagedFlag.description) && canEdit); FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add(buttonsCont); uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl()); - if(secCallback.canEditCurriculumElement()) { + if(canEdit) { uifactory.addFormSubmitButton("save", buttonsCont); } } diff --git a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java index 543ab270e07..0ed4f972ce7 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java +++ b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.olat.core.commons.persistence.DB; @@ -45,6 +46,7 @@ import org.olat.modules.curriculum.CurriculumElement; import org.olat.modules.curriculum.CurriculumElementStatus; import org.olat.modules.curriculum.CurriculumElementType; import org.olat.modules.curriculum.CurriculumElementTypeToType; +import org.olat.modules.curriculum.CurriculumSecurityCallback; import org.olat.modules.curriculum.CurriculumService; import org.springframework.beans.factory.annotation.Autowired; @@ -60,20 +62,26 @@ public class MoveCurriculumElementController extends FormBasicController { private final CurriculumTreeModel curriculumModel; private final Curriculum curriculum; + private final CurriculumSecurityCallback secCallback; private Set<CurriculumElementType> allowedTypes = new HashSet<>(); private Set<CurriculumElementType> allowedSiblingTypes = new HashSet<>(); private List<CurriculumElement> curriculumElementsToMove; private Set<TreeNode> targetableNodes = new HashSet<>(); + private Predicate<CurriculumElement> admin = c -> true; + private Predicate<CurriculumElement> editionOnly = c -> isEditable(c); + @Autowired private DB dbInstance; @Autowired private CurriculumService curriculumService; public MoveCurriculumElementController(UserRequest ureq, WindowControl wControl, - List<CurriculumElement> curriculumElementsToMove, Curriculum curriculum) { + List<CurriculumElement> curriculumElementsToMove, Curriculum curriculum, + CurriculumSecurityCallback secCallback) { super(ureq, wControl, "move_curriculum_element"); this.curriculum = curriculum; + this.secCallback = secCallback; this.curriculumElementsToMove = new ArrayList<>(curriculumElementsToMove); curriculumModel = new CurriculumTreeModel(curriculum, curriculumElementsToMove); initAllowedTypes(); @@ -96,7 +104,8 @@ public class MoveCurriculumElementController extends FormBasicController { private void loadModel() { List<CurriculumElement> allElements = curriculumService.getCurriculumElements(curriculum, CurriculumElementStatus.notDeleted()); - curriculumModel.loadTreeModel(allElements); + Predicate<CurriculumElement> filter = secCallback.canEditCurriculumTree() ? admin : editionOnly; + curriculumModel.loadTreeModel(allElements, filter); //remove children of the curriculum element to move for(CurriculumElement elementToMove:curriculumElementsToMove) { @@ -107,7 +116,7 @@ public class MoveCurriculumElementController extends FormBasicController { nodeToMove.getParent().remove(nodeToMove); } } - + // remove the elements with incompatible types List<TreeNode> openedNodes = new ArrayList<>(); filterByAllowedTypes(curriculumModel.getRootNode(), openedNodes); @@ -241,6 +250,10 @@ public class MoveCurriculumElementController extends FormBasicController { } return false; } + + private boolean isEditable(CurriculumElement element) { + return secCallback.canEditCurriculumElement(element); + } @Override protected void formCancelled(UserRequest ureq) { diff --git a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties index 27bd2a1f9f8..c0ce34ff142 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_de.properties @@ -73,6 +73,7 @@ remove.memberships=Entfernen remove.resources=Entfernen resources.add=$add.resources role.coach=Betreuer +role.curriculumelementowner=Elementbesitzer role.curriculummanager=Curriculumverwalter role.curriculumowner=Curriculumbesitzer role.owner=Kursbesitzer diff --git a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties index 2fcefb7a7e6..5a9b288cd2d 100644 --- a/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/curriculum/ui/_i18n/LocalStrings_en.properties @@ -73,6 +73,7 @@ remove.memberships=Remove remove.resources=Remove resources.add=$add.resources role.coach=Coach +role.curriculumelementowner=Element owner role.curriculummanager=Curriculum manager role.curriculumowner=Curriculum owner role.owner=Course owner diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java index d61a6864607..120a673efbb 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderListController.java @@ -562,7 +562,7 @@ public class BinderListController extends FormBasicController String commandLabel = translate("create.binder.selectTemplate"); removeAsListenerAndDispose(searchTemplateCtrl); searchTemplateCtrl = new RepositorySearchController(commandLabel, ureq, getWindowControl(), - false, false, new String[]{ BinderTemplateResource.TYPE_NAME }, null); + false, false, new String[]{ BinderTemplateResource.TYPE_NAME }, false, null); searchTemplateCtrl.enableSearchforAllXXAbleInSearchForm(Can.all); searchTemplateCtrl.doSearchByTypeLimitAccess(new String[]{ BinderTemplateResource.TYPE_NAME }, ureq); listenTo(searchTemplateCtrl); diff --git a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java index 686128aedfc..2810942ef8f 100644 --- a/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/QuestionListController.java @@ -872,7 +872,7 @@ public class QuestionListController extends AbstractItemListController implement allowed = new String[]{ ImsQTI21Resource.TYPE_NAME }; } importTestCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, allowed, - null, translate("import.repository"), false, false, false, true, Can.copyable); + null, translate("import.repository"), false, false, false, false, true, Can.copyable); listenTo(importTestCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), diff --git a/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java b/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java index f3d2e8ab133..736f017e10c 100644 --- a/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java +++ b/src/main/java/org/olat/modules/quality/generator/ui/RepositoryEntryWhiteListController.java @@ -206,7 +206,7 @@ public class RepositoryEntryWhiteListController extends FormBasicController private void doSelectRepositoryEntry(UserRequest ureq) { selectCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[] { CourseModule.getCourseTypeName() }, translate("repository.entry.select.title"), - false, false, true, true); + false, false, true, false, true); listenTo(selectCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), diff --git a/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java b/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java index 439aa4b80ed..acc6adccef6 100644 --- a/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java +++ b/src/main/java/org/olat/modules/quality/ui/wizard/AddCourseUserSearchController.java @@ -53,7 +53,7 @@ public class AddCourseUserSearchController extends StepFormBasicController { searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[] { "CourseModule" }, translate("participation.user.course.add.choose"), - false, false, true, true); + false, false, true, false, true); listenTo(searchController); initForm (ureq); } diff --git a/src/main/java/org/olat/portfolio/ui/EPMapRunController.java b/src/main/java/org/olat/portfolio/ui/EPMapRunController.java index d749d43e232..19f58338801 100755 --- a/src/main/java/org/olat/portfolio/ui/EPMapRunController.java +++ b/src/main/java/org/olat/portfolio/ui/EPMapRunController.java @@ -281,7 +281,7 @@ public class EPMapRunController extends BasicController implements Activateable2 String commandLabel = translate("create.map.selectTemplate"); removeAsListenerAndDispose(searchTemplateCtrl); searchTemplateCtrl = new ReferencableEntriesSearchController(getWindowControl(), ureq, - new String[]{EPTemplateMapResource.TYPE_NAME}, commandLabel, false, false, false, false); + new String[]{EPTemplateMapResource.TYPE_NAME}, commandLabel, false, false, false, false, false); listenTo(searchTemplateCtrl); createMapBox = new CloseableModalController(getWindowControl(), title, searchTemplateCtrl.getInitialComponent(), true, title); createMapBox.setCustomWindowCSS("o_sel_add_map_template_window"); diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 3561a101e96..cf93395e67e 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -1139,8 +1139,9 @@ public class RepositoryManager { * This is an administrative query which need author, learn resource manager, quality manager * or higher permissions. * - * @param identity - * @param roles + * @param identity The searcher + * @param roles The roles of the searcher + * @param organisationWildCard No roles check but only organization membership instead of roles * @param resourceTypes * @param displayName * @param author @@ -1149,8 +1150,8 @@ public class RepositoryManager { * @param checkCanCopy * @return */ - public List<RepositoryEntry> queryResourcesLimitType(Identity identity, Roles roles, List<String> resourceTypes, - String displayName, String author, String desc, boolean checkCanReference, boolean checkCanCopy) { + public List<RepositoryEntry> queryResourcesLimitType(Identity identity, Roles roles, boolean organisationWildCard, + List<String> resourceTypes, String displayName, String author, String desc, boolean checkCanReference, boolean checkCanCopy) { if(!checkCanReference && !checkCanCopy) { return Collections.emptyList(); } @@ -1160,7 +1161,7 @@ public class RepositoryManager { // Build the query // 1) Joining tables - QueryBuilder sb = new QueryBuilder(400); + QueryBuilder sb = new QueryBuilder(1024); sb.append("select distinct v from repositoryentry v ") .append(" inner join fetch v.olatResource as res" ) .append(" inner join fetch v.statistics as statistics") @@ -1176,23 +1177,24 @@ public class RepositoryManager { //author if(roles.isAuthor()) { sb.append(" or (membership.role ").in(OrganisationRoles.author) - .append(" and v.status ").in(RepositoryEntryStatusEnum.reviewToClosed()).append(")"); - if(checkCanReference) { - sb.append(" and v.canReference=true"); - } - if(checkCanCopy) { - sb.append(" and v.canCopy=true"); - } + .append(" and v.status ").in(RepositoryEntryStatusEnum.reviewToClosed()) + .append(" and v.canReference=true", checkCanReference) + .append(" and v.canCopy=true", checkCanCopy) + .append(")"); } if(roles.isQualityManager()) { sb.append(" or (membership.role ").in(OrganisationRoles.qualitymanager) - .append(" and v.status ").in(RepositoryEntryStatusEnum.published).append(")"); - if(checkCanReference) { - sb.append(" and v.canReference=true"); - } - if(checkCanCopy) { - sb.append(" and v.canCopy=true"); - } + .append(" and v.status ").in(RepositoryEntryStatusEnum.published) + .append(" and v.canReference=true", checkCanReference) + .append(" and v.canCopy=true", checkCanCopy) + .append(")"); + } + if(organisationWildCard) { + sb.append(" or (membership.role ").in(OrganisationRoles.user) + .append(" and v.status ").in(RepositoryEntryStatusEnum.preparationToClosed()) + .append(" and v.canReference=true", checkCanReference) + .append(" and v.canCopy=true", checkCanCopy) + .append(")"); } sb.append(")"); diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java index 192663b1c69..8635495fce8 100644 --- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java +++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java @@ -99,8 +99,8 @@ public class ReferencableEntriesSearchController extends BasicController { private RepositoryEntry selectedRepositoryEntry; private List<RepositoryEntry> selectedRepositoryEntries; - private final boolean canImport; private final Can canBe; + private final boolean canImport; private Object userObject; @@ -110,21 +110,21 @@ public class ReferencableEntriesSearchController extends BasicController { private RepositoryHandlerFactory repositoryHandlerFactory; public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String limitType, String commandLabel) { - this(wControl, ureq, new String[]{ limitType }, null, commandLabel, true, true, false, false, Can.referenceable); + this(wControl, ureq, new String[]{ limitType }, null, commandLabel, true, true, false, false, false, Can.referenceable); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel) { - this(wControl, ureq, limitTypes, null, commandLabel, true, true, false, false, Can.referenceable); + this(wControl, ureq, limitTypes, null, commandLabel, true, true, false, false, false, Can.referenceable); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel, - boolean canImport, boolean canCreate, boolean multiSelect, boolean adminSearch) { - this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, multiSelect, adminSearch, Can.referenceable); + boolean canImport, boolean canCreate, boolean multiSelect, boolean organisationWildCard, boolean adminSearch) { + this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, multiSelect, organisationWildCard, adminSearch, Can.referenceable); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, RepositoryEntryFilter filter, String commandLabel, - boolean canImport, boolean canCreate, boolean multiSelect, boolean adminSearch, + boolean canImport, boolean canCreate, boolean multiSelect, boolean organisationWildCard, boolean adminSearch, Can canBe) { super(ureq, wControl); @@ -139,7 +139,8 @@ public class ReferencableEntriesSearchController extends BasicController { } // add repo search controller - searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, multiSelect, limitTypes, filter); + searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), + false, multiSelect, limitTypes, organisationWildCard, filter); listenTo(searchCtr); // do instantiate buttons @@ -296,10 +297,10 @@ public class ReferencableEntriesSearchController extends BasicController { } else if (clickedLink == allEntriesLink){ switch(canBe) { case referenceable: - searchCtr.doSearchForReferencableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles()); + searchCtr.doSearchForReferencableResourcesLimitType(getIdentity(), limitTypes, ureq.getUserSession().getRoles()); break; case copyable: - searchCtr.doSearchForCopyableResourcesLimitType(ureq.getIdentity(), limitTypes, ureq.getUserSession().getRoles()); + searchCtr.doSearchForCopyableResourcesLimitType(getIdentity(), limitTypes, ureq.getUserSession().getRoles()); break; case all: searchCtr.doSearchByTypeLimitAccess(limitTypes, ureq); diff --git a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java index 55d9e746fb9..0dacad7dcc4 100644 --- a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java +++ b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java @@ -101,7 +101,8 @@ public class RepositorySearchController extends BasicController implements Activ private Can enableSearchforAllInSearchForm; private SearchType searchType; private final Roles identityRoles; - private RepositoryEntryFilter filter; + private final RepositoryEntryFilter filter; + private final boolean organisationWildCard; @Autowired private RepositoryManager repositoryManager; @@ -109,10 +110,11 @@ public class RepositorySearchController extends BasicController implements Activ private RepositoryService repositoryService; public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl, - boolean withCancel, boolean multiSelect, String[] limitTypes, RepositoryEntryFilter filter) { + boolean withCancel, boolean multiSelect, String[] limitTypes, boolean organisationWildCard, RepositoryEntryFilter filter) { super(ureq, myWControl, Util.createPackageTranslator(RepositoryService.class, ureq.getLocale())); this.filter = filter; + this.organisationWildCard = organisationWildCard; identityRoles = ureq.getUserSession().getRoles(); vc = createVelocityContainer("reposearch", "search"); @@ -246,8 +248,9 @@ public class RepositorySearchController extends BasicController implements Activ String name = searchForm.getDisplayName(); String author = searchForm.getAuthor(); String desc = searchForm.getDescription(); - List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(getIdentity(), identityRoles, restrictedTypes, name, author, desc, - enableSearchforAllInSearchForm == Can.referenceable, enableSearchforAllInSearchForm == Can.copyable); + List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(getIdentity(), + identityRoles,organisationWildCard, restrictedTypes, name, author, desc, + enableSearchforAllInSearchForm == Can.referenceable, enableSearchforAllInSearchForm == Can.copyable); filterRepositoryEntries(entries); repoTableModel.setObjects(entries); if(updateFilters) { @@ -257,20 +260,6 @@ public class RepositorySearchController extends BasicController implements Activ displaySearchResults(ureq); } - - /** - * Do search for all resources that the user can reference either because he - * is the owner of the resource or because he has author rights and the resource - * is set to at least BA in the BARG settings and the resource has the flag - * 'canReference' set to true. - * @param owner The current identity - * @param limitType The search limitation a specific type - * @param roles The users roles - */ - public void doSearchForReferencableResourcesLimitType(Identity owner, String limitType, Roles roles) { - doSearchForReferencableResourcesLimitType(owner, limitType.equals("") ? null : new String[] { limitType }, roles); - } - /** * Do search for all resources that the user can reference either because he * is the owner of the resource or because he has author rights and the resource @@ -287,7 +276,9 @@ public class RepositorySearchController extends BasicController implements Activ } else { restrictedTypes.addAll(Arrays.asList(limitTypes)); } - List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, restrictedTypes, null, null, null, true, false); + + List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, organisationWildCard, + restrictedTypes, null, null, null, true, false); filterRepositoryEntries(entries); repoTableModel.setObjects(entries); tableCtr.setFilters(null, null); @@ -311,7 +302,8 @@ public class RepositorySearchController extends BasicController implements Activ } else { restrictedTypes.addAll(Arrays.asList(limitTypes)); } - List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, restrictedTypes, null, null, null, false, true); + List<RepositoryEntry> entries = repositoryManager.queryResourcesLimitType(owner, roles, organisationWildCard, + restrictedTypes, null, null, null, false, true); filterRepositoryEntries(entries); repoTableModel.setObjects(entries); tableCtr.setFilters(null, null); diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java index ecdac318ca4..dfa13618bd3 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java @@ -50,7 +50,6 @@ import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.LockResult; -import org.olat.course.assessment.AssessmentMode; import org.olat.course.assessment.manager.UserCourseInformationsManager; import org.olat.fileresource.FileResourceManager; import org.olat.fileresource.types.AnimationFileResource; @@ -68,7 +67,6 @@ import org.olat.repository.RepositoryEntryStatusEnum; import org.olat.repository.RepositoryService; import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.repository.ui.RepositoryEntryRuntimeController; -import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator; import org.olat.repository.ui.WebDocumentRunController; import org.olat.resource.OLATResource; import org.olat.resource.OLATResourceManager; @@ -252,14 +250,10 @@ public class WebDocumentHandler extends FileHandler { @Override public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) { - return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, new RuntimeControllerCreator() { - @Override - public Controller create(UserRequest uureq, WindowControl wwControl, TooledStackedPanel toolbarPanel, - RepositoryEntry entry, RepositoryEntrySecurity rereSecurity, AssessmentMode assessmentMode) { - CoreSpringFactory.getImpl(UserCourseInformationsManager.class) - .updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity()); - return new WebDocumentRunController(uureq, wwControl, entry, reSecurity); - } + return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, (uureq, wwControl, toolbarPanel, entry, rereSecurity, assessmentMode) -> { + CoreSpringFactory.getImpl(UserCourseInformationsManager.class) + .updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity()); + return new WebDocumentRunController(uureq, wwControl, entry); }); } diff --git a/src/main/java/org/olat/repository/ui/RepositoryTableModel.java b/src/main/java/org/olat/repository/ui/RepositoryTableModel.java index f63f2766a78..d657953a209 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryTableModel.java +++ b/src/main/java/org/olat/repository/ui/RepositoryTableModel.java @@ -69,7 +69,7 @@ import org.olat.user.UserManager; * */ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry> { - + /** * Identifies a table selection event (outer-left column) */ @@ -287,12 +287,7 @@ public class RepositoryTableModel extends DefaultTableDataModel<RepositoryEntry> case repoEntry: return re; case displayname: return getDisplayName(re, translator.getLocale()); case author: return getFullname(re.getInitialAuthor()); - case access: { - // delegate to specific access renderer - StringOutput sb = new StringOutput(32); - accessRenderer.render(sb, re.getEntryStatus()); - return sb.toString(); - } + case access: return accessRenderer.renderEntryStatus(re); case creationDate: return re.getCreationDate(); case lastUsage: return re.getStatistics().getLastUsage(); case externalId: return re.getExternalId(); diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java index 17bc1fc539a..516853bfea3 100644 --- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -52,7 +52,6 @@ import org.olat.core.util.vfs.VFSMediaResource; import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.fileresource.FileResourceManager; import org.olat.repository.RepositoryEntry; -import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.resource.OLATResource; import org.springframework.beans.factory.annotation.Autowired; @@ -69,8 +68,7 @@ public class WebDocumentRunController extends BasicController { @Autowired private MovieService movieService; - public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, - RepositoryEntrySecurity reSecurity) { + public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) { super(ureq, wControl); VelocityContainer mainVC = createVelocityContainer("web_content"); diff --git a/src/main/java/org/olat/repository/ui/author/AccessRenderer.java b/src/main/java/org/olat/repository/ui/author/AccessRenderer.java index 5006b97d1ff..94b1fb085c3 100644 --- a/src/main/java/org/olat/repository/ui/author/AccessRenderer.java +++ b/src/main/java/org/olat/repository/ui/author/AccessRenderer.java @@ -19,8 +19,10 @@ */ package org.olat.repository.ui.author; +import java.io.IOException; import java.util.Locale; +import org.apache.logging.log4j.Logger; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; import org.olat.core.gui.components.table.CustomCellRenderer; @@ -28,6 +30,7 @@ import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; +import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.repository.RepositoryEntry; @@ -42,6 +45,8 @@ import org.olat.repository.RepositoryService; * */ public class AccessRenderer implements FlexiCellRenderer, CustomCellRenderer { + + private static final Logger log = Tracing.createLoggerFor(AccessRenderer.class); private final Translator translator; @@ -69,6 +74,16 @@ public class AccessRenderer implements FlexiCellRenderer, CustomCellRenderer { // use the FlexiCellRenderer method render(renderer, sb, val, -1, null, null, null); } + + public String renderEntryStatus(RepositoryEntry re) { + try(StringOutput sb = new StringOutput(32)) { + render(sb, re.getEntryStatus()); + return sb.toString(); + } catch(IOException e) { + log.error("",e); + return ""; + } + } public void render(StringOutput sb, RepositoryEntryStatusEnum status) { sb.append("<span class='o_labeled_light o_repo_status_").append(status.name()) diff --git a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java index 20fc71ec6a6..dcbcae9eae6 100644 --- a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java +++ b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java @@ -680,7 +680,7 @@ public class CatalogNodeManagerController extends FormBasicController implements removeAsListenerAndDispose(entrySearchCtrl); removeAsListenerAndDispose(cmc); - entrySearchCtrl = new RepositorySearchController(translate("choose"), ureq, getWindowControl(), true, false, new String[0], null); + entrySearchCtrl = new RepositorySearchController(translate("choose"), ureq, getWindowControl(), true, false, new String[0], false, null); listenTo(entrySearchCtrl); // OLAT-Admin has search form if (isAdministrator) { diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade.java b/src/main/java/org/olat/upgrade/OLATUpgrade.java index 4d3ed47a438..feff8cc92a8 100644 --- a/src/main/java/org/olat/upgrade/OLATUpgrade.java +++ b/src/main/java/org/olat/upgrade/OLATUpgrade.java @@ -27,8 +27,6 @@ package org.olat.upgrade; import javax.sql.DataSource; -import org.apache.logging.log4j.Logger; -import org.olat.core.logging.Tracing; import org.springframework.jdbc.core.JdbcTemplate; @@ -45,7 +43,6 @@ public abstract class OLATUpgrade { static final String TASK_DP_UPGRADE = "Database update"; private String alterDbFilename; - private static final Logger log = Tracing.createLoggerFor(OLATUpgrade.class); /** * @return String representing the unique version identifyer of this upgrade diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java index d46652890bd..ffc1b5ddff6 100644 --- a/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java +++ b/src/main/java/org/olat/upgrade/OLATUpgrade_13_3_0.java @@ -24,14 +24,25 @@ import java.io.FilenameFilter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.List; import org.apache.logging.log4j.Logger; +import org.olat.basesecurity.Group; +import org.olat.basesecurity.manager.GroupDAO; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.services.vfs.VFSRepositoryModule; import org.olat.core.commons.services.vfs.manager.VFSRepositoryServiceImpl; +import org.olat.core.id.Identity; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; +import org.olat.modules.curriculum.Curriculum; +import org.olat.modules.curriculum.CurriculumElement; +import org.olat.modules.curriculum.CurriculumElementStatus; +import org.olat.modules.curriculum.CurriculumRoles; +import org.olat.modules.curriculum.manager.CurriculumDAO; +import org.olat.modules.curriculum.manager.CurriculumElementDAO; +import org.olat.modules.curriculum.model.CurriculumImpl; import org.olat.modules.library.LibraryModule; import org.olat.properties.Property; import org.olat.properties.PropertyManager; @@ -53,10 +64,17 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade { private static final String MOVE_REPO_IMAGES = "MOVE REPO IMAGES"; private static final String MIGRATE_FILE_METADATA = "MIGRATE FILE METADATA"; private static final String MIGRATE_LIBRARY_CONFIGURATION = "MIGRATE LIBRARY CONFIGURATION"; + private static final String MIGRATE_CURRICULUM_ROLES = "MIGRATE CURRICULUM ROLES"; @Autowired private DB dbInstance; @Autowired + private GroupDAO groupDao; + @Autowired + private CurriculumDAO curriculumDao; + @Autowired + private CurriculumElementDAO curriculumElementDao; + @Autowired private LibraryModule libraryModule; @Autowired private VFSRepositoryModule vfsModule; @@ -91,6 +109,7 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade { allOk &= migrateLibrary(upgradeManager, uhd); allOk &= migrateRepositoryImages(upgradeManager, uhd); allOk &= migrateMetadata(upgradeManager, uhd);// need to be the last + allOk &= migrateCurriculumRoles(upgradeManager, uhd);// need to be the last uhd.setInstallationComplete(allOk); upgradeManager.setUpgradesHistory(uhd, VERSION); @@ -110,6 +129,56 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade { return super.doNewSystemInit(); } + private boolean migrateCurriculumRoles(UpgradeManager upgradeManager, UpgradeHistoryData uhd) { + boolean allOk = true; + if (!uhd.getBooleanDataValue(MIGRATE_CURRICULUM_ROLES)) { + try { + migrateCurriculumsRoles(); + } catch (Exception e) { + log.error("", e); + allOk = false; + } + + uhd.setBooleanDataValue(MIGRATE_CURRICULUM_ROLES, allOk); + upgradeManager.setUpgradesHistory(uhd, VERSION); + } + return allOk; + } + + private void migrateCurriculumsRoles() { + List<Curriculum> curriculums = curriculumDao.loadAllCurriculums(); + for(Curriculum curriculum:curriculums) { + Group group = ((CurriculumImpl)curriculum).getGroup(); + List<Identity> managers = groupDao.getMembers(group, CurriculumRoles.curriculummanager.name()); + for(Identity manager:managers) { + groupDao.removeMembership(group, manager, CurriculumRoles.curriculummanager.name()); + groupDao.addMembershipOneWay(group, manager, CurriculumRoles.curriculumowner.name()); + } + dbInstance.commitAndCloseSession(); + migrateCurriculumElementsRoles(curriculum); + dbInstance.commitAndCloseSession(); + } + } + + private void migrateCurriculumElementsRoles(Curriculum curriculum) { + List<CurriculumElement> elements = curriculumElementDao.loadElements(curriculum, CurriculumElementStatus.values()); + for(CurriculumElement element:elements) { + Group group = element.getGroup(); + List<Identity> managers = groupDao.getMembers(group, CurriculumRoles.curriculummanager.name()); + for(Identity manager:managers) { + groupDao.removeMembership(group, manager, CurriculumRoles.curriculummanager.name()); + groupDao.addMembershipOneWay(group, manager, CurriculumRoles.curriculumowner.name()); + } + + List<Identity> owners = groupDao.getMembers(group, CurriculumRoles.curriculumowner.name()); + for(Identity owner:owners) { + groupDao.removeMembership(group, owner, CurriculumRoles.curriculumelementowner.name()); + groupDao.addMembershipOneWay(group, owner, CurriculumRoles.curriculumelementowner.name()); + } + dbInstance.commitAndCloseSession(); + } + } + private boolean migrateLibrary(UpgradeManager upgradeManager, UpgradeHistoryData uhd) { boolean allOk = true; if (!uhd.getBooleanDataValue(MIGRATE_LIBRARY_CONFIGURATION)) { @@ -148,16 +217,18 @@ public class OLATUpgrade_13_3_0 extends OLATUpgrade { File repositoryHome = new File(FolderConfig.getCanonicalRepositoryHome()); File[] images = repositoryHome.listFiles(new ImageFilter()); - for(File image:images) { - String name = image.getName(); - int index = name.lastIndexOf('.'); - String resourceId = name.substring(0, index); - if(StringHelper.isLong(resourceId)) { - migrateRepositoryImage(image, Long.valueOf(resourceId)); - } - if(counter++ % 50 == 0) { - log.info("Images of lear resources moved: " + counter); - dbInstance.commitAndCloseSession(); + if(images != null && images.length > 0) { + for(File image:images) { + String name = image.getName(); + int index = name.lastIndexOf('.'); + String resourceId = name.substring(0, index); + if(StringHelper.isLong(resourceId)) { + migrateRepositoryImage(image, Long.valueOf(resourceId)); + } + if(counter++ % 50 == 0) { + log.info("Images of lear resources moved: " + counter); + dbInstance.commitAndCloseSession(); + } } } } catch (Exception e) { diff --git a/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java b/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java index 842902daf50..fb1083ff5bc 100644 --- a/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java +++ b/src/main/java/org/olat/user/ui/organisation/OrganisationResourceListController.java @@ -220,7 +220,7 @@ public class OrganisationResourceListController extends FormBasicController impl repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() }, null, - translate("add.resources"), false, false, true, true, Can.referenceable); + translate("add.resources"), false, false, true, false, true, Can.referenceable); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("add.resources")); diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java index 494c2d637b8..20762c4bb84 100644 --- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java +++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java @@ -187,7 +187,7 @@ public class CurriculumDAOTest extends OlatTestCase { // search curriculum for the manager CurriculumSearchParameters managerParams = new CurriculumSearchParameters(); - managerParams.setManagerIdentity(manager); + managerParams.setCurriculumAdmin(manager); List<Curriculum> managedCurriculums = curriculumDao.search(managerParams); Assert.assertEquals(1, managedCurriculums.size()); Assert.assertEquals(curriculum, managedCurriculums.get(0)); @@ -195,7 +195,7 @@ public class CurriculumDAOTest extends OlatTestCase { // search curriculum for the user CurriculumSearchParameters userParams = new CurriculumSearchParameters(); - userParams.setManagerIdentity(user); + userParams.setCurriculumAdmin(user); List<Curriculum> userCurriculums = curriculumDao.search(userParams); Assert.assertTrue(userCurriculums.isEmpty()); } @@ -211,20 +211,20 @@ public class CurriculumDAOTest extends OlatTestCase { // search curriculum for the manager CurriculumSearchParameters managerParams = new CurriculumSearchParameters(); - managerParams.setManagerIdentity(manager); + managerParams.setCurriculumAdmin(manager); List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams); Assert.assertEquals(1, managedCurriculums.size()); Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum()); // search curriculum for the user CurriculumSearchParameters userParams = new CurriculumSearchParameters(); - userParams.setManagerIdentity(user); + userParams.setCurriculumAdmin(user); List<CurriculumInfos> userCurriculums = curriculumDao.searchWithInfos(userParams); Assert.assertTrue(userCurriculums.isEmpty()); } @Test - public void searchWithInfos_owner() { + public void searchWithInfos_repoOwner() { Identity user = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-user-1"); Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1"); Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-course-owner-1"); @@ -238,20 +238,42 @@ public class CurriculumDAOTest extends OlatTestCase { curriculumService.addMember(curriculum, user, CurriculumRoles.participant); dbInstance.commitAndCloseSession(); - // search curriculum for the manager + // search curriculum for the owner of a repository entry in curriculum CurriculumSearchParameters managerParams = new CurriculumSearchParameters(); - managerParams.setOwnerIdentity(owner); + managerParams.setElementOwner(owner); List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams); Assert.assertEquals(1, managedCurriculums.size()); Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum()); // search curriculum for the user CurriculumSearchParameters userParams = new CurriculumSearchParameters(); - userParams.setOwnerIdentity(user); + userParams.setCurriculumAdmin(user); List<CurriculumInfos> userCurriculums = curriculumDao.searchWithInfos(userParams); Assert.assertTrue(userCurriculums.isEmpty()); } + @Test + public void searchWithInfos_elementOwner() { + Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1"); + Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-course-owner-1"); + Curriculum curriculum = curriculumDao.createAndPersist("Curriculum for owners", "Owners", "Short desc.", null); + CurriculumElement element = curriculumService.createCurriculumElement("Element-1", "1. Element", CurriculumElementStatus.active, + new Date(), new Date(), null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(owner); + curriculumService.addRepositoryEntry(element, entry, true); + dbInstance.commit(); + curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, owner, CurriculumRoles.curriculumelementowner); + dbInstance.commitAndCloseSession(); + + // search curriculum for the owner of a part of the curriculum + CurriculumSearchParameters managerParams = new CurriculumSearchParameters(); + managerParams.setElementOwner(owner); + List<CurriculumInfos> managedCurriculums = curriculumDao.searchWithInfos(managerParams); + Assert.assertEquals(1, managedCurriculums.size()); + Assert.assertEquals(curriculum, managedCurriculums.get(0).getCurriculum()); + } + @Test public void getMembersIdentity() { // add a curriculum manager @@ -319,7 +341,7 @@ public class CurriculumDAOTest extends OlatTestCase { dbInstance.commit(); // is owner within a curriculum - boolean isOwner = curriculumDao.hasOwnerRoleInCurriculum(owner); + boolean isOwner = curriculumDao.hasOwnerRoleInCurriculumElement(owner); Assert.assertTrue(isOwner); } diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java index 122907d38a6..d9bdf53ad8d 100644 --- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java +++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java @@ -781,7 +781,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null); CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", CurriculumElementStatus.active, null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); - curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner); dbInstance.commitAndCloseSession(); List<CurriculumElementMembership> members = curriculumElementDao.getMembershipInfos(null, Collections.singletonList(element), supervisor); @@ -789,7 +789,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { Assert.assertEquals(1, members.size()); Assert.assertEquals(supervisor.getKey(), members.get(0).getIdentityKey()); Assert.assertEquals(element.getKey(), members.get(0).getCurriculumElementKey()); - Assert.assertTrue(members.get(0).isCurriculumManager()); + Assert.assertTrue(members.get(0).isCurriculumElementOwner()); Assert.assertFalse(members.get(0).isRepositoryEntryOwner()); Assert.assertFalse(members.get(0).isCoach()); Assert.assertFalse(members.get(0).isParticipant()); @@ -801,7 +801,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-5", "Curriculum for element", "Curriculum", null); CurriculumElement element = curriculumService.createCurriculumElement("Element-5", "5. Element", CurriculumElementStatus.active, null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); - curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner); dbInstance.commitAndCloseSession(); List<CurriculumRef> curriculumList = Collections.singletonList(curriculum); @@ -810,7 +810,7 @@ public class CurriculumElementDAOTest extends OlatTestCase { Assert.assertEquals(1, members.size()); Assert.assertEquals(supervisor.getKey(), members.get(0).getIdentityKey()); Assert.assertEquals(element.getKey(), members.get(0).getCurriculumElementKey()); - Assert.assertTrue(members.get(0).isCurriculumManager()); + Assert.assertTrue(members.get(0).isCurriculumElementOwner()); Assert.assertFalse(members.get(0).isRepositoryEntryOwner()); Assert.assertFalse(members.get(0).isCoach()); Assert.assertFalse(members.get(0).isParticipant()); diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java index 70a16fb0a4e..8c6a95bf603 100644 --- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java +++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java @@ -59,7 +59,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase { Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1"); Curriculum curriculum = curriculumService.createCurriculum("CUR-1", "Curriculum 1", "Short desc.", null); dbInstance.commitAndCloseSession(); - curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager); + curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculumowner); dbInstance.commitAndCloseSession(); // get memberships @@ -67,7 +67,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase { List<CurriculumMember> members = memberQueries.getMembers(curriculum, params); Assert.assertNotNull(members); Assert.assertEquals(1, members.size()); - Assert.assertEquals(CurriculumRoles.curriculummanager.name(), members.get(0).getRole()); + Assert.assertEquals(CurriculumRoles.curriculumowner.name(), members.get(0).getRole()); Assert.assertEquals(manager, members.get(0).getIdentity()); } @@ -77,7 +77,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase { Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null); CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", CurriculumElementStatus.active, null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum); - curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, supervisor, CurriculumRoles.curriculumelementowner); dbInstance.commitAndCloseSession(); SearchMemberParameters params = new SearchMemberParameters(); @@ -86,7 +86,7 @@ public class CurriculumMemberQueriesTest extends OlatTestCase { Assert.assertEquals(1, members.size()); CurriculumMember member = members.get(0); Assert.assertEquals(supervisor, member.getIdentity()); - Assert.assertEquals(CurriculumRoles.curriculummanager.name(), member.getRole()); + Assert.assertEquals(CurriculumRoles.curriculumelementowner.name(), member.getRole()); } } diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java index ac100772a50..e6d3f2aae89 100644 --- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java +++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumServiceTest.java @@ -111,6 +111,6 @@ public class CurriculumServiceTest extends OlatTestCase { Assert.assertTrue(membership.isParticipant()); Assert.assertFalse(membership.isCoach()); Assert.assertFalse(membership.isRepositoryEntryOwner()); - Assert.assertFalse(membership.isCurriculumManager()); + Assert.assertFalse(membership.isCurriculumElementOwner()); } } diff --git a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java index e060123bd97..045dd97ecc5 100644 --- a/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java +++ b/src/test/java/org/olat/portfolio/manager/EPStructureManagerTest.java @@ -699,7 +699,7 @@ public class EPStructureManagerTest extends OlatTestCase { assertFalse(singleAuthor.contains(ident2));//owner securityGroupDao.getSecurityGroupsForIdentity(ident1); - repositoryManager.queryResourcesLimitType(ident1, Roles.userRoles(), null, null, null, null, true, false); + repositoryManager.queryResourcesLimitType(ident1, Roles.userRoles(), false, null, null, null, null, true, false); } diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java index f514b6d3a15..929b580ea1a 100644 --- a/src/test/java/org/olat/repository/RepositoryManagerTest.java +++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java @@ -662,7 +662,7 @@ public class RepositoryManagerTest extends OlatTestCase { List<String> resourceTypes = Collections.singletonList(re.getOlatResource().getResourceableTypeName()); List<RepositoryEntry> entries = repositoryManager - .queryResourcesLimitType(id, Roles.authorRoles(), resourceTypes, "re-member", "me", "no", true, true); + .queryResourcesLimitType(id, Roles.authorRoles(), false, resourceTypes, "re-member", "me", "no", true, true); Assert.assertNotNull(entries); } @@ -709,7 +709,7 @@ public class RepositoryManagerTest extends OlatTestCase { List<String> typelist = Collections.singletonList(resourceType); // finally the search query long startSearchReferencable = System.currentTimeMillis(); - List<RepositoryEntry> results = repositoryManager.queryResourcesLimitType(id1, id1Roles, typelist, null, null, null, true, false); + List<RepositoryEntry> results = repositoryManager.queryResourcesLimitType(id1, id1Roles, false, typelist, null, null, null, true, false); long endSearchReferencable = System.currentTimeMillis(); log.info("found " + results.size() + " repo entries " + (endSearchReferencable - startSearchReferencable) + "ms"); diff --git a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java index ac4f330618d..4771f4827a5 100644 --- a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java +++ b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java @@ -789,7 +789,7 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase { } @Test - public void getUsers_curriculumManagers() + public void getUsers_curriculumElementOwners() throws IOException, URISyntaxException { Identity member = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-6"); Organisation defOrganisation = organisationService.getDefaultOrganisation(); @@ -802,11 +802,12 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase { RestConnection conn = new RestConnection(); assertTrue(conn.login("administrator", "openolat")); - curriculumService.addMember(element, member, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, member, CurriculumRoles.curriculumelementowner); dbInstance.commitAndCloseSession(); URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString()) - .path("elements").path(element.getKey().toString()).path("users").queryParam("role", "curriculummanager").build(); + .path("elements").path(element.getKey().toString()).path("users") + .queryParam("role", "curriculumelementowner").build(); HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); @@ -879,7 +880,7 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase { } @Test - public void getCurriculumManagers() + public void getCurriculumOwners() throws IOException, URISyntaxException { Identity member = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-10"); Organisation defOrganisation = organisationService.getDefaultOrganisation(); @@ -892,11 +893,11 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase { RestConnection conn = new RestConnection(); assertTrue(conn.login("administrator", "openolat")); - curriculumService.addMember(element, member, CurriculumRoles.curriculummanager); + curriculumService.addMember(element, member, CurriculumRoles.curriculumelementowner); dbInstance.commitAndCloseSession(); URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString()) - .path("elements").path(element.getKey().toString()).path("curriculummanagers").build(); + .path("elements").path(element.getKey().toString()).path("curriculumelementowners").build(); HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); diff --git a/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java b/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java index 28b2f8724c9..f6c120bd61a 100644 --- a/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java +++ b/src/test/java/org/olat/restapi/CurriculumsWebServiceTest.java @@ -388,7 +388,7 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase { } @Test - public void getCurriculumManagers() + public void getCurriculumOwners() throws IOException, URISyntaxException { RestConnection conn = new RestConnection(); assertTrue(conn.login("administrator", "openolat")); @@ -398,11 +398,11 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase { Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation); dbInstance.commit(); - curriculumService.addMember(curriculum, member, CurriculumRoles.curriculummanager); + curriculumService.addMember(curriculum, member, CurriculumRoles.curriculumowner); dbInstance.commitAndCloseSession(); URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString()) - .path("curriculummanagers").build(); + .path("curriculumowners").build(); HttpGet method = conn.createGet(request, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); @@ -415,28 +415,28 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase { } @Test - public void addCurriculumManager() + public void addCurriculumOwner() throws IOException, URISyntaxException { RestConnection conn = new RestConnection(); assertTrue(conn.login("administrator", "openolat")); Organisation defOrganisation = organisationService.getDefaultOrganisation(); - Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-11"); + Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-11"); Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation); dbInstance.commit(); URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString()) - .path("curriculummanagers").path(manager.getKey().toString()).build(); + .path("curriculumowners").path(owner.getKey().toString()).build(); HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true); HttpResponse response = conn.execute(method); Assert.assertEquals(200, response.getStatusLine().getStatusCode()); EntityUtils.consume(response.getEntity()); - List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculummanager); + List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculumowner); Assert.assertNotNull(managers); Assert.assertEquals(1, managers.size()); - Assert.assertEquals(manager, managers.get(0)); + Assert.assertEquals(owner, managers.get(0)); } @Test @@ -445,26 +445,26 @@ public class CurriculumsWebServiceTest extends OlatJerseyTestCase { RestConnection conn = new RestConnection(); assertTrue(conn.login("administrator", "openolat")); - Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-23"); + Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-23"); Identity coach = JunitTestHelper.createAndPersistIdentityAsRndUser("element-member-24"); Organisation defOrganisation = organisationService.getDefaultOrganisation(); Curriculum curriculum = curriculumService.createCurriculum("REST-Curriculum-elements", "REST Curriculum", "A curriculum accessible by REST API for elemets", defOrganisation); dbInstance.commit(); - curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager); + curriculumService.addMember(curriculum, owner, CurriculumRoles.curriculumowner); curriculumService.addMember(curriculum, coach, CurriculumRoles.coach); dbInstance.commitAndCloseSession(); URI request = UriBuilder.fromUri(getContextURI()).path("curriculum").path(curriculum.getKey().toString()) - .path("curriculummanagers").path(manager.getKey().toString()).build(); + .path("curriculumowners").path(owner.getKey().toString()).build(); HttpDelete method = conn.createDelete(request, MediaType.APPLICATION_JSON); HttpResponse response = conn.execute(method); Assert.assertEquals(200, response.getStatusLine().getStatusCode()); EntityUtils.consume(response.getEntity()); - List<Identity> managers = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculummanager); - Assert.assertTrue(managers.isEmpty()); + List<Identity> owners = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.curriculumowner); + Assert.assertTrue(owners.isEmpty()); List<Identity> coaches = curriculumService.getMembersIdentity(curriculum, CurriculumRoles.coach); Assert.assertEquals(1, coaches.size()); } -- GitLab