Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r4ae8ec393ca91db4253d2445e9ca8ca9d5a9c671 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 4ae8ec393ca91db4253d2445e9ca8ca9d5a9c671) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -285,6 +285,7 @@ label.tab.lesson = Lesson label.tab.class = Class label.tab.advanced = Advanced +label.tab.grouping = Grouping label.tab.conditions = Conditions label.tab.lesson.title = Select the design to add a lesson, and click on Add now label.tab.class.title = Use drag n' drop to select or unselect monitors and learners @@ -313,6 +314,8 @@ label.tab.advanced.field.split.number = No. learners per lesson label.tab.advanced.field.scheduling = Enable scheduling label.tab.advanced.split.desc = [0] instances of this lesson will be created and approximately [1] will be allocated to each lesson +label.tab.grouping.desc.1 = Choose a course grouping to apply to grouping activities in the chosen Learning Design, if any. +label.tab.grouping.desc.2 = If there is a branching based on the given grouping activity, the course grouping will not be applied. label.tab.conditions.dependencies = Dependencies label.tab.conditions.dependencies.desc = Select a lesson that learners will need to complete before they can see the lesson you are about to create. label.tab.conditions.timelimit = Time limitations Index: lams_central/src/java/org/lamsfoundation/lams/web/HomeController.java =================================================================== diff -u -rf3e44aee5373a1233080ea5acd1cb5959bb46544 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_central/src/java/org/lamsfoundation/lams/web/HomeController.java (.../HomeController.java) (revision f3e44aee5373a1233080ea5acd1cb5959bb46544) +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeController.java (.../HomeController.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.TreeSet; import java.util.Vector; @@ -53,6 +54,7 @@ import org.lamsfoundation.lams.logevent.service.ILogEventService; import org.lamsfoundation.lams.security.ISecurityService; import org.lamsfoundation.lams.usermanagement.Organisation; +import org.lamsfoundation.lams.usermanagement.OrganisationGrouping; import org.lamsfoundation.lams.usermanagement.Role; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -305,6 +307,10 @@ // find subgroups which can be set as multiple lessons start req.setAttribute("subgroups", organisation.getChildOrganisations()); + List orgGroupings = userManagementService.findByProperty(OrganisationGrouping.class, + "organisationId", organisationID); + req.setAttribute("orgGroupings", orgGroupings); + return "addLesson"; } Index: lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupController.java =================================================================== diff -u -rddb552387ac914ce1e6b67746a01632395120ac0 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupController.java (.../OrganisationGroupController.java) (revision ddb552387ac914ce1e6b67746a01632395120ac0) +++ lams_central/src/java/org/lamsfoundation/lams/web/OrganisationGroupController.java (.../OrganisationGroupController.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -52,6 +52,7 @@ import org.lamsfoundation.lams.learningdesign.GroupComparator; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.service.LearningDesignService; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.security.ISecurityService; @@ -144,7 +145,7 @@ // show groups page if this is a lesson mode and user have already chosen a grouping or there is no organisation // groupings available boolean lessonGroupsExist = (grouping != null) && (grouping.getGroups() != null) - && !grouping.getGroups().isEmpty() && !isDefaultChosenGrouping(grouping); + && !grouping.getGroups().isEmpty() && !LearningDesignService.isDefaultChosenGrouping(grouping); if (lessonGroupsExist || (activityID != null && orgGroupings.isEmpty())) { return viewGroups(request, response, organisationId, targetOrganisationId); } @@ -243,7 +244,7 @@ Grouping lessonGrouping = getLessonGrouping(activityId); Set lessonGroups = lessonGrouping == null ? null : lessonGrouping.getGroups(); if ((activityId != null) && (lessonGrouping != null) && (isExternalGroupsSelected || (orgGroupingId != null)) - && isDefaultChosenGrouping(lessonGrouping)) { + && LearningDesignService.isDefaultChosenGrouping(lessonGrouping)) { if (log.isDebugEnabled()) { log.debug("Removing default groups for grouping " + orgGroupingId); } @@ -600,24 +601,6 @@ return null; } - /** - * Check if the given groups are default for chosen grouping. There is actually no good way to detect this, but even - * if a custom grouping is mistaken for the default one, it should bring little harm. - */ - private boolean isDefaultChosenGrouping(Grouping grouping) { - Set groups = grouping.getGroups(); - for (Group group : groups) { - if (!group.getUsers().isEmpty()) { - return false; - } - } - if (groups == null || (grouping.getMaxNumberOfGroups() != null - && !grouping.getMaxNumberOfGroups().equals(groups.size()))) { - return false; - } - return true; - } - private UserDTO getUserDTO() { HttpSession ss = SessionManager.getSession(); return (UserDTO) ss.getAttribute(AttributeNames.USER); Index: lams_central/web/addLesson.jsp =================================================================== diff -u -r3e5d6e63b9642bb289e1fb248a7c9384bcc5abe6 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision 3e5d6e63b9642bb289e1fb248a7c9384bcc5abe6) +++ lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -64,6 +64,7 @@ + @@ -291,6 +292,22 @@ +
+

