Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -ra9c5e4550ac78c7dde3dc3796d6cf8dc03d455e8 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision a9c5e4550ac78c7dde3dc3796d6cf8dc03d455e8) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -29,13 +29,24 @@ gradebook.columntitle.learnerName = Name gradebook.error.loaderror = There was an error loading the grid. If this problem persists, please contact your system administrator. label.ok = OK -gradebook.monitor.releasemarks.1 = Release -gradebook.monitor.releasemarks.2 = Hide -gradebook.monitor.releasemarks.3 = marks to learners -gradebook.monitor.releasemarks.check = Are you sure you want to release marks for this lesson to learners? -gradebook.monitor.releasemarks.check2 = Are you sure you want to hide marks from learners for this lesson? +gradebook.monitor.releasemarks.release = Release marks +gradebook.monitor.releasemarks.hide = Hide marks +gradebook.monitor.releasemarks.check.release = Are you sure you want to release marks for this lesson to learners? +gradebook.monitor.releasemarks.check.hide = Are you sure you want to hide marks from learners for this lesson? gradebook.monitor.releasemarks.toggle.panel.tooltip = Shows/hides a panel where learners can get notified of their marks for the this lesson. -error.releasemarks.fail = Mark release failed, please contact your system administrator. +gradebook.monitor.releasemarks.send.emails = Send emails to selected learners +gradebook.monitor.releasemarks.send.emails.confirm = Are you sure you want to send emails with lesson results to all learners checked in the list? +gradebook.monitor.releasemarks.email.preview = Email preview for +gradebook.monitor.releasemarks.schedule.button = Schedule release marks +gradebook.monitor.releasemarks.schedule.date = Schedule date +gradebook.monitor.releasemarks.schedule.send.emails = Send emails on release +gradebook.monitor.releasemarks.schedule.cancel = Cancel schedule +gradebook.monitor.releasemarks.schedule.confirm = Confirm release marks schedule date +gradebook.monitor.releasemarks.scheduled.date = Release marks are scheduled for {0}. +gradebook.monitor.releasemarks.scheduled.send.emails = Emails will be sent. +gradebook.monitor.releasemarks.scheduled.not.send.emails = Emails will not be sent. +error.releasemarks.fail = Mark release/hide failed, please contact your system administrator. + error.markhigher = Mark must be lower than maximum mark. error.cellsave = Problem saving cell content, please contact your system administrator. label.error = Error Index: lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r625a1082501027cf4b35af4cebcf34178d0bec67 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 625a1082501027cf4b35af4cebcf34178d0bec67) +++ lams_gradebook/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -29,12 +29,24 @@ gradebook.columntitle.learnerName = Name gradebook.error.loaderror = There was an error loading the grid. If this problem persists, please contact your system administrator. label.ok = OK -gradebook.monitor.releasemarks.1 = Release -gradebook.monitor.releasemarks.2 = Hide -gradebook.monitor.releasemarks.3 = marks to learners -gradebook.monitor.releasemarks.check = Are you sure you want to release marks for this lesson to learners? -gradebook.monitor.releasemarks.check2 = Are you sure you want to hide marks from learners for this lesson? -error.releasemarks.fail = Mark release failed, please contact your system administrator. +gradebook.monitor.releasemarks.release = Release marks +gradebook.monitor.releasemarks.hide = Hide marks +gradebook.monitor.releasemarks.check.release = Are you sure you want to release marks for this lesson to learners? +gradebook.monitor.releasemarks.check.hide = Are you sure you want to hide marks from learners for this lesson? +gradebook.monitor.releasemarks.toggle.panel.tooltip = Shows/hides a panel where learners can get notified of their marks for the this lesson. +gradebook.monitor.releasemarks.send.emails = Send emails to selected learners +gradebook.monitor.releasemarks.send.emails.confirm = Are you sure you want to send emails with lesson results to all learners checked in the list? +gradebook.monitor.releasemarks.email.preview = Email preview for +gradebook.monitor.releasemarks.schedule.button = Schedule release marks +gradebook.monitor.releasemarks.schedule.date = Schedule date +gradebook.monitor.releasemarks.schedule.send.emails = Send emails on release +gradebook.monitor.releasemarks.schedule.cancel = Cancel schedule +gradebook.monitor.releasemarks.schedule.confirm = Confirm release marks schedule date +gradebook.monitor.releasemarks.scheduled.date = Release marks are scheduled for {0}. +gradebook.monitor.releasemarks.scheduled.send.emails = Emails will be sent. +gradebook.monitor.releasemarks.scheduled.not.send.emails = Emails will not be sent. +error.releasemarks.fail = Mark release/hide failed, please contact your system administrator. + error.markhigher = Mark must be lower than maximum mark. error.cellsave = Problem saving cell content, please contact your system administrator. label.error = Error Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -re973111a2768823dac2f4e62f2e06143f7dba870 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -945,6 +945,12 @@ String messageKey = (isMarksReleased) ? "audit.marks.released.on" : "audit.marks.released.off"; String message = messageService.getMessage(messageKey, new String[] { lessonId.toString() }); logEventService.logEvent(LogEvent.TYPE_MARK_RELEASED, monitor.getUserID(), null, lessonId, null, message); + + try { + scheduleReleaseMarks(lessonId, null, false, null); + } catch (SchedulerException e) { + logger.error("Error when canceling scheduled learner marks release for lesson ID " + lessonId); + } } @Override @@ -967,6 +973,12 @@ logger.debug("Marks were released for lesson ID: " + lessonId); } + try { + scheduleReleaseMarks(lessonId, null, false, null); + } catch (SchedulerException e) { + logger.error("Error when canceling scheduled learner marks release for lesson ID " + lessonId); + } + return true; } @@ -998,55 +1010,46 @@ } @Override - public boolean scheduleReleaseMarks(long lessonId, int currentUserId, boolean sendEmails, Date scheduleDate) + public void scheduleReleaseMarks(long lessonId, Integer currentUserId, boolean sendEmails, Date scheduleDate) throws SchedulerException { - User user = gradebookDAO.find(User.class, currentUserId); - TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); - Date tzScheduleDate = scheduleDate == null ? null - : DateUtil.convertFromTimeZoneToDefault(userTimeZone, scheduleDate); String triggerName = "releaseMarksTrigger:" + lessonId; - Trigger releaseMarksTrigger = null; - - try { - releaseMarksTrigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName)); - } catch (SchedulerException e) { - logger.error("Error while fetching Quartz trigger \"" + triggerName + "\"", e); - } - + Trigger releaseMarksTrigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName)); if (releaseMarksTrigger == null) { if (scheduleDate == null) { // the job was not scheduled and we do not want to schedule it anyway, so just return - return true; + return; } - // setup the message for scheduling job - JobDetail releaseMarksJob = JobBuilder.newJob(ReleaseMarksJob.class) - .withIdentity("releaseMarks:" + lessonId) - .withDescription("Release marks for lesson " + lessonId + " by user " + currentUserId) - .usingJobData(AttributeNames.PARAM_LESSON_ID, lessonId) - .usingJobData(AttributeNames.PARAM_USER_ID, currentUserId).usingJobData("sendEmails", sendEmails) - .build(); + } else { + scheduler.deleteJob(releaseMarksTrigger.getJobKey()); + logger.debug("Unscheduled release marks for lesson ID " + lessonId); + if (scheduleDate == null) { + return; + } + releaseMarksTrigger = null; + } - // create customised triggers - releaseMarksTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName).startAt(tzScheduleDate).build(); - scheduler.scheduleJob(releaseMarksJob, releaseMarksTrigger); + // setup the message for scheduling job + JobDetail releaseMarksJob = JobBuilder.newJob(ReleaseMarksJob.class).withIdentity("releaseMarks:" + lessonId) + .withDescription("Release marks for lesson " + lessonId + " by user " + currentUserId) + .usingJobData(AttributeNames.PARAM_LESSON_ID, lessonId) + .usingJobData(AttributeNames.PARAM_USER_ID, currentUserId).usingJobData("sendEmails", sendEmails) + .build(); - if (logger.isDebugEnabled()) { - logger.debug("Scheduled release marks for lesson ID " + lessonId + " by user ID " + currentUserId - + " for date " + scheduleDate); - } + User user = gradebookDAO.find(User.class, currentUserId); + TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); + Date tzScheduleDate = scheduleDate == null ? null + : DateUtil.convertFromTimeZoneToDefault(userTimeZone, scheduleDate); + // create customised triggers + releaseMarksTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName).startAt(tzScheduleDate).build(); + scheduler.scheduleJob(releaseMarksJob, releaseMarksTrigger); - return true; + if (logger.isDebugEnabled()) { + logger.debug("Scheduled release marks for lesson ID " + lessonId + " by user ID " + currentUserId + + " for date " + scheduleDate); } - if (scheduleDate == null) { - scheduler.deleteJob(releaseMarksTrigger.getJobKey()); - logger.debug("Unscheduled release marks for lesson ID " + lessonId); - return true; - } - logger.warn("An attempt to reschedule release marks for lesson ID " + lessonId - + ". First unschedule the release and only then schedule it again."); - return false; + return; } @Override Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -re973111a2768823dac2f4e62f2e06143f7dba870 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -206,7 +206,7 @@ Map getReleaseMarksSchedule(long lessonId, int currentUserId); - boolean scheduleReleaseMarks(long lessonId, int currentUserId, boolean sendEmails, Date scheduleDate) + void scheduleReleaseMarks(long lessonId, Integer currentUserId, boolean sendEmails, Date scheduleDate) throws SchedulerException; String getReleaseMarksEmailContent(long lessonId, int userID); Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java =================================================================== diff -u -re973111a2768823dac2f4e62f2e06143f7dba870 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -271,14 +271,24 @@ @RequestMapping("/displayReleaseMarksPanel") public String displayReleaseMarksPanel(@RequestParam long lessonID, Model model) { - Map scheduleData = gradebookService.getReleaseMarksSchedule(lessonID, getUser().getUserID()); - if (scheduleData != null) { - Date scheduleDate = (Date) scheduleData.get("userTimeZoneScheduleDate"); - if (scheduleDate != null) { - model.addAttribute("releaseMarksScheduleDate", RELEASE_MARKS_SCHEDULE_DATE_FORMAT.format(scheduleDate)); - model.addAttribute("releaseMarksSendEmails", scheduleData.get("sendEmails")); + Lesson lesson = lessonService.getLesson(lessonID); + if (lesson.getMarksReleased()) { + model.addAttribute("marksReleased", true); + } else { + model.addAttribute("marksReleased", false); + + Map scheduleData = gradebookService.getReleaseMarksSchedule(lessonID, + getUser().getUserID()); + if (scheduleData != null) { + Date scheduleDate = (Date) scheduleData.get("userTimeZoneScheduleDate"); + if (scheduleDate != null) { + model.addAttribute("releaseMarksScheduleDate", + RELEASE_MARKS_SCHEDULE_DATE_FORMAT.format(scheduleDate)); + model.addAttribute("releaseMarksSendEmails", scheduleData.get("sendEmails")); + } } } + return "releaseLessonMarks"; } @@ -288,6 +298,7 @@ return gradebookService.getReleaseMarksEmailContent(lessonID, userID); } + @SuppressWarnings("unchecked") @RequestMapping("/sendReleaseMarksEmails") @ResponseBody public String sendReleaseMarksEmails(@RequestParam long lessonID, @@ -300,7 +311,7 @@ : JsonUtil.readArray(excludedLearnersString); if (includedLearners == null && excludedLearners == null) { throw new IllegalArgumentException( - "Neither included nor excluded learners found when sending an email with marks."); + "neither included nor excluded learners found when sending an email with marks."); } try { @@ -327,6 +338,10 @@ } } + if (recipientIDs.isEmpty()) { + return "list of recipients it empty"; + } + gradebookService.sendReleaseMarksEmails(lessonID, recipientIDs, eventNotificationService); } catch (Exception e) { @@ -345,19 +360,22 @@ Date scheduleDate = null; if (StringUtils.isNotBlank(scheduleDateString)) { scheduleDate = RELEASE_MARKS_SCHEDULE_DATE_FORMAT.parse(scheduleDateString); + + // set seconds and miliseconds to 0 Calendar calendarDate = Calendar.getInstance(); calendarDate.setTime(scheduleDate); calendarDate.set(Calendar.SECOND, 0); calendarDate.set(Calendar.MILLISECOND, 0); scheduleDate = calendarDate.getTime(); + // if schedule is less then in 5 seconds or in the past, refuse it if (scheduleDate.getTime() - 5000 < new Date().getTime()) { return "schedule date must be in future"; } } - boolean result = gradebookService.scheduleReleaseMarks(lessonID, getUser().getUserID(), sendEmails, - scheduleDate); - return result ? "success" : "an illegal attempt to reschedule release marks"; + gradebookService.scheduleReleaseMarks(lessonID, scheduleDate == null ? null : getUser().getUserID(), + sendEmails, scheduleDate); + return "success"; } catch (Exception e) { return e.getMessage(); } Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -re973111a2768823dac2f4e62f2e06143f7dba870 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision e973111a2768823dac2f4e62f2e06143f7dba870) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -81,6 +81,7 @@ function toggleReleaseMarksPanel(reload){ var releaseMarksPanel = $('#releaseMarksPanel'); if (reload) { + // force reload releaseMarksPanel.empty(); } @@ -826,7 +827,7 @@ "> Index: lams_gradebook/web/releaseLessonMarks.jsp =================================================================== diff -u -re973111a2768823dac2f4e62f2e06143f7dba870 -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 --- lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision e973111a2768823dac2f4e62f2e06143f7dba870) +++ lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) @@ -40,41 +40,47 @@ @@ -325,62 +339,83 @@
- + +
-

Email preview

+

 

-
+
+ - Schedule date: - +
+

+ +
+
+

+ +
- Release marks are scheduled for ${releaseMarksScheduleDate}. -
Emails will ${releaseMarksSendEmails ? '' : 'not '}be sent. +
+

+ + + +
+ + + + + + + + +

+
-
-