From 9e31b8f54ea24b0a2c113df118bc8d7b411e72ff Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Mon, 3 Aug 2020 18:21:42 +0200
Subject: [PATCH] OO-4825: overwrite assessment date if needed

---
 .../olat/course/nodes/IQTESTCourseNode.java   |  2 +-
 .../iq/QTI21AssessmentRunController.java      |  2 +-
 ...mentTestSessionInvalidationController.java |  3 +--
 ...mentTestSessionRevalidationController.java |  4 ++--
 .../ui/QTI21AssessmentDetailsController.java  |  2 +-
 .../olat/modules/grading/GradingService.java  |  4 ++--
 .../grading/manager/GradingServiceImpl.java   | 24 ++++++++++++-------
 .../ConfirmReopenAssignmentController.java    |  2 +-
 .../grading/manager/GradingServiceTest.java   | 24 +++++++++----------
 9 files changed, 37 insertions(+), 30 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
index 3e84ac85927..f5fe972cbf7 100644
--- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java
@@ -609,7 +609,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements QT
 		if(IQEditController.CORRECTION_GRADING.equals(correctionMode)) {
 			AssessmentEntry assessmentEntry = courseAssessmentService.getAssessmentEntry(this, assessedUserCourseEnv);
 			RepositoryEntry testEntry = IQEditController.getIQReference(getModuleConfiguration(), false);
-			CoreSpringFactory.getImpl(GradingService.class).assignGrader(testEntry, assessmentEntry, true);
+			CoreSpringFactory.getImpl(GradingService.class).assignGrader(testEntry, assessmentEntry, session.getFinishTime(), true);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index 545c138e664..30cd64ebe7d 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -1054,7 +1054,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 			
 			if(IQEditController.CORRECTION_GRADING.equals(correctionMode)) {
 				AssessmentEntry assessmentEntry = courseAssessmentService.getAssessmentEntry(courseNode, userCourseEnv);
-				gradingService.assignGrader(testEntry, assessmentEntry, true);
+				gradingService.assignGrader(testEntry, assessmentEntry, new Date(), true);
 			}
 
 			assessmentNotificationsHandler.markPublisherNews(getIdentity(), userCourseEnv.getCourseEnvironment().getCourseResourceableId());
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 5c5e9474a29..c1f58294736 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionInvalidationController.java
@@ -201,7 +201,6 @@ public class ConfirmAssessmentTestSessionInvalidationController extends FormBasi
 				qtiService.updateAssessmentEntry(promotedSession, updateEntryResults);
 			} else {
 				courseNode.promoteAssessmentTestSession(promotedSession, assessedUserCourseEnv, updateEntryResults, getIdentity(), Role.coach);
-
 			}
 		}
 		
