From eeee1f7f2ba1e9b57f6ffd5c23c76264c22e0be3 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 16 Oct 2012 12:04:08 +0200
Subject: [PATCH] OO-378: make the excel download of group members configurable

---
 .../securitygroup/gui/GroupController.java    | 21 +++------------
 .../gui/WaitingGroupController.java           |  6 ++---
 .../olat/basesecurity/BaseSecurityModule.java |  1 -
 .../olat/catalog/ui/CatalogController.java    |  2 +-
 .../ProjectBrokerCourseEditorController.java  |  2 +-
 .../projectbroker/ProjectGroupController.java |  6 ++---
 .../org/olat/group/BusinessGroupModule.java   | 18 +++++++++++++
 .../group/_spring/businessGroupContext.xml    |  1 +
 .../manager/BusinessGroupImportExport.java    |  6 ++++-
 .../manager/BusinessGroupPropertyDAO.java     | 27 +++++++++++++++----
 .../manager/BusinessGroupServiceImpl.java     |  5 +++-
 .../org/olat/group/model/DisplayMembers.java  | 10 +++++++
 .../edit/BusinessGroupMembersController.java  |  6 ++---
 .../ui/edit/DisplayMemberSwitchForm.java      |  6 +++++
 .../ui/edit/_i18n/LocalStrings_de.properties  |  1 +
 .../ui/edit/_i18n/LocalStrings_en.properties  |  1 +
 .../ui/edit/_i18n/LocalStrings_fr.properties  |  1 +
 .../GroupMembersDisplayController.java        |  6 ++---
 .../run/BusinessGroupMainRunController.java   |  7 ++---
 .../RepositoryDetailsController.java          |  4 +--
 .../resources/serviceconfig/olat.properties   |  3 +++
 21 files changed, 96 insertions(+), 44 deletions(-)

diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
index 50b0dc8ca6c..eb28a589978 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java
@@ -127,20 +127,6 @@ public class GroupController extends BasicController {
 	protected static final String usageIdentifyer = IdentitiesOfGroupTableDataModel.class.getCanonicalName();
 	protected boolean isAdministrativeUser;
 
-	
-	/**
-	 * @param ureq
-	 * @param wControl
-	 * @param mayModifyMembers
-	 * @param keepAtLeastOne
-	 * @param enableTablePreferences
-	 * @param aSecurityGroup
-	 */
-	public GroupController(UserRequest ureq, WindowControl wControl, boolean mayModifyMembers, boolean keepAtLeastOne, boolean enableTablePreferences, SecurityGroup aSecurityGroup) {
-		super(ureq, wControl);
-		init(ureq, mayModifyMembers, keepAtLeastOne, enableTablePreferences, false, aSecurityGroup);
-	}
-
 	/**
 	 * @param ureq
 	 * @param wControl
@@ -152,14 +138,14 @@ public class GroupController extends BasicController {
 	 */	 
 	public GroupController(UserRequest ureq, WindowControl wControl, 
 			boolean mayModifyMembers, boolean keepAtLeastOne, boolean enableTablePreferences, boolean enableUserSelection,
-			SecurityGroup aSecurityGroup) {
+			boolean allowDownload, SecurityGroup aSecurityGroup) {
 		super(ureq, wControl);
-		init(ureq, mayModifyMembers, keepAtLeastOne, enableTablePreferences, enableUserSelection, aSecurityGroup);
+		init(ureq, mayModifyMembers, keepAtLeastOne, enableTablePreferences, enableUserSelection, allowDownload, aSecurityGroup);
 	}
 
 	protected void init(UserRequest ureq,
 			boolean mayModifyMembers, boolean keepAtLeastOne, boolean enableTablePreferences, boolean enableUserSelection,
-			SecurityGroup aSecurityGroup) {
+			boolean allowDownload, SecurityGroup aSecurityGroup) {
 		this.securityGroup = aSecurityGroup;
 		this.mayModifyMembers = mayModifyMembers;
 		this.keepAtLeastOne = keepAtLeastOne;
@@ -181,6 +167,7 @@ public class GroupController extends BasicController {
 		}
 
 		TableGuiConfiguration tableConfig = new TableGuiConfiguration();
+		tableConfig.setDownloadOffered(allowDownload);
 		if (enableTablePreferences) {
 			// save table preferences for each group seperatly
 			if (mayModifyMembers) {
diff --git a/src/main/java/org/olat/admin/securitygroup/gui/WaitingGroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/WaitingGroupController.java
index 9cf667d57e6..fab4d24fbd3 100644
--- a/src/main/java/org/olat/admin/securitygroup/gui/WaitingGroupController.java
+++ b/src/main/java/org/olat/admin/securitygroup/gui/WaitingGroupController.java
@@ -30,7 +30,6 @@ import java.util.List;
 import org.olat.basesecurity.SecurityGroup;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.table.DefaultColumnDescriptor;
-import org.olat.core.gui.components.table.StaticColumnDescriptor;
 import org.olat.core.gui.components.table.Table;
 import org.olat.core.gui.components.table.TableController;
 import org.olat.core.gui.components.table.TableMultiSelectEvent;
@@ -74,8 +73,9 @@ public class WaitingGroupController extends GroupController {
 	 * @param enableTablePreferences
 	 * @param aSecurityGroup
 	 */
-	public WaitingGroupController(UserRequest ureq, WindowControl wControl, boolean mayModifyMembers, boolean keepAtLeastOne, boolean enableTablePreferences, SecurityGroup waitingListGroup) {
-		super(ureq, wControl, mayModifyMembers, keepAtLeastOne, enableTablePreferences, waitingListGroup);
+	public WaitingGroupController(UserRequest ureq, WindowControl wControl, boolean mayModifyMembers, boolean keepAtLeastOne, boolean enableTablePreferences,
+			boolean allowDownload, SecurityGroup waitingListGroup) {
+		super(ureq, wControl, mayModifyMembers, keepAtLeastOne, enableTablePreferences, false, allowDownload, waitingListGroup);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
index b5b4469db0f..a7f4df0cc11 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityModule.java
@@ -93,7 +93,6 @@ public class BaseSecurityModule extends AbstractOLATModule {
 	public static Boolean USERMANAGER_CAN_EDIT_ALL_PROFILE_FIELDS = true;
 	private static String defaultAuthProviderIdentifier;
 
-
 	private String userSearchAdminPropsForUsers;
 	private String userSearchAdminPropsForAuthors;
 	private String userSearchAdminPropsForUsermanagers;
diff --git a/src/main/java/org/olat/catalog/ui/CatalogController.java b/src/main/java/org/olat/catalog/ui/CatalogController.java
index 1274e9719d6..98838634cba 100644
--- a/src/main/java/org/olat/catalog/ui/CatalogController.java
+++ b/src/main/java/org/olat/catalog/ui/CatalogController.java
@@ -508,7 +508,7 @@ public class CatalogController extends BasicController implements Activateable2
 				boolean keepAtLeastOne = currentCatalogEntryLevel == 0;
 				
 				removeAsListenerAndDispose(groupController);
-				groupController = new GroupController(ureq, getWindowControl(), true, keepAtLeastOne, false, secGroup);
+				groupController = new GroupController(ureq, getWindowControl(), true, keepAtLeastOne, false, false, false, secGroup);
 				listenTo(groupController);
 				
 				// open form in dialog
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
index a032f4c8262..8c476d179d6 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
@@ -189,7 +189,7 @@ public class ProjectBrokerCourseEditorController extends ActivateableTabbableDef
     String groupDescription = translate("account.manager.groupdescription", node.getShortTitle());
     accountManagerGroup = ProjectBrokerManagerFactory.getProjectGroupManager().getAccountManagerGroupFor(cpm, node, course, groupName, groupDescription, ureq.getIdentity());
     if (accountManagerGroup != null) {
-	    accountManagerGroupController = new GroupController(ureq, getWindowControl(), true, false, true, accountManagerGroup.getPartipiciantGroup());
+	    accountManagerGroupController = new GroupController(ureq, getWindowControl(), true, false, true, false, true, accountManagerGroup.getPartipiciantGroup());
 			listenTo(accountManagerGroupController);
 			// add mail templates used when adding and removing users
 			MailTemplate ownerAddUserMailTempl = BGMailHelper.createAddParticipantMailTemplate(accountManagerGroup, ureq.getIdentity());
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
index 23593a96223..8a24b7ee322 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectGroupController.java
@@ -87,12 +87,12 @@ public class ProjectGroupController extends BasicController {
 		VelocityContainer myContent = createVelocityContainer("projectgroup_management");
 
 		// Project Leader Management
-		projectLeaderController = new GroupController(ureq, getWindowControl(), true, true, true, project.getProjectLeaderGroup());
+		projectLeaderController = new GroupController(ureq, getWindowControl(), true, true, true, false, true, project.getProjectLeaderGroup());
 		listenTo(projectLeaderController);
 		myContent.put("projectLeaderController", projectLeaderController.getInitialComponent());
 
 		// Project Member Management
-		projectMemberController = new GroupController(ureq, getWindowControl(), true, false, true, project.getProjectParticipantGroup());
+		projectMemberController = new GroupController(ureq, getWindowControl(), true, false, true, false, true, project.getProjectParticipantGroup());
 		listenTo(projectMemberController);
 		myContent.put("projectMemberController", projectMemberController.getInitialComponent());
 		// add mail templates used when adding and removing users
@@ -103,7 +103,7 @@ public class ProjectGroupController extends BasicController {
 
 		// Project Candidates Management
 		if (projectBrokerModuleConfiguration.isAcceptSelectionManually()) {
-			projectCandidatesController = new WaitingGroupController(ureq, getWindowControl(), true, false, true, project.getCandidateGroup());
+			projectCandidatesController = new WaitingGroupController(ureq, getWindowControl(), true, false, true, true, project.getCandidateGroup());
 			listenTo(projectCandidatesController);
 			myContent.contextPut("isProjectCandidatesListEmpty", ProjectBrokerManagerFactory.getProjectGroupManager().isCandidateListEmpty(project.getCandidateGroup()) );
 			myContent.put("projectCandidatesController", projectCandidatesController.getInitialComponent());
diff --git a/src/main/java/org/olat/group/BusinessGroupModule.java b/src/main/java/org/olat/group/BusinessGroupModule.java
index 788642fbd84..82f82867491 100644
--- a/src/main/java/org/olat/group/BusinessGroupModule.java
+++ b/src/main/java/org/olat/group/BusinessGroupModule.java
@@ -43,6 +43,7 @@ public class BusinessGroupModule extends AbstractOLATModule {
 	private static final String USER_ALLOW_CREATE_BG = "user.allowed.create";
 	private static final String AUTHOR_ALLOW_CREATE_BG = "author.allowed.create";
 	private static final String CONTACT_BUSINESS_CARD = "contact.business.card";
+	private static final String USER_LIST_DOWNLOAD = "userlist.download.default.allowed";
 	
 	public static final String CONTACT_BUSINESS_CARD_NEVER = "never";
 	public static final String CONTACT_BUSINESS_CARD_ALWAYS = "always";
@@ -51,6 +52,7 @@ public class BusinessGroupModule extends AbstractOLATModule {
 
 	private boolean userAllowedCreate;
 	private boolean authorAllowedCreate;
+	private boolean userListDownloadDefaultAllowed;
 	private String contactBusinessCard;
 	
 	
@@ -88,6 +90,11 @@ public class BusinessGroupModule extends AbstractOLATModule {
 		if(StringHelper.containsNonWhitespace(contactAllowed)) {
 			contactBusinessCard = contactAllowed;
 		}
+		
+		String downloadAllowed = getStringPropertyValue(USER_LIST_DOWNLOAD, true);
+		if(StringHelper.containsNonWhitespace(downloadAllowed)) {
+			userListDownloadDefaultAllowed = "true".equals(downloadAllowed);
+		}
 	}
 
 	/**
@@ -98,6 +105,7 @@ public class BusinessGroupModule extends AbstractOLATModule {
 		userAllowedCreate = getBooleanConfigParameter(USER_ALLOW_CREATE_BG, true);
 		authorAllowedCreate = getBooleanConfigParameter(AUTHOR_ALLOW_CREATE_BG, true);
 		contactBusinessCard = getStringConfigParameter(CONTACT_BUSINESS_CARD, CONTACT_BUSINESS_CARD_NEVER, true);
+		userListDownloadDefaultAllowed = getBooleanConfigParameter(USER_LIST_DOWNLOAD, true);
 	}
 
 	@Override
@@ -133,6 +141,16 @@ public class BusinessGroupModule extends AbstractOLATModule {
 	public void setContactBusinessCard(String contactBusinessCard) {
 		setStringProperty(CONTACT_BUSINESS_CARD, contactBusinessCard, true);
 	}
+
+	public boolean isUserListDownloadDefaultAllowed() {
+		return userListDownloadDefaultAllowed;
+	}
+
+	public void setUserListDownloadDefaultAllowed(boolean userListDownload) {
+		setStringProperty(USER_LIST_DOWNLOAD, Boolean.toString(userListDownload), true);
+	}
+	
+	
 	
 	
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/group/_spring/businessGroupContext.xml b/src/main/java/org/olat/group/_spring/businessGroupContext.xml
index 30405b83174..368fc67224a 100644
--- a/src/main/java/org/olat/group/_spring/businessGroupContext.xml
+++ b/src/main/java/org/olat/group/_spring/businessGroupContext.xml
@@ -37,6 +37,7 @@
 				<!-- Show the contact form in the business group card.
 				     Values are: never,always,groupconfig -->
 				contact.business.card=${group.card.contact}
+				userlist.download.default.allowed=${group.userlist.download.default.allowed}
 			</value>
 		</property>
 	</bean>
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
index 920f8a70f48..39d53ff3ab7 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
@@ -39,6 +39,7 @@ import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupModule;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.area.BGArea;
 import org.olat.group.area.BGAreaManager;
@@ -70,6 +71,8 @@ public class BusinessGroupImportExport {
 	private BusinessGroupService businessGroupService;
 	@Autowired
 	private BusinessGroupPropertyDAO businessGroupPropertyManager;
+	@Autowired
+	private BusinessGroupModule groupModule;
 	
 	
 	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, boolean backwardsCompatible) {
@@ -315,7 +318,8 @@ public class BusinessGroupImportExport {
 				if (group.showWaitingList != null) {
 					showWaitingList = group.showWaitingList;
 				}
-				businessGroupPropertyManager.updateDisplayMembers(newGroup, showOwners, showParticipants, showWaitingList, false, false, false);
+				boolean download = groupModule.isUserListDownloadDefaultAllowed();
+				businessGroupPropertyManager.updateDisplayMembers(newGroup, showOwners, showParticipants, showWaitingList, false, false, false, download);
 			
 				if(dbCount++ % 3 == 0) {
 					dbInstance.commitAndCloseSession();
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupPropertyDAO.java b/src/main/java/org/olat/group/manager/BusinessGroupPropertyDAO.java
index 2651c8eda30..613ec05f3b0 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupPropertyDAO.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupPropertyDAO.java
@@ -27,6 +27,7 @@ package org.olat.group.manager;
 
 import org.olat.core.util.StringHelper;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupModule;
 import org.olat.properties.Property;
 import org.olat.properties.PropertyConstants;
 import org.olat.properties.PropertyManager;
@@ -54,6 +55,8 @@ public class BusinessGroupPropertyDAO {
 
 	@Autowired
 	private PropertyManager propertyManager;
+	@Autowired
+	private BusinessGroupModule groupModule;
 
 	/**
 	 * Creates and persists a new Property for the Display Members configuration
@@ -82,7 +85,7 @@ public class BusinessGroupPropertyDAO {
 	 * @param showPartips
 	 */
 	public void updateDisplayMembers(BusinessGroup group, boolean showOwners, boolean showPartips, boolean showWaitingList,
-			boolean ownrsPublic, boolean partipsPublic, boolean waitingListPublic) {
+			boolean ownrsPublic, boolean partipsPublic, boolean waitingListPublic, boolean downloadLists) {
 		long showXXX = 0;
 		if (showOwners) showXXX += showOwnersVal;
 		if (showPartips) showXXX += showPartipsVal;
@@ -93,9 +96,12 @@ public class BusinessGroupPropertyDAO {
 		if (partipsPublic) publicXXX += showPartipsVal;
 		if (waitingListPublic) publicXXX += showWaitingListVal;
 		
+		float download = downloadLists ? 1.0f : 0.0f;
+		
 		Property property = findProperty(group);
 		property.setLongValue(new Long(showXXX));
 		property.setStringValue(Long.toString(publicXXX));
+		property.setFloatValue(new Float(download));
 		propertyManager.updateProperty(property);
 	}
 
@@ -151,6 +157,14 @@ public class BusinessGroupPropertyDAO {
 	public boolean isWaitingListPublic(Property prop) {
 		return ((getPublicMembersValue(prop) & showWaitingListVal) == showWaitingListVal);
 	}
+	
+	public boolean isDownloadLists(Property prop) {
+		Float val = prop.getFloatValue();
+		if(val == null) {
+			return groupModule.isUserListDownloadDefaultAllowed();//default
+		}
+		return 0.5f < val.floatValue();	
+	}
 
 	private int getDisplayMembersValue(Property prop) {
 		int showXXX = prop.getLongValue().intValue();
@@ -192,9 +206,12 @@ public class BusinessGroupPropertyDAO {
 		boolean showOwners = showOwners(sourceGPM);
 		boolean showPartips = showPartips(sourceGPM);
 		boolean showWaitingList = showWaitingList(sourceGPM);
-		boolean ownersPublic = this.isOwnersPublic(sourceGPM);
-		boolean partipsPublic = this.isPartipsPublic(sourceGPM);
-		boolean waitingListPublic = this.isWaitingListPublic(sourceGPM);
-		updateDisplayMembers(targetGroup, showOwners, showPartips, showWaitingList, ownersPublic, partipsPublic, waitingListPublic);
+		boolean ownersPublic = isOwnersPublic(sourceGPM);
+		boolean partipsPublic = isPartipsPublic(sourceGPM);
+		boolean waitingListPublic = isWaitingListPublic(sourceGPM);
+		boolean downloadLists = isDownloadLists(sourceGPM);
+		updateDisplayMembers(targetGroup, showOwners, showPartips, showWaitingList,
+				ownersPublic, partipsPublic, waitingListPublic,
+				downloadLists);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index 24e9fd76ff7..ac575d93b20 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -283,6 +283,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 		displayMembers.setOwnersPublic(businessGroupPropertyManager.isOwnersPublic(props));
 		displayMembers.setParticipantsPublic(businessGroupPropertyManager.isPartipsPublic(props));
 		displayMembers.setWaitingListPublic(businessGroupPropertyManager.isWaitingListPublic(props));
+		displayMembers.setDownloadLists(businessGroupPropertyManager.isDownloadLists(props));
 		return displayMembers;
 	}
 
@@ -294,7 +295,9 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 		boolean ownersPublic = displayMembers.isOwnersPublic();
 		boolean partipsPublic = displayMembers.isParticipantsPublic();
 		boolean waitingListPublic = displayMembers.isWaitingListPublic();
-		businessGroupPropertyManager.updateDisplayMembers(group, showOwners, showPartips, showWaitingList, ownersPublic, partipsPublic, waitingListPublic);
+		boolean downloadLists = displayMembers.isDownloadLists();
+		businessGroupPropertyManager.updateDisplayMembers(group, showOwners, showPartips, showWaitingList,
+				ownersPublic, partipsPublic, waitingListPublic, downloadLists);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/group/model/DisplayMembers.java b/src/main/java/org/olat/group/model/DisplayMembers.java
index bffc1e78f1d..03c0fe6a789 100644
--- a/src/main/java/org/olat/group/model/DisplayMembers.java
+++ b/src/main/java/org/olat/group/model/DisplayMembers.java
@@ -33,6 +33,8 @@ public class DisplayMembers {
 	private boolean participantsPublic;
 	private boolean waitingListPublic;
 	
+	private boolean downloadLists;
+	
 	public DisplayMembers() {
 		//
 	}
@@ -90,4 +92,12 @@ public class DisplayMembers {
 	public void setWaitingListPublic(boolean waitingListPublic) {
 		this.waitingListPublic = waitingListPublic;
 	}
+
+	public boolean isDownloadLists() {
+		return downloadLists;
+	}
+
+	public void setDownloadLists(boolean downloadLists) {
+		this.downloadLists = downloadLists;
+	}
 }
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 cf74d3ab59f..f0a317e5888 100644
--- a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
+++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java
@@ -101,7 +101,7 @@ public class BusinessGroupMembersController extends BasicController {
 		boolean requiresOwner = courses.isEmpty();
 		// groupcontroller which allows to remove all members depending on
 		// configuration.
-		ownerGrpCntrllr = new GroupController(ureq, getWindowControl(), true, requiresOwner, enableTablePreferences, businessGroup.getOwnerGroup());
+		ownerGrpCntrllr = new GroupController(ureq, getWindowControl(), true, requiresOwner, enableTablePreferences, false, true, businessGroup.getOwnerGroup());
 		listenTo(ownerGrpCntrllr);
 		// add mail templates used when adding and removing users
 		MailTemplate ownerAddUserMailTempl = BGMailHelper.createAddParticipantMailTemplate(businessGroup, ureq.getIdentity());
@@ -114,7 +114,7 @@ public class BusinessGroupMembersController extends BasicController {
 
 		// groupcontroller which allows to remove all members
 		removeAsListenerAndDispose(partipGrpCntrllr);
-		partipGrpCntrllr = new GroupController(ureq, getWindowControl(), true, false, enableTablePreferences, businessGroup.getPartipiciantGroup());
+		partipGrpCntrllr = new GroupController(ureq, getWindowControl(), true, false, enableTablePreferences, false, true, businessGroup.getPartipiciantGroup());
 		listenTo(partipGrpCntrllr);
 		
 		// add mail templates used when adding and removing users
@@ -128,7 +128,7 @@ public class BusinessGroupMembersController extends BasicController {
 		// Show waiting list only if enabled 
 	   // waitinglist-groupcontroller which allows to remove all members
 		SecurityGroup waitingList = businessGroup.getWaitingGroup();
-		waitingGruppeController = new WaitingGroupController(ureq, getWindowControl(), true, false, enableTablePreferences, waitingList );
+		waitingGruppeController = new WaitingGroupController(ureq, getWindowControl(), true, false, true, enableTablePreferences, waitingList );
 		listenTo(waitingGruppeController);
 
 		// add mail templates used when adding and removing users
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 5801d6377bc..724b306c2e9 100644
--- a/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java
+++ b/src/main/java/org/olat/group/ui/edit/DisplayMemberSwitchForm.java
@@ -52,6 +52,7 @@ public class DisplayMemberSwitchForm extends FormBasicController {
 
 	private SelectionElement showOwners, showPartips, showWaitingList;
 	private SelectionElement openOwners, openPartips, openWaitingList;
+	private SelectionElement downloadList;
 	private boolean hasOwners, hasPartips, hasWaitingList;
 
 	/**
@@ -77,6 +78,7 @@ public class DisplayMemberSwitchForm extends FormBasicController {
 		displayMembers.setOwnersPublic(openOwners.isSelected(0));
 		displayMembers.setParticipantsPublic(openPartips.isSelected(0));
 		displayMembers.setWaitingListPublic(openWaitingList.isVisible() && openWaitingList.isEnabled() && openWaitingList.isSelected(0));
+		displayMembers.setDownloadLists(downloadList.isSelected(0));
 		return displayMembers;
 	}
 	
@@ -87,6 +89,7 @@ public class DisplayMemberSwitchForm extends FormBasicController {
 		openOwners.select("xx", displayMembers.isOwnersPublic());
 		openPartips.select("xx", displayMembers.isParticipantsPublic());
 		openWaitingList.select("xx", displayMembers.isWaitingListPublic());
+		downloadList.select("xx", displayMembers.isDownloadLists());
 	}
 	
 	public void setWaitingListReadOnly(boolean b) {
@@ -126,12 +129,15 @@ public class DisplayMemberSwitchForm extends FormBasicController {
 		openWaitingList = uifactory.addCheckboxesVertical("OpenWaitingList", "chkBox.open.waitingList", formLayout, new String[]{"xx"}, new String[]{""}, null, 1);
 		openWaitingList.setVisible(hasWaitingList);
 
+		downloadList = uifactory.addCheckboxesVertical("DownloadList", "chkBox.open.downloadList", formLayout, new String[]{"xx"}, new String[]{""}, null, 1);
+
 		showOwners.addActionListener(this, FormEvent.ONCLICK);
 		showPartips.addActionListener(this, FormEvent.ONCLICK);
 		showWaitingList.addActionListener(this, FormEvent.ONCLICK);
 		openOwners.addActionListener(this, FormEvent.ONCLICK);
 		openPartips.addActionListener(this, FormEvent.ONCLICK);
 		openWaitingList.addActionListener(this, FormEvent.ONCLICK);
+		downloadList.addActionListener(this, FormEvent.ONCLICK);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
index c497fe6dd33..18f7ad53e19 100644
--- a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_de.properties
@@ -68,6 +68,7 @@ chkBox.open.owners=Alle sehen Betreuer
 chkBox.open.partips=Alle sehen Teilnehmer
 chkBox.open.waitingList=Alle sehen Warteliste
 chkBox.open=Gruppe für Buchung in Gruppenbereich ver\u00F6ffentlichen
+chkBox.open.downloadList=Benutzer dürfen Teilnehmerliste herunterladen
 cmd.addresource=Kurs hinzuf\u00FCgen
 error.message.locked=Diese Gruppe wird im Moment vom Benutzer {0} ({1}) ver\u00E4ndert und ist daher gesperrt. Bitte versuchen Sie es sp\u00E4ter noch einmal.
 fieldset.legend.areas=Zugewiesene Lernbereiche
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 b59f6a11d8f..d74ee46bef6 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
@@ -60,6 +60,7 @@ chkBox.open.waitingList=All users can see the waiting list
 chkBox.show.owners=Members can see coaches
 chkBox.show.partips=Members can see participants
 chkBox.show.waitingList=Members can see waiting list
+chkBox.open.downloadList=Users can download the list of members
 cmd.addresource=Add course
 error.message.locked=This group is being edited by user {0} ({1}) and therefore locked. Please try again later.
 fieldset.legend.areas=Assigned learning areas
diff --git a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_fr.properties
index 3cc8b286909..5375f376ee1 100644
--- a/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/group/ui/edit/_i18n/LocalStrings_fr.properties
@@ -60,6 +60,7 @@ chkBox.open.waitingList=Tous voient la liste d'attente
 chkBox.show.owners=Membres voient propri\u00E9taires
 chkBox.show.partips=Membres voient participants
 chkBox.show.waitingList=Membres voient liste d'attente
+chkBox.open.downloadList=Les utilisateurs peuvent t\u00E9l\u00E9charger la liste des membres
 cmd.addresource=Ajouter un cours
 error.message.locked=Ce groupe est modifi\u00E9 en ce moment par l'utilisateur {0} ({1}) et est donc bloqu\u00E9. R\u00E9essayez plus tard SVP.
 fieldset.legend.areas=Domaines d'\u00E9tude affect\u00E9s
diff --git a/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java b/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
index 448a9e6ad3c..99e8653ff6b 100644
--- a/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
+++ b/src/main/java/org/olat/group/ui/homepage/GroupMembersDisplayController.java
@@ -46,15 +46,15 @@ public class GroupMembersDisplayController extends BasicController {
 		content = createVelocityContainer("groupmembersdisplay");
 
 		if(members.isOwnersPublic()) {
-			GroupController groupOwnersController = new GroupController(ureq, wControl, false, true, false, businessGroup.getOwnerGroup());
+			GroupController groupOwnersController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getOwnerGroup());
 			content.put("owners", groupOwnersController.getInitialComponent());
 		}
 		if(members.isParticipantsPublic()) {
-			GroupController groupParticipantsController = new GroupController(ureq, wControl, false, true, false, businessGroup.getPartipiciantGroup());
+			GroupController groupParticipantsController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getPartipiciantGroup());
 			content.put("participants", groupParticipantsController.getInitialComponent());
 		}
 		if(members.isWaitingListPublic()) {
-			GroupController groupWaitingListController = new GroupController(ureq, wControl, false, true, false, businessGroup.getWaitingGroup());
+			GroupController groupWaitingListController = new GroupController(ureq, wControl, false, true, false, false, false, businessGroup.getWaitingGroup());
 			content.put("waitingList", groupWaitingListController.getInitialComponent());
 		}
 		putInitialPanel(content);
diff --git a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
index 76c63cd9dff..b5004c00822 100644
--- a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
+++ b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java
@@ -706,9 +706,10 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im
 		VelocityContainer membersVc = createVelocityContainer("ownersandmembers");
 		// 1. show owners if configured with Owners
 		DisplayMembers displayMembers = businessGroupService.getDisplayMembers(businessGroup);
+		boolean downloadAllowed = displayMembers.isDownloadLists();
 		if (displayMembers.isShowOwners()) {
 			removeAsListenerAndDispose(gownersC);
-			gownersC = new GroupController(ureq, getWindowControl(), false, true, false, businessGroup.getOwnerGroup());
+			gownersC = new GroupController(ureq, getWindowControl(), false, true, false, false, downloadAllowed, businessGroup.getOwnerGroup());
 			listenTo(gownersC);
 			membersVc.put("owners", gownersC.getInitialComponent());
 			membersVc.contextPut("showOwnerGroups", Boolean.TRUE);
@@ -718,7 +719,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im
 		// 2. show participants if configured with Participants
 		if (displayMembers.isShowParticipants()) {
 			removeAsListenerAndDispose(gparticipantsC);
-			gparticipantsC = new GroupController(ureq, getWindowControl(), false, true, false, businessGroup.getPartipiciantGroup());
+			gparticipantsC = new GroupController(ureq, getWindowControl(), false, true, false, false, downloadAllowed, businessGroup.getPartipiciantGroup());
 			listenTo(gparticipantsC);
 			
 			membersVc.put("participants", gparticipantsC.getInitialComponent());
@@ -730,7 +731,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im
 		membersVc.contextPut("hasWaitingList", new Boolean(businessGroup.getWaitingListEnabled()) );
 		if (displayMembers.isShowWaitingList()) {
 			removeAsListenerAndDispose(waitingListController);
-			waitingListController = new GroupController(ureq, getWindowControl(), false, true, false, businessGroup.getWaitingGroup());
+			waitingListController = new GroupController(ureq, getWindowControl(), false, true, false, false, downloadAllowed, businessGroup.getWaitingGroup());
 			listenTo(waitingListController);
 			membersVc.put("waitingList", waitingListController.getInitialComponent());
 			membersVc.contextPut("showWaitingList", Boolean.TRUE);
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
index 12783100d16..639343a17f5 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryDetailsController.java
@@ -407,7 +407,7 @@ public class RepositoryDetailsController extends BasicController implements Gene
 		main.put(infopanelVC.getComponentName(), infopanelVC);
 
 		removeAsListenerAndDispose(groupController);
-		groupController = new GroupController(ureq, getWindowControl(), false, true, false, repositoryEntry.getOwnerGroup());
+		groupController = new GroupController(ureq, getWindowControl(), false, true, false, false, true, repositoryEntry.getOwnerGroup());
 		listenTo(groupController);
 		
 		main.put("ownertable", groupController.getInitialComponent());
@@ -1108,7 +1108,7 @@ public class RepositoryDetailsController extends BasicController implements Gene
 		groupTutorEditController = null;
 		groupParticipantEditController = null;
 
-		GroupController controller = new GroupController(ureq, getWindowControl(), true, keepAtLeastOne, false, secGroup);
+		GroupController controller = new GroupController(ureq, getWindowControl(), true, keepAtLeastOne, false, false, true, secGroup);
 		listenTo(controller);
 		
 		VelocityContainer groupContainer = createVelocityContainer(template);  
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index e990ee0a80e..d5cac2a2abd 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -202,6 +202,9 @@ group.author.create.values=true,false
 # show the contact form in the business group card.
 group.card.contact=groupconfig
 group.card.contact.values=never,always,groupconfig
+# user can download member list of groups
+group.userlist.download.default.allowed=false
+group.userlist.download.default.allowed.values=true,false
 
 ####################################################
 # assessmentplugin config
-- 
GitLab