Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r248e47a1f8714d3e57be1e4dc12b4fae4f396cb3 -r6f214206866d2d5d96d2c98655707c7588402aef Binary files differ Index: lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/events/EmailNotificationArchive.hbm.xml =================================================================== diff -u --- lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/events/EmailNotificationArchive.hbm.xml (revision 0) +++ lams_common/conf/hibernate/mappings/org/lamsfoundation/lams/events/EmailNotificationArchive.hbm.xml (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171113.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171113.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20171113.sql (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -0,0 +1,35 @@ +-- 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-4459 Add email notification archive +CREATE TABLE lams_email_notification_archive ( + uid BIGINT(20) NOT NULL AUTO_INCREMENT, + organisation_id BIGINT(20), + lesson_id BIGINT(20), + search_type TINYINT NOT NULL, + sent_on DATETIME NOT NULL, + body TEXT, + PRIMARY KEY (uid), + CONSTRAINT FK_lams_email_notification_archive_1 FOREIGN KEY (organisation_id) + REFERENCES lams_organisation (organisation_id) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_email_notification_archive_2 FOREIGN KEY (lesson_id) + REFERENCES lams_lesson (lesson_id) ON DELETE CASCADE ON UPDATE CASCADE +); + +CREATE TABLE lams_email_notification_recipient_archive ( + email_notification_uid BIGINT(20) NOT NULL, + user_id BIGINT(20) NOT NULL, + CONSTRAINT FK_lams_email_notification_recipient_archive_1 FOREIGN KEY (email_notification_uid) + REFERENCES lams_email_notification_archive (uid) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT FK_lams_email_notification_recipient_archive_2 FOREIGN KEY (user_id) + REFERENCES lams_user (user_id) ON DELETE CASCADE ON UPDATE CASCADE +); + +----------------------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/events/EmailNotificationArchive.java =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/events/EmailNotificationArchive.java (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/events/EmailNotificationArchive.java (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -0,0 +1,92 @@ +package org.lamsfoundation.lams.events; + +import java.io.Serializable; +import java.util.Date; +import java.util.Set; + +/** + * An archived lesson or organisation notification sent by email. + * + * @author Marcin Cieslak + * + */ +public class EmailNotificationArchive implements Serializable { + private static final long serialVersionUID = 3394158938976463492L; + + private Long uid; + private Integer organisationId; + private Long lessonId; + private Integer searchType; + private Date sentOn; + private String body; + private Set recipients; + + public EmailNotificationArchive() { + } + + public EmailNotificationArchive(Integer organisationId, Long lessonId, Integer searchType, Date sentOn, String body, + Set recipients) { + this.organisationId = organisationId; + this.lessonId = lessonId; + this.searchType = searchType; + this.sentOn = sentOn == null ? new Date() : sentOn; + this.body = body; + this.recipients = recipients; + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public Integer getOrganisationId() { + return organisationId; + } + + public void setOrganisationId(Integer organisationId) { + this.organisationId = organisationId; + } + + public Long getLessonId() { + return lessonId; + } + + public void setLessonId(Long lessonId) { + this.lessonId = lessonId; + } + + public Integer getSearchType() { + return searchType; + } + + public void setSearchType(Integer searchType) { + this.searchType = searchType; + } + + public Date getSentOn() { + return sentOn; + } + + public void setSentOn(Date sentOn) { + this.sentOn = sentOn; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Set getRecipients() { + return recipients; + } + + public void setRecipients(Set recipients) { + this.recipients = recipients; + } +} \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java =================================================================== diff -u -r8714ac689fdad46746bbb7f28005ec080d1d4ba6 -r6f214206866d2d5d96d2c98655707c7588402aef --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java (.../EmailScheduleMessageJob.java) (revision 8714ac689fdad46746bbb7f28005ec080d1d4ba6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/quartz/job/EmailScheduleMessageJob.java (.../EmailScheduleMessageJob.java) (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -23,7 +23,9 @@ package org.lamsfoundation.lams.monitoring.quartz.job; import java.util.Collection; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import org.apache.log4j.Logger; import org.lamsfoundation.lams.events.IEventNotificationService; @@ -66,15 +68,20 @@ HibernateSessionManager.openSession(); Collection users = getMonitoringService(context).getUsersByEmailNotificationSearchType(searchType, lessonId, lessonIds, activityId, xDaystoFinish, orgId); + Set recipients = new HashSet(); for (User user : users) { boolean isHtmlFormat = false; int userId = user.getUserId(); + recipients.add(userId); log.debug("Sending scheduled email to user [" + userId + "]."); - eventNotificationService.sendMessage(null, userId, - IEventNotificationService.DELIVERY_METHOD_MAIL, monitoringService.getMessageService() - .getMessage("event.emailnotifications.email.subject", new Object[] {}), - emailBody, isHtmlFormat); + eventNotificationService + .sendMessage(null, userId, IEventNotificationService.DELIVERY_METHOD_MAIL, + monitoringService.getMessageService() + .getMessage("event.emailnotifications.email.subject", new Object[] {}), + emailBody, isHtmlFormat); } + + monitoringService.archiveEmailNotification(orgId, lessonId, searchType, emailBody, recipients); } finally { HibernateSessionManager.closeSession(); } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 -r6f214206866d2d5d96d2c98655707c7588402aef --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -28,6 +28,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import org.lamsfoundation.lams.learningdesign.Activity; @@ -416,6 +417,7 @@ * id of the activity. * @return the requested activity object. */ + @SuppressWarnings("rawtypes") Activity getActivityById(Long activityId, Class clasz); /** @@ -662,4 +664,10 @@ * Get list of users who completed the given lesson. */ List getUsersCompletedLesson(Long lessonId, Integer limit, Integer offset, boolean orderAscending); + + /** + * Save information about an email notification sent to learners. + */ + void archiveEmailNotification(Integer organisationId, Long lessonId, Integer searchType, String body, + Set recipients); } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r81d937bb6b9380b64f53e9feb482514c6b6a42b1 -r6f214206866d2d5d96d2c98655707c7588402aef --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 81d937bb6b9380b64f53e9feb482514c6b6a42b1) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -50,6 +50,7 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.dao.IBaseDAO; +import org.lamsfoundation.lams.events.EmailNotificationArchive; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; import org.lamsfoundation.lams.learning.web.bean.GateActivityDTO; import org.lamsfoundation.lams.learningdesign.Activity; @@ -1661,6 +1662,16 @@ return sortedUsers; } + @Override + public void archiveEmailNotification(Integer organisationId, Long lessonId, Integer searchType, String body, + Set recipients) { + if (organisationId == null && lessonId == null) { + throw new MonitoringServiceException( + "Missing both organisation ID and lesson ID when archiving an email notification"); + } + baseDAO.insert(new EmailNotificationArchive(organisationId, lessonId, searchType, null, body, recipients)); + } + /** * Returns list of users who has already finished specified lesson. * @@ -2551,5 +2562,4 @@ return resetReadOnly; } - } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java =================================================================== diff -u -r41771fed1bd0652923d05a84de584769dcfe0ef7 -r6f214206866d2d5d96d2c98655707c7588402aef --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 41771fed1bd0652923d05a84de584769dcfe0ef7) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -347,7 +348,6 @@ */ public ActionForward emailUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, JSONException { - JSONObject JSONObject = new JSONObject(); IMonitoringService monitoringService = MonitoringServiceProxy .getMonitoringService(getServlet().getServletContext()); @@ -361,14 +361,20 @@ if (scheduleDateParameter == null) { boolean isSuccessfullySent = true; String[] userIdStrs = request.getParameterValues("userId"); + Set userIdInts = new HashSet(); for (String userIdStr : userIdStrs) { int userId = Integer.parseInt(userIdStr); + userIdInts.add(userId); boolean isHtmlFormat = false; isSuccessfullySent &= getEventNotificationService().sendMessage(null, userId, IEventNotificationService.DELIVERY_METHOD_MAIL, monitoringService.getMessageService() .getMessage("event.emailnotifications.email.subject", new Object[] {}), emailBody, isHtmlFormat); } + monitoringService.archiveEmailNotification( + WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID, true), + WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, true), + WebUtil.readIntParam(request, "searchType", true), emailBody, userIdInts); JSONObject.put("isSuccessfullySent", isSuccessfullySent); @@ -380,9 +386,6 @@ try { Calendar now = Calendar.getInstance(); - Map searchParameters = new HashMap(); - copySearchParametersFromRequestToMap(request, searchParameters); - // calculate scheduleDate Date scheduleDateTeacherTimezone = new Date(scheduleDateParameter); TimeZone teacherTimeZone = getCurrentUser().getTimeZone(); @@ -393,6 +396,9 @@ .withIdentity(EmailNotificationsAction.JOB_PREFIX_NAME + now.getTimeInMillis()) .withDescription("schedule email message to user(s)").usingJobData("emailBody", emailBody) .build(); + + Map searchParameters = new HashMap(); + copySearchParametersFromRequestToMap(request, searchParameters); searchParameters.forEach(emailScheduleMessageJob.getJobDataMap()::putIfAbsent); // create customized triggers Index: lams_monitoring/web/emailnotifications/courseNotifications.jsp =================================================================== diff -u -r41771fed1bd0652923d05a84de584769dcfe0ef7 -r6f214206866d2d5d96d2c98655707c7588402aef --- lams_monitoring/web/emailnotifications/courseNotifications.jsp (.../courseNotifications.jsp) (revision 41771fed1bd0652923d05a84de584769dcfe0ef7) +++ lams_monitoring/web/emailnotifications/courseNotifications.jsp (.../courseNotifications.jsp) (revision 6f214206866d2d5d96d2c98655707c7588402aef) @@ -120,11 +120,15 @@ var isInstantEmailing = ($('#accordion').accordion('option', 'active') == 0); var ids = jQuery("#list3").getGridParam('selarrrow'); - var params = ""; + + var searchType = document.getElementById("searchType").value; + var params = "&searchType=" + searchType; + if(isInstantEmailing && ids.length) { for (var i=0;i
-