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.