From d80cd21776635e37966c2d533594a7b5498126f2 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 12 Jun 2020 15:52:38 +0200
Subject: [PATCH] OO-4744: remove default passed value if no cut value

Remove the default passed value (false) if the cut value is not choosed
as mode to calculate passed / failed. Finer default correction mode in
course element after chossing a test (grader if grading enabled, manual
if test has manual by coach defined...)
---
 .../nodes/iq/IQConfigurationController.java   | 34 +++++++++++++++++--
 .../model/xml/AssessmentTestBuilder.java      |  9 +++--
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
index abf686f94a5..269df3f270e 100644
--- a/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
+++ b/src/main/java/org/olat/course/nodes/iq/IQConfigurationController.java
@@ -55,6 +55,7 @@ import org.olat.course.nodes.CourseNodeFactory;
 import org.olat.course.nodes.IQSELFCourseNode;
 import org.olat.course.nodes.IQSURVCourseNode;
 import org.olat.course.nodes.QTICourseNode;
+import org.olat.fileresource.FileResourceManager;
 import org.olat.fileresource.types.ImsQTI21Resource;
 import org.olat.ims.qti.QTIModule;
 import org.olat.ims.qti.QTIResult;
@@ -69,11 +70,14 @@ import org.olat.ims.qti.process.AssessmentInstance;
 import org.olat.ims.qti21.AssessmentTestSession;
 import org.olat.ims.qti21.QTI21DeliveryOptions;
 import org.olat.ims.qti21.QTI21Service;
+import org.olat.ims.qti21.QTI21DeliveryOptions.PassedType;
 import org.olat.ims.qti21.model.InMemoryOutcomeListener;
+import org.olat.ims.qti21.model.xml.AssessmentTestBuilder;
 import org.olat.ims.qti21.ui.AssessmentTestDisplayController;
 import org.olat.ims.qti21.ui.QTI21OverrideOptions;
 import org.olat.ims.qti21.ui.event.RestartEvent;
 import org.olat.modules.ModuleConfiguration;
+import org.olat.modules.grading.GradingService;
 import org.olat.modules.iq.IQManager;
 import org.olat.modules.iq.IQPreviewSecurityCallback;
 import org.olat.repository.RepositoryEntry;
@@ -83,6 +87,9 @@ import org.olat.repository.controllers.ReferencableEntriesSearchController;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest;
+import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest;
+
 /**
  * 
  * Initial date: 26.06.2015<br>
@@ -128,6 +135,8 @@ public class IQConfigurationController extends BasicController {
 	@Autowired
 	private QTI21Service qti21service;
 	@Autowired
+	private GradingService gradingService;
+	@Autowired
 	private RepositoryManager repositoryManager;
 	@Autowired
 	private RepositoryService repositoryService;
@@ -215,11 +224,17 @@ public class IQConfigurationController extends BasicController {
 				logError("Test cannot be read: " + re, e);
 				showError("error.resource.corrupted");
 			}
+			QTI21DeliveryOptions deliveryOptions = qti21service.getDeliveryOptions(re);
 			if(replacedTest) {// set some default settings in case the user don't save the next panel
-				moduleConfiguration.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, needManualCorrection ? "manual" : "auto");
+				if(gradingService.isGradingEnabled(re, null)) {
+					moduleConfiguration.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, IQEditController.CORRECTION_GRADING);
+				} else if(needManualCorrection || getPassedType(re, deliveryOptions) == PassedType.manually) {
+					moduleConfiguration.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, IQEditController.CORRECTION_MANUAL);
+				} else {
+					moduleConfiguration.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, IQEditController.CORRECTION_AUTO);
+				}
 				fireEvent(ureq, NodeEditController.NODECONFIG_CHANGED_EVENT);
 			}
-			QTI21DeliveryOptions deliveryOptions =  qti21service.getDeliveryOptions(re);
 			mod21ConfigForm = new QTI21EditForm(ureq, getWindowControl(), moduleConfiguration,
 					NodeAccessType.of(course), deliveryOptions, needManualCorrection);
 			mod21ConfigForm.update(re);
@@ -573,6 +588,21 @@ public class IQConfigurationController extends BasicController {
 		return qti21service.needManualCorrection(re);
 	}
 	
+	private PassedType getPassedType(RepositoryEntry re, QTI21DeliveryOptions deliveryOptions) {
+		if(deliveryOptions == null) return PassedType.none;
+	
+		FileResourceManager frm = FileResourceManager.getInstance();
+		File unzippedDirRoot = frm.unzipFileResource(re.getOlatResource());
+		ResolvedAssessmentTest resolvedAssessmentTest = qti21service.loadAndResolveAssessmentTest(unzippedDirRoot, false, false);
+		AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
+		
+		Double cutValue = null;
+		if(assessmentTest != null) {
+			cutValue = new AssessmentTestBuilder(assessmentTest).getCutValue();
+		}
+		return deliveryOptions.getPassedType(cutValue);
+	}
+	
 	private boolean needManualCorrectionQTI12(RepositoryEntry re) {
 		boolean needManualCorrection = false;
 		QTIDocument doc = TestFileResource.getQTIDocument(re.getOlatResource());
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java
index f608abfeab1..3fcbdfb2802 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/AssessmentTestBuilder.java
@@ -59,7 +59,8 @@ public class AssessmentTestBuilder {
 	private Double maxScore;
 	private Long maximumTimeLimits;
 	private OutcomeRule testScoreRule;
-	private OutcomeCondition cutValueRule, minScoreRule;
+	private OutcomeCondition cutValueRule;
+	private OutcomeCondition minScoreRule;
 	
 	private TestFeedbackBuilder passedFeedback;
 	private TestFeedbackBuilder failedFeedback;
@@ -321,7 +322,7 @@ public class AssessmentTestBuilder {
 			}
 			
 			boolean updated = false;
-			if(cutValueRule != null && cutValueRule.getOutcomeIf().getExpressions().size() > 0) {
+			if(cutValueRule != null && !cutValueRule.getOutcomeIf().getExpressions().isEmpty()) {
 				Expression gte = cutValueRule.getOutcomeIf().getExpressions().get(0);
 				if(gte.getExpressions().size() > 1) {
 					Expression baseValue = gte.getExpressions().get(1);
@@ -339,6 +340,10 @@ public class AssessmentTestBuilder {
 				assessmentTest.getOutcomeProcessing().getOutcomeRules().add(cutValueRule);
 			}
 		} else if(cutValueRule != null) {
+			OutcomeDeclaration passDeclaration = assessmentTest.getOutcomeDeclaration(QTI21Constants.PASS_IDENTIFIER);
+			if(passDeclaration != null) {
+				assessmentTest.getOutcomeDeclarations().remove(passDeclaration);
+			}
 			assessmentTest.getOutcomeProcessing().getOutcomeRules().remove(cutValueRule);
 		}
 	}
-- 
GitLab