Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r8c36fe00146d9eebf2c071d742e908ab419168c3 -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 8c36fe00146d9eebf2c071d742e908ab419168c3) +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -201,6 +201,7 @@ error.form.validation.error =You have 1 error in a form. It has been highlighted error.form.validation.errors =You have {0} errors in a form. They have been highlighted error.form.validation.hundred.score =One of the answers should have a grade of 100% so it is possible to get full marks for this question. +error.form.validation.positive.accepted.errors =All the accepted errors should be positive. message.msg.maxFileSize =Max 250K label.open =Open label.delete =Delete @@ -257,8 +258,8 @@ monitor.summary.td.addNotebook =Add Notebook at end of Shared Resources monitor.summary.td.notebookInstructions =Notebook instructions label.authoring.advanced.notify.on.attempt.completion =Notify teacher after student completes attempt -event.assigment.submit.subject =LAMS: A learner submitted an assigment in a Shared Resources tool -event.assigment.submit.body =The learner {0} submitted an assigment in a Shared Resources tool.\n\nThis message was send automatically, following tool''s advanced settings. +event.learner.completes.attempt.subject =LAMS: Learner completed attempt in Assessment tool +event.learner.completes.attempt.body =The learner {0} completed attempt in Assessment tool.\n\nThis message was send automatically, following tool''s advanced settings. message.alertContentEdit =Warning: One of more learners have accessed this activity. Changing this content will result in learners getting different information. warning.msg.authoring.do.you.want.to.delete =Do you really want to delete this question? Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java (.../AssessmentConstants.java) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -181,6 +181,8 @@ public static final String ATTR_FINISHED_LOCK = "finishedLock"; public static final String ATTR_USER = "user"; + + public static final String ATTR_QUESTION_NUMBERING_OFFSET = "questionNumberingOffset"; // error message keys public static final String ERROR_MSG_QUESTION_NAME_BLANK = "error.question.name.blank"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java (.../AssessmentQuestion.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.java (.../AssessmentQuestion.java) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -100,6 +100,8 @@ private float penalty; + private Set matchingPairOptions; + public AssessmentQuestion() { questionOptions = new TreeSet(new SequencableComparator()); units = new TreeSet(new SequencableComparator()); @@ -483,4 +485,11 @@ public void setPenalty(Float penalty) { this.penalty = penalty; } + + public Set getMatchingPairOptions() { + return matchingPairOptions; + } + public void setMatchingPairOptions(Set matchingPairOptions) { + this.matchingPairOptions = matchingPairOptions; + } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -31,13 +31,15 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -90,6 +92,7 @@ import org.lamsfoundation.lams.tool.assessment.util.AssessmentQuestionResultComparator; import org.lamsfoundation.lams.tool.assessment.util.AssessmentToolContentHandler; import org.lamsfoundation.lams.tool.assessment.util.ReflectDTOComparator; +import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.SessionDataExistsException; import org.lamsfoundation.lams.tool.exception.ToolException; @@ -415,18 +418,6 @@ public void saveOrUpdateAssessmentResult(AssessmentResult assessmentResult) { assessmentResultDao.saveObject(assessmentResult); } - - public void retrieveComplete(SortedSet assessmentQuestionList, AssessmentUser user) { -// for (AssessmentQuestion question : assessmentQuestionList) { -// AssessmentQuestionResult result = assessmentQuestionResultDao.getAssessmentQuestionResult(question.getUid(), -// user.getUserId()); -// if (result == null) { -// question.setComplete(false); -// } else { -//// question.setComplete(result.isProcessed()); -// } -// } - } public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { AssessmentResult result = new AssessmentResult(); @@ -437,10 +428,10 @@ assessmentResultDao.saveObject(result); } - public void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions) { + public void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions) { SortedSet questionResultList = new TreeSet( new AssessmentQuestionResultComparator()); - for (SortedSet questionsForOnePage : pagedQuestions) { + for (LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { AssessmentQuestionResult processedAnswer = this.processUserAnswer(question); questionResultList.add(processedAnswer); @@ -484,8 +475,19 @@ } } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER) { for (AssessmentQuestionOption option : question.getQuestionOptions()) { - if (option.getOptionString().equals(question.getAnswerString())) { + String optionString = option.getOptionString().replaceAll("\\*", ".*"); + Pattern pattern; + if (question.isCaseSensitive()) { + pattern = Pattern.compile(optionString, java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE); + } else { + pattern = Pattern.compile(optionString); + } + boolean isAnswerCorrect = pattern.matcher(question.getAnswerString()).matches(); + + if (isAnswerCorrect) { mark = option.getGrade()*maxMark; + //for display purposes + option.setAnswerBoolean(true); break; } } @@ -496,10 +498,11 @@ if ((answerFloat >= (option.getOptionFloat() - option.getAcceptedError())) && (answerFloat <= (option.getOptionFloat() + option.getAcceptedError()))) { mark = option.getGrade() * maxMark; + //for display purposes + option.setAnswerBoolean(true); break; } } - //TODO may be NumberFormatException and smth else } catch (Exception e) { } } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_TRUE_FALSE) { @@ -508,9 +511,12 @@ } } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) { float maxMarkForCorrectAnswer = maxMark / question.getQuestionOptions().size(); + TreeSet correctOptionSet = new TreeSet(new SequencableComparator()); + correctOptionSet.addAll(question.getQuestionOptions()); + ArrayList correctOptionList = new ArrayList(correctOptionSet); + int i = 0; for (AssessmentQuestionOption option : question.getQuestionOptions()) { - //TODO correct answer - if (option.getAnswerInt() == option.getSequenceId()) { + if (option.getUid() == correctOptionList.get(i++).getUid()) { mark += maxMarkForCorrectAnswer*maxMark; } } @@ -561,7 +567,6 @@ List group = new ArrayList(); // get all question which is accessed by user - //TODO fix this Map visitCountMap =null; //assessmentQuestionResultDao.getSummary(contentId); @@ -637,7 +642,6 @@ return map; } - //TODO either delete or fix // public List getUserListBySessionQuestion(Long sessionId, Long questionUid) { // List logList = assessmentQuestionResultDao.getAssessmentQuestionResultBySession( // sessionId, questionUid); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.assessment.service; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -175,9 +176,7 @@ */ void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId); - void retrieveComplete(SortedSet assessmentQuestionList, AssessmentUser user); - - void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions); + void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions); AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -29,12 +29,13 @@ import java.net.URLDecoder; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; import java.util.TreeSet; import javax.servlet.ServletException; @@ -52,6 +53,7 @@ import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; +import org.lamsfoundation.lams.events.DeliveryMethodMail; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; import org.lamsfoundation.lams.tool.ToolAccessMode; @@ -69,6 +71,7 @@ import org.lamsfoundation.lams.tool.assessment.util.AssessmentQuestionResultComparator; import org.lamsfoundation.lams.tool.assessment.util.SequencableComparator; import org.lamsfoundation.lams.tool.assessment.web.form.ReflectionForm; +import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; @@ -168,7 +171,15 @@ // check whehter finish lock is on/off // TODO!! assessment.getTimeLimit() - boolean finishedLock = (assessmentUser != null && assessmentUser.isSessionFinished()); + HttpSession ss = SessionManager.getSession(); + //TODO check this user out + UserDTO userDTO = (UserDTO) ss.getAttribute(AttributeNames.USER); + Long userID = new Long(userDTO.getUserID().longValue()); + AssessmentUser user = service.getUserByIDAndSession(userID, toolSessionId); + int dbResultCount = service.getAssessmentResultCount(toolSessionId, userID); + int attemptsAllowed = assessment.getAttemptsAllowed(); + boolean finishedLock = ((assessmentUser != null) && assessmentUser.isSessionFinished()) + || ((attemptsAllowed <= dbResultCount) && (attemptsAllowed != 0)); // get notebook entry String entryText = new String(); @@ -215,7 +226,8 @@ sessionMap.put(AssessmentConstants.PARAM_RUN_OFFLINE, false); } - SortedSet questionList = new TreeSet(new SequencableComparator()); + + Set questionList = new TreeSet(new SequencableComparator()); if (questionsFromDB != null) { // remove hidden questions. for (AssessmentQuestion question : questionsFromDB) { @@ -229,42 +241,55 @@ } } } + + // shuffling + if (assessment.isShuffled()) { + ArrayList shuffledList = new ArrayList(questionList); + Collections.shuffle(shuffledList); + questionList = new LinkedHashSet(shuffledList); + } + for (AssessmentQuestion question : questionList) { + if (question.isShuffle() || (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING)) { + ArrayList shuffledList = new ArrayList(question.getQuestionOptions()); + Collections.shuffle(shuffledList); + question.setQuestionOptions(new LinkedHashSet(shuffledList)); + } + if (question.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { + ArrayList shuffledList = new ArrayList(question.getQuestionOptions()); + Collections.shuffle(shuffledList); + question.setMatchingPairOptions(new LinkedHashSet(shuffledList)); + } + } // TODO it moght need to be changed //setAttemptStarted -// if (mode != null && mode.isLearner()) { +// if (! finishedLock) { service.setAttemptStarted(assessment, assessmentUser, toolSessionId); // } //paging - ArrayList> pagedQuestions = new ArrayList>(); + ArrayList> pagedQuestions = new ArrayList>(); int maxQuestionsPerPage = (assessment.getQuestionsPerPage() != 0) ? assessment.getQuestionsPerPage() : questionList.size(); - SortedSet questionsForOnePage = new TreeSet( - new SequencableComparator()); + LinkedHashSet questionsForOnePage = new LinkedHashSet(); pagedQuestions.add(questionsForOnePage); int count = 0; for (AssessmentQuestion question : questionList) { questionsForOnePage.add(question); count++; if ((questionsForOnePage.size() == maxQuestionsPerPage) && (count != questionList.size())) { - questionsForOnePage = new TreeSet(new SequencableComparator()); + questionsForOnePage = new LinkedHashSet(); pagedQuestions.add(questionsForOnePage); } } sessionMap.put(AssessmentConstants.ATTR_PAGED_QUESTIONS, pagedQuestions); + sessionMap.put(AssessmentConstants.ATTR_QUESTION_NUMBERING_OFFSET, 1); sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, 1); sessionMap.put(AssessmentConstants.ATTR_ASSESSMENT, assessment); - sessionMap.put(AssessmentConstants.ATTR_QUESTION_LIST, questionList); - // set complete flag for display purpose - //TODO check this out - HttpSession ss = SessionManager.getSession(); - UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - Long userID = new Long(user.getUserID().longValue()); - int dbResultCount = service.getAssessmentResultCount(toolSessionId, userID); + // loadupLastAttempt for display purpose if (dbResultCount > 0) { loadupLastAttempt(sessionMap); } @@ -291,7 +316,15 @@ preserveUserAnswers(request); } - sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, WebUtil.readIntParam(request, AssessmentConstants.ATTR_PAGE_NUMBER)); + int pageNumber = WebUtil.readIntParam(request, AssessmentConstants.ATTR_PAGE_NUMBER); + int questionNumberingOffset = 0; + ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + for (int i = 0; i < pageNumber-1; i++) { + LinkedHashSet questionsForOnePage = pagedQuestions.get(i); + questionNumberingOffset += questionsForOnePage.size(); + } + sessionMap.put(AssessmentConstants.ATTR_QUESTION_NUMBERING_OFFSET, ++questionNumberingOffset); + sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, pageNumber); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMapID); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -316,7 +349,6 @@ sessionMap.put(AssessmentConstants.ATTR_IS_RESUBMIT_ALLOWED, isResubmitAllowed(sessionMap)); sessionMap.put(AssessmentConstants.ATTR_FINISHED_LOCK, true); - sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER)); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMapID); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -352,7 +384,6 @@ sessionMap.put(AssessmentConstants.ATTR_IS_RESUBMIT_ALLOWED, isResubmitAllowed(sessionMap)); sessionMap.put(AssessmentConstants.ATTR_FINISHED_LOCK, true); - sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER)); request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMapID); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -404,19 +435,6 @@ ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); -// // auto run mode, when use finish the only one assessment question, mark it as complete then finish this -// // activity as -// // well. -// String assessmentQuestionUid = request.getParameter(AssessmentConstants.PARAM_QUESTION_UID); -// if (assessmentQuestionUid != null) { -// doComplete(request); -// // NOTE:So far this flag is useless(31/08/2006). -// // set flag, then finish page can know redir target is parent(AUTO_RUN) or self(normal) -//// request.setAttribute(AssessmentConstants.ATTR_RUN_AUTO, true); -// } else { -//// request.setAttribute(AssessmentConstants.ATTR_RUN_AUTO, false); -// } - IAssessmentService service = getAssessmentService(); // get sessionId from HttpServletRequest String nextActivityUrl = null; @@ -466,8 +484,8 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); int pageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); - ArrayList> pagedResults = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - SortedSet questionsForOnePage = (SortedSet) pagedResults.get(pageNumber-1); + ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + LinkedHashSet questionsForOnePage = pagedQuestions.get(pageNumber-1); Long questionUid = new Long(request.getParameter(AssessmentConstants.PARAM_QUESTION_UID)); AssessmentQuestion question = null; @@ -485,21 +503,15 @@ List rList = new ArrayList(optionList); // get current and the target item, and switch their sequnece - AssessmentQuestionOption option = rList.get(optionIndex); - AssessmentQuestionOption repOption; + AssessmentQuestionOption option = rList.remove(optionIndex); if (up) { - repOption = rList.get(--optionIndex); + rList.add(--optionIndex, option); } else { - repOption = rList.get(++optionIndex); + rList.add(++optionIndex, option); } - int upSeqId = repOption.getSequenceId(); - repOption.setSequenceId(option.getSequenceId()); - option.setSequenceId(upSeqId); - - // put back list, it will be sorted again - optionList = new TreeSet(new SequencableComparator()); - optionList.addAll(rList); + // put back list + optionList = new LinkedHashSet(rList); question.setQuestionOptions(optionList); } @@ -590,8 +602,8 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); int pageNumber = (Integer) sessionMap.get(AssessmentConstants.ATTR_PAGE_NUMBER); - ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - SortedSet questionsForOnePage = (SortedSet) pagedQuestions.get(pageNumber-1); + ArrayList> pagedQuestions = (ArrayList>) sessionMap.get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + LinkedHashSet questionsForOnePage = pagedQuestions.get(pageNumber-1); int count = questionsForOnePage.size(); for (int i = 0; i < count; i++) { @@ -642,25 +654,24 @@ String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i); question.setAnswerString(answerString); } else if (questionType == AssessmentConstants.QUESTION_TYPE_ORDERING) { - //TODO correct answer - for (AssessmentQuestionOption option : question.getQuestionOptions()) { - String answerString = request.getParameter(AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" - + option.getSequenceId()); - option.setAnswerInt(option.getSequenceId()); - } +// for (AssessmentQuestionOption option : question.getQuestionOptions()) { +// int statusIndex = WebUtil.readIntParam(request, AssessmentConstants.ATTR_QUESTION_PREFIX + i + "_" +// + option.getSequenceId()); +// option.setAnswerInt(statusIndex); +// } } } } private void loadupResultMarks(SessionMap sessionMap){ - ArrayList> pagedQuestions = (ArrayList>) sessionMap + ArrayList> pagedQuestions = (ArrayList>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Long assessmentUid = ((Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT)).getUid(); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); IAssessmentService service = getAssessmentService(); AssessmentResult result = service.getLastAssessmentResult(assessmentUid,userId); - for(SortedSet questionsForOnePage : pagedQuestions) { + for(LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { @@ -673,14 +684,14 @@ } private void loadupLastAttempt(SessionMap sessionMap){ - ArrayList> pagedQuestions = (ArrayList>) sessionMap + ArrayList> pagedQuestions = (ArrayList>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Long assessmentUid = ((Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT)).getUid(); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); IAssessmentService service = getAssessmentService(); AssessmentResult result = service.getLastAssessmentResult(assessmentUid,userId); - for(SortedSet questionsForOnePage : pagedQuestions) { + for(LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { @@ -713,12 +724,34 @@ * */ private void processUserAnswers(SessionMap sessionMap) { - ArrayList> pagedQuestions = (ArrayList>) sessionMap + ArrayList> pagedQuestions = (ArrayList>) sessionMap .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); Long assessmentUid = ((Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT)).getUid(); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); IAssessmentService service = getAssessmentService(); service.processUserAnswers(assessmentUid, userId, pagedQuestions); + + // notify teachers + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + if ((mode != null) && !mode.isTeacher()) { + Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); + Long toolSessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + if (assessment.isNotifyTeachersOnAttemptCompletion()) { + List monitoringUsers = service.getMonitorsByToolSessionId(toolSessionId); + if (monitoringUsers != null && !monitoringUsers.isEmpty()) { + Long[] monitoringUsersIds = new Long[monitoringUsers.size()]; + for (int i = 0; i < monitoringUsersIds.length; i++) { + monitoringUsersIds[i] = monitoringUsers.get(i).getUserId().longValue(); + } + AssessmentUser assessmentUser = getCurrentUser(service, toolSessionId); + String fullName = assessmentUser.getLastName() + " " + assessmentUser.getFirstName(); + service.getEventNotificationService().sendMessage(monitoringUsersIds, + DeliveryMethodMail.getInstance(), + service.getLocalisedMessage("event.learner.completes.attempt.subject", null), + service.getLocalisedMessage("event.learner.completes.attempt.body", new Object[] { fullName })); + } + } + } } /** @@ -795,37 +828,4 @@ return assessmentUser; } - -// /** -// * Set complete flag for given assessment question. -// * -// * @param request -// * @param sessionId -// */ -// private void doComplete(HttpServletRequest request) { -// // get back sessionMap -// String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); -// SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); -// -// Long assessmentQuestionUid = new Long(request.getParameter(AssessmentConstants.PARAM_QUESTION_UID)); -// IAssessmentService service = getAssessmentService(); -// HttpSession ss = SessionManager.getSession(); -// // get back login user DTO -// UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); -// -// Long sessionId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_SESSION_ID); -// service.setQuestionComplete(assessmentQuestionUid, new Long(user.getUserID().intValue()), sessionId); -// -// SortedSet questionList = (SortedSet) sessionMap -// .get(AssessmentConstants.ATTR_QUESTION_LIST); -// SortedSet assessmentQuestionList = questionList; -// // set assessment question complete tag -// for (AssessmentQuestion question : assessmentQuestionList) { -// if (question.getUid().equals(assessmentQuestionUid)) { -// question.setComplete(true); -// break; -// } -// } -// } - } Index: lams_tool_assessment/web/pages/learning/learning.jsp =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/web/pages/learning/learning.jsp (.../learning.jsp) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -109,7 +109,7 @@ - ${status.index + 1} + ${status.index + sessionMap.questionNumberingOffset} Index: lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp (.../matchingpairs.jsp) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/web/pages/learning/parts/matchingpairs.jsp (.../matchingpairs.jsp) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -23,7 +23,7 @@ - + ${selectOption.optionString} Index: lams_tool_assessment/web/pages/learning/parts/numerical.jsp =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/web/pages/learning/parts/numerical.jsp (.../numerical.jsp) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/web/pages/learning/parts/numerical.jsp (.../numerical.jsp) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -6,12 +6,36 @@ + + +
+ + + + + + + + + - disabled="disabled" />
+ + + + + + + +
+ +
+
+ <%@ include file="markandpenaltyarea.jsp"%> \ No newline at end of file Index: lams_tool_assessment/web/pages/learning/parts/ordering.jsp =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/web/pages/learning/parts/ordering.jsp (.../ordering.jsp) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/web/pages/learning/parts/ordering.jsp (.../ordering.jsp) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -12,27 +12,6 @@ - <%-- - - --%> -
- - - checked="checked" - disabled="disabled" - - /> - - - checked="checked" - disabled="disabled" - - /> - - - - @@ -64,7 +43,20 @@
+ + + +
+ + + + + + + + +
+
<%@ include file="markandpenaltyarea.jsp"%> \ No newline at end of file Index: lams_tool_assessment/web/pages/learning/parts/shortanswer.jsp =================================================================== diff -u -rffbd31e92ef761df70dfa660de414ba7b8b269ce -rb97c9857551b67fbe95d700328a8316c7ba42bf5 --- lams_tool_assessment/web/pages/learning/parts/shortanswer.jsp (.../shortanswer.jsp) (revision ffbd31e92ef761df70dfa660de414ba7b8b269ce) +++ lams_tool_assessment/web/pages/learning/parts/shortanswer.jsp (.../shortanswer.jsp) (revision b97c9857551b67fbe95d700328a8316c7ba42bf5) @@ -6,30 +6,36 @@ - - - - - - -
- - - - - - + + + + + + + + - disabled="disabled" /> - -
+ + + + + + + + +
+ +
+
+ <%@ include file="markandpenaltyarea.jsp"%> \ No newline at end of file