@@ -211,7 +210,7 @@ public class ConfirmAssessmentTestSessionInvalidationController extends FormBasi
 					|| assignmentStatus == GradingAssignmentStatus.inProcess
 					|| assignmentStatus == GradingAssignmentStatus.done) {
 				if(promotedSession != null) {
-					gradingService.reopenAssignment(runningAssignment);
+					gradingService.reopenAssignment(runningAssignment, promotedSession.getFinishTime());
 				} else {
 					gradingService.deactivateAssignment(runningAssignment);
 				}
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 66c26f88e3b..b70af02e289 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ConfirmAssessmentTestSessionRevalidationController.java
@@ -183,14 +183,14 @@ public class ConfirmAssessmentTestSessionRevalidationController extends FormBasi
 				if(assignmentStatus == GradingAssignmentStatus.assigned
 						|| assignmentStatus == GradingAssignmentStatus.inProcess
 						|| assignmentStatus == GradingAssignmentStatus.done) {
-					gradingService.reopenAssignment(runningAssignment);
+					gradingService.reopenAssignment(runningAssignment, session.getFinishTime());
 				} else if(assignmentStatus == GradingAssignmentStatus.deactivated
 						|| assignmentStatus == GradingAssignmentStatus.unassigned) {
 					dbInstance.commit();// if the assessment was updated before
 					AssessmentEntry assessmentEntry = gradingService
 							.loadFullAssessmentEntry(runningAssignment.getAssessmentEntry());
 					RepositoryEntry referenceEntry = session.getTestEntry();
-					gradingService.assignGrader(referenceEntry, assessmentEntry, true);
+					gradingService.assignGrader(referenceEntry, assessmentEntry, session.getFinishTime(), true);
 				}
 			}
 		}
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 4bc1d1ca486..bfe631325f1 100644
--- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java
@@ -567,7 +567,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
 	private void doPullSession(UserRequest ureq, AssessmentTestSession session) {
 		//reload it to prevent lazy loading issues
 		session = qtiService.getAssessmentTestSession(session.getKey());
-		qtiService.pullSession(session, getSignatureOptions(session), getIdentity());
+		session = qtiService.pullSession(session, getSignatureOptions(session), getIdentity());
 		if(courseNode != null) {
 			courseNode.pullAssessmentTestSession(session, assessedUserCourseEnv, getIdentity(), Role.coach);
 		}
diff --git a/src/main/java/org/olat/modules/grading/GradingService.java b/src/main/java/org/olat/modules/grading/GradingService.java
index 2745f3d5392..dba6bcb7bcc 100644
--- a/src/main/java/org/olat/modules/grading/GradingService.java
+++ b/src/main/java/org/olat/modules/grading/GradingService.java
@@ -149,7 +149,7 @@ public interface GradingService {
 	
 	public List<GradingAssignmentWithInfos> getGradingAssignmentsWithInfos(GradingAssignmentSearchParameters searchParams);
 	
-	public void assignGrader(RepositoryEntry referenceEntry, AssessmentEntry assessmentEntry, boolean updateAssessmentDate);
+	public GradingAssignment assignGrader(RepositoryEntry referenceEntry, AssessmentEntry assessmentEntry, Date AssessmentDate, boolean updateAssessmentDate);
 	
 
 	public GradingAssignment extendAssignmentDeadline(GradingAssignment assignment, Date newDeadline);
@@ -169,7 +169,7 @@ public interface GradingService {
 	 */
 	public GradingAssignment assignmentDone(GradingAssignment assignment, Long metadatatime, Boolean visibleToUser);
 	
-	public GradingAssignment reopenAssignment(GradingAssignment assignment);
+	public GradingAssignment reopenAssignment(GradingAssignment assignment, Date assessmentDate);
 	
 
 	public void updateDeadline(RepositoryEntry referenceEntry, RepositoryEntryGradingConfiguration configuration);
diff --git a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
index 818da3c2b0a..eea7d33bb3d 100644
--- a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
+++ b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
@@ -771,14 +771,18 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 	}
 
 	@Override
-	public void assignGrader(RepositoryEntry referenceEntry, AssessmentEntry assessmentEntry, boolean updateAssessmentDate) {	
+	public GradingAssignment assignGrader(RepositoryEntry referenceEntry, AssessmentEntry assessmentEntry, Date assessmentDate, boolean updateAssessmentDate) {	
+		if(assessmentDate == null) {
+			assessmentDate = new Date();
+		}
+		
 		GradingAssignment assignment = gradingAssignmentDao.getGradingAssignment(referenceEntry, assessmentEntry);
 		if(assignment != null && assignment.getGrader() != null) {
 			if(updateAssessmentDate) {
-				assignment.setAssessmentDate(new Date());
-				gradingAssignmentDao.updateAssignment(assignment);
+				assignment.setAssessmentDate(assessmentDate);
+				assignment = gradingAssignmentDao.updateAssignment(assignment);
 			}
-			return;
+			return assignment;
 		}
 		
 		GraderToIdentity choosedGrader = selectGrader(referenceEntry);
@@ -793,13 +797,13 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 		if(assignment == null) {
 			assignment = gradingAssignmentDao.createGradingAssignment(choosedGrader, referenceEntry, assessmentEntry, new Date(), deadLine);
 		} else {
-			assignment.setAssessmentDate(new Date());
+			assignment.setAssessmentDate(assessmentDate);
 			assignment.setDeadline(deadLine);
 			if(choosedGrader == null) {
 				assignment.setAssignmentStatus(GradingAssignmentStatus.unassigned);
 			} else {
 				assignment.setAssignmentStatus(GradingAssignmentStatus.assigned);
-				assignment.setAssignmentDate(new Date());
+				assignment.setAssignmentDate(assessmentDate);
 				assignment.setGrader(choosedGrader);
 			}
 			assignment = gradingAssignmentDao.updateAssignment(assignment);
@@ -811,9 +815,10 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 				sendGraderAsssignmentNotification(choosedGrader, referenceEntry, assignment, config);
 			}
 			assignment.setAssignmentNotificationDate(new Date());
-			gradingAssignmentDao.updateAssignment(assignment);
+			assignment = gradingAssignmentDao.updateAssignment(assignment);
 			dbInstance.commit();
 		}
+		return assignment;
 	}
 	
 	protected GraderToIdentity selectGrader(RepositoryEntry referenceEntry) {
@@ -1005,9 +1010,12 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re
 	}
 	
 	@Override
-	public GradingAssignment reopenAssignment(GradingAssignment assignment) {
+	public GradingAssignment reopenAssignment(GradingAssignment assignment, Date assessmentDate) {
 		assignment = gradingAssignmentDao.loadByKey(assignment.getKey());
 		assignment.setAssignmentStatus(GradingAssignmentStatus.assigned);
+		if(assessmentDate != null) {
+			assignment.setAssessmentDate(assessmentDate);
+		}
 		assignment.setClosingDate(null);
 		assignment = gradingAssignmentDao.updateAssignment(assignment);
 		log.info(Tracing.M_AUDIT, "Assignment reopened {}", assignment.getKey());
diff --git a/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmReopenAssignmentController.java b/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmReopenAssignmentController.java
index 5f0637f8251..9f4cb4c4eaf 100644
--- a/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmReopenAssignmentController.java
+++ b/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmReopenAssignmentController.java
@@ -81,7 +81,7 @@ public class ConfirmReopenAssignmentController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		gradingService.reopenAssignment(assignment);
+		gradingService.reopenAssignment(assignment, null);
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 
diff --git a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
index 902da445aa5..2353cea886d 100644
--- a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
+++ b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java
@@ -188,7 +188,7 @@ public class GradingServiceTest extends OlatTestCase {
 		
 		//first assignment
 		for(int i=0; i<numOfAssessmentEntries; i++) {
-			gradingService.assignGrader(entry, assessmentEntries.get(i), true);
+			gradingService.assignGrader(entry, assessmentEntries.get(i), new Date(), true);
 		}
 		
 		List<GradingAssignment> assignmentsGrader1 = gradingAssignmentDao.getGradingAssignments(graderRelation1);
@@ -231,7 +231,7 @@ public class GradingServiceTest extends OlatTestCase {
 		
 		//first assignment
 		for(int i=0; i<numOfAssessmentEntries; i++) {
-			gradingService.assignGrader(entry, assessmentEntries.get(i), true);
+			gradingService.assignGrader(entry, assessmentEntries.get(i), new Date(), true);
 		}
 		
 		List<GradingAssignment> assignmentsGrader1 = gradingAssignmentDao.getGradingAssignments(graderRelation1);
@@ -272,7 +272,7 @@ public class GradingServiceTest extends OlatTestCase {
 		
 		//first assignment
 		for(int i=0; i<numOfAssessmentEntries; i++) {
-			gradingService.assignGrader(entry, assessmentEntries.get(i), true);
+			gradingService.assignGrader(entry, assessmentEntries.get(i), new Date(), true);
 		}
 		
 		List<GradingAssignment> assignmentsGrader1 = gradingAssignmentDao.getGradingAssignments(graderRelation1);
@@ -302,7 +302,7 @@ public class GradingServiceTest extends OlatTestCase {
 		absenceLeaveDao.createAbsenceLeave(grader, addDaysToNow(-12), addDaysToNow(-1), entry.getOlatResource(), null);
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, null, true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -325,7 +325,7 @@ public class GradingServiceTest extends OlatTestCase {
 				OresHelper.createOLATResourceableInstance("Holydays", 28l), null);
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, null, true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -348,7 +348,7 @@ public class GradingServiceTest extends OlatTestCase {
 				entry.getOlatResource(), "1200013");
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, new Date(), true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -371,7 +371,7 @@ public class GradingServiceTest extends OlatTestCase {
 				entry.getOlatResource(), null);
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, new Date(), true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -402,7 +402,7 @@ public class GradingServiceTest extends OlatTestCase {
 				entry.getOlatResource(), null);
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, new Date(), true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -430,7 +430,7 @@ public class GradingServiceTest extends OlatTestCase {
 				entry.getOlatResource(), "1200012");
 		dbInstance.commitAndCloseSession();
 
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, new Date(), true);
 		dbInstance.commitAndCloseSession();
 		
 		List<GradingAssignment> assignmentsGrader = gradingAssignmentDao.getGradingAssignments(graderRelation);
@@ -743,7 +743,7 @@ public class GradingServiceTest extends OlatTestCase {
 		Assert.assertNotNull(graderRelation2);
 		
 		for(AssessmentEntry assessmentEntry:assessmentEntries) {
-			gradingService.assignGrader(entry, assessmentEntry, true);
+			gradingService.assignGrader(entry, assessmentEntry, new Date(), true);
 		}
 		dbInstance.commit();
 
@@ -780,7 +780,7 @@ public class GradingServiceTest extends OlatTestCase {
 		Assert.assertNotNull(graderRelation1);
 		
 		for(AssessmentEntry assessmentEntry:assessmentEntries) {
-			gradingService.assignGrader(entry, assessmentEntry, true);
+			gradingService.assignGrader(entry, assessmentEntry, new Date(), true);
 		}
 		dbInstance.commit();
 
@@ -807,7 +807,7 @@ public class GradingServiceTest extends OlatTestCase {
 		GraderToIdentity graderRelation = gradedToIdentityDao.createRelation(entry, grader);
 		dbInstance.commit();
 		
-		gradingService.assignGrader(entry, assessment, true);
+		gradingService.assignGrader(entry, assessment, new Date(), true);
 		dbInstance.commit();
 		
 		// check assignments
-- 
GitLab