Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r81b83a2cbd3cfe68e9096211cd0df9eada37fc4a -re973111a2768823dac2f4e62f2e06143f7dba870 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 81b83a2cbd3cfe68e9096211cd0df9eada37fc4a) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) @@ -971,21 +971,24 @@ } @Override - public Date getReleaseMarksScheduleDate(long lessonId, int currentUserId) { + public Map getReleaseMarksSchedule(long lessonId, int currentUserId) { String triggerName = "releaseMarksTrigger:" + lessonId; try { Trigger releaseMarksTrigger = scheduler.getTrigger(TriggerKey.triggerKey(triggerName)); if (releaseMarksTrigger == null) { return null; } - User user = gradebookDAO.find(User.class, currentUserId); - TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); + Date scheduleDate = releaseMarksTrigger.getFireTimeAfter(new Date()); if (scheduleDate == null) { return null; } - return DateUtil.convertToTimeZoneFromDefault(userTimeZone, scheduleDate); + Map result = new HashMap<>(releaseMarksTrigger.getJobDataMap()); + User user = gradebookDAO.find(User.class, currentUserId); + TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); + result.put("userTimeZoneScheduleDate", DateUtil.convertToTimeZoneFromDefault(userTimeZone, scheduleDate)); + return result; } catch (SchedulerException e) { logger.error("Error while fetching Quartz trigger \"" + triggerName + "\"", e); @@ -995,7 +998,7 @@ } @Override - public void scheduleReleaseMarks(long lessonId, int currentUserId, boolean sendEmails, Date scheduleDate) + public boolean scheduleReleaseMarks(long lessonId, int currentUserId, boolean sendEmails, Date scheduleDate) throws SchedulerException { User user = gradebookDAO.find(User.class, currentUserId); TimeZone userTimeZone = TimeZone.getTimeZone(user.getTimeZone()); @@ -1014,7 +1017,7 @@ if (releaseMarksTrigger == null) { if (scheduleDate == null) { // the job was not scheduled and we do not want to schedule it anyway, so just return - return; + return true; } // setup the message for scheduling job JobDetail releaseMarksJob = JobBuilder.newJob(ReleaseMarksJob.class) @@ -1027,12 +1030,23 @@ // create customised triggers releaseMarksTrigger = TriggerBuilder.newTrigger().withIdentity(triggerName).startAt(tzScheduleDate).build(); scheduler.scheduleJob(releaseMarksJob, releaseMarksTrigger); - } else if (scheduleDate == null) { + + if (logger.isDebugEnabled()) { + logger.debug("Scheduled release marks for lesson ID " + lessonId + " by user ID " + currentUserId + + " for date " + scheduleDate); + } + + return true; + } + if (scheduleDate == null) { scheduler.deleteJob(releaseMarksTrigger.getJobKey()); - } else { - releaseMarksTrigger = releaseMarksTrigger.getTriggerBuilder().startAt(tzScheduleDate).build(); - scheduler.rescheduleJob(releaseMarksTrigger.getKey(), releaseMarksTrigger); + 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; } @Override Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -r81b83a2cbd3cfe68e9096211cd0df9eada37fc4a -re973111a2768823dac2f4e62f2e06143f7dba870 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 81b83a2cbd3cfe68e9096211cd0df9eada37fc4a) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.TimeZone; import org.lamsfoundation.lams.events.IEventNotificationService; @@ -203,9 +204,9 @@ boolean releaseMarks(Long lessonId, int userId); - Date getReleaseMarksScheduleDate(long lessonId, int currentUserId); + Map getReleaseMarksSchedule(long lessonId, int currentUserId); - void scheduleReleaseMarks(long lessonId, int currentUserId, boolean sendEmails, Date scheduleDate) + boolean scheduleReleaseMarks(long lessonId, int 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 -r89b4a675dc0a0fc5e192153b6fb626b1a51521da -re973111a2768823dac2f4e62f2e06143f7dba870 --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision 89b4a675dc0a0fc5e192153b6fb626b1a51521da) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/web/controller/GradebookMonitoringController.java (.../GradebookMonitoringController.java) (revision e973111a2768823dac2f4e62f2e06143f7dba870) @@ -27,9 +27,11 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Calendar; import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import javax.servlet.ServletOutputStream; @@ -269,9 +271,13 @@ @RequestMapping("/displayReleaseMarksPanel") public String displayReleaseMarksPanel(@RequestParam long lessonID, Model model) { - Date scheduleDate = gradebookService.getReleaseMarksScheduleDate(lessonID, getUser().getUserID()); - if (scheduleDate != null) { - model.addAttribute("releaseMarksScheduleDate", RELEASE_MARKS_SCHEDULE_DATE_FORMAT.format(scheduleDate)); + 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"; } @@ -335,10 +341,26 @@ public String scheduleReleaseMarks(@RequestParam long lessonID, @RequestParam boolean sendEmails, @RequestParam(name = "scheduleDate", required = false) String scheduleDateString) throws ParseException, SchedulerException { - Date scheduleDate = StringUtils.isBlank(scheduleDateString) ? null - : RELEASE_MARKS_SCHEDULE_DATE_FORMAT.parse(scheduleDateString); - gradebookService.scheduleReleaseMarks(lessonID, getUser().getUserID(), sendEmails, scheduleDate); - return "success"; + try { + Date scheduleDate = null; + if (StringUtils.isNotBlank(scheduleDateString)) { + scheduleDate = RELEASE_MARKS_SCHEDULE_DATE_FORMAT.parse(scheduleDateString); + Calendar calendarDate = Calendar.getInstance(); + calendarDate.setTime(scheduleDate); + calendarDate.set(Calendar.SECOND, 0); + calendarDate.set(Calendar.MILLISECOND, 0); + scheduleDate = calendarDate.getTime(); + + 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"; + } catch (Exception e) { + return e.getMessage(); + } } /** Index: lams_gradebook/web/gradebookMonitor.jsp =================================================================== diff -u -rb7a0e62ff75f6bbcbf76c0857dd9605ae0da4e7d -re973111a2768823dac2f4e62f2e06143f7dba870 --- lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision b7a0e62ff75f6bbcbf76c0857dd9605ae0da4e7d) +++ lams_gradebook/web/gradebookMonitor.jsp (.../gradebookMonitor.jsp) (revision e973111a2768823dac2f4e62f2e06143f7dba870) @@ -78,8 +78,12 @@ } - function toggleReleaseMarksPanel(){ + function toggleReleaseMarksPanel(reload){ var releaseMarksPanel = $('#releaseMarksPanel'); + if (reload) { + releaseMarksPanel.empty(); + } + if (releaseMarksPanel.is(':empty')) { releaseMarksPanel.load('gradebook/gradebookMonitoring/displayReleaseMarksPanel.do',{ 'lessonID' : ${lessonDetails.lessonID} Index: lams_gradebook/web/releaseLessonMarks.jsp =================================================================== diff -u -r89b4a675dc0a0fc5e192153b6fb626b1a51521da -re973111a2768823dac2f4e62f2e06143f7dba870 --- lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision 89b4a675dc0a0fc5e192153b6fb626b1a51521da) +++ lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision e973111a2768823dac2f4e62f2e06143f7dba870) @@ -283,11 +283,9 @@ } function cancelScheduleReleaseMarks(){ - var switchPanels = true; if (releaseMarksScheduleDate) { - switchPanels = scheduleReleaseMarks(true); - } - if (switchPanels) { + scheduleReleaseMarks(true); + } else { $('#release-marks-schedule-date').val(null); displayReleaseMarksLearners(); } @@ -301,15 +299,15 @@ data: { "":"", lessonID: releaseMarksLessonID, - sendEmails : false, + sendEmails : scheduleDate == null ? false : $('#release-marks-schedule-emails').prop('checked'), scheduleDate : scheduleDate }, type : 'post', dataType : 'text', async : false, success: function(response) { if (response == 'success') { - releaseMarksScheduleDate = scheduleDate; + toggleReleaseMarksPanel(true); result = true; } } @@ -358,22 +356,34 @@
- Schedule date: + + + Schedule date: + + + + Release marks are scheduled for ${releaseMarksScheduleDate}. +
Emails will ${releaseMarksSendEmails ? '' : 'not '}be sent. +
+
+
- - + + +