Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -rb6b28d32fe5b2923cbb30a6c9b889c02e1ba29cf -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 Binary files differ Index: lams_central/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r4f6c07c270475353380998f303bb19e3caaa063f -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 4f6c07c270475353380998f303bb19e3caaa063f) +++ lams_central/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -340,6 +340,7 @@ label.tab.advanced.intro.enable =Enable lesson intro label.tab.advanced.intro.description =Description: label.tab.advanced.intro.image =Display design image +label.tab.advanced.field.gradebook.complete =Display activity scores on completion label.tab.advanced.section.advanced =Advanced options label.tab.advanced.field.monitor =Start in Monitor label.tab.advanced.field.liveedit =Enable Live Edit Index: lams_central/web/addLesson.jsp =================================================================== diff -u -r4583983b64efe1d91fbb47cdde6a759a6a30e859 -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision 4583983b64efe1d91fbb47cdde6a759a6a30e859) +++ lams_central/web/addLesson.jsp (.../addLesson.jsp) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -112,7 +112,7 @@ -
+
?
-
+
?
@@ -136,7 +136,7 @@
-
+
?
-
+
?
@@ -180,20 +180,25 @@ - + +
-
+ + -
+
+
+
@@ -308,4 +313,4 @@ - + \ No newline at end of file Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml =================================================================== diff -u -r2c1a1ddb008c9257866826d3068d8ecfe0768e35 -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision 2c1a1ddb008c9257866826d3068d8ecfe0768e35) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/lesson/Lesson.hbm.xml (.../Lesson.hbm.xml) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -74,6 +74,9 @@ + + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171030.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171030.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171030.sql (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -0,0 +1,14 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-4453 Add "gradebook on lesson complete" feature +ALTER TABLE lams_lesson ADD COLUMN gradebook_on_complete TINYINT(1) DEFAULT '0'; + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java =================================================================== diff -u -r2c1a1ddb008c9257866826d3068d8ecfe0768e35 -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 2c1a1ddb008c9257866826d3068d8ecfe0768e35) +++ lams_common/src/java/org/lamsfoundation/lams/lesson/Lesson.java (.../Lesson.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -165,6 +165,11 @@ private Boolean allowLearnerRestart; /** + * Should learners be displayed activity gradebook on lesson complete. + */ + private Boolean gradebookOnComplete; + + /** * For lesson conditional release */ private Set precedingLessons; @@ -185,11 +190,12 @@ Integer previousLessonStateId, LearningDesign learningDesign, Set learnerProgresses, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysTolessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Boolean gradebookOnComplete, + Integer scheduledNumberDaysTolessonFinish) { this(null, name, description, createDateTime, null, null, user, lessonStateId, previousLessonStateId, enableLessonIntro, displayDesignImage, false, learningDesign, null, null, learnerProgresses, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, - forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysTolessonFinish); + forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, scheduledNumberDaysTolessonFinish); } /** full constructor */ @@ -198,7 +204,8 @@ Boolean enableLessonIntro, Boolean displayDesignImage, Boolean lockedForEdit, LearningDesign learningDesign, LessonClass lessonClass, Organisation organisation, Set learnerProgresses, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, - Boolean forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Boolean gradebookOnComplete, + Integer scheduledNumberDaysToLessonFinish) { this.lessonId = lessonId; this.lessonName = name; this.lessonDescription = description; @@ -221,6 +228,7 @@ this.enableLessonNotifications = enableLessonNotifications; this.forceLearnerRestart = forceLearnerRestart; this.allowLearnerRestart = allowLearnerRestart; + this.gradebookOnComplete = gradebookOnComplete; this.gradebookUserLessons = new HashSet(); this.marksReleased = false; this.scheduledNumberDaysToLessonFinish = scheduledNumberDaysToLessonFinish; @@ -239,11 +247,12 @@ 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 forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish) { + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Boolean gradebookOnComplete, + Integer scheduledNumberDaysToLessonFinish) { return new Lesson(lessonName, lessonDescription, new Date(System.currentTimeMillis()), user, Lesson.CREATED, null, ld, new HashSet(), enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, forceLearnerRestart, - allowLearnerRestart, scheduledNumberDaysToLessonFinish); + allowLearnerRestart, gradebookOnComplete, scheduledNumberDaysToLessonFinish); } // --------------------------------------------------------------------- @@ -572,6 +581,14 @@ this.allowLearnerRestart = allowLearnerRestart; } + public Boolean getGradebookOnComplete() { + return gradebookOnComplete; + } + + public void setGradebookOnComplete(Boolean gradebookOnComplete) { + this.gradebookOnComplete = gradebookOnComplete; + } + public Set getPrecedingLessons() { return precedingLessons; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r8714ac689fdad46746bbb7f28005ec080d1d4ba6 -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 8714ac689fdad46746bbb7f28005ec080d1d4ba6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -61,8 +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 forceLearnerRestart, Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, - Lesson precedingLesson); + Boolean forceLearnerRestart, Boolean allowLearnerRestart, Boolean gradebookOnComplete, + Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson); /** *

