diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java index 780fbdff2a7ed5ab7cabbb9440e5134814c7b5ca..b401cf4bac0c359b56ba1a6b5e47f4fcc9e866df 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseController.java @@ -158,6 +158,9 @@ public class AssessmentIdentityCourseController extends BasicController implemen fireEvent(ureq, aee.cloneNotClose()); } else if(event == Event.CANCELLED_EVENT) { stackPanel.popController(currentNodeCtrl); + } else if(event == Event.CHANGED_EVENT) { + treeOverviewCtrl.doIdentityAssessmentOverview(ureq); + fireEvent(ureq, event); } } super.event(ureq, source, event); @@ -211,7 +214,6 @@ public class AssessmentIdentityCourseController extends BasicController implemen } if(nextNode.getParent() != null) { - doSelectCourseNode(ureq, nextNode); } } diff --git a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseNodeController.java index cf1342c4a42389be07204c30d23563678e46921c..cfea08833c5a922e4a6e5ad94bf6a32b1fcdbbd1 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/AssessmentIdentityCourseNodeController.java @@ -194,6 +194,7 @@ public class AssessmentIdentityCourseNodeController extends BasicController impl // reset SCORM test if(event == Event.CHANGED_EVENT) { assessmentForm.reloadData(true); + fireEvent(ureq, event); } else if(event == Event.DONE_EVENT) { fireEvent(ureq, Event.DONE_EVENT); } else if(event instanceof OpenSubDetailsEvent) { diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java index 0fb374528d0da2761f727b043f1fd18066189e23..7bb53ee0cf9082f5f9b22268ab9b813df95db609 100644 --- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java +++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java @@ -76,7 +76,6 @@ import org.olat.course.certificate.CertificateLight; import org.olat.course.certificate.CertificatesManager; import org.olat.course.certificate.ui.DownloadCertificateCellRenderer; import org.olat.course.nodes.AssessableCourseNode; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.CalculatedAssessableCourseNode; import org.olat.course.nodes.CourseNode; import org.olat.course.nodes.CourseNodeFactory; @@ -86,6 +85,7 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.group.BusinessGroup; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.ui.AssessedIdentityController; import org.olat.modules.assessment.ui.AssessedIdentityElementRow; diff --git a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java index 3af6351497cbab7396e62a324741d5801e821e8e..129afb34044c1a2b7c85c100d01301fa636fbdc8 100644 --- a/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AbstractAccessableCourseNode.java @@ -44,6 +44,7 @@ import org.olat.course.condition.interpreter.ConditionInterpreter; import org.olat.course.export.CourseEnvironmentMapper; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.userview.NodeEvaluation; +import org.olat.modules.assessment.AssessmentToolOptions; import de.bps.course.nodes.CourseNodePasswordManagerImpl; diff --git a/src/main/java/org/olat/course/nodes/AssessableCourseNode.java b/src/main/java/org/olat/course/nodes/AssessableCourseNode.java index 8e4fec8cdf0a95ec5ad6732ae65a625c2a990d7c..e1864f989c2d3ec3714bb622cbf809b8a0007f50 100644 --- a/src/main/java/org/olat/course/nodes/AssessableCourseNode.java +++ b/src/main/java/org/olat/course/nodes/AssessableCourseNode.java @@ -37,6 +37,7 @@ import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.scoring.AssessmentEvaluation; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; +import org.olat.modules.assessment.AssessmentToolOptions; /** diff --git a/src/main/java/org/olat/course/nodes/GTACourseNode.java b/src/main/java/org/olat/course/nodes/GTACourseNode.java index d7cd3b016d06b32d8d65769e64a0e72b51481940..a93bf15b684a9edcb04b48f7f414219b8e1270be 100644 --- a/src/main/java/org/olat/course/nodes/GTACourseNode.java +++ b/src/main/java/org/olat/course/nodes/GTACourseNode.java @@ -90,6 +90,7 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.repository.RepositoryEntry; import org.olat.user.UserManager; diff --git a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java index 629edbeca337785c8cf09b7cb5535645545d0df7..1c9d91ff57c5872c776b7462fa2b037496668146 100644 --- a/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQSURVCourseNode.java @@ -82,6 +82,7 @@ import org.olat.ims.qti21.model.QTI21StatisticSearchParams; import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult; import org.olat.ims.qti21.ui.statistics.QTI21StatisticsSecurityCallback; import org.olat.modules.ModuleConfiguration; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.iq.IQSecurityCallback; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryImportExport; diff --git a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java index 1f5bfe4f14aaa81b2a161a4aa52f7f62880806ea..57515d61333fbbcdb68d41ea314cf96c55df63ba 100644 --- a/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java +++ b/src/main/java/org/olat/course/nodes/IQTESTCourseNode.java @@ -101,6 +101,7 @@ import org.olat.ims.qti21.ui.statistics.QTI21StatisticsSecurityCallback; import org.olat.ims.qti21.ui.statistics.QTI21StatisticsToolController; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.iq.IQSecurityCallback; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryImportExport; diff --git a/src/main/java/org/olat/course/nodes/MSCourseNode.java b/src/main/java/org/olat/course/nodes/MSCourseNode.java index f87b0e06f1a76f1a4246c6d252ca2a2554af7b7e..47219453d630a7e046fbfff703d020abfff7b4e1 100644 --- a/src/main/java/org/olat/course/nodes/MSCourseNode.java +++ b/src/main/java/org/olat/course/nodes/MSCourseNode.java @@ -64,6 +64,7 @@ import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.properties.Property; import org.olat.repository.RepositoryEntry; import org.olat.resource.OLATResource; diff --git a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java index fc85bd7480eab2497399e58a1e3445d138a31204..9c87b6ce12cceb6d2bce67b5591b092be1f60fa8 100644 --- a/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java +++ b/src/main/java/org/olat/course/nodes/ProjectBrokerCourseNode.java @@ -112,6 +112,7 @@ import org.olat.group.BusinessGroupService; import org.olat.group.model.BusinessGroupReference; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.properties.Property; import org.olat.repository.RepositoryEntry; import org.olat.resource.OLATResource; diff --git a/src/main/java/org/olat/course/nodes/TACourseNode.java b/src/main/java/org/olat/course/nodes/TACourseNode.java index ad5a6e5f1db1cd6d2b6687d591a167eb3b0a30f3..7774e076a8c981dd06044d1618d5d3a90c314812 100644 --- a/src/main/java/org/olat/course/nodes/TACourseNode.java +++ b/src/main/java/org/olat/course/nodes/TACourseNode.java @@ -96,6 +96,7 @@ import org.olat.course.run.userview.NodeEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.modules.ModuleConfiguration; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.properties.Property; import org.olat.repository.RepositoryEntry; import org.olat.resource.OLATResource; diff --git a/src/main/java/org/olat/course/nodes/gta/ui/BulkDownloadToolController.java b/src/main/java/org/olat/course/nodes/gta/ui/BulkDownloadToolController.java index 9aec7c6a22be0339b83c3c3a03150f64ac81f0fb..ad5983b25b03fa87ec254b74485a7e4ddcbadbbe 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/BulkDownloadToolController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/BulkDownloadToolController.java @@ -28,9 +28,9 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.course.archiver.ArchiveResource; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.GTACourseNode; import org.olat.course.run.environment.CourseEnvironment; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.resource.OLATResource; /** diff --git a/src/main/java/org/olat/course/nodes/ta/BulkDownloadToolController.java b/src/main/java/org/olat/course/nodes/ta/BulkDownloadToolController.java index 44aad7023de334df682f25838fa60a316df2d5c4..7a3fa8ba92403a7af6c9c91d49d5ccddfb8673d9 100644 --- a/src/main/java/org/olat/course/nodes/ta/BulkDownloadToolController.java +++ b/src/main/java/org/olat/course/nodes/ta/BulkDownloadToolController.java @@ -28,9 +28,9 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.course.archiver.ArchiveResource; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.TACourseNode; import org.olat.course.run.environment.CourseEnvironment; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.resource.OLATResource; /** diff --git a/src/main/java/org/olat/ims/qti/resultexport/QTI12ExportResultsReportController.java b/src/main/java/org/olat/ims/qti/resultexport/QTI12ExportResultsReportController.java index d92119a86c47353e0cda2edb6d5074e756cde385..a9656e0fb4586396601a8c031bccd714f697c8c6 100644 --- a/src/main/java/org/olat/ims/qti/resultexport/QTI12ExportResultsReportController.java +++ b/src/main/java/org/olat/ims/qti/resultexport/QTI12ExportResultsReportController.java @@ -32,12 +32,12 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.QTICourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.ims.qti21.QTI21Service; +import org.olat.modules.assessment.AssessmentToolOptions; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/ims/qti/resultexport/QTI21ExportResultsReportController.java b/src/main/java/org/olat/ims/qti/resultexport/QTI21ExportResultsReportController.java index e8161a5f66f802ae82c16b4d8650f9f924786aec..0b495ae3825f82779527b9fa7c4cf6e52eda90b2 100644 --- a/src/main/java/org/olat/ims/qti/resultexport/QTI21ExportResultsReportController.java +++ b/src/main/java/org/olat/ims/qti/resultexport/QTI21ExportResultsReportController.java @@ -32,12 +32,12 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.QTICourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.ims.qti21.QTI21Service; +import org.olat.modules.assessment.AssessmentToolOptions; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PullTestsToolController.java b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PullTestsToolController.java index 815d4ef66d6a148d307db45361d005899781e4be..320f8eb2fcd6a14517abcac524f46ddf22ed5599 100644 --- a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PullTestsToolController.java +++ b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12PullTestsToolController.java @@ -44,7 +44,6 @@ import org.olat.core.util.i18n.I18nModule; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.assessment.AssessmentHelper; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.scoring.ScoreEvaluation; @@ -55,6 +54,7 @@ import org.olat.ims.qti.process.AssessmentFactory; import org.olat.ims.qti.process.AssessmentInstance; import org.olat.ims.qti.process.FilePersister; import org.olat.modules.ModuleConfiguration; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.iq.IQManager; import org.olat.modules.iq.IQRetrievedEvent; import org.olat.user.UserManager; diff --git a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12StatisticsToolController.java b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12StatisticsToolController.java index 8e5251cc7bfde28caf0f7d1b271bb8f3e37a3d2c..bd6d42ec216ce551ef915114fa09ce6277d56e39 100644 --- a/src/main/java/org/olat/ims/qti/statistics/ui/QTI12StatisticsToolController.java +++ b/src/main/java/org/olat/ims/qti/statistics/ui/QTI12StatisticsToolController.java @@ -45,13 +45,13 @@ import org.olat.core.id.context.StateEntry; import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; -import org.olat.course.nodes.AssessmentToolOptions.AlternativeToIdentities; import org.olat.course.nodes.QTICourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.statistic.StatisticResourceNode; import org.olat.ims.qti.statistics.QTIStatisticResourceResult; import org.olat.ims.qti.statistics.QTIStatisticSearchParams; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.modules.assessment.AssessmentToolOptions.AlternativeToIdentities; import org.olat.repository.RepositoryEntry; import org.olat.resource.OLATResource; diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessableResource.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessableResource.java new file mode 100644 index 0000000000000000000000000000000000000000..e39b4921491f2e5f8cae66cb64254ceab3a9eb5b --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessableResource.java @@ -0,0 +1,55 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.ims.qti21.ui; + +import java.util.ArrayList; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.modules.assessment.ui.AssessableResource; +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 7 nov. 2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class QTI21AssessableResource extends AssessableResource { + + public QTI21AssessableResource(boolean hasScore, boolean hasPassed, boolean hasAttempts, boolean hasComments, + Double minScore, Double maxScore, Double cutValue) { + super(hasScore, hasPassed, hasAttempts, hasComments, minScore, maxScore, cutValue); + } + + @Override + public List<Controller> createAssessmentTools(UserRequest ureq, WindowControl wControl, + TooledStackedPanel stackPanel, RepositoryEntry entry, AssessmentToolOptions options) { + + Controller resetToolCtrl = new QTI21ResetToolController(ureq, wControl, entry, options); + List<Controller> toolsCtrl = new ArrayList<>(1); + toolsCtrl.add(resetToolCtrl); + return toolsCtrl; + } +} 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 3d1b321558a37f8246b099d58645b85f999fc6b4..e7b2b65d79c3158672e88ab5d9ff23febedca434 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AssessmentDetailsController.java @@ -29,6 +29,7 @@ import java.util.List; import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.Component; import org.olat.core.gui.components.EscapeMode; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; @@ -65,7 +66,10 @@ import org.olat.ims.qti21.ui.assessment.IdentityAssessmentTestCorrectionControll import org.olat.ims.qti21.ui.event.RetrieveAssessmentTestSessionEvent; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.AssessmentService; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryManager; +import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; @@ -77,6 +81,7 @@ import org.springframework.beans.factory.annotation.Autowired; */ public class QTI21AssessmentDetailsController extends FormBasicController { + private Component resetToolCmp; private FlexiTableElement tableEl; private QTI21TestSessionTableModel tableModel; @@ -86,10 +91,12 @@ public class QTI21AssessmentDetailsController extends FormBasicController { private final Identity assessedIdentity; private IQTESTCourseNode courseNode; + private final RepositoryEntrySecurity reSecurity; private UserCourseEnvironment assessedUserCourseEnv; private CloseableModalController cmc; private AssessmentResultController resultCtrl; + private QTI21ResetToolController resetToolCtrl; private DialogBoxController retrieveConfirmationCtr; private IdentityAssessmentTestCorrectionController correctionCtrl; @@ -100,6 +107,8 @@ public class QTI21AssessmentDetailsController extends FormBasicController { @Autowired protected QTI21Service qtiService; @Autowired + private RepositoryManager repositoryManager; + @Autowired private AssessmentService assessmentService; public QTI21AssessmentDetailsController(UserRequest ureq, WindowControl wControl, @@ -112,6 +121,9 @@ public class QTI21AssessmentDetailsController extends FormBasicController { RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); assessedIdentity = assessedUserCourseEnv.getIdentityEnvironment().getIdentity(); manualCorrections = qtiService.needManualCorrection(testEntry); + + RepositoryEntry courseEntry = assessedUserCourseEnv.getCourseEnvironment().getCourseGroupManager().getCourseEntry(); + reSecurity = repositoryManager.isAllowed(ureq, courseEntry); initForm(ureq); updateModel(); @@ -124,6 +136,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController { subIdent = null; this.assessedIdentity = assessedIdentity; manualCorrections = qtiService.needManualCorrection(assessableEntry); + reSecurity = repositoryManager.isAllowed(ureq, assessableEntry); initForm(ureq); updateModel(); @@ -145,7 +158,23 @@ public class QTI21AssessmentDetailsController extends FormBasicController { tableModel = new QTI21TestSessionTableModel(columnsModel, getTranslator()); tableEl = uifactory.addTableElement(getWindowControl(), "sessions", tableModel, 20, false, getTranslator(), formLayout); - } + tableEl.setEmtpyTableMessageKey("results.empty"); + + + if(reSecurity.isEntryAdmin()) { + AssessmentToolOptions asOptions = new AssessmentToolOptions(); + asOptions.setAdmin(reSecurity.isEntryAdmin()); + asOptions.setIdentities(Collections.singletonList(assessedIdentity)); + if(courseNode != null) { + resetToolCtrl = new QTI21ResetToolController(ureq, getWindowControl(), + assessedUserCourseEnv.getCourseEnvironment(), asOptions, courseNode); + } else { + resetToolCtrl = new QTI21ResetToolController(ureq, getWindowControl(), entry, asOptions); + } + listenTo(resetToolCtrl); + resetToolCmp = resetToolCtrl.getInitialComponent(); + } + } @Override protected void doDispose() { @@ -158,6 +187,14 @@ public class QTI21AssessmentDetailsController extends FormBasicController { tableModel.setObjects(sessions); tableEl.reloadData(); tableEl.reset(); + + if(resetToolCmp != null) { + if(sessions.size() > 0) { + flc.getFormItemComponent().put("reset.tool", resetToolCmp); + } else { + flc.getFormItemComponent().remove(resetToolCmp); + } + } } @Override @@ -181,6 +218,11 @@ public class QTI21AssessmentDetailsController extends FormBasicController { doPullSession((AssessmentTestSession)retrieveConfirmationCtr.getUserObject()); updateModel(); } + } else if(resetToolCtrl == source) { + if(event == Event.DONE_EVENT) { + updateModel(); + fireEvent(ureq, Event.CHANGED_EVENT); + } } super.event(ureq, source, event); } diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java deleted file mode 100644 index 86c7d21f1453496d47f3529cab3121081aa1ac74..0000000000000000000000000000000000000000 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21ConfirmDeleteDataController.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * <a href="http://www.openolat.org"> - * OpenOLAT - Online Learning and Training</a><br> - * <p> - * Licensed under the Apache License, Version 2.0 (the "License"); <br> - * you may not use this file except in compliance with the License.<br> - * You may obtain a copy of the License at the - * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> - * <p> - * Unless required by applicable law or agreed to in writing,<br> - * software distributed under the License is distributed on an "AS IS" BASIS, <br> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> - * See the License for the specific language governing permissions and <br> - * limitations under the License. - * <p> - * Initial code contributed and copyrighted by<br> - * frentix GmbH, http://www.frentix.com - * <p> - */ -package org.olat.ims.qti21.ui; - -import java.util.List; - -import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.impl.FormBasicController; -import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; -import org.olat.core.gui.control.Controller; -import org.olat.core.gui.control.Event; -import org.olat.core.gui.control.WindowControl; -import org.olat.core.util.StringHelper; -import org.olat.course.CorruptedCourseException; -import org.olat.course.CourseFactory; -import org.olat.course.ICourse; -import org.olat.repository.RepositoryEntry; -import org.olat.resource.references.Reference; -import org.olat.resource.references.ReferenceManager; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * - * Initial date: 25.08.2016<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class QTI21ConfirmDeleteDataController extends FormBasicController { - - private final RepositoryEntry testEntry; - - @Autowired - private ReferenceManager referenceManager; - - public QTI21ConfirmDeleteDataController(UserRequest ureq, WindowControl wControl, RepositoryEntry testEntry) { - super(ureq, wControl, "confirm_delete"); - this.testEntry = testEntry; - initForm(ureq); - } - - @Override - protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - - StringBuilder sb = new StringBuilder(); - List<Reference> referencees = referenceManager.getReferencesTo(testEntry.getOlatResource()); - for(Reference ref:referencees) { - if ("CourseModule".equals(ref.getSource().getResourceableTypeName())) { - if(sb.length() > 0) sb.append(", "); - try { - ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId()); - sb.append(StringHelper.escapeHtml(course.getCourseTitle())); - } catch(CorruptedCourseException e) { - logError("", e); - } - } - } - - if(formLayout instanceof FormLayoutContainer) { - FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; - layoutCont.contextPut("referencees", sb.toString()); - } - - final FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); - buttonGroupLayout.setRootForm(mainForm); - formLayout.add(buttonGroupLayout); - - if(referencees.size() == 0) { - uifactory.addFormSubmitButton("delete", buttonGroupLayout); - } - uifactory.addFormCancelButton("cancel", buttonGroupLayout, ureq, getWindowControl()); - } - - @Override - protected void doDispose() { - // - } - - @Override - protected void formOK(UserRequest ureq) { - fireEvent(ureq, Event.DONE_EVENT); - } - - @Override - protected void formCancelled(UserRequest ureq) { - fireEvent(ureq, Event.CANCELLED_EVENT); - } -} diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21ResetToolController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21ResetToolController.java index e40416fecdd25764a227d1470eb15b9122e3bfb7..bfd68fe6336cee511b83c8444055b75da2aa10d3 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21ResetToolController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21ResetToolController.java @@ -22,20 +22,26 @@ package org.olat.ims.qti21.ui; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.zip.ZipOutputStream; +import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.control.generic.modal.DialogBoxController; -import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.id.Identity; import org.olat.core.id.IdentityEnvironment; import org.olat.core.id.Roles; @@ -44,7 +50,6 @@ import org.olat.core.util.StringHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.nodes.QTICourseNode; import org.olat.course.run.environment.CourseEnvironment; @@ -53,6 +58,8 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.group.BusinessGroupService; import org.olat.ims.qti21.QTI21Service; +import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; @@ -65,13 +72,16 @@ import org.springframework.beans.factory.annotation.Autowired; public class QTI21ResetToolController extends BasicController { private final Roles studentRoles = new Roles(false, false, false, false, false, false, false, false); - private final Link resetButton; + private Link resetButton; - private DialogBoxController confirmResetDialog; + private CloseableModalController cmc; + private ConfirmResetController confirmResetCtrl; - private final QTICourseNode courseNode; - private final CourseEnvironment courseEnv; - private final AssessmentToolOptions asOptions; + private ArchiveOptions options; + private QTICourseNode courseNode; + private List<Identity> identities; + private CourseEnvironment courseEnv; + private RepositoryEntry assessedEntry; @Autowired private QTI21Service qtiService; @@ -83,9 +93,28 @@ public class QTI21ResetToolController extends BasicController { super(ureq, wControl); this.courseNode = courseNode; this.courseEnv = courseEnv; - this.asOptions = asOptions; + initButton(asOptions); + } + + public QTI21ResetToolController(UserRequest ureq, WindowControl wControl, + RepositoryEntry assessedEntry, AssessmentToolOptions asOptions) { + super(ureq, wControl); + this.assessedEntry = assessedEntry; + initButton(asOptions); + } + + private void initButton(AssessmentToolOptions asOptions) { + options = new ArchiveOptions(); + if(asOptions.getGroup() == null) { + identities = asOptions.getIdentities(); + options.setIdentities(identities); + } else { + identities = businessGroupService.getMembers(asOptions.getGroup()); + options.setGroup(asOptions.getGroup()); + } resetButton = LinkFactory.createButton("reset.test.data.title", null, this); + resetButton.setIconLeftCSS("o_icon o_icon_delete_item"); resetButton.setTranslator(getTranslator()); putInitialPanel(resetButton); getInitialComponent().setSpanAsDomReplaceable(true); // override to wrap panel as span to not break link layout @@ -105,55 +134,63 @@ public class QTI21ResetToolController extends BasicController { @Override protected void event(UserRequest ureq, Controller source, Event event) { - if(confirmResetDialog == source) { - if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) { + if(confirmResetCtrl == source) { + if(event == Event.DONE_EVENT) { doReset(ureq); + fireEvent(ureq, Event.DONE_EVENT); } + cmc.deactivate(); + cleanUp(); + } else if (cmc == source) { + cleanUp(); } super.event(ureq, source, event); } + + private void cleanUp() { + removeAsListenerAndDispose(confirmResetCtrl); + removeAsListenerAndDispose(cmc); + confirmResetCtrl = null; + cmc = null; + } private void doConfirmReset(UserRequest ureq) { + if(confirmResetCtrl != null) return; + + confirmResetCtrl = new ConfirmResetController(ureq, this.getWindowControl()); + listenTo(confirmResetCtrl); + String title = translate("reset.test.data.title"); - String text = translate("reset.test.data.text"); - confirmResetDialog = activateOkCancelDialog(ureq, title, text, confirmResetDialog); + cmc = new CloseableModalController(getWindowControl(), null, confirmResetCtrl.getInitialComponent(), true, title, true); + listenTo(cmc); + cmc.activate(); } private void doReset(UserRequest ureq) { - List<Identity> identities; - - ArchiveOptions options = new ArchiveOptions(); - if(asOptions.getGroup() == null) { - identities = asOptions.getIdentities(); - options.setIdentities(identities); - } else { - identities = businessGroupService.getMembers(asOptions.getGroup()); - options.setGroup(asOptions.getGroup()); - } - - RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); - RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry(); - if(courseNode instanceof IQTESTCourseNode) { IQTESTCourseNode testCourseNode = (IQTESTCourseNode)courseNode; + RepositoryEntry testEntry = courseNode.getReferencedRepositoryEntry(); + RepositoryEntry courseEntry = courseEnv.getCourseGroupManager().getCourseEntry(); ICourse course = CourseFactory.loadCourse(courseEntry); - archiveData(course, options); + archiveData(course); qtiService.deleteAssessmentTestSession(identities, testEntry, courseEntry, courseNode.getIdent()); for(Identity identity:identities) { ScoreEvaluation scoreEval = new ScoreEvaluation(null, null); - IdentityEnvironment ienv = new IdentityEnvironment(identity, studentRoles); UserCourseEnvironment uce = new UserCourseEnvironmentImpl(ienv, courseEnv); testCourseNode.updateUserScoreEvaluation(scoreEval, uce, getIdentity(), false); } + } else if(assessedEntry != null) { + archiveData(assessedEntry); + qtiService.deleteAssessmentTestSession(identities, assessedEntry, null, null); } fireEvent(ureq, Event.CHANGED_EVENT); } - private void archiveData(ICourse course, ArchiveOptions options) { + private void archiveData(ICourse course) { File exportDirectory = CourseFactory.getOrCreateDataExportDirectory(getIdentity(), course.getCourseTitle()); String archiveName = courseNode.getType() + "_" + StringHelper.transformDisplayNameToFileSystemName(courseNode.getShortName()) @@ -168,4 +205,87 @@ public class QTI21ResetToolController extends BasicController { logError("", e); } } + + private void archiveData(RepositoryEntry testEntry) { + //backup + String archiveName = "qti21test_" + + StringHelper.transformDisplayNameToFileSystemName(testEntry.getDisplayname()) + + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())) + ".zip"; + Path exportPath = Paths.get(FolderConfig.getCanonicalRoot(), FolderConfig.getUserHomes(), getIdentity().getName(), + "private", "archive", StringHelper.transformDisplayNameToFileSystemName(testEntry.getDisplayname()), archiveName); + File exportFile = exportPath.toFile(); + exportFile.getParentFile().mkdirs(); + + try(FileOutputStream fileStream = new FileOutputStream(exportFile); + ZipOutputStream exportStream = new ZipOutputStream(fileStream)) { + new QTI21ArchiveFormat(getLocale(), true, true, true).export(testEntry, exportStream); + } catch (IOException e) { + logError("", e); + } + + } + + private class ConfirmResetController extends FormBasicController { + + private final String[] onKeys = new String[]{ "on" }; + + private MultipleSelectionElement acknowledgeEl; + + public ConfirmResetController(UserRequest ureq, WindowControl wControl) { + super(ureq, wControl, "confirm_reset_data"); + + initForm(ureq); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + if(formLayout instanceof FormLayoutContainer) { + FormLayoutContainer layoutCont = (FormLayoutContainer)formLayout; + String[] args = new String[]{ Integer.toString(identities.size()) }; + String msg = translate("reset.test.data.text", args); + layoutCont.contextPut("msg", msg); + } + + FormLayoutContainer confirmCont = FormLayoutContainer.createDefaultFormLayout("confirm", getTranslator()); + formLayout.add("confirm", confirmCont); + confirmCont.setRootForm(mainForm); + + String[] onValues = new String[]{ translate("reset.test.data.acknowledge") }; + acknowledgeEl = uifactory.addCheckboxesHorizontal("acknowledge", "confirmation", confirmCont, onKeys, onValues); + + FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); + buttonsCont.setRootForm(mainForm); + confirmCont.add(buttonsCont); + uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl()); + uifactory.addFormSubmitButton("reset.data", buttonsCont); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected boolean validateFormLogic(UserRequest ureq) { + boolean allOk = true; + + acknowledgeEl.clearError(); + if(!acknowledgeEl.isAtLeastSelected(1)) { + acknowledgeEl.setErrorKey("form.legende.mandatory", null); + allOk &= false; + } + + return allOk & super.validateFormLogic(ureq); + } + + @Override + protected void formOK(UserRequest ureq) { + fireEvent(ureq, Event.DONE_EVENT); + } + + @Override + protected void formCancelled(UserRequest ureq) { + fireEvent(ureq, Event.CANCELLED_EVENT); + } + } } diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsToolController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsToolController.java index c6d6bae4b048999d6301d0846365d5e04435ae3c..657e8ed3dff14c75fbe9af6bc03d839232bd973a 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsToolController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RetrieveTestsToolController.java @@ -43,7 +43,6 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.resource.OresHelper; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.ims.qti.QTIResultManager; @@ -51,6 +50,7 @@ import org.olat.ims.qti21.AssessmentSessionAuditLogger; import org.olat.ims.qti21.AssessmentTestSession; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.ui.event.RetrieveAssessmentTestSessionEvent; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.user.UserManager; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java index b9aa5fa9f620fe09a4d51c925c7d6f670507d3fd..ef6c615bdbd8eac645bfc0d8d93a07fc0057192b 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeController.java @@ -20,15 +20,7 @@ package org.olat.ims.qti21.ui; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Date; -import java.util.List; -import java.util.zip.ZipOutputStream; -import org.olat.core.commons.modules.bc.FolderConfig; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.dropdown.Dropdown; @@ -39,21 +31,16 @@ import org.olat.core.gui.components.stack.PopEvent; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; -import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; -import org.olat.core.util.Formatter; -import org.olat.core.util.StringHelper; import org.olat.core.util.resource.OresHelper; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.fileresource.FileResourceManager; import org.olat.ims.qti21.QTI21Constants; import org.olat.ims.qti21.QTI21Service; -import org.olat.ims.qti21.manager.archive.QTI21ArchiveFormat; import org.olat.ims.qti21.model.xml.QtiNodesExtractor; import org.olat.ims.qti21.ui.editor.AssessmentTestComposerController; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.assessment.ui.AssessableResource; import org.olat.modules.assessment.ui.AssessmentToolController; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; @@ -75,13 +62,11 @@ import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest; */ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { - private Link assessmentLink, testStatisticLink, qtiOptionsLink, resetDataLink; + private Link assessmentLink, testStatisticLink, qtiOptionsLink; - private CloseableModalController cmd; private QTI21DeliveryOptionsController optionsCtrl; private AssessmentToolController assessmentToolCtrl; private QTI21RuntimeStatisticsController statsToolCtr; - private QTI21ConfirmDeleteDataController confirmResetDialog; private boolean reloadRuntime = false; @@ -137,18 +122,6 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { settingsDropdown.addComponent(qtiOptionsLink); } } - - @Override - protected void initDeleteTools(Dropdown settingsDropdown, boolean needSpacer) { - if (reSecurity.isEntryAdmin()) { - settingsDropdown.addComponent(new Spacer("")); - - resetDataLink = LinkFactory.createToolLink("resetData", translate("tab.reset.data"), this, "o_sel_repo_reset_data"); - resetDataLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item"); - settingsDropdown.addComponent(resetDataLink); - } - super.initDeleteTools(settingsDropdown, !reSecurity.isEntryAdmin()); - } @Override protected void event(UserRequest ureq, Component source, Event event) { @@ -158,8 +131,6 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { doAssessmentTool(ureq); } else if(qtiOptionsLink == source) { doQtiOptions(ureq); - } else if(resetDataLink == source) { - doConfirmResetData(ureq); } else if(toolbarPanel == source) { if(event instanceof PopEvent) { PopEvent pe = (PopEvent)event; @@ -181,34 +152,6 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { } super.event(ureq, source, event); } - - @Override - protected void event(UserRequest ureq, Controller source, Event event) { - if(confirmResetDialog == source) { - if(event == Event.DONE_EVENT) { - doReset(ureq); - } - cmd.deactivate(); - //only this one - cleanUpReset(); - } else if(cmd == source) { - cleanUp(); - } - super.event(ureq, source, event); - } - - @Override - protected void cleanUp() { - super.cleanUp(); - cleanUpReset(); - } - - private void cleanUpReset() { - removeAsListenerAndDispose(confirmResetDialog); - removeAsListenerAndDispose(cmd); - confirmResetDialog = null; - cmd = null; - } private void doReloadRuntimeController(UserRequest ureq) { disposeRuntimeController(); @@ -290,49 +233,6 @@ public class QTI21RuntimeController extends RepositoryEntryRuntimeController { Double minScore = QtiNodesExtractor.extractMinScore(assessmentTest); boolean hasScore = assessmentTest.getOutcomeDeclaration(QTI21Constants.SCORE_IDENTIFIER) != null; boolean hasPassed = assessmentTest.getOutcomeDeclaration(QTI21Constants.PASS_IDENTIFIER) != null; - return new AssessableResource(hasScore, hasPassed, true, true, minScore, maxScore, null); - } - - private void doConfirmResetData(UserRequest ureq) { - if(confirmResetDialog != null) return; - - confirmResetDialog = new QTI21ConfirmDeleteDataController(ureq, getWindowControl(), getRepositoryEntry()); - listenTo(confirmResetDialog); - - String title = translate("reset.test.data.title"); - cmd = new CloseableModalController(getWindowControl(), translate("close"), confirmResetDialog.getInitialComponent(), true, title); - cmd.activate(); - listenTo(cmd); - } - - private void doReset(UserRequest ureq) { - RepositoryEntry testEntry = getRepositoryEntry(); - List<Identity> identities = repositoryService.getMembers(testEntry); - - //backup - String archiveName = "qti21test_" - + StringHelper.transformDisplayNameToFileSystemName(testEntry.getDisplayname()) - + "_" + Formatter.formatDatetimeFilesystemSave(new Date(System.currentTimeMillis())) + ".zip"; - Path exportPath = Paths.get(FolderConfig.getCanonicalRoot(), FolderConfig.getUserHomes(), getIdentity().getName(), - "private", "archive", StringHelper.transformDisplayNameToFileSystemName(testEntry.getDisplayname()), archiveName); - File exportFile = exportPath.toFile(); - exportFile.getParentFile().mkdirs(); - - try(FileOutputStream fileStream = new FileOutputStream(exportFile); - ZipOutputStream exportStream = new ZipOutputStream(fileStream)) { - new QTI21ArchiveFormat(getLocale(), true, true, true).export(testEntry, exportStream); - } catch (IOException e) { - logError("", e); - } - - //delete - qtiService.deleteAssessmentTestSession(identities, testEntry, null, null); - - //reload - if(toolbarPanel.size() == 1) { - doReloadRuntimeController(ureq); - } else { - reloadRuntime = true; - } + return new QTI21AssessableResource(hasScore, hasPassed, true, true, minScore, maxScore, null); } } \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeStatisticsController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeStatisticsController.java index fefa388fd11d0fa8e4e045ade75b7ae1a4c2c6e7..6151fecb71f37eab4c3eadba809fa0b711900503 100644 --- a/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeStatisticsController.java +++ b/src/main/java/org/olat/ims/qti21/ui/QTI21RuntimeStatisticsController.java @@ -40,13 +40,13 @@ import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.resource.OresHelper; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; -import org.olat.course.nodes.AssessmentToolOptions.AlternativeToIdentities; import org.olat.ims.qti21.QTI21DeliveryOptions; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.model.QTI21StatisticSearchParams; import org.olat.ims.qti21.ui.statistics.QTI21StatisticResourceResult; import org.olat.ims.qti21.ui.statistics.QTI21StatisticsSecurityCallback; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.modules.assessment.AssessmentToolOptions.AlternativeToIdentities; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_details.html b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_details.html index 0b8ce06d66d0f4ea2b5c9370d02dd8508e78c702..06f44a101c145a5f5f6146e395ef73680c508325 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_content/assessment_details.html +++ b/src/main/java/org/olat/ims/qti21/ui/_content/assessment_details.html @@ -1 +1,6 @@ -$r.render("sessions") \ No newline at end of file +$r.render("sessions") +#if($r.available("reset.tool")) + <div class="o_button_group"> + $r.render("reset.tool") + </div> +#end \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/confirm_reset_data.html b/src/main/java/org/olat/ims/qti21/ui/_content/confirm_reset_data.html new file mode 100644 index 0000000000000000000000000000000000000000..dc8558725afb89b62eecf5ce6bc1df798e18e859 --- /dev/null +++ b/src/main/java/org/olat/ims/qti21/ui/_content/confirm_reset_data.html @@ -0,0 +1,4 @@ +<div class="o_error clearfix"> + <i class="o_icon o_icon-lg o_icon_important"> </i> $msg +</div> +$r.render("confirm") \ No newline at end of file diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties index 7c92b57d65ce2b7fb434a8f1ce33e061b4d71cc0..60d1c24e11adf10c4fcb0c0f4038038229a39e83 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties @@ -55,6 +55,7 @@ confirm.finish.test.title=Test beenden confirm.finish.testpart.text=Sind Sie sicher dass Sie den Test Part beenden wollen? Ihre Antworten werden dadurch gespeichert.\u00A0 confirm.finish.testpart.title=Test Part beenden confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend +confirmation=Bestätigung correction=Korrigieren debug.outcomes=Output Daten debug.responses=Antworten Daten @@ -113,11 +114,14 @@ qti.form.summary.section=$org.olat.course.nodes.iq\:qti.form.summary.section question.progress.answered=Antwortet question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints -reset.test.data.text=Wollen Sie wirklich alle Daten von dem Test zur\u00FCcksetzen? Die Resultate werden definitiv gel\u00F6scht. +reset.data=Daten zur\u00FCcksetzen +reset.test.data.acknowledge=Ich verstehe dass die Daten werden endg\u00FCltig gel\u00F6scht. +reset.test.data.text=Wollen Sie wirklich alle Daten von dem Test zur\u00FCcksetzen? Die Resultate von <strong>{0} Benutzer</strong> werden definitiv gel\u00F6scht. reset.test.data.text.ref=Sie k\u00F6nnen nicht alle Daten von dem Test weil noch an diesem Ressourcen "{0}" verbunden ist. reset.test.data.title=Daten von Test zur\u00FCcksetzen results.duration=Dauer results.end.time=Enddatum +results.empty=Es wurden keine Resultate gefunden, die angezeigt werden k\u00F6nnen. results.entry.time=Startdatum results.score.yourscore=$org.olat.course.nodes.iq\:score.yourscore results.session.status=Status diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties index 0c45e98a3bbf18e294e783be4a9fcf6a4df905c8..d04b3de38273f6cb7f57a7aa8a23a12c5ae920cc 100644 --- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties @@ -55,6 +55,7 @@ confirm.finish.test.title=Finish test confirm.finish.testpart.text=Finish / Are you sure? This will commit your answers for this test part. confirm.finish.testpart.title=Finish test part confirm.suspend.test=$org.olat.modules.iq\:confirmSuspend +confirmation=Confirmation correction=Grade debug.outcomes=Output data debug.responses=Responses data @@ -113,10 +114,13 @@ qti.form.summary.section=$org.olat.course.nodes.iq\:qti.form.summary.section question.progress.answered=Answered question.progress.noMaxScore=$org.olat.modules.iq\:noMaxScore question.progress.score=$org.olat.modules.iq\:actualPoints -reset.test.data.text=Do you really want to reset the assessment data of test? The results will be definitively deleted. +reset.data=Reset data +reset.test.data.acknowledge=I understand that the data will be definitely deleted. +reset.test.data.text=Do you really want to reset the assessment data of test? The results of <strong>{0} users</strong> will be definitively deleted. reset.test.data.text.ref=You cannot delete all the data of this test because it's referenced by the following ressources "{0}". reset.test.data.title=Reset data of test results.duration=Duration +results.empty=No results found that could be displayed. results.end.time=End date results.entry.time=Start date results.score.yourscore=$org.olat.course.nodes.iq\:score.yourscore diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentTestCorrectionController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentTestCorrectionController.java index f775f8e305f896934ba28d9d71600e54538a2e4e..78114e8324439400ea6d44f4d1efe0aac48f1f85 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentTestCorrectionController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/IdentitiesAssessmentTestCorrectionController.java @@ -39,7 +39,6 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.id.Identity; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.fileresource.FileResourceManager; @@ -47,6 +46,7 @@ import org.olat.ims.qti21.AssessmentItemSession; import org.olat.ims.qti21.AssessmentTestHelper; import org.olat.ims.qti21.AssessmentTestSession; import org.olat.ims.qti21.QTI21Service; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/ims/qti21/ui/assessment/QTI21CorrectionToolController.java b/src/main/java/org/olat/ims/qti21/ui/assessment/QTI21CorrectionToolController.java index 21be668cf5d01e2fff3a0cbd76a9f58c58b73c3e..d208d656568256e2db5fb27e6922a460b6f00934 100644 --- a/src/main/java/org/olat/ims/qti21/ui/assessment/QTI21CorrectionToolController.java +++ b/src/main/java/org/olat/ims/qti21/ui/assessment/QTI21CorrectionToolController.java @@ -34,12 +34,12 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.course.assessment.AssessmentHelper; -import org.olat.course.nodes.AssessmentToolOptions; import org.olat.course.nodes.IQTESTCourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.scoring.ScoreEvaluation; import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.ims.qti21.AssessmentTestSession; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.assessment.ui.event.CompleteAssessmentTestSessionEvent; /** diff --git a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java index e1aef9a596a36be03dc9d1e831bd7759faef1131..29709d026e3027d1718af8104917da17a2f0d67e 100644 --- a/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java +++ b/src/main/java/org/olat/ims/qti21/ui/statistics/QTI21StatisticsToolController.java @@ -45,14 +45,14 @@ import org.olat.core.id.context.StateEntry; import org.olat.core.util.nodes.INode; import org.olat.core.util.resource.OresHelper; import org.olat.course.nodes.ArchiveOptions; -import org.olat.course.nodes.AssessmentToolOptions; -import org.olat.course.nodes.AssessmentToolOptions.AlternativeToIdentities; import org.olat.course.nodes.QTICourseNode; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.statistic.StatisticResourceNode; import org.olat.ims.qti21.QTI21DeliveryOptions; import org.olat.ims.qti21.QTI21Service; import org.olat.ims.qti21.model.QTI21StatisticSearchParams; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.modules.assessment.AssessmentToolOptions.AlternativeToIdentities; import org.olat.repository.RepositoryEntry; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/org/olat/course/nodes/AssessmentToolOptions.java b/src/main/java/org/olat/modules/assessment/AssessmentToolOptions.java similarity index 98% rename from src/main/java/org/olat/course/nodes/AssessmentToolOptions.java rename to src/main/java/org/olat/modules/assessment/AssessmentToolOptions.java index da31805994e51151ae7352a35541adbbb2980af3..3a455f0419eb643bd258961c12517063183fbdff 100644 --- a/src/main/java/org/olat/course/nodes/AssessmentToolOptions.java +++ b/src/main/java/org/olat/modules/assessment/AssessmentToolOptions.java @@ -17,7 +17,7 @@ * frentix GmbH, http://www.frentix.com * <p> */ -package org.olat.course.nodes; +package org.olat.modules.assessment; import java.util.List; diff --git a/src/main/java/org/olat/modules/assessment/ui/AssessableResource.java b/src/main/java/org/olat/modules/assessment/ui/AssessableResource.java index 03396323d994b036f2d9c608c11fbdedb2de8afb..6bce24068d3ced6ed917d8a039dca5046ba8a175 100644 --- a/src/main/java/org/olat/modules/assessment/ui/AssessableResource.java +++ b/src/main/java/org/olat/modules/assessment/ui/AssessableResource.java @@ -19,13 +19,22 @@ */ package org.olat.modules.assessment.ui; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.repository.RepositoryEntry; + /** * * Initial date: 24.05.2016<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class AssessableResource { +public abstract class AssessableResource { private Double minScore; private Double maxScore; @@ -74,5 +83,8 @@ public class AssessableResource { public boolean hasCommentConfigured() { return hasComments; } + + public abstract List<Controller> createAssessmentTools(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, + RepositoryEntry entry, AssessmentToolOptions options); } diff --git a/src/main/java/org/olat/modules/assessment/ui/AssessedIdentityListController.java b/src/main/java/org/olat/modules/assessment/ui/AssessedIdentityListController.java index b806e52ffa44f8a80fbc3e9cf85d4b1126391941..591f4e132eef21f39b0f083c92e3289ec0dbac18 100644 --- a/src/main/java/org/olat/modules/assessment/ui/AssessedIdentityListController.java +++ b/src/main/java/org/olat/modules/assessment/ui/AssessedIdentityListController.java @@ -44,6 +44,7 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTable import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.stack.BreadcrumbPanelAware; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.stack.TooledStackedPanel.Align; import org.olat.core.gui.control.Controller; @@ -66,6 +67,7 @@ import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.model.SearchBusinessGroupParams; import org.olat.modules.assessment.AssessmentEntry; +import org.olat.modules.assessment.AssessmentToolOptions; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.modules.assessment.ui.AssessedIdentityListTableModel.IdentityCourseElementCols; import org.olat.repository.RepositoryEntry; @@ -87,6 +89,7 @@ public class AssessedIdentityListController extends FormBasicController implemen private final RepositoryEntry testEntry; private final AssessableResource element; private final boolean isAdministrativeUser; + private SearchAssessedIdentityParams searchParams; private final List<UserPropertyHandler> userPropertyHandlers; private final AssessmentToolSecurityCallback assessmentCallback; @@ -94,7 +97,8 @@ public class AssessedIdentityListController extends FormBasicController implemen private FlexiTableElement tableEl; private final TooledStackedPanel stackPanel; private AssessedIdentityListTableModel usersTableModel; - + + private List<Controller> toolsCtrl; private AssessedIdentityController currentIdentityCtrl; @Autowired @@ -111,7 +115,7 @@ public class AssessedIdentityListController extends FormBasicController implemen private RepositoryHandlerFactory repositoryHandlerFactory; public AssessedIdentityListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, - RepositoryEntry testEntry, AssessableResource element, AssessmentToolSecurityCallback assessmentCallback) { + RepositoryEntry testEntry, AssessableResource element, AssessmentToolSecurityCallback assessmentCallback) { super(ureq, wControl, "identity_element"); setTranslator(Util.createPackageTranslator(AssessmentModule.class, getLocale(), getTranslator())); setTranslator(userManager.getPropertyHandlerTranslator(getTranslator())); @@ -199,9 +203,18 @@ public class AssessedIdentityListController extends FormBasicController implemen tableEl.setExtendedFilterButton(translate("filter.groups"), groupFilters); } } + + } + + public class AToolsOptions extends AssessmentToolOptions { + + @Override + public List<Identity> getIdentities() { + return assessmentToolManager.getAssessedIdentities(getIdentity(), searchParams); + } } - private void updateModel(String searchString, List<FlexiTableFilter> filters, List<FlexiTableFilter> extendedFilters) { + private void updateModel(UserRequest ureq, String searchString, List<FlexiTableFilter> filters, List<FlexiTableFilter> extendedFilters) { SearchAssessedIdentityParams params = new SearchAssessedIdentityParams(testEntry, null, testEntry, assessmentCallback); List<AssessmentEntryStatus> assessmentStatus = null; @@ -248,6 +261,34 @@ public class AssessedIdentityListController extends FormBasicController implemen usersTableModel.filter(Collections.singletonList(filters.get(0))); } tableEl.reloadData(); + searchParams = params; + + List<String> toolCmpNames = new ArrayList<>(); + AssessmentToolOptions asOptions = new AssessmentToolOptions(); + asOptions.setAdmin(assessmentCallback.isAdmin()); + asOptions.setIdentities(assessedIdentities); + List<Controller> tools = element.createAssessmentTools(ureq, getWindowControl(), stackPanel, + testEntry, asOptions); + int count = 0; + if(tools.size() > 0) { + for(Controller tool:tools) { + listenTo(tool); + String toolCmpName = "ctrl_" + (count++); + flc.put(toolCmpName, tool.getInitialComponent()); + toolCmpNames.add(toolCmpName); + if(tool instanceof BreadcrumbPanelAware) { + ((BreadcrumbPanelAware)tool).setBreadcrumbPanel(stackPanel); + } + } + } + + if(toolsCtrl != null) { + for(Controller toolCtrl:toolsCtrl) { + removeAsListenerAndDispose(toolCtrl); + } + } + toolsCtrl = tools; + flc.contextPut("toolCmpNames", toolCmpNames); } @Override protected void doDispose() { @@ -265,7 +306,7 @@ public class AssessedIdentityListController extends FormBasicController implemen } tableEl.setSelectedFilterKey(filter); - updateModel(null, tableEl.getSelectedFilters(), null); + updateModel(ureq, null, tableEl.getSelectedFilters(), null); if(entries != null && entries.size() > 0) { String resourceType = entries.get(0).getOLATResourceable().getResourceableTypeName(); @@ -300,13 +341,17 @@ public class AssessedIdentityListController extends FormBasicController implemen public void event(UserRequest ureq, Controller source, Event event) { if(currentIdentityCtrl == source) { if(event == Event.CHANGED_EVENT) { - updateModel(null, null, null); + updateModel(ureq, null, null, null); } else if(event == Event.DONE_EVENT) { - updateModel(null, null, null); + updateModel(ureq, null, null, null); stackPanel.popController(currentIdentityCtrl); } else if(event == Event.CANCELLED_EVENT) { stackPanel.popController(currentIdentityCtrl); } + } else if(toolsCtrl != null && toolsCtrl.contains(source)) { + if(event == Event.CHANGED_EVENT) { + updateModel(ureq, null, null, null); + } } super.event(ureq, source, event); } @@ -323,7 +368,7 @@ public class AssessedIdentityListController extends FormBasicController implemen } } else if(event instanceof FlexiTableSearchEvent) { FlexiTableSearchEvent ftse = (FlexiTableSearchEvent)event; - updateModel(ftse.getSearch(), ftse.getFilters(), ftse.getExtendedFilters()); + updateModel(ureq, ftse.getSearch(), ftse.getFilters(), ftse.getExtendedFilters()); } } diff --git a/src/main/java/org/olat/modules/assessment/ui/_content/identity_element.html b/src/main/java/org/olat/modules/assessment/ui/_content/identity_element.html index 74005495897626be7e3b5016cf59c51ba5b701f3..552eea214ecb278c41f56f6fcf27e9848e9e59e4 100644 --- a/src/main/java/org/olat/modules/assessment/ui/_content/identity_element.html +++ b/src/main/java/org/olat/modules/assessment/ui/_content/identity_element.html @@ -1,2 +1,10 @@ <h2><i class="o_icon $cssClass"> </i> $r.escapeHtml($title)</h2> +#if($r.isNotEmpty($toolCmpNames)) + <div class="o_button_group o_button_group_right"> + #foreach($toolCmpName in $toolCmpNames) + $r.render($toolCmpName) + #end + </div> +#end + $r.render("table") \ No newline at end of file diff --git a/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java b/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java index c25c800cd57135532ebf6d591a80d3b5a899dd25..23238aa06e2bbf4939c0436a3192e1c6144cb7f3 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/BinderRuntimeController.java @@ -38,6 +38,7 @@ import org.olat.modules.assessment.ui.AssessmentToolController; import org.olat.modules.assessment.ui.AssessmentToolSecurityCallback; import org.olat.modules.portfolio.Binder; import org.olat.modules.portfolio.PortfolioService; +import org.olat.modules.portfolio.ui.model.AssessableBinderResource; import org.olat.repository.RepositoryEntry; import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.repository.ui.RepositoryEntryRuntimeController; @@ -210,7 +211,7 @@ public class BinderRuntimeController extends RepositoryEntryRuntimeController { private AssessableResource getAssessableElement() { boolean hasScore = false; boolean hasPassed = true; - return new AssessableResource(hasScore, hasPassed, true, true, null, null, null); + return new AssessableBinderResource(hasScore, hasPassed, true, true, null, null, null); } private void enableRuntimeNavBar(boolean enabled) { diff --git a/src/main/java/org/olat/modules/portfolio/ui/model/AssessableBinderResource.java b/src/main/java/org/olat/modules/portfolio/ui/model/AssessableBinderResource.java new file mode 100644 index 0000000000000000000000000000000000000000..6dd0d9255cf2166e349d70db0d5b6b8e269113b4 --- /dev/null +++ b/src/main/java/org/olat/modules/portfolio/ui/model/AssessableBinderResource.java @@ -0,0 +1,51 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.portfolio.ui.model; + +import java.util.Collections; +import java.util.List; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.control.Controller; +import org.olat.core.gui.control.WindowControl; +import org.olat.modules.assessment.AssessmentToolOptions; +import org.olat.modules.assessment.ui.AssessableResource; +import org.olat.repository.RepositoryEntry; + +/** + * + * Initial date: 7 nov. 2016<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AssessableBinderResource extends AssessableResource { + + public AssessableBinderResource(boolean hasScore, boolean hasPassed, boolean hasAttempts, boolean hasComments, + Double minScore, Double maxScore, Double cutValue) { + super(hasScore, hasPassed, hasAttempts, hasComments, minScore, maxScore, cutValue); + } + + @Override + public List<Controller> createAssessmentTools(UserRequest ureq, WindowControl wControl, + TooledStackedPanel stackPanel, RepositoryEntry entry, AssessmentToolOptions options) { + return Collections.emptyList(); + } +}