From 8cf57443eb01de9ac00649c119d252d62348e10e Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 4 Jun 2015 12:34:29 +0200
Subject: [PATCH] OO-1562,OO-1563: add a member management right to the list of
 course rights and restricts the access to the function of the course members
 management in function of the administration/group/member rights

---
 .../course/groupsandrights/CourseRights.java  |   5 +
 .../_i18n/LocalStrings_de.properties          |   1 +
 .../_i18n/LocalStrings_en.properties          |   1 +
 .../MembersManagementMainController.java      | 104 +++++++++++-------
 .../course/run/CourseRuntimeController.java   |  12 +-
 5 files changed, 79 insertions(+), 44 deletions(-)

diff --git a/src/main/java/org/olat/course/groupsandrights/CourseRights.java b/src/main/java/org/olat/course/groupsandrights/CourseRights.java
index 28934e391c2..2a10e242e5a 100644
--- a/src/main/java/org/olat/course/groupsandrights/CourseRights.java
+++ b/src/main/java/org/olat/course/groupsandrights/CourseRights.java
@@ -47,6 +47,8 @@ public class CourseRights {
     
     /** course right for groupmanagement */
     public static final String RIGHT_GROUPMANAGEMENT = BGRightManager.BG_RIGHT_PREFIX + "groupmngt";
+    /** course right for groupmanagement */
+    public static final String RIGHT_MEMBERMANAGEMENT = BGRightManager.BG_RIGHT_PREFIX + "membermngt";
     /** course right for course editor */
     public static final String RIGHT_COURSEEDITOR = BGRightManager.BG_RIGHT_PREFIX + "editor";
     /** course right for archive tool */
@@ -68,6 +70,7 @@ public class CourseRights {
         // initialize list of valid course rights
         rights = new ArrayList<String>();
         rights.add(RIGHT_GROUPMANAGEMENT);
+        rights.add(RIGHT_MEMBERMANAGEMENT);
         rights.add(RIGHT_COURSEEDITOR);
         rights.add(RIGHT_ARCHIVING);
         rights.add(RIGHT_ASSESSMENT);
@@ -95,6 +98,7 @@ public class CourseRights {
                 "",
                 RIGHT_ASSESSMENT,
                 RIGHT_GROUPMANAGEMENT,
+                RIGHT_MEMBERMANAGEMENT,
                 RIGHT_COURSEEDITOR,
                 RIGHT_ARCHIVING,
                 RIGHT_GLOSSARY,
@@ -112,6 +116,7 @@ public class CourseRights {
                 trans.translate("noRestriction"),
                 trans.translate(RIGHT_ASSESSMENT),
                 trans.translate(RIGHT_GROUPMANAGEMENT),
+                trans.translate(RIGHT_MEMBERMANAGEMENT),
                 trans.translate(RIGHT_COURSEEDITOR),
                 trans.translate(RIGHT_ARCHIVING),
                 trans.translate(RIGHT_GLOSSARY),
diff --git a/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_de.properties
index cbae90dbb89..818baf8fdf8 100644
--- a/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_de.properties
@@ -4,6 +4,7 @@ bgr.assess=Bewertungs-Werkzeug
 bgr.editor=Kurseditor
 bgr.glossary=Glossar-Werkzeug
 bgr.groupmngt=Gruppen-Verwaltung
+bgr.membermngt=Mitglieder-Verwaltung
 bgr.statistics=Statistiken
 noRestriction=Keine Einschr\u00E4nkung
 bgr.dbs=Kurs Datenbank
diff --git a/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_en.properties
index a4c7038181e..4bc9a88238e 100644
--- a/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/groupsandrights/_i18n/LocalStrings_en.properties
@@ -6,6 +6,7 @@ bgr.dbs=Course database
 bgr.editor=Course editor
 bgr.glossary=Glossary tool
 bgr.groupmngt=Group management
+bgr.membermngt=Members management
 bgr.statistics=Statistics
 menu.rights=Rights
 noRestriction=No restriction
diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java
index 291998ea7a1..62022cae1b5 100644
--- a/src/main/java/org/olat/course/member/MembersManagementMainController.java
+++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java
@@ -82,15 +82,21 @@ public class MembersManagementMainController extends MainLayoutBasicController
 	private boolean membersDirty;
 	private RepositoryEntry repoEntry;
 	
+	private final boolean entryAdmin, groupManagementRight, memberManagementRight;
+	
 	@Autowired
 	private ACService acService;
 	@Autowired
 	private AccessControlModule acModule;
 
-	public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry re) {
+	public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
+			RepositoryEntry re, boolean entryAdmin, boolean groupManagementRight, boolean memberManagementRight) {
 		super(ureq, wControl);
 		this.repoEntry = re;
 		this.toolbarPanel = toolbarPanel;
+		this.entryAdmin = entryAdmin;
+		this.groupManagementRight = groupManagementRight;
+		this.memberManagementRight = memberManagementRight;
 
 		//logging
 		getUserActivityLogger().setStickyActionType(ActionType.admin);
@@ -109,7 +115,11 @@ public class MembersManagementMainController extends MainLayoutBasicController
 		listenTo(columnLayoutCtr);
 		putInitialPanel(columnLayoutCtr.getInitialComponent());
 		
-		selectMenuItem(ureq, CMD_MEMBERS);
+		if(entryAdmin || memberManagementRight) {
+			selectMenuItem(ureq, CMD_MEMBERS);
+		} else if(groupManagementRight) {
+			selectMenuItem(ureq, CMD_GROUPS);
+		}
 	}
 	
 	private GenericTreeModel buildTreeModel() {
@@ -119,31 +129,37 @@ public class MembersManagementMainController extends MainLayoutBasicController
 		root.setAltText(translate("menu.members.alt"));
 		gtm.setRootNode(root);
 		
-		GenericTreeNode node = new GenericTreeNode(translate("menu.members"), CMD_MEMBERS);
-		node.setAltText(translate("menu.members.alt"));
-		node.setCssClass("o_sel_membersmgt_members");
-		root.addChild(node);
-		
-		node = new GenericTreeNode(translate("menu.groups"), CMD_GROUPS);
-		node.setAltText(translate("menu.groups.alt"));
-		node.setCssClass("o_sel_membersmgt_groups");
-		root.addChild(node);
+		if(entryAdmin || memberManagementRight) {
+			GenericTreeNode node = new GenericTreeNode(translate("menu.members"), CMD_MEMBERS);
+			node.setAltText(translate("menu.members.alt"));
+			node.setCssClass("o_sel_membersmgt_members");
+			root.addChild(node);
+		}
 
-		if(acModule.isEnabled()) {
+		if(entryAdmin || memberManagementRight || groupManagementRight) {
+			GenericTreeNode node = new GenericTreeNode(translate("menu.groups"), CMD_GROUPS);
+			node.setAltText(translate("menu.groups.alt"));
+			node.setCssClass("o_sel_membersmgt_groups");
+			root.addChild(node);
+		}
+
+		if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) {
 			//check if the course is managed and/or has offers
 			if(!RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.bookings)
 					|| acService.isResourceAccessControled(repoEntry.getOlatResource(), null)) {
-				node = new GenericTreeNode(translate("menu.orders"), CMD_BOOKING);
+				GenericTreeNode node = new GenericTreeNode(translate("menu.orders"), CMD_BOOKING);
 				node.setAltText(translate("menu.orders.alt"));
 				node.setCssClass("o_sel_membersmgt_orders");
 				root.addChild(node);
 			}
 		}
 
-		node = new GenericTreeNode(translate("menu.rights"), CMD_RIGHTS);
-		node.setAltText(translate("menu.rights.alt"));
-		node.setCssClass("o_sel_membersmgt_rights");
-		root.addChild(node);
+		if(entryAdmin) {
+			GenericTreeNode node = new GenericTreeNode(translate("menu.rights"), CMD_RIGHTS);
+			node.setAltText(translate("menu.rights.alt"));
+			node.setCssClass("o_sel_membersmgt_rights");
+			root.addChild(node);
+		}
 		return gtm;
 	}
 	
@@ -194,36 +210,44 @@ public class MembersManagementMainController extends MainLayoutBasicController
 		
 		Controller selectedCtrl = null;
 		if(CMD_MEMBERS.equals(cmd)) {
-			if(membersOverviewCtrl == null) {
-				membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry);
-				listenTo(membersOverviewCtrl);
-			} else if(membersDirty) {
-				membersOverviewCtrl.reloadMembers();
+			if(entryAdmin || memberManagementRight) {
+				if(membersOverviewCtrl == null) {
+					membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry);
+					listenTo(membersOverviewCtrl);
+				} else if(membersDirty) {
+					membersOverviewCtrl.reloadMembers();
+				}
+				mainVC.put("content", membersOverviewCtrl.getInitialComponent());
+				selectedCtrl = membersOverviewCtrl;
 			}
-			mainVC.put("content", membersOverviewCtrl.getInitialComponent());
-			selectedCtrl = membersOverviewCtrl;
 		} else if(CMD_GROUPS.equals(cmd)) {
-			if(groupsCtrl == null) {
-				groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry);
-				listenTo(groupsCtrl);
+			if(entryAdmin || memberManagementRight || groupManagementRight) {
+				if(groupsCtrl == null) {
+					groupsCtrl = new CourseBusinessGroupListController(ureq, bwControl, repoEntry);
+					listenTo(groupsCtrl);
+				}
+				groupsCtrl.reloadModel();
+				mainVC.put("content", groupsCtrl.getInitialComponent());
+				selectedCtrl = groupsCtrl;
 			}
-			groupsCtrl.reloadModel();
-			mainVC.put("content", groupsCtrl.getInitialComponent());
-			selectedCtrl = groupsCtrl;
 		} else if(CMD_BOOKING.equals(cmd)) {
-			if(ordersController == null) {
-				ordersController = new OrdersAdminController(ureq, bwControl, repoEntry.getOlatResource());
-				listenTo(ordersController);
+			if(acModule.isEnabled() && (entryAdmin || memberManagementRight)) {
+				if(ordersController == null) {
+					ordersController = new OrdersAdminController(ureq, bwControl, repoEntry.getOlatResource());
+					listenTo(ordersController);
+				}
+				mainVC.put("content", ordersController.getInitialComponent());
+				selectedCtrl = ordersController;
 			}
-			mainVC.put("content", ordersController.getInitialComponent());
-			selectedCtrl = ordersController;
 		} else if(CMD_RIGHTS.equals(cmd)) {
-			if(rightsController == null) {
-				rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry);
-				listenTo(rightsController);
+			if(entryAdmin) {
+				if(rightsController == null) {
+					rightsController = new GroupsAndRightsController(ureq, bwControl, repoEntry);
+					listenTo(rightsController);
+				}
+				mainVC.put("content", rightsController.getInitialComponent());
+				selectedCtrl = rightsController;
 			}
-			mainVC.put("content", rightsController.getInitialComponent());
-			selectedCtrl = rightsController;
 		}
 		
 		TreeNode selTreeNode = TreeHelper.findNodeByUserObject(cmd, menuTree.getTreeModel().getRootNode());
diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java
index bcd80211d40..147baf873dc 100644
--- a/src/main/java/org/olat/course/run/CourseRuntimeController.java
+++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java
@@ -249,6 +249,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 		if(!security.isEntryAdmin() && !isGuestOnly) {
 			List<String> rights = cgm.getRights(getIdentity());
 			courseRightsCache.put(CourseRights.RIGHT_GROUPMANAGEMENT, new Boolean(rights.contains(CourseRights.RIGHT_GROUPMANAGEMENT)));
+			courseRightsCache.put(CourseRights.RIGHT_MEMBERMANAGEMENT, new Boolean(rights.contains(CourseRights.RIGHT_MEMBERMANAGEMENT)));
 			courseRightsCache.put(CourseRights.RIGHT_COURSEEDITOR, new Boolean(rights.contains(CourseRights.RIGHT_COURSEEDITOR)));
 			courseRightsCache.put(CourseRights.RIGHT_ARCHIVING, new Boolean(rights.contains(CourseRights.RIGHT_ARCHIVING)));
 			courseRightsCache.put(CourseRights.RIGHT_ASSESSMENT, new Boolean(rights.contains(CourseRights.RIGHT_ASSESSMENT)));
@@ -361,7 +362,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	private void initTools(Dropdown tools, ICourse course, final UserCourseEnvironmentImpl uce) {
 		// 1) administrative tools
 		if (reSecurity.isEntryAdmin() || reSecurity.isCourseCoach() || reSecurity.isGroupCoach()
-				|| hasCourseRight(CourseRights.RIGHT_COURSEEDITOR)
+				|| hasCourseRight(CourseRights.RIGHT_COURSEEDITOR) || hasCourseRight(CourseRights.RIGHT_MEMBERMANAGEMENT)
 				|| hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || hasCourseRight(CourseRights.RIGHT_ARCHIVING)
 				|| hasCourseRight(CourseRights.RIGHT_STATISTICS) || hasCourseRight(CourseRights.RIGHT_DB)
 				|| hasCourseRight(CourseRights.RIGHT_ASSESSMENT)) {
@@ -384,7 +385,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				tools.addComponent(new Spacer(""));
 			}
 			
-			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT)) {
+			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || hasCourseRight(CourseRights.RIGHT_MEMBERMANAGEMENT)) {
 				membersLink = LinkFactory.createToolLink("unifiedusermngt", translate("command.opensimplegroupmngt"), this, "o_icon_membersmanagement");
 				membersLink.setElementCssClass("o_sel_course_members");
 				tools.addComponent(membersLink);
@@ -398,6 +399,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 				archiverLink = LinkFactory.createToolLink("archiver", translate("command.openarchiver"), this, "o_icon_archive_tool");
 				tools.addComponent(archiverLink);
 			}
+			
 			tools.addComponent(new Spacer(""));
 			
 			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_STATISTICS)) {
@@ -976,12 +978,14 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im
 	@Override
 	protected Activateable2 doMembers(UserRequest ureq) {
 		if(delayedClose == Delayed.members || requestForClose(ureq)) {
-			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT)) {
+			if (reSecurity.isEntryAdmin() || hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT) || hasCourseRight(CourseRights.RIGHT_MEMBERMANAGEMENT)) {
 				removeCustomCSS(ureq);
 				OLATResourceable ores = OresHelper.createOLATResourceableInstance("MembersMgmt", 0l);
 				ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores));
 				WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl());
-				MembersManagementMainController ctrl = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), toolbarPanel, getRepositoryEntry());
+				MembersManagementMainController ctrl = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), toolbarPanel,
+						getRepositoryEntry(), reSecurity.isEntryAdmin(), hasCourseRight(CourseRights.RIGHT_GROUPMANAGEMENT),
+						hasCourseRight(CourseRights.RIGHT_MEMBERMANAGEMENT));
 				listenTo(ctrl);
 				membersCtrl = pushController(ureq, translate("command.opensimplegroupmngt"), ctrl);
 				setActiveTool(membersLink);
-- 
GitLab