diff --git a/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java b/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java index 6c0ad0f5a7b70ca91b4dbbd20ded4c9bac603dae..27197b748392e44e597a11d93afd50d81b4cd839 100644 --- a/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java +++ b/src/main/java/org/olat/modules/lecture/manager/LectureServiceImpl.java @@ -22,6 +22,7 @@ package org.olat.modules.lecture.manager; import java.util.ArrayList; import java.util.Calendar; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; @@ -35,6 +36,7 @@ import java.util.stream.Collectors; import org.apache.velocity.VelocityContext; import org.olat.basesecurity.Group; +import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.IdentityRef; import org.olat.basesecurity.manager.GroupDAO; @@ -89,7 +91,9 @@ import org.olat.modules.lecture.ui.ConfigurationHelper; import org.olat.modules.lecture.ui.LectureAdminController; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; +import org.olat.repository.RepositoryEntryRelationType; import org.olat.repository.manager.RepositoryEntryDAO; +import org.olat.repository.manager.RepositoryEntryRelationDAO; import org.olat.user.UserDataDeletable; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; @@ -136,6 +140,8 @@ public class LectureServiceImpl implements LectureService, UserDataDeletable, De @Autowired private LectureBlockReminderDAO lectureBlockReminderDao; @Autowired + private RepositoryEntryRelationDAO repositoryEntryRelationDao; + @Autowired private LectureParticipantSummaryDAO lectureParticipantSummaryDao; @Autowired private RepositoryEntryLectureConfigurationDAO lectureConfigurationDao; @@ -665,6 +671,27 @@ public class LectureServiceImpl implements LectureService, UserDataDeletable, De dbInstance.commit(); recalculateSummary(lectureBlock.getEntry()); + dbInstance.commit(); + + //send email + sendAutoCloseNotifications(lectureBlock); + } + + private void sendAutoCloseNotifications(LectureBlock lectureBlock) { + RepositoryEntry entry = lectureBlock.getEntry(); + List<Identity> owners = repositoryEntryRelationDao + .getMembers(entry, RepositoryEntryRelationType.defaultGroup, GroupRoles.owner.name()); + List<Identity> teachers = getTeachers(lectureBlock); + + for(Identity owner:owners) { + MailerResult result = sendMail("lecture.autoclose.notification.subject", "lecture.autoclose.notification.body", + owner, teachers, lectureBlock); + if(result.getReturnCode() == MailerResult.OK) { + log.audit("Notification of lecture auto-close: " + lectureBlock.getKey() + " in course: " + entry.getKey()); + } else { + log.error("Notification of lecture auto-close cannot be send: " + lectureBlock.getKey() + " in course: " + entry.getKey()); + } + } } @Override @@ -690,40 +717,56 @@ public class LectureServiceImpl implements LectureService, UserDataDeletable, De } private void sendReminder(Identity teacher, LectureBlock lectureBlock) { + MailerResult result = sendMail("lecture.teacher.reminder.subject", "lecture.teacher.reminder.body", + teacher, Collections.singletonList(teacher), lectureBlock); + String status; + List<Identity> failedIdentities = result.getFailedIdentites(); + if(failedIdentities != null && failedIdentities.contains(teacher)) { + status = "error"; + } else { + status = "ok"; + } + + lectureBlockReminderDao.createReminder(lectureBlock, teacher, status); + } + + private MailerResult sendMail(String subjectI18nKey, String bodyI18nKey, + Identity recipient, List<Identity> teachers, LectureBlock lectureBlock) { + RepositoryEntry entry = lectureBlock.getEntry(); - String language = teacher.getUser().getPreferences().getLanguage(); + String language = recipient.getUser().getPreferences().getLanguage(); Locale locale = i18nManager.getLocaleOrDefault(language); String startDate = Formatter.getInstance(locale).formatDate(lectureBlock.getStartDate()); + StringBuilder sb = new StringBuilder(); + if(teachers != null && !teachers.isEmpty()) { + for(Identity teacher:teachers) { + if(sb.length() > 0) sb.append(","); + sb.append(userManager.getUserDisplayName(teacher)); + } + } + MailContext context = new MailContextImpl("[RepositoryEntry:" + entry.getKey() + "]"); String url = Settings.getServerContextPathURI() + "/url/RepositoryEntry/" + entry.getKey() + "/LectureBlock/" + lectureBlock.getKey(); String[] args = new String[]{ - lectureBlock.getTitle(), //{0} + lectureBlock.getTitle(), //{0} startDate, //{1} entry.getDisplayname(), //{2} - url, //{3} - userManager.getUserDisplayName(teacher) //{4} + url, //{3} + userManager.getUserDisplayName(recipient), //{4} The recipient + sb.toString() //{5} The teachers }; Translator trans = Util.createPackageTranslator(LectureAdminController.class, locale); - String subject = trans.translate("lecture.teacher.reminder.subject", args); - String body = trans.translate("lecture.teacher.reminder.body", args); + String subject = trans.translate(subjectI18nKey, args); + String body = trans.translate(bodyI18nKey, args); LectureReminderTemplate template = new LectureReminderTemplate(subject, body); MailerResult result = new MailerResult(); - MailBundle bundle = mailManager.makeMailBundle(context, teacher, template, null, null, result); + MailBundle bundle = mailManager.makeMailBundle(context, recipient, template, null, null, result); MailerResult sendResult = mailManager.sendMessage(bundle); result.append(sendResult); - - String status; - List<Identity> failedIdentities = result.getFailedIdentites(); - if(failedIdentities != null && failedIdentities.contains(teacher)) { - status = "error"; - } else { - status = "ok"; - } - - lectureBlockReminderDao.createReminder(lectureBlock, teacher, status); + return sendResult; } @Override diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties index 9e857bbeb3b023f2e1f7524167d5fa9591a60648..1cb82e1711ae3b7fb82d48c6e0794c1935dbdedd 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties @@ -98,6 +98,8 @@ lecture.appeal.absence.period=Rekursfrist lecture.attendance.rate.default=Absenzenquote global in % lecture.authorized.absence.enabled=Entschuldigte Absenzen lecture.auto.close.period=Sperrfrist +lecture.autoclose.notification.subject=Lektionenblock "{0}" autoerledigt +lecture.autoclose.notification.body=<p>Liebe Kursadministratorin<br>Lieber Kursadministrator</p><p>Wir m\u00F6chten Sie informieren, dass Sie die Absenzen f\u00FCr den im Betreff genannten Lektionenblock automtic erdelgit waren. Mit nachfolgendem Link gelangen Sie direkt zum entsprechenden Lektionenblock\:<br><a href\='{3}'>{3}</a></p> lecture.block=Lektionenblock lecture.block.comment=Bemerkung lecture.block.copied=Lektionenblock wurde erfolgreich kopiert. diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties index 1154f868c6b9c9a732cf3cadecb869706c7787ac..96877ff6914686c331fb848e3fcd8b1a5572e8b2 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties @@ -98,6 +98,8 @@ lecture.appeal.absence.period=Appeal absence period in days lecture.attendance.rate.default=Attendance quota global in % lecture.authorized.absence.enabled=Authorized absences lecture.auto.close.period=Auto close period in days +lecture.autoclose.notification.subject=Lecture block "{0}" autoerledigt +lecture.autoclose.notification.body=<p>Dear course administrator</p><p>We want inform you that the lecture block was closed automatically. With the following link, you can access the lecture block\:<br><a href\='{3}'>{3}</a></p> lecture.block=Lectures block lecture.block.comment=Comment lecture.block.copied=The lectures block was successfully copied.