From 77b3628c26540b475cc906dba0cfde17f2b93d33 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Mon, 3 Aug 2020 15:25:44 +0200
Subject: [PATCH] OO-4825: update precisely the assessment ID of assessment
 entry

---
 .../olat/course/nodes/IQTESTCourseNode.java   | 26 ++++++++-----
 .../java/org/olat/ims/qti21/QTI21Service.java |  2 +-
 .../ims/qti21/manager/QTI21ServiceImpl.java   | 38 ++++++++++---------
 ...mentTestSessionInvalidationController.java | 16 ++++----
 ...mentTestSessionRevalidationController.java | 17 +++++----
 .../ui/QTI21AssessmentDetailsController.java  |  2 +-
 6 files changed, 56 insertions(+), 45 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 616e4144fdb..6a1d40f1589 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -834,16 +834,22 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe
 		updateUserScoreEvaluation(sceval, assessedUserCourseenv, coachingIdentity, true, by);
 	}
 	
-	public void promoteAssessmentTestSession(AssessmentTestSession testSession, UserCourseEnvironment assessedUserCourseEnv, Identity coachingIdentity, Role by) {
-		AssessmentTest assessmentTest = loadAssessmentTest(testSession.getTestEntry());
-		Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest);
-
-		BigDecimal finalScore = testSession.getFinalScore();
-		Float score = finalScore == null ? null : finalScore.floatValue();
-		Boolean passed = testSession.getPassed();
-		if(testSession.getManualScore() != null && finalScore != null && cutValue != null) {
-			boolean calculated = finalScore.compareTo(BigDecimal.valueOf(cutValue.doubleValue())) >= 0;
-			passed = Boolean.valueOf(calculated);
+	public void promoteAssessmentTestSession(AssessmentTestSession testSession, UserCourseEnvironment assessedUserCourseEnv,
+			boolean updateScoring, Identity coachingIdentity, Role by) {
+		
+		Float score = null;
+		Boolean passed = null;
+		if(updateScoring) {
+			AssessmentTest assessmentTest = loadAssessmentTest(testSession.getTestEntry());
+			Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest);
+	
+			BigDecimal finalScore = testSession.getFinalScore();
+			score = finalScore == null ? null : finalScore.floatValue();
+			passed = testSession.getPassed();
+			if(testSession.getManualScore() != null && finalScore != null && cutValue != null) {
+				boolean calculated = finalScore.compareTo(BigDecimal.valueOf(cutValue.doubleValue())) >= 0;
+				passed = Boolean.valueOf(calculated);
+			}
 		}
 		
 		ScoreEvaluation sceval = new ScoreEvaluation(score, passed, null, null, Boolean.TRUE,
diff --git a/src/main/java/org/olat/ims/qti21/QTI21Service.java b/src/main/java/org/olat/ims/qti21/QTI21Service.java
index e2d4d6b97d2..680befaf23b 100644
--- a/src/main/java/org/olat/ims/qti21/QTI21Service.java
+++ b/src/main/java/org/olat/ims/qti21/QTI21Service.java
@@ -444,7 +444,7 @@ public interface QTI21Service {
 	 * @param candidateSession The assessment test tession.
 	 * @return The updated assessment entry
 	 */
-	public AssessmentEntry updateAssessmentEntry(AssessmentTestSession candidateSession);
+	public AssessmentEntry updateAssessmentEntry(AssessmentTestSession candidateSession, boolean updateScoring);
 	
 	/**
 	 * Sign the assessment result. Be careful, the file must not be changed
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index d671087fe59..1e7995ec19d 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -1218,29 +1218,33 @@ public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, Initia
 	}
 	
 	@Override
-	public AssessmentEntry updateAssessmentEntry(AssessmentTestSession candidateSession) {
+	public AssessmentEntry updateAssessmentEntry(AssessmentTestSession candidateSession, boolean pushScoring) {
 		Identity assessedIdentity = candidateSession.getIdentity();
 		RepositoryEntry testEntry = candidateSession.getTestEntry();
-		
-		File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource());
-		ResolvedAssessmentTest resolvedAssessmentTest = loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
-		AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
-		
+
 		AssessmentEntry assessmentEntry = assessmentEntryDao.loadAssessmentEntry(assessedIdentity, testEntry, null, testEntry);
-		BigDecimal finalScore = candidateSession.getFinalScore();
-		assessmentEntry.setScore(finalScore);
 		assessmentEntry.setAssessmentId(candidateSession.getKey());
-
-		Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest);
 		
-		Boolean passed = assessmentEntry.getPassed();
-		if(candidateSession.getManualScore() != null && finalScore != null && cutValue != null) {
-			boolean calculated = finalScore.compareTo(BigDecimal.valueOf(cutValue.doubleValue())) >= 0;
-			passed = Boolean.valueOf(calculated);
-		} else if(candidateSession.getPassed() != null) {
-			passed = candidateSession.getPassed();
+		if(pushScoring) {
+			File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource());
+			ResolvedAssessmentTest resolvedAssessmentTest = loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
+			AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
+			
+			BigDecimal finalScore = candidateSession.getFinalScore();
+			assessmentEntry.setScore(finalScore);
+	
+			Double cutValue = QtiNodesExtractor.extractCutValue(assessmentTest);
+			
+			Boolean passed = assessmentEntry.getPassed();
+			if(candidateSession.getManualScore() != null && finalScore != null && cutValue != null) {
+				boolean calculated = finalScore.compareTo(BigDecimal.valueOf(cutValue.doubleValue())) >= 0;
+				passed = Boolean.valueOf(calculated);
+			} else if(candidateSession.getPassed() != null) {
+				passed = candidateSession.getPassed();
+			}
+			assessmentEntry.setPassed(passed);
 		}
-		assessmentEntry.setPassed(passed);
+		
 		assessmentEntry = assessmentEntryDao.updateAssessmentEntry(assessmentEntry);
 		return assessmentEntry;
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java
index 3df008b319e..a420ed10a5d 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java
@@ -156,14 +156,14 @@ public class ConfirmAssessmentTestSessionInvalidationController extends FormBasi
 		session.setCancelled(true);
 		session = qtiService.updateAssessmentTestSession(session);
 		dbInstance.commit();
-		if(updateEntryResults) {
-			AssessmentTestSession promotedSession = getNextLastSession();
-			if(promotedSession != null) {
-				if(courseNode == null) {
-					qtiService.updateAssessmentEntry(promotedSession);
-				} else {
-					courseNode.promoteAssessmentTestSession(promotedSession, assessedUserCourseEnv, getIdentity(), Role.coach);
-				}
+
+		AssessmentTestSession promotedSession = getNextLastSession();
+		// choose to update or not: assessment of the assessment entry, push the score to the assessment entry
+		if(promotedSession != null) {
+			if(courseNode == null) {
+				qtiService.updateAssessmentEntry(promotedSession, updateEntryResults);
+			} else {
+				courseNode.promoteAssessmentTestSession(promotedSession, assessedUserCourseEnv, updateEntryResults, getIdentity(), Role.coach);
 			}
 		}
 		fireEvent(ureq, Event.CHANGED_EVENT);
diff --git a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java
index 863b4a72bdb..fa2f35a2083 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java
@@ -75,7 +75,7 @@ public class ConfirmAssessmentTestSessionRevalidationController extends FormBasi
 		this.courseNode = courseNode;
 		this.assessedUserCourseEnv = assessedUserCourseEnv;
 		assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity();
-		canUpdateAssessmentEntry = canBeNextLastSession();
+		canUpdateAssessmentEntry = isNextLastSession(session);
 		initForm(ureq);
 	}
 	
@@ -85,7 +85,7 @@ public class ConfirmAssessmentTestSessionRevalidationController extends FormBasi
 		this.session = session;
 		this.testEntry = testEntry;
 		this.assessedIdentity = assessedIdentity;
-		canUpdateAssessmentEntry = canBeNextLastSession();
+		canUpdateAssessmentEntry = isNextLastSession(session);
 		initForm(ureq);
 	}
 
@@ -133,17 +133,18 @@ public class ConfirmAssessmentTestSessionRevalidationController extends FormBasi
 		session.setCancelled(false);
 		session = qtiService.updateAssessmentTestSession(session);
 		dbInstance.commit();
-		if(updateEntryResults) {
+
+		if(canUpdateAssessmentEntry) {
 			if(courseNode == null) {
-				qtiService.updateAssessmentEntry(session);
+				qtiService.updateAssessmentEntry(session, updateEntryResults);
 			} else {
-				courseNode.promoteAssessmentTestSession(session, assessedUserCourseEnv, getIdentity(), Role.coach);
+				courseNode.promoteAssessmentTestSession(session, assessedUserCourseEnv, updateEntryResults, getIdentity(), Role.coach);
 			}
 		}
 		fireEvent(ureq, Event.CHANGED_EVENT);
 	}
 	
-	private boolean canBeNextLastSession() {
+	private boolean isNextLastSession(AssessmentTestSession testSession) {
 		List<AssessmentTestSession> sessions;
 		if(courseNode == null) {
 			sessions = qtiService.getAssessmentTestSessions(testEntry, null, assessedIdentity, true);
@@ -155,8 +156,8 @@ public class ConfirmAssessmentTestSessionRevalidationController extends FormBasi
 			return true;
 		}
 		
-		sessions.add(session);
+		sessions.add(testSession);
 		Collections.sort(sessions, new AssessmentTestSessionComparator(false));
-		return session.equals(sessions.get(0));
+		return testSession.equals(sessions.get(0));
 	}
 }
diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
index 4027ebb0bab..517fef906a1 100644
--- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
@@ -477,7 +477,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
 	}
 	
 	private void doUpdateEntry(AssessmentTestSession session) {
-		qtiService.updateAssessmentEntry(session);
+		qtiService.updateAssessmentEntry(session, true);
 	}
 	
 	private void doResetData(UserRequest ureq) {
-- 
GitLab