Skip to content
Snippets Groups Projects
Commit 395110ee authored by srosse's avatar srosse
Browse files

no-jira: remove the QTI 21 course element and enhance the IQTestCourseNode to...

no-jira: remove the QTI 21 course element and enhance the IQTestCourseNode to handle QTI 1.2, 2.1 and Onyx
parent c16acbc7
No related branches found
No related tags found
No related merge requests found
Showing
with 1028 additions and 1460 deletions
......@@ -174,6 +174,22 @@ public class IQEditForm extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
modConfig.set(IQEditController.CONFIG_KEY_TEMPLATE, getTemplate());
if (!isSurvey) {
modConfig.set(IQEditController.CONFIG_KEY_ATTEMPTS, getAttempts());
modConfig.set(IQEditController.CONFIG_KEY_CUTVALUE, getCutValue());
}
modConfig.set(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, new Boolean(isShowResultsDateDependent()));
modConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, getShowResultsStartDate());
modConfig.set(IQEditController.CONFIG_KEY_RESULTS_END_DATE, getShowResultsEndDate());
modConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, isShowResultsOnHomePage());
//<OLATCE-982>
modConfig.set(IQEditController.CONFIG_KEY_ALLOW_SHOW_SOLUTION, allowShowSolution());
//</OLATCE-982>
//<OLATCE-2009>
modConfig.set(IQEditController.CONFIG_KEY_ALLOW_SUSPENSION_ALLOWED, allowSuspension());
//</OLATCE-2009>
fireEvent(ureq, Event.DONE_EVENT);
}
......
......@@ -97,6 +97,7 @@ public class CourseXStreamAliases {
//start read configuration (mostly for compatibility with OLAT 7.3 and greater)
readXstream.alias("CourseConfig", CourseConfig.class);
readXstream.alias("com.frentix.olat.course.nodes.ViteroCourseNode", ViteroCourseNode.class);
readXstream.alias("org.olat.course.nodes.QTI21AssessmentCourseNode", IQTESTCourseNode.class);
readXstream.alias("CourseEditorTreeModel", CourseEditorTreeModel.class);
readXstream.alias("CourseEditorTreeNode", CourseEditorTreeNode.class);
readXstream.alias("Structure", Structure.class);
......
......@@ -47,9 +47,9 @@ import org.olat.course.assessment.AssessmentManager;
import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription;
import org.olat.course.nodes.iq.CourseIQSecurityCallback;
import org.olat.course.nodes.iq.IQEditController;
import org.olat.course.nodes.iq.IQRunController;
import org.olat.course.nodes.iq.IQUIFactory;
import org.olat.course.run.navigation.NodeRunConstructionResult;
import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.NodeEvaluation;
......@@ -63,6 +63,7 @@ import org.olat.ims.qti.fileresource.TestFileResource;
import org.olat.ims.qti.process.AssessmentInstance;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.iq.IQManager;
import org.olat.modules.iq.IQSecurityCallback;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryImportExport;
import org.olat.repository.RepositoryManager;
......@@ -70,6 +71,7 @@ import org.olat.repository.handlers.RepositoryHandler;
import org.olat.repository.handlers.RepositoryHandlerFactory;
import de.bps.onyx.plugin.OnyxModule;
import de.bps.onyx.plugin.run.OnyxRunController;
/**
* Initial Date: Feb 9, 2004
......@@ -97,10 +99,8 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se
*/
@Override
public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
TabbableController childTabCntrllr = IQUIFactory.createIQSelftestEditController(ureq, wControl, stackPanel, course, this, course.getCourseEnvironment().getCourseGroupManager(), euce);
TabbableController childTabCntrllr = new IQEditController(ureq, wControl, stackPanel, course, this, euce);
CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, euce, childTabCntrllr);
}
......@@ -114,9 +114,18 @@ public class IQSELFCourseNode extends AbstractAccessableCourseNode implements Se
public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
Controller runController = IQUIFactory.createIQSelftestRunController(ureq, wControl, userCourseEnv, this);
Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, runController, this, "o_iqself_icon");
Controller runController;
ModuleConfiguration config = getModuleConfiguration();
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
runController = new OnyxRunController(userCourseEnv, config, ureq, wControl, this);
} else {
IQSecurityCallback sec = new CourseIQSecurityCallback(this, am, ureq.getIdentity());
runController = new IQRunController(userCourseEnv, getModuleConfiguration(), sec, ureq, wControl, this);
}
Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, runController, this, "o_iqself_icon");
return new NodeRunConstructionResult(ctrl);
}
......
......@@ -37,22 +37,26 @@ import org.olat.core.gui.components.stack.BreadcrumbPanel;
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.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.PackageTranslator;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.Roles;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.Util;
import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentManager;
import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription;
import org.olat.course.nodes.iq.CourseIQSecurityCallback;
import org.olat.course.nodes.iq.IQEditController;
import org.olat.course.nodes.iq.IQRunController;
import org.olat.course.nodes.iq.IQUIFactory;
import org.olat.course.properties.CoursePropertyManager;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.navigation.NodeRunConstructionResult;
......@@ -71,12 +75,15 @@ import org.olat.ims.qti.statistics.QTIStatisticSearchParams;
import org.olat.ims.qti.statistics.QTIType;
import org.olat.ims.qti.statistics.ui.QTI12StatisticsToolController;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.iq.IQSecurityCallback;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryImportExport;
import org.olat.repository.RepositoryManager;
import org.olat.repository.handlers.RepositoryHandler;
import org.olat.repository.handlers.RepositoryHandlerFactory;
import de.bps.onyx.plugin.run.OnyxRunController;
/**
* Initial Date: Feb 9, 2004
* @author Mike Stock Comment:
......@@ -105,7 +112,7 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT
*/
@Override
public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
TabbableController childTabCntrllr = IQUIFactory.createIQSurveyEditController(ureq, wControl, stackPanel, course, this, course.getCourseEnvironment().getCourseGroupManager(), euce);
TabbableController childTabCntrllr = new IQEditController(ureq, wControl, stackPanel, course, this, euce);
CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, euce, childTabCntrllr);
}
......@@ -119,7 +126,39 @@ public class IQSURVCourseNode extends AbstractAccessableCourseNode implements QT
@Override
public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
Controller controller = IQUIFactory.createIQSurveyRunController(ureq, wControl, userCourseEnv, this);
Controller controller;
// Do not allow guests to start questionnaires
Roles roles = ureq.getUserSession().getRoles();
if (roles.isGuestOnly()) {
Translator trans = Util.createPackageTranslator(IQSURVCourseNode.class, ureq.getLocale());
String title = trans.translate("guestnoaccess.title");
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
ModuleConfiguration config = getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(userCourseEnv, config, ureq, wControl, this);
} else {
RepositoryEntry repositoryEntry = getReferencedRepositoryEntry();
OLATResourceable ores = repositoryEntry.getOlatResource();
Long resId = ores.getResourceableId();
SurveyFileResource fr = new SurveyFileResource();
fr.overrideResourceableId(resId);
if(!CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(fr, null)) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
IQSecurityCallback sec = new CourseIQSecurityCallback(this, am, ureq.getIdentity());
controller = new IQRunController(userCourseEnv, getModuleConfiguration(), sec, ureq, wControl, this);
} else {
Translator trans = Util.createPackageTranslator(IQSURVCourseNode.class, ureq.getLocale());
String title = trans.translate("editor.lock.title");
String message = trans.translate("editor.lock.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
}
}
}
Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_iqsurv_icon");
return new NodeRunConstructionResult(ctrl);
}
......
......@@ -37,15 +37,18 @@ import org.olat.core.gui.components.stack.BreadcrumbPanel;
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.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.Roles;
import org.olat.core.logging.DBRuntimeException;
import org.olat.core.logging.KnownIssueException;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.Util;
import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.core.util.resource.OresHelper;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentManager;
......@@ -53,9 +56,12 @@ import org.olat.course.auditing.UserNodeAuditManager;
import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription;
import org.olat.course.nodes.iq.CourseIQSecurityCallback;
import org.olat.course.nodes.iq.IQEditController;
import org.olat.course.nodes.iq.IQPreviewController;
import org.olat.course.nodes.iq.IQRunController;
import org.olat.course.nodes.iq.IQUIFactory;
import org.olat.course.nodes.iq.QTI21AssessmentDetailsController;
import org.olat.course.nodes.iq.QTI21AssessmentRunController;
import org.olat.course.properties.CoursePropertyManager;
import org.olat.course.run.environment.CourseEnvironment;
import org.olat.course.run.navigation.NodeRunConstructionResult;
......@@ -64,6 +70,7 @@ import org.olat.course.run.userview.NodeEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.course.statistic.StatisticResourceOption;
import org.olat.course.statistic.StatisticResourceResult;
import org.olat.fileresource.types.ImsQTI21Resource;
import org.olat.ims.qti.QTI12ResultDetailsController;
import org.olat.ims.qti.QTIResultManager;
import org.olat.ims.qti.QTIResultSet;
......@@ -77,15 +84,18 @@ import org.olat.ims.qti.statistics.QTIStatisticSearchParams;
import org.olat.ims.qti.statistics.QTIType;
import org.olat.ims.qti.statistics.ui.QTI12StatisticsToolController;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.iq.IQSecurityCallback;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryEntryImportExport;
import org.olat.repository.RepositoryManager;
import org.olat.repository.handlers.RepositoryHandler;
import org.olat.repository.handlers.RepositoryHandlerFactory;
import org.olat.resource.OLATResource;
import de.bps.ims.qti.QTIResultDetailsController;
import de.bps.onyx.plugin.OnyxExportManager;
import de.bps.onyx.plugin.OnyxModule;
import de.bps.onyx.plugin.run.OnyxRunController;
/**
* Initial Date: Feb 9, 2004
......@@ -111,22 +121,51 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements As
@Override
public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, UserCourseEnvironment euce) {
updateModuleConfigDefaults(false);
TabbableController childTabCntrllr = IQUIFactory.createIQTestEditController(ureq, wControl, stackPanel, course, this, course.getCourseEnvironment().getCourseGroupManager(), euce);
TabbableController childTabCntrllr = new IQEditController(ureq, wControl, stackPanel, course, this, euce);
CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, euce, childTabCntrllr);
}
/**
* @see org.olat.course.nodes.CourseNode#createNodeRunConstructionResult(org.olat.core.gui.UserRequest,
* org.olat.core.gui.control.WindowControl,
* org.olat.course.run.userview.UserCourseEnvironment,
* org.olat.course.run.userview.NodeEvaluation)
*/
@Override
public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
updateModuleConfigDefaults(false);
Controller controller = IQUIFactory.createIQTestRunController(ureq, wControl, userCourseEnv, this);
Controller controller;
// Do not allow guests to start tests
Roles roles = ureq.getUserSession().getRoles();
Translator trans = Util.createPackageTranslator(IQTESTCourseNode.class, ureq.getLocale());
if (roles.isGuestOnly()) {
String title = trans.translate("guestnoaccess.title");
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
ModuleConfiguration config = getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(userCourseEnv, config, ureq, wControl, this);
} else {
RepositoryEntry repositoryEntry = getReferencedRepositoryEntry();
OLATResource ores = repositoryEntry.getOlatResource();
if(ImsQTI21Resource.TYPE_NAME.equals(ores.getResourceableTypeName())) {
//QTI 2.1
controller = new QTI21AssessmentRunController(ureq, wControl, userCourseEnv, this);
} else {
//QTI 1.2
TestFileResource fr = new TestFileResource();
fr.overrideResourceableId(ores.getResourceableId());
if(!CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(fr, null)) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
IQSecurityCallback sec = new CourseIQSecurityCallback(this, am, ureq.getIdentity());
controller = new IQRunController(userCourseEnv, getModuleConfiguration(), sec, ureq, wControl, this);
} else {
String title = trans.translate("editor.lock.title");
String message = trans.translate("editor.lock.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
}
}
}
}
Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_iqtest_icon");
return new NodeRunConstructionResult(ctrl);
}
......@@ -139,7 +178,15 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements As
*/
@Override
public Controller createPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, NodeEvaluation ne) {
return IQUIFactory.createIQTestPreviewController(ureq, wControl, userCourseEnv, this);
Controller controller;
ModuleConfiguration config = getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(ureq, wControl, this);
} else {
controller = new IQPreviewController(ureq, wControl, userCourseEnv, this);
}
return controller;
}
@Override
......@@ -159,9 +206,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements As
OLATResourceable courseOres = OresHelper.createOLATResourceableInstance("CourseModule", courseId);
QTIStatisticSearchParams searchParams = new QTIStatisticSearchParams(courseOres.getResourceableId(), getIdent());
searchParams.setLimitToGroups(options.getParticipantsGroups());
QTIStatisticResourceResult result = new QTIStatisticResourceResult(courseOres, this, searchParams);
return result;
return new QTIStatisticResourceResult(courseOres, this, searchParams);
}
@Override
......@@ -174,7 +219,7 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements As
if(types.length == 0 || (types.length == 1 && types[0] == null)) return true;
for(QTIType type:types) {
if(QTIType.test.equals(type) || QTIType.onyx.equals(type)) {
if(QTIType.test.equals(type) || QTIType.onyx.equals(type) || QTIType.qtiworks.equals(type)) {
return true;
}
}
......@@ -557,15 +602,22 @@ public class IQTESTCourseNode extends AbstractAccessableCourseNode implements As
*/
@Override
public Controller getDetailsEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, UserCourseEnvironment userCourseEnvironment) {
Controller detailsCtrl = null;
RepositoryEntry ref = getReferencedRepositoryEntry();
Long courseResourceableId = userCourseEnvironment.getCourseEnvironment().getCourseResourceableId();
Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
boolean onyx = OnyxModule.isOnyxTest(ref.getOlatResource());
if(onyx) {
return new QTIResultDetailsController(courseResourceableId, getIdent(), assessedIdentity, ref, AssessmentInstance.QMD_ENTRY_TYPE_ASSESS, ureq, wControl);
} else {
return new QTI12ResultDetailsController(ureq, wControl, courseResourceableId, getIdent(), assessedIdentity, ref, AssessmentInstance.QMD_ENTRY_TYPE_ASSESS);
if(ref != null) {
OLATResource resource = ref.getOlatResource();
Long courseResourceableId = userCourseEnvironment.getCourseEnvironment().getCourseResourceableId();
Identity assessedIdentity = userCourseEnvironment.getIdentityEnvironment().getIdentity();
if(ImsQTI21Resource.TYPE_NAME.equals(resource.getResourceableTypeName())) {
detailsCtrl = new QTI21AssessmentDetailsController(ureq, wControl, userCourseEnvironment, this);
} else if(OnyxModule.isOnyxTest(ref.getOlatResource())) {
detailsCtrl = new QTIResultDetailsController(courseResourceableId, getIdent(), assessedIdentity, ref, AssessmentInstance.QMD_ENTRY_TYPE_ASSESS, ureq, wControl);
} else {
detailsCtrl = new QTI12ResultDetailsController(ureq, wControl, courseResourceableId, getIdent(), assessedIdentity, ref, AssessmentInstance.QMD_ENTRY_TYPE_ASSESS);
}
}
return detailsCtrl;
}
/**
......
/**
* <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.course.nodes;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.zip.ZipOutputStream;
import org.olat.core.CoreSpringFactory;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.stack.BreadcrumbPanel;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.Identity;
import org.olat.core.id.Roles;
import org.olat.core.logging.OLATRuntimeException;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentManager;
import org.olat.course.auditing.UserNodeAuditManager;
import org.olat.course.editor.CourseEditorEnv;
import org.olat.course.editor.NodeEditController;
import org.olat.course.editor.StatusDescription;
import org.olat.course.nodes.qti21.QTI21AssessmentDetailsController;
import org.olat.course.nodes.qti21.QTI21AssessmentRunController;
import org.olat.course.nodes.qti21.QTI21EditController;
import org.olat.course.run.navigation.NodeRunConstructionResult;
import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.NodeEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.modules.ModuleConfiguration;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
/**
*
* Initial date: 19.05.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class QTI21AssessmentCourseNode extends AbstractAccessableCourseNode implements AssessableCourseNode {
private static final long serialVersionUID = -3619170190576867622L;
private final static String PACKAGE_QTI21 = Util.getPackageName(QTI21EditController.class);
public static final String CONFIG_KEY_REPOSITORY_SOFTKEY = "repoSoftkey";
public static final String CONFIG_KEY_ENABLESCOREINFO = "enableScoreInfo";
public static final String CONFIG_KEY_BLOCK_AFTER_SUCCESS = "blockAfterSuccess";
public final static String CONFIG_FULLWINDOW = "fullwindow";
public static final String CONFIG_KEY_MINSCORE = "minscore";
public static final String CONFIG_KEY_MAXSCORE = "maxscore";
public static final String CONFIG_KEY_CUTVALUE = "cutvalue";
public static final String CONFIG_KEY_ATTEMPTS = "attempts";
public static final String TYPE = "qti21assessment";
private static final int CURRENT_CONFIG_VERSION = 1;
public QTI21AssessmentCourseNode() {
super(TYPE);
updateModuleConfigDefaults(true);
}
@Override
public boolean needsReferenceToARepositoryEntry() {
return true;
}
@Override
public RepositoryEntry getReferencedRepositoryEntry() {
String repoSoftkey = getModuleConfiguration().getStringValue(CONFIG_KEY_REPOSITORY_SOFTKEY);
if (repoSoftkey == null) {
return null;
}
return CoreSpringFactory.getImpl(RepositoryManager.class)
.lookupRepositoryEntryBySoftkey(repoSoftkey, false);
}
@Override
public void updateModuleConfigDefaults(boolean isNewNode) {
ModuleConfiguration config = getModuleConfiguration();
if(isNewNode) {
//setup default configuration:
//layout
config.set(QTI21AssessmentCourseNode.CONFIG_FULLWINDOW, Boolean.TRUE);
//configure grading
config.set(MSCourseNode.CONFIG_KEY_HAS_SCORE_FIELD, Boolean.FALSE);
config.set(MSCourseNode.CONFIG_KEY_SCORE_MIN, new Float(0));
config.set(MSCourseNode.CONFIG_KEY_SCORE_MAX, new Float(0));
config.set(MSCourseNode.CONFIG_KEY_HAS_PASSED_FIELD, Boolean.TRUE);
config.setConfigurationVersion(CURRENT_CONFIG_VERSION);
} else {
config.setConfigurationVersion(CURRENT_CONFIG_VERSION);
}
}
@Override
public StatusDescription isConfigValid() {
if (oneClickStatusCache != null && oneClickStatusCache.length > 0) {
return oneClickStatusCache[0];
}
List<StatusDescription> statusDescs = validateInternalConfiguration(null);
if(statusDescs.isEmpty()) {
statusDescs.add(StatusDescription.NOERROR);
}
oneClickStatusCache = StatusDescriptionHelper.sort(statusDescs);
return oneClickStatusCache[0];
}
@Override
public StatusDescription[] isConfigValid(CourseEditorEnv cev) {
oneClickStatusCache = null;//delete the cache
List<StatusDescription> sds = isConfigValidWithTranslator(cev, PACKAGE_QTI21, getConditionExpressions());
if(oneClickStatusCache != null && oneClickStatusCache.length > 0) {
//isConfigValidWithTranslator add first
sds.remove(oneClickStatusCache[0]);
}
sds.addAll(validateInternalConfiguration(cev));
oneClickStatusCache = StatusDescriptionHelper.sort(sds);
return oneClickStatusCache;
}
private List<StatusDescription> validateInternalConfiguration(CourseEditorEnv cev) {
List<StatusDescription> sdList = new ArrayList<>(5);
ModuleConfiguration config = getModuleConfiguration();
String repoEntrySoftKey = config.getStringValue(CONFIG_KEY_REPOSITORY_SOFTKEY);
if(!StringHelper.containsNonWhitespace(repoEntrySoftKey)) {
addStatusErrorDescription("error.missing.score.config", QTI21EditController.PANE_TAB_CONFIG_RE, sdList);
}
return sdList;
}
private void addStatusErrorDescription(String key, String pane, List<StatusDescription> status) {
String[] params = new String[] { getShortTitle() };
StatusDescription sd = new StatusDescription(StatusDescription.ERROR, key, key, params, PACKAGE_QTI21);
sd.setDescriptionForUnit(getIdent());
sd.setActivateableViewIdentifier(pane);
status.add(sd);
}
@Override
public void exportNode(File fExportDirectory, ICourse course) {
super.exportNode(fExportDirectory, course);
}
@Override
public void importNode(File importDirectory, ICourse course, Identity owner, Locale locale, boolean withReferences) {
super.importNode(importDirectory, course, owner, locale, withReferences);
}
@Override
public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course) {
return super.createInstanceForCopy(isNewTitle, course);
}
@Override
public boolean archiveNodeData(Locale locale, ICourse course, ArchiveOptions options, ZipOutputStream exportStream, String charset) {
return super.archiveNodeData(locale, course, options, exportStream, charset);
}
@Override
public void cleanupOnDelete(ICourse course) {
super.cleanupOnDelete(course);
}
@Override
public boolean hasStatusConfigured() {
return false;
}
@Override
public Float getMaxScoreConfiguration() {
if (!hasScoreConfigured()) {
throw new OLATRuntimeException(QTI21AssessmentCourseNode.class, "getMaxScore not defined when hasScore set to false", null);
}
return getModuleConfiguration().getFloatEntry(MSCourseNode.CONFIG_KEY_SCORE_MAX);
}
@Override
public Float getMinScoreConfiguration() {
return getModuleConfiguration().getFloatEntry(MSCourseNode.CONFIG_KEY_SCORE_MIN);
}
@Override
public Float getCutValueConfiguration() {
return getModuleConfiguration().getFloatEntry(MSCourseNode.CONFIG_KEY_PASSED_CUT_VALUE);
}
@Override
public boolean hasScoreConfigured() {
return true;
}
@Override
public boolean hasPassedConfigured() {
return true;
}
@Override
public boolean hasCommentConfigured() {
return true;
}
@Override
public boolean hasAttemptsConfigured() {
return true;
}
@Override
public boolean hasDetails() {
return true;
}
@Override
public boolean isEditableConfigured() {
return true;
}
@Override
public TabbableController createEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel,
ICourse course, UserCourseEnvironment euce) {
QTI21EditController editCtrl = new QTI21EditController(ureq, wControl, stackPanel, this, course, euce);
CourseNode chosenNode = course.getEditorTreeModel().getCourseNode(euce.getCourseEditorEnv().getCurrentCourseNodeId());
return new NodeEditController(ureq, wControl, course.getEditorTreeModel(), course, chosenNode, euce, editCtrl);
}
@Override
public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
updateModuleConfigDefaults(false);
Controller controller;
// Do not allow guests to start tests
Roles roles = ureq.getUserSession().getRoles();
Translator trans = Util.createPackageTranslator(QTI21AssessmentCourseNode.class, ureq.getLocale());
if (roles.isGuestOnly()) {
String title = trans.translate("guestnoaccess.title");
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
controller = new QTI21AssessmentRunController(ureq, wControl, userCourseEnv, this);
}
Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, controller, this, "o_qtiassessment_icon");
return new NodeRunConstructionResult(ctrl);
}
@Override
public String getDetailsListViewHeaderKey() {
return "table.header.details.qti21test";
}
@Override
public String getDetailsListView(UserCourseEnvironment userCourseEnvironment) {
return "";
}
@Override
public Controller getDetailsEditController(UserRequest ureq, WindowControl wControl,
BreadcrumbPanel stackPanel, UserCourseEnvironment userCourseEnvironment) {
return new QTI21AssessmentDetailsController(ureq, wControl, userCourseEnvironment, this);
}
@Override
public ScoreEvaluation getUserScoreEvaluation(UserCourseEnvironment userCourseEnv) {
// read score from properties save score, passed and attempts information
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity mySelf = userCourseEnv.getIdentityEnvironment().getIdentity();
Boolean passed = am.getNodePassed(this, mySelf);
Float score = am.getNodeScore(this, mySelf);
Long assessmentID = am.getAssessmentID(this, mySelf);
Boolean fullyAssessed = am.getNodeFullyAssessed(this, mySelf);
return new ScoreEvaluation(score, passed, fullyAssessed, assessmentID);
}
@Override
public String getUserUserComment(UserCourseEnvironment userCourseEnv) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
return am.getNodeComment(this, userCourseEnv.getIdentityEnvironment().getIdentity());
}
@Override
public String getUserCoachComment(UserCourseEnvironment userCourseEnv) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
return am.getNodeCoachComment(this, userCourseEnv.getIdentityEnvironment().getIdentity());
}
@Override
public String getUserLog(UserCourseEnvironment userCourseEnv) {
UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
return am.getUserNodeLog(this, userCourseEnv.getIdentityEnvironment().getIdentity());
}
@Override
public Integer getUserAttempts(UserCourseEnvironment userCourseEnv) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
return am.getNodeAttempts(this, assessedIdentity);
}
@Override
public void updateUserScoreEvaluation(ScoreEvaluation scoreEvaluation, UserCourseEnvironment userCourseEnv,
Identity coachingIdentity, boolean incrementAttempts) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
am.saveScoreEvaluation(this, coachingIdentity, assessedIdentity, new ScoreEvaluation(scoreEvaluation.getScore(), scoreEvaluation.getPassed()), userCourseEnv, incrementAttempts);
}
@Override
public void updateUserUserComment(String userComment, UserCourseEnvironment userCourseEnv, Identity coachingIdentity) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
if (userComment != null) {
am.saveNodeComment(this, coachingIdentity, assessedIdentity, userComment);
}
}
@Override
public void incrementUserAttempts(UserCourseEnvironment userCourseEnv) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
am.incrementNodeAttempts(this, assessedIdentity, userCourseEnv);
}
@Override
public void updateUserAttempts(Integer userAttempts, UserCourseEnvironment userCourseEnv, Identity coachingIdentity) {
if (userAttempts != null) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
am.saveNodeAttempts(this, coachingIdentity, assessedIdentity, userAttempts);
}
}
@Override
public void updateUserCoachComment(String coachComment, UserCourseEnvironment userCourseEnv) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
Identity assessedIdentity = userCourseEnv.getIdentityEnvironment().getIdentity();
if (coachComment != null) {
am.saveNodeCoachComment(this, assessedIdentity, coachComment);
}
}
}
\ No newline at end of file
......@@ -126,8 +126,4 @@
<property name="order" value="210" />
</bean>
<bean id="qti21test" class="org.olat.course.nodes.qti21.QTI21AssessmentCourseNodeConfiguration" scope="prototype" >
<property name="order" value="210" />
</bean>
</beans>
\ No newline at end of file
......@@ -120,7 +120,6 @@ public class IQ12EditForm extends FormBasicController {
}
protected boolean validateFormLogic (UserRequest ureq) {
startDateElement.clearError();
endDateElement.clearError();
......@@ -153,6 +152,42 @@ public class IQ12EditForm extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
modConfig.set(IQEditController.CONFIG_KEY_DISPLAYMENU, new Boolean(isDisplayMenu()));
modConfig.set(IQEditController.CONFIG_FULLWINDOW, new Boolean(isFullWindow()));
if (isDisplayMenu()) {
modConfig.set(IQEditController.CONFIG_KEY_RENDERMENUOPTION, isMenuRenderSectionsOnly());
modConfig.set(IQEditController.CONFIG_KEY_ENABLEMENU, new Boolean(isEnableMenu()));
} else {
// set default values when menu is not displayed
modConfig.set(IQEditController.CONFIG_KEY_RENDERMENUOPTION, Boolean.FALSE);
modConfig.set(IQEditController.CONFIG_KEY_ENABLEMENU, Boolean.FALSE);
}
modConfig.set(IQEditController.CONFIG_KEY_QUESTIONPROGRESS, new Boolean(isDisplayQuestionProgress()));
modConfig.set(IQEditController.CONFIG_KEY_SEQUENCE, getSequence());
modConfig.set(IQEditController.CONFIG_KEY_ENABLECANCEL, new Boolean(isEnableCancel()));
modConfig.set(IQEditController.CONFIG_KEY_ENABLESUSPEND, new Boolean(isEnableSuspend()));
modConfig.set(IQEditController.CONFIG_KEY_QUESTIONTITLE, new Boolean(isDisplayQuestionTitle()));
modConfig.set(IQEditController.CONFIG_KEY_AUTOENUM_CHOICES, new Boolean(isAutoEnumChoices()));
modConfig.set(IQEditController.CONFIG_KEY_MEMO, new Boolean(isProvideMemoField()));
// Only tests and selftests have summaries and score progress
if (!isSurvey) {
modConfig.set(IQEditController.CONFIG_KEY_SUMMARY, getSummary());
modConfig.set(IQEditController.CONFIG_KEY_SCOREPROGRESS, new Boolean(isDisplayScoreProgress()));
modConfig.set(IQEditController.CONFIG_KEY_ENABLESCOREINFO, new Boolean(isEnableScoreInfo()));
modConfig.set(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, new Boolean(isShowResultsDateDependent()));
modConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, getShowResultsStartDate());
modConfig.set(IQEditController.CONFIG_KEY_RESULTS_END_DATE, getShowResultsEndDate());
modConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_FINISH, isShowResultsAfterFinishTest());
modConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, isShowResultsOnHomePage());
}
// Only tests have a limitation on number of attempts
if (isAssessment) {
modConfig.set(IQEditController.CONFIG_KEY_ATTEMPTS, getAttempts());
modConfig.set(IQEditController.CONFIG_KEY_BLOCK_AFTER_SUCCESS, new Boolean(isBlockAfterSuccess()));
}
fireEvent(ureq, Event.DONE_EVENT);
}
......@@ -428,65 +463,72 @@ public class IQ12EditForm extends FormBasicController {
flc.setDirty(true);
}
private boolean isDisplayMenu() {
return displayMenu.isSelected(0);
}
/**
* @return true: menu is enabled
*/
boolean isEnableMenu() { return enableMenu.isSelected(0); }
/**
* @return true: menu should be displayed
*/
boolean isDisplayMenu() { return displayMenu.isSelected(0); }
private boolean isEnableMenu() {
return enableMenu.isSelected(0);
}
/**
* @return true: menu should be displayed
*/
boolean isFullWindow() { return fullWindowEl.isSelected(0); }
private boolean isFullWindow() {
return fullWindowEl.isSelected(0);
}
/**
* @return true: score progress is enabled
*/
boolean isDisplayScoreProgress() { return displayScoreProgress.isSelected(0); }
private boolean isDisplayScoreProgress() {
return displayScoreProgress.isSelected(0);
}
/**
* @return true: score progress is enabled
*/
boolean isDisplayQuestionProgress() { return displayQuestionProgress.isSelected(0); }
private boolean isDisplayQuestionProgress() { return displayQuestionProgress.isSelected(0); }
/**
* @return true: question title is enabled
*/
boolean isDisplayQuestionTitle() { return displayQuestionTitle.isSelected(0); }
private boolean isDisplayQuestionTitle() { return displayQuestionTitle.isSelected(0); }
/**
* @return true: automatic enumeration of choice options enabled
*/
boolean isAutoEnumChoices() { return autoEnumerateChoices.isSelected(0); }
private boolean isAutoEnumChoices() { return autoEnumerateChoices.isSelected(0); }
/**
* @return true: provide memo field
*/
boolean isProvideMemoField() { return provideMemoField.isSelected(0); }
private boolean isProvideMemoField() { return provideMemoField.isSelected(0); }
/**
* @return sequence configuration: section or item
*/
String getSequence() { return sequence.getSelectedKey(); }
private String getSequence() { return sequence.getSelectedKey(); }
/**
* @return true: cancel is enabled
*/
boolean isEnableCancel() { return enableCancel.isSelected(0); }
private boolean isEnableCancel() { return enableCancel.isSelected(0); }
/**
* @return true: suspend is enabled
*/
boolean isEnableSuspend() { return enableSuspend.isSelected(0); }
private boolean isEnableSuspend() { return enableSuspend.isSelected(0); }
/**
* @return summary type: compact or detailed
*/
String getSummary() { return summary.getSelectedKey();}
private String getSummary() { return summary.getSelectedKey();}
/**
* @return number of max attempts
*/
Integer getAttempts() {
private Integer getAttempts() {
Integer a = attempts.getIntValue();
return a == 0 ? null : attempts.getIntValue();
}
boolean isBlockAfterSuccess() {
private boolean isBlockAfterSuccess() {
return blockAfterSuccess.isSelected(0);
}
......@@ -494,41 +536,41 @@ public class IQ12EditForm extends FormBasicController {
*
* @return true if only section title should be rendered
*/
Boolean isMenuRenderSectionsOnly() { return Boolean.valueOf(menuRenderOptions.getSelectedKey());}
private Boolean isMenuRenderSectionsOnly() { return Boolean.valueOf(menuRenderOptions.getSelectedKey());}
/**
* @return true: score-info on start-page is enabled
*/
boolean isEnableScoreInfo() { return scoreInfo.isSelected(0); }
private boolean isEnableScoreInfo() { return scoreInfo.isSelected(0); }
/**
*
* @return true is the results are shown date dependent
*/
boolean isShowResultsDateDependent() { return showResultsDateDependentButton.isSelected(0); }
private boolean isShowResultsDateDependent() { return showResultsDateDependentButton.isSelected(0); }
/**
*
* @return Returns the start date for the result visibility.
*/
Date getShowResultsStartDate() { return startDateElement.getDate(); }
private Date getShowResultsStartDate() { return startDateElement.getDate(); }
/**
*
* @return Returns the end date for the result visibility.
*/
Date getShowResultsEndDate() { return endDateElement.getDate(); }
private Date getShowResultsEndDate() { return endDateElement.getDate(); }
/**
*
* @return Returns true if the results are shown after test finished.
*/
boolean isShowResultsAfterFinishTest() { return showResultsAfterFinishTest.isSelected(0); }
private boolean isShowResultsAfterFinishTest() { return showResultsAfterFinishTest.isSelected(0); }
/**
*
* @return Returns true if the results are shown on the test home page.
*/
boolean isShowResultsOnHomePage() { return showResultsOnHomePage.isSelected(0); }
private boolean isShowResultsOnHomePage() { return showResultsOnHomePage.isSelected(0); }
@Override
......
This diff is collapsed.
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.course.nodes.iq;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.stack.BreadcrumbPanel;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.course.ICourse;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.IQSELFCourseNode;
import org.olat.course.nodes.IQSURVCourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
public interface IQControllerCreator {
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQTestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQTESTCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce);
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQSelftestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQSELFCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce);
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQSurveyEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQSURVCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce);
/**
*
* @param ureq
* @param wControl
* @param userCourseEnv
* @param ne
* @param courseNode
* @return
*/
public Controller createIQTestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQTESTCourseNode courseNode);
public Controller createIQTestPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQTESTCourseNode courseNode);
public Controller createIQSelftestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQSELFCourseNode courseNode);
public Controller createIQSurveyRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQSURVCourseNode courseNode);
}
\ No newline at end of file
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.course.nodes.iq;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.stack.BreadcrumbPanel;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.messages.MessageUIFactory;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.core.gui.translator.Translator;
import org.olat.core.id.OLATResourceable;
import org.olat.core.id.Roles;
import org.olat.core.util.Util;
import org.olat.core.util.coordinate.CoordinatorManager;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentManager;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.IQSELFCourseNode;
import org.olat.course.nodes.IQSURVCourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.ims.qti.fileresource.SurveyFileResource;
import org.olat.ims.qti.fileresource.TestFileResource;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.iq.IQSecurityCallback;
import org.olat.repository.RepositoryEntry;
import de.bps.onyx.plugin.run.OnyxRunController;
/**
* Description:<br>
* TODO: patrickb Class Description for IQControllerCreatorOlat
*
* <P>
* Initial Date: 18.06.2010 <br>
* @author patrickb
*/
public class IQControllerCreatorOlat implements IQControllerCreator {
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQTestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, IQTESTCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce){
return new IQEditController(ureq, wControl, stackPanel, course, courseNode, euce);
}
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQSelftestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, IQSELFCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce){
return new IQEditController(ureq, wControl, stackPanel, course, courseNode, euce);
}
/**
* The iq test edit screen in the course editor.
* @param ureq
* @param wControl
* @param course
* @param courseNode
* @param groupMgr
* @param euce
* @return
*/
public TabbableController createIQSurveyEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, IQSURVCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce){
return new IQEditController(ureq, wControl, stackPanel, course, courseNode, euce);
}
/**
*
* @param ureq
* @param wControl
* @param userCourseEnv
* @param ne
* @param courseNode
* @return
*/
@Override
public Controller createIQTestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQTESTCourseNode courseNode) {
Controller controller;
// Do not allow guests to start tests
Roles roles = ureq.getUserSession().getRoles();
Translator trans = Util.createPackageTranslator(IQTESTCourseNode.class, ureq.getLocale());
if (roles.isGuestOnly()) {
String title = trans.translate("guestnoaccess.title");
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
ModuleConfiguration config = courseNode.getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(userCourseEnv, config, ureq, wControl, courseNode);
} else {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
IQSecurityCallback sec = new CourseIQSecurityCallback(courseNode, am, ureq.getIdentity());
RepositoryEntry repositoryEntry = courseNode.getReferencedRepositoryEntry();
OLATResourceable ores = repositoryEntry.getOlatResource();
Long resId = ores.getResourceableId();
TestFileResource fr = new TestFileResource();
fr.overrideResourceableId(resId);
if(!CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(fr, null)) {
//QTI1
controller = new IQRunController(userCourseEnv, courseNode.getModuleConfiguration(), sec, ureq, wControl, courseNode);
} else {
String title = trans.translate("editor.lock.title");
String message = trans.translate("editor.lock.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
}
}
}
return controller;
}
@Override
public Controller createIQTestPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQTESTCourseNode courseNode) {
Controller controller;
ModuleConfiguration config = courseNode.getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(ureq, wControl, courseNode);
} else {
controller = new IQPreviewController(ureq, wControl, userCourseEnv, courseNode);
}
return controller;
}
@Override
public Controller createIQSelftestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQSELFCourseNode courseNode) {
Controller controller;
ModuleConfiguration config = courseNode.getModuleConfiguration();
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(userCourseEnv, config, ureq, wControl, courseNode);
} else {
IQSecurityCallback sec = new CourseIQSecurityCallback(courseNode, am, ureq.getIdentity());
controller = new IQRunController(userCourseEnv, courseNode.getModuleConfiguration(), sec, ureq, wControl, courseNode);
}
return controller;
}
@Override
public Controller createIQSurveyRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQSURVCourseNode courseNode) {
Controller controller;
// Do not allow guests to start questionnaires
Roles roles = ureq.getUserSession().getRoles();
if (roles.isGuestOnly()) {
Translator trans = Util.createPackageTranslator(IQSURVCourseNode.class, ureq.getLocale());
String title = trans.translate("guestnoaccess.title");
String message = trans.translate("guestnoaccess.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
} else {
ModuleConfiguration config = courseNode.getModuleConfiguration();
boolean onyx = IQEditController.CONFIG_VALUE_QTI2.equals(config.get(IQEditController.CONFIG_KEY_TYPE_QTI));
if (onyx) {
controller = new OnyxRunController(userCourseEnv, config, ureq, wControl, courseNode);
} else {
RepositoryEntry repositoryEntry = courseNode.getReferencedRepositoryEntry();
OLATResourceable ores = repositoryEntry.getOlatResource();
Long resId = ores.getResourceableId();
SurveyFileResource fr = new SurveyFileResource();
fr.overrideResourceableId(resId);
if(!CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(fr, null)) {
AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager();
IQSecurityCallback sec = new CourseIQSecurityCallback(courseNode, am, ureq.getIdentity());
controller = new IQRunController(userCourseEnv, courseNode.getModuleConfiguration(), sec, ureq, wControl, courseNode);
} else {
Translator trans = Util.createPackageTranslator(IQSURVCourseNode.class, ureq.getLocale());
String title = trans.translate("editor.lock.title");
String message = trans.translate("editor.lock.message");
controller = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
}
}
}
return controller;
}
}
\ No newline at end of file
......@@ -42,7 +42,7 @@ import org.olat.course.run.userview.UserCourseEnvironment;
*
* @author Felix Jost
*/
class IQPreviewController extends BasicController {
public class IQPreviewController extends BasicController {
private PreviewForm pf;
private final UserCourseEnvironment userCourseEnv;
......@@ -55,7 +55,7 @@ class IQPreviewController extends BasicController {
* @param cn
* @param ne
*/
IQPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQTESTCourseNode cn) {
public IQPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv, IQTESTCourseNode cn) {
super(ureq, wControl);
this.userCourseEnv = userCourseEnv;
......@@ -65,9 +65,12 @@ class IQPreviewController extends BasicController {
putInitialPanel(pf.getInitialComponent());
}
@Override
public void event(UserRequest ureq, Component source, Event event) {
//
}
@Override
public void event(UserRequest ureq, Controller source, Event event) {
if (source == pf) {
if (event == Event.DONE_EVENT) {
......@@ -86,6 +89,7 @@ class IQPreviewController extends BasicController {
/**
* @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
*/
@Override
protected void doDispose() {
// nothing to dispose
}
......
......@@ -139,7 +139,7 @@ public class IQRunController extends BasicController implements GenericEventList
* @param wControl
* @param testCourseNode
*/
IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQTESTCourseNode testCourseNode) {
public IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQTESTCourseNode testCourseNode) {
super(ureq, wControl, Util.createPackageTranslator(CourseNode.class, ureq.getLocale()));
this.modConfig = moduleConfiguration;
......@@ -230,7 +230,7 @@ public class IQRunController extends BasicController implements GenericEventList
* @param wControl
* @param selftestCourseNode
*/
IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQSELFCourseNode selftestCourseNode) {
public IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQSELFCourseNode selftestCourseNode) {
super(ureq, wControl, Util.createPackageTranslator(CourseNode.class, ureq.getLocale()));
this.modConfig = moduleConfiguration;
......@@ -271,7 +271,7 @@ public class IQRunController extends BasicController implements GenericEventList
* @param wControl
* @param surveyCourseNode
*/
IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQSURVCourseNode surveyCourseNode) {
public IQRunController(UserCourseEnvironment userCourseEnv, ModuleConfiguration moduleConfiguration, IQSecurityCallback secCallback, UserRequest ureq, WindowControl wControl, IQSURVCourseNode surveyCourseNode) {
super(ureq, wControl, Util.createPackageTranslator(CourseNode.class, ureq.getLocale()));
this.modConfig = moduleConfiguration;
......
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <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>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.course.nodes.iq;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.stack.BreadcrumbPanel;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.tabbable.TabbableController;
import org.olat.course.ICourse;
import org.olat.course.groupsandrights.CourseGroupManager;
import org.olat.course.nodes.IQSELFCourseNode;
import org.olat.course.nodes.IQSURVCourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.run.userview.UserCourseEnvironment;
/**
* Description:<br>
* TODO: patrickb Class Description for IQUIFactory
*
* <P>
* Initial Date: 18.06.2010 <br>
*
* @author patrickb
*/
public class IQUIFactory {
/**
* [SPRING] builds the SpecificControllerCreator as argument in the
* constructor. This "extension point" was created during ONYX integration
* review. It delegates creation to the factory instead of using new
* XXXController(..) creation of different IQxyzRun / IQxyzEdit /
* IQxyzPreviewControllers within the IQxyzCourseNodes.
*/
private static IQControllerCreator iqControllerCreator = new IQControllerCreatorOlat();
public IQUIFactory() {
//
}
public static TabbableController createIQTestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQTESTCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce) {
return IQUIFactory.iqControllerCreator.createIQTestEditController(ureq, wControl, stackPanel, course, courseNode, groupMgr, euce);
}
public static TabbableController createIQSelftestEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQSELFCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce) {
return IQUIFactory.iqControllerCreator.createIQSelftestEditController(ureq, wControl, stackPanel, course, courseNode, groupMgr, euce);
}
public static TabbableController createIQSurveyEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course,
IQSURVCourseNode courseNode, CourseGroupManager groupMgr, UserCourseEnvironment euce) {
return IQUIFactory.iqControllerCreator.createIQSurveyEditController(ureq, wControl, stackPanel, course, courseNode, groupMgr, euce);
}
public static Controller createIQTestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQTESTCourseNode courseNode) {
return IQUIFactory.iqControllerCreator.createIQTestRunController(ureq, wControl, userCourseEnv, courseNode);
}
public static Controller createIQTestPreviewController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQTESTCourseNode courseNode) {
return IQUIFactory.iqControllerCreator.createIQTestPreviewController(ureq, wControl, userCourseEnv, courseNode);
}
public static Controller createIQSelftestRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQSELFCourseNode courseNode) {
return IQUIFactory.iqControllerCreator.createIQSelftestRunController(ureq, wControl, userCourseEnv, courseNode);
}
public static Controller createIQSurveyRunController(UserRequest ureq, WindowControl wControl, UserCourseEnvironment userCourseEnv,
IQSURVCourseNode courseNode) {
return IQUIFactory.iqControllerCreator.createIQSurveyRunController(ureq, wControl, userCourseEnv, courseNode);
}
}
......@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.qti21;
package org.olat.course.nodes.iq;
import java.util.List;
......@@ -39,8 +39,8 @@ 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.id.Identity;
import org.olat.course.nodes.QTI21AssessmentCourseNode;
import org.olat.course.nodes.qti21.QTI21TestSessionTableModel.TSCols;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.nodes.iq.QTI21TestSessionTableModel.TSCols;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.ims.qti21.QTI21Service;
import org.olat.ims.qti21.UserTestSession;
......@@ -61,7 +61,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
private Identity assessedIdentity;
private RepositoryEntry courseEntry;
private QTI21AssessmentCourseNode courseNode;
private IQTESTCourseNode courseNode;
private CloseableModalController cmc;
private AssessmentResultController resultCtrl;
......@@ -70,7 +70,7 @@ public class QTI21AssessmentDetailsController extends FormBasicController {
private QTI21Service qtiService;
public QTI21AssessmentDetailsController(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnvironment, QTI21AssessmentCourseNode courseNode) {
UserCourseEnvironment userCourseEnvironment, IQTESTCourseNode courseNode) {
super(ureq, wControl, "assessment_details");
this.courseNode = courseNode;
......
......@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.qti21;
package org.olat.course.nodes.iq;
import java.text.DateFormat;
import java.util.Date;
......@@ -40,6 +40,7 @@ import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.UserSession;
import org.olat.core.util.Util;
import org.olat.core.util.event.EventBus;
import org.olat.core.util.event.GenericEventListener;
import org.olat.core.util.resource.OresHelper;
......@@ -49,9 +50,8 @@ import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentHelper;
import org.olat.course.auditing.UserNodeAuditManager;
import org.olat.course.nodes.AssessableCourseNode;
import org.olat.course.nodes.QTI21AssessmentCourseNode;
import org.olat.course.nodes.iq.AssessmentEvent;
import org.olat.course.nodes.iq.IQEditController;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.IQTESTCourseNode;
import org.olat.course.run.scoring.ScoreEvaluation;
import org.olat.course.run.userview.UserCourseEnvironment;
import org.olat.ims.qti.process.AssessmentInstance;
......@@ -83,14 +83,14 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
private final UserSession userSession;
private final ModuleConfiguration config;
private final UserCourseEnvironment userCourseEnv;
private final QTI21AssessmentCourseNode courseNode;
private final IQTESTCourseNode courseNode;
private AssessmentTestDisplayController displayCtrl;
private LayoutMain3ColsController displayContainerController;
public QTI21AssessmentRunController(UserRequest ureq, WindowControl wControl,
UserCourseEnvironment userCourseEnv, QTI21AssessmentCourseNode courseNode) {
super(ureq, wControl);
UserCourseEnvironment userCourseEnv, IQTESTCourseNode courseNode) {
super(ureq, wControl, Util.createPackageTranslator(CourseNode.class, ureq.getLocale()));
this.courseNode = courseNode;
this.userCourseEnv = userCourseEnv;
......@@ -98,7 +98,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
config = courseNode.getModuleConfiguration();
singleUserEventCenter = ureq.getUserSession().getSingleUserEventCenter();
mainVC = createVelocityContainer("run");
mainVC = createVelocityContainer("assessment_run");
init();
initAssessment(ureq);
putInitialPanel(mainVC);
......@@ -112,11 +112,11 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
private void initAssessment(UserRequest ureq) {
// config : show score info
boolean enableScoreInfo= config.getBooleanSafe(QTI21AssessmentCourseNode.CONFIG_KEY_ENABLESCOREINFO);
boolean enableScoreInfo= config.getBooleanSafe(IQEditController.CONFIG_KEY_ENABLESCOREINFO);
mainVC.contextPut("enableScoreInfo", new Boolean(enableScoreInfo));
// configuration data
mainVC.contextPut("attemptsConfig", config.get(QTI21AssessmentCourseNode.CONFIG_KEY_ATTEMPTS));
mainVC.contextPut("attemptsConfig", config.get(IQEditController.CONFIG_KEY_ATTEMPTS));
// user data
if (!(courseNode instanceof AssessableCourseNode)) {
throw new AssertException("exposeUserTestDataToVC can only be called for test nodes, not for selftest or questionnaire");
......@@ -126,7 +126,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
ScoreEvaluation scoreEval = acn.getUserScoreEvaluation(userCourseEnv);
//block if test passed (and config set to check it)
boolean blockAfterSuccess = config.getBooleanSafe(QTI21AssessmentCourseNode.CONFIG_KEY_BLOCK_AFTER_SUCCESS);
boolean blockAfterSuccess = config.getBooleanSafe(IQEditController.CONFIG_KEY_BLOCK_AFTER_SUCCESS);
Boolean blocked = Boolean.FALSE;
if(blockAfterSuccess) {
Boolean passed = scoreEval.getPassed();
......@@ -253,7 +253,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
Controller disposedRestartController = new LayoutMain3ColsController(ureq, getWindowControl(), empty, courseCloser.getInitialComponent(), "disposed course while in assessment run " + courseResId);
displayContainerController.setDisposedMessageController(disposedRestartController);
boolean fullWindow = config.getBooleanSafe(QTI21AssessmentCourseNode.CONFIG_FULLWINDOW);
boolean fullWindow = config.getBooleanSafe(IQEditController.CONFIG_FULLWINDOW);
if(fullWindow) {
displayContainerController.setAsFullscreen(ureq);
}
......
......@@ -17,50 +17,62 @@
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.qti21;
package org.olat.course.nodes.iq;
import java.util.Locale;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.Util;
import org.olat.course.nodes.AbstractCourseNodeConfiguration;
import org.olat.course.nodes.CourseNode;
import org.olat.course.nodes.CourseNodeConfiguration;
import org.olat.course.nodes.CourseNodeGroup;
import org.olat.course.nodes.QTI21AssessmentCourseNode;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.elements.SelectionElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.modules.ModuleConfiguration;
/**
*
* Initial date: 23.02.2015<br>
* Initial date: 26.06.2015<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class QTI21AssessmentCourseNodeConfiguration extends AbstractCourseNodeConfiguration {
public class QTI21EditForm extends FormBasicController {
@Override
public CourseNode getInstance() {
return new QTI21AssessmentCourseNode();
private SelectionElement fullWindowEl;
private ModuleConfiguration modConfig;
public QTI21EditForm(UserRequest ureq, WindowControl wControl, ModuleConfiguration modConfig) {
super(ureq, wControl);
this.modConfig = modConfig;
initForm(ureq);
}
@Override
public String getLinkText(Locale locale) {
Translator fallback = Util.createPackageTranslator(CourseNodeConfiguration.class, locale);
Translator translator = Util.createPackageTranslator(this.getClass(), locale, fallback);
return translator.translate("title_qti21assessment");
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
boolean fullWindow = modConfig.getBooleanSafe(IQEditController.CONFIG_FULLWINDOW);
fullWindowEl = uifactory.addCheckboxesHorizontal("fullwindow", "qti.form.fullwindow", formLayout, new String[]{"x"}, new String[]{""});
fullWindowEl.select("x", fullWindow);
uifactory.addSpacerElement("submitSpacer", formLayout, true);
uifactory.addFormSubmitButton("submit", formLayout);
}
@Override
public String getIconCSSClass() {
return "o_qtiassessment_icon";
protected void doDispose() {
//
}
@Override
public String getAlias() {
return "qti21assessment";
}
protected void formOK(UserRequest ureq) {
modConfig.setBooleanEntry(IQEditController.CONFIG_FULLWINDOW, fullWindowEl.isSelected(0));
@Override
public String getGroup() {
return CourseNodeGroup.assessment.name();
fireEvent(ureq, Event.DONE_EVENT);
}
}
......@@ -17,7 +17,7 @@
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.course.nodes.qti21;
package org.olat.course.nodes.iq;
import java.util.Date;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment