Index: lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java =================================================================== diff -u -rfb64b71d507fec0424ea6b7aed36e3f72aacb517 -rf31bd3fe23d04748089bf05754b09283a83c7687 --- lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java (.../SPEnrolmentServlet.java) (revision fb64b71d507fec0424ea6b7aed36e3f72aacb517) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/SPEnrolmentServlet.java (.../SPEnrolmentServlet.java) (revision f31bd3fe23d04748089bf05754b09283a83c7687) @@ -373,6 +373,8 @@ Iterator subcourseLearnerIterator = subcourseLearners.iterator(); while (subcourseLearnerIterator.hasNext()) { if (userId.equals(subcourseLearnerIterator.next().getUserId())) { + // IMPORTANT: if we found a matching existing learner, we get remove him from this collection + // so after this loop he does not get removed from subcourses subcourseLearnerIterator.remove(); userAlreadyLearner = true; break; @@ -430,76 +432,111 @@ private Set assignTeachers(Organisation course, List logins, ExtServer extServer, Integer creatorId, Set allUsersParsed, Map userIDs, Map>> existingRoles) throws UserInfoValidationException { - Set allUsersInCourses = new HashSet<>(); + // this is for detecting which users should be disabled + Set allUsersInCourse = new HashSet<>(); + // we set same roles in all subcourses, so there is point to have a single collection + Set subcourseRolesToSet = new HashSet<>(); + subcourseRolesToSet.add(Role.ROLE_LEARNER); + subcourseRolesToSet.add(Role.ROLE_AUTHOR); + subcourseRolesToSet.add(Role.ROLE_MONITOR); + Integer courseId = course.getOrganisationId(); // get existing teachers for given course Collection courseTeachers = userManagementService.getUsersFromOrganisationByRole(courseId, Role.MONITOR, true); - // add users to set containing all users in any subcourse which is processed - allUsersInCourses.addAll(courseTeachers); + // add users to set containing all users in any course which is processed + allUsersInCourse.addAll(courseTeachers); // go through each user for (String login : logins) { - // check if the user is already a teacher in the subcourse - // if so, there is nothing to do + // check if user is alread a teacher in this course boolean userAlreadyStaff = false; Integer userId = userIDs.get(login); + User user = null; Iterator subcourseLearnerIterator = courseTeachers.iterator(); while (subcourseLearnerIterator.hasNext()) { - if (userId.equals(subcourseLearnerIterator.next().getUserId())) { + User nextUser = subcourseLearnerIterator.next(); + if (userId.equals(nextUser.getUserId())) { + user = nextUser; + // IMPORTANT: if we found a matching existing teacher, we get remove him from this collection + // so after this loop he does not get removed from the course subcourseLearnerIterator.remove(); userAlreadyStaff = true; break; } } - if (userAlreadyStaff) { - continue; - } - // the user is not a teacher yet, so assign him roles and add him to lessons - Set existingCourseRoles = existingRoles.get(login).get(courseId); - if (existingCourseRoles == null) { - existingCourseRoles = new HashSet<>(); - } - existingCourseRoles.add(Role.ROLE_LEARNER); - existingCourseRoles.add(Role.ROLE_AUTHOR); - existingCourseRoles.add(Role.ROLE_MONITOR); - userManagementService.setRolesForUserOrganisation(userId, courseId, existingCourseRoles); + // if user is not a teacher, add him + if (!userAlreadyStaff) { + // the user is not a teacher in course yet, so assign him roles + Set existingCourseRoles = existingRoles.get(login).get(courseId); + if (existingCourseRoles == null) { + existingCourseRoles = new HashSet<>(); + } + // we modify existing role collection, as he can be also a course admin + existingCourseRoles.add(Role.ROLE_LEARNER); + existingCourseRoles.add(Role.ROLE_AUTHOR); + existingCourseRoles.add(Role.ROLE_MONITOR); + userManagementService.setRolesForUserOrganisation(userId, courseId, existingCourseRoles); - for (Lesson lesson : lessonService.getLessonsByGroup(courseId)) { - lessonService.addStaffMember(lesson.getLessonId(), userId); + String message = "Teacher \"" + login + "\" added to course " + courseId; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); } - String message = "Teacher \"" + login + "\" added to course " + courseId + " and its lessons"; - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); + // now go through each subcourse and make sure the user is also a teacher there and in its lessons + for (Organisation subcourse : course.getChildOrganisations()) { + if (user == null) { + user = (User) userManagementService.findById(User.class, userId); + } + userAlreadyStaff = userManagementService.hasRoleInOrganisation(user, Role.ROLE_MONITOR, subcourse); + if (!userAlreadyStaff) { + Integer subcourseId = subcourse.getOrganisationId(); + userManagementService.setRolesForUserOrganisation(userId, subcourseId, subcourseRolesToSet); + + for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { + lessonService.addStaffMember(lesson.getLessonId(), userId); + } + + String message = "Teacher \"" + login + "\" added to subcourse " + subcourseId + " and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); + } + } } - // user is a staff member, but he should not; remove learner role from course and lessons + // user is a staff member, but he should not; remove all roles from course and lessons for (User user : courseTeachers) { Map> existingCoursesRoles = existingRoles.get(user.getLogin()); Set existingCourseRoles = existingCoursesRoles == null ? null : existingCoursesRoles.get(courseId); if (existingCourseRoles != null) { + Integer userId = user.getUserId(); existingCourseRoles.remove(Role.ROLE_LEARNER); existingCourseRoles.remove(Role.ROLE_AUTHOR); existingCourseRoles.remove(Role.ROLE_MONITOR); - userManagementService.setRolesForUserOrganisation(user.getUserId(), courseId, existingCourseRoles); + userManagementService.setRolesForUserOrganisation(userId, courseId, existingCourseRoles); - for (Lesson lesson : lessonService.getLessonsByGroup(courseId)) { - lessonService.removeStaffMember(lesson.getLessonId(), user.getUserId()); - } + for (Organisation subcourse : course.getChildOrganisations()) { + Integer subcourseId = subcourse.getOrganisationId(); + userManagementService.setRolesForUserOrganisation(userId, subcourseId, new HashSet<>()); - String message = "Teacher \"" + user.getLogin() + "\" removed from course " + courseId - + " and its lessons"; - logger.info(message); - logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, - "SPEnrolment: " + message); + for (Lesson lesson : lessonService.getLessonsByGroup(subcourseId)) { + lessonService.addStaffMember(lesson.getLessonId(), userId); + } + } } + + String message = "Teacher \"" + user.getLogin() + "\" removed from course " + courseId + + ", its subcourses and its lessons"; + logger.info(message); + logEventService.logEvent(LogEvent.TYPE_USER_ORG_ADMIN, creatorId, null, null, null, + "SPEnrolment: " + message); } - return allUsersInCourses; + return allUsersInCourse; } @Override