Index: lams_monitoring/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r41771fed1bd0652923d05a84de584769dcfe0ef7 -r001b71e1b6da336c4adb6376c31ba95d4ace7b28 --- lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 41771fed1bd0652923d05a84de584769dcfe0ef7) +++ lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 001b71e1b6da336c4adb6376c31ba95d4ace7b28) @@ -170,6 +170,8 @@ email.notifications.archived.messages.list.sent.date =Sent on email.notifications.archived.messages.list.sent.count =Sent to email.notifications.archived.messages.list.learners =learners +email.notifications.archived.export.button =Export +email.notifications.archived.export.sheet.name =Notification email.notifications.table.now =Now email.notifications.table.schedule =Schedule email.notifications.button.schedule =Schedule Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r716e4f9721d3856e118a23a8f852154e5775cac4 -r001b71e1b6da336c4adb6376c31ba95d4ace7b28 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 001b71e1b6da336c4adb6376c31ba95d4ace7b28) @@ -26,6 +26,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Date; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -45,6 +46,7 @@ import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; +import org.lamsfoundation.lams.util.ExcelCell; import org.lamsfoundation.lams.util.MessageService; /** @@ -686,4 +688,9 @@ * Gets pages recipients of the given archived email notification. */ List getArchivedEmailNotificationRecipients(Long emailNotificationUid, Integer limit, Integer offset); + + /** + * Exports the given email notification to Excel sheet + */ + LinkedHashMap exportArchivedEmailNotification(Long emailNotificationUid); } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r716e4f9721d3856e118a23a8f852154e5775cac4 -r001b71e1b6da336c4adb6376c31ba95d4ace7b28 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 001b71e1b6da336c4adb6376c31ba95d4ace7b28) @@ -33,6 +33,7 @@ import java.util.Date; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Locale; @@ -109,6 +110,8 @@ import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.usermanagement.util.LastNameAlphabeticComparator; import org.lamsfoundation.lams.util.DateUtil; +import org.lamsfoundation.lams.util.ExcelCell; +import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.NumberUtil; import org.lamsfoundation.lams.util.audit.AuditService; @@ -205,6 +208,8 @@ private static final String FORCE_COMPLETE_STOP_MESSAGE_STOPPED_UNEXPECTEDLY = "force.complete.stop.message.stopped.unexpectedly"; + private static final ExcelCell[] EMPTY_ROW = new ExcelCell[1]; + // --------------------------------------------------------------------- // Inversion of Control Methods - Method injection // --------------------------------------------------------------------- @@ -1696,6 +1701,53 @@ return eventDAO.getArchivedEmailNotificationRecipients(emailNotificationUid, limit, offset); } + @Override + public LinkedHashMap exportArchivedEmailNotification(Long emailNotificationUid) { + EmailNotificationArchive notification = (EmailNotificationArchive) baseDAO.find(EmailNotificationArchive.class, + emailNotificationUid); + + LinkedHashMap sheets = new LinkedHashMap(); + List rows = new LinkedList(); + ExcelCell[] row = new ExcelCell[3]; + row[0] = new ExcelCell(messageService.getMessage("email.notifications.archived.messages.list.sent.date"), true); + row[1] = new ExcelCell( + messageService.getMessage("email.notifications.scheduled.messages.list.notify.sudents.that"), true); + row[2] = new ExcelCell(messageService.getMessage("email.notifications.scheduled.messages.list.email.body"), + true); + rows.add(row); + + row = new ExcelCell[3]; + row[0] = new ExcelCell(FileUtil.EXPORT_TO_SPREADSHEET_TITLE_DATE_FORMAT.format(notification.getSentOn()), + false); + row[1] = new ExcelCell( + messageService.getMessage("email.notifications.user.search.property." + notification.getSearchType()), + false); + row[2] = new ExcelCell(notification.getBody(), false); + rows.add(row); + rows.add(EMPTY_ROW); + + row = new ExcelCell[2]; + row[0] = new ExcelCell(messageService.getMessage("email.notifications.archived.messages.list.sent.count"), + true); + row[1] = new ExcelCell(notification.getRecipients().size() + " " + + messageService.getMessage("email.notifications.archived.messages.list.learners"), false); + rows.add(row); + + // get all recipient objects, sorted by name + List recipients = getArchivedEmailNotificationRecipients(emailNotificationUid, null, null); + for (User recipient : recipients) { + row = new ExcelCell[1]; + row[0] = new ExcelCell( + recipient.getFirstName() + " " + recipient.getLastName() + " [" + recipient.getLogin() + "]", + false); + rows.add(row); + } + + sheets.put(messageService.getMessage("email.notifications.archived.export.sheet.name"), + rows.toArray(new ExcelCell[][] {})); + return sheets; + } + /** * Returns list of users who has already finished specified lesson. * Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java =================================================================== diff -u -r716e4f9721d3856e118a23a8f852154e5775cac4 -r001b71e1b6da336c4adb6376c31ba95d4ace7b28 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 001b71e1b6da336c4adb6376c31ba95d4ace7b28) @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -66,6 +67,9 @@ import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.DateUtil; +import org.lamsfoundation.lams.util.ExcelCell; +import org.lamsfoundation.lams.util.ExcelUtil; +import org.lamsfoundation.lams.util.FileUtil; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.util.audit.IAuditService; import org.lamsfoundation.lams.web.action.LamsDispatchAction; @@ -315,7 +319,7 @@ List recipients = monitoringService.getArchivedEmailNotificationRecipients(emailNotificationUid, rowLimit, (page - 1) * rowLimit); - // build JSON which is understood by jqGrid + // build JSON which is understood by jqGrid JSONObject responseJSON = new JSONObject(); responseJSON.put(GradebookConstants.ELEMENT_PAGE, page); responseJSON.put(GradebookConstants.ELEMENT_TOTAL, ((notification.getRecipients().size() - 1) / rowLimit) + 1); @@ -411,6 +415,51 @@ } /** + * Exports the given archived email notification to excel. + */ + public ActionForward exportArchivedNotification(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException { + IMonitoringService monitoringService = MonitoringServiceProxy + .getMonitoringService(getServlet().getServletContext()); + + Long emailNotificationUid = WebUtil.readLongParam(request, "emailNotificationUid"); + EmailNotificationArchive notification = (EmailNotificationArchive) getUserManagementService() + .findById(EmailNotificationArchive.class, emailNotificationUid); + + Long lessonId = notification.getLessonId(); + Integer organisationId = notification.getOrganisationId(); + boolean isLessonNotifications = (lessonId != null); + // check if the user is allowed to fetch this data + if (isLessonNotifications) { + if (!getSecurityService().isLessonMonitor(lessonId, getCurrentUser().getUserID(), + "export archived lesson email notification", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the lesson"); + return null; + } + } else { + if (!getSecurityService().isGroupMonitor(organisationId, getCurrentUser().getUserID(), + "export archived course email notification", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the organisation"); + return null; + } + } + + LinkedHashMap dataToExport = monitoringService + .exportArchivedEmailNotification(emailNotificationUid); + String fileName = "email_notification_" + + FileUtil.EXPORT_TO_SPREADSHEET_TITLE_DATE_FORMAT.format(notification.getSentOn()) + ".xlsx"; + fileName = FileUtil.encodeFilenameForDownload(request, fileName); + + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + + ExcelUtil.createExcel(response.getOutputStream(), dataToExport, + monitoringService.getMessageService().getMessage("export.dateheader"), false); + return null; + + } + + /** * Method called via Ajax. It either emails selected users or schedules these emails to be sent on specified date. */ public ActionForward emailUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request, Index: lams_monitoring/web/emailnotifications/archivedEmailList.jsp =================================================================== diff -u -r716e4f9721d3856e118a23a8f852154e5775cac4 -r001b71e1b6da336c4adb6376c31ba95d4ace7b28 --- lams_monitoring/web/emailnotifications/archivedEmailList.jsp (.../archivedEmailList.jsp) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) +++ lams_monitoring/web/emailnotifications/archivedEmailList.jsp (.../archivedEmailList.jsp) (revision 001b71e1b6da336c4adb6376c31ba95d4ace7b28) @@ -21,6 +21,10 @@ td { vertical-align: top; } + + #downloadFrame { + display: none; + } @@ -51,6 +55,11 @@ ignoreCase: true }); } + + function exportNotification(notificationUid) { + $('#downloadFrame').attr('src', + "?method=exportArchivedNotification&emailNotificationUid=" + notificationUid); + } @@ -83,7 +92,11 @@ - +
+ + + @@ -119,5 +132,6 @@ +