Index: lams_gradebook/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 -r1f334c44b5fb73e7999b8e0497e41441537e6b5d --- lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) +++ lams_gradebook/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 1f334c44b5fb73e7999b8e0497e41441537e6b5d) @@ -45,6 +45,14 @@ 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. +gradebook.monitor.releasemarks.email.content.subject = Your grades for {0} +gradebook.monitor.releasemarks.email.content.top.header = Your grades +gradebook.monitor.releasemarks.email.content.start = Dear {0}, +gradebook.monitor.releasemarks.email.content.lesson.name = The lecturer has shared the grades for the lesson {0}. +gradebook.monitor.releasemarks.email.content.overall.grade = Your grade: {0} +gradebook.monitor.releasemarks.email.content.end = If you have any question or comments please contact your teacher. +gradebook.monitor.releasemarks.email.content.thanks = Thank you +gradebook.monitor.releasemarks.email.content.footer = LAMS error.releasemarks.fail = Mark release/hide failed, please contact your system administrator. error.markhigher = Mark must be lower than maximum mark. Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java =================================================================== diff -u -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 -r1f334c44b5fb73e7999b8e0497e41441537e6b5d --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/GradebookService.java (.../GradebookService.java) (revision 1f334c44b5fb73e7999b8e0497e41441537e6b5d) @@ -21,6 +21,10 @@ package org.lamsfoundation.lams.gradebook.service; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -135,6 +139,25 @@ private static final Set LESSON_EXPORT_TOOL_ACTIVITIES = new HashSet<>( Arrays.asList("laasse10", "lascrt11", "lamc11", "ladoku11")); + private static String RELEASE_MARKS_EMAIL_TEMPLATE_CONTENT = null; + private static final DateFormat RELEASE_MARKS_EMAIL_DATE_FORMAT = new SimpleDateFormat(DateUtil.PRETTY_FORMAT); + + private static final String RELEASE_MARKS_EMAIL_PAGE_TITLE_PLACEHOLDER = "[PAGE_TITLE_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_TOP_HEADER_PLACEHOLDER = "[TOP_HEADER_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_CONTENT_START_PLACEHOLDER = "[CONTENT_START_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_CONTENT_LESSON_NAME_PLACEHOLDER = "[CONTENT_LESSON_NAME_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_LESSON_NAME_PLACEHOLDER = "[LESSON_NAME_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_RELEASE_DATE_PLACEHOLDER = "[RELEASE_DATE_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_OVERALL_GRADE_PLACEHOLDER = "[OVERALL_GRADE_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_CONTENT_END_PLACEHOLDER = "[CONTENT_END_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_CONTENT_THANKS_PLACEHOLDER = "[CONTENT_THANKS_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_FOOTER_PLACEHOLDER = "[FOOTER_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_ACTIVITY_ROW_START = "[ACTIVITY_ROW_START]"; + private static final String RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END = "[ACTIVITY_ROW_END]"; + private static final String RELEASE_MARKS_EMAIL_ACTIVITY_NAME_PLACEHOLDER = "[ACTIVITY_NAME_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_ACTIVITY_PROGRESS_ICON_PLACEHOLDER = "[ACTIVITY_PROGRESS_ICON_PLACEHOLDER]"; + private static final String RELEASE_MARKS_EMAIL_ACTIVITY_GRADE_PLACEHOLDER = "[ACTIVITY_GRADE_PLACEHOLDER]"; + // Services private ILamsCoreToolService toolService; private IGradebookDAO gradebookDAO; @@ -1054,47 +1077,117 @@ @Override public String getReleaseMarksEmailContent(long lessonID, int userID) { - StringBuilder content = new StringBuilder(); + // temporary comment so template gets loaded every time + // eventually it will be loaded just once +// if (RELEASE_MARKS_EMAIL_TEMPLATE_CONTENT == null) { + try { + RELEASE_MARKS_EMAIL_TEMPLATE_CONTENT = Files + .readString(Paths.get(Configuration.get(ConfigurationKeys.LAMS_EAR_DIR), FileUtil.LAMS_WWW_DIR, + "gradebookReleaseLessonMarksEmailTemplate.html")); + } catch (Exception e) { + throw new RuntimeException("Can not read release marks email template", e); + } +// } - User user = gradebookDAO.find(User.class, userID); + User user = userService.getUserById(userID); Lesson lesson = lessonService.getLesson(lessonID); - LearnerProgress learnerProgress = lessonService.getUserProgressForLesson(userID, lessonID); - content.append("Hi ").append(user.getFirstName()).append(",

here are your results of lesson \"") - .append(lesson.getLessonName()).append("\" in which you participated on ") - .append(RELEASE_MARKS_EMAIL_DATE_FORMAT.format(learnerProgress.getStartDate())).append(".

"); + StringBuilder content = new StringBuilder(RELEASE_MARKS_EMAIL_TEMPLATE_CONTENT); - content.append( - "") - .append("") - .append(""); + int placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_PAGE_TITLE_PLACEHOLDER); + int placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_PAGE_TITLE_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, messageService.getMessage( + "gradebook.monitor.releasemarks.email.content.subject", new Object[] { lesson.getLessonName() })); + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_TOP_HEADER_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_TOP_HEADER_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.top.header")); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_CONTENT_START_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_CONTENT_START_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.start", + new Object[] { user.getFirstName() + " " + user.getLastName() })); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_CONTENT_LESSON_NAME_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_CONTENT_LESSON_NAME_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, messageService.getMessage( + "gradebook.monitor.releasemarks.email.content.lesson.name", new Object[] { lesson.getLessonName() })); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_LESSON_NAME_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_LESSON_NAME_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, lesson.getLessonName()); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_RELEASE_DATE_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_RELEASE_DATE_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, RELEASE_MARKS_EMAIL_DATE_FORMAT.format(new Date())); + + boolean isWeighted = isWeightedMarks(lessonID); + GradebookUserLesson gradebookUserLesson = getGradebookUserLesson(lessonID, userID); + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_OVERALL_GRADE_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_OVERALL_GRADE_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.overall.grade", + new Object[] { gradebookUserLesson == null || gradebookUserLesson.getMark() == null ? "-" + : GradebookUtil.niceFormatting(gradebookUserLesson.getMark(), isWeighted) })); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_CONTENT_END_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_CONTENT_END_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.end")); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_CONTENT_THANKS_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_CONTENT_THANKS_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.thanks")); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_FOOTER_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_FOOTER_PLACEHOLDER.length(); + content.replace(placeholderStart, placeholderEnd, + messageService.getMessage("gradebook.monitor.releasemarks.email.content.footer")); + + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_ROW_START); + placeholderEnd = content.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END) + + RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END.length(); + + String activityRowTemplate = content.substring(placeholderStart, placeholderEnd) + .replace(RELEASE_MARKS_EMAIL_ACTIVITY_ROW_START, ""); + + content.replace(placeholderStart, placeholderEnd, RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END); + List gradebookActivityDTOs = getGBLessonComplete(lessonID, userID); for (GradebookGridRowDTO activityDTO : gradebookActivityDTOs) { - content.append(""); + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END.length(); + content.replace(placeholderStart, placeholderEnd, activityRowContent.toString()); } - content.append("
ActivityProgressAverage scoreScore
").append(activityDTO.getRowName()) - .append(""); + StringBuilder activityRowContent = new StringBuilder(activityRowTemplate); + placeholderStart = activityRowContent.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_NAME_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_ACTIVITY_NAME_PLACEHOLDER.length(); + activityRowContent.replace(placeholderStart, placeholderEnd, activityDTO.getRowName()); + + String icon = ""; if (activityDTO.getStatus().contains("success")) { - content.append("✓"); + icon = "✔"; } else if (activityDTO.getStatus().contains("cog")) { - content.append("⚙"); - } else { - content.append("-"); + icon = "⚙"; } - content.append(""); - if (activityDTO.getAverageMark() != null) { - content.append(GradebookUtil.niceFormatting(activityDTO.getAverageMark())); - } + placeholderStart = activityRowContent.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_PROGRESS_ICON_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_ACTIVITY_PROGRESS_ICON_PLACEHOLDER.length(); + activityRowContent.replace(placeholderStart, placeholderEnd, icon); - content.append(""); - if (activityDTO.getMark() != null) { - content.append(GradebookUtil.niceFormatting(activityDTO.getMark())); - } + placeholderStart = activityRowContent.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_GRADE_PLACEHOLDER); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_ACTIVITY_GRADE_PLACEHOLDER.length(); + activityRowContent.replace(placeholderStart, placeholderEnd, + activityDTO.getMark() == null ? "-" : GradebookUtil.niceFormatting(activityDTO.getMark())); - content.append("

Regards,
LAMS team"); + placeholderStart = content.indexOf(RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END); + placeholderEnd = placeholderStart + RELEASE_MARKS_EMAIL_ACTIVITY_ROW_END.length(); + content.replace(placeholderStart, placeholderEnd, ""); + return content.toString(); } @@ -1103,8 +1196,8 @@ public void sendReleaseMarksEmails(long lessonId, Collection recipientIDs, IEventNotificationService eventNotificationService) { Lesson lesson = lessonService.getLesson(lessonId); - String emailSubject = new StringBuilder("Results of LAMS lesson \"").append(lesson.getLessonName()).append("\"") - .toString(); + String emailSubject = messageService.getMessage("gradebook.monitor.releasemarks.email.content.subject", + new Object[] { lesson.getLessonName() }); if (recipientIDs == null) { recipientIDs = ((List) lessonService.getActiveLessonLearners(lessonId)).stream() Index: lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java =================================================================== diff -u -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 -r1f334c44b5fb73e7999b8e0497e41441537e6b5d --- lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) +++ lams_gradebook/src/java/org/lamsfoundation/lams/gradebook/service/IGradebookFullService.java (.../IGradebookFullService.java) (revision 1f334c44b5fb73e7999b8e0497e41441537e6b5d) @@ -22,8 +22,6 @@ package org.lamsfoundation.lams.gradebook.service; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -48,8 +46,6 @@ public interface IGradebookFullService extends IGradebookService { - static final DateFormat RELEASE_MARKS_EMAIL_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - /** * Gets all the activity rows for a lesson, with the mark for each activity being the average for all users in the * lesson. Only set escapeTitles to false if the output is *not* going to a webpage, but is instead going to a Index: lams_gradebook/web/releaseLessonMarks.jsp =================================================================== diff -u -r8eaff3948232f090f7dee5f7df1a4753b4c4a1e8 -r1f334c44b5fb73e7999b8e0497e41441537e6b5d --- lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision 8eaff3948232f090f7dee5f7df1a4753b4c4a1e8) +++ lams_gradebook/web/releaseLessonMarks.jsp (.../releaseLessonMarks.jsp) (revision 1f334c44b5fb73e7999b8e0497e41441537e6b5d) @@ -25,6 +25,12 @@ border-top: thin darkgray solid; } + #release-marks-email-preview-content > iframe { + width: 100%; + min-height: 500px; + border: none; + } + .release-marks-buttons { display: flex; flex-direction: column; @@ -183,15 +189,14 @@ row.addClass('warning'); let userID = row.attr('id'); - $('#release-marks-email-preview-content') - .load('gradebook/gradebookMonitoring/getReleaseMarksEmailContent.do',{ - 'lessonID' : releaseMarksLessonID, - 'userID' : userID - }, function(){ - // set learner name in email preview - $('#release-marks-email-preview-user').text(row.find('td:nth-child(2)').text()); - $(this).parent().slideDown(); - }); + $('