Index: lams_tool_lamc/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rb1e97a18addd1ba2a621863bedea01ee8223b34b -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision b1e97a18addd1ba2a621863bedea01ee8223b34b) +++ lams_tool_lamc/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -202,6 +202,15 @@ label.operation.failed =Operation failed answers.submitted.none =Select at least one answer for each of the questions. label.summary.downloaded =Marks file downloaded. +label.number.learners=Number of Learners +label.number.groups.finished=Number of Groups Finished +label.graph.help=In the graph(s) below, click on a bar in the graph and then use your mouse wheel to zoom in and out of the graph. Once you zoom in, the grey selection in the bottom graph can be dragged left or right to show a different set of marks. +label.lowest.mark=Lowest Mark: +label.highest.mark=Highest Mark: +label.question.marks =Marks +label.number.learners.in.mark.range=Number of Learners in Mark Range +label.number.groups.in.mark.range=Number of Groups in Mark Range +label.average.mark =Average mark #======= End labels: Exported 196 labels for en AU ===== Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java (.../McAppConstants.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/McAppConstants.java (.../McAppConstants.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -46,6 +46,7 @@ public static final String REFLECTIONS_CONTAINER_DTO = "reflectionsContainerDTO"; public static final String LEARNER_NOTEBOOK = "learnerNotebook"; public static final String USER_MASTER_DETAIL = "userMasterDetail"; + public static final String STATISTICS = "statistic"; public static final String TOOL_CONTENT_ID = "toolContentID"; public static final String TOOL_SESSION_ID = "toolSessionID"; Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java (.../IMcUserDAO.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java (.../IMcUserDAO.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -71,11 +71,13 @@ */ void removeMcUser(McQueUsr mcUser); - /** Get the max, min and average mark (in that order) for a session */ - Integer[] getMarkStatisticsForSession(Long sessionUid); - List getPagedUsersBySession(Long sessionId, int page, int size, String sortBy, String sortOrder, String searchString); int getCountPagedUsersBySession(Long sessionId, String searchString); + + Object[] getStatsMarksBySession(Long sessionId); + Object[] getStatsMarksForLeaders(Long toolContentId); + List getRawUserMarksBySession(Long sessionId); + List getRawLeaderMarksByToolContentId(Long toolContentId); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java =================================================================== diff -u -r1ac047247117455cf3ca4073958e4e2103def960 -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java (.../McUserDAO.java) (revision 1ac047247117455cf3ca4073958e4e2103def960) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java (.../McUserDAO.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -26,6 +26,9 @@ import java.util.List; import org.hibernate.Query; +import org.hibernate.SQLQuery; +import org.hibernate.type.FloatType; +import org.hibernate.type.IntegerType; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; import org.lamsfoundation.lams.tool.mc.dao.IMcUserDAO; import org.lamsfoundation.lams.tool.mc.dto.McUserMarkDTO; @@ -41,16 +44,35 @@ @Repository public class McUserDAO extends LAMSBaseDAO implements IMcUserDAO { - private static final String CALC_MARK_STATS_FOR_SESSION = "select max(mu.lastAttemptTotalMark), min(mu.lastAttemptTotalMark), avg(mu.lastAttemptTotalMark)" - + " from McQueUsr mu where mu.mcSessionId = :mcSessionUid"; - private static final String GET_USER_BY_USER_ID_SESSION = "from mcQueUsr in class McQueUsr where mcQueUsr.queUsrId=:queUsrId and mcQueUsr.mcSessionId=:mcSessionUid"; + private static final String LOAD_MARKS_FOR_SESSION = "SELECT last_attempt_total_mark " + + " FROM tl_lamc11_que_usr usr " + + " JOIN tl_lamc11_session sess ON usr.mc_session_id = sess.uid " + + " WHERE responseFinalised = 1 AND sess.mc_session_id = :sessionId"; + private static final String FIND_MARK_STATS_FOR_SESSION = "SELECT MIN(last_attempt_total_mark) min_grade, AVG(last_attempt_total_mark) avg_grade, " + + " MAX(last_attempt_total_mark) max_grade FROM tl_lamc11_que_usr usr " + + " JOIN tl_lamc11_session sess ON usr.mc_session_id = sess.uid " + + " WHERE responseFinalised = 1 AND sess.mc_session_id = :sessionId"; + + private static final String LOAD_MARKS_FOR_LEADERS = "SELECT usr.last_attempt_total_mark " + + " FROM tl_lamc11_que_usr usr " + + " JOIN tl_lamc11_session sess ON usr.mc_session_id = sess.uid AND usr.uid = sess.mc_group_leader_uid " + + " JOIN tl_lamc11_content mcq ON sess.mc_content_id = mcq.uid " + + " WHERE responseFinalised = 1 AND mcq.content_id = :toolContentId"; + private static final String FIND_MARK_STATS_FOR_LEADERS = "SELECT MIN(usr.last_attempt_total_mark) min_grade, AVG(usr.last_attempt_total_mark) avg_grade, " + + " MAX(usr.last_attempt_total_mark) max_grade, COUNT(usr.last_attempt_total_mark) num_complete " + + " FROM tl_lamc11_que_usr usr " + + " JOIN tl_lamc11_session sess ON usr.mc_session_id = sess.uid AND usr.uid = sess.mc_group_leader_uid " + + " JOIN tl_lamc11_content mcq ON sess.mc_content_id = mcq.uid " + + " WHERE responseFinalised = 1 AND mcq.content_id = :toolContentId"; + @Override public McQueUsr getMcUserByUID(Long uid) { return (McQueUsr) this.getSession().get(McQueUsr.class, uid); } + @SuppressWarnings("rawtypes") @Override public McQueUsr getMcUserBySession(final Long queUsrId, final Long mcSessionUid) { @@ -79,27 +101,8 @@ this.getSession().delete(mcUser); } - /** Get the max, min and average mark (in that order) for a session */ + @SuppressWarnings("unchecked") @Override - public Integer[] getMarkStatisticsForSession(Long sessionUid) { - Object[] stats = (Object[]) getSessionFactory().getCurrentSession().createQuery(CALC_MARK_STATS_FOR_SESSION) - .setLong("mcSessionUid", sessionUid.longValue()).uniqueResult(); - - if (stats != null) { - if (stats[2] instanceof Float) { - return new Integer[] { (Integer) stats[0], (Integer) stats[1], - new Integer(((Float) stats[2]).intValue()) }; - } else if (stats[2] instanceof Double) { - return new Integer[] { (Integer) stats[0], (Integer) stats[1], - new Integer(((Double) stats[2]).intValue()) }; - } - } - - return null; - - } - - @Override public List getPagedUsersBySession(Long sessionId, int page, int size, String sortBy, String sortOrder, String searchString) { @@ -139,6 +142,7 @@ return userDtos; } + @SuppressWarnings("rawtypes") @Override public int getCountPagedUsersBySession(Long sessionId, String searchString) { @@ -160,4 +164,59 @@ } } + @SuppressWarnings("rawtypes") + @Override + public Object[] getStatsMarksBySession(Long sessionId) { + + Query query = getSession().createSQLQuery(FIND_MARK_STATS_FOR_SESSION) + .addScalar("min_grade", FloatType.INSTANCE) + .addScalar("avg_grade", FloatType.INSTANCE) + .addScalar("max_grade", FloatType.INSTANCE); + query.setLong("sessionId", sessionId); + List list = query.list(); + if ((list == null) || (list.size() == 0)) { + return null; + } else { + return (Object[]) list.get(0); + } + } + + @SuppressWarnings("rawtypes") + @Override + public Object[] getStatsMarksForLeaders(Long toolContentId) { + + Query query = getSession().createSQLQuery(FIND_MARK_STATS_FOR_LEADERS) + .addScalar("min_grade", FloatType.INSTANCE) + .addScalar("avg_grade", FloatType.INSTANCE) + .addScalar("max_grade", FloatType.INSTANCE) + .addScalar("num_complete", IntegerType.INSTANCE); + query.setLong("toolContentId", toolContentId); + List list = query.list(); + if ((list == null) || (list.size() == 0)) { + return null; + } else { + return (Object[]) list.get(0); + } + } + + @SuppressWarnings("unchecked") + @Override + public List getRawUserMarksBySession(Long sessionId) { + + SQLQuery query = getSession().createSQLQuery(LOAD_MARKS_FOR_SESSION); + query.setLong("sessionId", sessionId); + List list = query.list(); + return list; + } + + @SuppressWarnings("unchecked") + @Override + public List getRawLeaderMarksByToolContentId(Long toolContentId) { + + SQLQuery query = getSession().createSQLQuery(LOAD_MARKS_FOR_LEADERS); + query.setLong("toolContentId", toolContentId); + List list = query.list(); + return list; + } + } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/LeaderResultsDTO.java =================================================================== diff -u --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/LeaderResultsDTO.java (revision 0) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/LeaderResultsDTO.java (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -0,0 +1,82 @@ +/**************************************************************** + * 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.tool.mc.dto; + +public class LeaderResultsDTO { + + private Long contentId; + private int numberGroupsLeaderFinished; + private String minMark; + private String maxMark; + private String avgMark; + + public LeaderResultsDTO() { + } + + public LeaderResultsDTO(Long contentId) { + this.contentId = contentId; + } + + public Long getContentId() { + return contentId; + } + + public void setContentId(Long contentId) { + this.contentId = contentId; + } + + public int getNumberGroupsLeaderFinished() { + return numberGroupsLeaderFinished; + } + + public void setNumberGroupsLeaderFinished(int numberGroupsLeaderFinished) { + this.numberGroupsLeaderFinished = numberGroupsLeaderFinished; + } + + public String getAvgMark() { + return avgMark; + } + + public void setAvgMark(String avgMark) { + this.avgMark = avgMark; + } + + public String getMinMark() { + return minMark; + } + + public void setMinMark(String minMark) { + this.minMark = minMark; + } + + public String getMaxMark() { + return maxMark; + } + + public void setMaxMark(String maxMark) { + this.maxMark = maxMark; + } + +} Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/SessionDTO.java =================================================================== diff -u -r5773f84ed608838de3521ecde87c52f3c72d478c -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/SessionDTO.java (.../SessionDTO.java) (revision 5773f84ed608838de3521ecde87c52f3c72d478c) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/SessionDTO.java (.../SessionDTO.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -5,6 +5,12 @@ private Long sessionId; private String sessionName; + // Used for statistics wanted calls + private int numberLearners; + private String minMark; + private String maxMark; + private String avgMark; + public SessionDTO() { } @@ -23,4 +29,36 @@ public void setSessionName(String sessionName) { this.sessionName = sessionName; } + + public int getNumberLearners() { + return numberLearners; + } + + public void setNumberLearners(int numberLearners) { + this.numberLearners = numberLearners; + } + + public String getMinMark() { + return minMark; + } + + public void setMinMark(String minMark) { + this.minMark = minMark; + } + + public String getMaxMark() { + return maxMark; + } + + public void setMaxMark(String maxMark) { + this.maxMark = maxMark; + } + + public String getAvgMark() { + return avgMark; + } + + public void setAvgMark(String avgMark) { + this.avgMark = avgMark; + } } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -24,6 +24,7 @@ import java.io.IOException; import java.util.List; +import java.util.Locale; import java.util.Set; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -32,18 +33,21 @@ import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.mc.dto.AnswerDTO; +import org.lamsfoundation.lams.tool.mc.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.dto.McQuestionDTO; import org.lamsfoundation.lams.tool.mc.dto.McSessionMarkDTO; import org.lamsfoundation.lams.tool.mc.dto.McUserMarkDTO; import org.lamsfoundation.lams.tool.mc.dto.ReflectionDTO; +import org.lamsfoundation.lams.tool.mc.dto.SessionDTO; import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueUsr; import org.lamsfoundation.lams.tool.mc.pojos.McSession; import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; +import org.lamsfoundation.lams.util.NumberUtil; /** * Interface that defines the contract that all MCQ service provider must follow. @@ -161,9 +165,9 @@ * Return the top, lowest and average mark for all learners for one particular tool session. * * @param request - * @return top mark, lowest mark, average mark in that order + * @return lowest mark, average mark, top mark in that order */ - Integer[] getMarkStatistics(McSession mcSession); + Object[] getMarkStatistics(McSession mcSession); /** * Returns whether activity is grouped and therefore it is expected more than one tool session. @@ -235,5 +239,36 @@ * @return */ List getReflectionList(McContent mcContent, Long userID); + + /** + * Gets the basic statistics for the grades for the Leaders when an Assessment is done using + * Group Leaders. So the averages, etc are for the whole Assessment, not for a Group. + * @param contentId + * @return + */ + LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId); + + /** + * Prepares data for the marks summary graph on the statistics page + * @param assessment + * @param sessionDtos + * @return + */ + List getMarksArray(Long sessionId); + /** + * Prepares data for the marks summary graph on the statistics page, using the grades for the Leaders + * when an Assessment is done using Group Leaders. So the grades are for the whole Assessment, not for a Group. + * @param assessment + * @param sessionDtos + * @return + */ + List getMarksArrayForLeaders(Long contentId); + + /** + * Contains the session id and name for a session. If includeStatistics is true also includes the number of + * learners, max min and average of marks for the session. + */ + List getSessionDtos(Long contentId, boolean includeStatistics); + } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McServicePOJO.java (.../McServicePOJO.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -32,6 +32,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.SortedMap; @@ -81,11 +82,13 @@ import org.lamsfoundation.lams.tool.mc.dao.IMcUserDAO; import org.lamsfoundation.lams.tool.mc.dao.IMcUsrAttemptDAO; import org.lamsfoundation.lams.tool.mc.dto.AnswerDTO; +import org.lamsfoundation.lams.tool.mc.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.dto.McQuestionDTO; import org.lamsfoundation.lams.tool.mc.dto.McSessionMarkDTO; import org.lamsfoundation.lams.tool.mc.dto.McUserMarkDTO; import org.lamsfoundation.lams.tool.mc.dto.ReflectionDTO; +import org.lamsfoundation.lams.tool.mc.dto.SessionDTO; import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; @@ -102,6 +105,7 @@ import org.lamsfoundation.lams.util.ExcelUtil; import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; +import org.lamsfoundation.lams.util.NumberUtil; import org.lamsfoundation.lams.util.audit.IAuditService; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -730,8 +734,8 @@ } @Override - public Integer[] getMarkStatistics(McSession mcSession) { - return mcUserDAO.getMarkStatisticsForSession(mcSession.getUid()); + public Object[] getMarkStatistics(McSession mcSession) { + return mcUserDAO.getStatsMarksBySession(mcSession.getMcSessionId()); } @Override @@ -1835,6 +1839,65 @@ return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, startDate, null); } + @Override + public LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId) { + LeaderResultsDTO newDto = new LeaderResultsDTO(contentId); + Object[] markStats = mcUserDAO.getStatsMarksForLeaders(contentId); + if ( markStats != null ) { + newDto.setMinMark(markStats[0] != null ? NumberUtil.formatLocalisedNumber((Float)markStats[0], (Locale)null, 2) : "0.00"); + newDto.setAvgMark(markStats[1] != null ? NumberUtil.formatLocalisedNumber((Float)markStats[1], (Locale)null, 2) : "0.00"); + newDto.setMaxMark(markStats[2] != null ? NumberUtil.formatLocalisedNumber((Float)markStats[2], (Locale)null, 2) : "0.00"); + newDto.setNumberGroupsLeaderFinished((Integer)markStats[3]); + } + return newDto; + } + + @SuppressWarnings("unchecked") + @Override + public List getSessionDtos(Long contentId, boolean includeStatistics) { + List sessionDtos = new ArrayList(); + + McContent mcContent = getMcContent(contentId); + if (mcContent != null) { + Set sessions = new TreeSet(new McSessionComparator()); + sessions.addAll(mcContent.getMcSessions()); + for (McSession session : sessions) { + SessionDTO sessionDto = new SessionDTO(); + sessionDto.setSessionId(session.getMcSessionId()); + sessionDto.setSessionName(session.getSession_name()); + //for statistics tab + if (includeStatistics) { + int countUsers = mcUserDAO.getCountPagedUsersBySession(session.getMcSessionId(), ""); + sessionDto.setNumberLearners(countUsers); + Object[] markStats = mcUserDAO.getStatsMarksBySession(session.getMcSessionId()); + if (markStats != null) { + sessionDto.setMinMark(markStats[0] != null + ? NumberUtil.formatLocalisedNumber((Float) markStats[0], (Locale) null, 2) : "0.00"); + sessionDto.setAvgMark(markStats[1] != null + ? NumberUtil.formatLocalisedNumber((Float) markStats[1], (Locale) null, 2) : "0.00"); + sessionDto.setMaxMark(markStats[2] != null + ? NumberUtil.formatLocalisedNumber((Float) markStats[2], (Locale) null, 2) : "0.00"); + } + } + + sessionDtos.add(sessionDto); + } + } + return sessionDtos; + } + + @Override + public List getMarksArray(Long sessionId) { + return mcUserDAO.getRawUserMarksBySession(sessionId); + } + + @Override + public List getMarksArrayForLeaders(Long toolContentId) { + return mcUserDAO.getRawLeaderMarksByToolContentId(toolContentId); + } + + + // ****************** REST methods ************************* /** Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McLearningAction.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McLearningAction.java (.../McLearningAction.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McLearningAction.java (.../McLearningAction.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -487,16 +487,18 @@ mcGeneralLearnerFlowDTO.setDisplayAnswers(new Boolean(mcContent.isDisplayAnswers()).toString()); mcGeneralLearnerFlowDTO.setLearnerMark(user.getLastAttemptTotalMark()); + Object[] markStatistics = null; if (mcContent.isShowMarks()) { - Integer[] markStatistics = mcService.getMarkStatistics(mcSession); - mcGeneralLearnerFlowDTO.setTopMark(markStatistics[0]); - mcGeneralLearnerFlowDTO.setLowestMark(markStatistics[1]); - mcGeneralLearnerFlowDTO.setAverageMark(markStatistics[2]); - + markStatistics = mcService.getMarkStatistics(mcSession); + } + if (markStatistics != null) { + mcGeneralLearnerFlowDTO.setLowestMark(markStatistics[0] != null ? ((Float)markStatistics[0]).intValue() : 0); + mcGeneralLearnerFlowDTO.setAverageMark(markStatistics[1] != null ? ((Float)markStatistics[1]).intValue() : 0); + mcGeneralLearnerFlowDTO.setTopMark(markStatistics[2] != null ? ((Float)markStatistics[2]).intValue() : 0); } else { - mcGeneralLearnerFlowDTO.setTopMark(0); mcGeneralLearnerFlowDTO.setLowestMark(0); mcGeneralLearnerFlowDTO.setAverageMark(0); + mcGeneralLearnerFlowDTO.setTopMark(0); } request.setAttribute(McAppConstants.MC_GENERAL_LEARNER_FLOW_DTO, mcGeneralLearnerFlowDTO); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java (.../McMonitoringAction.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringAction.java (.../McMonitoringAction.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -24,6 +24,7 @@ import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.TimeZone; @@ -48,8 +49,10 @@ import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.mc.McAppConstants; +import org.lamsfoundation.lams.tool.mc.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.mc.dto.McGeneralLearnerFlowDTO; import org.lamsfoundation.lams.tool.mc.dto.McUserMarkDTO; +import org.lamsfoundation.lams.tool.mc.dto.SessionDTO; import org.lamsfoundation.lams.tool.mc.pojos.McContent; import org.lamsfoundation.lams.tool.mc.pojos.McOptsContent; import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; @@ -340,4 +343,67 @@ return null; } + + /** + * Get the mark summary with data arranged in bands. Can be displayed graphically or in a table. + */ + public ActionForward getMarkChartData(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse res) throws IOException, ServletException, JSONException { + + IMcService mcService = McServiceProxy.getMcService(getServlet().getServletContext()); + Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + McContent mcContent = mcService.getMcContent(contentID); + List results = null; + + if ( mcContent != null ) { + if ( mcContent.isUseSelectLeaderToolOuput() ) { + results = mcService.getMarksArrayForLeaders(contentID); + } else { + Long sessionID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID); + results = mcService.getMarksArray(sessionID); + } + } + + JSONObject responseJSON = new JSONObject(); + if ( results != null ) + responseJSON.put("data", results); + else + responseJSON.put("data", new Float[0]); + + res.setContentType("application/json;charset=utf-8"); + res.getWriter().write(responseJSON.toString()); + return null; + + } + + public ActionForward statistic(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + + IMcService mcService = McServiceProxy.getMcService(getServlet().getServletContext()); + Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + request.setAttribute(AttributeNames.PARAM_TOOL_CONTENT_ID, contentID); + McContent mcContent = mcService.getMcContent(contentID); + if ( mcContent != null ) { + if ( mcContent.isUseSelectLeaderToolOuput() ) { + LeaderResultsDTO leaderDto = mcService.getLeaderResultsDTOForLeaders(contentID); + request.setAttribute("leaderDto", leaderDto); + } else { + List sessionDtos = mcService.getSessionDtos(contentID, true); + request.setAttribute("sessionDtos", sessionDtos); + } + request.setAttribute("useSelectLeaderToolOutput", mcContent.isUseSelectLeaderToolOuput()); + } + + // prepare toolOutputDefinitions and activityEvaluation + List toolOutputDefinitions = new ArrayList(); + toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_MARK); + toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT); + String activityEvaluation = mcService.getActivityEvaluation(contentID); + request.setAttribute(McAppConstants.ATTR_TOOL_OUTPUT_DEFINITIONS, toolOutputDefinitions); + request.setAttribute(McAppConstants.ATTR_ACTIVITY_EVALUATION, activityEvaluation); + + return mapping.findForward(McAppConstants.STATISTICS); + } + + } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringStarterAction.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringStarterAction.java (.../McMonitoringStarterAction.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/McMonitoringStarterAction.java (.../McMonitoringStarterAction.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -132,14 +132,6 @@ DateUtil.convertToStringForJSON(submissionDeadline, request.getLocale())); } - //prepare toolOutputDefinitions and activityEvaluation - List toolOutputDefinitions = new ArrayList(); - toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_MARK); - toolOutputDefinitions.add(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT); - String activityEvaluation = service.getActivityEvaluation(mcContent.getMcContentId()); - request.setAttribute(McAppConstants.ATTR_TOOL_OUTPUT_DEFINITIONS, toolOutputDefinitions); - request.setAttribute(McAppConstants.ATTR_ACTIVITY_EVALUATION, activityEvaluation); - boolean isGroupedActivity = service.isGroupedActivity(new Long(mcContent.getMcContentId())); request.setAttribute("isGroupedActivity", isGroupedActivity); Index: lams_tool_lamc/web/WEB-INF/struts-config.xml =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/web/WEB-INF/struts-config.xml (.../struts-config.xml) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -294,6 +294,12 @@ path="/monitoringStarter.do" redirect="true" /> + + Index: lams_tool_lamc/web/common/monitoringheader.jsp =================================================================== diff -u -r7d03e2ea6fe79a84b7754c4ebed98e4e22cf489f -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/web/common/monitoringheader.jsp (.../monitoringheader.jsp) (revision 7d03e2ea6fe79a84b7754c4ebed98e4e22cf489f) +++ lams_tool_lamc/web/common/monitoringheader.jsp (.../monitoringheader.jsp) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -24,4 +24,7 @@ - + + + + Index: lams_tool_lamc/web/monitoring/MonitoringMaincontent.jsp =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 --- lams_tool_lamc/web/monitoring/MonitoringMaincontent.jsp (.../MonitoringMaincontent.jsp) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/web/monitoring/MonitoringMaincontent.jsp (.../MonitoringMaincontent.jsp) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -8,6 +8,8 @@ <fmt:message key="label.monitoring"/> <%@ include file="/common/monitoringheader.jsp"%> + + - - - - - - - - - - - -
- - - -
- - - -
- -<%@ include file="parts/toolOutput.jsp"%> +
+<%-- Do not include anything to start with as we do not want to display the charts yet. +--%> +
\ No newline at end of file Index: lams_tool_lamc/web/monitoring/parts/statsPart.jsp =================================================================== diff -u --- lams_tool_lamc/web/monitoring/parts/statsPart.jsp (revision 0) +++ lams_tool_lamc/web/monitoring/parts/statsPart.jsp (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) @@ -0,0 +1,163 @@ +<%@ include file="/common/taglibs.jsp"%> + + + + + + + + + + + + + + +

+ + + +
+
+ + + + + + + + + + + + + + +
+ : + + + + : + + +
+ + + + + + + +
+
+
+
+
+
+
+
+ + + +
+ +
+ + : + +
+
+
+ + + + + + + + + + + + + + + +
+ : + + + + : + + +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+ + +<%@ include file="toolOutput.jsp"%>