Index: lams_build/lib/lams/lams-monitoring.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams-monitoring.jar,v diff -u -r1.66 -r1.67 Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v diff -u -r1.495 -r1.496 Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_central/conf/language/lams/ApplicationResources.properties,v diff -u -r1.163 -r1.164 --- lams_central/conf/language/lams/ApplicationResources.properties 16 Jun 2016 15:20:11 -0000 1.163 +++ lams_central/conf/language/lams/ApplicationResources.properties 27 Jun 2016 08:21:24 -0000 1.164 @@ -438,7 +438,8 @@ label.course.groups.grouping.use.confirm =Are you sure you want to use grouping "[0]"? Groups will be created for this lesson and learners assigned to them. label.course.groups.locked =Some users in this group already used the grouping. The group is now locked: you can not remove it or move users to another group. label.course.groups.locked.transfer =Are you sure you want to move these users to a locked group? You will not be allowed to move them to another group later. -label.tab.advanced.field.restart =Learners always start from the first activity +label.tab.advanced.field.force.restart =Learners always start from the first activity +label.tab.advanced.field.allow.restart =Learners can restart the lesson error.firstname.invalid.characters =First name contains invalid characters error.lastname.invalid.characters =Last name contains invalid characters error.username.invalid.characters =Username can only contain alphanumeric characters and no spaces. Index: lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java,v diff -u -r1.62 -r1.63 --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java 11 May 2016 07:30:18 -0000 1.62 +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java 27 Jun 2016 08:21:24 -0000 1.63 @@ -205,7 +205,6 @@ public ActionForward getToolOutputDefinitionsJSON(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, JSONException { - String wddxPacket; IAuthoringService authoringService = getAuthoringService(); Long toolContentID = WebUtil.readLongParam(request, "toolContentID"); Integer definitionType = ToolOutputDefinition.DATA_OUTPUT_DEFINITION_TYPE_CONDITION; @@ -479,7 +478,7 @@ if (learningDesignID != null) { User user = (User) getUserManagementService().findById(User.class, userID); Lesson lesson = getMonitoringService().initializeLessonWithoutLDcopy(title, "", learningDesignID, user, - null, false, false, true, false, false, true, true, false, null, null); + null, false, false, true, false, false, true, true, false, false, null, null); Organisation organisation = getMonitoringService().getOrganisation(organisationID); List staffList = new LinkedList(); Index: lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java,v diff -u -r1.73 -r1.74 --- lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java 11 May 2016 07:30:15 -0000 1.73 +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java 27 Jun 2016 08:21:24 -0000 1.74 @@ -198,7 +198,7 @@ return mapping.findForward("lessonIntro"); } - if (lesson.getLearnerRestart()) { + if (lesson.getForceLearnerRestart()) { // start the lesson from the beginning each time getLessonService().removeLearnerProgress(lessonId, user.getUserID()); } @@ -217,6 +217,7 @@ req.setAttribute(AttributeNames.PARAM_LESSON_ID, String.valueOf(lessonId)); req.setAttribute(AttributeNames.PARAM_EXPORT_PORTFOLIO_ENABLED, String.valueOf(isPortfolioEnabled)); + req.setAttribute("allowRestart", lesson.getAllowLearnerRestart()); req.setAttribute(AttributeNames.PARAM_PRESENCE_ENABLED, String.valueOf(lesson.getLearnerPresenceAvailable())); req.setAttribute(AttributeNames.PARAM_PRESENCE_IM_ENABLED, String.valueOf(lesson.getLearnerImAvailable())); @@ -453,15 +454,14 @@ url += URLEncoder.encode(Configuration.get(ConfigurationKeys.SERVER_URL), "UTF8"); res.sendRedirect(url); return null; + } + + req.getSession().invalidate(); - } else { - req.getSession().invalidate(); + // clear system shared session. + SessionManager.getSession().invalidate(); - // clear system shared session. - SessionManager.getSession().invalidate(); - - return mapping.findForward("index"); - } + return mapping.findForward("index"); } private ActionForward displayMessage(ActionMapping mapping, HttpServletRequest req, String messageKey) { Index: lams_central/src/java/org/lamsfoundation/lams/webservice/LessonManagerSoapBindingImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/webservice/LessonManagerSoapBindingImpl.java,v diff -u -r1.18 -r1.19 --- lams_central/src/java/org/lamsfoundation/lams/webservice/LessonManagerSoapBindingImpl.java 5 May 2016 08:10:15 -0000 1.18 +++ lams_central/src/java/org/lamsfoundation/lams/webservice/LessonManagerSoapBindingImpl.java 27 Jun 2016 08:21:24 -0000 1.19 @@ -85,7 +85,7 @@ // 1. init lesson Lesson lesson = LessonManagerSoapBindingImpl.monitoringService.initializeLesson(title, desc, ldId, orgMap.getOrganisation().getOrganisationId(), userMap.getUser().getUserId(), customCSV, false, - false, true, false, false, false, false, false, null, null); + false, true, false, false, false, false, false, false, null, null); // 2. create lessonClass for lesson createLessonClass(lesson, orgMap.getOrganisation(), userMap.getUser()); // 3. start lesson @@ -111,7 +111,7 @@ // 1. init lesson Lesson lesson = LessonManagerSoapBindingImpl.monitoringService.initializeLesson(title, desc, ldId, orgMap.getOrganisation().getOrganisationId(), userMap.getUser().getUserId(), customCSV, false, - false, true, false, false, false, false, false, null, null); + false, true, false, false, false, false, false, false, null, null); // 2. create lessonClass for lesson createLessonClass(lesson, orgMap.getOrganisation(), userMap.getUser()); // 3. schedule lesson Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java,v diff -u -r1.14 -r1.15 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java 11 May 2016 07:30:11 -0000 1.14 +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java 27 Jun 2016 08:21:24 -0000 1.15 @@ -20,7 +20,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.webservice.xml; import java.io.IOException; @@ -264,7 +263,8 @@ Boolean learnerImAvailable; Boolean liveEditEnabled; Boolean enableNotifications; - Boolean learnerRestart; + Boolean forceLearnerRestart; + Boolean allowLearnerRestart; Integer ownerUserId; Organisation org = (Organisation) LessonJoinServlet.userService.findById(Organisation.class, orgId); String learnerGroupName; @@ -285,7 +285,8 @@ learnerImAvailable = l.getLearnerImAvailable(); liveEditEnabled = l.getLiveEditEnabled(); enableNotifications = l.getEnableLessonNotifications(); - learnerRestart = l.getLearnerRestart(); + forceLearnerRestart = l.getForceLearnerRestart(); + allowLearnerRestart = l.getAllowLearnerRestart(); ownerUserId = l.getUser().getUserId(); learnerGroupName = l.getLessonClass().getLearnersGroup().getGroupName(); staffGroupName = l.getLessonClass().getStaffGroup().getGroupName(); @@ -302,7 +303,8 @@ learnerImAvailable = false; liveEditEnabled = false; enableNotifications = false; - learnerRestart = false; + forceLearnerRestart = false; + allowLearnerRestart = false; ownerUserId = ld.getUser().getUserId(); learnerGroupName = org.getName() + " Learners"; staffGroupName = org.getName() + " Staff"; @@ -312,8 +314,8 @@ } Lesson lesson = LessonJoinServlet.monitoringService.initializeLesson(lessonName, lessonDescription, ldId, orgId, ownerUserId, null, enableLessonIntro, displayDesignImage, learnerExportAvailable, - learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableNotifications, learnerRestart, - null, null); + learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableNotifications, forceLearnerRestart, + allowLearnerRestart, null, null); LessonJoinServlet.monitoringService.createLessonClassForLesson(lesson.getLessonId().longValue(), org, learnerGroupName, learnerList, staffGroupName, staffList, ownerUserId); LessonJoinServlet.monitoringService.startLesson(lesson.getLessonId().longValue(), ownerUserId); Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java,v diff -u -r1.65 -r1.66 --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java 23 May 2016 08:51:49 -0000 1.65 +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java 27 Jun 2016 08:21:24 -0000 1.66 @@ -147,7 +147,8 @@ boolean presenceEnable = WebUtil.readBooleanParam(request, CentralConstants.PARAM_LEARNER_PRESENCE_ENABLE, false); boolean imEnable = WebUtil.readBooleanParam(request, CentralConstants.PARAM_LEARNER_IM_ENABLE, false); - boolean enableNotifications = WebUtil.readBooleanParam(request, CentralConstants.PARAM_ENABLE_NOTIFICATIONS, false); + boolean enableNotifications = WebUtil.readBooleanParam(request, CentralConstants.PARAM_ENABLE_NOTIFICATIONS, + false); Long ldId = null; Long lsId = null; @@ -375,7 +376,7 @@ // 1. init lesson Lesson lesson = LessonManagerServlet.monitoringService.initializeLesson(title, desc, ldId, organisation.getOrganisationId(), user.getUserId(), customCSV, false, false, exportPortfolioEnable, - presenceEnable, imEnable, true, enableNotifications, false, null, null); + presenceEnable, imEnable, true, enableNotifications, false, false, null, null); // 2. create lessonClass for lesson createLessonClass(lesson, organisation, user); // 3. start lesson @@ -402,8 +403,8 @@ // 1. init lesson Lesson lesson = LessonManagerServlet.monitoringService.initializeLesson(title, desc, ldId, orgMap.getOrganisation().getOrganisationId(), userMap.getUser().getUserId(), customCSV, false, - false, exportPortfolioEnable, presenceEnable, imEnable, true, enableNotifications, false, null, - null); + false, exportPortfolioEnable, presenceEnable, imEnable, true, enableNotifications, false, false, + null, null); // 2. create lessonClass for lesson createLessonClass(lesson, orgMap.getOrganisation(), userMap.getUser()); // 3. schedule lesson Index: lams_central/web/addLesson.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_central/web/addLesson.jsp,v diff -u -r1.20 -r1.21 --- lams_central/web/addLesson.jsp 5 Feb 2016 09:45:12 -0000 1.20 +++ lams_central/web/addLesson.jsp 27 Jun 2016 08:21:24 -0000 1.21 @@ -190,7 +190,8 @@

-
+
+



Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml =================================================================== RCS file: /usr/local/cvsroot/lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml,v diff -u -r1.49 -r1.50 --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml 19 Jan 2016 09:47:15 -0000 1.49 +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml 27 Jun 2016 08:21:25 -0000 1.50 @@ -76,9 +76,12 @@ - + + + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040064.sql =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040064.sql,v diff -u -r1.1 -r1.2 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java,v diff -u -r1.47 -r1.48 --- lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java 11 May 2016 07:29:10 -0000 1.47 +++ lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java 27 Jun 2016 08:21:25 -0000 1.48 @@ -161,10 +161,17 @@ /** * Should Learner start the lesson from the beginning each time he enters it. + * Content is not removed, LessonProgress is deleted, not archived. */ - private Boolean learnerRestart; + private Boolean forceLearnerRestart; /** + * Should Learners be allowed to restart the lesson after finishing it. + * Content is not removed, LessonProgress is archived and then deleted. + */ + private Boolean allowLearnerRestart; + + /** * For lesson conditional release */ private Set precedingLessons; @@ -185,11 +192,12 @@ Integer previousLessonStateId, LearningDesign learningDesign, Set learnerProgresses, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableLessonNotifications, Boolean learnerRestart, Integer scheduledNumberDaysTolessonFinish) { + Boolean enableLessonNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, + Integer scheduledNumberDaysTolessonFinish) { this(null, name, description, createDateTime, null, null, user, lessonStateId, previousLessonStateId, enableLessonIntro, displayDesignImage, learnerExportAvailable, false, learningDesign, null, null, learnerProgresses, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, learnerRestart, scheduledNumberDaysTolessonFinish); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysTolessonFinish); } /** full constructor */ @@ -198,8 +206,8 @@ Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean lockedForEdit, LearningDesign learningDesign, LessonClass lessonClass, Organisation organisation, Set learnerProgresses, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, - Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean learnerRestart, - Integer scheduledNumberDaysToLessonFinish) { + Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, + Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish) { this.lessonId = lessonId; this.lessonName = name; this.lessonDescription = description; @@ -221,7 +229,8 @@ this.learnerProgresses = learnerProgresses; this.liveEditEnabled = liveEditEnabled; this.enableLessonNotifications = enableLessonNotifications; - this.learnerRestart = learnerRestart; + this.forceLearnerRestart = forceLearnerRestart; + this.allowLearnerRestart = allowLearnerRestart; this.gradebookUserLessons = new HashSet(); this.marksReleased = false; this.scheduledNumberDaysToLessonFinish = scheduledNumberDaysToLessonFinish; @@ -242,11 +251,12 @@ public static Lesson createNewLessonWithoutClass(String lessonName, String lessonDescription, User user, LearningDesign ld, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableLessonNotifications, Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish) { + Boolean enableLessonNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, + Integer scheduledNumberDaysToLessonFinish) { return new Lesson(lessonName, lessonDescription, new Date(System.currentTimeMillis()), user, Lesson.CREATED, null, ld, new HashSet(), enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, - learnerRestart, scheduledNumberDaysToLessonFinish); + forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish); } // --------------------------------------------------------------------- @@ -591,14 +601,22 @@ this.marksReleased = marksReleased; } - public Boolean getLearnerRestart() { - return learnerRestart; + public Boolean getForceLearnerRestart() { + return forceLearnerRestart; } - public void setLearnerRestart(Boolean learnerRestart) { - this.learnerRestart = learnerRestart; + public void setForceLearnerRestart(Boolean forceLearnerRestart) { + this.forceLearnerRestart = forceLearnerRestart; } + public Boolean getAllowLearnerRestart() { + return allowLearnerRestart; + } + + public void setAllowLearnerRestart(Boolean allowLearnerRestart) { + this.allowLearnerRestart = allowLearnerRestart; + } + public Set getPrecedingLessons() { return precedingLessons; } Index: lams_learning/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_learning/conf/language/lams/ApplicationResources.properties,v diff -u -r1.62 -r1.63 --- lams_learning/conf/language/lams/ApplicationResources.properties 21 Jun 2016 09:24:13 -0000 1.62 +++ lams_learning/conf/language/lams/ApplicationResources.properties 27 Jun 2016 08:21:21 -0000 1.63 @@ -125,6 +125,7 @@ label.learner.progress.support =Support Activities label.submit.button =Submit label.learner.progress.review.activity =Review activity +message.learner.progress.restart.confirm =Are you sure you want to start the lesson from the beginning? label.schedule.gate.reach =You have reached the gate on label.schedule.gate.offset.1 =The gate will only be opened label.schedule.gate.offset.2 =after. Index: lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java,v diff -u -r1.11 -r1.12 --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java 21 Jun 2016 09:24:13 -0000 1.11 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java 27 Jun 2016 08:21:21 -0000 1.12 @@ -26,7 +26,7 @@ import javax.servlet.ServletContext; import org.lamsfoundation.lams.learning.web.util.ActivityMapping; -import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.springframework.web.context.WebApplicationContext; @@ -81,8 +81,8 @@ return (ILamsToolService) LearnerServiceProxy.getDomainService(serlvetContext, "lamsToolService"); } - public static final IMonitoringService getMonitoringService(ServletContext servletContext) { - return (IMonitoringService) LearnerServiceProxy.getDomainService(servletContext, "monitoringService"); + public static final ILessonService getLessonService(ServletContext servletContext) { + return (ILessonService) LearnerServiceProxy.getDomainService(servletContext, "lessonService"); } /** Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java,v diff -u -r1.21 -r1.22 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 21 Jun 2016 09:24:13 -0000 1.21 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java 27 Jun 2016 08:21:21 -0000 1.22 @@ -89,7 +89,9 @@ if (lessonFinishCallbackUrl != null) { request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); } - request.setAttribute("lessonID", progress.getLesson().getLessonId()); + if (progress.getLesson().getAllowLearnerRestart()) { + request.setAttribute("lessonID", progress.getLesson().getLessonId()); + } } ActionForward forward = null; Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java,v diff -u -r1.60 -r1.61 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java 21 Jun 2016 09:24:13 -0000 1.60 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java 27 Jun 2016 08:21:21 -0000 1.61 @@ -55,7 +55,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgressArchive; import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.lesson.dto.LessonDTO; -import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.lesson.service.ILessonService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; @@ -317,11 +317,9 @@ attemptID, attemptedActivities, completedActivities, learnerProgress.getCurrentActivity(), learnerProgress.getLessonComplete(), learnerProgress.getStartDate(), learnerProgress.getFinishDate()); - // move learner to the beginning of lesson the same way Monitor can - IMonitoringService monitoringService = LearnerServiceProxy - .getMonitoringService(getServlet().getServletContext()); - monitoringService.forceCompleteActivitiesByUser(userID, userID, lessonID, - learnerProgress.getLesson().getLearningDesign().getFirstActivity().getActivityId(), true); + // remove learner progress + ILessonService lessonService = LearnerServiceProxy.getLessonService(getServlet().getServletContext()); + lessonService.removeLearnerProgress(lessonID, userID); IUserManagementService userManagementService = LearnerServiceProxy .getUserManagementService(getServlet().getServletContext()); @@ -567,7 +565,6 @@ ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); Object[] ret = learnerService.getStructuredActivityURLs(learnerId, lessonId); - ; request.setAttribute("progressList", ret[0]); request.setAttribute("currentActivityID", ret[1]); @@ -596,18 +593,8 @@ FlashMessage flashMessage = null; ICoreLearnerService learnerService = LearnerServiceProxy.getLearnerService(getServlet().getServletContext()); ActivityMapping activityMapping = LearnerServiceProxy.getActivityMapping(this.getServlet().getServletContext()); - Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); try { - String url; - Activity targetActivity = forceMoveShared(request, learnerService, lessonId); - - if (!targetActivity.isFloating()) { - url = activityMapping.getDisplayActivityAction(null); - } else { - url = activityMapping.getActivityURL(targetActivity); - } - // TODO: update for moving to Floating Activity in Flash Learner flashMessage = new FlashMessage("forceMove", activityMapping.getDisplayActivityAction(null)); } catch (Exception e) { Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java,v diff -u -r1.10 -r1.11 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java 21 Jun 2016 09:24:13 -0000 1.10 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java 27 Jun 2016 08:21:21 -0000 1.11 @@ -87,7 +87,9 @@ request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); } - request.setAttribute("lessonID", learnerProgress.getLesson().getLessonId()); + if (learnerProgress.getLesson().getAllowLearnerRestart()) { + request.setAttribute("lessonID", learnerProgress.getLesson().getLessonId()); + } return mapping.findForward("lessonComplete"); } Index: lams_learning/web/lessonComplete.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/lessonComplete.jsp,v diff -u -r1.28 -r1.29 --- lams_learning/web/lessonComplete.jsp 21 Jun 2016 09:24:13 -0000 1.28 +++ lams_learning/web/lessonComplete.jsp 27 Jun 2016 08:21:21 -0000 1.29 @@ -29,6 +29,14 @@ + +
@@ -54,10 +62,13 @@

