Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rc256e3cac813165fce907739b410145e2e809908 -r5fff5c4348abd6cabbe10da89c813e16edec214f --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision c256e3cac813165fce907739b410145e2e809908) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 5fff5c4348abd6cabbe10da89c813e16edec214f) @@ -422,8 +422,9 @@ } @Override - public void setAttemptStarted(Assessment assessment, List> pagedQuestions, - AssessmentUser assessmentUser, Long toolSessionId) { + public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { + Set questions = assessment.getQuestions(); + AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); if (lastResult != null) { @@ -434,21 +435,19 @@ Set questionResults = lastResult.getQuestionResults(); Set updatedQuestionResults = new TreeSet( new AssessmentQuestionResultComparator()); - for (Set questionsForOnePage : pagedQuestions) { - for (AssessmentQuestion question : questionsForOnePage) { + for (AssessmentQuestion question : questions) { - // get questionResult from DB instance of AssessmentResult - AssessmentQuestionResult questionResult = null; - for (AssessmentQuestionResult questionResultIter : questionResults) { - if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { - questionResult = questionResultIter; - } + // get questionResult from DB instance of AssessmentResult + AssessmentQuestionResult questionResult = null; + for (AssessmentQuestionResult questionResultIter : questionResults) { + if (question.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + questionResult = questionResultIter; } - if (questionResult == null) { - questionResult = createQuestionResultObject(question); - } - updatedQuestionResults.add(questionResult); } + if (questionResult == null) { + questionResult = createQuestionResultObject(question); + } + updatedQuestionResults.add(questionResult); } lastResult.setQuestionResults(updatedQuestionResults); assessmentResultDao.saveObject(lastResult); @@ -470,11 +469,9 @@ // create questionResult for each question Set questionResults = result.getQuestionResults(); - for (Set questionsForOnePage : pagedQuestions) { - for (AssessmentQuestion question : questionsForOnePage) { - AssessmentQuestionResult questionResult = createQuestionResultObject(question); - questionResults.add(questionResult); - } + for (AssessmentQuestion question : questions) { + AssessmentQuestionResult questionResult = createQuestionResultObject(question); + questionResults.add(questionResult); } assessmentResultDao.insert(result); @@ -506,63 +503,59 @@ } @Override - public boolean storeUserAnswers(Long assessmentUid, Long userId, List> pagedQuestions, - Long singleMarkHedgingQuestionUid, boolean isAutosave) { + public boolean storeUserAnswers(Assessment assessment, Long userId, Long singleMarkHedgingQuestionUid, + boolean isAutosave) { int maximumGrade = 0; float grade = 0; - AssessmentResult result = assessmentResultDao.getLastAssessmentResult(assessmentUid, userId); - Assessment assessment = result.getAssessment(); + Set questions = assessment.getQuestions(); + AssessmentResult result = assessmentResultDao.getLastAssessmentResult(assessment.getUid(), userId); // prohibit users from submitting (or autosubmitting) answers after result is finished but Resubmit button is // not pressed (e.g. using 2 browsers) if (result.getFinishDate() != null) { return false; } - // store all answers (in all pages) - for (Set questionsForOnePage : pagedQuestions) { - for (AssessmentQuestion question : questionsForOnePage) { + // store all answers + for (AssessmentQuestion question : questions) { - // in case single MarkHedging question needs to be stored -- search for that question - if ((singleMarkHedgingQuestionUid != null) && !question.getUid().equals(singleMarkHedgingQuestionUid)) { - continue; - } + // in case single MarkHedging question needs to be stored -- search for that question + if ((singleMarkHedgingQuestionUid != null) && !question.getUid().equals(singleMarkHedgingQuestionUid)) { + continue; + } - // In case if assessment was updated after result has been started check question still exists in DB as - // it could be deleted if modified in monitor. - if ((assessment.getUpdated() != null) && assessment.getUpdated().after(result.getStartDate())) { + // In case if assessment was updated after result has been started check question still exists in DB as + // it could be deleted if modified in monitor. + if ((assessment.getUpdated() != null) && assessment.getUpdated().after(result.getStartDate())) { - Set references = assessment.getQuestionReferences(); - Set questions = assessment.getQuestions(); + Set references = assessment.getQuestionReferences(); - boolean isQuestionExists = false; - for (QuestionReference reference : references) { - if (!reference.isRandomQuestion() - && reference.getQuestion().getUid().equals(question.getUid())) { - isQuestionExists = true; - break; - } - if (reference.isRandomQuestion()) { - for (AssessmentQuestion questionDb : questions) { - if (questionDb.getUid().equals(question.getUid())) { - isQuestionExists = true; - break; - } + boolean isQuestionExists = false; + for (QuestionReference reference : references) { + if (!reference.isRandomQuestion() && reference.getQuestion().getUid().equals(question.getUid())) { + isQuestionExists = true; + break; + } + if (reference.isRandomQuestion()) { + for (AssessmentQuestion questionDb : questions) { + if (questionDb.getUid().equals(question.getUid())) { + isQuestionExists = true; + break; } } } - if (!isQuestionExists) { - continue; - } } + if (!isQuestionExists) { + continue; + } + } - float userQeustionGrade = storeUserAnswer(result, question, isAutosave); - grade += userQeustionGrade; + float userQeustionGrade = storeUserAnswer(result, question, isAutosave); + grade += userQeustionGrade; - maximumGrade += question.getGrade(); - } + maximumGrade += question.getGrade(); } // store grades and finished date only on user hitting submit all answers button (and not submit mark hedging @@ -594,6 +587,13 @@ questionResult = questionResultIter; } } + + if (assessmentResult.getFinishDate() == null && questionResult == null) { + //it should get here only in case teacher edited content in monitor which led to removal of autosave questionResult + questionResult = createQuestionResultObject(question); + questionResult.setAssessmentResult(assessmentResult); + assessmentQuestionResultDao.insert(questionResult); + } // store question answer values questionResult.setAnswerBoolean(question.getAnswerBoolean()); @@ -1689,6 +1689,9 @@ } } } + if (oldOptions.size() != newOptions.size()) { + isQuestionModified = true; + } if (isQuestionModified) { modifiedQuestions.add(newQuestion); @@ -1736,8 +1739,14 @@ // get all finished user results List assessmentResults = assessmentResultDao.getAssessmentResults(assessment.getUid(), user.getUserId()); - AssessmentResult lastAssessmentResult = (assessmentResults.isEmpty()) ? null + AssessmentResult lastFinishedAssessmentResult = (assessmentResults.isEmpty()) ? null : assessmentResults.get(assessmentResults.size() - 1); + + //add autosave assessmentResult as well + AssessmentResult lastAssessmentResult = getLastAssessmentResult(assessment.getUid(), user.getUserId()); + if (lastAssessmentResult != null && lastAssessmentResult.getFinishDate() == null) { + assessmentResults.add(lastAssessmentResult); + } for (AssessmentResult assessmentResult : assessmentResults) { @@ -1897,8 +1906,8 @@ assessmentResult.setMaximumGrade(assessmentMaxMark); assessmentResultDao.saveObject(assessmentResult); - // if this is the last assessment result - propagade total mark to Gradebook - if (lastAssessmentResult.getUid().equals(assessmentResult.getUid())) { + // if this is the last finished assessment result - propagade total mark to Gradebook + if (lastFinishedAssessmentResult.getUid().equals(assessmentResult.getUid())) { gradebookService.updateActivityMark(new Double(assessmentMark), null, user.getUserId().intValue(), toolSessionId, false); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r7eef220bc1575595385b722a0c337359ca02a397 -r5fff5c4348abd6cabbe10da89c813e16edec214f --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 7eef220bc1575595385b722a0c337359ca02a397) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 5fff5c4348abd6cabbe10da89c813e16edec214f) @@ -207,24 +207,21 @@ * * @param assessmentResult */ - void setAttemptStarted(Assessment assessment, List> pagedQuestions, - AssessmentUser assessmentUser, Long toolSessionId); + void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId); /** * Store user answers into DB. It can be autosave and non-autosave requests. * - * @param assessmentUid + * @param assessment * @param userId - * @param pagedQuestions * @param singleMarkHedgingQuestionUid * - if provided - means only that current single MarkHedging question needs to be stored * @param isAutosave * indicates whether it's autosave request * * @return whether storing results is allowed, false otherwise */ - boolean storeUserAnswers(Long assessmentUid, Long userId, List> pagedQuestions, - Long singleMarkHedgingQuestionUid, boolean isAutosave); + boolean storeUserAnswers(Assessment assessment, Long userId, Long singleMarkHedgingQuestionUid, boolean isAutosave); /** * Return the latest result (it can be unfinished). Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== diff -u -rc256e3cac813165fce907739b410145e2e809908 -r5fff5c4348abd6cabbe10da89c813e16edec214f --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision c256e3cac813165fce907739b410145e2e809908) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java (.../LearningAction.java) (revision 5fff5c4348abd6cabbe10da89c813e16edec214f) @@ -383,7 +383,7 @@ //set attempt started if (!finishedLock && hasEditRight) { - service.setAttemptStarted(assessment, pagedQuestions, user, toolSessionId); + service.setAttemptStarted(assessment, user, toolSessionId); } // loadupLastAttempt for display purpose @@ -471,22 +471,20 @@ */ private ActionForward submitSingleMarkHedgingQuestion(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { + IAssessmentService service = getAssessmentService(); String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); - List> pagedQuestions = (List>) sessionMap - .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); - IAssessmentService service = getAssessmentService(); + Long toolSessionId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_SESSION_ID); + Assessment assessment = service.getAssessmentBySessionId(toolSessionId); //get user answers from request and store them into sessionMap storeUserAnswersIntoSessionMap(request); // store results from sessionMap into DB Long singleMarkHedgingQuestionUid = WebUtil.readLongParam(request, "singleMarkHedgingQuestionUid"); - boolean isResultsStored = service.storeUserAnswers(assessment.getUid(), userId, pagedQuestions, - singleMarkHedgingQuestionUid, false); + boolean isResultsStored = service.storeUserAnswers(assessment, userId, singleMarkHedgingQuestionUid, false); // result was not stored in case user was prohibited from submitting (or autosubmitting) answers (e.g. when // using 2 browsers). Then show last stored results if (!isResultsStored) { @@ -495,12 +493,10 @@ //find according question in order to get its mark AssessmentQuestion question = null; - for (Set questionsForOnePage : pagedQuestions) { - for (AssessmentQuestion questionIter : questionsForOnePage) { - if (questionIter.getUid().equals(singleMarkHedgingQuestionUid)) { - question = questionIter; - question.setResponseSubmitted(true); - } + for (AssessmentQuestion questionIter : (Set) assessment.getQuestions()) { + if (questionIter.getUid().equals(singleMarkHedgingQuestionUid)) { + question = questionIter; + question.setResponseSubmitted(true); } } @@ -583,15 +579,13 @@ String sessionMapID = WebUtil.readStrParam(request, AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(sessionMapID); - Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); Long toolSessionId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_SESSION_ID); + Assessment assessment = service.getAssessmentBySessionId(toolSessionId); AssessmentUser assessmentUser = (AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER); service.unsetSessionFinished(toolSessionId, assessmentUser.getUserId()); //set attempt started: create a new one + mark previous as not being the latest any longer - List> pagedQuestions = (List>) sessionMap - .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); - service.setAttemptStarted(assessment, pagedQuestions, assessmentUser, toolSessionId); + service.setAttemptStarted(assessment, assessmentUser, toolSessionId); sessionMap.put(AssessmentConstants.ATTR_FINISHED_LOCK, false); sessionMap.put(AssessmentConstants.ATTR_PAGE_NUMBER, 1); @@ -603,7 +597,28 @@ //time limit feature sessionMap.put(AssessmentConstants.ATTR_IS_TIME_LIMIT_NOT_LAUNCHED, true); request.setAttribute(AssessmentConstants.ATTR_SECONDS_LEFT, assessment.getTimeLimit() * 60); + + //update all questions with DB data in case assessment was edited in monitor + List> pagedQuestions = (List>) sessionMap + .get(AssessmentConstants.ATTR_PAGED_QUESTIONS); + List dbQuestions = service.getAuthoredQuestions(assessment.getUid()); + List> newPagedQuestions = new ArrayList>(); + for (Set questionsForOnePage : pagedQuestions) { + LinkedHashSet newQuestionsForOnePage = new LinkedHashSet(); + + for (AssessmentQuestion question : questionsForOnePage) { + for (AssessmentQuestion dbQuestion : dbQuestions) { + if (dbQuestion.getUid().equals(question.getUid())) { + newQuestionsForOnePage.add(dbQuestion); + break; + } + } + } + newPagedQuestions.add(newQuestionsForOnePage); + } + sessionMap.put(AssessmentConstants.ATTR_PAGED_QUESTIONS, newPagedQuestions); + return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -1161,21 +1176,17 @@ * Store user answers in DB in last unfinished attempt and notify teachers about it. */ private boolean storeUserAnswersIntoDatabase(SessionMap sessionMap, boolean isAutosave) { - - List> pagedQuestions = (List>) 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(); - boolean isResultsStored = service.storeUserAnswers(assessmentUid, userId, pagedQuestions, null, isAutosave); + Long toolSessionId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_SESSION_ID); + Long userId = ((AssessmentUser) sessionMap.get(AssessmentConstants.ATTR_USER)).getUserId(); + ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); + Assessment assessment = service.getAssessmentBySessionId(toolSessionId); + + boolean isResultsStored = service.storeUserAnswers(assessment, userId, null, isAutosave); // notify teachers - ToolAccessMode mode = (ToolAccessMode) sessionMap.get(AttributeNames.ATTR_MODE); - Assessment assessment = (Assessment) sessionMap.get(AssessmentConstants.ATTR_ASSESSMENT); if ((mode != null) && !mode.isTeacher() && !isAutosave && isResultsStored && assessment.isNotifyTeachersOnAttemptCompletion()) { - - Long toolSessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); AssessmentUser assessmentUser = getCurrentUser(toolSessionId); String fullName = assessmentUser.getLastName() + " " + assessmentUser.getFirstName(); service.notifyTeachersOnAttemptCompletion(toolSessionId, fullName); Index: lams_tool_assessment/web/pages/authoring/advance.jsp =================================================================== diff -u -r43109c0633b7699925623470abcf46421b624ff0 -r5fff5c4348abd6cabbe10da89c813e16edec214f --- lams_tool_assessment/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 43109c0633b7699925623470abcf46421b624ff0) +++ lams_tool_assessment/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 5fff5c4348abd6cabbe10da89c813e16edec214f) @@ -92,8 +92,9 @@
-