Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/conf/language/lams/ApplicationResources.properties,v diff -u -r1.34.2.21 -r1.34.2.22 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties 28 Apr 2017 03:03:24 -0000 1.34.2.21 +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties 9 Jun 2017 03:27:58 -0000 1.34.2.22 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java,v diff -u -r1.1.10.4 -r1.1.10.5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java 10 Apr 2017 12:41:56 -0000 1.1.10.4 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentUserDAO.java 9 Jun 2017 03:27:58 -0000 1.1.10.5 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java,v diff -u -r1.1.10.9 -r1.1.10.10 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java 10 Apr 2017 12:41:56 -0000 1.1.10.9 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java 9 Jun 2017 03:27:58 -0000 1.1.10.10 @@ -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; + } + } Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/LeaderResultsDTO.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java,v diff -u -r1.48.2.52 -r1.48.2.53 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 8 Jun 2017 20:00:30 -0000 1.48.2.52 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 9 Jun 2017 03:27:58 -0000 1.48.2.53 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java,v diff -u -r1.26.2.20 -r1.26.2.21 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 10 Apr 2017 12:41:56 -0000 1.26.2.20 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 9 Jun 2017 03:27:58 -0000 1.26.2.21 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java,v diff -u -r1.25.2.12 -r1.25.2.13 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 20 Apr 2017 13:16:04 -0000 1.25.2.12 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 9 Jun 2017 03:27:57 -0000 1.25.2.13 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/includes/css/assessment.css,v diff -u -r1.7.2.10 -r1.7.2.11 --- lams_tool_assessment/web/includes/css/assessment.css 26 Apr 2017 10:51:24 -0000 1.7.2.10 +++ lams_tool_assessment/web/includes/css/assessment.css 9 Jun 2017 03:27:58 -0000 1.7.2.11 @@ -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 =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/monitoring/monitoring.jsp,v diff -u -r1.11.2.10 -r1.11.2.11 --- lams_tool_assessment/web/pages/monitoring/monitoring.jsp 19 Apr 2017 01:26:51 -0000 1.11.2.10 +++ lams_tool_assessment/web/pages/monitoring/monitoring.jsp 9 Jun 2017 03:27:58 -0000 1.11.2.11 @@ -11,6 +11,7 @@ +