--- a/signup/impl/src/java/org/sakaiproject/signup/logic/SakaiFacadeImpl.java +++ b/signup/impl/src/java/org/sakaiproject/signup/logic/SakaiFacadeImpl.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.List; @@ -562,14 +563,48 @@ public List getAllPossibleCoordinators(SignupMeeting meeting) { List coordinators = new ArrayList(); List signUpUsers = getAllUsers(meeting); - for (SignupUser u : signUpUsers) { - if(hasPermissionToCreate(meeting,u.getInternalUserId())){ - coordinators.add(u); - } - - } - + List signupSites = meeting.getSignupSites(); + Set userIdsHasPermissionToCreate = new HashSet(); + if (signupSites != null) { + for (SignupSite site: signupSites) { + userIdsHasPermissionToCreate.addAll(getUserIdsHasPermissionToCreate(site)); + } + } + for (SignupUser signUpUser: signUpUsers) { + if (userIdsHasPermissionToCreate.contains(signUpUser.getInternalUserId())) { + coordinators.add(signUpUser); + } + } return coordinators; + } + + private Set getUserIdsHasPermissionToCreate(SignupSite site) { + Set userIds = new HashSet(); + userIds.addAll(getUserIdsWithPermission(SIGNUP_CREATE_SITE, site.getSiteId())); + if (!site.isSiteScope()) { + List signupGroups = site.getSignupGroups(); + for (SignupGroup group: signupGroups) { + userIds.addAll(getUserIdsWithPermission(SIGNUP_CREATE_GROUP_ALL, site.getSiteId(), group.getGroupId())); + userIds.addAll(getUserIdsWithPermission(SIGNUP_CREATE_GROUP, site.getSiteId(), group.getGroupId())); + } + } + return userIds; + } + + private List getUserIdsWithPermission(String permission, String siteId) { + return getUserIdsWithPermissionOnRealm(permission, siteService.siteReference(siteId)); + } + + private List getUserIdsWithPermission(String permission, String siteId, String groupId) { + return getUserIdsWithPermissionOnRealm(permission, siteService.siteGroupReference(siteId, groupId)); + } + + private List getUserIdsWithPermissionOnRealm(String permission, String realmId) { + List rv = new ArrayList(); + for (User user: securityService.unlockUsers(permission, realmId)) { + rv.add(user.getId()); + } + return rv; }