@@ -109,7 +109,7 @@ Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, - Integer numberDaysToLessonFinish, Long precedingLessonId); + Boolean gradebookOnComplete, Integer numberDaysToLessonFinish, Long precedingLessonId); /** * Create new lesson according to the learning design specified by the user, but for a preview session rather than a @@ -649,13 +649,15 @@ Long cloneLesson(Long lessonId, Integer creatorId, Boolean addAllStaff, Boolean addAllLearners, String[] staffIds, String[] learnerIds, Organisation group) throws MonitoringServiceException; - void removeLearnerContent(Long lessonId, Integer learnerId); - /** Generate an email containing the progress details for individual activities in a lesson. - * @return String[] {subject, email body} */ + /** + * Generate an email containing the progress details for individual activities in a lesson. + * + * @return String[] {subject, email body} + */ String[] generateLessonProgressEmail(Long lessonId, Integer userId); - + /** * Get list of users who completed the given lesson. */ Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r2a41cf4278b6f1becbc45e7708b6c8e4b2116e41 -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 2a41cf4278b6f1becbc45e7708b6c8e4b2116e41) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -354,7 +354,8 @@ Integer organisationId, Integer userID, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, - Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, Long precedingLessonId) { + Boolean allowLearnerRestart, Boolean gradebookOnComplete, Integer scheduledNumberDaysToLessonFinish, + Long precedingLessonId) { securityService.isGroupMonitor(organisationId, userID, "intializeLesson", true); @@ -384,10 +385,11 @@ Lesson initializedLesson = initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, runSeqFolder, LearningDesign.COPY_TYPE_LESSON, customCSV, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, enableLessonNotifications, - forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, precedingLesson); + forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, scheduledNumberDaysToLessonFinish, + precedingLesson); Long initializedLearningDesignId = initializedLesson.getLearningDesign().getLearningDesignId(); - auditLogLessonStateChange(initializedLesson,null, initializedLesson.getLessonStateId()); + auditLogLessonStateChange(initializedLesson, null, initializedLesson.getLessonStateId()); logEventService.logEvent(LogEvent.TYPE_TEACHER_LESSON_CREATE, userID, initializedLearningDesignId, initializedLesson.getLessonId(), null); @@ -407,24 +409,24 @@ return initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, null, LearningDesign.COPY_TYPE_PREVIEW, customCSV, false, false, learnerPresenceAvailable, learnerImAvailable, - liveEditEnabled, true, false, false, null, null); + liveEditEnabled, true, false, 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 forceLearnerRestart, Boolean allowLearnerRestart, - Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean gradebookOnComplete, 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, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, - precedingLesson); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, + scheduledNumberDaysToLessonFinish, precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, learningDesign.getTitle() }); return lesson; @@ -434,7 +436,8 @@ User user, WorkspaceFolder workspaceFolder, int copyType, String customCSV, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, - Boolean allowLearnerRestart, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean allowLearnerRestart, Boolean gradebookOnComplete, Integer scheduledNumberDaysToLessonFinish, + Lesson precedingLesson) { // copy the current learning design LearningDesign copiedLearningDesign = authoringService.copyLearningDesign(originalLearningDesign, new Integer(copyType), user, workspaceFolder, true, null, customCSV); @@ -450,8 +453,8 @@ Lesson lesson = createNewLesson(title, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish, - precedingLesson); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, + scheduledNumberDaysToLessonFinish, precedingLesson); writeAuditLog(MonitoringService.AUDIT_LESSON_CREATED_KEY, new Object[] { lessonName, copiedLearningDesign.getTitle() }); return lesson; @@ -669,7 +672,7 @@ if (MonitoringService.log.isDebugEnabled()) { MonitoringService.log.debug("=============Lesson " + lessonId + " started==============="); } - auditLogLessonStateChange(requestedLesson,null, requestedLesson.getLessonStateId()); + auditLogLessonStateChange(requestedLesson, null, requestedLesson.getLessonStateId()); logEventService.logEvent(LogEvent.TYPE_TEACHER_LESSON_START, userId, null, lessonId, null); } @@ -817,7 +820,7 @@ * @param status */ private void setLessonState(Lesson requestedLesson, Integer status) { - auditLogLessonStateChange(requestedLesson, requestedLesson.getLessonStateId(), status); + auditLogLessonStateChange(requestedLesson, requestedLesson.getLessonStateId(), status); requestedLesson.setPreviousLessonStateId(requestedLesson.getLessonStateId()); requestedLesson.setLessonStateId(status); lessonDAO.updateLesson(requestedLesson); @@ -829,29 +832,36 @@ String fromState = getStateDescription(previousStatus); String toState = getStateDescription(newStatus); writeAuditLog(MonitoringService.AUDIT_LESSON_STATUS_CHANGED, - new Object[] { lesson.getLessonName(), lesson.getLessonId(), fromState, toState }); + new Object[] { lesson.getLessonName(), lesson.getLessonId(), fromState, toState }); } private String getStateDescription(Integer status) { if (status != null) { - if (status.equals(Lesson.CREATED)) + if (status.equals(Lesson.CREATED)) { return messageService.getMessage("lesson.state.created"); - if (status.equals(Lesson.NOT_STARTED_STATE)) + } + if (status.equals(Lesson.NOT_STARTED_STATE)) { return messageService.getMessage("lesson.state.scheduled"); - if (status.equals(Lesson.STARTED_STATE)) + } + if (status.equals(Lesson.STARTED_STATE)) { return messageService.getMessage("lesson.state.started"); - if (status.equals(Lesson.SUSPENDED_STATE)) + } + if (status.equals(Lesson.SUSPENDED_STATE)) { return messageService.getMessage("lesson.state.suspended"); - if (status.equals(Lesson.FINISHED_STATE)) + } + if (status.equals(Lesson.FINISHED_STATE)) { return messageService.getMessage("lesson.state.finished"); - if (status.equals(Lesson.ARCHIVED_STATE)) + } + if (status.equals(Lesson.ARCHIVED_STATE)) { return messageService.getMessage("lesson.state.archived"); - if (status.equals(Lesson.REMOVED_STATE)) + } + if (status.equals(Lesson.REMOVED_STATE)) { return messageService.getMessage("lesson.state.removed"); + } } return "-"; } - + /** * Sets a lesson back to its previous state. Used when we "unsuspend" or "unarchive" * @@ -899,7 +909,7 @@ } lessonDAO.updateLesson(requestedLesson); - auditLogLessonStateChange(requestedLesson,currentStatus, newStatus); + auditLogLessonStateChange(requestedLesson, currentStatus, newStatus); logEventService.logEvent(LogEvent.TYPE_TEACHER_LESSON_CHANGE_STATE, requestedLesson.getUser().getUserId(), null, requestedLesson.getLessonId(), null); } @@ -979,9 +989,9 @@ // finally remove the learning design lessonDAO.delete(learningDesign); - + writeAuditLog(MonitoringService.AUDIT_LESSON_REMOVED_PERMANENTLY_KEY, - new Object[] { lesson.getLessonName(), lesson.getLessonId() }); + new Object[] { lesson.getLessonName(), lesson.getLessonId() }); } @Override @@ -1808,10 +1818,11 @@ LearningDesign copiedLearningDesign, Boolean enableLessonIntro, Boolean displayDesignImage, Boolean learnerPresenceAvailable, Boolean learnerImAvailable, Boolean liveEditEnabled, Boolean enableLessonNotifications, Boolean forceLearnerRestart, Boolean allowLearnerRestart, - Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { + Boolean gradebookOnComplete, Integer scheduledNumberDaysToLessonFinish, Lesson precedingLesson) { Lesson newLesson = Lesson.createNewLessonWithoutClass(lessonName, lessonDescription, user, copiedLearningDesign, enableLessonIntro, displayDesignImage, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, - enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, scheduledNumberDaysToLessonFinish); + enableLessonNotifications, forceLearnerRestart, allowLearnerRestart, gradebookOnComplete, + scheduledNumberDaysToLessonFinish); if (precedingLesson != null) { HashSet precedingLessons = new HashSet(); precedingLessons.add(precedingLesson); @@ -1962,8 +1973,8 @@ // be lost via Live // Edit. } else { - MonitoringService.log - .error("Request made to add a group which would be more than the max number of groups for the grouping " + MonitoringService.log.error( + "Request made to add a group which would be more than the max number of groups for the grouping " + grouping + ". This grouping is used for branching so we can't increase the max group number."); throw new MonitoringServiceException("Cannot increase the number of groups for the grouping " @@ -2155,8 +2166,8 @@ // can't remove the group if someone has already started working on // the branch. if (isActivityAttempted(branch)) { - MonitoringService.log - .warn("removeGroupFromBranch: A group member has already started the branch. Unable to remove the group from the branch. Group ID was " + MonitoringService.log.warn( + "removeGroupFromBranch: A group member has already started the branch. Unable to remove the group from the branch. Group ID was " + groupIDString); } else { branch.removeGroupFromBranch(group); @@ -2305,21 +2316,22 @@ @SuppressWarnings("unchecked") private EmailProgressActivitiesProcessor getEmailProgressActivitiesProcessor(Long lessonId) { - - // TODO custom SQL to get the ids, number of users & marks in one go + + // TODO custom SQL to get the ids, number of users & marks in one go Lesson lesson = lessonService.getLesson(lessonId); LearningDesign ld = lesson.getLearningDesign(); Long[] activityIds = new Long[ld.getActivities().size()]; - int i=0; - Iterator activityIterator = (Iterator) ld.getActivities().iterator(); - while ( activityIterator.hasNext() ) { + int i = 0; + Iterator activityIterator = ld.getActivities().iterator(); + while (activityIterator.hasNext()) { Activity activity = activityIterator.next(); activityIds[i] = activity.getActivityId(); i++; } Map numberOfUsersInActivity = getCountLearnersCurrentActivities(activityIds); - EmailProgressActivitiesProcessor processor = new EmailProgressActivitiesProcessor(ld, activityDAO, numberOfUsersInActivity); + EmailProgressActivitiesProcessor processor = new EmailProgressActivitiesProcessor(ld, activityDAO, + numberOfUsersInActivity); processor.parseLearningDesign(); return processor; } @@ -2336,28 +2348,27 @@ StringBuilder progress = new StringBuilder(); progress.append("

Lesson ").append(lesson.getLessonName()).append("

") - .append(getMessageService().getMessage("label.started")).append(" ") - .append(lesson.getStartDateTime()).append("

") - .append(getMessageService().getMessage("label.grouping.learners")).append("

") - .append("
").append(getMessageService().getMessage("label.status")).append("") + .append(getMessageService().getMessage("label.started")).append(" ").append(lesson.getStartDateTime()) + .append("

").append(getMessageService().getMessage("label.grouping.learners")).append("

") + .append("") - .append("") - .append("").append("") + .append("") - .append("") - .append("
") + .append(getMessageService().getMessage("label.status")).append("") .append(getMessageService().getMessage("progress.email.heading.number.learners")) - .append("%
").append(getMessageService().getMessage("label.not.started")).append("") - .append(notStarted).append("") - .append(asPercentage(notStarted, possibleLearnersCount)).append("%
").append(getMessageService().getMessage("lesson.chart.started")).append("") - .append(startedLearnersCount).append("") + .append("%
") + .append(getMessageService().getMessage("label.not.started")).append("").append(notStarted) + .append("").append(asPercentage(notStarted, possibleLearnersCount)).append("%
").append(getMessageService().getMessage("lesson.chart.started")) + .append("").append(startedLearnersCount).append("") .append(asPercentage(startedLearnersCount, possibleLearnersCount)).append("%
").append(getMessageService().getMessage("lesson.chart.completed")).append("") - .append(completedLearnersCount).append("") + .append("
").append(getMessageService().getMessage("lesson.chart.completed")) + .append("").append(completedLearnersCount).append("") .append(asPercentage(completedLearnersCount, possibleLearnersCount)).append("%
").append(possibleLearnersCount).append("") - .append("100%
") - .append("

").append(getMessageService().getMessage("progress.email.heading.overall.progress")).append("

") - .append("
").append(getMessageService().getMessage("label.activity")).append("") + .append("").append(possibleLearnersCount) + .append("").append("100%
").append("

") + .append(getMessageService().getMessage("progress.email.heading.overall.progress")).append("

") + .append("") - .append("").append("").append(""); @@ -2374,8 +2385,8 @@ } String title = activity.getTitle(); // null for gates if (title == null) { - title = activity.isGateActivity() ? getMessageService().getMessage("label.gate.title") : - getMessageService().getMessage("label.unknown"); + title = activity.isGateActivity() ? getMessageService().getMessage("label.gate.title") + : getMessageService().getMessage("label.unknown"); } if (activity.isBranchingActivity() || activity.isOptionsActivity()) { @@ -2401,8 +2412,7 @@ .append("%").append("").append("
") + .append(getMessageService().getMessage("label.activity")).append("") .append(getMessageService().getMessage("progress.email.heading.number.learners")) - .append("%
") + .append("%
") .append(getMessageService().getMessage("label.not.started")).append("").append(notStarted) .append("").append(asPercentage(notStarted, possibleLearnersCount)) .append("%
").append(numLearnersProcessed) .append("").append(asPercentage(numLearnersProcessed, possibleLearnersCount)) .append("%
").append("

 

").append("

 

") - .append("

") - .append(getMessageService().getMessage("progress.email.sent.automatically")) + .append("

").append(getMessageService().getMessage("progress.email.sent.automatically")) .append("

"); String subject = getMessageService().getMessage("progress.email.subject", @@ -2411,10 +2421,10 @@ return new String[] { subject, progress.toString() }; } - - private String asPercentage(Integer numerator, Integer denominator ) { + + private String asPercentage(Integer numerator, Integer denominator) { double raw = numerator.doubleValue() / denominator * 100; - return NumberUtil.formatLocalisedNumber(raw, (Locale)null, 2); + return NumberUtil.formatLocalisedNumber(raw, (Locale) null, 2); } @Override @@ -2443,7 +2453,8 @@ null, lesson.isEnableLessonIntro(), lesson.isDisplayDesignImage(), lesson.getLearnerPresenceAvailable(), lesson.getLearnerImAvailable(), lesson.getLiveEditEnabled(), lesson.getEnableLessonNotifications(), - lesson.getForceLearnerRestart(), lesson.getAllowLearnerRestart(), null, null); + lesson.getForceLearnerRestart(), lesson.getAllowLearnerRestart(), + lesson.getGradebookOnComplete(), null, null); // save LessonClasses this.createLessonClassForLesson(newLesson.getLessonId(), group, learnerGroupName, learnerUsers, @@ -2540,5 +2551,5 @@ return resetReadOnly; } - + } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -rf290e585db4574a5d35d289ed57e3cdd15b5ee0b -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision f290e585db4574a5d35d289ed57e3cdd15b5ee0b) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) @@ -185,6 +185,7 @@ Boolean liveEditEnabled = WebUtil.readBooleanParam(request, "liveEditEnabled", false); Boolean forceRestart = WebUtil.readBooleanParam(request, "forceRestart", false); Boolean allowRestart = WebUtil.readBooleanParam(request, "allowRestart", false); + boolean gradebookOnComplete = WebUtil.readBooleanParam(request, "gradebookOnComplete", false); Lesson newLesson = null; if ((copyType != null) && copyType.equals(LearningDesign.COPY_TYPE_PREVIEW)) { @@ -194,7 +195,7 @@ try { newLesson = getMonitoringService().initializeLesson(title, desc, ldId, organisationId, getUserId(), customCSV, false, false, learnerPresenceAvailable, learnerImAvailable, liveEditEnabled, false, - forceRestart, allowRestart, null, null); + forceRestart, allowRestart, gradebookOnComplete, null, null); } catch (SecurityException e) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the organisation"); return null; @@ -290,6 +291,7 @@ boolean timeLimitIndividualField = WebUtil.readBooleanParam(request, "timeLimitIndividual", false); Integer timeLimitIndividual = timeLimitEnable && timeLimitIndividualField ? timeLimitDays : null; Integer timeLimitLesson = timeLimitEnable && !timeLimitIndividualField ? timeLimitDays : null; + boolean gradebookOnComplete = WebUtil.readBooleanParam(request, "gradebookOnComplete", false); IUserManagementService userManagementService = MonitoringServiceProxy .getUserManagementService(getServlet().getServletContext()); @@ -330,18 +332,17 @@ } if (LamsDispatchAction.log.isDebugEnabled()) { - LamsDispatchAction.log - .debug("Creating lesson " - + (splitNumberLessons == null ? "" - : "(" + lessonIndex + "/" + splitNumberLessons + ") ") - + "\"" + lessonInstanceName + "\""); + LamsDispatchAction.log.debug("Creating lesson " + + (splitNumberLessons == null ? "" : "(" + lessonIndex + "/" + splitNumberLessons + ") ") + "\"" + + lessonInstanceName + "\""); } Lesson lesson = null; try { lesson = getMonitoringService().initializeLesson(lessonInstanceName, introDescription, ldId, organisationId, userId, null, introEnable, introImage, presenceEnable, imEnable, enableLiveEdit, - notificationsEnable, forceRestart, allowRestart, timeLimitIndividual, precedingLessonId); + notificationsEnable, forceRestart, allowRestart, gradebookOnComplete, timeLimitIndividual, + precedingLessonId); getMonitoringService().createLessonClassForLesson(lesson.getLessonId(), organisation, learnerGroupInstanceName, lessonInstanceLearners, staffGroupInstanceName, staff, userId); @@ -1025,8 +1026,9 @@ Integer possibleLearnersCount = getLessonService().getCountLessonLearners(lessonId, null); Integer completedLearnersCount = getMonitoringService().getCountLearnersCompletedLesson(lessonId); - Integer startedLearnersCount = getLessonService().getCountActiveLessonLearners(lessonId)- completedLearnersCount; - Integer notCompletedLearnersCount = possibleLearnersCount - completedLearnersCount - startedLearnersCount ; + Integer startedLearnersCount = getLessonService().getCountActiveLessonLearners(lessonId) + - completedLearnersCount; + Integer notCompletedLearnersCount = possibleLearnersCount - completedLearnersCount - startedLearnersCount; JSONObject responseJSON = new JSONObject(); JSONObject notStartedJSON = new JSONObject(); @@ -1036,8 +1038,7 @@ JSONObject startedJSON = new JSONObject(); startedJSON.put("name", getMessageService().getMessage("lesson.chart.started")); - startedJSON.put("value", Math - .round((startedLearnersCount.doubleValue()) / possibleLearnersCount * 100)); + startedJSON.put("value", Math.round((startedLearnersCount.doubleValue()) / possibleLearnersCount * 100)); responseJSON.append("data", startedJSON); JSONObject completedJSON = new JSONObject();