Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r173001cfeeae56a17684e8ec4b89df1f1759918d -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 173001cfeeae56a17684e8ec4b89df1f1759918d) +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -300,13 +300,16 @@ label.file =File errors.maxfilesize =File exceeds maximum file size {0} label.summary.downloaded =Summary downloaded -label.lowest.mark=Lowest Mark -label.highest.mark=Highest Mark label.number.learners=Number of Learners +label.number.groups.finished=Number of Groups Finished label.percentage=Percentage label.not.answered=Not Answered label.other=Other 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.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.operation.failed=Operation failed. #======= End labels: Exported 294 labels for en AU ===== Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java =================================================================== diff -u -r6f2900dc9dd1278ce01e847af62976d62ca66e3b -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java (.../AssessmentUserDAO.java) (revision 6f2900dc9dd1278ce01e847af62976d62ca66e3b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java (.../AssessmentUserDAO.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -46,4 +46,8 @@ List getRawUserMarksBySession(Long sessionId); Object[] getStatsMarksBySession(Long sessionId); + List getRawLeaderMarksByToolContentId(Long toolContentId); + Object[] getStatsMarksForLeaders(Long toolContentId); + + } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java =================================================================== diff -u -r6f2900dc9dd1278ce01e847af62976d62ca66e3b -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision 6f2900dc9dd1278ce01e847af62976d62ca66e3b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -51,7 +51,19 @@ private static final String FIND_MARK_STATS_FOR_SESSION = "SELECT MIN(grade) min_grade, AVG(grade) avg_grade, MAX(grade) max_grade FROM tl_laasse10_assessment_result " + " WHERE finish_date IS NOT NULL AND latest = 1 AND session_id = :sessionId"; + private static final String LOAD_MARKS_FOR_LEADERS = "SELECT r.grade FROM tl_laasse10_assessment_result r " + + " JOIN tl_laasse10_session s ON r.session_id = s.session_id AND r.user_uid = s.group_leader_uid " + + " JOIN tl_laasse10_assessment a ON s.assessment_uid = a.uid " + + " WHERE r.finish_date IS NOT NULL AND r.latest = 1 AND a.content_id = :toolContentId"; + private static final String FIND_MARK_STATS_FOR_LEADERS = "SELECT MIN(grade) min_grade, AVG(grade) avg_grade, MAX(grade) max_grade, COUNT(grade) num_complete " + + " FROM tl_laasse10_assessment_result r " + + " JOIN tl_laasse10_session s ON r.session_id = s.session_id AND r.user_uid = s.group_leader_uid " + + " JOIN tl_laasse10_assessment a ON s.assessment_uid = a.uid " + + " WHERE r.finish_date IS NOT NULL AND r.latest = 1 AND a.content_id = :toolContentId"; + + + @SuppressWarnings("rawtypes") @Override public AssessmentUser getUserByUserIDAndSessionID(Long userID, Long sessionId) { List list = doFind(FIND_BY_USER_ID_SESSION_ID, new Object[] { userID, sessionId }); @@ -61,6 +73,7 @@ return (AssessmentUser) list.get(0); } + @SuppressWarnings("rawtypes") @Override public AssessmentUser getUserByUserIDAndContentID(Long userId, Long contentId) { List list = doFind(FIND_BY_USER_ID_CONTENT_ID, new Object[] { userId, contentId }); @@ -85,6 +98,7 @@ private static String LOAD_USERS_ORDERED_ORDER_BY_NAME = "ORDER BY (CONCAT(user.last_name, ' ', user.first_name)) "; private static String LOAD_USERS_ORDERED_ORDER_BY_TOTAL = "ORDER BY result.grade "; + @SuppressWarnings("unchecked") @Override public List getPagedUsersBySession(Long sessionId, int page, int size, String sortBy, String sortOrder, String searchString) { @@ -129,6 +143,7 @@ return userDtos; } + @SuppressWarnings("rawtypes") @Override public int getCountUsersBySession(Long sessionId, String searchString) { @@ -150,7 +165,7 @@ } } - @SuppressWarnings("unchecked") + @SuppressWarnings("rawtypes") @Override public Object[] getStatsMarksBySession(Long sessionId) { @@ -167,6 +182,25 @@ } } + @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); + } + } + + private static String LOAD_USERS_ORDERED_BY_SESSION_QUESTION = "SELECT DISTINCT question_result.uid, user.last_name, user.first_name, user.login_name, question_result.mark" + " FROM tl_laasse10_user user" + " INNER JOIN tl_laasse10_session session" + " ON user.session_uid=session.uid" + @@ -181,6 +215,7 @@ + " AND (CONCAT(user.last_name, ' ', user.first_name) LIKE CONCAT('%', :searchString, '%')) "; private static String LOAD_USERS_ORDERED_ORDER_BY_RESULT = "ORDER BY question_result.mark "; + @SuppressWarnings("unchecked") @Override public List getPagedUsersBySessionAndQuestion(Long sessionId, Long questionUid, int page, int size, String sortBy, String sortOrder, String searchString) { @@ -227,6 +262,7 @@ return userDtos; } + @SuppressWarnings("unchecked") @Override public List getRawUserMarksBySession(Long sessionId) { @@ -236,4 +272,14 @@ 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_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/LeaderResultsDTO.java =================================================================== diff -u --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/LeaderResultsDTO.java (revision 0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/LeaderResultsDTO.java (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -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.assessment.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_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r69e7111d5e2feb39b3c18a7337788dff012303f6 -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 69e7111d5e2feb39b3c18a7337788dff012303f6) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -76,6 +76,7 @@ import org.lamsfoundation.lams.tool.assessment.dao.AssessmentSessionDAO; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentUserDAO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; +import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.OptionDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; @@ -982,9 +983,9 @@ sessionDto.setNumberLearners(countUsers); Object[] markStats = assessmentUserDao.getStatsMarksBySession(sessionId); if ( markStats != null ) { - sessionDto.setMinMark(NumberUtil.formatLocalisedNumber((Float)markStats[0], (Locale)null, 2)); - sessionDto.setAvgMark(NumberUtil.formatLocalisedNumber((Float)markStats[1], (Locale)null, 2)); - sessionDto.setMaxMark(NumberUtil.formatLocalisedNumber((Float)markStats[2], (Locale)null, 2)); + 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"); } } @@ -995,6 +996,19 @@ } @Override + public LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId) { + LeaderResultsDTO newDto = new LeaderResultsDTO(contentId); + Object[] markStats = assessmentUserDao.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; + } + + @Override public AssessmentResult getUserMasterDetail(Long sessionId, Long userId) { AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultByUser(sessionId, userId); @@ -2216,6 +2230,11 @@ return assessmentUserDao.getRawUserMarksBySession(sessionId); } + @Override + public List getMarksArrayForLeaders(Long toolContentId) { + return assessmentUserDao.getRawLeaderMarksByToolContentId(toolContentId); + } + private LinkedHashMap getMarksSummaryForSession(List userDtos, float minGrade, float maxGrade, Integer numBuckets) { LinkedHashMap summary = new LinkedHashMap(); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r6f2900dc9dd1278ce01e847af62976d62ca66e3b -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 6f2900dc9dd1278ce01e847af62976d62ca66e3b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -32,6 +32,7 @@ import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; +import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; import org.lamsfoundation.lams.tool.assessment.dto.ReflectDTO; @@ -400,13 +401,30 @@ boolean showUserNames); /** + * 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); + void changeQuestionResultMark(Long questionResultUid, float newMark); void notifyTeachersOnAttemptCompletion(Long sessionId, String userName); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -rac247d60495b2f2bd0a53b4d3b9e33f5ab834c76 -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision ac247d60495b2f2bd0a53b4d3b9e33f5ab834c76) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -29,10 +29,8 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.TimeZone; -import java.util.TreeMap; import java.util.TreeSet; import javax.servlet.ServletException; @@ -55,6 +53,7 @@ import org.lamsfoundation.lams.gradebook.util.GradebookConstants; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; +import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; import org.lamsfoundation.lams.tool.assessment.dto.ReflectDTO; import org.lamsfoundation.lams.tool.assessment.dto.SessionDTO; @@ -316,10 +315,18 @@ HttpServletResponse response) throws JSONException, IOException { initAssessmentService(); - Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); + String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + + Long contentID = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_CONTENT_ID); String activityEvaluation = WebUtil.readStrParam(request, AssessmentConstants.ATTR_ACTIVITY_EVALUATION); service.setActivityEvaluation(contentID, activityEvaluation); + // update the session ready for stats tab to be reloaded otherwise flicking between tabs + // causes the old value to be redisplayed + sessionMap.put(AssessmentConstants.ATTR_ACTIVITY_EVALUATION, activityEvaluation); + JSONObject responseJSON = new JSONObject(); responseJSON.put("success", "true"); response.setContentType("application/json;charset=utf-8"); @@ -521,7 +528,7 @@ /** * 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, + private ActionForward getMarkChartData(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException, JSONException { initAssessmentService(); @@ -531,17 +538,19 @@ .getAttribute(sessionMapID); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); - Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.ATTR_TOOL_SESSION_ID); - List results = service.getMarksArray(sessionId); -// -// log.debug("fudging results to get more data for transmission. New results will have "+(origResults.length*50)+" entries"); -// Float[] results = new Float[origResults.length*50]; -// for (int i=0; i<50; i++) { -// for ( int j=0; j < origResults.length; j++ ) { -// results[i*origResults.length + j] = origResults[j]; -// } -// } + Long contentId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_CONTENT_ID); + Assessment assessment = service.getAssessmentByContentId(contentId); + List results = null; + if ( assessment != null ) { + if ( assessment.isUseSelectLeaderToolOuput() ) { + results = service.getMarksArrayForLeaders(contentId); + } else { + Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.ATTR_TOOL_SESSION_ID); + results = service.getMarksArray(sessionId); + } + } + JSONObject responseJSON = new JSONObject(); if ( results != null ) responseJSON.put("data", results); @@ -627,8 +636,16 @@ request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); - List sessionDtos = service.getSessionDtos(contentId, true); - sessionMap.put("sessionDtos", sessionDtos); + Assessment assessment = service.getAssessmentByContentId(contentId); + if ( assessment != null ) { + if ( assessment.isUseSelectLeaderToolOuput() ) { + LeaderResultsDTO leaderDto = service.getLeaderResultsDTOForLeaders(contentId); + sessionMap.put("leaderDto", leaderDto); + } else { + List sessionDtos = service.getSessionDtos(contentId, true); + sessionMap.put("sessionDtos", sessionDtos); + } + } return mapping.findForward(AssessmentConstants.SUCCESS); } Index: lams_tool_assessment/web/includes/css/assessment.css =================================================================== diff -u -r35cf22bc5ebb6ab34f2ded5f8a953d1f0e514ac8 -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/web/includes/css/assessment.css (.../assessment.css) (revision 35cf22bc5ebb6ab34f2ded5f8a953d1f0e514ac8) +++ lams_tool_assessment/web/includes/css/assessment.css (.../assessment.css) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -94,26 +94,3 @@ margin-top: -10px; } -/* Chart in Monitoring */ -.chartDiv { - margin-top: 10px; - margin-left: 10px; - margin-bottom: 10px; - width: 95%; - height: 500px; -} - -.bar rect { - fill: steelblue; -} - -.bar text { - fill: #fff; - font: 14px sans-serif; -} -.zoom { - cursor: move; - fill: none; - pointer-events: all; -} - Index: lams_tool_assessment/web/pages/monitoring/monitoring.jsp =================================================================== diff -u -r4f071ba892a63bcdc740dd737c4573a3e8899029 -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 --- lams_tool_assessment/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 4f071ba892a63bcdc740dd737c4573a3e8899029) +++ lams_tool_assessment/web/pages/monitoring/monitoring.jsp (.../monitoring.jsp) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) @@ -11,6 +11,7 @@ +