Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20131118.sql =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20131118.sql,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/patch20131118.sql 18 Nov 2013 19:45:31 -0000 1.1 @@ -0,0 +1,14 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-3151 Display max mark correctly for question +ALTER TABLE tl_laasse10_question_result ADD COLUMN max_mark FLOAT; + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java,v diff -u -r1.18 -r1.19 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java 17 Sep 2013 17:50:40 -0000 1.18 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java 18 Nov 2013 19:45:31 -0000 1.19 @@ -523,7 +523,7 @@ } /** - * @param grade Grade acquired from QUestionReference in learner. + * @param grade Grade acquired from QuestionReference in learner. */ public void setGrade(int grade) { this.grade = grade; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java,v diff -u -r1.9 -r1.10 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java 7 Aug 2013 07:29:12 -0000 1.9 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java 18 Nov 2013 19:45:31 -0000 1.10 @@ -46,6 +46,7 @@ private boolean answerBoolean; private Long submittedOptionUid; private float mark; + private Float maxMark; private float penalty; private Set optionAnswers; @@ -160,6 +161,22 @@ } /** + * Maximum mark user could have scored for this question. (It is stored in AssessmentQuestionResult class due to + * existence of random questions which makes it's impossible to obtain this info from question) + * + * @hibernate.property column="max_mark" + * + * @return Returns the mark. + */ + public Float getMaxMark() { + return maxMark; + } + + public void setMaxMark(Float maxMark) { + this.maxMark = maxMark; + } + + /** * @hibernate.property column="penalty" * * @return Returns the possible numeric answer. Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java,v diff -u -r1.6 -r1.7 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java 27 Sep 2013 17:16:31 -0000 1.6 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentOutputFactory.java 18 Nov 2013 19:45:31 -0000 1.7 @@ -27,6 +27,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import java.util.TreeSet; import org.lamsfoundation.lams.tool.OutputFactory; import org.lamsfoundation.lams.tool.ToolOutput; @@ -36,6 +37,8 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; +import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; +import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; public class AssessmentOutputFactory extends OutputFactory { @@ -58,24 +61,34 @@ if (toolContentObject != null) { Assessment assessment = (Assessment) toolContentObject; - Set questions = assessment.getQuestions(); + Set questionReferences = new TreeSet(new SequencableComparator()); + questionReferences.addAll(assessment.getQuestionReferences()); Long totalMarksPossible = new Long(0); - for(AssessmentQuestion question : questions) { - totalMarksPossible += question.getDefaultGrade(); + for(QuestionReference questionReference : questionReferences) { + totalMarksPossible += questionReference.getDefaultGrade(); }; definition = buildRangeDefinition(OUTPUT_NAME_LEARNER_TOTAL_SCORE, new Long(0), totalMarksPossible, true); definitionMap.put(OUTPUT_NAME_LEARNER_TOTAL_SCORE, definition); - for(AssessmentQuestion question : questions) { + int randomQuestionsCount = 1; + for(QuestionReference questionReference : questionReferences) { Long markAvailable = null; - if (question.getDefaultGrade() != 0) { - markAvailable = new Long(question.getDefaultGrade()); + if (questionReference.getDefaultGrade() != 0) { + markAvailable = new Long(questionReference.getDefaultGrade()); } - definition = buildRangeDefinition(String.valueOf(question.getSequenceId()), new Long(0), markAvailable); - definition.setDescription(getI18NText("output.user.score.for.question", false) + question.getTitle()); - definitionMap.put(String.valueOf(question.getSequenceId()), definition); + String description = getI18NText("output.user.score.for.question", false); + if (questionReference.isRandomQuestion()) { + description += getI18NText("label.authoring.basic.type.random.question", false) + " " + + randomQuestionsCount++; + } else { + description += questionReference.getQuestion().getTitle(); + } + + definition = buildRangeDefinition(String.valueOf(questionReference.getSequenceId()), new Long(0), markAvailable); + definition.setDescription(description); + definitionMap.put(String.valueOf(questionReference.getSequenceId()), definition); }; } 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.33 -r1.34 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 27 Sep 2013 17:16:31 -0000 1.33 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 18 Nov 2013 19:45:31 -0000 1.34 @@ -164,36 +164,7 @@ // ******************************************************************************* // Service method // ******************************************************************************* - /** - * Try to get the file. If forceLogin = false and an access denied exception occurs, call this method again to get a - * new ticket and retry file lookup. If forceLogin = true and it then fails then throw exception. - * - * @param uuid - * @param versionId - * @param relativePath - * @param attemptCount - * @return file node - */ - private IVersionedNode getFile(Long uuid, Long versionId, String relativePath) - throws AssessmentApplicationException { - ITicket tic = getRepositoryLoginTicket(); - try { - return repositoryService.getFileItem(tic, uuid, versionId, relativePath); - } catch (AccessDeniedException e) { - String error = "Unable to access repository to get file uuid " + uuid + " version id " + versionId - + " path " + relativePath + "."; - error = error + "AccessDeniedException: " + e.getMessage() + " Unable to retry further."; - AssessmentServiceImpl.log.error(error); - throw new AssessmentApplicationException(error, e); - } catch (Exception e) { - String error = "Unable to access repository to get file uuid " + uuid + " version id " + versionId - + " path " + relativePath + "." + " Exception: " + e.getMessage(); - AssessmentServiceImpl.log.error(error); - throw new AssessmentApplicationException(error, e); - } - } - /** * This method verifies the credentials of the Assessment Tool and gives it the Ticket to login and * access the Content Repository. @@ -531,6 +502,8 @@ mark = 0; } questionResult.setMark(mark); + questionResult.setMaxMark(maxMark); + return questionResult; } 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.18 -r1.19 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 27 Sep 2013 17:16:31 -0000 1.18 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 18 Nov 2013 19:45:31 -0000 1.19 @@ -32,6 +32,7 @@ import java.util.List; import java.util.Set; import java.util.TimeZone; +import java.util.TreeSet; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; @@ -58,7 +59,9 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; +import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; import org.lamsfoundation.lams.tool.assessment.service.IAssessmentService; +import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.DateUtil; import org.lamsfoundation.lams.util.ExcelCell; @@ -111,7 +114,7 @@ private ActionForward summary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { // initialize Session Map - SessionMap sessionMap = new SessionMap(); + SessionMap sessionMap = new SessionMap(); request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); @@ -158,7 +161,7 @@ private ActionForward questionSummary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); Long questionUid = WebUtil.readLongParam(request, AssessmentConstants.PARAM_QUESTION_UID); @@ -176,7 +179,7 @@ private ActionForward userSummary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); Long userId = WebUtil.readLongParam(request, AttributeNames.PARAM_USER_ID); @@ -246,7 +249,7 @@ private ActionForward exportSummary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); - SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); + SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); String fileName = null; boolean showUserNames = true; @@ -329,27 +332,53 @@ data.add(summaryRowTitle); Float totalGradesPossible = new Float(0); Float totalAverage = new Float(0); - if (assessment.getQuestions() != null) { - Set questions = (Set) assessment.getQuestions(); + if (assessment.getQuestionReferences() != null) { + Set questionReferences = new TreeSet(new SequencableComparator()); + questionReferences.addAll(assessment.getQuestionReferences()); - for (AssessmentQuestion question : questions) { + int randomQuestionsCount = 1; + for (QuestionReference questionReference : questionReferences) { + + String title; + String questionType; + Float penaltyFactor; + Float averageMark = null; + if (questionReference.isRandomQuestion()) { - QuestionSummary questionSummary = service.getQuestionSummary(assessment.getContentId(), question - .getUid()); + title = service.getMessage("label.authoring.basic.type.random.question") + + randomQuestionsCount++; + questionType = service.getMessage("label.authoring.basic.type.random.question"); + penaltyFactor = null; + averageMark = null; + } else { - ExcelCell[] questCell = new ExcelCell[5]; - questCell[0] = new ExcelCell(question.getTitle(), false); - questCell[1] = new ExcelCell(getQuestionTypeLanguageLabel(question.getType()), false); - questCell[2] = new ExcelCell(question.getPenaltyFactor(), false); - questCell[3] = new ExcelCell(new Long(question.getDefaultGrade()), false); - totalGradesPossible += question.getDefaultGrade(); - if (questionSummary != null) { - questCell[4] = new ExcelCell(questionSummary.getAverageMark(), false); - totalAverage += questionSummary.getAverageMark(); + AssessmentQuestion question = questionReference.getQuestion(); + title = question.getTitle(); + questionType = getQuestionTypeLanguageLabel(question.getType()); + penaltyFactor = question.getPenaltyFactor(); + + QuestionSummary questionSummary = service.getQuestionSummary(assessment.getContentId(), + question.getUid()); + if (questionSummary != null) { + averageMark = questionSummary.getAverageMark(); + totalAverage += questionSummary.getAverageMark(); + } } + + int maxGrade = questionReference.getDefaultGrade(); + totalGradesPossible += maxGrade; + + ExcelCell[] questCell = new ExcelCell[5]; + questCell[0] = new ExcelCell(title, false); + questCell[1] = new ExcelCell(questionType, false); + questCell[2] = new ExcelCell(penaltyFactor, false); + questCell[3] = new ExcelCell(maxGrade, false); + questCell[4] = new ExcelCell(averageMark, false); + data.add(questCell); } + if (totalGradesPossible.floatValue() > 0) { ExcelCell[] totalCell = new ExcelCell[5]; totalCell[2] = new ExcelCell(service.getMessage("label.monitoring.summary.total"), true); @@ -548,8 +577,9 @@ .getAssessmentQuestion().getType()), false); userResultRow[2] = new ExcelCell(new Float(assessmentQuestionResult .getAssessmentQuestion().getPenaltyFactor()), false); - userResultRow[3] = new ExcelCell(new Long(assessmentQuestionResult - .getAssessmentQuestion().getDefaultGrade()), false); + Float maxMark = (assessmentQuestionResult.getMaxMark() == null) ? 0 : new Float( + assessmentQuestionResult.getMaxMark()); + userResultRow[3] = new ExcelCell(maxMark, false); userResultRow[4] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); userResultRow[5] = new ExcelCell(assessmentQuestionResult.getUser().getFullName(), false); @@ -584,8 +614,9 @@ .getAssessmentQuestion().getType()), false); userResultRow[2] = new ExcelCell(new Float(assessmentQuestionResult .getAssessmentQuestion().getPenaltyFactor()), false); - userResultRow[3] = new ExcelCell(new Long(assessmentQuestionResult - .getAssessmentQuestion().getDefaultGrade()), false); + Float maxMark = (assessmentQuestionResult.getMaxMark() == null) ? 0 : new Float( + assessmentQuestionResult.getMaxMark()); + userResultRow[3] = new ExcelCell(maxMark, false); userResultRow[4] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); userResultRow[5] = new ExcelCell(assessmentQuestionResult.getFinishDate(), false); userResultRow[6] = new ExcelCell(getAnswerObject(assessmentQuestionResult), false);