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