Index: lams_build/lib/lams/lams-monitoring.jar =================================================================== diff -u -r3dbf966d900adefc34cdad501d3c392118451cd9 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e Binary files differ Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -refd67298c7f0ea03a8fc9d670329812589db742a -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision efd67298c7f0ea03a8fc9d670329812589db742a) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -430,7 +430,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 =================================================================== diff -u -r3bd3be95f64eabe12ef8da8d8a7fcd9bcbd9c320 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision 3bd3be95f64eabe12ef8da8d8a7fcd9bcbd9c320) +++ lams_central/src/java/org/lamsfoundation/lams/authoring/web/AuthoringAction.java (.../AuthoringAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -282,7 +282,7 @@ if (learningDesignID != null) { User user = (User) getUserManagementService().findById(User.class, userID); Lesson lesson = getMonitoringService().initializeLessonWithoutLDcopy(title, "", learningDesignID, user, - null, false, false, false, false, true, true, false, null, null); + null, false, false, 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 =================================================================== diff -u -rb4460e9343e9676b6fc81f5f3c27b2800d865b20 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision b4460e9343e9676b6fc81f5f3c27b2800d865b20) +++ lams_central/src/java/org/lamsfoundation/lams/web/HomeAction.java (.../HomeAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -177,7 +177,7 @@ return mapping.findForward("lessonIntro"); } - if (lesson.getLearnerRestart()) { + if (lesson.getForceLearnerRestart()) { // start the lesson from the beginning each time getLessonService().removeLearnerProgress(lessonId, user.getUserID()); } @@ -187,6 +187,7 @@ } req.setAttribute(AttributeNames.PARAM_LESSON_ID, String.valueOf(lessonId)); + 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())); Index: lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java (.../LessonJoinServlet.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonJoinServlet.java (.../LessonJoinServlet.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -20,7 +20,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.webservice.xml; import java.io.IOException; @@ -263,7 +262,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; @@ -283,7 +283,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(); @@ -299,7 +300,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"; @@ -308,7 +310,7 @@ } Lesson lesson = LessonJoinServlet.monitoringService.initializeLesson(lessonName, lessonDescription, ldId, orgId, ownerUserId, null, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, enableNotifications, learnerRestart, null, null); + 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 =================================================================== diff -u -r82f71b01ece6c901faf317fa94fb10edfdac4df7 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision 82f71b01ece6c901faf317fa94fb10edfdac4df7) +++ lams_central/src/java/org/lamsfoundation/lams/webservice/xml/LessonManagerServlet.java (.../LessonManagerServlet.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -140,7 +140,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; @@ -341,7 +342,7 @@ // 1. init lesson Lesson lesson = LessonManagerServlet.monitoringService.initializeLesson(title, desc, ldId, organisation.getOrganisationId(), user.getUserId(), customCSV, false, false, presenceEnable, - imEnable, true, enableNotifications, false, null, null); + imEnable, true, enableNotifications, false, false, null, null); // 2. create lessonClass for lesson createLessonClass(lesson, organisation, user); // 3. start lesson @@ -368,7 +369,7 @@ // 1. init lesson Lesson lesson = LessonManagerServlet.monitoringService.initializeLesson(title, desc, ldId, orgMap.getOrganisation().getOrganisationId(), userMap.getUser().getUserId(), customCSV, false, - false, presenceEnable, imEnable, true, enableNotifications, false, null, null); + false, 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 =================================================================== diff -u -rf295ad79de8fe9d221c166fa90587d0be2fdda5b -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision f295ad79de8fe9d221c166fa90587d0be2fdda5b) +++ lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -190,7 +190,8 @@

-
+
+



Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -73,9 +73,12 @@ - + + + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040064.sql =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040064.sql (.../patch2040064.sql) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch2040064.sql (.../patch2040064.sql) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -1,6 +1,9 @@ -- Turn off autocommit, so nothing is committed if there is an error SET AUTOCOMMIT = 0; +-- LDEV-3839: Lesson restart + +-- Tables for archiving learner progress CREATE TABLE lams_learner_progress_archive ( learner_progress_id bigint(20) NOT NULL AUTO_INCREMENT, user_id bigint(20) NOT NULL, @@ -45,5 +48,10 @@ REFERENCES lams_learning_activity (activity_id) ON UPDATE CASCADE ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +-- make restart an option +ALTER TABLE lams_lesson CHANGE COLUMN learner_restart force_restart tinyint(1) DEFAULT '0', + ADD COLUMN allow_restart tinyint(1) DEFAULT '0'; + + COMMIT; SET AUTOCOMMIT = 1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java =================================================================== diff -u -r51fb2a37254f24bb2a805d4ffd54482c779f43fa -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 51fb2a37254f24bb2a805d4ffd54482c779f43fa) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -157,10 +157,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; @@ -181,11 +188,11 @@ Integer previousLessonStateId, LearningDesign learningDesign, Set learnerProgresses, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysTolessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysTolessonFinish) { this(null, name, description, createDateTime, null, null, user, lessonStateId, previousLessonStateId, enableLessonIntro, displayDesignImage, false, learningDesign, null, null, learnerProgresses, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, - learnerRestart, scheduledNumberDaysTolessonFinish); + forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysTolessonFinish); } /** full constructor */ @@ -194,7 +201,7 @@ Boolean enableLessonIntro, Boolean displayDesignImage, Boolean lockedForEdit, LearningDesign learningDesign, LessonClass lessonClass, Organisation organisation, Set learnerProgresses, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish) { this.lessonId = lessonId; this.lessonName = name; this.lessonDescription = description; @@ -215,7 +222,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; @@ -234,11 +242,11 @@ public static Lesson createNewLessonWithoutClass(String lessonName, String lessonDescription, User user, LearningDesign ld, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish) { return new Lesson(lessonName, lessonDescription, new Date(System.currentTimeMillis()), user, Lesson.CREATED, null, ld, new HashSet(), enableLessonIntro, displayDesignImage, learnerPresenceAvailable, - learnerImAvailable, liveEditEnabled, enableLessonNotifications, learnerRestart, - scheduledNumberDaysToLessonFinish); + learnerImAvailable, liveEditEnabled, enableLessonNotifications, forceLearnerRestart, + allowLearnerRestart, scheduledNumberDaysToLessonFinish); } // --------------------------------------------------------------------- @@ -562,14 +570,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 =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -104,6 +104,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 =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java (.../LearnerServiceProxy.java) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/service/LearnerServiceProxy.java (.../LearnerServiceProxy.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -27,7 +27,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; @@ -82,8 +82,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 =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java (.../CompleteActivityAction.java) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/CompleteActivityAction.java (.../CompleteActivityAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -89,8 +89,10 @@ if (lessonFinishCallbackUrl != null) { request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); } + if (progress.getLesson().getAllowLearnerRestart()) { request.setAttribute("lessonID", progress.getLesson().getLessonId()); } + } ActionForward forward = null; // Set activity as complete Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LearnerAction.java (.../LearnerAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -53,7 +53,7 @@ import org.lamsfoundation.lams.lesson.LearnerProgress; import org.lamsfoundation.lams.lesson.LearnerProgressArchive; import org.lamsfoundation.lams.lesson.Lesson; -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; @@ -213,11 +213,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()); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java (.../LessonCompleteActivityAction.java) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/action/LessonCompleteActivityAction.java (.../LessonCompleteActivityAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -42,16 +42,6 @@ /** * Action class run when the learner finishes a lesson. - * - * XDoclet definition: - * - * - * - * - * - * - * - * */ public class LessonCompleteActivityAction extends ActivityAction { @@ -84,7 +74,9 @@ if (lessonFinishCallbackUrl != null) { request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); } + if (learnerProgress.getLesson().getAllowLearnerRestart()) { request.setAttribute("lessonID", learnerProgress.getLesson().getLessonId()); + } return mapping.findForward("lessonComplete"); } Index: lams_learning/web/css/main.css =================================================================== diff -u -ra98c06398e86928f820ba6d8ea0d4bf864177d78 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/web/css/main.css (.../main.css) (revision a98c06398e86928f820ba6d8ea0d4bf864177d78) +++ lams_learning/web/css/main.css (.../main.css) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -51,6 +51,10 @@ width: 50px; } +td#restartButtonCell { + padding: 1px 2px 0px 0px; +} + div#lessonTitleRow { overflow: hidden; text-overflow:ellipsis; Index: lams_learning/web/includes/javascript/main.js =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/web/includes/javascript/main.js (.../main.js) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_learning/web/includes/javascript/main.js (.../main.js) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -1,5 +1,11 @@ // ----- CONTROL FRAME & WINDOW MANIPULATION ----- +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_learning/web/lessonComplete.jsp =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/web/lessonComplete.jsp (.../lessonComplete.jsp) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_learning/web/lessonComplete.jsp (.../lessonComplete.jsp) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -29,6 +29,14 @@ + + @@ -58,7 +66,7 @@ Index: lams_learning/web/main.jsp =================================================================== diff -u -r5e63656a12c02f7476564e278b43ff4ce86ac930 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_learning/web/main.jsp (.../main.jsp) (revision 5e63656a12c02f7476564e278b43ff4ce86ac930) +++ lams_learning/web/main.jsp (.../main.jsp) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -35,7 +35,9 @@ TOSTART_ACTIVITY : '', - SUPPORT_ACTIVITY : '' + SUPPORT_ACTIVITY : '', + + CONFIRM_RESTART : '' }, parentURL = "${notifyCloseURL}", @@ -97,13 +99,22 @@
- + + +
+ - +
+ + + +
Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r3399163940c61c9132223c758d274486e57ff9b7 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 3399163940c61c9132223c758d274486e57ff9b7) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.monitoring.service; import java.io.IOException; @@ -62,7 +61,8 @@ Lesson initializeLessonWithoutLDcopy(String lessonName, String lessonDescription, long learningDesignID, User user, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson); + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, + Lesson precedingLesson); /** *

@@ -108,8 +108,8 @@ Lesson initializeLesson(String lessonName, String lessonDescription, long learningDesignId, Integer organisationId, Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableNotifications, Boolean learnerRestart, Integer numberDaysToLessonFinish, - Long precedingLessonId); + Boolean enableNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, + Integer numberDaysToLessonFinish, Long precedingLessonId); /** * Create new lesson according to the learning design specified by the user, but for a preview session rather than a Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r14c33274b785517e5e3f6a7642dc7c6752a34411 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 14c33274b785517e5e3f6a7642dc7c6752a34411) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.monitoring.service; import java.io.IOException; @@ -347,8 +346,8 @@ public Lesson initializeLesson(String lessonName, String lessonDescription, long learningDesignId, Integer organisationId, Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, - Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean learnerRestart, - Integer scheduledNumberDaysToLessonFinish, Long precedingLessonId) { + Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, + Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, Long precedingLessonId) { securityService.isGroupMonitor(organisationId, userID, "intializeLesson", true); @@ -364,21 +363,21 @@ Organisation org = (Organisation) baseDAO.find(Organisation.class, organisationId); WorkspaceFolder runSeqFolder = null; int MAX_DEEP_LEVEL_FOLDER = 50; - for (int idx = 0; idx < MAX_DEEP_LEVEL_FOLDER; idx++) { - if ((org == null) || (runSeqFolder != null)) { - break; - } + for (int idx = 0; idx < MAX_DEEP_LEVEL_FOLDER; idx++) { + if ((org == null) || (runSeqFolder != null)) { + break; + } runSeqFolder = org.getRunSequencesFolder(); - if (runSeqFolder == null) { - org = org.getParentOrganisation(); - } + if (runSeqFolder == null) { + org = org.getParentOrganisation(); } + } User user = userID != null ? (User) baseDAO.find(User.class, userID) : null; Lesson initializedLesson = initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, runSeqFolder, LearningDesign.COPY_TYPE_LESSON, customCSV, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, - learnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); + forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); Long initializedLearningDesignId = initializedLesson.getLearningDesign().getLearningDesignId(); logEventService.logEvent(LogEvent.TYPE_TEACHER_LESSON_CREATE, userID, initializedLearningDesignId, @@ -400,23 +399,24 @@ return initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, null, LearningDesign.COPY_TYPE_PREVIEW, customCSV, false, false, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, true, false, null, null); + 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 learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableLessonNotifications, Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, - Lesson precedingLesson) { + 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, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, + precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, learningDesign.getTitle() }); return lesson; @@ -425,8 +425,8 @@ private Lesson initializeLesson(String lessonName, String lessonDescription, LearningDesign originalLearningDesign, User user, WorkspaceFolder workspaceFolder, int copyType, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, 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) { // copy the current learning design LearningDesign copiedLearningDesign = authoringService.copyLearningDesign(originalLearningDesign, new Integer(copyType), user, workspaceFolder, true, null, customCSV); @@ -442,7 +442,8 @@ Lesson lesson = createNewLesson(title, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, + precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, copiedLearningDesign.getTitle() }); return lesson; @@ -1737,11 +1738,11 @@ private Lesson createNewLesson(String lessonName, String lessonDescription, User user, LearningDesign copiedLearningDesign, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, - Boolean enableLessonNotifications, Boolean learnerRestart, Integer scheduledNumberDaysToLessonFinish, - Lesson precedingLesson) { + Boolean enableLessonNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, + Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { Lesson newLesson = Lesson.createNewLessonWithoutClass(lessonName, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, learnerRestart, scheduledNumberDaysToLessonFinish); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish); if (precedingLesson != null) { HashSet precedingLessons = new HashSet(); precedingLessons.add(precedingLesson); @@ -2225,7 +2226,7 @@ lesson.isEnableLessonIntro(), lesson.isDisplayDesignImage(), lesson.getLearnerPresenceAvailable(), lesson.getLearnerImAvailable(), lesson.getLiveEditEnabled(), lesson.getEnableLessonNotifications(), - lesson.getLearnerRestart(), null, null); + lesson.getForceLearnerRestart(), lesson.getAllowLearnerRestart(), null, null); // save LessonClasses newLesson = this.createLessonClassForLesson(newLesson.getLessonId(), group, Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -r87ce979ec6db428e139b064cc2e5c6f4b8eb3d77 -r509cebe97fca335b7d517abc7e8d9af03d6eab2e --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 87ce979ec6db428e139b064cc2e5c6f4b8eb3d77) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 509cebe97fca335b7d517abc7e8d9af03d6eab2e) @@ -21,7 +21,6 @@ * **************************************************************** */ - package org.lamsfoundation.lams.monitoring.web; import java.io.IOException; @@ -98,11 +97,9 @@ import com.google.gson.GsonBuilder; /** - *

* The action servlet that provide all the monitoring functionalities. It interact with the teacher via JSP monitoring * interface. - *

- * + * * @author Jacky Fang */ public class MonitoringAction extends LamsDispatchAction { @@ -141,13 +138,13 @@ 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; } /** @@ -174,7 +171,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)) { @@ -184,7 +182,7 @@ try { newLesson = getMonitoringService().initializeLesson(title, desc, ldId, organisationId, getUserId(), customCSV, false, false, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, false, - learnerRestart, null, null); + forceRestart, allowRestart, null, null); } catch (SecurityException e) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation"); return null; @@ -281,7 +279,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) @@ -342,7 +341,7 @@ try { lesson = getMonitoringService().initializeLesson(lessonInstanceName, introDescription, ldId, organisationId, userId, null, introEnable, introImage, presenceEnable, imEnable, enableLiveEdit, - notificationsEnable, learnerRestart, timeLimitIndividual, precedingLessonId); + notificationsEnable, forceRestart, allowRestart, timeLimitIndividual, precedingLessonId); getMonitoringService().createLessonClassForLesson(lesson.getLessonId(), organisation, learnerGroupInstanceName, lessonInstanceLearners, staffGroupInstanceName, staff, userId); @@ -1080,10 +1079,8 @@ Activity parentActivity = activity.getParentActivity(); if (activity.isBranchingActivity()) { 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()) { activityJSON.put("x", MonitoringAction .getActivityCoordinate(((OptionsWithSequencesActivity) activity).getStartXcoord()));