Index: lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java,v diff -u -r1.72 -r1.73 --- lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java 11 Dec 2006 06:56:27 -0000 1.72 +++ lams_common/src/java/org/lamsfoundation/lams/usermanagement/service/UserManagementService.java 14 Dec 2006 23:43:47 -0000 1.73 @@ -701,18 +701,25 @@ || role.getName().equals(Role.SYSADMIN)) { if (user.getWorkspace()==null) createWorkspaceForUser(user); } - // when a user becomes group manager, they need monitor role in subgroups - if (role.getName().equals(Role.GROUP_MANAGER)) { - if (org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) { - setMonitorForGroupManager(user, org.getChildOrganisations()); - } - } } uo.setUserOrganisationRoles(uors); - save(user); + // make sure group managers have monitor in each subgroup + checkGroupManager(user, org); } + private void checkGroupManager(User user, Organisation org) { + if (org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.COURSE_TYPE)) { + if (hasRoleInOrganisation(user, Role.ROLE_GROUP_MANAGER, org)) { + setMonitorForGroupManager(user, org.getChildOrganisations()); + } + } else if (org.getOrganisationType().getOrganisationTypeId().equals(OrganisationType.CLASS_TYPE)) { + if (hasRoleInOrganisation(user, Role.ROLE_GROUP_MANAGER, org.getParentOrganisation())) { + setMonitorForGroupManager(user, org.getParentOrganisation().getChildOrganisations()); + } + } + } + private void setMonitorForGroupManager(User user, Set childOrgs) { for (Object o : childOrgs) { Organisation org = (Organisation)o; @@ -729,11 +736,16 @@ Set uors = uo.getUserOrganisationRoles(); if (uors!=null && !uors.isEmpty()) { + boolean isMonitor = false; for (UserOrganisationRole uor : uors) { if (uor.getRole().getName().equals(Role.MONITOR)) { - return; + isMonitor = true; + break; } } + if (isMonitor) { + continue; + } } UserOrganisationRole monitor = new UserOrganisationRole(uo, (Role)findById(Role.class, Role.ROLE_MONITOR));