Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r8be457696d7f17c6da2e89704fe7e128f1f8ea91 -r36e9121497b2c963250d22ec0f660fd66934182e --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 8be457696d7f17c6da2e89704fe7e128f1f8ea91) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 36e9121497b2c963250d22ec0f660fd66934182e) @@ -2573,6 +2573,11 @@ } @Override + public String getMessage(String key, Object[] args) { + return messageService.getMessage(key, args); + } + + @Override public boolean isGroupedActivity(long toolContentID) { return toolService.isGroupedActivity(toolContentID); } @@ -3527,8 +3532,7 @@ option.setDisplayOrder(displayOrder); option.setQbQuestion(qbQuestion); } - - + Boolean correct = JsonUtil.optBoolean(answerData, RestTags.CORRECT, null); if (correct == null) { Double grade = JsonUtil.optDouble(answerData, "grade"); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rb9300513239d652c59e3bfd190d0973295844f37 -r36e9121497b2c963250d22ec0f660fd66934182e --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision b9300513239d652c59e3bfd190d0973295844f37) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 36e9121497b2c963250d22ec0f660fd66934182e) @@ -498,6 +498,8 @@ */ String getMessage(String key); + String getMessage(String key, Object[] args); + /** * Get the definitions for possible output for an activity, based on the toolContentId. These may be definitions * that are always available for the tool (e.g. number of marks for Multiple Choice) or a custom definition created Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -r2fe063fefbb629bb00bfa6781e3bfb9071aba7b9 -r36e9121497b2c963250d22ec0f660fd66934182e --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 2fe063fefbb629bb00bfa6781e3bfb9071aba7b9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 36e9121497b2c963250d22ec0f660fd66934182e) @@ -25,6 +25,7 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.LinkedList; import java.util.List; @@ -45,6 +46,9 @@ import org.lamsfoundation.lams.qb.dto.QbStatsActivityDTO; import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.qb.service.IQbService; +import org.lamsfoundation.lams.rating.model.Rating; +import org.lamsfoundation.lams.rating.model.RatingCriteria; +import org.lamsfoundation.lams.rating.service.IRatingService; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; @@ -70,6 +74,7 @@ import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.DateUtil; import org.lamsfoundation.lams.util.JsonUtil; +import org.lamsfoundation.lams.util.NumberUtil; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.util.excel.ExcelSheet; import org.lamsfoundation.lams.util.excel.ExcelUtil; @@ -104,6 +109,9 @@ @Autowired private IQbService qbService; + @Autowired + private IRatingService ratingService; + @RequestMapping("/summary") public String summary(HttpServletRequest request, HttpServletResponse response) { @@ -190,7 +198,7 @@ request.setAttribute("maxOptionsInQuestion", maxOptionsInQuestion); int totalNumberOfUsers = service.getCountUsersByContentId(contentId); - + Set questionDtos = new TreeSet<>(); for (AssessmentQuestion question : assessment.getQuestions()) { QuestionDTO questionDto = new QuestionDTO(question); @@ -231,9 +239,10 @@ return null; } Long contentId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_CONTENT_ID); - QuestionSummary questionSummary = service.getQuestionSummary(contentId, questionUid); + QuestionSummary questionSummary = service.getQuestionSummary(contentId, questionUid); request.setAttribute(AssessmentConstants.ATTR_QUESTION_SUMMARY, questionSummary); + return "pages/monitoring/parts/questionsummary"; } @@ -420,6 +429,7 @@ /** * Refreshes user list. */ + @SuppressWarnings("unchecked") @RequestMapping("/getUsersByQuestion") public String getUsersByQuestion(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException { @@ -428,6 +438,7 @@ Long sessionId = WebUtil.readLongParam(request, "sessionId"); Long questionUid = WebUtil.readLongParam(request, "questionUid"); + AssessmentQuestion question = service.getAssessmentQuestionByUid(questionUid); // Getting the params passed in from the jqGrid int page = WebUtil.readIntParam(request, CommonConstants.PARAM_PAGE); @@ -479,6 +490,22 @@ int totalPages = Double.valueOf(Math.ceil(Double.valueOf(countSessionUsers) / Double.valueOf(rowLimit))) .intValue(); + Long ratingCriteriaId = null; + if (question.isGroupsAnswersDisclosed()) { + // Assessment currently supports only one place for ratings. + // It is rating other groups' answers on results page. + // Criterion gets automatically created in learner and there must be only one. + List criteria = ratingService.getCriteriasByToolContentId(assessment.getContentId()); + if (criteria.size() > 2) { + throw new IllegalArgumentException("There can be only one criterion for an Assessment activity. " + + "If other criteria are introduced, the criterion for rating other groups' answers needs to become uniquely identifiable."); + } + + if (!criteria.isEmpty()) { + ratingCriteriaId = criteria.get(0).getRatingCriteriaId(); + } + } + ArrayNode rows = JsonNodeFactory.instance.arrayNode(); int i = 1; for (AssessmentUserDTO userDto : userDtos) { @@ -500,8 +527,37 @@ userData.add(questionResult.getConfidenceLevel()); } + // show average rating + if (question.isGroupsAnswersDisclosed()) { + String starString = "-"; + if (ratingCriteriaId != null) { + List ratings = ratingService.getRatingsByCriteriasAndItems( + Arrays.asList(ratingCriteriaId), Arrays.asList(questionResultUid)); + if (!ratings.isEmpty()) { + int numberOfVotes = ratings.size(); + double ratingSum = ratings.stream().mapToDouble(Rating::getRating).sum(); + String averageRating = NumberUtil + .formatLocalisedNumberForceDecimalPlaces(ratingSum / numberOfVotes, null, 2); + + starString = "
"; + starString += "
"; + starString += "
"; + starString += "
"; + String msg = service.getMessage("label.average.rating", + new Object[] { averageRating, numberOfVotes }); + starString += msg; + starString += "
"; + } + } + userData.add(starString); + } + userData.add(AssessmentEscapeUtils.printResponsesForJqgrid(questionResult)); - if (userDto.getPortraitId() != null) { + if (userDto.getPortraitId() == null) { + userData.add(""); + } else { userData.add(userDto.getPortraitId()); } Index: lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp =================================================================== diff -u -r4a2902072e80bc9fcfd6534115751829210e2153 -r36e9121497b2c963250d22ec0f660fd66934182e --- lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 4a2902072e80bc9fcfd6534115751829210e2153) +++ lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp (.../questionsummary.jsp) (revision 36e9121497b2c963250d22ec0f660fd66934182e) @@ -9,6 +9,8 @@ <%@ include file="/common/header.jsp"%> + + @@ -37,11 +39,26 @@ LABEL_SURE : '', LABEL_VERY_SURE : '' }; + + //var for jquery.jRating.js + var pathToImageFolder = "${lams}images/css/"; + + //vars for rating.js + var MAX_RATES = 0, + MIN_RATES = 0, + COMMENTS_MIN_WORDS_LIMIT = 0, + LAMS_URL = '', + COUNT_RATED_ITEMS = 0, + COMMENT_TEXTAREA_TIP_LABEL = '', + WARN_COMMENTS_IS_BLANK_LABEL = '', + WARN_MIN_NUMBER_WORDS_LABEL = ''; - + + +