Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java =================================================================== diff -u -re8a7110708b15579af2c6b31ac52a6da427fef6d -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision e8a7110708b15579af2c6b31ac52a6da427fef6d) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonAssessmentService.java (.../ICommonAssessmentService.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -5,15 +5,20 @@ import org.lamsfoundation.lams.confidencelevel.VsaAnswerDTO; public interface ICommonAssessmentService { - + /** * Returns answers learners left for VSA questions in Assessment activity (together with according confidence * levels, if such option is turned on in Assessment). Currently only Assessment tool is capable of producing VSA * answers. - * + * * @param toolSessionId * @return */ Collection getVsaAnswers(Long toolSessionId); -} + /** + * Counts how many questions were answered correctly by the given user, regardless of the mark given. + * Currently it only works for MCQ and mark hedging questions. + */ + Integer countCorrectAnswers(long toolContentId, int userId); +} \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonScratchieService.java =================================================================== diff -u -r2db58f73e88ecef930d486c60cc53fb3fa483415 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonScratchieService.java (.../ICommonScratchieService.java) (revision 2db58f73e88ecef930d486c60cc53fb3fa483415) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ICommonScratchieService.java (.../ICommonScratchieService.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -2,4 +2,9 @@ public interface ICommonScratchieService { void recalculateScratchieMarksForVsaQuestion(Long qbQuestionUid, String answer); + + /** + * Counts how many questions were answered correctly on first attempt by the given user, regardless of mark given. + */ + Integer countCorrectAnswers(long toolContentId, int userId); } \ No newline at end of file Index: lams_monitoring/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -raa932dd995a61adeed918456c6257a4a9a9cea74 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision aa932dd995a61adeed918456c6257a4a9a9cea74) +++ lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -417,6 +417,10 @@ label.gates = Gates label.ira = iRAT label.tra = tRAT +label.ira.mark = iRAT mark +label.ira.correct.count = iRAT correct answer count +label.tra.mark = tRAT mark +label.tra.correct.count = tRAT correct answer count label.burning.questions = Burning Qs label.forum = Forum label.aes = AEs Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java (.../TblGroupDTO.java) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblGroupDTO.java (.../TblGroupDTO.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -16,6 +16,7 @@ private TblUserDTO groupLeader; private Double traScore; + private int traCorrectAnswerCount; /** * Get the DTO for this group. Does not include the GroupBranchActivities as they will be in a separate array for @@ -28,7 +29,7 @@ groupID = group.getGroupId(); groupName = group.getGroupName(); orderID = group.getOrderId(); - userList = new ArrayList(); + userList = new ArrayList<>(); } @Override @@ -89,4 +90,12 @@ public Double getTraScore() { return traScore; } -} + + public int getTraCorrectAnswerCount() { + return traCorrectAnswerCount; + } + + public void setTraCorrectAnswerCount(int traCorrectAnswerCount) { + this.traCorrectAnswerCount = traCorrectAnswerCount; + } +} \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java =================================================================== diff -u -r62aaf160878735888d077bf28fac3c1989bb8fbd -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java (.../TblUserDTO.java) (revision 62aaf160878735888d077bf28fac3c1989bb8fbd) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/dto/TblUserDTO.java (.../TblUserDTO.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -6,6 +6,7 @@ private boolean groupLeader; private Double iraScore; + private int iraCorrectAnswerCount; public TblUserDTO(UserDTO userDto) { super(userDto.getUserID(), userDto.getFirstName(), userDto.getLastName(), userDto.getLocaleCountry(), @@ -29,4 +30,11 @@ return iraScore; } -} + public int getIraCorrectAnswerCount() { + return iraCorrectAnswerCount; + } + + public void setIraCorrectAnswerCount(int iraCorrectAnswerCount) { + this.iraCorrectAnswerCount = iraCorrectAnswerCount; + } +} \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java =================================================================== diff -u -r2ce1ca7a4995e15743c5800fdd789868b0236836 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision 2ce1ca7a4995e15743c5800fdd789868b0236836) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/TblMonitoringController.java (.../TblMonitoringController.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -34,12 +34,15 @@ import org.lamsfoundation.lams.monitoring.dto.TblUserDTO; import org.lamsfoundation.lams.monitoring.service.IMonitoringFullService; import org.lamsfoundation.lams.tool.ToolSession; +import org.lamsfoundation.lams.tool.service.ICommonAssessmentService; +import org.lamsfoundation.lams.tool.service.ICommonScratchieService; import org.lamsfoundation.lams.tool.service.ILamsToolService; import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.util.CommonConstants; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @@ -64,6 +67,12 @@ private IActivityDAO activityDAO; @Autowired private IGradebookService gradebookService; + @Autowired + @Qualifier("laasseAssessmentService") + private ICommonAssessmentService commonAssessmentService; + @Autowired + @Qualifier("scratchieService") + private ICommonScratchieService commonScratchieService; /** * Displays addStudent page. @@ -90,26 +99,30 @@ List lessonActivities = getLessonActivities(lesson); setupAvailableActivityTypes(request, lessonActivities); - boolean isScratchieAvailable = (request.getAttribute("isScratchieAvailable") != null) + boolean isTraAvailable = (request.getAttribute("isScratchieAvailable") != null) && ((Boolean) request.getAttribute("isScratchieAvailable")); - boolean isIraMcqAvailable = (request.getAttribute("isIraMcqAvailable") != null) - && ((Boolean) request.getAttribute("isIraMcqAvailable")); - boolean isIraAssessmentAvailable = (request.getAttribute("isIraAssessmentAvailable") != null) + boolean isIraAvailable = (request.getAttribute("isIraAssessmentAvailable") != null) && ((Boolean) request.getAttribute("isIraAssessmentAvailable")); Long iraToolActivityId = request.getAttribute("iraToolActivityId") == null ? null : (Long) request.getAttribute("iraToolActivityId"); Long traToolActivityId = request.getAttribute("traToolActivityId") == null ? null : (Long) request.getAttribute("traToolActivityId"); Long leaderselectionToolActivityId = request.getAttribute("leaderselectionToolActivityId") == null ? null : (Long) request.getAttribute("leaderselectionToolActivityId"); + Long iraToolContentId = isIraAvailable + ? activityDAO.find(ToolActivity.class, iraToolActivityId).getToolContentId() + : null; + Long traToolContentId = isTraAvailable + ? activityDAO.find(ToolActivity.class, traToolActivityId).getToolContentId() + : null; //get all mcq and assessment scores List iraGradebookUserActivities = new LinkedList<>(); List traGradebookUserActivities = new LinkedList<>(); - if (isIraMcqAvailable || isIraAssessmentAvailable) { + if (isIraAvailable) { iraGradebookUserActivities = gradebookService.getGradebookUserActivities(iraToolActivityId); } - if (isScratchieAvailable) { + if (isTraAvailable) { traGradebookUserActivities = gradebookService.getGradebookUserActivities(traToolActivityId); } @@ -138,31 +151,45 @@ groupDto.getUserList().add(userDto); //set up all user leaders - if (leaderUserIds.contains(new Long(user.getUserId()))) { + if (leaderUserIds.contains(user.getUserId().longValue())) { userDto.setGroupLeader(true); groupDto.setGroupLeader(userDto); } - if (isIraMcqAvailable || isIraAssessmentAvailable) { - //find according iraGradebookUserActivity + if (isIraAvailable) { + // find according iraGradebookUserActivity for (GradebookUserActivity iraGradebookUserActivity : iraGradebookUserActivities) { if (iraGradebookUserActivity.getLearner().getUserId().equals(user.getUserId())) { userDto.setIraScore(iraGradebookUserActivity.getMark()); + break; } } + + Integer correctAnswerCount = commonAssessmentService.countCorrectAnswers(iraToolContentId, + user.getUserId()); + if (correctAnswerCount != null) { + userDto.setIraCorrectAnswerCount(correctAnswerCount); + } } + } - if (isScratchieAvailable) { - //find according traGradebookUserActivity - for (GradebookUserActivity traGradebookUserActivity : traGradebookUserActivities) { - if (traGradebookUserActivity.getLearner().getUserId().equals(user.getUserId())) { - //we set traScore multiple times, but it's doesn't matter - groupDto.setTraScore(traGradebookUserActivity.getMark()); - break; - } + if (isTraAvailable && groupDto.getGroupLeader() != null) { + //find according traGradebookUserActivity + for (GradebookUserActivity traGradebookUserActivity : traGradebookUserActivities) { + if (traGradebookUserActivity.getLearner().getUserId() + .equals(groupDto.getGroupLeader().getUserID())) { + groupDto.setTraScore(traGradebookUserActivity.getMark()); + + break; } } + + Integer correctAnswerCount = commonScratchieService.countCorrectAnswers(traToolContentId, + groupDto.getGroupLeader().getUserID()); + if (correctAnswerCount != null) { + groupDto.setTraCorrectAnswerCount(correctAnswerCount); + } } } } Index: lams_monitoring/web/tblmonitor/teams.jsp =================================================================== diff -u -rec9b0ffc2e88f3504fd7505ee8474f86d89a2458 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_monitoring/web/tblmonitor/teams.jsp (.../teams.jsp) (revision ec9b0ffc2e88f3504fd7505ee8474f86d89a2458) +++ lams_monitoring/web/tblmonitor/teams.jsp (.../teams.jsp) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -188,44 +188,78 @@
- -
- - - - - - + + +

: + + + - + + + ${groupDto.traScore} + + + + ${groupDto.traScore} + + + +

+ +

: + + + - + + + ${groupDto.traScore} + + + + ${groupDto.traCorrectAnswerCount} + + + +

+
+ + +
+
- -
+ + + + - - - - - - - - - - - - - + + + + + + + + + - - - - - - - -
+ + - + - +
- font-weight-bold" - data-portrait="${userDto.portraitUuid}" data-fullname="${userDto.lastName}, ${userDto.firstName}"> - ${userDto.lastName}, ${userDto.firstName} - - - - -
+ font-weight-bold" + data-portrait="${userDto.portraitUuid}" data-fullname="${userDto.lastName}, ${userDto.firstName}"> + ${userDto.lastName}, ${userDto.firstName} + + + + + @@ -240,24 +274,28 @@ - - ${groupDto.traScore} - + + + + ${userDto.iraCorrectAnswerCount} + + + + 0 + +
-
- + + + + +
+ +
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r8ab538060bcbe447a53e17f8dbdbb26dab2595a1 -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 8ab538060bcbe447a53e17f8dbdbb26dab2595a1) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -3321,7 +3321,46 @@ return uid_answerToVsaAnswerDtoMap.values(); } + /** + * Counts how many questions were answered correctly by the given user, regardless of the mark given. + * Currently it only works for MCQ and mark hedging questions. + */ @Override + public Integer countCorrectAnswers(long toolContentId, int userId) { + Assessment assessment = getAssessmentByContentId(toolContentId); + AssessmentUser user = getUserByIdAndContent((long) userId, toolContentId); + if (user == null) { + return null; + } + AssessmentResult assessmentResult = getLastAssessmentResult(assessment.getUid(), user.getUid()); + if (assessmentResult == null) { + return 0; + } + + int count = 0; + for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { + QbToolQuestion qbToolQuestion = questionResult.getQbToolQuestion(); + QbQuestion qbQuestion = qbToolQuestion.getQbQuestion(); + if (qbQuestion.getType() == QbQuestion.TYPE_MULTIPLE_CHOICE + || qbQuestion.getType() == QbQuestion.TYPE_MARK_HEDGING) { + + QuestionDTO questionDTO = new QuestionDTO(qbToolQuestion); + loadupQuestionResultIntoQuestionDto(questionDTO, questionResult); + + calculateAnswerMark(assessment.getUid(), user.getUid(), questionResult, questionDTO); + if (questionResult.getMark() > 0) { + count++; + } + } + // We are just doing some calculations. Do not allow Hiberante to automatically store any changes to the entity. + releaseFromCache(questionResult); + } + releaseFromCache(assessmentResult); + + return count; + } + + @Override public void forceCompleteUser(Long toolSessionId, User user) { Long userId = user.getUserId().longValue(); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -rf81ad92d7445d0966d6a72a5a589a357f6e8272b -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision f81ad92d7445d0966d6a72a5a589a357f6e8272b) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -897,12 +897,14 @@ questionDto.setAnswer(answer); } } - + // store confidence level entered by the learner if (assessment.isEnableConfidenceLevels()) { - int confidenceLevel = WebUtil.readIntParam(request, - AssessmentConstants.ATTR_CONFIDENCE_LEVEL_PREFIX + i); - questionDto.setConfidenceLevel(confidenceLevel); + Integer confidenceLevel = WebUtil.readIntParam(request, + AssessmentConstants.ATTR_CONFIDENCE_LEVEL_PREFIX + i, true); + if (confidenceLevel != null) { + questionDto.setConfidenceLevel(confidenceLevel); + } } // store justification entered by the learner Index: lams_tool_assessment/web/pages/tblmonitoring/teams.jsp =================================================================== diff -u -rd8bb9e0996a5490f2ab4b047baadf4aa4da9db8a -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_tool_assessment/web/pages/tblmonitoring/teams.jsp (.../teams.jsp) (revision d8bb9e0996a5490f2ab4b047baadf4aa4da9db8a) +++ lams_tool_assessment/web/pages/tblmonitoring/teams.jsp (.../teams.jsp) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -119,7 +119,7 @@ -
'; +
${option.name}
Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -r42acec78d2cee4dd172267c4b82001b08b3612cc -r64bfad846c475db43b1b303e0df03735f39d34ce --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 42acec78d2cee4dd172267c4b82001b08b3612cc) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 64bfad846c475db43b1b303e0df03735f39d34ce) @@ -592,7 +592,44 @@ } } + /** + * Counts how many questions were answered correctly on first attempt by the given user, regardless of mark given. + */ @Override + public Integer countCorrectAnswers(long toolContentId, int userId) { + Scratchie scratchie = getScratchieByContentId(toolContentId); + ScratchieUser user = getUserByUserIDAndContentID((long) userId, toolContentId); + if (user == null) { + return null; + } + List logs = scratchieAnswerVisitDao.getLogsBySession(user.getSession().getSessionId()); + if (logs.isEmpty()) { + return 0; + } + + int count = 0; + + for (ScratchieItem item : scratchie.getScratchieItems()) { + //create a list of attempts user done for the current item + List visitLogs = new ArrayList<>(); + for (ScratchieAnswerVisitLog log : logs) { + if (log.getQbToolQuestion().getUid().equals(item.getUid())) { + visitLogs.add(log); + } + } + + int numberOfAttempts = visitLogs.size(); + boolean isUnraveledOnFirstAttempt = (numberOfAttempts == 1) + && ScratchieServiceImpl.isItemUnraveled(item, logs); + if (isUnraveledOnFirstAttempt) { + count++; + } + } + + return count; + } + + @Override public List getBurningQuestionsBySession(Long sessionId) { return scratchieBurningQuestionDao.getBurningQuestionsBySession(sessionId); } @@ -1032,7 +1069,6 @@ // get lowest mark by default int mark = Integer.parseInt(presetMarks[presetMarks.length - 1]); // add mark only if an item was unravelled - // add mark only if an item was unraveled if (ScratchieServiceImpl.isItemUnraveled(item, userLogs)) { int itemAttempts = ScratchieServiceImpl.getNumberAttemptsForItem(userLogs, item); String markStr = (itemAttempts <= presetMarks.length) ? presetMarks[itemAttempts - 1]