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