From efd27f8481f3a6f05249d9d920cf5f032cbecbd8 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 12 Jul 2013 11:55:22 +0200 Subject: [PATCH] OO-623: implement managed group/course flags and test them in the GUI --- .../quota/GenericQuotaEditController.java | 10 +- .../quota/GenericQuotaViewController.java | 124 +++++++++++++++++ .../java/org/olat/admin/quota/QuotaForm.java | 13 +- .../olat/admin/quota/QuotaManagerImpl.java | 29 ++-- .../org/olat/admin/quota/QuotaTableModel.java | 8 +- .../org/olat/admin/quota/_content/edit.html | 4 +- .../olat/admin/user/UserAdminController.java | 18 +-- .../user/groups/GroupSearchController.java | 38 +++-- .../CalendarToolSettingsController.java | 11 +- .../CollaborationToolsFactory.java | 8 +- .../CollaborationToolsSettingsController.java | 29 +++- .../FolderToolSettingsController.java | 11 +- .../collaboration/NewsFormController.java | 15 +- .../collaboration/SimpleNewsController.java | 2 - .../org/olat/core/util/vfs/QuotaManager.java | 6 +- .../ui/CourseCalendarConfigController.java | 21 ++- .../ui/CourseChatSettingController.java | 7 +- .../config/ui/CourseChatSettingsForm.java | 15 +- .../ui/CourseConfigGlossaryController.java | 9 +- .../CourseEfficencyStatementController.java | 5 +- .../ui/CourseEfficencyStatementForm.java | 10 +- .../ui/CourseSharedFolderController.java | 46 +++--- .../config/ui/_content/CourseGlossary.html | 14 +- .../ui/_content/CourseSharedFolder.html | 2 +- .../CourseLayoutGeneratorController.java | 30 ++-- .../CourseBusinessGroupListController.java | 36 +++-- .../member/MembersOverviewController.java | 5 + .../member/RemoveActionColumnDescriptor.java | 78 +++++++++++ .../olat/course/run/RunMainController.java | 10 +- .../java/org/olat/group/BusinessGroup.java | 11 +- .../org/olat/group/BusinessGroupImpl.hbm.xml | 3 +- .../org/olat/group/BusinessGroupImpl.java | 21 ++- .../olat/group/BusinessGroupManagedFlag.java | 124 +++++++++++++++++ .../org/olat/group/BusinessGroupService.java | 3 +- .../org/olat/group/BusinessGroupShort.java | 2 + .../org/olat/group/BusinessGroupView.java | 24 +--- .../olat/group/manager/BusinessGroupDAO.java | 2 +- .../manager/BusinessGroupServiceImpl.java | 15 +- .../group/model/BusinessGroupShortImpl.java | 17 ++- .../group/model/BusinessGroupViewImpl.hbm.xml | 3 +- .../group/model/BusinessGroupViewImpl.java | 18 ++- .../group/ui/BusinessGroupFormController.java | 16 ++- .../BusinessGroupEditAccessController.java | 29 ++-- .../BusinessGroupEditResourceController.java | 24 +++- .../edit/BusinessGroupMembersController.java | 7 +- .../ui/edit/DisplayMemberSwitchForm.java | 10 ++ .../RemoveResourceActionColumnDescriptor.java | 78 +++++++++++ .../ui/edit/_i18n/LocalStrings_en.properties | 4 +- .../AbstractBusinessGroupListController.java | 32 ++++- .../ui/main/AbstractMemberListController.java | 46 +++++- .../org/olat/group/ui/main/BGTableItem.java | 13 ++ .../main/BusinessGroupTableModelWithType.java | 25 +++- .../ui/main/BusinessGroupViewFilter.java | 34 +++++ .../olat/group/ui/main/CourseMembership.java | 9 ++ .../ui/main/EditMembershipController.java | 11 +- .../group/ui/main/LeaveColumnDescriptor.java | 63 +++++++++ .../org/olat/group/ui/main/MemberView.java | 17 +++ .../main/SelectBusinessGroupController.java | 33 +++-- .../group/ui/main/UnmanagedGroupFilter.java | 44 ++++++ .../group/ui/wizard/BGCopyBusinessGroup.java | 6 + .../java/org/olat/repository/PropPupForm.java | 12 +- .../olat/repository/RepositoryEntry.hbm.xml | 2 +- .../org/olat/repository/RepositoryEntry.java | 15 +- .../RepositoryEntryManagedFlag.java | 131 ++++++++++++++++++ .../ReferencableEntriesSearchController.java | 15 +- .../RepositoryDetailsController.java | 10 +- .../RepositoryEditDescriptionController.java | 13 +- .../RepositoryEditPropertiesController.java | 28 ++-- .../controllers/RepositoryEntryFilter.java | 34 +++++ .../RepositoryMembersController.java | 8 +- .../RepositorySearchController.java | 39 ++++-- .../controllers/_content/all_member_list.html | 2 + .../ui/AccessConfigurationController.java | 39 ++++-- .../ui/_content/access_configuration.html | 2 + .../ui/_content/configuration_list.html | 2 +- .../repository/course/CoursesWebService.java | 2 +- .../olat/restapi/support/ObjectFactory.java | 6 +- .../database/mysql/alter_8_4_0_to_9_0_0.sql | 46 ++++++ .../database/mysql/setupDatabase.sql | 1 + .../database/oracle/alter_8_4_0_to_9_0_0.sql | 43 +++++- .../database/oracle/setupDatabase.sql | 1 + .../postgresql/alter_8_4_0_to_9_0_0.sql | 45 ++++++ .../database/postgresql/setupDatabase.sql | 1 + .../group/BusinessGroupManagedFlagsTest.java | 66 +++++++++ .../repository/RepositoryManagerTest.java | 2 +- .../olat/restapi/RepositoryEntriesTest.java | 2 +- .../java/org/olat/test/AllTestsJunit4.java | 1 + 87 files changed, 1634 insertions(+), 292 deletions(-) create mode 100644 src/main/java/org/olat/admin/quota/GenericQuotaViewController.java create mode 100644 src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java create mode 100644 src/main/java/org/olat/group/BusinessGroupManagedFlag.java create mode 100644 src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java create mode 100644 src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java create mode 100644 src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java create mode 100644 src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java create mode 100644 src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java create mode 100644 src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java create mode 100644 src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java index eecaebcfe1d..4e7bea196df 100644 --- a/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java +++ b/src/main/java/org/olat/admin/quota/GenericQuotaEditController.java @@ -83,11 +83,11 @@ public class GenericQuotaEditController extends BasicController { // check if quota foqf.cannot.del.defaultr this path already exists QuotaManager qm = QuotaManager.getInstance(); - this.currentQuota = qm.getCustomQuota(relPath); + currentQuota = qm.getCustomQuota(relPath); // init velocity context initMyContent(ureq); if (currentQuota == null) { - this.currentQuota = qm.createQuota(relPath, null, null); + currentQuota = qm.createQuota(relPath, null, null); myContent.contextPut("editQuota", Boolean.FALSE); } else { initQuotaForm(ureq, currentQuota); @@ -110,10 +110,10 @@ public class GenericQuotaEditController extends BasicController { // start with neq quota if quota is empty if (quota == null) { - this.currentQuota = QuotaManager.getInstance().createQuota(null, null, null); + currentQuota = QuotaManager.getInstance().createQuota(null, null, null); myContent.contextPut("isEmptyQuota", true); } else { - this.currentQuota = quota; + currentQuota = quota; } initQuotaForm(ureq, currentQuota); @@ -146,7 +146,7 @@ public class GenericQuotaEditController extends BasicController { if (quotaForm != null) { removeAsListenerAndDispose(quotaForm); } - quotaForm = new QuotaForm(ureq, getWindowControl(), quota); + quotaForm = new QuotaForm(ureq, getWindowControl(), quota, true); listenTo(quotaForm); myContent.put("quotaform", quotaForm.getInitialComponent()); myContent.contextPut("editQuota", Boolean.TRUE); diff --git a/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java b/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java new file mode 100644 index 00000000000..900fd214b77 --- /dev/null +++ b/src/main/java/org/olat/admin/quota/GenericQuotaViewController.java @@ -0,0 +1,124 @@ +/** +* OLAT - Online Learning and Training<br> +* http://www.olat.org +* <p> +* Licensed under the Apache License, Version 2.0 (the "License"); <br> +* you may not use this file except in compliance with the License.<br> +* You may obtain a copy of the License at +* <p> +* http://www.apache.org/licenses/LICENSE-2.0 +* <p> +* Unless required by applicable law or agreed to in writing,<br> +* software distributed under the License is distributed on an "AS IS" BASIS, <br> +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> +* See the License for the specific language governing permissions and <br> +* limitations under the License. +* <p> +* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> +* University of Zurich, Switzerland. +* <hr> +* <a href="http://www.openolat.org"> +* OpenOLAT - Online Learning and Training</a><br> +* This file has been modified by the OpenOLAT community. Changes are licensed +* under the Apache 2.0 license as the original file. +*/ + +package org.olat.admin.quota; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.velocity.VelocityContainer; +import org.olat.core.gui.control.Event; +import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.logging.OLATSecurityException; +import org.olat.core.util.vfs.Quota; +import org.olat.core.util.vfs.QuotaManager; + +/** + * + * Initial date: 12.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class GenericQuotaViewController extends BasicController { + + private VelocityContainer myContent; + private QuotaForm quotaForm; + private boolean modalMode; + private Quota currentQuota; + + + /** + * Constructor for the generic quota edit controller used to change a quota anywhere in the + * system not using the generic quota management. Instead of using a quota the + * constructor takes the folder path for which the quota will be changed. + * <p> + * To create an instance of this controller, use QuotaManager's factory method + * @param ureq + * @param wControl + * @param quotaPath The path for which the quota should be edited + * @param modalMode true: window will push to fullscreen and pop itself when finished. false: normal + * controller mode, get initial component using getInitialComponent() + */ + GenericQuotaViewController(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) { + super(ureq, wControl); + this.modalMode = modalMode; + + // check if quota foqf.cannot.del.defaultr this path already exists + QuotaManager qm = QuotaManager.getInstance(); + currentQuota = qm.getCustomQuota(relPath); + // init velocity context + initMyContent(ureq); + if (currentQuota == null) { + currentQuota = qm.createQuota(relPath, null, null); + } else { + initQuotaForm(ureq, currentQuota); + } + myContent.contextPut("editQuota", Boolean.FALSE); + putInitialPanel(myContent); + } + + private void initMyContent(UserRequest ureq) { + QuotaManager qm = QuotaManager.getInstance(); + if (!qm.hasQuotaEditRights(ureq.getIdentity())) + throw new OLATSecurityException("Insufficient permissions to access QuotaController"); + + myContent = createVelocityContainer("edit"); + myContent.contextPut("modalMode", Boolean.valueOf(modalMode)); + + //TODO loop over QuotaManager.getDefaultQuotaIdentifyers instead + myContent.contextPut("users",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_USERS)); + myContent.contextPut("powerusers",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_POWER)); + myContent.contextPut("groups",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_GROUPS)); + myContent.contextPut("repository",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_REPO)); + myContent.contextPut("coursefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_COURSE)); + myContent.contextPut("nodefolder",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_NODES)); + myContent.contextPut("feeds",qm.getDefaultQuota(QuotaConstants.IDENTIFIER_DEFAULT_FEEDS)); + + } + + private void initQuotaForm(UserRequest ureq, Quota quota) { + if (quotaForm != null) { + removeAsListenerAndDispose(quotaForm); + } + quotaForm = new QuotaForm(ureq, getWindowControl(), quota, false); + listenTo(quotaForm); + myContent.put("quotaform", quotaForm.getInitialComponent()); + myContent.contextPut("editQuota", Boolean.TRUE); + } + + /** + * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) + */ + public void event(UserRequest ureq, Component source, Event event) { + // + } + + /** + * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) + */ + protected void doDispose() { + // + } +} diff --git a/src/main/java/org/olat/admin/quota/QuotaForm.java b/src/main/java/org/olat/admin/quota/QuotaForm.java index 0fede689afe..8d349e4f167 100644 --- a/src/main/java/org/olat/admin/quota/QuotaForm.java +++ b/src/main/java/org/olat/admin/quota/QuotaForm.java @@ -49,14 +49,16 @@ public class QuotaForm extends FormBasicController { private IntegerElement ulLimitKB; private Quota quota; + private final boolean editable; /** * @param name component name of form * @param quota the quota used to initialize the form or null if empty form is used */ - public QuotaForm(UserRequest ureq, WindowControl wControl, Quota quota) { + public QuotaForm(UserRequest ureq, WindowControl wControl, Quota quota, boolean editable) { super(ureq, wControl); this.quota = quota; + this.editable = editable; initForm(ureq); } @@ -88,12 +90,10 @@ public class QuotaForm extends FormBasicController { @Override protected boolean validateFormLogic (UserRequest ureq) { - if (!QuotaManager.getInstance().isValidQuotaPath(path.getValue())) { path.setErrorKey("qf.error.path.invalid", null); return false; } - return true; } @@ -108,6 +108,7 @@ public class QuotaForm extends FormBasicController { path.setNotEmptyCheck("qf.error.path.invalid"); path.setMandatory(true); } + path.setEnabled(editable); if (quota != null && quota.getQuotaKB() != null) { quotaKB = uifactory.addIntegerElement("qf_quota", "qf.quota", quota.getQuotaKB().intValue(), formLayout); @@ -115,6 +116,7 @@ public class QuotaForm extends FormBasicController { quotaKB = uifactory.addIntegerElement("qf_quota", "qf.quota",(int)FolderConfig.getDefaultQuotaKB() , formLayout); } quotaKB.setMandatory(true); + quotaKB.setEnabled(editable); if (quota != null && quota.getUlLimitKB() != null) { ulLimitKB = uifactory.addIntegerElement("qf_limit", "qf.limit", quota.getUlLimitKB().intValue(), formLayout); @@ -122,8 +124,11 @@ public class QuotaForm extends FormBasicController { ulLimitKB = uifactory.addIntegerElement("qf_limit", "qf.limit",(int)FolderConfig.getLimitULKB() , formLayout); } ulLimitKB.setMandatory(true); + ulLimitKB.setEnabled(editable); - uifactory.addFormSubmitButton("submit", formLayout); + if(editable) { + uifactory.addFormSubmitButton("submit", formLayout); + } } @Override diff --git a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java index 03147b8d6ca..70a775a9d77 100644 --- a/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java +++ b/src/main/java/org/olat/admin/quota/QuotaManagerImpl.java @@ -43,6 +43,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Identity; import org.olat.core.logging.OLATRuntimeException; +import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.Quota; @@ -64,6 +65,7 @@ import org.olat.resource.OLATResourceManager; * @author Florian Gnaegi, frentix GmbH, http://www.frentix.com */ public class QuotaManagerImpl extends QuotaManager { + private static final OLog log = Tracing.createLoggerFor(QuotaManagerImpl.class); private static final String QUOTA_CATEGORY = "quot"; private OLATResource quotaResource; @@ -95,7 +97,7 @@ public class QuotaManagerImpl extends QuotaManager { quotaResource = resourceManager.findOrPersistResourceable(OresHelper.lookupType(Quota.class)); initDefaultQuotas(); // initialize default quotas DBFactory.getInstance(false).intermediateCommit(); - Tracing.logInfo("Successfully initialized Quota Manager", QuotaManagerImpl.class); + log.info("Successfully initialized Quota Manager"); } private void initDefaultQuotas() { @@ -137,7 +139,8 @@ public class QuotaManagerImpl extends QuotaManager { * Get the identifyers for the default quotas * @return */ - public Set getDefaultQuotaIdentifyers() { + @Override + public Set<String> getDefaultQuotaIdentifyers() { if (defaultQuotas == null) { throw new OLATRuntimeException(QuotaManagerImpl.class, "Quota manager has not been initialized properly! Must call init() first.", null); } @@ -239,16 +242,17 @@ public class QuotaManagerImpl extends QuotaManager { * * @return list of quotas. */ - public List listCustomQuotasKB() { + @Override + public List<Quota> listCustomQuotasKB() { if (defaultQuotas == null) { throw new OLATRuntimeException(QuotaManagerImpl.class, "Quota manager has not been initialized properly! Must call init() first.", null); } - List results = new ArrayList(); + List<Quota> results = new ArrayList<Quota>(); PropertyManager pm = PropertyManager.getInstance(); - List props = pm.listProperties(null, null, quotaResource, QUOTA_CATEGORY, null); + List<Property> props = pm.listProperties(null, null, quotaResource, QUOTA_CATEGORY, null); if (props == null || props.size() == 0) return results; - for (Iterator iter = props.iterator(); iter.hasNext();) { - Property prop = (Property) iter.next(); + for (Iterator<Property> iter = props.iterator(); iter.hasNext();) { + Property prop = iter.next(); results.add(parseQuota(prop)); } return results; @@ -388,6 +392,7 @@ public class QuotaManagerImpl extends QuotaManager { * @param path * @return */ + @Override public boolean isValidQuotaPath(String path) { if (path.startsWith(QuotaConstants.IDENTIFIER_DEFAULT) && !defaultQuotas.containsKey(path)) { return false; @@ -399,9 +404,15 @@ public class QuotaManagerImpl extends QuotaManager { /** * @see org.olat.core.util.vfs.QuotaManager#getQuotaEditorInstance(org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, java.lang.String, boolean) */ + @Override public Controller getQuotaEditorInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) { - Controller ctr = new GenericQuotaEditController(ureq, wControl, relPath, modalMode); - return ctr; + return new GenericQuotaEditController(ureq, wControl, relPath, modalMode); + } + + + @Override + public Controller getQuotaViewInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode) { + return new GenericQuotaViewController(ureq, wControl, relPath, modalMode); } @Override diff --git a/src/main/java/org/olat/admin/quota/QuotaTableModel.java b/src/main/java/org/olat/admin/quota/QuotaTableModel.java index 9d55eb08d5a..8db917db57d 100644 --- a/src/main/java/org/olat/admin/quota/QuotaTableModel.java +++ b/src/main/java/org/olat/admin/quota/QuotaTableModel.java @@ -36,9 +36,9 @@ import org.olat.core.util.vfs.QuotaManager; * Initial Date: Mar 30, 2004 * @author Mike Stock */ -public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements TableDataModel { +public class QuotaTableModel extends BaseTableDataModelWithoutFilter<Quota> implements TableDataModel<Quota> { - private List quotaList; + private List<Quota> quotaList; /** * @@ -60,7 +60,7 @@ public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements * @return Quota. */ public Quota getRowData(int row) { - return (Quota) quotaList.get(row); + return quotaList.get(row); } /** @@ -81,7 +81,7 @@ public class QuotaTableModel extends BaseTableDataModelWithoutFilter implements * @see org.olat.core.gui.components.table.TableDataModel#getValueAt(int, int) */ public Object getValueAt(int row, int col) { - Quota q = (Quota) quotaList.get(row); + Quota q = quotaList.get(row); switch (col) { case 0: return q.getPath(); diff --git a/src/main/java/org/olat/admin/quota/_content/edit.html b/src/main/java/org/olat/admin/quota/_content/edit.html index fef31f3ab0b..69bf9b43302 100644 --- a/src/main/java/org/olat/admin/quota/_content/edit.html +++ b/src/main/java/org/olat/admin/quota/_content/edit.html @@ -9,7 +9,9 @@ #else <fieldset class="b_clearfix"> <legend>$r.translate("qf.new")</legend> - <div class="b_float_right">$r.render("qf.new")</div> + #if($r.available("qf.new")) + <div class="b_float_right">$r.render("qf.new")</div> + #end $r.translate("qf.noquota") #if ($modalMode) diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java index ec97ce5046b..0a8a3bb432c 100644 --- a/src/main/java/org/olat/admin/user/UserAdminController.java +++ b/src/main/java/org/olat/admin/user/UserAdminController.java @@ -26,7 +26,6 @@ package org.olat.admin.user; import java.util.List; -import java.util.Locale; import org.olat.admin.policy.PolicyController; import org.olat.admin.user.groups.GroupOverviewController; @@ -36,7 +35,6 @@ import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.Constants; import org.olat.basesecurity.SecurityGroup; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; @@ -52,7 +50,6 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.Identity; -import org.olat.core.id.UserConstants; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.OLATSecurityException; @@ -109,9 +106,7 @@ public class UserAdminController extends BasicController implements Activateable private Link backLink; private ProfileAndHomePageEditController userProfileCtr; private GroupOverviewController grpCtr; - - private final boolean isAdministrativeUser; - private final BaseSecurityModule securityModule; + /** * Constructor that creates a back - link as default @@ -121,10 +116,7 @@ public class UserAdminController extends BasicController implements Activateable */ public UserAdminController(UserRequest ureq, WindowControl wControl, Identity identity) { super(ureq, wControl); - - securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class); - isAdministrativeUser = securityModule.isUserAllowedAdminProps(ureq.getUserSession().getRoles()); - + BaseSecurity mgr = BaseSecurityManager.getInstance(); if (!mgr.isIdentityPermittedOnResourceable( ureq.getIdentity(), @@ -143,11 +135,11 @@ public class UserAdminController extends BasicController implements Activateable setBackButtonEnabled(true); // default initTabbedPane(myIdentity, ureq); exposeUserDataToVC(ureq, myIdentity); - this.putInitialPanel(myContent); + putInitialPanel(myContent); } else { String supportAddr = WebappHelper.getMailConfig("mailSupport"); - this.showWarning(NLS_ERROR_NOACCESS_TO_USER, supportAddr); - this.putInitialPanel(new Panel("empty")); + showWarning(NLS_ERROR_NOACCESS_TO_USER, supportAddr); + putInitialPanel(new Panel("empty")); } } diff --git a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java index ca6ede70469..9e7796b9112 100644 --- a/src/main/java/org/olat/admin/user/groups/GroupSearchController.java +++ b/src/main/java/org/olat/admin/user/groups/GroupSearchController.java @@ -21,6 +21,7 @@ package org.olat.admin.user.groups; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import org.olat.core.CoreSpringFactory; @@ -52,6 +53,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupService; import org.olat.group.model.AddToGroupsEvent; import org.olat.group.model.BGRepositoryEntryRelation; @@ -60,7 +62,9 @@ import org.olat.group.ui.BusinessGroupTableModel; /** * Description:<br> - * Searches for groups from the whole system. + * Searches for groups from the whole system. The list of + * groups doesn't contain any managed groups with the flags + * "membermanagement" and higher. * * <P> * Initial Date: 11.04.2011 <br> @@ -183,18 +187,22 @@ public class GroupSearchController extends StepFormBasicController { SearchBusinessGroupParams param1s = new SearchBusinessGroupParams(); param1s.setNameOrDesc(searchValue); List<BusinessGroup> group1s = businessGroupService.findBusinessGroups(param1s, null, 0, -1); - + filterGroups(group1s); + SearchBusinessGroupParams param2s = new SearchBusinessGroupParams(); param2s.setCourseTitle(searchValue); List<BusinessGroup> group2s = businessGroupService.findBusinessGroups(param2s, null, 0, -1); - - List<Long> groupKeysWithRelations = PersistenceHelper.toKeys(group1s); - groupKeysWithRelations.addAll(PersistenceHelper.toKeys(group2s)); + filterGroups(group2s); + + List<BusinessGroup> groups = new ArrayList<BusinessGroup>(group1s.size() + group2s.size()); + groups.addAll(group1s); + groups.addAll(group2s); + + List<Long> groupKeysWithRelations = PersistenceHelper.toKeys(groups); List<BGRepositoryEntryRelation> resources = businessGroupService.findRelationToRepositoryEntries(groupKeysWithRelations, 0, -1); - List<GroupWrapper> groups = new ArrayList<GroupWrapper>(); - for(BusinessGroup group:group1s) { - + List<GroupWrapper> groupWrappers = new ArrayList<GroupWrapper>(); + for(BusinessGroup group:groups) { StringBuilder sb = new StringBuilder(); for(BGRepositoryEntryRelation resource:resources) { if(resource.getGroupKey().equals(group.getKey())) { @@ -206,14 +214,22 @@ public class GroupSearchController extends StepFormBasicController { GroupWrapper wrapper = new GroupWrapper(group, sb.toString()); wrapper.setTutor(createSelection("tutor_" + group.getKey())); wrapper.setParticipant(createSelection("participant_" + group.getKey())); - groups.add(wrapper); + groupWrappers.add(wrapper); } table.reset(); - tableDataModel.setObjects(groups); + tableDataModel.setObjects(groupWrappers); errorComp.clearError(); } - } + } + + private void filterGroups(List<BusinessGroup> groups) { + for(Iterator<BusinessGroup> groupIt=groups.iterator(); groupIt.hasNext(); ) { + if(BusinessGroupManagedFlag.isManaged(groupIt.next(), BusinessGroupManagedFlag.membersmanagement)) { + groupIt.remove(); + } + } + } private MultipleSelectionElement createSelection(String name) { MultipleSelectionElement selection = new MultipleSelectionElementImpl(name, MultipleSelectionElementImpl.createVerticalLayout("checkbox",1)); diff --git a/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java b/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java index 72e537726f7..ce4f5460805 100644 --- a/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java +++ b/src/main/java/org/olat/collaboration/CalendarToolSettingsController.java @@ -29,6 +29,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; @@ -39,6 +40,7 @@ import org.olat.core.gui.control.WindowControl; */ public class CalendarToolSettingsController extends FormBasicController { + private FormSubmit submit; private SingleSelection access; private final int calendarAccess; private final boolean canSave; @@ -91,7 +93,14 @@ public class CalendarToolSettingsController extends FormBasicController { else access.select("owner", true); if(canSave) { - uifactory.addFormSubmitButton("submit", formLayout); + submit = uifactory.addFormSubmitButton("submit", formLayout); + } + } + + public void setEnabled(boolean enabled) { + access.setEnabled(enabled); + if(submit != null) { + submit.setVisible(enabled); } } diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java index e45c33162b4..18e1ba86f9d 100644 --- a/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java +++ b/src/main/java/org/olat/collaboration/CollaborationToolsFactory.java @@ -45,9 +45,9 @@ import org.olat.group.BusinessGroup; * @author guido */ public class CollaborationToolsFactory { + private static final OLog log = Tracing.createLoggerFor(CollaborationToolsFactory.class); private static CollaborationToolsFactory instance; - CacheWrapper cache; - OLog log = Tracing.createLoggerFor(this.getClass()); + private CacheWrapper<String,CollaborationTools> cache; private CoordinatorManager coordinatorManager; /** @@ -84,7 +84,7 @@ public class CollaborationToolsFactory { if (cache == null) { cache = coordinatorManager.getCoordinator().getCacher().getCache(CollaborationToolsFactory.class.getSimpleName(), "tools"); } - CollaborationTools collabTools = (CollaborationTools) cache.get(cacheKey); + CollaborationTools collabTools = cache.get(cacheKey); if (collabTools != null) { if (log.isDebug()) log .debug("loading collabTool from cache. Ores: " + ores.getResourceableId()); @@ -116,7 +116,7 @@ public class CollaborationToolsFactory { */ public CollaborationTools getCollaborationToolsIfExists(OLATResourceable ores) { String cacheKey = Long.valueOf(ores.getResourceableId()).toString(); - return (CollaborationTools) cache.get(cacheKey); + return cache.get(cacheKey); } diff --git a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java index 5624a942851..1a8f7da9607 100644 --- a/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java +++ b/src/main/java/org/olat/collaboration/CollaborationToolsSettingsController.java @@ -47,6 +47,7 @@ import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.vfs.QuotaManager; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.instantMessaging.InstantMessagingModule; /** @@ -65,9 +66,10 @@ public class CollaborationToolsSettingsController extends BasicController { private CalendarToolSettingsController calendarForm; private FolderToolSettingsController folderForm; - boolean lastCalendarEnabledState; + private boolean lastCalendarEnabledState; private Controller quotaCtr; - private BusinessGroup businessGroup; + private final boolean managed; + private final BusinessGroup businessGroup; /** * @param ureq @@ -76,11 +78,13 @@ public class CollaborationToolsSettingsController extends BasicController { public CollaborationToolsSettingsController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) { super(ureq, wControl); this.businessGroup = businessGroup; + managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.tools); CollaborationTools collabTools = CollaborationToolsFactory.getInstance().getOrCreateCollaborationTools(businessGroup); vc_collabtools = createVelocityContainer ("collaborationtools"); cots = new ChoiceOfToolsForm (ureq, wControl, collabTools); + cots.setEnabled(!managed); listenTo(cots); vc_collabtools.put("choiceOfTools", cots.getInitialComponent()); @@ -92,7 +96,11 @@ public class CollaborationToolsSettingsController extends BasicController { if (ureq.getUserSession().getRoles().isOLATAdmin()) { vc_collabtools.contextPut("isOlatAdmin", Boolean.TRUE); - quotaCtr = QuotaManager.getInstance().getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false); + if(managed) { + quotaCtr = QuotaManager.getInstance().getQuotaViewInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false); + } else { + quotaCtr = QuotaManager.getInstance().getQuotaEditorInstance(ureq, getWindowControl(), collabTools.getFolderRelPath(), false); + } listenTo(quotaCtr); } else { vc_collabtools.contextPut("isOlatAdmin", Boolean.FALSE); @@ -106,6 +114,7 @@ public class CollaborationToolsSettingsController extends BasicController { Long lCalendarAccess = collabTools.lookupCalendarAccess(); if (lCalendarAccess != null) iCalendarAccess = lCalendarAccess.intValue(); calendarForm = new CalendarToolSettingsController(ureq, getWindowControl(), iCalendarAccess); + calendarForm.setEnabled(!managed); listenTo(calendarForm); vc_collabtools.put("calendarform", calendarForm.getInitialComponent()); @@ -128,6 +137,7 @@ public class CollaborationToolsSettingsController extends BasicController { Long lFolderAccess = collabTools.lookupFolderAccess(); int access = lFolderAccess == null ? CollaborationTools.FOLDER_ACCESS_ALL : lFolderAccess.intValue(); folderForm = new FolderToolSettingsController(ureq, getWindowControl(), access); + folderForm.setEnabled(!managed); listenTo(folderForm); vc_collabtools.put("folderform", folderForm.getInitialComponent()); } else { @@ -145,6 +155,7 @@ public class CollaborationToolsSettingsController extends BasicController { removeAsListenerAndDispose(newsController); } newsController = new NewsFormController(ureq, getWindowControl(), (newsValue == null ? "" : newsValue)); + newsController.setEnabled(!managed); listenTo(newsController); vc_collabtools.contextPut("newsToolEnabled", Boolean.TRUE); @@ -189,6 +200,7 @@ public class CollaborationToolsSettingsController extends BasicController { this.removeAsListenerAndDispose(calendarForm); } calendarForm = new CalendarToolSettingsController(ureq, getWindowControl(), iCalendarAccess); + calendarForm.setEnabled(!managed); listenTo(calendarForm); vc_collabtools.put("calendarform", calendarForm.getInitialComponent()); @@ -214,6 +226,7 @@ public class CollaborationToolsSettingsController extends BasicController { Long lFolderAccess = collabTools.lookupFolderAccess(); int access = lFolderAccess == null ? CollaborationTools.FOLDER_ACCESS_ALL : lFolderAccess.intValue(); folderForm = new FolderToolSettingsController(ureq, getWindowControl(), access); + folderForm.setEnabled(!managed); listenTo(folderForm); vc_collabtools.put("folderform", folderForm.getInitialComponent()); if (ureq.getUserSession().getRoles().isOLATAdmin()) { @@ -223,13 +236,13 @@ public class CollaborationToolsSettingsController extends BasicController { vc_collabtools.contextPut("folderToolEnabled", Boolean.FALSE); } - } else if (source == this.newsController) { + } else if (source == newsController) { if (event.equals(Event.DONE_EVENT)) { - String news = this.newsController.getNewsValue(); + String news = newsController.getNewsValue(); collabTools.saveNews(news); } - } else if (source == this.calendarForm) { + } else if (source == calendarForm) { collabTools.saveCalendarAccess(new Long(calendarForm.getCalendarAccess())); // notify calendar components to refresh their calendars CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf( @@ -279,6 +292,10 @@ class ChoiceOfToolsForm extends FormBasicController { initForm(ureq); } + + public void setEnabled(boolean enabled) { + ms.setEnabled(enabled); + } @Override protected void formOK(UserRequest ureq) { diff --git a/src/main/java/org/olat/collaboration/FolderToolSettingsController.java b/src/main/java/org/olat/collaboration/FolderToolSettingsController.java index dba2e87de04..02920684f3b 100644 --- a/src/main/java/org/olat/collaboration/FolderToolSettingsController.java +++ b/src/main/java/org/olat/collaboration/FolderToolSettingsController.java @@ -29,6 +29,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; @@ -39,6 +40,7 @@ import org.olat.core.gui.control.WindowControl; */ public class FolderToolSettingsController extends FormBasicController { + private FormSubmit submit; private SingleSelection folderAccessEl; private final int folderAccess; private final boolean canSave; @@ -78,7 +80,14 @@ public class FolderToolSettingsController extends FormBasicController { String selectedKey = (folderAccess == CollaborationTools.FOLDER_ACCESS_ALL) ? "all" : "owner"; folderAccessEl.select(selectedKey, true); if(canSave) { - uifactory.addFormSubmitButton("submit", formLayout); + submit = uifactory.addFormSubmitButton("submit", formLayout); + } + } + + public void setEnabled(boolean enabled) { + folderAccessEl.setEnabled(enabled); + if(submit != null) { + submit.setVisible(enabled); } } diff --git a/src/main/java/org/olat/collaboration/NewsFormController.java b/src/main/java/org/olat/collaboration/NewsFormController.java index 682bc473d24..fb7949b4cbc 100644 --- a/src/main/java/org/olat/collaboration/NewsFormController.java +++ b/src/main/java/org/olat/collaboration/NewsFormController.java @@ -24,6 +24,7 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.RichTextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; @@ -38,6 +39,7 @@ import org.olat.core.util.StringHelper; */ public class NewsFormController extends FormBasicController { + private FormSubmit submit; /** * The rich text element for the information text. */ @@ -92,12 +94,17 @@ public class NewsFormController extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormTitle("news.content"); - this.newsInputElement = uifactory.addRichTextElementForStringData("news.content", "news.content", this.news, 10, -1, false, false, null, + newsInputElement = uifactory.addRichTextElementForStringData("news.content", "news.content", this.news, 10, -1, false, false, null, null, formLayout, ureq.getUserSession(), getWindowControl()); - this.newsInputElement.setMandatory(true); + newsInputElement.setMandatory(true); // Create submit button - uifactory.addFormSubmitButton("submit", formLayout); + submit = uifactory.addFormSubmitButton("submit", formLayout); + } + + public void setEnabled(boolean enabled) { + newsInputElement.setEnabled(enabled); + submit.setVisible(enabled); } /** @@ -106,7 +113,7 @@ public class NewsFormController extends FormBasicController { * @return The information text. */ public String getNewsValue() { - return this.newsInputElement.getValue(); + return newsInputElement.getValue(); } /** diff --git a/src/main/java/org/olat/collaboration/SimpleNewsController.java b/src/main/java/org/olat/collaboration/SimpleNewsController.java index fb19c04aece..f8b0f3ac022 100644 --- a/src/main/java/org/olat/collaboration/SimpleNewsController.java +++ b/src/main/java/org/olat/collaboration/SimpleNewsController.java @@ -68,7 +68,6 @@ public class SimpleNewsController extends BasicController { * org.olat.core.gui.components.Component, * org.olat.core.gui.control.Event) */ - @SuppressWarnings("unused") public void event(UserRequest ureq, Component source, Event event) { // } @@ -77,7 +76,6 @@ public class SimpleNewsController extends BasicController { * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) */ - @SuppressWarnings("unused") public void event(UserRequest ureq, Controller source, Event event) { // } diff --git a/src/main/java/org/olat/core/util/vfs/QuotaManager.java b/src/main/java/org/olat/core/util/vfs/QuotaManager.java index a1e6467fd96..59661c6bf72 100644 --- a/src/main/java/org/olat/core/util/vfs/QuotaManager.java +++ b/src/main/java/org/olat/core/util/vfs/QuotaManager.java @@ -75,7 +75,7 @@ public abstract class QuotaManager extends BasicManager{ * Get the identifyers for the default quotas * @return */ - public abstract Set getDefaultQuotaIdentifyers(); + public abstract Set<String> getDefaultQuotaIdentifyers(); /** * Get the default quota for the given identifyer or NULL if no such quota @@ -115,7 +115,7 @@ public abstract class QuotaManager extends BasicManager{ * * @return list of quotas. */ - public abstract List listCustomQuotasKB(); + public abstract List<Quota> listCustomQuotasKB(); /** * call to get appropriate quota depending on role. Authors have normally @@ -168,6 +168,8 @@ public abstract class QuotaManager extends BasicManager{ */ public abstract Controller getQuotaEditorInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode); + public abstract Controller getQuotaViewInstance(UserRequest ureq, WindowControl wControl, String relPath, boolean modalMode); + /** * Check if a user has the rights to launch the quota editor tool * diff --git a/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java b/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java index 90a4f6f0e57..7b4b934d2e4 100644 --- a/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java +++ b/src/main/java/org/olat/course/config/ui/CourseCalendarConfigController.java @@ -60,12 +60,12 @@ public class CourseCalendarConfigController extends BasicController implements C * @param ureq * @param wControl */ - public CourseCalendarConfigController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) { + public CourseCalendarConfigController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) { super(ureq, wControl); this.courseConfig = courseConfig; myContent = createVelocityContainer("CourseCalendar"); - calConfigForm = new CourseCalendarConfigForm(ureq, wControl, courseConfig.isCalendarEnabled()); + calConfigForm = new CourseCalendarConfigForm(ureq, wControl, courseConfig.isCalendarEnabled(), editable); listenTo (calConfigForm); myContent.put("calendarForm", calConfigForm.getInitialComponent()); // @@ -96,27 +96,26 @@ public class CourseCalendarConfigController extends BasicController implements C } /** - * * @return Return the log message if any, else null. */ public ILoggingAction getLoggingAction() { return loggingAction; } - - } class CourseCalendarConfigForm extends FormBasicController { private SelectionElement isOn; private boolean calendarEnabled; + private final boolean editable; /** * @param name * @param chatEnabled */ - public CourseCalendarConfigForm(UserRequest ureq, WindowControl wControl, boolean calendarEnabled) { + public CourseCalendarConfigForm(UserRequest ureq, WindowControl wControl, boolean calendarEnabled, boolean editable) { super(ureq, wControl); + this.editable = editable; this.calendarEnabled = calendarEnabled; initForm (ureq); } @@ -135,17 +134,17 @@ class CourseCalendarConfigForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.calendar.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1); isOn.select("xx", calendarEnabled); + isOn.setEnabled(editable); - uifactory.addFormSubmitButton("save", "save", formLayout); - + if(editable) { + uifactory.addFormSubmitButton("save", "save", formLayout); + } } @Override protected void doDispose() { // } - -} +} \ No newline at end of file diff --git a/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java b/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java index 2a7f07a6af4..7ae2add9d10 100644 --- a/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java +++ b/src/main/java/org/olat/course/config/ui/CourseChatSettingController.java @@ -51,15 +51,15 @@ public class CourseChatSettingController extends BasicController implements Cont * @param ureq * @param wControl */ - public CourseChatSettingController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) { + public CourseChatSettingController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) { super(ureq, wControl); this.courseConfig = courseConfig; myContent = createVelocityContainer("CourseChat"); - chatForm = new CourseChatSettingsForm(ureq, wControl, courseConfig.isChatEnabled()); + chatForm = new CourseChatSettingsForm(ureq, wControl, courseConfig.isChatEnabled(), editable); listenTo (chatForm); myContent.put("chatForm", chatForm.getInitialComponent()); - // + putInitialPanel(myContent); } @@ -82,5 +82,4 @@ public class CourseChatSettingController extends BasicController implements Cont protected void doDispose() { // } - } \ No newline at end of file diff --git a/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java b/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java index 07b407c8ab6..b8968432e06 100644 --- a/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java +++ b/src/main/java/org/olat/course/config/ui/CourseChatSettingsForm.java @@ -43,14 +43,16 @@ import org.olat.core.gui.control.WindowControl; public class CourseChatSettingsForm extends FormBasicController { private SelectionElement isOn; - private boolean chatEnabled; + private final boolean chatEnabled; + private final boolean editable; /** * @param name * @param chatEnabled */ - public CourseChatSettingsForm(UserRequest ureq, WindowControl wControl, boolean chatEnabled) { + public CourseChatSettingsForm(UserRequest ureq, WindowControl wControl, boolean chatEnabled, boolean editable) { super(ureq, wControl); + this.editable = editable; this.chatEnabled = chatEnabled; initForm (ureq); } @@ -69,16 +71,17 @@ public class CourseChatSettingsForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.chat.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1); isOn.select("xx", chatEnabled); - - uifactory.addFormSubmitButton("save", "save", formLayout); + isOn.setEnabled(editable); + + if(editable) { + uifactory.addFormSubmitButton("save", "save", formLayout); + } } @Override protected void doDispose() { // } - } \ No newline at end of file diff --git a/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java b/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java index 0831c082de2..1e401a30d69 100644 --- a/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java +++ b/src/main/java/org/olat/course/config/ui/CourseConfigGlossaryController.java @@ -79,7 +79,8 @@ public class CourseConfigGlossaryController extends BasicController implements C * @param wControl * @param course */ - public CourseConfigGlossaryController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, Long courseResourceableId) { + public CourseConfigGlossaryController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, + Long courseResourceableId, boolean editable) { super(ureq, wControl); this.courseConfig = courseConfig; this.courseResourceableId = courseResourceableId; @@ -95,10 +96,12 @@ public class CourseConfigGlossaryController extends BasicController implements C log.warn("Course with ID::" + courseResourceableId + " had a config for a glossary softkey::" + courseConfig.getGlossarySoftKey() + " but no such glossary was found"); } else { - removeCommand = LinkFactory.createButton(COMMAND_REMOVE, myContent, this); + if(editable) { + removeCommand = LinkFactory.createButton(COMMAND_REMOVE, myContent, this); + } myContent.contextPut("repoEntry", repoEntry); } - } else { + } else if(editable) { addCommand = LinkFactory.createButton(COMMAND_ADD, myContent, this); } putInitialPanel(myContent); diff --git a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java index a07ee23520b..91bfca04732 100644 --- a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java +++ b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementController.java @@ -62,12 +62,13 @@ public class CourseEfficencyStatementController extends BasicController { * @param ureq * @param wControl */ - public CourseEfficencyStatementController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) { + public CourseEfficencyStatementController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) { super(ureq, wControl); this.courseConfig = courseConfig; // myContent = createVelocityContainer("CourseEfficencyStatement"); - efficencyForm = new CourseEfficencyStatementForm(ureq, wControl, courseConfig.isEfficencyStatementEnabled()); + efficencyForm = new CourseEfficencyStatementForm(ureq, wControl, + courseConfig.isEfficencyStatementEnabled(), editable); previousValue = courseConfig.isEfficencyStatementEnabled(); listenTo(efficencyForm); myContent.put("efficencyForm", efficencyForm.getInitialComponent()); diff --git a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java index 619a3c6861a..83bd8c67035 100644 --- a/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java +++ b/src/main/java/org/olat/course/config/ui/CourseEfficencyStatementForm.java @@ -42,14 +42,16 @@ public class CourseEfficencyStatementForm extends FormBasicController { private SelectionElement isOn; private boolean enabled; + private final boolean editable; /** * @param name * @param chatEnabled */ - public CourseEfficencyStatementForm(UserRequest ureq, WindowControl wControl, boolean enabled) { + public CourseEfficencyStatementForm(UserRequest ureq, WindowControl wControl, boolean enabled, boolean editable) { super(ureq, wControl); this.enabled = enabled; + this.editable = editable; initForm (ureq); } @@ -71,11 +73,13 @@ public class CourseEfficencyStatementForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - isOn = uifactory.addCheckboxesVertical("isOn", "chkbx.efficency.onoff", formLayout, new String[] {"xx"}, new String[] {""}, null, 1); isOn.select("xx", enabled); + isOn.setEnabled(editable); - uifactory.addFormSubmitButton("save", "save", formLayout); + if(editable) { + uifactory.addFormSubmitButton("save", "save", formLayout); + } } @Override diff --git a/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java b/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java index ef369bc8a33..b61a2da29c0 100644 --- a/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java +++ b/src/main/java/org/olat/course/config/ui/CourseSharedFolderController.java @@ -34,15 +34,12 @@ import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.ControllerEventListener; -import org.olat.core.gui.control.DefaultController; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; +import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; -import org.olat.core.gui.translator.PackageTranslator; import org.olat.core.logging.activity.ILoggingAction; import org.olat.core.logging.activity.LearningResourceLoggingAction; -import org.olat.core.util.Util; import org.olat.course.ICourse; import org.olat.course.config.CourseConfig; import org.olat.fileresource.types.SharedFolderFileResource; @@ -63,14 +60,10 @@ import org.olat.resource.references.ReferenceManager; * @version Initial Date: July 11, 2005 * @author Alexander Schneider */ -public class CourseSharedFolderController extends DefaultController implements ControllerEventListener { +public class CourseSharedFolderController extends BasicController { - private static final String PACKAGE = Util.getPackageName(CourseSharedFolderController.class); - private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(PACKAGE); private static final String SHAREDFOLDERREF = "sharedfolderref"; - //private ICourse course; - private PackageTranslator translator; private VelocityContainer myContent; private ReferencableEntriesSearchController searchController; @@ -91,22 +84,23 @@ public class CourseSharedFolderController extends DefaultController implements C * @param wControl * @param theCourse */ - public CourseSharedFolderController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig) { - super(wControl); + public CourseSharedFolderController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, boolean editable) { + super(ureq, wControl); this.courseConfig = courseConfig; - translator = new PackageTranslator(PACKAGE, ureq.getLocale()); - myContent = new VelocityContainer("courseSharedFolderTab", VELOCITY_ROOT + "/CourseSharedFolder.html", translator, this); - changeSFResButton = LinkFactory.createButton("sf.changesfresource", myContent, this); - unselectSFResButton = LinkFactory.createButton("sf.unselectsfresource", myContent, this); - selectSFResButton = LinkFactory.createButton("sf.selectsfresource", myContent, this); + myContent = createVelocityContainer("CourseSharedFolder"); + if(editable) { + changeSFResButton = LinkFactory.createButton("sf.changesfresource", myContent, this); + unselectSFResButton = LinkFactory.createButton("sf.unselectsfresource", myContent, this); + selectSFResButton = LinkFactory.createButton("sf.selectsfresource", myContent, this); + } String softkey = courseConfig.getSharedFolderSoftkey(); String name; if (!courseConfig.hasCustomSharedFolder()) { - name = translator.translate("sf.notconfigured"); + name = translate("sf.notconfigured"); hasSF = false; myContent.contextPut("hasSharedFolder", new Boolean(hasSF)); } else { @@ -114,7 +108,7 @@ public class CourseSharedFolderController extends DefaultController implements C if (re == null) { //log.warning("Removed configured sahred folder from course config, because repo entry does not exist anymore."); courseConfig.setSharedFolderSoftkey(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY); - name = translator.translate("sf.notconfigured"); + name = translate("sf.notconfigured"); hasSF = false; myContent.contextPut("hasSharedFolder", new Boolean(hasSF)); } else { @@ -125,7 +119,7 @@ public class CourseSharedFolderController extends DefaultController implements C } myContent.contextPut("resourceTitle", name); - setInitialComponent(myContent); + putInitialPanel(myContent); } /** @@ -136,9 +130,9 @@ public class CourseSharedFolderController extends DefaultController implements C if (source == selectSFResButton || source == changeSFResButton) { // select or change shared folder // let user choose a shared folder searchController = new ReferencableEntriesSearchController(getWindowControl(), ureq, - SharedFolderFileResource.TYPE_NAME, translator.translate("command.choose")); + SharedFolderFileResource.TYPE_NAME, translate("command.choose")); searchController.addControllerListener(this); - cmc = new CloseableModalController(getWindowControl(), translator.translate("close"), searchController.getInitialComponent()); + cmc = new CloseableModalController(getWindowControl(), translate("close"), searchController.getInitialComponent()); cmc.activate(); } else if (source == unselectSFResButton) { // unselect shared folder if (courseConfig.hasCustomSharedFolder()) { @@ -151,7 +145,7 @@ public class CourseSharedFolderController extends DefaultController implements C courseConfig.setSharedFolderSoftkey(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY); //deleteRefTo(course); //course.getCourseEnvironment().setCourseConfig(cc); - String emptyKey = translator.translate(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY); + String emptyKey = translate(CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY); myContent.contextPut("resourceTitle", emptyKey); hasSF = false; myContent.contextPut("hasSharedFolder", new Boolean(hasSF)); @@ -209,9 +203,9 @@ public class CourseSharedFolderController extends DefaultController implements C */ public static void deleteRefTo(ICourse course) { ReferenceManager refM = ReferenceManager.getInstance(); - List repoRefs = refM.getReferences(course); - for (Iterator iter = repoRefs.iterator(); iter.hasNext();) { - ReferenceImpl ref = (ReferenceImpl) iter.next(); + List<ReferenceImpl> repoRefs = refM.getReferences(course); + for (Iterator<ReferenceImpl> iter = repoRefs.iterator(); iter.hasNext();) { + ReferenceImpl ref = iter.next(); if (ref.getUserdata().equals(SHAREDFOLDERREF)) { refM.delete(ref); return; @@ -227,7 +221,6 @@ public class CourseSharedFolderController extends DefaultController implements C searchController.dispose(); searchController = null; } - } /** @@ -241,5 +234,4 @@ public class CourseSharedFolderController extends DefaultController implements C public RepositoryEntry getSharedFolderRepositoryEntry() { return sharedFolderRepositoryEntry; } - } \ No newline at end of file diff --git a/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html b/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html index 49584e48f5a..ea2968bfe39 100644 --- a/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html +++ b/src/main/java/org/olat/course/config/ui/_content/CourseGlossary.html @@ -7,13 +7,13 @@ <div class="b_button_group"> $r.render("command.glossary.add") </div> - #elseif ($r.available("command.glossary.remove")) + #elseif ($repoEntry) $repoEntry.getDisplayname() - <p> - $r.translate("glossary.description"): $r.formatLatexFormulas($repoEntry.getDescription()) - </p> - <div class="b_button_group"> - $r.render("command.glossary.remove") - </div> + <p>$r.translate("glossary.description"): $r.formatLatexFormulas($repoEntry.getDescription())</p> + #if($r.available("command.glossary.remove")) + <div class="b_button_group"> + $r.render("command.glossary.remove") + </div> + #end #end </fieldset> diff --git a/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html b/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html index 4eb9bca7b26..a2b622ef564 100644 --- a/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html +++ b/src/main/java/org/olat/course/config/ui/_content/CourseSharedFolder.html @@ -6,7 +6,7 @@ #if($hasSharedFolder) $r.render("sf.changesfresource") $r.render("sf.unselectsfresource") - #else + #elseif($r.available("sf.selectsfresource")) $r.render("sf.selectsfresource") #end </div> diff --git a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java index edc2ec483f4..fe9776e4826 100644 --- a/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java +++ b/src/main/java/org/olat/course/config/ui/courselayout/CourseLayoutGeneratorController.java @@ -90,11 +90,13 @@ public class CourseLayoutGeneratorController extends FormBasicController { private FormLayoutContainer logoImgFlc; private FormLink logoDel; private boolean elWithErrorExists = false; + private final boolean editable; public CourseLayoutGeneratorController(UserRequest ureq, WindowControl wControl, CourseConfig courseConfig, - CourseEnvironment courseEnvironment) { + CourseEnvironment courseEnvironment, boolean editable) { super(ureq, wControl); + this.editable = editable; this.courseConfig = courseConfig; this.courseEnvironment = courseEnvironment; customCMgr = (CustomConfigManager) CoreSpringFactory.getBean("courseConfigManager"); @@ -109,7 +111,6 @@ public class CourseLayoutGeneratorController extends FormBasicController { /** * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer, org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest) */ - @SuppressWarnings("unused") @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormTitle("tab.layout.title"); @@ -178,6 +179,7 @@ public class CourseLayoutGeneratorController extends FormBasicController { styleSel = uifactory.addDropdownSingleselect("course.layout.selector", formLayout, theKeys, theValues, theCssClasses); styleSel.addActionListener(this, FormEvent.ONCHANGE); + styleSel.setEnabled(editable); if (keys.contains(actualCSSSettings)){ styleSel.select(actualCSSSettings, true); } else { @@ -195,12 +197,14 @@ public class CourseLayoutGeneratorController extends FormBasicController { refreshLogoImage(); // offer upload for 2nd logo - logoUpl = uifactory.addFileElement("upload.second.logo", formLayout); - logoUpl.addActionListener(this, FormEvent.ONCHANGE); - Set<String> mimeTypes = new HashSet<String>(); - mimeTypes.add("image/*"); - logoUpl.limitToMimeType(mimeTypes, "logo.file.type.error", null); - logoUpl.setMaxUploadSizeKB(2048, "logo.size.error", null); + if(editable) { + logoUpl = uifactory.addFileElement("upload.second.logo", formLayout); + logoUpl.addActionListener(this, FormEvent.ONCHANGE); + Set<String> mimeTypes = new HashSet<String>(); + mimeTypes.add("image/*"); + logoUpl.limitToMimeType(mimeTypes, "logo.file.type.error", null); + logoUpl.setMaxUploadSizeKB(2048, "logo.size.error", null); + } // prepare the custom layouter styleFlc = FormLayoutContainer.createCustomFormLayout("style", getTranslator(), velocity_root + "/style.html"); @@ -208,14 +212,16 @@ public class CourseLayoutGeneratorController extends FormBasicController { styleFlc.setLabel(null, null); enableDisableCustom(CourseLayoutHelper.CONFIG_KEY_CUSTOM.equals(actualCSSSettings)); - uifactory.addFormSubmitButton("course.layout.save", formLayout); + if(editable) { + uifactory.addFormSubmitButton("course.layout.save", formLayout); + } } /** * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest, org.olat.core.gui.components.form.flexible.FormItem, org.olat.core.gui.components.form.flexible.impl.FormEvent) */ @Override - protected void formInnerEvent(@SuppressWarnings("unused") UserRequest ureq, FormItem source, FormEvent event) { + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == styleSel) { String selection = styleSel.getSelectedKey(); if (CourseLayoutHelper.CONFIG_KEY_CUSTOM.equals(selection)) { @@ -256,7 +262,8 @@ public class CourseLayoutGeneratorController extends FormBasicController { private void enableDisableCustom(boolean onOff){ if (onOff) prepareStyleEditor(persistedCustomConfig); styleFlc.setVisible(onOff); - logoUpl.setVisible(onOff); + styleFlc.setEnabled(editable); + if(logoUpl != null) logoUpl.setVisible(onOff); logoImgFlc.setVisible(onOff); } @@ -343,6 +350,7 @@ public class CourseLayoutGeneratorController extends FormBasicController { image.setMaxWithAndHeightToFitWithin(300, 300); logoDel = uifactory.addFormLink("logo.delete", logoImgFlc, Link.BUTTON_XSMALL); logoDel.setUserObject(logo); + logoDel.setVisible(editable); return; } logoImgFlc.setVisible(false); diff --git a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java index 16b69398659..a72b69b9f46 100644 --- a/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java +++ b/src/main/java/org/olat/course/member/CourseBusinessGroupListController.java @@ -42,6 +42,7 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.model.BusinessGroupSelectionEvent; import org.olat.group.model.SearchBusinessGroupParams; import org.olat.group.ui.main.AbstractBusinessGroupListController; @@ -49,8 +50,11 @@ import org.olat.group.ui.main.BGAccessControlledCellRenderer; import org.olat.group.ui.main.BGTableItem; import org.olat.group.ui.main.BusinessGroupNameCellRenderer; import org.olat.group.ui.main.BusinessGroupTableModelWithType.Cols; +import org.olat.group.ui.main.BusinessGroupViewFilter; import org.olat.group.ui.main.SelectBusinessGroupController; +import org.olat.group.ui.main.UnmanagedGroupFilter; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.resource.OLATResource; /** @@ -59,8 +63,8 @@ import org.olat.resource.OLATResource; */ public class CourseBusinessGroupListController extends AbstractBusinessGroupListController { - private static String TABLE_ACTION_UNLINK = "tblUnlink"; - private static String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink"; + public static String TABLE_ACTION_UNLINK = "tblUnlink"; + public static String TABLE_ACTION_MULTI_UNLINK = "tblMultiUnlink"; private final RepositoryEntry re; private final Link createGroup; @@ -71,12 +75,15 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList private SelectBusinessGroupController selectController; public CourseBusinessGroupListController(UserRequest ureq, WindowControl wControl, RepositoryEntry re) { - super(ureq, wControl, "group_list"); + super(ureq, wControl, "group_list", re); this.re = re; + boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); createGroup = LinkFactory.createButton("group.create", mainVC, this); + createGroup.setVisible(!managed); mainVC.put("createGroup", createGroup); addGroup = LinkFactory.createButton("group.add", mainVC, this); + addGroup.setVisible(!managed); mainVC.put("addGroup", addGroup); } @@ -84,16 +91,26 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList protected void initButtons(UserRequest ureq) { initButtons(ureq, true); groupListCtr.setMultiSelect(true); - groupListCtr.addMultiSelectAction("table.duplicate", TABLE_ACTION_DUPLICATE); - groupListCtr.addMultiSelectAction("table.merge", TABLE_ACTION_MERGE); + + RepositoryEntry re = (RepositoryEntry)getUserObject(); + boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); + if(!managed) { + groupListCtr.addMultiSelectAction("table.duplicate", TABLE_ACTION_DUPLICATE); + groupListCtr.addMultiSelectAction("table.merge", TABLE_ACTION_MERGE); + } groupListCtr.addMultiSelectAction("table.users.management", TABLE_ACTION_USERS); groupListCtr.addMultiSelectAction("table.config", TABLE_ACTION_CONFIG); groupListCtr.addMultiSelectAction("table.email", TABLE_ACTION_EMAIL); - groupListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_MULTI_UNLINK); + if(!managed) { + groupListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_MULTI_UNLINK); + } } @Override protected int initColumns() { + RepositoryEntry re = (RepositoryEntry)getUserObject(); + boolean managed = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); + CustomCssCellRenderer nameRenderer = new BusinessGroupNameCellRenderer(); groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.name.i18n(), Cols.name.ordinal(), TABLE_ACTION_LAUNCH, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, nameRenderer)); groupListCtr.addColumnDescriptor(false, new DefaultColumnDescriptor(Cols.key.i18n(), Cols.key.ordinal(), null, getLocale())); @@ -106,7 +123,9 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList CustomCellRenderer acRenderer = new BGAccessControlledCellRenderer(); groupListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.accessTypes.i18n(), Cols.accessTypes.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, acRenderer)); groupListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_EDIT, "table.header.edit", translate("table.header.edit"))); - groupListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_UNLINK, "table.header.remove", translate("table.header.remove"))); + if(!managed) { + groupListCtr.addColumnDescriptor(new RemoveActionColumnDescriptor("table.header.remove", Cols.wrapper.ordinal(), getTranslator())); + } return 11; } @@ -185,7 +204,8 @@ public class CourseBusinessGroupListController extends AbstractBusinessGroupList protected void doSelectGroups(UserRequest ureq) { removeAsListenerAndDispose(selectController); - selectController = new SelectBusinessGroupController(ureq, getWindowControl()); + BusinessGroupViewFilter filter = new UnmanagedGroupFilter(BusinessGroupManagedFlag.resources); + selectController = new SelectBusinessGroupController(ureq, getWindowControl(), filter); listenTo(selectController); cmc = new CloseableModalController(getWindowControl(), translate("close"), diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java index d0023a92a01..eab7c77aba6 100644 --- a/src/main/java/org/olat/course/member/MembersOverviewController.java +++ b/src/main/java/org/olat/course/member/MembersOverviewController.java @@ -61,6 +61,7 @@ import org.olat.group.ui.main.DedupMembersConfirmationController; import org.olat.group.ui.main.MemberPermissionChangeEvent; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; import org.olat.util.logging.activity.LoggingResourceable; @@ -125,11 +126,15 @@ public class MembersOverviewController extends BasicController implements Activa selectedCtrl = updateAllMembers(ureq); + boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); addMemberLink = LinkFactory.createButton("add.member", mainVC, this); + addMemberLink.setVisible(!managed); mainVC.put("addMembers", addMemberLink); importMemberLink = LinkFactory.createButton("import.member", mainVC, this); + importMemberLink.setVisible(!managed); mainVC.put("importMembers", importMemberLink); dedupLink = LinkFactory.createButton("dedup.members", mainVC, this); + dedupLink.setVisible(!managed); mainVC.put("dedupMembers", dedupLink); putInitialPanel(mainVC); diff --git a/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java b/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java new file mode 100644 index 00000000000..c3362952559 --- /dev/null +++ b/src/main/java/org/olat/course/member/RemoveActionColumnDescriptor.java @@ -0,0 +1,78 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.course.member; + +import org.olat.core.gui.components.table.DefaultColumnDescriptor; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.translator.Translator; +import org.olat.group.BusinessGroupManagedFlag; +import org.olat.group.ui.main.BGTableItem; +import org.olat.group.ui.main.BusinessGroupTableModelWithType; + +/** + * The remove link appear only if the group is not managed + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class RemoveActionColumnDescriptor extends DefaultColumnDescriptor { + + private final Translator translator; + + public RemoveActionColumnDescriptor(final String headerKey, final int dataColumn, final Translator translator) { + super(headerKey, dataColumn, null, translator.getLocale()); + this.translator = translator; + } + + @Override + public String getAction(int row) { + int sortedRow = table.getSortedRow(row); + + Object memberObj = table.getTableDataModel().getValueAt(sortedRow, BusinessGroupTableModelWithType.Cols.wrapper.ordinal()); + if(memberObj instanceof BGTableItem) { + //owner, participant, or in waiting list can leave + BGTableItem item = (BGTableItem)memberObj; + boolean managed = BusinessGroupManagedFlag.isManaged(item.getManagedFlags(), BusinessGroupManagedFlag.resources); + if(managed) { + return null; + } + } + return CourseBusinessGroupListController.TABLE_ACTION_UNLINK; + } + + @Override + public void renderValue(StringOutput sb, int row, Renderer renderer) { + int sortedRow = table.getSortedRow(row); + Object memberObj = table.getTableDataModel().getValueAt(sortedRow, BusinessGroupTableModelWithType.Cols.wrapper.ordinal()); + + boolean managed = false; + if(memberObj instanceof BGTableItem) { + //owner, participant, or in waiting list can leave + BGTableItem item = (BGTableItem)memberObj; + managed = BusinessGroupManagedFlag.isManaged(item.getManagedFlags(), BusinessGroupManagedFlag.resources); + } + + if(!managed) { + sb.append(translator.translate(getHeaderKey())); + } + } +} diff --git a/src/main/java/org/olat/course/run/RunMainController.java b/src/main/java/org/olat/course/run/RunMainController.java index cce4fe0a0a0..c3e040cacc8 100644 --- a/src/main/java/org/olat/course/run/RunMainController.java +++ b/src/main/java/org/olat/course/run/RunMainController.java @@ -120,6 +120,7 @@ import org.olat.instantMessaging.OpenInstantMessageEvent; import org.olat.modules.cp.TreeNodeEvent; import org.olat.note.NoteController; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryEntryStatus; import org.olat.repository.RepositoryManager; import org.olat.repository.controllers.EntryChangedEvent; @@ -1022,7 +1023,9 @@ public class RunMainController extends MainLayoutBasicController implements Gene || hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) { myTool.addHeader(translate("header.tools")); if (hasCourseRight(CourseRights.RIGHT_COURSEEDITOR) || isCourseAdmin) { - myTool.addLink(COMMAND_EDIT, translate("command.openeditor"), null, null, "o_sel_course_open_editor", false); + boolean managed = RepositoryEntryManagedFlag.isManaged(courseRepositoryEntry, RepositoryEntryManagedFlag.editcontent); + myTool.addLink(COMMAND_EDIT, translate("command.openeditor"), "edit.cmd", null, "o_sel_course_open_editor", false); + myTool.setEnabled("edit.cmd", !managed); } if (hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || isCourseAdmin) { //fxdiff VCRP-1,2: access control of resources @@ -1261,7 +1264,10 @@ public class RunMainController extends MainLayoutBasicController implements Gene //the wrong link to the wrong person } } else if(RepositoryDetailsController.ACTIVATE_EDITOR.equals(type)) { - doEdit(ureq); + boolean managed = RepositoryEntryManagedFlag.isManaged(courseRepositoryEntry, RepositoryEntryManagedFlag.editcontent); + if(!managed) { + doEdit(ureq); + } } } diff --git a/src/main/java/org/olat/group/BusinessGroup.java b/src/main/java/org/olat/group/BusinessGroup.java index 3cadf26ac7a..d0efe89944d 100644 --- a/src/main/java/org/olat/group/BusinessGroup.java +++ b/src/main/java/org/olat/group/BusinessGroup.java @@ -85,13 +85,20 @@ public interface BusinessGroup extends BusinessGroupShort, Persistable, CreateIn * * @return List of flags which say what features are externally managed */ - public String getManagedFlags(); + public BusinessGroupManagedFlag[] getManagedFlags(); + + /** + * Return the list of managed flags as a string with the + * flags separated by comma. + * @return + */ + public String getManagedFlagsString(); /** * A list of flags * @param flags */ - public void setManagedFlags(String flags); + public void setManagedFlagsString(String flags); /** * BusinessGroup was active, lastUsage will be used to determine which groups diff --git a/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml b/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml index 193affd39c0..73af71595cd 100644 --- a/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml +++ b/src/main/java/org/olat/group/BusinessGroupImpl.hbm.xml @@ -31,7 +31,7 @@ <property name="lastUsage" column="lastusage" type="timestamp" /> <property name="type" column="businessgrouptype" unique="false" length="15" not-null="true" index="gp_type_idx"/> <property name="externalId" column="external_id" unique="false" not-null="false" type="string"/> - <property name="managedFlags" column="managed_flags" unique="false" not-null="false" type="string"/> + <property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/> <property name="name" type="string" column="groupname" unique="false" length="255" index="gp_name_idx"/> @@ -105,5 +105,6 @@ </id> <property name="name" type="string" column="groupname" unique="false" length="255"/> + <property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/> </class> </hibernate-mapping> \ No newline at end of file diff --git a/src/main/java/org/olat/group/BusinessGroupImpl.java b/src/main/java/org/olat/group/BusinessGroupImpl.java index df1ce28dc88..2472ee31571 100644 --- a/src/main/java/org/olat/group/BusinessGroupImpl.java +++ b/src/main/java/org/olat/group/BusinessGroupImpl.java @@ -32,6 +32,7 @@ import org.olat.core.commons.persistence.PersistentObject; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; import org.olat.core.util.resource.OresHelper; import org.olat.resource.OLATResource; @@ -53,7 +54,7 @@ public class BusinessGroupImpl extends PersistentObject implements BusinessGroup private String name; private String type; private String externalId; - private String managedFlags; + private String managedFlagsString; private Integer minParticipants; private Integer maxParticipants; private OLATResource resource; @@ -144,12 +145,22 @@ public class BusinessGroupImpl extends PersistentObject implements BusinessGroup this.externalId = externalId; } - public String getManagedFlags() { - return managedFlags; + @Override + public BusinessGroupManagedFlag[] getManagedFlags() { + if(StringHelper.containsNonWhitespace(managedFlagsString)) { + return BusinessGroupManagedFlag.toEnum(managedFlagsString); + } + return new BusinessGroupManagedFlag[0]; + } + + @Override + public String getManagedFlagsString() { + return managedFlagsString; } - public void setManagedFlags(String managedFlags) { - this.managedFlags = managedFlags; + @Override + public void setManagedFlagsString(String managedFlags) { + this.managedFlagsString = managedFlags; } /** diff --git a/src/main/java/org/olat/group/BusinessGroupManagedFlag.java b/src/main/java/org/olat/group/BusinessGroupManagedFlag.java new file mode 100644 index 00000000000..196e349ad8e --- /dev/null +++ b/src/main/java/org/olat/group/BusinessGroupManagedFlag.java @@ -0,0 +1,124 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group; + +import java.util.Arrays; + +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; + +/** + * List of flags for managed groups + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + */ +public enum BusinessGroupManagedFlag { + + all, + details(all),//details tab + title(details,all), + description(details,all), + settings(details,all),//max num of participants... + tools(all),//tools tab + members(all),//members tab + display(members,all),// members display options + membersmanagement(members,all), + resources(all),//add/remove courses + bookings(all),// change booking rules + delete(all); + + + private BusinessGroupManagedFlag[] parents; + private static final OLog log = Tracing.createLoggerFor(BusinessGroupManagedFlag.class); + public static final BusinessGroupManagedFlag[] EMPTY_ARRAY = new BusinessGroupManagedFlag[0]; + + private BusinessGroupManagedFlag() { + // + } + + private BusinessGroupManagedFlag(BusinessGroupManagedFlag... parents) { + if(parents == null) { + this.parents = new BusinessGroupManagedFlag[0]; + } else { + this.parents = parents; + } + } + + public static BusinessGroupManagedFlag[] toEnum(String flags) { + if(StringHelper.containsNonWhitespace(flags)) { + String[] flagArr = flags.split(","); + BusinessGroupManagedFlag[] flagEnums = new BusinessGroupManagedFlag[flagArr.length]; + + int count = 0; + for(String flag:flagArr) { + if(StringHelper.containsNonWhitespace(flag)) { + try { + BusinessGroupManagedFlag flagEnum = valueOf(flag); + flagEnums[count++] = flagEnum; + } catch (Exception e) { + log.warn("Cannot parse this managed flag: " + flag, e); + } + } + } + + if(count != flagEnums.length) { + flagEnums = Arrays.copyOf(flagEnums, count); + } + return flagEnums; + } else { + return EMPTY_ARRAY; + } + } + + public static boolean isManaged(BusinessGroup group, BusinessGroupManagedFlag marker) { + if(group != null && (contains(group, marker) || contains(group, marker.parents))) { + return true; + } + return false; + } + + public static boolean isManaged(BusinessGroupManagedFlag[] flags, BusinessGroupManagedFlag marker) { + if(flags != null && (contains(flags, marker) || contains(flags, marker.parents))) { + return true; + } + return false; + } + + private static boolean contains(BusinessGroup group, BusinessGroupManagedFlag... markers) { + if(group == null) return false; + BusinessGroupManagedFlag[] flags = group.getManagedFlags(); + return contains(flags, markers); + } + + private static boolean contains(BusinessGroupManagedFlag[] flags, BusinessGroupManagedFlag... markers) { + if(flags == null || flags.length == 0) return false; + + for(BusinessGroupManagedFlag flag:flags) { + for(BusinessGroupManagedFlag marker:markers) { + if(flag.equals(marker)) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java index 0c5b8df0b5d..71bd2d5d5c1 100644 --- a/src/main/java/org/olat/group/BusinessGroupService.java +++ b/src/main/java/org/olat/group/BusinessGroupService.java @@ -420,7 +420,8 @@ public interface BusinessGroupService { /** * Remove the members (tutors and participants) from all business groups connected * to the resource (the resource can be a BusinessGroup) by cancelling their membership - * or their reservations. + * or their reservations.<br/> + * This method respect the managed flags. * * @param ureqIdentity * @param identities diff --git a/src/main/java/org/olat/group/BusinessGroupShort.java b/src/main/java/org/olat/group/BusinessGroupShort.java index 0d5640a7e8a..6f4813d6bf2 100644 --- a/src/main/java/org/olat/group/BusinessGroupShort.java +++ b/src/main/java/org/olat/group/BusinessGroupShort.java @@ -32,5 +32,7 @@ public interface BusinessGroupShort extends OLATResourceable { public Long getKey(); public String getName(); + + public BusinessGroupManagedFlag[] getManagedFlags(); } diff --git a/src/main/java/org/olat/group/BusinessGroupView.java b/src/main/java/org/olat/group/BusinessGroupView.java index 36ed10a3b09..82d9eab947b 100644 --- a/src/main/java/org/olat/group/BusinessGroupView.java +++ b/src/main/java/org/olat/group/BusinessGroupView.java @@ -21,7 +21,6 @@ package org.olat.group; import java.util.Date; -import org.olat.basesecurity.SecurityGroup; import org.olat.core.id.CreateInfo; import org.olat.core.id.ModifiedInfo; import org.olat.core.id.OLATResourceable; @@ -74,26 +73,6 @@ public interface BusinessGroupView extends BusinessGroupShort, Persistable, Crea */ public long getNumOfValidOffers(); - /** - * The BusinessGroup has 1..n Owners acting as <i>administrators </i>. - * - * @return the owners - */ - public SecurityGroup getOwnerGroup(); - - /** - * The BusinessGroup has 0..n Partipiciants. - * - * @return the partipiciants - */ - public SecurityGroup getPartipiciantGroup(); - - /** - * The BusinessGroup has 0..n people in the waiting group. - * - * @return the waiting group - */ - public SecurityGroup getWaitingGroup(); /** * @return last usage of this group @@ -119,6 +98,9 @@ public interface BusinessGroupView extends BusinessGroupShort, Persistable, Crea * @return true: if waiting-list is enabled */ public Boolean getWaitingListEnabled(); + + + public BusinessGroupManagedFlag[] getManagedFlags(); } diff --git a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java index 8e714e06efa..f767f2d6e7f 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupDAO.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupDAO.java @@ -111,7 +111,7 @@ public class BusinessGroupDAO { businessgroup.setExternalId(externalId); } if(StringHelper.containsNonWhitespace(managedFlags)) { - businessgroup.setManagedFlags(managedFlags); + businessgroup.setManagedFlagsString(managedFlags); } businessgroup.setWaitingListEnabled(waitingListEnabled); diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index a2b0fcd463b..8345c392ee8 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -67,6 +67,7 @@ import org.olat.core.util.resource.OLATResourceableJustBeforeDeletedEvent; import org.olat.core.util.resource.OresHelper; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupAddResponse; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupMembership; import org.olat.group.BusinessGroupModule; import org.olat.group.BusinessGroupOrder; @@ -225,7 +226,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD if("none".equals(managedFlags) || "".equals(managedFlags)) { managedFlags = null; } - bg.setManagedFlags(managedFlags); + bg.setManagedFlagsString(managedFlags); //auto rank if possible List<BusinessGroupModifiedEvent.Deferred> events = new ArrayList<BusinessGroupModifiedEvent.Deferred>(); @@ -1070,6 +1071,18 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD if(groups == null || groups.isEmpty()) { return;//nothing to do } + + //remove managed groups + for(Iterator<BusinessGroup> groupIt=groups.iterator(); groupIt.hasNext(); ) { + boolean managed = BusinessGroupManagedFlag.isManaged(groupIt.next(), BusinessGroupManagedFlag.membersmanagement); + if(managed) { + groupIt.remove(); + } + } + + if(groups.isEmpty()) { + return;//nothing to do + } List<OLATResource> groupResources = new ArrayList<OLATResource>(); Map<Long,BusinessGroup> keyToGroupMap = new HashMap<Long,BusinessGroup>(); diff --git a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java index 04961c36962..b1064064bf8 100644 --- a/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java +++ b/src/main/java/org/olat/group/model/BusinessGroupShortImpl.java @@ -22,6 +22,7 @@ package org.olat.group.model; import org.olat.core.commons.persistence.PersistentObject; import org.olat.core.util.resource.OresHelper; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupShort; /** @@ -37,6 +38,7 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business private static final long serialVersionUID = -5404538852842562897L; private String name; + private String managedFlagsString; public String getName() { return name; @@ -46,8 +48,14 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business this.name = name; } - - + public String getManagedFlagsString() { + return managedFlagsString; + } + + public void setManagedFlagsString(String managedFlagsString) { + this.managedFlagsString = managedFlagsString; + } + @Override public String getResourceableTypeName() { return OresHelper.calculateTypeName(BusinessGroup.class); @@ -58,6 +66,11 @@ public class BusinessGroupShortImpl extends PersistentObject implements Business return getKey(); } + @Override + public BusinessGroupManagedFlag[] getManagedFlags() { + return BusinessGroupManagedFlag.toEnum(managedFlagsString); + } + /** * Compares the keys. * @see java.lang.Object#equals(java.lang.Object) diff --git a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml index a8a3287f287..007c3ac9d70 100644 --- a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml +++ b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.hbm.xml @@ -19,7 +19,8 @@ <property name="minParticipants" column="minparticipants" not-null="false"/> <property name="maxParticipants" column="maxparticipants" not-null="false"/> <property name="waitingListEnabled" type="boolean" column="waitinglist_enabled" unique="false" not-null="false"/> - <property name="autoCloseRanksEnabled" type="boolean" column="autocloseranks_enabled" unique="false" not-null="false"/> + <property name="autoCloseRanksEnabled" type="boolean" column="autocloseranks_enabled" unique="false" not-null="false"/> + <property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/> <!-- statistics informations --> <property name="numOfOwners" column="num_of_owners" type="long" /> <property name="numOfParticipants" column="num_of_participants" type="long" /> diff --git a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java index c70dfb0c2d1..4e0a27d9851 100644 --- a/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java +++ b/src/main/java/org/olat/group/model/BusinessGroupViewImpl.java @@ -25,6 +25,7 @@ import org.olat.basesecurity.SecurityGroup; import org.olat.core.commons.persistence.PersistentObject; import org.olat.core.util.resource.OresHelper; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupView; import org.olat.resource.OLATResource; @@ -49,6 +50,7 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG private Boolean waitingListEnabled; private Boolean autoCloseRanksEnabled; private Date lastModified; + private String managedFlagsString; private long numOfOwners; private long numOfParticipants; @@ -176,6 +178,19 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG this.lastUsage = lastUsage; } + public String getManagedFlagsString() { + return managedFlagsString; + } + + public void setManagedFlagsString(String managedFlagsString) { + this.managedFlagsString = managedFlagsString; + } + + @Override + public BusinessGroupManagedFlag[] getManagedFlags() { + return BusinessGroupManagedFlag.toEnum(managedFlagsString); + } + @Override public OLATResource getResource() { return resource; @@ -186,7 +201,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG this.resource = resource; } - @Override public SecurityGroup getOwnerGroup() { return ownerGroup; } @@ -195,7 +209,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG this.ownerGroup = ownerGroup; } - @Override public SecurityGroup getPartipiciantGroup() { return partipiciantGroup; } @@ -204,7 +217,6 @@ public class BusinessGroupViewImpl extends PersistentObject implements BusinessG this.partipiciantGroup = partipiciantGroup; } - @Override public SecurityGroup getWaitingGroup() { return waitingGroup; } diff --git a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java index 4638bbf55d1..3c94b636d63 100644 --- a/src/main/java/org/olat/group/ui/BusinessGroupFormController.java +++ b/src/main/java/org/olat/group/ui/BusinessGroupFormController.java @@ -34,6 +34,7 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; @@ -41,6 +42,7 @@ import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.util.StringHelper; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; /** * Implements a Business group creation dialog using FlexiForms. @@ -151,12 +153,14 @@ public class BusinessGroupFormController extends FormBasicController { businessGroupName.setRegexMatchCheck(BusinessGroup.VALID_GROUPNAME_REGEXP, "create.form.error.illegalName"); } businessGroupName.setMandatory(true); + businessGroupName.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.title)); formLayout.setElementCssClass("o_sel_group_edit_group_form"); // Create the business group description input rich text element businessGroupDescription = uifactory.addRichTextElementForStringDataMinimalistic("create.form.title.description", "create.form.title.description", "", 10, -1, false, formLayout, ureq.getUserSession(), getWindowControl()); + businessGroupDescription.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.description)); if(businessGroup != null && !bulkMode) { // link to group direct jump in business path @@ -195,6 +199,12 @@ public class BusinessGroupFormController extends FormBasicController { businessGroupMaximumMembers.setVisible(true); enableWaitingList.setVisible(true); enableAutoCloseRanks.setVisible(true); + + boolean managedSettings = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.settings); + businessGroupMinimumMembers.setEnabled(!managedSettings); + businessGroupMaximumMembers.setEnabled(!managedSettings); + enableWaitingList.setEnabled(!managedSettings); + enableAutoCloseRanks.setEnabled(!managedSettings); if ((businessGroup != null) && (!bulkMode)) { businessGroupName.setValue(businessGroup.getName()); @@ -215,13 +225,15 @@ public class BusinessGroupFormController extends FormBasicController { // Create submit and cancel buttons final FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); formLayout.add(buttonLayout); - uifactory.addFormSubmitButton("finish", buttonLayout); + FormSubmit submit = uifactory.addFormSubmitButton("finish", buttonLayout); + submit.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.details)); uifactory.addFormCancelButton("cancel", buttonLayout, ureq, getWindowControl()); } } public void setAllowWaitingList(boolean allowWaitingList) { - enableWaitingList.setEnabled(allowWaitingList); + boolean managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.settings); + enableWaitingList.setEnabled(allowWaitingList && !managed); } /** diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java index eb8e225bf8c..6785a564740 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditAccessController.java @@ -30,6 +30,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.resource.OLATResource; import org.olat.resource.accesscontrol.AccessControlModule; import org.olat.resource.accesscontrol.ui.AccessConfigurationController; @@ -46,17 +47,20 @@ import org.olat.resource.accesscontrol.ui.AccessConfigurationController; //fxdiff VCRP-1,2: access control of resources public class BusinessGroupEditAccessController extends FormBasicController { + private final boolean managed; private AccessConfigurationController configController; public BusinessGroupEditAccessController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) { super(ureq, wControl, LAYOUT_VERTICAL); setTranslator(Util.createPackageTranslator(AccessConfigurationController.class, getLocale(), getTranslator())); + + managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.bookings); AccessControlModule acModule = CoreSpringFactory.getImpl(AccessControlModule.class); if(acModule.isEnabled()) { OLATResource resource = businessGroup.getResource(); boolean waitingList = businessGroup.getWaitingListEnabled(); - configController = new AccessConfigurationController(ureq, wControl, resource, businessGroup.getName(), !waitingList, mainForm); + configController = new AccessConfigurationController(ureq, wControl, resource, businessGroup.getName(), !waitingList, !managed, mainForm); listenTo(configController); } @@ -65,20 +69,25 @@ public class BusinessGroupEditAccessController extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - if(configController != null) { - formLayout.add(configController.getInitialFormItem()); - uifactory.addSpacerElement("spacer1", formLayout, false); - } - setFormTitle("accesscontrol.title"); setFormDescription("accesscontrol_group.desc"); setFormContextHelp(AccessConfigurationController.class.getPackage().getName(), "accesscontrol_group.html", "chelp.accesscontrol_group.hover"); - final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); - buttonGroupLayout.setRootForm(mainForm); - formLayout.add(buttonGroupLayout); + if(configController != null) { + formLayout.add(configController.getInitialFormItem()); + } + + if(configController != null && !managed) { + uifactory.addSpacerElement("spacer1", formLayout, false); + } - uifactory.addFormSubmitButton("save", formLayout); + if(!managed) { + final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); + buttonGroupLayout.setRootForm(mainForm); + formLayout.add(buttonGroupLayout); + + uifactory.addFormSubmitButton("save", formLayout); + } } public void updateBusinessGroup(BusinessGroup businessGroup) { 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 9aee7e3ad7f..b841d32d7dc 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditResourceController.java @@ -51,10 +51,13 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; import org.olat.course.CourseModule; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupService; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryTableModel; import org.olat.repository.controllers.ReferencableEntriesSearchController; +import org.olat.repository.controllers.RepositoryEntryFilter; /** * Description:<BR> @@ -80,6 +83,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme private Link addTabResourcesButton; private BusinessGroup group; + private final boolean managed; private final BusinessGroupService businessGroupService; /** @@ -93,6 +97,7 @@ public class BusinessGroupEditResourceController extends BasicController impleme super(ureq, wControl); businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); this.group = group; + managed = BusinessGroupManagedFlag.isManaged(group, BusinessGroupManagedFlag.resources); Translator resourceTrans = Util.createPackageTranslator(RepositoryTableModel.class, getLocale(), getTranslator()); TableGuiConfiguration tableConfig = new TableGuiConfiguration(); @@ -103,11 +108,16 @@ public class BusinessGroupEditResourceController extends BasicController impleme repoTableModel = new RepositoryTableModel(resourceTrans); List<RepositoryEntry> repoTableModelEntries = businessGroupService.findRepositoryEntries(Collections.singletonList(group), 0, -1); repoTableModel.setObjects(repoTableModelEntries); - repoTableModel.addColumnDescriptors(resourcesCtr, translate("resources.remove"), false); + + repoTableModel.addColumnDescriptors(resourcesCtr, null, false); + if(!managed) { + resourcesCtr.addColumnDescriptor(new RemoveResourceActionColumnDescriptor("resources.remove", 1, getTranslator())); + } resourcesCtr.setTableDataModel(repoTableModel); mainVC = createVelocityContainer("tab_bgResources"); addTabResourcesButton = LinkFactory.createButtonSmall("cmd.addresource", mainVC, this); + addTabResourcesButton.setVisible(!managed); mainVC.put("resources", resourcesCtr.getInitialComponent()); putInitialPanel(mainVC); } @@ -122,7 +132,9 @@ public class BusinessGroupEditResourceController extends BasicController impleme removeAsListenerAndDispose(repoSearchCtr); removeAsListenerAndDispose(cmc); - repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, new String[]{ CourseModule.getCourseTypeName() }, + RepositoryEntryFilter filter = new ManagedEntryfilter(); + repoSearchCtr = new ReferencableEntriesSearchController(getWindowControl(), ureq, + new String[]{ CourseModule.getCourseTypeName() }, filter, translate("resources.add"), true, true, true, true, true); listenTo(repoSearchCtr); cmc = new CloseableModalController(getWindowControl(), translate("close"), repoSearchCtr.getInitialComponent(), true, translate("resources.add.title")); @@ -203,4 +215,12 @@ public class BusinessGroupEditResourceController extends BasicController impleme protected void doDispose() { // } + + private static class ManagedEntryfilter implements RepositoryEntryFilter { + + @Override + public boolean accept(RepositoryEntry re) { + return !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups); + } + } } \ No newline at end of file diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java index 63b600599d9..cdd3071527f 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java @@ -43,6 +43,7 @@ import org.olat.core.util.mail.MailTemplate; import org.olat.course.member.wizard.ImportMember_1a_LoginListStep; import org.olat.course.member.wizard.ImportMember_1b_ChooseMemberStep; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupService; import org.olat.group.GroupLoggingAction; import org.olat.group.model.BusinessGroupMembershipChange; @@ -58,7 +59,7 @@ public class BusinessGroupMembersController extends BasicController { private final VelocityContainer mainVC; - private DisplayMemberSwitchForm dmsForm; + private final DisplayMemberSwitchForm dmsForm; private MemberListController membersController; private final Link importMemberLink, addMemberLink; private StepsMainRunController importMembersWizard; @@ -83,11 +84,13 @@ public class BusinessGroupMembersController extends BasicController { // configure the form with checkboxes for owners and/or partips according // the booleans dmsForm = new DisplayMemberSwitchForm(ureq, getWindowControl(), true, true, hasWaitingList); + dmsForm.setEnabled(!BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.display)); listenTo(dmsForm); // set if the checkboxes are checked or not. dmsForm.setDisplayMembers(displayMembers); mainVC.put("displayMembers", dmsForm.getInitialComponent()); + boolean managed = BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.membersmanagement); SearchMembersParams searchParams = new SearchMembersParams(false, false, false, true, true, true, true); membersController = new MemberListController(ureq, getWindowControl(), businessGroup, searchParams); listenTo(membersController); @@ -98,9 +101,11 @@ public class BusinessGroupMembersController extends BasicController { addMemberLink = LinkFactory.createButton("add.member", mainVC, this); addMemberLink.setElementCssClass("o_sel_group_add_member"); + addMemberLink.setVisible(!managed); mainVC.put("addMembers", addMemberLink); importMemberLink = LinkFactory.createButton("import.member", mainVC, this); importMemberLink.setElementCssClass("o_sel_group_import_members"); + importMemberLink.setVisible(!managed); mainVC.put("importMembers", importMemberLink); } diff --git a/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java b/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java index d5f77b3e39e..e2a210e8539 100644 --- a/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java +++ b/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java @@ -101,6 +101,16 @@ public class DisplayMemberSwitchForm extends FormBasicController { showWaitingList.setVisible(b); openWaitingList.setVisible(b); } + + public void setEnabled(boolean enabled) { + showOwners.setEnabled(enabled); + showPartips.setEnabled(enabled); + showWaitingList.setEnabled(enabled); + openOwners.setEnabled(enabled); + openPartips.setEnabled(enabled); + openWaitingList.setEnabled(enabled); + downloadList.setEnabled(enabled); + } @Override protected void formOK(UserRequest ureq) { diff --git a/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java b/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java new file mode 100644 index 00000000000..eaf2850129a --- /dev/null +++ b/src/main/java/org/olat/group/ui/edit/RemoveResourceActionColumnDescriptor.java @@ -0,0 +1,78 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group.ui.edit; + +import org.olat.core.gui.components.table.DefaultColumnDescriptor; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.translator.Translator; +import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; +import org.olat.repository.RepositoryTableModel; + +/** + * The remove link appear only if the repository is not managed (flag groups) + * + * Initial date: 12.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class RemoveResourceActionColumnDescriptor extends DefaultColumnDescriptor { + + private final Translator translator; + + public RemoveResourceActionColumnDescriptor(final String headerKey, final int dataColumn, final Translator translator) { + super(headerKey, dataColumn, null, translator.getLocale()); + this.translator = translator; + } + + @Override + public String getAction(int row) { + int sortedRow = table.getSortedRow(row); + + Object memberObj = table.getTableDataModel().getValueAt(sortedRow, getDataColumn()); + if(memberObj instanceof RepositoryEntry) { + //owner, participant, or in waiting list can leave + RepositoryEntry item = (RepositoryEntry)memberObj; + boolean managed = RepositoryEntryManagedFlag.isManaged(item.getManagedFlags(), RepositoryEntryManagedFlag.groups); + if(managed) { + return null; + } + } + return RepositoryTableModel.TABLE_ACTION_SELECT_LINK; + } + + @Override + public void renderValue(StringOutput sb, int row, Renderer renderer) { + int sortedRow = table.getSortedRow(row); + Object memberObj = table.getTableDataModel().getValueAt(sortedRow, getDataColumn()); + + boolean managed = false; + if(memberObj instanceof RepositoryEntry) { + //owner, participant, or in waiting list can leave + RepositoryEntry item = (RepositoryEntry)memberObj; + managed = RepositoryEntryManagedFlag.isManaged(item.getManagedFlags(), RepositoryEntryManagedFlag.groups); + } + + if(!managed) { + sb.append(translator.translate(getHeaderKey())); + } + } +} diff --git a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties index a2ac81c9449..aca6760e486 100644 --- a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_en.properties @@ -110,7 +110,7 @@ resource.remove=Do you really want to remove the group "{0}" from course "{1}"? resources.add=Link course resources.add.title=Select course resources.noresources=This group is not used in any courses. Choose "Add course" to link the course to this group. -resources.remove=remove +resources.remove=Remove table.header.edit=$org.olat.group.ui.main\:table.header.edit table.header.firstName=$org.olat.group.ui.main\:table.header.firstName table.header.firstTime=$org.olat.group.ui.main\:table.header.firstTime @@ -119,7 +119,7 @@ table.header.graduate=$org.olat.group.ui.main\:table.header.graduate table.header.groups=$org.olat.group.ui.main\:table.header.groups table.header.lastName=$org.olat.group.ui.main\:table.header.lastName table.header.lastTime=$org.olat.group.ui.main\:table.header.lastTime -table.header.login=org.olat.group.ui.main\:table.header.login +table.header.login=$org.olat.group.ui.main\:table.header.login table.header.mail=$org.olat.group.ui.main\:table.header.mail table.header.participants=$org.olat.group.ui.main\:table.header.participants table.header.participantsCount=$org.olat.group.ui.main\:table.header.participantsCount diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java index 0c463373a9f..c735740a214 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java @@ -24,6 +24,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -151,9 +152,16 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle protected final BusinessGroupService businessGroupService; protected final CollaborationToolsFactory collaborationTools; + private BusinessGroupViewFilter filter; + private Object userObject; + public AbstractBusinessGroupListController(UserRequest ureq, WindowControl wControl, String page) { + this(ureq, wControl, page, null); + } + + public AbstractBusinessGroupListController(UserRequest ureq, WindowControl wControl, String page, Object userObject) { super(ureq, wControl, Util.createPackageTranslator(AbstractBusinessGroupListController.class, ureq.getLocale())); - + admin = ureq.getUserSession().getRoles().isOLATAdmin() || ureq.getUserSession().getRoles().isGroupManager(); businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); areaManager = CoreSpringFactory.getImpl(BGAreaManager.class); @@ -164,6 +172,8 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle markManager = CoreSpringFactory.getImpl(MarkManager.class); collaborationTools = CollaborationToolsFactory.getInstance(); + this.userObject = userObject; + mainVC = createVelocityContainer(page); //table @@ -184,6 +194,18 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle putInitialPanel(mainVC); } + public Object getUserObject() { + return userObject; + } + + public BusinessGroupViewFilter getFilter() { + return filter; + } + + public void setFilter(BusinessGroupViewFilter filter) { + this.filter = filter; + } + protected abstract void initButtons(UserRequest ureq); protected void initButtons(UserRequest ureq, boolean create) { @@ -781,6 +803,14 @@ public abstract class AbstractBusinessGroupListController extends BasicControlle groups = new ArrayList<BusinessGroupView>(); } else { groups = businessGroupService.findBusinessGroupViews(params, getResource(), 0, -1); + + if(filter != null) { + for(Iterator<BusinessGroupView> groupIt=groups.iterator(); groupIt.hasNext(); ) { + if(!filter.accept(groupIt.next())) { + groupIt.remove(); + } + } + } } return groups; } diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java index 972d493216e..e13baf63e62 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java @@ -67,6 +67,7 @@ import org.olat.core.util.mail.MailPackage; import org.olat.core.util.session.UserSessionManager; import org.olat.course.member.MemberListController; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupMembership; import org.olat.group.BusinessGroupModule; import org.olat.group.BusinessGroupService; @@ -80,6 +81,7 @@ import org.olat.instantMessaging.model.Buddy; import org.olat.instantMessaging.model.Presence; import org.olat.modules.co.ContactFormController; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.model.RepositoryEntryMembership; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; @@ -119,6 +121,7 @@ public abstract class AbstractMemberListController extends BasicController imple private final boolean isLastVisitVisible; private final boolean isAdministrativeUser; private final boolean chatEnabled; + private final boolean globallyManaged; private final UserManager userManager; @@ -135,15 +138,18 @@ public abstract class AbstractMemberListController extends BasicController imple private final GroupMemberViewComparator memberViewComparator; private static final CourseMembershipComparator MEMBERSHIP_COMPARATOR = new CourseMembershipComparator(); - public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, String page) { + public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, + String page) { this(ureq, wControl, repoEntry, null, page); } - public AbstractMemberListController(UserRequest ureq, WindowControl wControl, BusinessGroup group, String page) { + public AbstractMemberListController(UserRequest ureq, WindowControl wControl, BusinessGroup group, + String page) { this(ureq, wControl, null, group, page); } - private AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, BusinessGroup group, String page) { + private AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, BusinessGroup group, + String page) { super(ureq, wControl, Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale())); this.businessGroup = group; @@ -160,6 +166,8 @@ public abstract class AbstractMemberListController extends BasicController imple imService = CoreSpringFactory.getImpl(InstantMessagingService.class); sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class); memberViewComparator = new GroupMemberViewComparator(Collator.getInstance(getLocale())); + + globallyManaged = calcGloballyManaged(); Roles roles = ureq.getUserSession().getRoles(); chatEnabled = imModule.isEnabled() && imModule.isPrivateEnabled(); @@ -180,15 +188,36 @@ public abstract class AbstractMemberListController extends BasicController imple MemberListTableModel memberListModel = new MemberListTableModel(userPropertyHandlers); memberListCtr.setTableDataModel(memberListModel); memberListCtr.setMultiSelect(true); - memberListCtr.addMultiSelectAction("table.header.edit", TABLE_ACTION_EDIT); + if(!globallyManaged) { + memberListCtr.addMultiSelectAction("table.header.edit", TABLE_ACTION_EDIT); + } memberListCtr.addMultiSelectAction("table.header.mail", TABLE_ACTION_MAIL); - memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE); + if(!globallyManaged) { + memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE); + } mainVC.put("memberList", memberListCtr.getInitialComponent()); putInitialPanel(mainVC); } + private boolean calcGloballyManaged() { + boolean managed = true; + if(businessGroup != null) { + managed &= BusinessGroupManagedFlag.isManaged(businessGroup, BusinessGroupManagedFlag.membersmanagement); + } + if(repoEntry != null) { + boolean managedEntry = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); + managed &= managedEntry; + + List<BusinessGroup> groups = businessGroupService.findBusinessGroups(null, repoEntry.getOlatResource(), 0, -1); + for(BusinessGroup group:groups) { + managed &= BusinessGroupManagedFlag.isManaged(group, BusinessGroupManagedFlag.membersmanagement); + } + } + return managed; + } + @Override protected void doDispose() { // @@ -244,7 +273,9 @@ public abstract class AbstractMemberListController extends BasicController imple memberListCtr.addColumnDescriptor(new GraduateColumnDescriptor("table.header.graduate", TABLE_ACTION_GRADUATE, getTranslator())); memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_EDIT, "table.header.edit", translate("table.header.edit"))); - memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_REMOVE, "table.header.remove", translate("table.header.remove"))); + if(!globallyManaged) { + memberListCtr.addColumnDescriptor(new LeaveColumnDescriptor("table.header.remove", TABLE_ACTION_REMOVE, getTranslator())); + } } @Override @@ -510,6 +541,8 @@ public abstract class AbstractMemberListController extends BasicController imple protected List<MemberView> updateTableModel(SearchMembersParams params) { //course membership + boolean managedMembersRepo = + RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); List<RepositoryEntryMembership> repoMemberships = repoEntry == null ? Collections.<RepositoryEntryMembership>emptyList() : repositoryManager.getRepositoryEntryMembership(repoEntry); @@ -634,6 +667,7 @@ public abstract class AbstractMemberListController extends BasicController imple if(memberView != null) { memberView.setFirstTime(membership.getCreationDate()); memberView.setLastTime(membership.getLastModified()); + memberView.getMembership().setManagedMembersRepo(managedMembersRepo); if(membership.getOwnerRepoKey() != null) { memberView.getMembership().setRepoOwner(true); } diff --git a/src/main/java/org/olat/group/ui/main/BGTableItem.java b/src/main/java/org/olat/group/ui/main/BGTableItem.java index d54bd3a96fd..2d6ad869aaa 100644 --- a/src/main/java/org/olat/group/ui/main/BGTableItem.java +++ b/src/main/java/org/olat/group/ui/main/BGTableItem.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.List; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupMembership; import org.olat.group.BusinessGroupShort; import org.olat.group.BusinessGroupView; @@ -110,6 +111,10 @@ public class BGTableItem { return businessGroup.isAutoCloseRanksEnabled(); } + public BusinessGroupManagedFlag[] getManagedFlags() { + return businessGroup.getManagedFlags(); + } + public boolean isFull() { Integer maxParticipants = businessGroup.getMaxParticipants(); if(maxParticipants == null || maxParticipants.intValue() <= 0) { @@ -208,6 +213,7 @@ public class BGTableItem { private long numOfPendings; private final boolean waitingListEnabled; private final boolean autoCloseRanksEnabled; + private final BusinessGroupManagedFlag[] managedflags; public BGShort(BusinessGroup group) { key = group.getKey(); @@ -215,6 +221,7 @@ public class BGTableItem { maxParticipants = group.getMaxParticipants(); waitingListEnabled = group.getWaitingListEnabled() == null ? false : group.getWaitingListEnabled().booleanValue(); autoCloseRanksEnabled = group.getAutoCloseRanksEnabled() == null ? false : group.getAutoCloseRanksEnabled().booleanValue(); + managedflags = group.getManagedFlags(); } public BGShort(BusinessGroupView group) { @@ -227,6 +234,7 @@ public class BGTableItem { numOfPendings = group.getNumOfPendings(); waitingListEnabled = group.getWaitingListEnabled() == null ? false : group.getWaitingListEnabled().booleanValue(); autoCloseRanksEnabled = group.getAutoCloseRanksEnabled() == null ? false : group.getAutoCloseRanksEnabled().booleanValue(); + managedflags = group.getManagedFlags(); } @Override @@ -277,6 +285,11 @@ public class BGTableItem { return autoCloseRanksEnabled; } + @Override + public BusinessGroupManagedFlag[] getManagedFlags() { + return managedflags; + } + @Override public int hashCode() { return key.hashCode(); diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java b/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java index 56f3e500991..1624285e887 100644 --- a/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java +++ b/src/main/java/org/olat/group/ui/main/BusinessGroupTableModelWithType.java @@ -34,6 +34,7 @@ import org.olat.core.gui.components.table.DefaultTableDataModel; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Formatter; import org.olat.core.util.filter.FilterFactory; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupMembership; /** @@ -74,10 +75,26 @@ public class BusinessGroupTableModelWithType extends DefaultTableDataModel<BGTab description = FilterFactory.getHtmlTagsFilter().filter(description); description = Formatter.truncate(description, 256); return description; - case allowLeave: - return wrapped.getAllowLeave(); - case allowDelete: - return wrapped.getAllowDelete(); + case allowLeave: { + Boolean allowed = wrapped.getAllowLeave(); + if(allowed != null && allowed.booleanValue()) { + //check managed groups + if(BusinessGroupManagedFlag.isManaged(wrapped.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement)) { + return Boolean.FALSE; + } + } + return allowed; + } + case allowDelete: { + Boolean allowed = wrapped.getAllowDelete(); + if(allowed != null && allowed.booleanValue()) { + //check managed groups + if(BusinessGroupManagedFlag.isManaged(wrapped.getManagedFlags(), BusinessGroupManagedFlag.delete)) { + return Boolean.FALSE; + } + } + return allowed; + } case resources: return wrapped; //fxdiff VCRP-1,2: access control of resources diff --git a/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java b/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java new file mode 100644 index 00000000000..1213ec37a91 --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/BusinessGroupViewFilter.java @@ -0,0 +1,34 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group.ui.main; + +import org.olat.group.BusinessGroupView; + +/** + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface BusinessGroupViewFilter { + + public boolean accept(BusinessGroupView view); + +} diff --git a/src/main/java/org/olat/group/ui/main/CourseMembership.java b/src/main/java/org/olat/group/ui/main/CourseMembership.java index 66f1c543ee7..926e0ed192e 100644 --- a/src/main/java/org/olat/group/ui/main/CourseMembership.java +++ b/src/main/java/org/olat/group/ui/main/CourseMembership.java @@ -32,6 +32,7 @@ public class CourseMembership { private boolean groupParticipant; private boolean groupWaiting; private boolean pending; + private boolean managedMembersRepo; public CourseMembership() { // @@ -61,6 +62,14 @@ public class CourseMembership { this.pending = pending; } + public boolean isManagedMembersRepo() { + return managedMembersRepo; + } + + public void setManagedMembersRepo(boolean managedMembersRepo) { + this.managedMembersRepo = managedMembersRepo; + } + public boolean isRepoOwner() { return repoOwner; } 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 ba584a93c33..10f9d7ab167 100644 --- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java +++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java @@ -47,12 +47,14 @@ import org.olat.course.member.PermissionHelper; import org.olat.course.member.PermissionHelper.BGPermission; import org.olat.course.member.PermissionHelper.RepoPermission; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupMembership; import org.olat.group.BusinessGroupService; import org.olat.group.BusinessGroupView; import org.olat.group.model.BusinessGroupMembershipChange; import org.olat.group.model.SearchBusinessGroupParams; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.model.RepositoryEntryMembership; import org.olat.resource.OLATResource; @@ -168,11 +170,12 @@ public class EditMembershipController extends FormBasicController { Collections.<BusinessGroupMembership>emptyList() : businessGroupService.getBusinessGroupMembership(businessGroupKeys, member); List<MemberOption> options = new ArrayList<MemberOption>(); for(BusinessGroupView group:groups) { + boolean managed = BusinessGroupManagedFlag.isManaged(group.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement); MemberOption option = new MemberOption(group); BGPermission bgPermission = PermissionHelper.getPermission(group.getKey(), member, groupMemberships); - option.setTutor(createSelection(bgPermission.isTutor(), true)); - option.setParticipant(createSelection(bgPermission.isParticipant(), true)); - boolean waitingListEnable = group.getWaitingListEnabled() != null && group.getWaitingListEnabled().booleanValue(); + option.setTutor(createSelection(bgPermission.isTutor(), !managed)); + option.setParticipant(createSelection(bgPermission.isParticipant(), !managed)); + boolean waitingListEnable = !managed && group.getWaitingListEnabled() != null && group.getWaitingListEnabled().booleanValue(); option.setWaiting(createSelection(bgPermission.isWaitingList(), waitingListEnable)); options.add(option); } @@ -204,7 +207,9 @@ public class EditMembershipController extends FormBasicController { String[] repoValues = new String[] { translate("role.repo.owner"), translate("role.repo.tutor"), translate("role.repo.participant") }; + boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); repoRightsEl = uifactory.addCheckboxesVertical("repoRights", formLayout, repoRightsKeys, repoValues, null, 1); + repoRightsEl.setEnabled(!managed); if(member != null) { RepoPermission repoPermission = PermissionHelper.getPermission(repoEntry, member, memberships); repoRightsEl.select("owner", repoPermission.isOwner()); diff --git a/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java b/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java new file mode 100644 index 00000000000..e3507315c63 --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/LeaveColumnDescriptor.java @@ -0,0 +1,63 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group.ui.main; + +import org.olat.core.gui.components.table.DefaultColumnDescriptor; +import org.olat.core.gui.render.Renderer; +import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.translator.Translator; + +/** + * + * Check the managed flags to present the link or not. + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class LeaveColumnDescriptor extends DefaultColumnDescriptor { + + private final Translator translator; + + public LeaveColumnDescriptor(String headerKey, String action, Translator translator) { + super(headerKey, 1, action, translator.getLocale()); + this.translator = translator; + } + + @Override + public String getAction(int row) { + int sortedRow = table.getSortedRow(row); + MemberView membership = (MemberView)table.getTableDataModel() + .getValueAt(sortedRow, MemberListTableModel.Cols.groups.ordinal()); + + return membership.isFullyManaged() ? null : super.getAction(row); + } + + @Override + public void renderValue(StringOutput sb, int row, Renderer renderer) { + int sortedRow = table.getSortedRow(row); + MemberView membership = (MemberView)table.getTableDataModel() + .getValueAt(sortedRow, MemberListTableModel.Cols.groups.ordinal()); + + if(!membership.isFullyManaged()) { + sb.append(translator.translate(getHeaderKey())); + } + } +} diff --git a/src/main/java/org/olat/group/ui/main/MemberView.java b/src/main/java/org/olat/group/ui/main/MemberView.java index 655412eb16e..7f129051640 100644 --- a/src/main/java/org/olat/group/ui/main/MemberView.java +++ b/src/main/java/org/olat/group/ui/main/MemberView.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.List; import org.olat.core.id.Identity; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupShort; /** @@ -79,6 +80,22 @@ public class MemberView { groups.add(group); } + public boolean isFullyManaged() { + if(membership != null && !membership.isManagedMembersRepo() && + (membership.isRepoOwner() || membership.isRepoTutor() || membership.isRepoParticipant())) { + return false; + } + + if(groups != null) { + for(BusinessGroupShort group:groups) { + if(!BusinessGroupManagedFlag.isManaged(group.getManagedFlags(), BusinessGroupManagedFlag.membersmanagement)) { + return false; + } + } + } + return true; + } + public Date getFirstTime() { return firstTime; } diff --git a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java index 262e3a43e0b..40cb53717d4 100644 --- a/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java +++ b/src/main/java/org/olat/group/ui/main/SelectBusinessGroupController.java @@ -62,9 +62,15 @@ public class SelectBusinessGroupController extends BasicController { private final boolean enableCreate; private Object userObject; - + private final BusinessGroupViewFilter filter; + public SelectBusinessGroupController(UserRequest ureq, WindowControl wControl) { + this(ureq, wControl, null); + } + + public SelectBusinessGroupController(UserRequest ureq, WindowControl wControl, BusinessGroupViewFilter filter) { super(ureq, wControl); + this.filter = filter; enableCreate = CoreSpringFactory.getImpl(BusinessGroupModule.class) .isAllowedCreate(ureq.getUserSession().getRoles()); mainVC = createVelocityContainer("group_list_overview"); @@ -74,7 +80,7 @@ public class SelectBusinessGroupController extends BasicController { mainVC.put("create", createGroup); } - boolean marked = updateMarkedGroups(ureq).updateMarkedGroups(); + boolean marked = updateMarkedGroups(ureq); if(!marked) { updateOwnedGroups(ureq); } @@ -177,53 +183,54 @@ public class SelectBusinessGroupController extends BasicController { listenTo(cmc); } - private SelectFavoritBusinessGroupController updateMarkedGroups(UserRequest ureq) { + private boolean updateMarkedGroups(UserRequest ureq) { if(favoritGroupsCtrl == null) { favoritGroupsCtrl = new SelectFavoritBusinessGroupController(ureq, getWindowControl()); + favoritGroupsCtrl.setFilter(filter); listenTo(favoritGroupsCtrl); } - favoritGroupsCtrl.updateMarkedGroups(); + boolean markedFound = favoritGroupsCtrl.updateMarkedGroups(); mainVC.put("groupList", favoritGroupsCtrl.getInitialComponent()); - return favoritGroupsCtrl; + return markedFound; } - private SelectOwnedBusinessGroupController updateOwnedGroups(UserRequest ureq) { + private void updateOwnedGroups(UserRequest ureq) { if(ownedGroupsCtrl == null) { ownedGroupsCtrl = new SelectOwnedBusinessGroupController(ureq, getWindowControl()); + ownedGroupsCtrl.setFilter(filter); listenTo(ownedGroupsCtrl); } ownedGroupsCtrl.updateOwnedGroups(); mainVC.put("groupList", ownedGroupsCtrl.getInitialComponent()); - return ownedGroupsCtrl; } - private SelectBusinessGroupCourseAuthorController updateCourseGroups(UserRequest ureq) { + private void updateCourseGroups(UserRequest ureq) { if(authorGroupsCtrL == null) { authorGroupsCtrL = new SelectBusinessGroupCourseAuthorController(ureq, getWindowControl()); + authorGroupsCtrL.setFilter(filter); listenTo(authorGroupsCtrL); } authorGroupsCtrL.updateOwnedGroups(); mainVC.put("groupList", authorGroupsCtrL.getInitialComponent()); - return authorGroupsCtrL; } - private SelectSearchBusinessGroupController updateSearch(UserRequest ureq) { + private void updateSearch(UserRequest ureq) { if(searchGroupsCtrl == null) { searchGroupsCtrl = new SelectSearchBusinessGroupController(ureq, getWindowControl(), true); + searchGroupsCtrl.setFilter(filter); listenTo(searchGroupsCtrl); } searchGroupsCtrl.updateSearch(ureq); mainVC.put("groupList", searchGroupsCtrl.getInitialComponent()); - return searchGroupsCtrl; } - private SelectSearchBusinessGroupController updateAdminSearch(UserRequest ureq) { + private void updateAdminSearch(UserRequest ureq) { if(searchAdminGroupsCtrl == null) { searchAdminGroupsCtrl = new SelectSearchBusinessGroupController(ureq, getWindowControl(), false); + searchAdminGroupsCtrl.setFilter(filter); listenTo(searchAdminGroupsCtrl); } searchAdminGroupsCtrl.updateSearch(ureq); mainVC.put("groupList", searchAdminGroupsCtrl.getInitialComponent()); - return searchAdminGroupsCtrl; } } diff --git a/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java b/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java new file mode 100644 index 00000000000..ea6511e9a5b --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/UnmanagedGroupFilter.java @@ -0,0 +1,44 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group.ui.main; + +import org.olat.group.BusinessGroupManagedFlag; +import org.olat.group.BusinessGroupView; + +/** + * Accept only NOT managed groups. + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class UnmanagedGroupFilter implements BusinessGroupViewFilter { + + private final BusinessGroupManagedFlag flag; + + public UnmanagedGroupFilter(BusinessGroupManagedFlag flag) { + this.flag = flag; + } + + @Override + public boolean accept(BusinessGroupView view) { + return !BusinessGroupManagedFlag.isManaged(view.getManagedFlags(), flag); + } +} diff --git a/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java b/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java index 16387c2cec3..8ddc5a48e5a 100644 --- a/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java +++ b/src/main/java/org/olat/group/ui/wizard/BGCopyBusinessGroup.java @@ -20,6 +20,7 @@ package org.olat.group.ui.wizard; import org.olat.group.BusinessGroup; +import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupShort; /** @@ -68,6 +69,11 @@ public class BGCopyBusinessGroup implements BusinessGroupShort { this.name = name; } + @Override + public BusinessGroupManagedFlag[] getManagedFlags() { + return BusinessGroupManagedFlag.EMPTY_ARRAY; + } + public String getDescription() { return description; } diff --git a/src/main/java/org/olat/repository/PropPupForm.java b/src/main/java/org/olat/repository/PropPupForm.java index 72585faf035..0fe468b067c 100644 --- a/src/main/java/org/olat/repository/PropPupForm.java +++ b/src/main/java/org/olat/repository/PropPupForm.java @@ -180,18 +180,24 @@ public class PropPupForm extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + final boolean managedSettings = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.settings); + canCopy = uifactory.addCheckboxesVertical("cif_canCopy", "cif.canCopy", formLayout, new String[]{"xx"}, new String[]{null}, null, 1); canCopy.select("xx", entry.getCanCopy()); + canCopy.setEnabled(!managedSettings); canReference = uifactory.addCheckboxesVertical("cif_canReference", "cif.canReference", formLayout, new String[]{"xx"}, new String[]{null}, null, 1); canReference.select("xx", entry.getCanReference()); + canReference.setEnabled(!managedSettings); canLaunch = uifactory.addCheckboxesVertical("cif_canLaunch", "cif.canLaunch", formLayout, new String[]{"xx"}, new String[]{null}, null, 1); canLaunch.select("xx", entry.getCanLaunch()); + canLaunch.setEnabled(!managedSettings); canLaunch.setVisible(handler != null && handler.supportsLaunch(this.entry)); canDownload = uifactory.addCheckboxesVertical("cif_canDownload", "cif.canDownload", formLayout, new String[]{"xx"}, new String[]{null}, null, 1); canDownload.select("xx", entry.getCanDownload()); + canLaunch.setEnabled(!managedSettings); canDownload.setVisible(handler != null && handler.supportsDownload(this.entry)); access = uifactory.addRadiosVertical("cif_access", "cif.access", formLayout, keys, values); @@ -202,8 +208,12 @@ public class PropPupForm extends FormBasicController { } else { access.select(Integer.toString(entry.getAccess()), true); } + final boolean managedAccess = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.access); + access.setEnabled(!managedAccess); - uifactory.addFormSubmitButton("submit", formLayout); + if(!managedAccess || !managedSettings) { + uifactory.addFormSubmitButton("submit", formLayout); + } } @Override diff --git a/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml b/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml index cb6af134f2b..949f0562f4a 100644 --- a/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml +++ b/src/main/java/org/olat/repository/RepositoryEntry.hbm.xml @@ -29,7 +29,7 @@ <property name="externalId" column="external_id" unique="false" not-null="false" type="string"/> <property name="externalRef" column="external_ref" unique="false" not-null="false" type="string"/> - <property name="managedFlags" column="managed_flags" unique="false" not-null="false" type="string"/> + <property name="managedFlagsString" column="managed_flags" unique="false" not-null="false" type="string"/> <many-to-one name="olatResource" column="fk_olatresource" diff --git a/src/main/java/org/olat/repository/RepositoryEntry.java b/src/main/java/org/olat/repository/RepositoryEntry.java index a8dee8b6813..47c9f0bd52b 100644 --- a/src/main/java/org/olat/repository/RepositoryEntry.java +++ b/src/main/java/org/olat/repository/RepositoryEntry.java @@ -79,7 +79,7 @@ public class RepositoryEntry extends PersistentObject implements ModifiedInfo, O private String externalId; private String externalRef; - private String managedFlags; + private String managedFlagsString; private RepositoryEntryLifecycle lifecycle; private int access; @@ -410,12 +410,17 @@ public class RepositoryEntry extends PersistentObject implements ModifiedInfo, O this.externalRef = externalRef; } - public String getManagedFlags() { - return managedFlags; + public RepositoryEntryManagedFlag[] getManagedFlags() { + return RepositoryEntryManagedFlag.toEnum(managedFlagsString); } - public void setManagedFlags(String managedFlags) { - this.managedFlags = managedFlags; + + public String getManagedFlagsString() { + return managedFlagsString; + } + + public void setManagedFlagsString(String managedFlagsString) { + this.managedFlagsString = managedFlagsString; } public RepositoryEntryLifecycle getLifecycle() { diff --git a/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java b/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java new file mode 100644 index 00000000000..5245bfecf6f --- /dev/null +++ b/src/main/java/org/olat/repository/RepositoryEntryManagedFlag.java @@ -0,0 +1,131 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.repository; + +import java.util.Arrays; + +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; + +/** + * + * Initial date: 11.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public enum RepositoryEntryManagedFlag { + + all, + editcontent(all), + details(all),//details tab + title(details,all), + description(details,all), + settings(all),//max num of participants... + access(settings,all), + chat(settings,all), + layout(settings,all), + resourcefolder(settings,all), + efficencystatement(settings,all), + calendar(settings,all), + glossary(settings,all), + bookings(all),// change booking rules + membersmanagement(all), + groups(all), + close(all), + delete(all); + + + private RepositoryEntryManagedFlag[] parents; + private static final OLog log = Tracing.createLoggerFor(RepositoryEntryManagedFlag.class); + public static final RepositoryEntryManagedFlag[] EMPTY_ARRAY = new RepositoryEntryManagedFlag[0]; + + private RepositoryEntryManagedFlag() { + // + } + + private RepositoryEntryManagedFlag(RepositoryEntryManagedFlag... parents) { + if(parents == null) { + this.parents = new RepositoryEntryManagedFlag[0]; + } else { + this.parents = parents; + } + } + + public static RepositoryEntryManagedFlag[] toEnum(String flags) { + if(StringHelper.containsNonWhitespace(flags)) { + String[] flagArr = flags.split(","); + RepositoryEntryManagedFlag[] flagEnums = new RepositoryEntryManagedFlag[flagArr.length]; + + int count = 0; + for(String flag:flagArr) { + if(StringHelper.containsNonWhitespace(flag)) { + try { + RepositoryEntryManagedFlag flagEnum = valueOf(flag); + flagEnums[count++] = flagEnum; + } catch (Exception e) { + log.warn("Cannot parse this managed flag: " + flag, e); + } + } + } + + if(count != flagEnums.length) { + flagEnums = Arrays.copyOf(flagEnums, count); + } + return flagEnums; + } else { + return EMPTY_ARRAY; + } + } + + public static boolean isManaged(RepositoryEntry re, RepositoryEntryManagedFlag marker) { + if(re != null && (contains(re, marker) || contains(re, marker.parents))) { + return true; + } + return false; + } + + public static boolean isManaged(RepositoryEntryManagedFlag[] flags, RepositoryEntryManagedFlag marker) { + if(flags != null && (contains(flags, marker) || contains(flags, marker.parents))) { + return true; + } + return false; + } + + private static boolean contains(RepositoryEntry re, RepositoryEntryManagedFlag... markers) { + if(re == null) return false; + RepositoryEntryManagedFlag[] flags = re.getManagedFlags(); + return contains(flags, markers); + } + + private static boolean contains(RepositoryEntryManagedFlag[] flags, RepositoryEntryManagedFlag... markers) { + if(flags == null || flags.length == 0) return false; + + for(RepositoryEntryManagedFlag flag:flags) { + for(RepositoryEntryManagedFlag marker:markers) { + if(flag.equals(marker)) { + return true; + } + } + } + return false; + } + +} diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java index 5972c341622..d561a53f783 100644 --- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java +++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java @@ -102,16 +102,23 @@ public class ReferencableEntriesSearchController extends BasicController { private final boolean canCreate; public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String limitType, String commandLabel) { - this(wControl, ureq, new String[]{limitType},commandLabel, true, true, true, false, false); + this(wControl, ureq, new String[]{limitType}, null, commandLabel, true, true, true, false, false); setBasePackage(RepositoryManager.class); } public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel) { - this(wControl, ureq, limitTypes,commandLabel, true, true, true, false, false); + this(wControl, ureq, limitTypes, null, commandLabel, true, true, true, false, false); } - + public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, String[] limitTypes, String commandLabel, boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) { + this(wControl, ureq, limitTypes, null, commandLabel, canImport, canCreate, canDirectLaunch, multiSelect, adminSearch); + } + + public ReferencableEntriesSearchController(WindowControl wControl, UserRequest ureq, + String[] limitTypes, RepositoryEntryFilter filter, String commandLabel, + boolean canImport, boolean canCreate, boolean canDirectLaunch, boolean multiSelect, boolean adminSearch) { + super(ureq, wControl); this.canImport = canImport; this.canCreate = canCreate; @@ -124,7 +131,7 @@ public class ReferencableEntriesSearchController extends BasicController { } // add repo search controller - searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, canDirectLaunch, multiSelect, limitTypes); + searchCtr = new RepositorySearchController(commandLabel, ureq, getWindowControl(), false, canDirectLaunch, multiSelect, limitTypes, filter); listenTo(searchCtr); // do instantiate buttons diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java index d4f03e6c2f4..b4493dad0fb 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java @@ -90,6 +90,7 @@ import org.olat.repository.DisplayCourseInfoForm; import org.olat.repository.DisplayInfoForm; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryIconRenderer; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryEntryStatus; import org.olat.repository.RepositoryManager; import org.olat.repository.handlers.CourseHandler; @@ -497,7 +498,11 @@ public class RepositoryDetailsController extends BasicController implements Gene detailsToolC.addLink(ACTION_ADD_CATALOG, translate("details.catadd"), TOOL_CATALOG, null, "o_sel_repo_add_to_catalog", false); detailsToolC.addHeader(translate("table.action")); - if ((OresHelper.isOfType(repositoryEntry.getOlatResource(), CourseModule.class)) && (!RepositoryManager.getInstance().createRepositoryEntryStatus(repositoryEntry.getStatusCode()).isClosed())) { + + boolean closeManaged = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.close); + if ((OresHelper.isOfType(repositoryEntry.getOlatResource(), CourseModule.class)) + && !closeManaged + && (!RepositoryManager.getInstance().createRepositoryEntryStatus(repositoryEntry.getStatusCode()).isClosed())) { detailsToolC.addLink(ACTION_CLOSE_RESSOURCE, translate("details.close.ressoure"), TOOL_CLOSE_RESSOURCE, null, "o_sel_repo_close_resource", false); if(corrupted) { detailsToolC.setEnabled(TOOL_CLOSE_RESSOURCE, false); @@ -524,7 +529,8 @@ public class RepositoryDetailsController extends BasicController implements Gene } // enable if(isAuthor) { - detailsToolC.setEnabled(TOOL_EDIT, handler.supportsEdit(repositoryEntry) && !corrupted); + boolean editManaged = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.editcontent); + detailsToolC.setEnabled(TOOL_EDIT, handler.supportsEdit(repositoryEntry) && !corrupted && !editManaged); detailsToolC.setEnabled(TOOL_CHDESC, !corrupted); detailsToolC.setEnabled(TOOL_CHPROP, !corrupted); } diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java index 31b468420c1..8e38c3c9afa 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryEditDescriptionController.java @@ -42,6 +42,7 @@ import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.components.image.ImageFormItem; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.control.Controller; @@ -56,6 +57,7 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSMediaResource; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryIconRenderer; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.resource.OLATResource; import org.olat.user.UserManager; @@ -79,6 +81,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { private RichTextElement description; private ImageFormItem imageEl; private FormLink deleteImage; + private FormSubmit submit; private final UserManager userManager; private final RepositoryManager repositoryManager; @@ -142,14 +145,18 @@ public class RepositoryEditDescriptionController extends FormBasicController { displayName = uifactory.addTextElement("cif.displayname", "cif.displayname", 100, repositoryEntry.getDisplayname(), descCont); displayName.setDisplaySize(30); displayName.setMandatory(true); + displayName.setEnabled(!RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.title)); String desc = (repositoryEntry.getDescription() != null ? repositoryEntry.getDescription() : " "); description = uifactory.addRichTextElementForStringDataMinimalistic("cif.description", "cif.description", desc, 10, -1, false, descCont, ureq.getUserSession(), getWindowControl()); + description.setEnabled(!RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.description)); description.setMandatory(true); uifactory.addSpacerElement("spacer2", descCont, false); + boolean managed = RepositoryEntryManagedFlag.isManaged(repositoryEntry, RepositoryEntryManagedFlag.details); + VFSLeaf img = repositoryManager.getImage(repositoryEntry); imageEl = new ImageFormItem("imageEl"); imageEl.setLabel("rentry.pic", null); @@ -163,7 +170,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { descCont.add(imageEl); deleteImage = uifactory.addFormLink("delete", "cmd.delete", null, descCont, Link.BUTTON); - deleteImage.setVisible(img != null); + deleteImage.setVisible(img != null && !managed); fileUpload = uifactory.addFileElement("rentry.pic", "rentry.pic", descCont); if(img != null) { @@ -171,6 +178,7 @@ public class RepositoryEditDescriptionController extends FormBasicController { } fileUpload.setMaxUploadSizeKB(picUploadlimitKB, null, null); fileUpload.addActionListener(this, FormEvent.ONCHANGE); + fileUpload.setVisible(!managed); Set<String> mimeTypes = new HashSet<String>(); mimeTypes.add("image/gif"); @@ -182,7 +190,8 @@ public class RepositoryEditDescriptionController extends FormBasicController { FormLayoutContainer buttonContainer = FormLayoutContainer.createButtonLayout("buttonContainer", getTranslator()); formLayout.add("buttonContainer", buttonContainer); buttonContainer.setElementCssClass("o_sel_repo_save_details"); - uifactory.addFormSubmitButton("submit", buttonContainer); + submit = uifactory.addFormSubmitButton("submit", buttonContainer); + submit.setVisible(!managed); if (!isSubWorkflow) { uifactory.addFormCancelButton("cancel", buttonContainer, ureq, getWindowControl()); } diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java index 6760f8d193d..a3e6f338a72 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryEditPropertiesController.java @@ -91,6 +91,7 @@ import org.olat.modules.scorm.ScormMainManager; import org.olat.modules.scorm.ScormPackageConfig; import org.olat.repository.PropPupForm; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.resource.accesscontrol.ui.AccessConfigurationController; import org.olat.resource.references.ReferenceImpl; @@ -173,7 +174,9 @@ public class RepositoryEditPropertiesController extends BasicController implemen editproptabpubVC.put("proppupform", propPupForm.getInitialComponent()); //fxdiff VCRP-1,2: access control of resources - acCtr = new AccessConfigurationController(ureq, getWindowControl(), repositoryEntry.getOlatResource(), repositoryEntry.getDisplayname(), true); + boolean managedBookings = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.bookings); + acCtr = new AccessConfigurationController(ureq, getWindowControl(), repositoryEntry.getOlatResource(), repositoryEntry.getDisplayname(), + true, !managedBookings); int access = propPupForm.getAccess(); if(access == RepositoryEntry.ACC_USERS || access == RepositoryEntry.ACC_USERS_GUESTS) { editproptabpubVC.put("accesscontrol", acCtr.getInitialComponent()); @@ -208,28 +211,37 @@ public class RepositoryEditPropertiesController extends BasicController implemen // and course chat is enabled. InstantMessagingModule imModule = CoreSpringFactory.getImpl(InstantMessagingModule.class); if (imModule.isEnabled() && imModule.isCourseEnabled() && CourseModule.isCourseChatEnabled()) { - ccc = new CourseChatSettingController(ureq, getWindowControl(), changedCourseConfig); + boolean managedChat = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.chat); + ccc = new CourseChatSettingController(ureq, getWindowControl(), changedCourseConfig, !managedChat); listenTo(ccc); // push on controller stack and register <this> as controllerlistener tabbedPane.addTab(translate("tab.chat"), ccc.getInitialComponent()); } - clayoutC = new CourseLayoutGeneratorController(ureq, getWindowControl(), changedCourseConfig, course.getCourseEnvironment()); + + boolean managedLayout = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.layout); + clayoutC = new CourseLayoutGeneratorController(ureq, getWindowControl(), changedCourseConfig, + course.getCourseEnvironment(), !managedLayout); listenTo(clayoutC); tabbedPane.addTab(translate("tab.layout"), clayoutC.getInitialComponent()); - csfC = new CourseSharedFolderController(ureq, getWindowControl(), changedCourseConfig); + boolean managedFolder = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.resourcefolder); + csfC = new CourseSharedFolderController(ureq, getWindowControl(), changedCourseConfig, !managedFolder); listenTo(csfC); tabbedPane.addTab(translate("tab.sharedfolder"), csfC.getInitialComponent()); - ceffC = new CourseEfficencyStatementController(ureq, getWindowControl(), changedCourseConfig); + boolean managedStatement = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.efficencystatement); + ceffC = new CourseEfficencyStatementController(ureq, getWindowControl(), changedCourseConfig, !managedStatement); listenTo(ceffC); efficiencyConfigPos = tabbedPane.addTab(translate("tab.efficencystatement"), ceffC.getInitialComponent()); - - calCfgCtr = new CourseCalendarConfigController(ureq, getWindowControl(), changedCourseConfig); + + boolean managedCalendar = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.calendar); + calCfgCtr = new CourseCalendarConfigController(ureq, getWindowControl(), changedCourseConfig, !managedCalendar); listenTo(calCfgCtr); tabbedPane.addTab(translate("tab.calendar"), calCfgCtr.getInitialComponent()); - cglosCtr = new CourseConfigGlossaryController(ureq, getWindowControl(), changedCourseConfig, course.getResourceableId()); + boolean managedGlossary = RepositoryEntryManagedFlag.isManaged(entry, RepositoryEntryManagedFlag.glossary); + cglosCtr = new CourseConfigGlossaryController(ureq, getWindowControl(), changedCourseConfig, + course.getResourceableId(), !managedGlossary); listenTo(cglosCtr); tabbedPane.addTab(translate("tab.glossary"), cglosCtr.getInitialComponent()); } diff --git a/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java b/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java new file mode 100644 index 00000000000..6060066120c --- /dev/null +++ b/src/main/java/org/olat/repository/controllers/RepositoryEntryFilter.java @@ -0,0 +1,34 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.repository.controllers; + +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 12.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public interface RepositoryEntryFilter { + + public boolean accept(RepositoryEntry re); + +} diff --git a/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java b/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java index 0185d756e86..a7253e1e7cf 100644 --- a/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java +++ b/src/main/java/org/olat/repository/controllers/RepositoryMembersController.java @@ -46,6 +46,7 @@ import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.MemberPermissionChangeEvent; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; @@ -58,7 +59,7 @@ public class RepositoryMembersController extends AbstractMemberListController { private final SearchMembersParams params; private final RepositoryEntry repoEntry; - private final Link importMemberLink, addMemberLink; + private Link importMemberLink, addMemberLink; private StepsMainRunController importMembersWizard; private final RepositoryManager repositoryManager; @@ -71,11 +72,14 @@ public class RepositoryMembersController extends AbstractMemberListController { businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); this.repoEntry = repoEntry; + boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); addMemberLink = LinkFactory.createButton("add.member", mainVC, this); + addMemberLink.setVisible(!managed); mainVC.put("addMembers", addMemberLink); importMemberLink = LinkFactory.createButton("import.member", mainVC, this); + importMemberLink.setVisible(!managed); mainVC.put("importMembers", importMemberLink); - + params = new SearchMembersParams(true, true, true, true, true, true, true); reloadModel(); } diff --git a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java index d0e303c16ab..459ddc4964b 100644 --- a/src/main/java/org/olat/repository/controllers/RepositorySearchController.java +++ b/src/main/java/org/olat/repository/controllers/RepositorySearchController.java @@ -93,6 +93,7 @@ public class RepositorySearchController extends BasicController implements Activ private boolean enableSearchforAllReferencalbeInSearchForm = false; private Link loginLink; private SearchType searchType; + private RepositoryEntryFilter filter; /** @@ -107,7 +108,7 @@ public class RepositorySearchController extends BasicController implements Activ boolean withCancel, boolean enableDirectLaunch, boolean multiSelect) { //fxdiff VCRP-10: repository search with type filter super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale())); - init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, new String[]{}); + init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, new String[]{}, null); } /** @@ -121,14 +122,14 @@ public class RepositorySearchController extends BasicController implements Activ */ public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl, boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String limitType) { - this(selectButtonLabel, ureq, myWControl, withCancel, enableDirectLaunch, multiSelect, new String[]{limitType}); + this(selectButtonLabel, ureq, myWControl, withCancel, enableDirectLaunch, multiSelect, new String[]{limitType}, null); } public RepositorySearchController(String selectButtonLabel, UserRequest ureq, WindowControl myWControl, - boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes) { + boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes, RepositoryEntryFilter filter) { //fxdiff VCRP-10: repository search with type filter super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale())); - init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, limitTypes); + init(selectButtonLabel, ureq, withCancel, enableDirectLaunch, multiSelect, limitTypes, filter); } /** @@ -139,7 +140,10 @@ public class RepositorySearchController extends BasicController implements Activ super(ureq, myWControl, Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale())); } - private void init(String selectButtonLabel, UserRequest ureq, boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, String[] limitTypes) { + private void init(String selectButtonLabel, UserRequest ureq, boolean withCancel, boolean enableDirectLaunch, boolean multiSelect, + String[] limitTypes, RepositoryEntryFilter filter) { + + this.filter = filter; translator = Util.createPackageTranslator(RepositoryManager.class, ureq.getLocale()); Roles roles = ureq.getUserSession().getRoles(); @@ -223,6 +227,16 @@ public class RepositorySearchController extends BasicController implements Activ DispatcherAction.redirectToDefaultDispatcher(ureq.getHttpResp()); } } + + private void filterRepositoryEntries(List<RepositoryEntry> entries) { + if(filter != null && entries != null && !entries.isEmpty()) { + for(Iterator<RepositoryEntry> entryIt=entries.iterator(); entryIt.hasNext(); ) { + if(!filter.accept(entryIt.next())) { + entryIt.remove(); + } + } + } + } /** * Implementation normal search: find repo entries that are public @@ -245,10 +259,7 @@ public class RepositorySearchController extends BasicController implements Activ restrictedTypes, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, null)); List<RepositoryEntry> entries = rm.genericANDQueryWithRolesRestriction(params, 0, -1, true); - //List<RepositoryEntry> entries = rm.genericANDQueryWithRolesRestriction(searchForm.getDisplayName(), searchForm.getAuthor(), - // searchForm.getDescription(), restrictedTypes, ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getIdentity().getUser().getProperty(UserConstants.INSTITUTIONALNAME, null)); - - //fxdiff VCRP-1,2: access control of resources + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); //fxdiff VCRP-10: repository search with type filter if(updateFilters) { @@ -285,6 +296,7 @@ public class RepositorySearchController extends BasicController implements Activ } else { entries = rm.queryReferencableResourcesLimitType(ident, roles, restrictedTypes, name, author, desc); } + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); //fxdiff VCRP-10: repository search with type filter if(updateFilters) { @@ -327,7 +339,7 @@ public class RepositorySearchController extends BasicController implements Activ restrictedTypes.addAll(Arrays.asList(limitTypes)); } List<RepositoryEntry> entries = rm.queryReferencableResourcesLimitType(owner, roles, restrictedTypes, null, null, null); - + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); //fxdiff VCRP-10: repository search with type filter tableCtr.setFilters(null, null); @@ -364,6 +376,7 @@ public class RepositorySearchController extends BasicController implements Activ searchType = SearchType.byOwner; RepositoryManager rm = RepositoryManager.getInstance(); List<RepositoryEntry> entries = rm.queryByOwner(owner, limitTypes); + filterRepositoryEntries(entries); if(updateFilters) { updateFilters(entries, owner); } @@ -381,7 +394,7 @@ public class RepositorySearchController extends BasicController implements Activ RepositoryManager rm = RepositoryManager.getInstance(); //fxdiff VCRP-1,2: access control of resources List<RepositoryEntry> entries = rm.queryByOwnerLimitAccess(owner, RepositoryEntry.ACC_USERS, Boolean.TRUE); - + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); //fxdiff VCRP-10: repository search with type filter tableCtr.setFilters(null, null); @@ -399,6 +412,7 @@ public class RepositorySearchController extends BasicController implements Activ searchType = null; RepositoryManager rm = RepositoryManager.getInstance(); List<RepositoryEntry> entries = rm.queryByTypeLimitAccess(ureq.getIdentity(), ureq.getUserSession().getRoles(), type); + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); //fxdiff VCRP-10: repository search with type filter tableCtr.setFilters(null, null); @@ -411,6 +425,7 @@ public class RepositorySearchController extends BasicController implements Activ RepositoryEntry entry = rm.lookupRepositoryEntry(id); List<RepositoryEntry> entries = new ArrayList<RepositoryEntry>(1); if (entry != null) entries.add(entry); + filterRepositoryEntries(entries); repoTableModel.setObjects(entries); tableCtr.modelChanged(); displaySearchResults(null); @@ -425,6 +440,7 @@ public class RepositorySearchController extends BasicController implements Activ RepositoryManager rm = RepositoryManager.getInstance(); List<RepositoryEntry> entries = rm.getLearningResourcesAsStudent(ureq.getIdentity(), 0, -1); //fxdiff VCRP-10: repository search with type filter + filterRepositoryEntries(entries); doSearchMyRepositoryEntries(ureq, entries, limitType, updateFilters); } @@ -436,6 +452,7 @@ public class RepositorySearchController extends BasicController implements Activ searchType = SearchType.myAsTeacher; RepositoryManager rm = RepositoryManager.getInstance(); List<RepositoryEntry> entries = rm.getLearningResourcesAsTeacher(ureq.getIdentity(), 0, -1); + filterRepositoryEntries(entries); //fxdiff VCRP-10: repository search with type filter doSearchMyRepositoryEntries(ureq, entries, limitType, updateFilters); } diff --git a/src/main/java/org/olat/repository/controllers/_content/all_member_list.html b/src/main/java/org/olat/repository/controllers/_content/all_member_list.html index bd38ba2676e..c858af8e103 100644 --- a/src/main/java/org/olat/repository/controllers/_content/all_member_list.html +++ b/src/main/java/org/olat/repository/controllers/_content/all_member_list.html @@ -1,3 +1,4 @@ +#if($r.available("addMembers") || $r.available("importMembers")) <div class="o_buttons_box_right"> #if($r.available("addMembers")) $r.render("addMembers") @@ -6,6 +7,7 @@ $r.render("importMembers") #end </div> +#end #if($infos) <br/> diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java index 986a46c1085..79486b34651 100644 --- a/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java +++ b/src/main/java/org/olat/resource/accesscontrol/ui/AccessConfigurationController.java @@ -84,9 +84,10 @@ public class AccessConfigurationController extends FormBasicController { private final boolean embbed; private final boolean emptyConfigGrantsFullAccess; private boolean allowPaymentMethod; + private final boolean editable; public AccessConfigurationController(UserRequest ureq, WindowControl wControl, OLATResource resource, - String displayName, boolean allowPaymentMethod) { + String displayName, boolean allowPaymentMethod, boolean editable) { super(ureq, wControl, "access_configuration"); this.resource = resource; @@ -95,15 +96,17 @@ public class AccessConfigurationController extends FormBasicController { acModule = (AccessControlModule)CoreSpringFactory.getBean("acModule"); acService = CoreSpringFactory.getImpl(ACService.class); embbed = false; + this.editable = editable; emptyConfigGrantsFullAccess = true; initForm(ureq); } public AccessConfigurationController(UserRequest ureq, WindowControl wControl, OLATResource resource, - String displayName, boolean allowPaymentMethod, Form form) { + String displayName, boolean allowPaymentMethod, boolean editable, Form form) { super(ureq, wControl, FormBasicController.LAYOUT_CUSTOM, "access_configuration", form); + this.editable = editable; this.resource = resource; this.displayName = displayName; this.allowPaymentMethod = allowPaymentMethod; @@ -121,8 +124,10 @@ public class AccessConfigurationController extends FormBasicController { @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - createLink = uifactory.addFormLink("add.accesscontrol", formLayout, Link.BUTTON); - createLink.setElementCssClass("o_sel_accesscontrol_create"); + if(editable) { + createLink = uifactory.addFormLink("add.accesscontrol", formLayout, Link.BUTTON); + createLink.setElementCssClass("o_sel_accesscontrol_create"); + } String confPage = velocity_root + "/configuration_list.html"; confControllerContainer = FormLayoutContainer.createCustomFormLayout("conf-controllers", getTranslator(), confPage); @@ -138,12 +143,14 @@ public class AccessConfigurationController extends FormBasicController { setFormDescription("accesscontrol.desc"); setFormContextHelp(AccessConfigurationController.class.getPackage().getName(), "accesscontrol.html", "chelp.accesscontrol.hover"); - final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); - buttonGroupLayout.setRootForm(mainForm); - formLayout.add(buttonGroupLayout); - formLayout.add("buttonLayout", buttonGroupLayout); - - uifactory.addFormSubmitButton("save", buttonGroupLayout); + if(editable) { + final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonLayout", getTranslator()); + buttonGroupLayout.setRootForm(mainForm); + formLayout.add(buttonGroupLayout); + formLayout.add("buttonLayout", buttonGroupLayout); + + uifactory.addFormSubmitButton("save", buttonGroupLayout); + } } confControllerContainer.contextPut("emptyConfigGrantsFullAccess", Boolean.valueOf(emptyConfigGrantsFullAccess)); @@ -285,18 +292,22 @@ public class AccessConfigurationController extends FormBasicController { DateChooser dateFrom = uifactory.addDateChooser("from_" + link.getKey(), "from", null, confControllerContainer); dateFrom.setUserObject(infos); + dateFrom.setEnabled(editable); dateFrom.setDate(link.getValidFrom()); confControllerContainer.add(dateFrom.getName(), dateFrom); DateChooser dateTo = uifactory.addDateChooser("to_" + link.getKey(), "to", null, confControllerContainer); + dateTo.setEnabled(editable); dateTo.setUserObject(infos); dateTo.setDate(link.getValidTo()); confControllerContainer.add(dateTo.getName(), dateTo); - FormLink delLink = uifactory.addFormLink("del_" + link.getKey(), "delete", null, confControllerContainer, Link.LINK); - delLink.setUserObject(infos); - delLink.setCustomEnabledLinkCSS("b_with_small_icon_left b_delete_icon"); - confControllerContainer.add(delLink.getName(), delLink); + if(editable) { + FormLink delLink = uifactory.addFormLink("del_" + link.getKey(), "delete", null, confControllerContainer, Link.LINK); + delLink.setUserObject(infos); + delLink.setCustomEnabledLinkCSS("b_with_small_icon_left b_delete_icon"); + confControllerContainer.add(delLink.getName(), delLink); + } } protected void addMethod(UserRequest ureq, AccessMethod method) { diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html index 64463aa072b..e2c26a9f6d6 100644 --- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html +++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/access_configuration.html @@ -5,11 +5,13 @@ #if ($off_warn) <div class="b_warning">$off_warn</div> #end #if ($off_info) <div class="b_info">$off_info</div> #end +#if($r.available("add.accesscontrol")) <div class="b_clearfix"> <div class="b_float_right"> $r.render("add.accesscontrol") </div> </div> +#end <div class="b_clearfix"> $r.render("conf-controllers") </div> diff --git a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html index d5962f2c5dd..ec6c4512a72 100644 --- a/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html +++ b/src/main/java/org/olat/resource/accesscontrol/ui/_content/configuration_list.html @@ -17,7 +17,7 @@ <td><span class="b_access_infos">$confController.infos</span></td> <td><div class="b_form_element">$r.render("from_$confController.link.key")</div></td> <td><div class="b_form_element">$r.render("to_$confController.link.key")</div></td> - <td>$r.render("del_$confController.link.key")</td> + <td>#if($r.available("del_$confController.link.key")) $r.render("del_$confController.link.key") #end</td> </tr> #set($desc = $confController.getLink().getOffer().getDescription()) #if ($desc) diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java index f7b67dfa3e5..af2ca899e9a 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -491,7 +491,7 @@ public class CoursesWebService { } addedEntry.setExternalId(externalId); addedEntry.setExternalRef(externalRef); - addedEntry.setManagedFlags(managedFlags); + addedEntry.setManagedFlagsString(managedFlags); // Do set access for owner at the end, because unfinished course should be // invisible diff --git a/src/main/java/org/olat/restapi/support/ObjectFactory.java b/src/main/java/org/olat/restapi/support/ObjectFactory.java index f00924b2453..9fcd0b4deac 100644 --- a/src/main/java/org/olat/restapi/support/ObjectFactory.java +++ b/src/main/java/org/olat/restapi/support/ObjectFactory.java @@ -96,7 +96,7 @@ public class ObjectFactory { vo.setMaxParticipants(grp.getMaxParticipants()); vo.setMinParticipants(grp.getMinParticipants()); vo.setExternalId(grp.getExternalId()); - vo.setManagedFlags(grp.getManagedFlags()); + vo.setManagedFlags(grp.getManagedFlagsString()); vo.setType(grp.getType()); return vo; } @@ -165,7 +165,7 @@ public class ObjectFactory { } vo.setExternalId(entry.getExternalId()); vo.setExternalRef(entry.getExternalRef()); - vo.setManagedFlags(entry.getManagedFlags()); + vo.setManagedFlags(entry.getManagedFlagsString()); if(entry.getLifecycle() != null) { vo.setLifecycle(new RepositoryEntryLifecycleVO(entry.getLifecycle())); } @@ -188,7 +188,7 @@ public class ObjectFactory { vo.setRepoEntryKey(re.getKey()); vo.setExternalId(re.getExternalId()); vo.setExternalRef(re.getExternalRef()); - vo.setManagedFlags(re.getManagedFlags()); + vo.setManagedFlags(re.getManagedFlagsString()); if(re.getLifecycle() != null) { vo.setLifecycle(new RepositoryEntryLifecycleVO(re.getLifecycle())); } diff --git a/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql index b4bc1e6213d..f92edadc627 100644 --- a/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql +++ b/src/main/resources/database/mysql/alter_8_4_0_to_9_0_0.sql @@ -414,5 +414,51 @@ create table o_ex_task ( ); alter table o_ex_task ENGINE = InnoDB; +-- managed groups +create or replace view o_gp_business_v as ( + select + gp.group_id as group_id, + gp.groupname as groupname, + gp.lastmodified as lastmodified, + gp.creationdate as creationdate, + gp.lastusage as lastusage, + gp.descr as descr, + gp.minparticipants as minparticipants, + gp.maxparticipants as maxparticipants, + gp.waitinglist_enabled as waitinglist_enabled, + gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, + (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, + (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, + (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, + (case when gp.waitinglist_enabled = 1 + then + (select count(waiting.id) from o_bs_membership as waiting where waiting.secgroup_id = gp.fk_partipiciantgroup) + else + 0 + end) as num_waiting, + (select count(offer.offer_id) from o_ac_offer as offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=1 + and (offer.validfrom is null or offer.validfrom <= current_timestamp()) + and (offer.validto is null or offer.validto >= current_timestamp()) + ) as num_of_valid_offers, + (select count(offer.offer_id) from o_ac_offer as offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=1 + ) as num_of_offers, + (select count(relation.fk_resource) from o_gp_business_to_resource as relation + where relation.fk_group = gp.group_id + ) as num_of_relations, + gp.fk_resource as fk_resource, + gp.fk_ownergroup as fk_ownergroup, + gp.fk_partipiciantgroup as fk_partipiciantgroup, + gp.fk_waitinggroup as fk_waitinggroup + from o_gp_business as gp +); + + + + diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 6b3a7311321..5c16322da5e 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -1391,6 +1391,7 @@ create or replace view o_gp_business_v as ( gp.maxparticipants as maxparticipants, gp.waitinglist_enabled as waitinglist_enabled, gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, diff --git a/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql index 3e80bace5f7..998a48e2137 100644 --- a/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql +++ b/src/main/resources/database/oracle/alter_8_4_0_to_9_0_0.sql @@ -495,7 +495,48 @@ create table o_ex_task ( primary key (id) ); - +drop view o_gp_business_v; +create or replace view o_gp_business_v as ( + select + gp.group_id as group_id, + gp.groupname as groupname, + gp.lastmodified as lastmodified, + gp.creationdate as creationdate, + gp.lastusage as lastusage, + gp.descr as descr, + gp.minparticipants as minparticipants, + gp.maxparticipants as maxparticipants, + gp.waitinglist_enabled as waitinglist_enabled, + gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, + (select count(part.id) from o_bs_membership part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, + (select count(pending.reservation_id) from o_ac_reservation pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, + (select count(own.id) from o_bs_membership own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, + (case when gp.waitinglist_enabled = 1 + then + (select count(waiting.id) from o_bs_membership waiting where waiting.secgroup_id = gp.fk_partipiciantgroup) + else + 0 + end) as num_waiting, + (select count(offer.offer_id) from o_ac_offer offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=1 + and (offer.validfrom is null or offer.validfrom <= current_date) + and (offer.validto is null or offer.validto >= current_date) + ) as num_of_valid_offers, + (select count(offer.offer_id) from o_ac_offer offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=1 + ) as num_of_offers, + (select count(relation.fk_resource) from o_gp_business_to_resource relation + where relation.fk_group = gp.group_id + ) as num_of_relations, + gp.fk_resource as fk_resource, + gp.fk_ownergroup as fk_ownergroup, + gp.fk_partipiciantgroup as fk_partipiciantgroup, + gp.fk_waitinggroup as fk_waitinggroup + from o_gp_business gp +); diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 034da1c876e..5b493662bb4 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -1518,6 +1518,7 @@ create or replace view o_gp_business_v as ( gp.maxparticipants as maxparticipants, gp.waitinglist_enabled as waitinglist_enabled, gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, (select count(part.id) from o_bs_membership part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, (select count(pending.reservation_id) from o_ac_reservation pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, (select count(own.id) from o_bs_membership own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, diff --git a/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql b/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql index e239f941216..a059833c72c 100644 --- a/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql +++ b/src/main/resources/database/postgresql/alter_8_4_0_to_9_0_0.sql @@ -550,6 +550,51 @@ create table o_ex_task ( primary key (id) ); +-- managed groups + +drop view o_gp_business_v; +create or replace view o_gp_business_v as ( + select + gp.group_id as group_id, + gp.groupname as groupname, + gp.lastmodified as lastmodified, + gp.creationdate as creationdate, + gp.lastusage as lastusage, + gp.descr as descr, + gp.minparticipants as minparticipants, + gp.maxparticipants as maxparticipants, + gp.waitinglist_enabled as waitinglist_enabled, + gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, + (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, + (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, + (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, + (case when gp.waitinglist_enabled = true + then + (select count(waiting.id) from o_bs_membership as waiting where waiting.secgroup_id = gp.fk_partipiciantgroup) + else + 0 + end) as num_waiting, + (select count(offer.offer_id) from o_ac_offer as offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=true + and (offer.validfrom is null or offer.validfrom <= current_timestamp) + and (offer.validto is null or offer.validto >= current_timestamp) + ) as num_of_valid_offers, + (select count(offer.offer_id) from o_ac_offer as offer + where offer.fk_resource_id = gp.fk_resource + and offer.is_valid=true + ) as num_of_offers, + (select count(relation.fk_resource) from o_gp_business_to_resource as relation + where relation.fk_group = gp.group_id + ) as num_of_relations, + gp.fk_resource as fk_resource, + gp.fk_ownergroup as fk_ownergroup, + gp.fk_partipiciantgroup as fk_partipiciantgroup, + gp.fk_waitinggroup as fk_waitinggroup + from o_gp_business as gp +); + diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 26d3632ff7c..1520f771b0b 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -1386,6 +1386,7 @@ create or replace view o_gp_business_v as ( gp.maxparticipants as maxparticipants, gp.waitinglist_enabled as waitinglist_enabled, gp.autocloseranks_enabled as autocloseranks_enabled, + gp.managed_flags as managed_flags, (select count(part.id) from o_bs_membership as part where part.secgroup_id = gp.fk_partipiciantgroup) as num_of_participants, (select count(pending.reservation_id) from o_ac_reservation as pending where pending.fk_resource = gp.fk_resource) as num_of_pendings, (select count(own.id) from o_bs_membership as own where own.secgroup_id = gp.fk_ownergroup) as num_of_owners, diff --git a/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java b/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java new file mode 100644 index 00000000000..d27d1f1bd61 --- /dev/null +++ b/src/test/java/org/olat/group/BusinessGroupManagedFlagsTest.java @@ -0,0 +1,66 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.group; + +import junit.framework.Assert; + +import org.junit.Test; + +/** + * + * Test if the mconversion methos of the managed flags are fault tolerant + * + * Initial date: 10.07.2013<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class BusinessGroupManagedFlagsTest { + + @Test + public void testManagedConversion() { + String flags = "all,details"; + BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags); + Assert.assertNotNull(arr); + Assert.assertEquals(2, arr.length); + Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all); + Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details); + } + + @Test + public void testManagedConversion_badData_empty() { + String flags = "all,details,,,,"; + BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags); + Assert.assertNotNull(arr); + Assert.assertEquals(2, arr.length); + Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all); + Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details); + } + + @Test + public void testManagedConversion_badData_wrongFlag() { + String flags = "all,details,dru,gnu,tools"; + BusinessGroupManagedFlag[] arr = BusinessGroupManagedFlag.toEnum(flags); + Assert.assertNotNull(arr); + Assert.assertEquals(3, arr.length); + Assert.assertEquals(arr[0], BusinessGroupManagedFlag.all); + Assert.assertEquals(arr[1], BusinessGroupManagedFlag.details); + Assert.assertEquals(arr[2], BusinessGroupManagedFlag.tools); + } +} diff --git a/src/test/java/org/olat/repository/RepositoryManagerTest.java b/src/test/java/org/olat/repository/RepositoryManagerTest.java index 33cf83a35e0..2c6fb3ed455 100644 --- a/src/test/java/org/olat/repository/RepositoryManagerTest.java +++ b/src/test/java/org/olat/repository/RepositoryManagerTest.java @@ -700,7 +700,7 @@ public class RepositoryManagerTest extends OlatTestCase { @Test public void genericANDQueryWithRoles_managed() { RepositoryEntry managedRe = JunitTestHelper.createAndPersistRepositoryEntry(); - managedRe.setManagedFlags("all"); + managedRe.setManagedFlagsString("all"); managedRe = dbInstance.getCurrentEntityManager().merge(managedRe); RepositoryEntry freeRe = JunitTestHelper.createAndPersistRepositoryEntry(); dbInstance.commitAndCloseSession(); diff --git a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java index 43096b504b4..57e19c0f172 100644 --- a/src/test/java/org/olat/restapi/RepositoryEntriesTest.java +++ b/src/test/java/org/olat/restapi/RepositoryEntriesTest.java @@ -145,7 +145,7 @@ public class RepositoryEntriesTest extends OlatJerseyTestCase { @Test public void testGetEntry_managed() throws IOException, URISyntaxException { RepositoryEntry re = createRepository("Test GET repo entry"); - re.setManagedFlags("all"); + re.setManagedFlagsString("all"); re = dbInstance.getCurrentEntityManager().merge(re); dbInstance.commitAndCloseSession(); diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index b9c5608981a..d8521dfa520 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -82,6 +82,7 @@ import org.junit.runners.Suite; org.olat.core.commons.taskExecutor.PersistentTaskDAOTest.class,//ok org.olat.core.commons.taskExecutor.TaskExecutorManagerTest.class,//ok org.olat.admin.user.delete.service.UserDeletionManagerTest.class,//ok + org.olat.group.BusinessGroupManagedFlagsTest.class,//ok org.olat.group.test.BGRightManagerTest.class,//ok org.olat.group.test.BGAreaManagerTest.class,//ok org.olat.group.test.BusinessGroupServiceTest.class,//ok -- GitLab