Index: lams_tool_assessment/conf/xdoclet/struts-actions.xml =================================================================== diff -u -r2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9 -r495a38a55b249f3b65031de0ac76ecbd9b86ce09 --- lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9) +++ lams_tool_assessment/conf/xdoclet/struts-actions.xml (.../struts-actions.xml) (revision 495a38a55b249f3b65031de0ac76ecbd9b86ce09) @@ -186,6 +186,7 @@ type="org.lamsfoundation.lams.tool.assessment.web.action.LearningAction" parameter="start" > + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9 -r495a38a55b249f3b65031de0ac76ecbd9b86ce09 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 495a38a55b249f3b65031de0ac76ecbd9b86ce09) @@ -413,11 +413,39 @@ float grade = 0; AssessmentResult result = assessmentResultDao.getLastAssessmentResult(assessmentUid, userId); + Assessment assessment = result.getAssessment(); //store all answers (in all pages) for (LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { + // 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(); + + 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; + } + } + float userQeustionGrade = storeUserAnswer(result, question, isAutosave); grade += userQeustionGrade; @@ -440,15 +468,21 @@ * @param isAutosave in case of autosave there is no need to calculate marks * @return grade that user scored by answering that question */ - private float storeUserAnswer(AssessmentResult assessmentAnswer, AssessmentQuestion question, boolean isAutosave) { + private float storeUserAnswer(AssessmentResult assessmentResult, AssessmentQuestion question, boolean isAutosave) { AssessmentQuestionResult questionAnswer = null; + // get questionResult from DB instance of AssessmentResult + for (AssessmentQuestionResult dbQuestionAnswer : assessmentResult.getQuestionResults()) { + if (question.equals(dbQuestionAnswer.getAssessmentQuestion())) { + questionAnswer = dbQuestionAnswer; + } + } - //create new questionAnswer if this is a new assessmentAnswer (i.e. doesn't have any answers yet) - if (assessmentAnswer.getQuestionResults().isEmpty()) { + //create new questionAnswer if it's nonexistent + if (questionAnswer == null) { questionAnswer = new AssessmentQuestionResult(); questionAnswer.setAssessmentQuestion(question); - questionAnswer.setAssessmentResult(assessmentAnswer); + questionAnswer.setAssessmentResult(assessmentResult); Set optionAnswers = questionAnswer.getOptionAnswers(); for (AssessmentQuestionOption option : question.getOptions()) { @@ -458,14 +492,6 @@ } assessmentQuestionResultDao.saveObject(questionAnswer); - - } else { - // get questionResult from DB instance of AssessmentResult - for (AssessmentQuestionResult dbQuestionAnswer : assessmentAnswer.getQuestionResults()) { - if (question.equals(dbQuestionAnswer.getAssessmentQuestion())) { - questionAnswer = dbQuestionAnswer; - } - } } //store question answer values @@ -597,8 +623,8 @@ // calculate penalty if (mark > 0) { // calculate number of wrong answers - Long assessmentUid = assessmentAnswer.getAssessment().getUid(); - Long userId = assessmentAnswer.getUser().getUserId(); + Long assessmentUid = assessmentResult.getAssessment().getUid(); + Long userId = assessmentResult.getUser().getUserId(); int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid, userId, question.getUid()); @@ -897,15 +923,15 @@ @Override public void changeQuestionResultMark(Long questionResultUid, float newMark) { - AssessmentQuestionResult questionResult = assessmentQuestionResultDao + AssessmentQuestionResult questionAnswer = assessmentQuestionResultDao .getAssessmentQuestionResultByUid(questionResultUid); - float oldMark = questionResult.getMark(); - AssessmentResult assessmentResult = questionResult.getAssessmentResult(); + float oldMark = questionAnswer.getMark(); + AssessmentResult assessmentResult = questionAnswer.getAssessmentResult(); float totalMark = assessmentResult.getGrade() - oldMark + newMark; - Long toolSessionId = questionResult.getAssessmentResult().getSessionId(); - Assessment assessment = questionResult.getAssessmentResult().getAssessment(); - Long questionUid = questionResult.getAssessmentQuestion().getUid(); + Long toolSessionId = assessmentResult.getSessionId(); + Assessment assessment = assessmentResult.getAssessment(); + Long questionUid = questionAnswer.getAssessmentQuestion().getUid(); // When changing a mark for user and isUseSelectLeaderToolOuput is true, the mark should be propagated to all // students within the group @@ -914,8 +940,8 @@ users = getUsersBySession(toolSessionId); } else { users = new ArrayList(); - AssessmentUser leader = questionResult.getUser(); - users.add(leader); + AssessmentUser user = assessmentResult.getUser(); + users.add(user); } for (AssessmentUser user : users) { @@ -948,10 +974,12 @@ } } - + @Override - public void recalculateUserAnswers(Assessment assessment, Set oldQuestions, Set newQuestions, - Set oldReferences, Set newReferences, List deletedReferences) { + public void recalculateUserAnswers(Assessment assessment, Set oldQuestions, + Set newQuestions, List deletedQuestions, + Set oldReferences, Set newReferences, + List deletedReferences) { //create list of modified questions List modifiedQuestions = new ArrayList(); @@ -1047,16 +1075,15 @@ while (iter.hasNext()) { AssessmentQuestionResult questionAnswer = iter.next(); AssessmentQuestion question = questionAnswer.getAssessmentQuestion(); + + boolean isRemoveQuestionResult = false; //[+] if the question reference was removed for (QuestionReference deletedReference : deletedReferences) { if (!deletedReference.isRandomQuestion() && question.getUid().equals(deletedReference.getQuestion().getUid())) { - assessmentMark -= questionAnswer.getMark(); + isRemoveQuestionResult = true; assessmentMaxMark -= deletedReference.getDefaultGrade(); - iter.remove(); - assessmentQuestionResultDao.removeObject(AssessmentQuestionResult.class, - questionAnswer.getUid()); break; } } @@ -1086,15 +1113,27 @@ //[+] if the question is modified for (AssessmentQuestion modifiedQuestion : modifiedQuestions) { if (question.getUid().equals(modifiedQuestion.getUid())) { - assessmentMark -= questionAnswer.getMark(); - iter.remove(); - assessmentQuestionResultDao.removeObject(AssessmentQuestionResult.class, - questionAnswer.getUid()); + isRemoveQuestionResult = true; break; } } - //[+] doing nothing if the question was removed - as it will be in the list of removed references + //[+] if the question was removed + for (AssessmentQuestion deletedQuestion : deletedQuestions) { + if (question.getUid().equals(deletedQuestion.getUid())) { + isRemoveQuestionResult = true; + break; + } + } + + if (isRemoveQuestionResult) { + + assessmentMark -= questionAnswer.getMark(); + iter.remove(); + assessmentQuestionResultDao.removeObject(AssessmentQuestionResult.class, + questionAnswer.getUid()); + } + //[+] doing nothing if the new question was added } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9 -r495a38a55b249f3b65031de0ac76ecbd9b86ce09 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 2a68a250e3ae88b708a9a2a91e9f3439a4b6d7a9) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 495a38a55b249f3b65031de0ac76ecbd9b86ce09) @@ -324,13 +324,15 @@ * @param assessment * @param oldQuestions * @param newQuestions + * @param deletedQuestions * @param oldReferences * @param newReferences * @param deletedReferences */ void recalculateUserAnswers(Assessment assessment, Set oldQuestions, - Set newQuestions, Set oldReferences, - Set newReferences, List deletedReferences); + Set newQuestions, List deletedQuestions, + Set oldReferences, Set newReferences, + List deletedReferences); /** * Recalculate mark for leader and sets it to all members of a group. Authentication check: user must be either lesson stuff or group manager. Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java =================================================================== diff -u -rdfa2d6ba82c3645e3430cfaf419a1c711b52647d -r495a38a55b249f3b65031de0ac76ecbd9b86ce09 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision dfa2d6ba82c3645e3430cfaf419a1c711b52647d) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java (.../AuthoringAction.java) (revision 495a38a55b249f3b65031de0ac76ecbd9b86ce09) @@ -359,7 +359,6 @@ // new Assessment, create it. assessmentPO = assessment; assessmentPO.setCreated(new Timestamp(new Date().getTime())); - assessmentPO.setUpdated(new Timestamp(new Date().getTime())); } else { Long uid = assessmentPO.getUid(); @@ -370,9 +369,9 @@ // if it is Teacher (from monitor) - change define later status if (mode.isTeacher()) { assessmentPO.setDefineLater(false); + assessmentPO.setUpdated(new Timestamp(new Date().getTime())); } - assessmentPO.setUpdated(new Timestamp(new Date().getTime())); } // *******************************Handle user******************* @@ -404,8 +403,8 @@ List deletedReferences = getDeletedQuestionReferences(sessionMap); //recalculate results in case content is edited from monitoring if (mode.isTeacher()) { - service.recalculateUserAnswers(assessmentPO, oldQuestions, newQuestions, oldReferences, newReferences, - deletedReferences); + service.recalculateUserAnswers(assessmentPO, oldQuestions, newQuestions, deletedQuestions, oldReferences, + newReferences, deletedReferences); } // delete References from database.