From 4fc8e50661191c6954588f445f7a2a167a6db88a Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Mon, 30 Apr 2018 14:41:10 +0200 Subject: [PATCH] OO-3457: in test course element, retrieve always min. and max. score and cut value from the test --- .../archiver/ScoreAccountingHelper.java | 9 +- .../olat/course/nodes/IQTESTCourseNode.java | 103 +++++++++++++----- 2 files changed, 81 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java b/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java index a6b7cbe8d94..532cd2f2e51 100644 --- a/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java +++ b/src/main/java/org/olat/course/archiver/ScoreAccountingHelper.java @@ -367,10 +367,13 @@ public class ScoreAccountingHelper { if(acnode instanceof STCourseNode || !acnode.hasScoreConfigured()) { minVal = maxVal = cutVal = "-"; } else { - minVal = acnode.getMinScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMinScoreConfiguration()); - maxVal = acnode.getMaxScoreConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getMaxScoreConfiguration()); + Float minScoreConfig = acnode.getMinScoreConfiguration(); + Float maxScoreConfig = acnode.getMaxScoreConfiguration(); + minVal = minScoreConfig == null ? "-" : AssessmentHelper.getRoundedScore(minScoreConfig); + maxVal = maxScoreConfig == null ? "-" : AssessmentHelper.getRoundedScore(maxScoreConfig); if (acnode.hasPassedConfigured()) { - cutVal = acnode.getCutValueConfiguration() == null ? "-" : AssessmentHelper.getRoundedScore(acnode.getCutValueConfiguration()); + Float cutValueConfig = acnode.getCutValueConfiguration(); + cutVal = cutValueConfig == null ? "-" : AssessmentHelper.getRoundedScore(cutValueConfig); } else { cutVal = "-"; } diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java index ac00486f636..8525e85feb6 100644 --- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java @@ -104,6 +104,7 @@ import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.manager.AssessmentTestSessionDAO; import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat; import org.olat.ims.qti21.model.QTI21StatisticSearchParams; +import org.olat.ims.qti21.model.xml.QtiNodesExtractor; import org.olat.ims.qti21.resultexport.QTI21ResultsExportMediaResource; import org.olat.ims.qti21.ui.QTI21AssessmentDetailsController; import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult; @@ -229,11 +230,8 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe if(!configRef && config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1) > 0) { timeLimit = true; } else { - File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource()); - ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class) - .loadAndResolveAssessmentTest(unzippedDirRoot, false, false); - AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); - if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) { + AssessmentTest assessmentTest = loadAssessmentTest(testEntry); + if(assessmentTest != null && assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) { timeLimit = true; } } @@ -257,17 +255,30 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe if(!configRef && config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1) > 0) { timeLimit = config.getIntegerSafe(IQEditController.CONFIG_KEY_TIME_LIMIT, -1); } else { - File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource()); - ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class) - .loadAndResolveAssessmentTest(unzippedDirRoot, false, false); - AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); - if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) { + AssessmentTest assessmentTest = loadAssessmentTest(testEntry); + if(assessmentTest != null && assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) { timeLimit = assessmentTest.getTimeLimits().getMaximum().intValue(); } } } return timeLimit; } + + /** + * + * @return + */ + public AssessmentTest loadAssessmentTest(RepositoryEntry testEntry) { + if(testEntry == null) return null; + + File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource()); + ResolvedAssessmentTest resolvedAssessmentTest = CoreSpringFactory.getImpl(QTI21Service.class) + .loadAndResolveAssessmentTest(unzippedDirRoot, false, false); + if(resolvedAssessmentTest != null) { + return resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); + } + return null; + } /** * @see org.olat.course.nodes.CourseNode#createPreviewController(org.olat.core.gui.UserRequest, @@ -429,36 +440,72 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements Pe return false; } - /** - * @see org.olat.course.nodes.AssessableCourseNode#getCutValueConfiguration() - */ @Override public Float getCutValueConfiguration() { - ModuleConfiguration config = this.getModuleConfiguration(); - return (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE); + Float cutValue = null; + + ModuleConfiguration config = getModuleConfiguration(); + // for onyx and QTI 1.2 + if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI)) + || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { + cutValue = (Float) config.get(IQEditController.CONFIG_KEY_CUTVALUE); + } else { + RepositoryEntry testEntry = getReferencedRepositoryEntry(); + AssessmentTest assessmentTest = loadAssessmentTest(testEntry); + if(assessmentTest != null) { + Double cut = QtiNodesExtractor.extractCutValue(assessmentTest); + if(cut != null) { + cutValue = Float.valueOf(cut.floatValue()); + } + } + } + return cutValue; } - /** - * @see org.olat.course.nodes.AssessableCourseNode#getMaxScoreConfiguration() - */ @Override public Float getMaxScoreConfiguration() { - ModuleConfiguration config = this.getModuleConfiguration(); - return (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE); + Float maxScore = null; + + ModuleConfiguration config = getModuleConfiguration(); + // for onyx and QTI 1.2 + if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI)) + || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { + maxScore = (Float) config.get(IQEditController.CONFIG_KEY_MAXSCORE); + } else { + RepositoryEntry testEntry = getReferencedRepositoryEntry(); + AssessmentTest assessmentTest = loadAssessmentTest(testEntry); + if(assessmentTest != null) { + Double max = QtiNodesExtractor.extractMaxScore(assessmentTest); + if(max != null) { + maxScore = Float.valueOf(max.floatValue()); + } + } + } + + return maxScore; } - /** - * @see org.olat.course.nodes.AssessableCourseNode#getMinScoreConfiguration() - */ @Override public Float getMinScoreConfiguration() { - ModuleConfiguration config = this.getModuleConfiguration(); - return (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE); + Float minScore = null; + ModuleConfiguration config = getModuleConfiguration(); + // for onyx and QTI 1.2 + if (IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI)) + || IQEditController.CONFIG_VALUE_QTI1.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI))) { + minScore = (Float) config.get(IQEditController.CONFIG_KEY_MINSCORE); + } else { + RepositoryEntry testEntry = getReferencedRepositoryEntry(); + AssessmentTest assessmentTest = loadAssessmentTest(testEntry); + if(assessmentTest != null) { + Double min = QtiNodesExtractor.extractMinScore(assessmentTest); + if(min != null) { + minScore = Float.valueOf(min.floatValue()); + } + } + } + return minScore; } - /** - * @see org.olat.course.nodes.AssessableCourseNode#hasCommentConfigured() - */ @Override public boolean hasCommentConfigured() { // coach should be able to add comments here, visible to users -- GitLab