-

- - -

+ <%-- lessonID is set in CompleteActivityAction and LessonCompleteActivityAction only if lesson.allowLearnerRestart is on --%> + +

+ + +

+

Index: lams_learning/web/main.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/main.jsp,v diff -u -r1.39 -r1.40 --- lams_learning/web/main.jsp 15 Aug 2015 21:21:40 -0000 1.39 +++ lams_learning/web/main.jsp 27 Jun 2016 08:21:21 -0000 1.40 @@ -35,7 +35,9 @@ TOSTART_ACTIVITY : '', - SUPPORT_ACTIVITY : '' + SUPPORT_ACTIVITY : '', + + CONFIRM_RESTART : '' }, parentURL = "${notifyCloseURL}", @@ -97,17 +99,27 @@

- + + + Index: lams_learning/web/css/main.css =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/css/main.css,v diff -u -r1.6 -r1.7 --- lams_learning/web/css/main.css 14 Aug 2015 07:34:56 -0000 1.6 +++ lams_learning/web/css/main.css 27 Jun 2016 08:21:21 -0000 1.7 @@ -51,10 +51,14 @@ width: 50px; } -td#exportButtonCell { +td#exportButtonCell{ padding: 3px 2px 5px 0px; } +td#restartButtonCell { + padding: 1px 2px 0px 0px; +} + div#lessonTitleRow { overflow: hidden; text-overflow:ellipsis; Index: lams_learning/web/includes/javascript/main.js =================================================================== RCS file: /usr/local/cvsroot/lams_learning/web/includes/javascript/main.js,v diff -u -r1.6 -r1.7 --- lams_learning/web/includes/javascript/main.js 17 May 2013 09:36:08 -0000 1.6 +++ lams_learning/web/includes/javascript/main.js 27 Jun 2016 08:21:21 -0000 1.7 @@ -7,6 +7,12 @@ "no"); } +function restartLesson(){ + if (confirm(LABELS.CONFIRM_RESTART)) { + $('#contentFrame').attr('src',APP_URL + 'learner.do?method=restartLesson&lessonID=' + lessonId); + } +} + function viewNotebookEntries(){ openPopUp(APP_URL + "notebook.do?method=viewAll&lessonID=" + lessonId, "Notebook", Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java,v diff -u -r1.125 -r1.126 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 11 May 2016 10:43:14 -0000 1.125 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java 27 Jun 2016 08:21:22 -0000 1.126 @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.monitoring.service; import java.io.IOException; @@ -62,8 +61,8 @@ Lesson initializeLessonWithoutLDcopy(String lessonName, String lessonDescription, long learningDesignID, User user, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableLessonNotifications, Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, - Lesson precedingLesson); + Boolean enableLessonNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, + Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson); /** *

