null
or name is blank
+ */
+ public Event(String scope, String name, Long sessionId, String subject, String message, boolean isHtmlContentType, Date failTime) throws InvalidParameterException {
+ if (scope == null) {
+ throw new InvalidParameterException("Event scope can not be null.");
+ }
+ if (StringUtils.isBlank(name)) {
+ throw new InvalidParameterException("Event name can not be blank.");
+ }
+ this.scope = scope;
+ this.name = name;
+ this.eventSessionId = sessionId;
+ this.subject = subject;
+ this.message = message;
+ this.htmlFormat = isHtmlContentType;
+ this.failTime = failTime;
+ }
+
@Override
public Object clone() {
- return new Event(scope, name, eventSessionId, subject, message, htmlFormat);
+ return new Event(scope, name, eventSessionId, subject, message, htmlFormat, failTime);
}
/**
Index: lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java
===================================================================
diff -u -r6588eb48d4acb2b8ce9dd74e76a7ddbaeab640a0 -r8714ac689fdad46746bbb7f28005ec080d1d4ba6
--- lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java (.../EventNotificationService.java) (revision 6588eb48d4acb2b8ce9dd74e76a7ddbaeab640a0)
+++ lams_common/src/java/org/lamsfoundation/lams/events/EventNotificationService.java (.../EventNotificationService.java) (revision 8714ac689fdad46746bbb7f28005ec080d1d4ba6)
@@ -5,6 +5,7 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
@@ -114,6 +115,23 @@
}
@Override
+ public void notifyLessonMonitors(Long lessonId, String subject, String message, boolean isHtmlFormat) {
+ Map") + .append(getMessageService().getMessage("label.started")).append(" ") + .append(lesson.getStartDateTime()).append("
").append(getMessageService().getMessage("label.status")).append(" | ") + .append(getMessageService().getMessage("progress.email.heading.number.learners")) + .append(" | % |
---|---|---|
").append(getMessageService().getMessage("label.not.started")).append(" | ") + .append(notStarted).append(" | ") + .append(asPercentage(notStarted, possibleLearnersCount)).append("% |
").append(getMessageService().getMessage("lesson.chart.started")).append(" | ") + .append(startedLearnersCount).append(" | ") + .append(asPercentage(startedLearnersCount, possibleLearnersCount)).append("% |
").append(getMessageService().getMessage("lesson.chart.completed")).append(" | ") + .append(completedLearnersCount).append(" | ") + .append(asPercentage(completedLearnersCount, possibleLearnersCount)).append("% | ").append(possibleLearnersCount).append(" | ") + .append("100% |
").append(getMessageService().getMessage("label.activity")).append(" | ") + .append(getMessageService().getMessage("progress.email.heading.number.learners")) + .append(" | % | |
---|---|---|---|
") + .append(getMessageService().getMessage("label.not.started")).append(" | ").append(notStarted) + .append(" | ").append("").append(asPercentage(notStarted, possibleLearnersCount)) + .append("% | |
"); + for (int i = 0; i < dto.getDepth(); i++) { + progress.append("• "); + } + String title = activity.getTitle(); // null for gates + if (title == null) { + title = activity.isGateActivity() ? getMessageService().getMessage("label.gate.title") : + getMessageService().getMessage("label.unknown"); + } + + if (activity.isBranchingActivity() || activity.isOptionsActivity()) { + progress.append("").append(title).append(" | "); + } else { + progress.append("").append(title).append(" | "); + } + // output the headings for branching/options but only output numbers if there are learners stuck in the complex activity. + if ((activity.isBranchingActivity() || activity.isOptionsActivity() || activity.isSequenceActivity()) + && (dto.getNumberOfLearners() == null || dto.getNumberOfLearners() == 0)) { + progress.append(" | ") + .append(asPercentage(dto.getNumberOfLearners(), possibleLearnersCount)) + .append("% | "); + numLearnersProcessed += dto.getNumberOfLearners(); + } + } + } + numLearnersProcessed += completedLearnersCount; + progress.append("
Finished | ").append("").append(completedLearnersCount) + .append(" | ").append("").append(asPercentage(completedLearnersCount, possibleLearnersCount)) + .append("% | |
").append(numLearnersProcessed) + .append(" | ").append(asPercentage(numLearnersProcessed, possibleLearnersCount)) + .append("% | ").append("
").append("
") + .append("
") + .append(getMessageService().getMessage("progress.email.sent.automatically")) + .append("
"); + + String subject = getMessageService().getMessage("progress.email.subject", + new Object[] { lesson.getLessonName() }); + + return new String[] { subject, progress.toString() }; + + } + + private String asPercentage(Integer numerator, Integer denominator ) { + double raw = numerator.doubleValue() / denominator * 100; + return NumberUtil.formatLocalisedNumber(raw, (Locale)null, 2); + } + + @Override public Long cloneLesson(Long lessonId, Integer creatorId, Boolean addAllStaff, Boolean addAllLearners, String[] staffIds, String[] learnerIds, Organisation group) throws MonitoringServiceException { Lesson newLesson = null; @@ -2378,4 +2495,5 @@ return resetReadOnly; } + } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailProgressAction.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailProgressAction.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/EmailProgressAction.java (revision 8714ac689fdad46746bbb7f28005ec080d1d4ba6) @@ -0,0 +1,325 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + + +package org.lamsfoundation.lams.monitoring.web; + +import java.io.IOException; +import java.security.InvalidParameterException; +import java.util.Date; +import java.util.Locale; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.apache.tomcat.util.json.JSONArray; +import org.apache.tomcat.util.json.JSONException; +import org.apache.tomcat.util.json.JSONObject; +import org.lamsfoundation.lams.events.IEventNotificationService; +import org.lamsfoundation.lams.monitoring.quartz.job.EmailProgressMessageJob; +import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.security.ISecurityService; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.DateUtil; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.action.LamsDispatchAction; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.quartz.JobBuilder; +import org.quartz.JobDataMap; +import org.quartz.JobDetail; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import org.quartz.impl.matchers.GroupMatcher; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Responsible for "Email Progress" functionality. + */ +public class EmailProgressAction extends LamsDispatchAction { + + // --------------------------------------------------------------------- + // Class level constants + // --------------------------------------------------------------------- + + private static final String TRIGGER_PREFIX_NAME = "emailProgressMessageTrigger:"; + private static final String JOB_PREFIX_NAME = "emailProgressMessageJob:"; + + private static IEventNotificationService eventNotificationService; + private static IMonitoringService monitoringService; + private static ISecurityService securityService; + + // --------------------------------------------------------------------- + // Struts Dispatch Method + // --------------------------------------------------------------------- + + /** + * Gets learners or monitors of the lesson and organisation containing it. + * + * @throws SchedulerException + */ + public ActionForward getEmailProgressDates(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws IOException, JSONException, SchedulerException { + Long lessonId = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID); + if (!getSecurityService().isLessonMonitor(lessonId, getCurrentUser().getUserID(), "get class members", false)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "User is not a monitor in the lesson"); + return null; + } + + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + + JSONObject responseJSON = new JSONObject(); + JSONArray datesJSON = new JSONArray(); + + // find all the current dates set up to send the emails + Scheduler scheduler = getScheduler(); + String triggerPrefix = getTriggerPrefix(lessonId); + SortedSet+ |