+

+
+ +
+
+ +
Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Group.java =================================================================== diff -u -r043b207afa1085bd51ebffa6f521eb1d91df82c6 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Group.java (.../Group.java) (revision 043b207afa1085bd51ebffa6f521eb1d91df82c6) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Group.java (.../Group.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -316,7 +316,7 @@ * attached */ public boolean mayBeDeleted() { - return getToolSessions().size() == 0; + return getToolSessions() == null || getToolSessions().size() == 0; } /** Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java =================================================================== diff -u -ra93a5cd28fb275ee24176ec9e131c85ff212d2fd -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java (.../Grouper.java) (revision a93a5cd28fb275ee24176ec9e131c85ff212d2fd) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/Grouper.java (.../Grouper.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -176,6 +176,9 @@ public void removeAllLearnersFromGrouping(Grouping grouping) throws GroupingException { for (Group group : grouping.getGroups()) { + if (group == null) { + continue; + } if (!group.mayBeDeleted()) { String error = "Tried to clear a group which cannot be removed (tool sessions probably exist). Grouping " + grouping + ". Not removing the groupings."; @@ -185,8 +188,11 @@ } for (Group group : grouping.getGroups()) { + if (group == null || group.getUsers() == null) { + continue; + } if (log.isDebugEnabled()) { - log.debug("Cleared all users and removed group " + group.getGroupName()); + log.debug("Cleared all users from group " + group.getGroupName()); } group.getUsers().clear(); } Index: lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java =================================================================== diff -u -r351f9417a32d396911387eeef3117fd40be35b7c -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 351f9417a32d396911387eeef3117fd40be35b7c) +++ lams_common/src/java/org/lamsfoundation/lams/learningdesign/service/LearningDesignService.java (.../LearningDesignService.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -33,11 +33,14 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; +import java.util.Set; import java.util.Vector; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.Group; +import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.LearningLibrary; @@ -654,4 +657,24 @@ return null; } } + + /** + * Check if the given groups are default for chosen grouping. There is actually no good way to detect this, but even + * if a custom grouping is mistaken for the default one, it should bring little harm. + */ + public static boolean isDefaultChosenGrouping(Grouping grouping) { + Set groups = grouping.getGroups(); + if (groups == null) { + return false; + } + for (Group group : groups) { + if (group.getUsers() != null && !group.getUsers().isEmpty()) { + return false; + } + } + if (grouping.getMaxNumberOfGroups() != null && !grouping.getMaxNumberOfGroups().equals(groups.size())) { + return false; + } + return true; + } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java =================================================================== diff -u -re9e7042e16de3421b8c0cd6b1cf6c59dede544b4 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision e9e7042e16de3421b8c0cd6b1cf6c59dede544b4) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/ILessonService.java (.../ILessonService.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -121,6 +121,11 @@ void performGrouping(Long lessonId, GroupingActivity groupingActivity, User learner) throws LessonServiceException; /** + * Applies given course grouping to all non-branch, non-modified groupings in the given Learnin Design. + */ + void performGrouping(long learningDesignId, long orgGroupingId); + + /** * Perform the grouping, setting the given list of learners as one group. * * @param groupingActivity Index: lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java =================================================================== diff -u -ra93a5cd28fb275ee24176ec9e131c85ff212d2fd -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision a93a5cd28fb275ee24176ec9e131c85ff212d2fd) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/service/LessonService.java (.../LessonService.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -40,16 +40,20 @@ import org.lamsfoundation.lams.learningdesign.Grouper; import org.lamsfoundation.lams.learningdesign.Grouping; import org.lamsfoundation.lams.learningdesign.GroupingActivity; +import org.lamsfoundation.lams.learningdesign.LearningDesign; import org.lamsfoundation.lams.learningdesign.ToolActivity; import org.lamsfoundation.lams.learningdesign.dao.IGroupingDAO; import org.lamsfoundation.lams.learningdesign.exception.GroupingException; +import org.lamsfoundation.lams.learningdesign.service.LearningDesignService; import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.LessonClass; import org.lamsfoundation.lams.lesson.dao.ILearnerProgressDAO; import org.lamsfoundation.lams.lesson.dao.ILessonClassDAO; import org.lamsfoundation.lams.lesson.dao.ILessonDAO; import org.lamsfoundation.lams.lesson.dto.LessonDetailsDTO; +import org.lamsfoundation.lams.usermanagement.OrganisationGroup; +import org.lamsfoundation.lams.usermanagement.OrganisationGrouping; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.MessageService; @@ -331,6 +335,40 @@ } @Override + public void performGrouping(long learningDesignId, long orgGroupingId) { + LearningDesign learningDesign = baseDAO.find(LearningDesign.class, learningDesignId); + OrganisationGrouping orgGrouping = groupingDAO.find(OrganisationGrouping.class, orgGroupingId); + // find all grouping activities + for (Activity activity : learningDesign.getActivities()) { + if (!activity.isGroupingActivity()) { + continue; + } + // skip groupings used for branching + // and ones that have already been initialised + GroupingActivity groupingActivity = (GroupingActivity) activity; + Grouping grouping = groupingActivity.getCreateGrouping(); + if (grouping == null || grouping.isUsedForBranching()) { + continue; + } + boolean groupingAlreadyApplied = grouping.getGroups() != null && !grouping.getGroups().isEmpty() + && !LearningDesignService.isDefaultChosenGrouping(grouping); + if (groupingAlreadyApplied) { + continue; + } + + // nuke all existing groups and create new ones + removeAllLearnersFromGrouping(grouping); + groupingDAO.flush(); + for (OrganisationGroup orgGroup : orgGrouping.getGroups()) { + Group group = Group.createLearnerGroup(grouping, orgGroup.getName(), + new HashSet<>(orgGroup.getUsers())); + grouping.getGroups().add(group); + } + groupingDAO.update(grouping); + } + } + + @Override public boolean addLearner(Long lessonId, Integer userId) throws LessonServiceException { Lesson lesson = lessonDAO.getLesson(lessonId); if (lesson == null) { Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -rf3e44aee5373a1233080ea5acd1cb5959bb46544 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision f3e44aee5373a1233080ea5acd1cb5959bb46544) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -2703,7 +2703,6 @@ } } - @SuppressWarnings("unchecked") private EmailProgressActivitiesProcessor getEmailProgressActivitiesProcessor(Long lessonId) { // TODO custom SQL to get the ids, number of users & marks in one go Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java =================================================================== diff -u -rf3e44aee5373a1233080ea5acd1cb5959bb46544 -r6be225f8d21a7f927da78ca099fc8c3915d7668a --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision f3e44aee5373a1233080ea5acd1cb5959bb46544) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringController.java (.../MonitoringController.java) (revision 6be225f8d21a7f927da78ca099fc8c3915d7668a) @@ -305,6 +305,7 @@ boolean imEnable = WebUtil.readBooleanParam(request, "imEnable", false); Integer splitNumberLessons = WebUtil.readIntParam(request, "splitNumberLessons", true); boolean schedulingEnable = WebUtil.readBooleanParam(request, "schedulingEnable", false); + Long orgGroupingId = WebUtil.readLongParam(request, "orgGroupingId", true); Date schedulingDatetime = null; Date schedulingEndDatetime = null; if (schedulingEnable) { @@ -384,6 +385,10 @@ monitoringService.createLessonClassForLesson(lesson.getLessonId(), organisation, learnerGroupInstanceName, lessonInstanceLearners, staffGroupInstanceName, staff, userId); + + if (orgGroupingId != null) { + lessonService.performGrouping(lesson.getLearningDesign().getLearningDesignId(), orgGroupingId); + } } catch (SecurityException e) { try { response.sendError(HttpServletResponse.SC_FORBIDDEN,