diff --git a/src/main/java/org/olat/core/util/openxml/OpenXMLDocumentWriter.java b/src/main/java/org/olat/core/util/openxml/OpenXMLDocumentWriter.java index 766a3d9b6615b9b0edea819f128c82b540d9e9d2..6bc17a03a19113c0c7cb8ea00ec0f3720fa201fe 100644 --- a/src/main/java/org/olat/core/util/openxml/OpenXMLDocumentWriter.java +++ b/src/main/java/org/olat/core/util/openxml/OpenXMLDocumentWriter.java @@ -156,9 +156,7 @@ public class OpenXMLDocumentWriter { try(FileInputStream in = new FileInputStream(img.getFile())) { ZipEntry wordDocument = new ZipEntry("word/media/" + img.getFilename()); out.putNextEntry(wordDocument); - IOUtils.copy(in, out); - OpenXMLUtils.writeTo(document.getDocument(), out, false); out.closeEntry(); } catch(Exception e) { log.error("", e); 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 11f8d715385963bbb748cbd80b8b098a0cc1a1c1..3e37f7a94a40406b75c57ca7db5d40c34e08cb7b 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java @@ -125,12 +125,11 @@ public class QTI21AssessmentDetailsController extends FormBasicController { private FormLink resetButton; private FlexiTableElement tableEl; private final TooledStackedPanel stackPanel; + private DefaultFlexiColumnModel correctionCol; private QTI21AssessmentTestSessionTableModel tableModel; private RepositoryEntry entry; - private RepositoryEntry testEntry; private final String subIdent; - private final boolean manualCorrections; private final Identity assessedIdentity; private int count = 0; @@ -182,11 +181,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { this.assessedUserCourseEnv = assessedUserCourseEnv; subIdent = courseNode.getIdent(); readOnly = coachCourseEnv.isCourseReadOnly(); - testEntry = courseNode.getReferencedRepositoryEntry(); assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity(); - String correctionMode = courseNode.getModuleConfiguration().getStringValue(IQEditController.CONFIG_CORRECTION_MODE); - manualCorrections = !IQEditController.CORRECTION_GRADING.equals(correctionMode) - && (IQEditController.CORRECTION_MANUAL.equals(correctionMode) || qtiService.needManualCorrection(testEntry)); RepositoryEntry courseEntry = assessedUserCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); reSecurity = repositoryManager.isAllowed(ureq, courseEntry); @@ -207,14 +202,12 @@ public class QTI21AssessmentDetailsController extends FormBasicController { RepositoryEntry assessableEntry, Identity assessedIdentity) { super(ureq, wControl, "assessment_details"); entry = assessableEntry; - testEntry = assessableEntry; subIdent = null; readOnly = false; courseNode = null; assessedUserCourseEnv = null; this.stackPanel = stackPanel; this.assessedIdentity = assessedIdentity; - manualCorrections = qtiService.needManualCorrection(assessableEntry); reSecurity = repositoryManager.isAllowed(ureq, assessableEntry); initForm(ureq); @@ -241,9 +234,10 @@ public class QTI21AssessmentDetailsController extends FormBasicController { new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("results.report"), "open"), new StaticFlexiCellRenderer(translate("pull"), "open")))); } - if(manualCorrections) { - columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TSCols.correction.i18nHeaderKey(), TSCols.correction.ordinal(), "correction", - new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("correction"), "correction"), null))); + if(!readOnly) { + correctionCol = new DefaultFlexiColumnModel(TSCols.correction.i18nHeaderKey(), TSCols.correction.ordinal(), "correction", + new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("correction"), "correction"), null)); + columnsModel.addFlexiColumnModel(correctionCol); } if(pdfModule.isEnabled()) { DefaultFlexiColumnModel toolsCol = new DefaultFlexiColumnModel(TSCols.tools); @@ -270,16 +264,33 @@ public class QTI21AssessmentDetailsController extends FormBasicController { } protected void updateModel() { + boolean grading = false; + boolean manualCorrections = false; + if(courseNode != null) { + String correctionMode = courseNode.getModuleConfiguration().getStringValue(IQEditController.CONFIG_CORRECTION_MODE); + grading = IQEditController.CORRECTION_GRADING.equals(correctionMode); + manualCorrections = !grading && IQEditController.CORRECTION_MANUAL.equals(correctionMode); + } + List<AssessmentTestSessionStatistics> sessionsStatistics = qtiService.getAssessmentTestSessionsStatistics(entry, subIdent, assessedIdentity); List<QTI21AssessmentTestSessionDetails> infos = new ArrayList<>(); + final Map<RepositoryEntry,Boolean> manualCorrectionsMap = new HashMap<>(); for(AssessmentTestSessionStatistics sessionStatistics:sessionsStatistics) { + RepositoryEntry testEntry = sessionStatistics.getTestSession().getTestEntry(); + if(!grading) { + manualCorrections = manualCorrections || manualCorrectionsMap + .computeIfAbsent(testEntry, re -> qtiService.needManualCorrection(re)) + .booleanValue(); + } infos.add(forgeDetailsRow(sessionStatistics)); } + correctionCol.setAlwaysVisible(manualCorrections); + correctionCol.setDefaultVisible(manualCorrections); + tableEl.setColumnModelVisible(correctionCol, manualCorrections); Collections.sort(infos, new AssessmentTestSessionDetailsComparator()); tableModel.setObjects(infos); - tableEl.reloadData(); - tableEl.reset(); + tableEl.reset(true, true, true); if(resetButton != null) { resetButton.setVisible(!sessionsStatistics.isEmpty()); @@ -425,6 +436,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { } private void doCorrection(UserRequest ureq, AssessmentTestSession session) { + RepositoryEntry testEntry = session.getTestEntry(); File unzippedDirRoot = FileResourceManager.getInstance().unzipFileResource(testEntry.getOlatResource()); ResolvedAssessmentTest resolvedAssessmentTest = qtiService.loadAndResolveAssessmentTest(unzippedDirRoot, false, false); ManifestBuilder manifestBuilder = ManifestBuilder.read(new File(unzippedDirRoot, "imsmanifest.xml")); @@ -443,7 +455,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { listenTo(correctionCtrl); stackPanel.pushController(translate("correction"), correctionCtrl); } catch(Exception e) { - logError("Cannot red results", e); + logError("Cannot read results", e); showError("error.assessment.test.session"); } } @@ -527,8 +539,8 @@ public class QTI21AssessmentDetailsController extends FormBasicController { } private DigitalSignatureOptions getSignatureOptions(AssessmentTestSession session) { - RepositoryEntry sessionTestEntry = session.getTestEntry(); - QTI21DeliveryOptions deliveryOptions = qtiService.getDeliveryOptions(sessionTestEntry); + RepositoryEntry testEntry = session.getTestEntry(); + QTI21DeliveryOptions deliveryOptions = qtiService.getDeliveryOptions(testEntry); boolean digitalSignature = deliveryOptions.isDigitalSignature(); boolean sendMail = deliveryOptions.isDigitalSignatureMail(); @@ -546,7 +558,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { AssessmentEntryOutcomesListener.decorateResourceConfirmation(entry, testEntry, session, options, null, getLocale()); } else { CourseEnvironment courseEnv = CourseFactory.loadCourse(entry).getCourseEnvironment(); - QTI21AssessmentRunController.decorateCourseConfirmation(session, options, courseEnv, courseNode, sessionTestEntry, null, getLocale()); + QTI21AssessmentRunController.decorateCourseConfirmation(session, options, courseEnv, courseNode, testEntry, null, getLocale()); } } return options;