@@ -111,8 +110,8 @@ Lesson initializeLesson(String lessonName, String lessonDescription, long learningDesignId, Integer organisationId, Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, - Boolean liveEditEnabled, Boolean enableNotifications, Boolean learnerRestart, - Integer numberDaysToLessonFinish, Long precedingLessonId); + Boolean liveEditEnabled, Boolean enableNotifications, Boolean forceLearnerRestart, + Boolean allowLearnerRestart, Integer numberDaysToLessonFinish, Long precedingLessonId); /** * Initialize a new lesson so as to start the learning process for a normal or preview learning session. It needs to Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java,v diff -u -r1.219 -r1.220 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 21 Jun 2016 09:24:12 -0000 1.219 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java 27 Jun 2016 08:21:22 -0000 1.220 @@ -359,7 +359,8 @@ Integer organisationId, Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, Long precedingLessonId) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, + Long precedingLessonId) { securityService.isGroupMonitor(organisationId, userID, "intializeLesson", true); @@ -389,7 +390,8 @@ Lesson initializedLesson = initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, runSeqFolder, LearningDesign.COPY_TYPE_LESSON, customCSV, enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, + precedingLesson); Long initializedLearningDesignId = initializedLesson.getLearningDesign().getLearningDesignId(); logEventService.logEvent(LogEvent.TYPE_TEACHER_LESSON_CREATE, userID, initializedLearningDesignId, @@ -411,24 +413,24 @@ return initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, null, LearningDesign.COPY_TYPE_PREVIEW, customCSV, false, false, false, learnerPresenceAvailable, - learnerImAvailable, liveEditEnabled, true, false, null, null); + learnerImAvailable, liveEditEnabled, true, false, false, null, null); } @Override public Lesson initializeLessonWithoutLDcopy(String lessonName, String lessonDescription, long learningDesignID, User user, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, - Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean learnerRestart, - Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, + Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { LearningDesign learningDesign = authoringService.getLearningDesign(learningDesignID); if (learningDesign == null) { throw new MonitoringServiceException( "Learning design for id=" + learningDesignID + " is missing. Unable to initialize lesson."); } Lesson lesson = createNewLesson(lessonName, lessonDescription, user, learningDesign, enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish, - precedingLesson); + liveEditEnabled, enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, + scheduledNumberDaysToLessonFinish, precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, learningDesign.getTitle(), learnerExportAvailable }); return lesson; @@ -438,7 +440,8 @@ User user, WorkspaceFolder workspaceFolder, int copyType, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, + Lesson precedingLesson) { // copy the current learning design LearningDesign copiedLearningDesign = authoringService.copyLearningDesign(originalLearningDesign, new Integer(copyType), user, workspaceFolder, true, null, customCSV); @@ -454,8 +457,8 @@ Lesson lesson = createNewLesson(title, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish, - precedingLesson); + liveEditEnabled, enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, + scheduledNumberDaysToLessonFinish, precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, copiedLearningDesign.getTitle(), learnerExportAvailable }); return lesson; @@ -503,7 +506,7 @@ } else { newLesson = initializeLesson(title, desc, ldId, organisationId, creatorUserId, customCSV, enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, - learnerImAvailable, liveEditEnabled, enableLessonNotifications, false, + learnerImAvailable, liveEditEnabled, enableLessonNotifications, false, false, scheduledNumberDaysToLessonFinish, precedingLessonId); } @@ -1953,12 +1956,12 @@ private Lesson createNewLesson(String lessonName, String lessonDescription, User user, LearningDesign copiedLearningDesign, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerExportAvailable, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, - Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean learnerRestart, - Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, + Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { Lesson newLesson = Lesson.createNewLessonWithoutClass(lessonName, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerExportAvailable, learnerPresenceAvailable, - learnerImAvailable, liveEditEnabled, enableLessonNotifications, learnerRestart, - scheduledNumberDaysToLessonFinish); + learnerImAvailable, liveEditEnabled, enableLessonNotifications, forceLearnerRestart, + allowLearnerRestart, scheduledNumberDaysToLessonFinish); if (precedingLesson != null) { HashSet precedingLessons = new HashSet(); precedingLessons.add(precedingLesson); @@ -2522,7 +2525,8 @@ null, lesson.isEnableLessonIntro(), lesson.isDisplayDesignImage(), lesson.getLearnerExportAvailable(), lesson.getLearnerPresenceAvailable(), lesson.getLearnerImAvailable(), lesson.getLiveEditEnabled(), - lesson.getEnableLessonNotifications(), lesson.getLearnerRestart(), null, null); + lesson.getEnableLessonNotifications(), lesson.getForceLearnerRestart(), + lesson.getAllowLearnerRestart(), null, null); // save LessonClasses newLesson = this.createLessonClassForLesson(newLesson.getLessonId(), group, learnerGroupName, Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java,v diff -u -r1.156 -r1.157 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 22 Jun 2016 03:57:14 -0000 1.156 +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java 27 Jun 2016 08:21:22 -0000 1.157 @@ -75,7 +75,6 @@ import org.lamsfoundation.lams.monitoring.service.IMonitoringService; import org.lamsfoundation.lams.monitoring.service.MonitoringServiceProxy; import org.lamsfoundation.lams.security.ISecurityService; -import org.lamsfoundation.lams.timezone.service.ITimezoneService; import org.lamsfoundation.lams.tool.exception.LamsToolServiceException; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.Role; @@ -141,8 +140,6 @@ private static IAuditService auditService; - private static ITimezoneService timezoneService; - private static ILessonService lessonService; private static ISecurityService securityService; @@ -166,33 +163,24 @@ return new FlashMessage(methodKey, getMonitoringService().getMessageService().getMessage("error.user.noprivilege"), FlashMessage.ERROR); - } else { - String[] msg = new String[1]; - msg[0] = e.getMessage(); - return new FlashMessage(methodKey, - getMonitoringService().getMessageService().getMessage("error.system.error", msg), - FlashMessage.CRITICAL_ERROR); } - } + String[] msg = new String[1]; + msg[0] = e.getMessage(); + return new FlashMessage(methodKey, + getMonitoringService().getMessageService().getMessage("error.system.error", msg), + FlashMessage.CRITICAL_ERROR); - private FlashMessage handleCriticalError(String methodKey, String messageKey) { - String message = getMonitoringService().getMessageService().getMessage(messageKey); - LamsDispatchAction.log.error("Error occured " + methodKey + " error "); - MonitoringAction.auditService = getAuditService(); - MonitoringAction.auditService.log(MonitoringAction.class.getName() + ":" + methodKey, message); - - return new FlashMessage(methodKey, message, FlashMessage.CRITICAL_ERROR); } private ActionForward redirectToURL(ActionMapping mapping, HttpServletResponse response, String url) throws IOException { - if (url != null) { - String fullURL = WebUtil.convertToFullURL(url); - response.sendRedirect(response.encodeRedirectURL(fullURL)); - return null; - } else { + if (url == null) { return mapping.findForward(MonitoringAction.NOT_SUPPORTED_SCREEN); } + + String fullURL = WebUtil.convertToFullURL(url); + response.sendRedirect(response.encodeRedirectURL(fullURL)); + return null; } /** @@ -220,7 +208,8 @@ Boolean learnerPresenceAvailable = WebUtil.readBooleanParam(request, "learnerPresenceAvailable", false); Boolean learnerImAvailable = WebUtil.readBooleanParam(request, "learnerImAvailable", false); Boolean liveEditEnabled = WebUtil.readBooleanParam(request, "liveEditEnabled", false); - Boolean learnerRestart = WebUtil.readBooleanParam(request, "learnerRestart", false); + Boolean forceRestart = WebUtil.readBooleanParam(request, "forceRestart", false); + Boolean allowRestart = WebUtil.readBooleanParam(request, "allowRestart", false); Lesson newLesson = null; if ((copyType != null) && copyType.equals(LearningDesign.COPY_TYPE_PREVIEW)) { @@ -230,7 +219,7 @@ try { newLesson = getMonitoringService().initializeLesson(title, desc, ldId, organisationId, getUserId(), customCSV, false, false, learnerExportAvailable, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, false, learnerRestart, null, null); + liveEditEnabled, false, forceRestart, allowRestart, null, null); } catch (SecurityException e) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation"); return null; @@ -328,7 +317,8 @@ Date schedulingDatetime = schedulingEnable ? MonitoringAction.LESSON_SCHEDULING_DATETIME_FORMAT.parse(request.getParameter("schedulingDatetime")) : null; - boolean learnerRestart = WebUtil.readBooleanParam(request, "learnerRestart", false); + boolean forceRestart = WebUtil.readBooleanParam(request, "forceRestart", false); + boolean allowRestart = WebUtil.readBooleanParam(request, "allowRestart", false); boolean precedingLessonEnable = WebUtil.readBooleanParam(request, "precedingLessonEnable", false); Long precedingLessonId = precedingLessonEnable ? WebUtil.readLongParam(request, "precedingLessonId", true) @@ -389,7 +379,7 @@ try { lesson = getMonitoringService().initializeLesson(lessonInstanceName, introDescription, ldId, organisationId, userId, null, introEnable, introImage, portfolioEnable, presenceEnable, - imEnable, enableLiveEdit, notificationsEnable, learnerRestart, timeLimitIndividual, + imEnable, enableLiveEdit, notificationsEnable, forceRestart, allowRestart, timeLimitIndividual, precedingLessonId); getMonitoringService().createLessonClassForLesson(lesson.getLessonId(), organisation, @@ -1246,10 +1236,8 @@ // old branching is just a rectangle like Tool // new branching has start and finish points, it's exploded BranchingActivity ba = (BranchingActivity) monitoringService.getActivityById(activity.getActivityId()); - activityJSON.put("x", - MonitoringAction.getActivityCoordinate(ba.getStartXcoord())); - activityJSON.put("y", - MonitoringAction.getActivityCoordinate(ba.getStartYcoord())); + activityJSON.put("x", MonitoringAction.getActivityCoordinate(ba.getStartXcoord())); + activityJSON.put("y", MonitoringAction.getActivityCoordinate(ba.getStartYcoord())); } else if (activity.isOptionsWithSequencesActivity() && flaFormat) { // old optional sequences is just a long rectangle // new optional sequences has start and finish points, it's exploded @@ -1478,20 +1466,6 @@ return MonitoringAction.auditService; } - /** - * Get TimezoneService bean. - * - * @return - */ - private ITimezoneService getTimezoneService() { - if (MonitoringAction.timezoneService == null) { - WebApplicationContext ctx = WebApplicationContextUtils - .getRequiredWebApplicationContext(getServlet().getServletContext()); - MonitoringAction.timezoneService = (ITimezoneService) ctx.getBean("timezoneService"); - } - return MonitoringAction.timezoneService; - } - private ILessonService getLessonService() { if (MonitoringAction.lessonService == null) { WebApplicationContext ctx = WebApplicationContextUtils @@ -1616,8 +1590,6 @@ * Creates a list of users out of string with comma-delimited user IDs. */ private List parseUserList(HttpServletRequest request, String paramName, Collection users) { - IUserManagementService userManagementService = MonitoringServiceProxy - .getUserManagementService(getServlet().getServletContext()); String userIdList = request.getParameter(paramName); String[] userIdArray = userIdList.split(","); List result = new ArrayList(userIdArray.length);

+ - +
+ + + +
- +