Index: lams_build/lib/lams/lams.jar =================================================================== diff -u -r6f214206866d2d5d96d2c98655707c7588402aef -r716e4f9721d3856e118a23a8f852154e5775cac4 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/events/dao/EventDAO.java =================================================================== diff -u -r5773f84ed608838de3521ecde87c52f3c72d478c -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_common/src/java/org/lamsfoundation/lams/events/dao/EventDAO.java (.../EventDAO.java) (revision 5773f84ed608838de3521ecde87c52f3c72d478c) +++ lams_common/src/java/org/lamsfoundation/lams/events/dao/EventDAO.java (.../EventDAO.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -5,6 +5,7 @@ import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.events.Event; import org.lamsfoundation.lams.events.Subscription; +import org.lamsfoundation.lams.usermanagement.User; public interface EventDAO extends IBaseDAO { /** @@ -28,4 +29,9 @@ Integer offset); long getPendingNotificationCount(Long lessonId, Integer userId); + + /** + * Gets users to whom the given email notification was sent. Uses paging. + */ + List getArchivedEmailNotificationRecipients(Long emailNotificationUid, Integer limit, Integer offset); } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/events/dao/hibernate/EventDAOHibernate.java =================================================================== diff -u -rbca83628ffa34dcc98176b117aa5ff26d166300f -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_common/src/java/org/lamsfoundation/lams/events/dao/hibernate/EventDAOHibernate.java (.../EventDAOHibernate.java) (revision bca83628ffa34dcc98176b117aa5ff26d166300f) +++ lams_common/src/java/org/lamsfoundation/lams/events/dao/hibernate/EventDAOHibernate.java (.../EventDAOHibernate.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -6,9 +6,11 @@ import org.hibernate.Query; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.events.DeliveryMethodNotification; +import org.lamsfoundation.lams.events.EmailNotificationArchive; import org.lamsfoundation.lams.events.Event; import org.lamsfoundation.lams.events.Subscription; import org.lamsfoundation.lams.events.dao.EventDAO; +import org.lamsfoundation.lams.usermanagement.User; import org.springframework.stereotype.Repository; @Repository @@ -27,6 +29,10 @@ + " AS s WHERE (s.lastOperationMessage IS NULL OR s.lastOperationMessage != '" + DeliveryMethodNotification.LAST_OPERATION_SEEN + "') AND s.userId = ? AND s.event.scope LIKE 'LESSON_%'"; + private static final String GET_ARCHIVED_EMAIL_NOTIFICATION_RECIPIENTS = "SELECT u FROM " + User.class.getName() + + " AS u, " + EmailNotificationArchive.class.getName() + + " AS e WHERE e.uid = ? AND u.userId IN ELEMENTS(e.recipients) ORDER BY u.firstName, u.lastName"; + @Override @SuppressWarnings("unchecked") public Event getEvent(String scope, String name, Long sessionId) throws InvalidParameterException { @@ -87,4 +93,18 @@ } return (Long) queryObject.uniqueResult(); } + + @Override + @SuppressWarnings("unchecked") + public List getArchivedEmailNotificationRecipients(Long emailNotificationUid, Integer limit, Integer offset) { + Query queryObject = getSession().createQuery(EventDAOHibernate.GET_ARCHIVED_EMAIL_NOTIFICATION_RECIPIENTS); + queryObject.setLong(0, emailNotificationUid); + if (limit != null) { + queryObject.setMaxResults(limit); + } + if (offset != null) { + queryObject.setFirstResult(offset); + } + return queryObject.list(); + } } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml =================================================================== diff -u -r8714ac689fdad46746bbb7f28005ec080d1d4ba6 -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision 8714ac689fdad46746bbb7f28005ec080d1d4ba6) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml (.../monitoringApplicationContext.xml) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -40,6 +40,7 @@ + @@ -79,7 +80,7 @@ PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED - + PROPAGATION_REQUIRED Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r1b2445732246bf119bd59390cb6c84eee6405ae2 -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 1b2445732246bf119bd59390cb6c84eee6405ae2) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -672,7 +672,18 @@ void archiveEmailNotification(Integer organisationId, Long lessonId, Integer searchType, String body, Set recipients); + /** + * Gets archived notifications for the given organisation. + */ List getArchivedEmailNotifications(Integer organisationId); + /** + * Gets archived notifications for the given lesson. + */ List getArchivedEmailNotifications(Long lessonId); + + /** + * Gets pages recipients of the given archived email notification. + */ + List getArchivedEmailNotificationRecipients(Long emailNotificationUid, Integer limit, Integer offset); } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r1b2445732246bf119bd59390cb6c84eee6405ae2 -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 1b2445732246bf119bd59390cb6c84eee6405ae2) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -51,6 +51,7 @@ import org.lamsfoundation.lams.authoring.service.IAuthoringService; import org.lamsfoundation.lams.dao.IBaseDAO; import org.lamsfoundation.lams.events.EmailNotificationArchive; +import org.lamsfoundation.lams.events.dao.EventDAO; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; import org.lamsfoundation.lams.learning.web.bean.GateActivityDTO; import org.lamsfoundation.lams.learningdesign.Activity; @@ -168,6 +169,8 @@ private ILearnerProgressDAO learnerProgressDAO; + private EventDAO eventDAO; + private IAuthoringService authoringService; private ICoreLearnerService learnerService; @@ -314,6 +317,10 @@ this.groupingDAO = groupingDAO; } + public void setEventDAO(EventDAO eventDAO) { + this.eventDAO = eventDAO; + } + /** * @param lamsToolService * The lamsToolService to set. @@ -1684,6 +1691,11 @@ return baseDAO.findByProperty(EmailNotificationArchive.class, "lessonId", lessonId); } + @Override + public List getArchivedEmailNotificationRecipients(Long emailNotificationUid, Integer limit, Integer offset) { + return eventDAO.getArchivedEmailNotificationRecipients(emailNotificationUid, limit, offset); + } + /** * Returns list of users who has already finished specified lesson. * Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java =================================================================== diff -u -r1b2445732246bf119bd59390cb6c84eee6405ae2 -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 1b2445732246bf119bd59390cb6c84eee6405ae2) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailNotificationsAction.java (.../EmailNotificationsAction.java) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -50,6 +50,7 @@ import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.events.EmailNotificationArchive; import org.lamsfoundation.lams.events.IEventNotificationService; +import org.lamsfoundation.lams.gradebook.util.GradebookConstants; import org.lamsfoundation.lams.learning.service.ICoreLearnerService; import org.lamsfoundation.lams.learningdesign.Activity; import org.lamsfoundation.lams.lesson.Lesson; @@ -197,7 +198,7 @@ } } else { if (!getSecurityService().isGroupMonitor(organisationId, getCurrentUser().getUserID(), - "show scheduled course course email notifications", false)) { + "show scheduled course email notifications", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the organisation"); return null; } @@ -256,7 +257,7 @@ Integer organisationId = WebUtil.readIntParam(request, AttributeNames.PARAM_ORGANISATION_ID, true); if (isLessonNotifications) { if (!getSecurityService().isLessonMonitor(lessonId, getCurrentUser().getUserID(), - "show scheduled lesson email notifications", false)) { + "show archived lesson email notifications", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the lesson"); return null; } @@ -265,7 +266,7 @@ request.setAttribute("notifications", notifications); } else { if (!getSecurityService().isGroupMonitor(organisationId, getCurrentUser().getUserID(), - "show scheduled course course email notifications", false)) { + "show archived course email notifications", false)) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the organisation"); return null; } @@ -280,6 +281,63 @@ return mapping.findForward("archivedEmailList"); } + public ActionForward getArchivedRecipients(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws JSONException, 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(), + "show archived lesson email notification participants", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the lesson"); + return null; + } + } else { + if (!getSecurityService().isGroupMonitor(organisationId, getCurrentUser().getUserID(), + "show archived course email notification participants", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "The user is not a monitor in the organisation"); + return null; + } + } + + int page = WebUtil.readIntParam(request, GradebookConstants.PARAM_PAGE); + int rowLimit = WebUtil.readIntParam(request, GradebookConstants.PARAM_ROWS); + + // get only recipients we want on the page + List recipients = monitoringService.getArchivedEmailNotificationRecipients(emailNotificationUid, rowLimit, + (page - 1) * rowLimit); + + // 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); + responseJSON.put(GradebookConstants.ELEMENT_RECORDS, recipients.size()); + + JSONArray rowsJSON = new JSONArray(); + for (User recipient : recipients) { + JSONObject rowJSON = new JSONObject(); + rowJSON.put(GradebookConstants.ELEMENT_ID, recipient.getUserId()); + + JSONArray cellJSON = new JSONArray(); + cellJSON.put(recipient.getFirstName() + " " + recipient.getLastName() + " [" + recipient.getLogin() + "]"); + + rowJSON.put(GradebookConstants.ELEMENT_CELL, cellJSON); + rowsJSON.put(rowJSON); + } + + responseJSON.put(GradebookConstants.ELEMENT_ROWS, rowsJSON); + writeResponse(response, "text/json", LamsDispatchAction.ENCODING_UTF8, responseJSON.toString()); + return null; + } + /** * Delete a scheduled emails. * Index: lams_monitoring/web/emailnotifications/archivedEmailList.jsp =================================================================== diff -u -r1b2445732246bf119bd59390cb6c84eee6405ae2 -r716e4f9721d3856e118a23a8f852154e5775cac4 --- lams_monitoring/web/emailnotifications/archivedEmailList.jsp (.../archivedEmailList.jsp) (revision 1b2445732246bf119bd59390cb6c84eee6405ae2) +++ lams_monitoring/web/emailnotifications/archivedEmailList.jsp (.../archivedEmailList.jsp) (revision 716e4f9721d3856e118a23a8f852154e5775cac4) @@ -15,17 +15,42 @@ - - + + + + @@ -44,13 +69,13 @@ - + - + - + @@ -76,7 +101,7 @@ - + ${fn:length(email.recipients)}