diff --git a/src/main/java/org/olat/course/assessment/AssessmentHelper.java b/src/main/java/org/olat/course/assessment/AssessmentHelper.java index 8d240d2d92239ee8657121659691d2bba5d9734a..ca6fa17dd96de8da39897fd6682838af014afbd3 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentHelper.java +++ b/src/main/java/org/olat/course/assessment/AssessmentHelper.java @@ -30,7 +30,6 @@ import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.ParseException; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Map; @@ -57,7 +56,6 @@ import org.olat.course.nodes.CourseNodeConfiguration; import org.olat.course.nodes.CourseNodeFactory; import org.olat.course.nodes.STCourseNode; import org.olat.course.nodes.ScormCourseNode; -import org.olat.course.nodes.iq.IQEditController; import org.olat.course.run.environment.CourseEnvironment; import org.olat.course.run.scoring.AssessmentEvaluation; import org.olat.course.run.scoring.ScoreAccounting; @@ -65,7 +63,6 @@ import org.olat.course.run.userview.UserCourseEnvironment; import org.olat.course.run.userview.UserCourseEnvironmentImpl; import org.olat.course.tree.CourseEditorTreeModel; import org.olat.course.tree.CourseEditorTreeNode; -import org.olat.modules.ModuleConfiguration; /** * Description:<br> @@ -506,28 +503,4 @@ public class AssessmentHelper { } return numOfChildren + 1;//add itself } - - /** - * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br> - * The results are always visible if no date dependent, - * or if date dependent only in the period: startDate-endDate. - * EndDate could be null, that is there is no restriction for the end date. - * - * @return true if is visible. - */ - public static boolean isResultVisible(ModuleConfiguration modConfig) { - boolean isVisible = false; - Boolean showResultsActive = modConfig.getBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); - if(showResultsActive != null && showResultsActive.booleanValue()) { - Date startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE); - Date endDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_END_DATE); - Date currentDate = new Date(); - if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) { - isVisible = true; - } - } else { - isVisible = true; - } - return isVisible; - } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java b/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java index 67ea2ea50325a8b9a36fddd28f88078de432d826..87fdb604f7db669c44b7f605763bdea483c376a2 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java +++ b/src/main/java/org/olat/course/nodes/iq/IQ12EditForm.java @@ -161,7 +161,7 @@ public class IQ12EditForm extends FormBasicController { if (!isSurvey) { modConfig.set(IQEditController.CONFIG_KEY_SUMMARY, getSummary()); 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_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()); @@ -238,8 +238,8 @@ public class IQ12EditForm extends FormBasicController { } Date startDate = null; - if(modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE) instanceof Date) { - startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + if(modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE) instanceof Date) { + startDate = (Date)modConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE); } startDateElement = uifactory.addDateChooser("qti_form_start_date", "qti.form.date.start", null, formLayout); startDateElement.setDateChooserTimeEnabled(true); diff --git a/src/main/java/org/olat/course/nodes/iq/IQEditController.java b/src/main/java/org/olat/course/nodes/iq/IQEditController.java index 5ccffae1ab861376fe2d6b877b64a839dd6ede2e..18b806325109a7c5cb7fb79ac6736c922c690b60 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQEditController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQEditController.java @@ -147,13 +147,17 @@ public class IQEditController extends ActivateableTabbableDefaultController impl public static final String CONFIG_KEY_DATE_DEPENDENT_RESULTS = "dateDependentResults"; public static final String CONFIG_KEY_RESULTS_START_DATE = "resultsStartDate"; public static final String CONFIG_KEY_RESULTS_END_DATE = "resultsEndDate"; + public static final String CONFIG_KEY_RESULTS_FAILED_START_DATE = "failedResultsStartDate"; + public static final String CONFIG_KEY_RESULTS_FAILED_END_DATE = "failedResultsEndDate"; + public static final String CONFIG_KEY_RESULTS_PASSED_START_DATE = "passedResultsStartDate"; + public static final String CONFIG_KEY_RESULTS_PASSED_END_DATE = "passedResultsEndDate"; public static final String CONFIG_KEY_RESULT_ON_FINISH = "showResultsOnFinish"; public static final String CONFIG_KEY_RESULT_ON_HOME_PAGE = "showResultsOnHomePage"; public static final String CONFIG_KEY_IGNORE_IN_COURSE_ASSESSMENT = MSCourseNode.CONFIG_KEY_IGNORE_IN_COURSE_ASSESSMENT; public static final String CONFIG_KEY_DATE_DEPENDENT_TEST = "dateDependentTest"; - public static final String CONFIG_KEY_RESULTS_START_TEST_DATE = "resultsStartTestDate"; - public static final String CONFIG_KEY_RESULTS_END_TEST_DATE = "resultsEndTestDate"; + public static final String CONFIG_KEY_START_TEST_DATE = "resultsStartTestDate"; + public static final String CONFIG_KEY_END_TEST_DATE = "resultsEndTestDate"; public static final String CONFIG_KEY_TEMPLATE = "templateid"; public static final String CONFIG_KEY_TYPE_QTI = "qtitype"; @@ -161,6 +165,11 @@ public class IQEditController extends ActivateableTabbableDefaultController impl public static final String CONFIG_VALUE_QTI21 = "qti2w"; public static final Object CONFIG_VALUE_QTI1 = "qti1"; public static final String CONFIG_KEY_IS_SURVEY = "issurv"; + + public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS = "false"; + public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY = "failedOnly"; + public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT = "different"; + public static final String CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME = "true"; private final String[] paneKeys; diff --git a/src/main/java/org/olat/course/nodes/iq/IQRunController.java b/src/main/java/org/olat/course/nodes/iq/IQRunController.java index b95d5300a9e2e9082f710a7c9edf87b0e7c7e7a2..ce49f699fb66a15b9127f736d5a96c411cfa5c43 100644 --- a/src/main/java/org/olat/course/nodes/iq/IQRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/IQRunController.java @@ -717,7 +717,7 @@ public class IQRunController extends BasicController implements GenericEventList boolean showResultsOnHomePage = (showResultsObj!=null && showResultsObj.booleanValue()); myContent.contextPut("showResultsOnHomePage",new Boolean(showResultsOnHomePage)); myContent.contextPut("in-results", isPanelOpen(ureq, "results", true)); - boolean dateRelatedVisibility = AssessmentHelper.isResultVisible(modConfig); + boolean dateRelatedVisibility = isResultVisible(); if(showResultsOnHomePage && dateRelatedVisibility) { myContent.contextPut("showResultsVisible",Boolean.TRUE); showResultsButton = LinkFactory.createButton("command.showResults", myContent, this); @@ -736,6 +736,71 @@ public class IQRunController extends BasicController implements GenericEventList } } } + + /** + * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br> + * The results are always visible if not date dependent. + * EndDate could be null, that is there is no restriction for the end date. + * + * @return true if is visible. + */ + private boolean isResultVisible() { + boolean isVisible = false; + String showResultsActive = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS); + Date startDate, endDate; + Date passedStartDate, passedEndDate; + Date failedStartDate, failedEndDate; + Date currentDate; + ScoreEvaluation scoreEval = courseAssessmentService.getAssessmentEvaluation(courseNode, userCourseEnv); + + switch (showResultsActive) { + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS: + isVisible = true; + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + currentDate = new Date(); + if(scoreEval.getPassed() && passedStartDate != null && currentDate.after(passedStartDate) && (passedEndDate == null || currentDate.before(passedEndDate))) { + isVisible = true; + break; + } + + failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + if(!scoreEval.getPassed() && failedStartDate != null && currentDate.after(failedStartDate) && (failedEndDate == null || currentDate.before(failedEndDate))) { + isVisible = true; + break; + } + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + if (scoreEval.getPassed()) { + isVisible = false; + break; + } + currentDate = new Date(); + failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + if(!scoreEval.getPassed() && failedStartDate != null && currentDate.after(failedStartDate) && (failedEndDate == null || currentDate.before(failedEndDate))) { + isVisible = true; + break; + } + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + currentDate = new Date(); + if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) { + isVisible = true; + } + break; + default: + isVisible = true; + break; + } + + return isVisible; + } private void exposeUserQuestionnaireDataToVC() { AssessmentManager am = userCourseEnv.getCourseEnvironment().getAssessmentManager(); diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java index bab766a50367b1c2ae4c031f4e26decd3b95cffb..e72382770c69f17945b5a5600f1381a4d4bddbe2 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java @@ -273,9 +273,9 @@ public class QTI21AssessmentRunController extends BasicController implements Gen mainVC.contextPut("passed", scoreEval.getPassed()); mainVC.contextPut("attempts", attempts); //at least one attempt mainVC.contextPut("showChangeLog", Boolean.TRUE && enableScoreInfo); - exposeResults(ureq, true); + exposeResults(ureq, true, scoreEval.getPassed()); } else { - exposeResults(ureq, false); + exposeResults(ureq, false, false); } } else if(courseNode instanceof IQTESTCourseNode) { IQTESTCourseNode testCourseNode = (IQTESTCourseNode)courseNode; @@ -294,11 +294,11 @@ public class QTI21AssessmentRunController extends BasicController implements Gen mainVC.contextPut("enableScoreInfo", Boolean.FALSE); } } else { - Boolean passed = assessmentEntry.getPassed(); + boolean passed = assessmentEntry.getPassed() != null && assessmentEntry.getPassed().booleanValue(); //block if test passed (and config set to check it) Boolean blocked = Boolean.FALSE; boolean blockAfterSuccess = deliveryOptions.isBlockAfterSuccess(); - if(blockAfterSuccess && passed != null && passed.booleanValue()) { + if(blockAfterSuccess && passed) { blocked = Boolean.TRUE; } mainVC.contextPut("blockAfterSuccess", blocked); @@ -306,7 +306,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen boolean resultsVisible = assessmentEntry.getUserVisibility() == null || assessmentEntry.getUserVisibility().booleanValue(); mainVC.contextPut("resultsVisible", resultsVisible); mainVC.contextPut("score", AssessmentHelper.getRoundedScore(assessmentEntry.getScore())); - mainVC.contextPut("hasPassedValue", (passed == null ? Boolean.FALSE : Boolean.TRUE)); + mainVC.contextPut("hasPassedValue", (assessmentEntry.getPassed() == null ? Boolean.FALSE : Boolean.TRUE)); mainVC.contextPut("passed", passed); if(resultsVisible) { if(assessmentConfig.hasComment()) { @@ -349,7 +349,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen } } - exposeResults(ureq, resultsVisible); + exposeResults(ureq, resultsVisible, passed); } } } @@ -360,12 +360,12 @@ public class QTI21AssessmentRunController extends BasicController implements Gen boolean dependOnDate = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, false); if(dependOnDate) { - Date startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE); + Date startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE); if(startTestDate != null) { Formatter formatter = Formatter.getInstance(getLocale()); mainVC.contextPut("startTestDate", formatter.formatDateAndTime(startTestDate)); - Date endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE); + Date endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE); if(endTestDate != null) { mainVC.contextPut("endTestDate", formatter.formatDateAndTime(endTestDate)); } @@ -401,15 +401,16 @@ public class QTI21AssessmentRunController extends BasicController implements Gen * in the velocity template and the CONFIG_KEY_RESULT_ON_HOME_PAGE is not editable * in the configuration of the course element for QTI 2.1!!!! * - * Provides the show results button if results available or a message with the visibility period. + * Provides the show results button if results available or a message with the visibility period + * if there is difference when displaying passed or failed results. * * @param ureq */ - private void exposeResults(UserRequest ureq, boolean resultsVisible) { + private void exposeResults(UserRequest ureq, boolean resultsAvailable, boolean passed) { //migration: check if old tests have no summary configured boolean showResultsOnHomePage = config.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE); QTI21AssessmentResultsOptions showSummary = deliveryOptions.getAssessmentResultsOptions(); - if(resultsVisible && !showSummary.none()) { + if(resultsAvailable && !showSummary.none()) { mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(showResultsOnHomePage)); boolean dateRelatedVisibility = isResultVisible(config); if(showResultsOnHomePage && dateRelatedVisibility) { @@ -426,61 +427,215 @@ public class QTI21AssessmentRunController extends BasicController implements Gen if(isPanelOpen(ureq, "results", true)) { doShowResults(ureq); } - } else if(showResultsOnHomePage) { - exposeVisiblityPeriod(); - mainVC.contextPut("showResultsVisible", Boolean.FALSE); } else { - exposeVisiblityPeriod(); + exposeVisiblityPeriod(passed); mainVC.contextPut("showResultsVisible", Boolean.FALSE); } } else { - exposeVisiblityPeriod(); + exposeVisiblityPeriod(passed); mainVC.contextPut("showResultsVisible", Boolean.FALSE); mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(showResultsOnHomePage && !showSummary.none())); } - if(!anonym && resultsVisible && userCourseEnv.isParticipant()) { + if(!anonym && resultsAvailable && userCourseEnv.isParticipant()) { UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager(); String userLog = am.getUserNodeLog(courseNode, getIdentity()); mainVC.contextPut("log", StringHelper.escapeHtml(userLog)); } } - private void exposeVisiblityPeriod() { - boolean showResultsActive = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); - Date startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); - Date endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); - if(showResultsActive && startDate != null) { - Formatter formatter = Formatter.getInstance(getLocale()); - String visibilityStartDate = formatter.formatDate(startDate); - String visibilityEndDate = "-"; - if(endDate != null) { - visibilityEndDate = formatter.formatDate(endDate); + private void exposeVisiblityPeriod(boolean passed) { + String showResultsActive = config.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); + + Date startDate; + Date endDate; + Date currentDate = new Date(); + + switch (showResultsActive) { + + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS: + mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future")); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + if (passed) { + startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + + if(startDate != null && currentDate.before(startDate)) { + Formatter formatter = Formatter.getInstance(getLocale()); + String visibilityStartDate = formatter.formatDate(startDate); + String visibilityEndDate = "-"; + if(endDate != null && currentDate.before(endDate)) { + visibilityEndDate = formatter.formatDate(endDate); + } else if(endDate != null && currentDate.after(endDate)) { + String visibilityPeriod = translate("showResults.visibility.past"); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate }); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + } else { + startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + + if(startDate != null && currentDate.before(startDate)) { + Formatter formatter = Formatter.getInstance(getLocale()); + String visibilityStartDate = formatter.formatDate(startDate); + String visibilityEndDate = "-"; + if(endDate != null && currentDate.before(endDate)) { + visibilityEndDate = formatter.formatDate(endDate); + } else if(endDate != null && currentDate.after(endDate)) { + String visibilityPeriod = translate("showResults.visibility.past"); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate }); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } } - String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate }); - mainVC.contextPut("visibilityPeriod", visibilityPeriod); - } else { mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future")); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + if (!passed) { + startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + + if(startDate != null && currentDate.before(startDate)) { + Formatter formatter = Formatter.getInstance(getLocale()); + String visibilityStartDate = formatter.formatDate(startDate); + String visibilityEndDate = "-"; + if(endDate != null && currentDate.before(endDate)) { + visibilityEndDate = formatter.formatDate(endDate); + } else if(endDate != null && currentDate.after(endDate)) { + String visibilityPeriod = translate("showResults.visibility.past"); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate }); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + } else { + mainVC.contextPut("showResultsOnHomePage", Boolean.valueOf(false)); + break; + } + mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future")); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + startDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + endDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + + if(startDate != null && currentDate.before(startDate)) { + Formatter formatter = Formatter.getInstance(getLocale()); + String visibilityStartDate = formatter.formatDate(startDate); + String visibilityEndDate = "-"; + if(endDate != null && currentDate.before(endDate)) { + visibilityEndDate = formatter.formatDate(endDate); + } else if(endDate != null && currentDate.after(endDate)) { + String visibilityPeriod = translate("showResults.visibility.past"); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + String visibilityPeriod = translate("showResults.visibility", new String[] { visibilityStartDate, visibilityEndDate }); + mainVC.contextPut("visibilityPeriod", visibilityPeriod); + break; + } + mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future")); + break; + default: + mainVC.contextPut("visibilityPeriod", translate("showResults.visibility.future")); + break; } } + /** + * Evaluates if the results are visble or not in respect of the configured CONFIG_KEY_DATE_DEPENDENT_RESULTS parameter. <br> + * The results are always visible if not date dependent. + * EndDate could be null, that is there is no restriction for the end date. + * + * @return true if is visible. + */ private boolean isResultVisible(ModuleConfiguration modConfig) { boolean isVisible = false; - boolean showResultsActive = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); - if(showResultsActive) { - Date startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); - Date endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); - if(startDate == null && endDate == null) { - isVisible = true; + String showResultsActive = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS); + Date startDate, endDate; + Date passedStartDate, passedEndDate; + Date failedStartDate, failedEndDate; + ScoreEvaluation scoreEval = courseAssessmentService.getAssessmentEvaluation(courseNode, userCourseEnv); + + switch (showResultsActive) { + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS: + isVisible = true; + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + + isVisible = isResultVisible(scoreEval, passedStartDate, passedEndDate, failedStartDate, failedEndDate); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + + isVisible = isResultVisibleFailedOnly(scoreEval, failedStartDate, failedEndDate); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + isVisible = isResultVisible(startDate, endDate); + break; + default: + break; + } + + return isVisible; + } + + private boolean isResultVisible(Date startDate, Date endDate) { + boolean isVisible = true; + Date currentDate = new Date(); + + if (startDate != null && currentDate.before(startDate)) { + isVisible &= false; + } + + if (endDate != null && currentDate.after(endDate)) { + isVisible &= false; + } + + return isVisible; + } + + private boolean isResultVisibleFailedOnly(ScoreEvaluation scoreEval, Date startDate, Date endDate) { + boolean isVisible = scoreEval != null; + + if (isVisible) { + if (scoreEval.getPassed() != null && !scoreEval.getPassed().booleanValue()) { + isVisible &= isResultVisible(startDate, endDate); } else { - Date currentDate = new Date(); - if(startDate != null && currentDate.after(startDate) && (endDate == null || currentDate.before(endDate))) { - isVisible = true; - } + isVisible &= false; + } + } + + return isVisible; + } + + private boolean isResultVisible(ScoreEvaluation scoreEval, Date passedStartDate, Date passedEndDate, Date failedStartDate, Date failedEndDate) { + boolean isVisible = scoreEval != null; + + if (isVisible) { + if (scoreEval.getPassed()) { + isVisible &= isResultVisible(passedStartDate, passedEndDate); + } else { + isVisible &= isResultVisible(failedStartDate, failedEndDate); } - } else { - isVisible = true; } + return isVisible; } @@ -749,9 +904,9 @@ public class QTI21AssessmentRunController extends BasicController implements Gen Date endTestDate = null; boolean dependOnDate = config.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, false); if(dependOnDate) { - startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE); + startTestDate = config.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE); if(startTestDate != null) { - endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE); + endTestDate = config.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE); } } diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java index e389eb100e52f35cfe123b35f6a0e25b541516b3..428763555258886f3025e409dbfde064b0b0cc14 100644 --- a/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java +++ b/src/main/java/org/olat/course/nodes/iq/QTI21EditForm.java @@ -73,13 +73,25 @@ public class QTI21EditForm extends FormBasicController { QTI21AssessmentResultsOptions.QUESTION_SUMMARY, QTI21AssessmentResultsOptions.USER_SOLUTIONS, QTI21AssessmentResultsOptions.CORRECT_SOLUTIONS }; + private static final String dateBase = "date."; + private static final String[] dateKeys = new String[] { + "no", + IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS, + IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY, + IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT, + IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME, + }; + private static final String[] dateValues = new String[dateKeys.length]; private SingleSelection correctionModeEl; - private MultipleSelectionElement showResultsOnHomePage; + private SingleSelection showResultsDateDependentEl; private MultipleSelectionElement scoreInfo; - private MultipleSelectionElement showResultsDateDependentButton; - private DateChooser endDateElement; - private DateChooser startDateElement; + private DateChooser generalEndDateElement; + private DateChooser generalStartDateElement; + private DateChooser failedEndDateElement; + private DateChooser failedStartDateElement; + private DateChooser passedEndDateElement; + private DateChooser passedStartDateElement; private MultipleSelectionElement testDateDependentEl; private DateChooser startTestDateElement; private DateChooser endTestDateElement; @@ -112,6 +124,10 @@ public class QTI21EditForm extends FormBasicController { this.deliveryOptions = (deliveryOptions == null ? new QTI21DeliveryOptions() : deliveryOptions); this.needManualCorrection = needManualCorrection; + for (int i = 0; i < dateKeys.length; i++) { + dateValues[i] = translate(dateBase + dateKeys[i]); + } + initForm(ureq); } @@ -156,12 +172,12 @@ public class QTI21EditForm extends FormBasicController { testDateDependentEl.setHelpTextKey("qti.form.test.date.help", null); testDateDependentEl.addActionListener(FormEvent.ONCLICK); - Date startTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE); + Date startTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE); startTestDateElement = uifactory.addDateChooser("qti_form_start_test_date", "qti.form.date.start", startTestDate, formLayout); startTestDateElement.setDateChooserTimeEnabled(true); startTestDateElement.setMandatory(true); - Date endTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE); + Date endTestDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE); endTestDateElement = uifactory.addDateChooser("qti_form_end_test_date", "qti.form.date.end", endTestDate, formLayout); endTestDateElement.setDateChooserTimeEnabled(true); } @@ -206,29 +222,44 @@ public class QTI21EditForm extends FormBasicController { } scoreInfo.addActionListener(FormEvent.ONCLICK); - boolean showResultOnHomePage = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE); - showResultsOnHomePage = uifactory.addCheckboxesHorizontal("qti_enableResultsOnHomePage", "qti.form.results.onhomepage", formLayout, new String[]{"xx"}, new String[]{null}); - if(showResultOnHomePage) { - showResultsOnHomePage.select("xx", showResultOnHomePage); - } - showResultsOnHomePage.setElementCssClass("o_sel_results_on_homepage"); - showResultsOnHomePage.addActionListener(FormEvent.ONCLICK); - - boolean showResultsDateDependent = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); - showResultsDateDependentButton = uifactory.addCheckboxesHorizontal("qti_showresult", "qti.form.show.results", formLayout, new String[]{"xx"}, new String[]{null}); - showResultsDateDependentButton.select("xx", showResultsDateDependent); - showResultsDateDependentButton.addActionListener(FormEvent.ONCLICK); + boolean showResultOnHomePage = modConfig.getBooleanSafe(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE); + String showResultsDateDependent = modConfig.getStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS); + showResultsDateDependentEl = uifactory.addDropdownSingleselect("qti_showresult", "qti.form.results.onhomepage", formLayout, dateKeys, dateValues); + showResultsDateDependentEl.select(showResultOnHomePage ? showResultsDateDependent : "no", true); + showResultsDateDependentEl.addActionListener(FormEvent.ONCHANGE); - Date startDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); - startDateElement = uifactory.addDateChooser("qti_form_start_date", "qti.form.date.start", null, formLayout); - startDateElement.setDateChooserTimeEnabled(true); - startDateElement.setDate(startDate); - startDateElement.setMandatory(true); + Date generalStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + generalStartDateElement = uifactory.addDateChooser("qti_form__general_start_date", "qti.form.date.start", null, formLayout); + generalStartDateElement.setDateChooserTimeEnabled(true); + generalStartDateElement.setDate(generalStartDate); + generalStartDateElement.setMandatory(true); + + Date generalEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + generalEndDateElement = uifactory.addDateChooser("qti_form_general_end_date", "qti.form.date.end", null, formLayout); + generalEndDateElement.setDateChooserTimeEnabled(true); + generalEndDateElement.setDate(generalEndDate); + + Date failedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + failedStartDateElement = uifactory.addDateChooser("qti_form_failed_start_date", "qti.form.date.failed.start", null, formLayout); + failedStartDateElement.setDateChooserTimeEnabled(true); + failedStartDateElement.setDate(failedStartDate); + failedStartDateElement.setMandatory(true); - Date endDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); - endDateElement = uifactory.addDateChooser("qti_form_end_date", "qti.form.date.end", null, formLayout); - endDateElement.setDateChooserTimeEnabled(true); - endDateElement.setDate(endDate); + Date failedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + failedEndDateElement = uifactory.addDateChooser("qti_form_failed_end_date", "qti.form.date.end", null, formLayout); + failedEndDateElement.setDateChooserTimeEnabled(true); + failedEndDateElement.setDate(failedEndDate); + + Date passedStartDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + passedStartDateElement = uifactory.addDateChooser("qti_form_passed_start_date", "qti.form.date.passed.start", null, formLayout); + passedStartDateElement.setDateChooserTimeEnabled(true); + passedStartDateElement.setDate(passedStartDate); + passedStartDateElement.setMandatory(true); + + Date passedEndDate = modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + passedEndDateElement = uifactory.addDateChooser("qti_form_passed_end_date", "qti.form.date.end", null, formLayout); + passedEndDateElement.setDateChooserTimeEnabled(true); + passedEndDateElement.setDate(passedEndDate); QTI21AssessmentResultsOptions resultsOptions = deliveryOptions.getAssessmentResultsOptions(); if(!AssessmentInstance.QMD_ENTRY_SUMMARY_COMPACT.equals(modConfig.getStringValue(IQEditController.CONFIG_KEY_SUMMARY))) { @@ -299,25 +330,54 @@ public class QTI21EditForm extends FormBasicController { } } - startDateElement.clearError(); - if(showResultsDateDependentButton.isSelected(0)) { - if(startDateElement.getDate() == null) { - startDateElement.setErrorKey("form.legende.mandatory", null); + generalStartDateElement.clearError(); + + switch (showResultsDateDependentEl.getSelectedKey()) { + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + if(passedStartDateElement.getDate() == null) { + passedStartDateElement.setErrorKey("form.legende.mandatory", null); allOk &= false; - } else if(endDateElement.getDate() != null && startDateElement.getDate().after(endDateElement.getDate())) { - startDateElement.setErrorKey("error.begin.after.end", null); + } else if(passedEndDateElement.getDate() != null && passedStartDateElement.getDate().after(passedEndDateElement.getDate())) { + passedStartDateElement.setErrorKey("error.begin.after.end", null); + allOk &= false; + } + + if(failedStartDateElement.getDate() == null) { + failedStartDateElement.setErrorKey("form.legende.mandatory", null); + allOk &= false; + } else if(failedEndDateElement.getDate() != null && failedStartDateElement.getDate().after(failedEndDateElement.getDate())) { + failedStartDateElement.setErrorKey("error.begin.after.end", null); allOk &= false; } + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + if(failedStartDateElement.getDate() == null) { + failedStartDateElement.setErrorKey("form.legende.mandatory", null); + allOk &= false; + } else if(failedEndDateElement.getDate() != null && failedStartDateElement.getDate().after(failedEndDateElement.getDate())) { + failedStartDateElement.setErrorKey("error.begin.after.end", null); + allOk &= false; + } + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + if(generalStartDateElement.getDate() == null) { + generalStartDateElement.setErrorKey("form.legende.mandatory", null); + allOk &= false; + } else if(generalEndDateElement.getDate() != null && generalStartDateElement.getDate().after(generalEndDateElement.getDate())) { + generalStartDateElement.setErrorKey("error.begin.after.end", null); + allOk &= false; + } + break; + default: + break; } - + return allOk; } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(showResultsOnFinishEl == source - || showResultsOnHomePage == source - || showResultsDateDependentButton == source) { + if(showResultsOnFinishEl == source || showResultsDateDependentEl == source) { update(); } else if(testDateDependentEl == source) { if(testDateDependentEl.isAtLeastSelected(1)) { @@ -330,15 +390,70 @@ public class QTI21EditForm extends FormBasicController { } private void update() { - showResultsDateDependentButton.setVisible(showResultsOnHomePage.isSelected(0)); - - assessmentResultsOnFinishEl.setVisible(showResultsOnFinishEl.isSelected(0) || showResultsOnHomePage.isSelected(0)); - - resetDateChooser(startDateElement, showResultsDateDependentButton); - resetDateChooser(endDateElement, showResultsDateDependentButton); + assessmentResultsOnFinishEl.setVisible(showResultsOnFinishEl.isSelected(0) || !showResultsDateDependentEl.isSelected(0)); + + resetDateChooser(generalStartDateElement); + resetDateChooser(generalEndDateElement); + resetDateChooser(failedStartDateElement); + resetDateChooser(failedEndDateElement); + resetDateChooser(passedStartDateElement); + resetDateChooser(passedEndDateElement); resetDateChooser(startTestDateElement, testDateDependentEl); resetDateChooser(endTestDateElement, testDateDependentEl); + + switch (showResultsDateDependentEl.getSelectedKey()) { + case "no": + generalStartDateElement.setVisible(false); + generalEndDateElement.setVisible(false); + failedStartDateElement.setVisible(false); + failedEndDateElement.setVisible(false); + passedStartDateElement.setVisible(false); + passedEndDateElement.setVisible(false); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + generalStartDateElement.setVisible(false); + generalEndDateElement.setVisible(false); + failedStartDateElement.setVisible(true); + failedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE)); + failedEndDateElement.setVisible(true); + failedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE)); + passedStartDateElement.setVisible(true); + passedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE)); + passedEndDateElement.setVisible(true); + passedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE)); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + generalStartDateElement.setVisible(false); + generalEndDateElement.setVisible(false); + failedStartDateElement.setVisible(true); + failedStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE)); + failedEndDateElement.setVisible(true); + failedEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE)); + passedStartDateElement.setVisible(false); + passedEndDateElement.setVisible(false); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS: + generalStartDateElement.setVisible(false); + generalEndDateElement.setVisible(false); + failedStartDateElement.setVisible(false); + failedEndDateElement.setVisible(false); + passedStartDateElement.setVisible(false); + passedEndDateElement.setVisible(false); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + generalStartDateElement.setVisible(true); + generalStartDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE)); + generalEndDateElement.setVisible(true); + generalEndDateElement.setDate(modConfig.getDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE)); + failedStartDateElement.setVisible(false); + failedEndDateElement.setVisible(false); + passedStartDateElement.setVisible(false); + passedEndDateElement.setVisible(false); + break; + default: + break; + } } private void resetDateChooser(DateChooser dateElement, MultipleSelectionElement parentEl) { @@ -347,6 +462,13 @@ public class QTI21EditForm extends FormBasicController { dateElement.setValue(""); } dateElement.setVisible(parentEl.isVisible() && parentEl.isSelected(0)); + } + + private void resetDateChooser(DateChooser dateElement) { + dateElement.clearError(); + if (!dateElement.isVisible()){ + dateElement.setValue(""); + } } private void updateAssessmentResultsOnFinish(QTI21AssessmentResultsOptions resultsOptions) { @@ -423,23 +545,61 @@ public class QTI21EditForm extends FormBasicController { modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_TEST, testDateDependentEl.isSelected(0)); - modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_TEST_DATE, startTestDateElement.getDate()); - modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_TEST_DATE, endTestDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_START_TEST_DATE, startTestDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_END_TEST_DATE, endTestDateElement.getDate()); if(correctionModeEl.isOneSelected()) { modConfig.setStringValue(IQEditController.CONFIG_CORRECTION_MODE, correctionModeEl.getSelectedKey()); } modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_ENABLESCOREINFO, scoreInfo.isSelected(0)); - modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, showResultsDateDependentButton.isSelected(0)); + modConfig.setStringValue(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS, showResultsDateDependentEl.getSelectedKey()); - modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE, startDateElement.getDate()); - modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE, endDateElement.getDate()); + switch (showResultsDateDependentEl.getSelectedKey()) { + case "no": + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS: + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_DIFFERENT: + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE, failedStartDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE, failedEndDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE, passedStartDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE, passedEndDateElement.getDate()); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_FAILED_ONLY: + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_END_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE, failedStartDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE, failedEndDateElement.getDate()); + break; + case IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_SAME: + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE); + modConfig.remove(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE); + + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_START_DATE, generalStartDateElement.getDate()); + modConfig.setDateValue(IQEditController.CONFIG_KEY_RESULTS_END_DATE, generalEndDateElement.getDate()); + break; + default: + break; + } - modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, showResultsOnHomePage.isSelected(0)); + modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, !showResultsDateDependentEl.isSelected(0)); modConfig.setBooleanEntry(IQEditController.CONFIG_KEY_RESULT_ON_FINISH, showResultsOnFinishEl.isSelected(0)); - if(showResultsOnFinishEl.isSelected(0) || showResultsOnHomePage.isSelected(0)) { + if(showResultsOnFinishEl.isSelected(0) || !showResultsDateDependentEl.isSelected(0)) { if(assessmentResultsOnFinishEl.isAtLeastSelected(1)) { String options = QTI21AssessmentResultsOptions.toString(assessmentResultsOnFinishEl.getSelectedKeys()); modConfig.set(IQEditController.CONFIG_KEY_SUMMARY, options); diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties index 7f88f2a462331e12b69ae6ab16cbadfacdccfc21..7abb79422b94cdacec8b67a546404626f5596e95 100644 --- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_de.properties @@ -39,6 +39,11 @@ correction.mode.help=Bei einer Auto Korrektur wird das Resultat sofort angezeigt correction.test.title=Korrigieren correcttest=Test korrigieren coursefolder=Ablageordner Kurs "{0}" +date.different=Verschiedene Daten für nicht bestanden und bestanden +date.false=Immer +date.failedOnly=Nur nicht bestanden +date.no=Nein +date.true=Wenn nicht bestanden oder bestanden digital.signature=Testquittung erstellen digital.signature.mail=Testquittung per Mail schicken digital.signature.mail.subject=Test-Quittung @@ -109,10 +114,12 @@ qti.form.auto.enumerate.choices=Nummerierung der Antworten in Buchstaben anstell qti.form.auto.memofield=Pers\u00F6nliche Notizen qti.form.auto.memofield.text=Hier k\u00F6nnen Sie pers\u00F6nliche Notizen zur Frage anf\u00FCgen, welche nach Beendigung des Tests NICHT gespeichert werden. qti.form.block.afterSuccess=Erster bestandener L\u00F6sungsversuch z\u00E4hlt -qti.form.date.end=bis +qti.form.date.end=Bis qti.form.date.error.endbeforebegin=Das Anfangsdatum muss vor dem Enddatum liegen. qti.form.date.error.format=Falsches Datumsformat -qti.form.date.start=von +qti.form.date.failed.start=Falls <font color="red">durchgefallen</font> +qti.form.date.passed.start=Falls <font color="green">bestanden</font> +qti.form.date.start=Von qti.form.date.start.error.mandatory=Es muss mindestens ein Anfangsdatum angegeben werden. qti.form.enablecancel=Abbrechen erlauben qti.form.enablesuspend=Unterbrechen erlauben @@ -189,6 +196,7 @@ showResults.detailed=Resultate showResults.title=Resultate showResults.visibility=Die Resultate werden von "{0}" bis "{1}" angezeigt. showResults.visibility.future=Die Resultate werden angezeigt sobald die Korrektur abgeschlossen ist. +showResults.visibility.past=Der Zeitraum zur Einsicht der Resultate ist vorbei. start=Start table.header.lastModified=Last modified table.header.results=Resultaten diff --git a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties index cbfc8969546aa541fa28b56f464eeb4ffcc000a2..367c8c6df8854b7c9f489620065a108a8b09fa0d 100644 --- a/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/iq/_i18n/LocalStrings_en.properties @@ -39,6 +39,11 @@ correction.mode.help=For Auto correction the result is shown immediately. For Ma correction.test.title=Grade correcttest=Correct test coursefolder=Storage folder of course "{0}" +date.different=Different date for failed and passed +date.false=Always +date.failedOnly=Only when failed +date.no=No +date.true=When failed or passed digital.signature=Test receipt digital.signature.download=Test receipt digital.signature.download.date=( Issued the {0} ) @@ -110,10 +115,12 @@ qti.form.auto.enumerate.choices=Sort answers alphabetically qti.form.auto.memofield=Personal notes qti.form.auto.memofield.text=Here you can add personal notes to a question, however, after taking your test these notes will NOT be saved. qti.form.block.afterSuccess=First successful attempt counts -qti.form.date.end=until +qti.form.date.end=Until qti.form.date.error.endbeforebegin=Your starting date has to be set before the ending date. qti.form.date.error.format=Wrong date format -qti.form.date.start=from +qti.form.date.failed.start=When failed +qti.form.date.passed.start=When passed +qti.form.date.start=From qti.form.date.start.error.mandatory=At least a starting date must be indicated. qti.form.enablecancel=Allow to cancel qti.form.enablesuspend=Allow to suspend @@ -190,6 +197,7 @@ showResults.detailed=Results showResults.title=Results showResults.visibility=Your results will be displayed from "{0}" until "{1}" showResults.visibility.future=Your results will be displayed here as soon as the correction has been completed. +showResults.visibility.past=The period for viewing the results is over. start=Start table.header.end.date=End date table.header.extra.time=Extra diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java index a7ec4d5651cffe415fe8687976acd780aa505148..6e5519d9a6f4bdb94777cd6b0b628afbeba22585 100644 --- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java @@ -2231,10 +2231,14 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { config.setShowQuestionTitle(showQuestionTitle == null ? true : showQuestionTitle); Boolean showResFinish = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_RESULT_ON_FINISH); config.setShowResultsAfterFinish(showResFinish == null ? true : showResFinish); - Boolean showResDate = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); - config.setShowResultsDependendOnDate(showResDate == null ? false : showResDate); + String showResDate = (String)moduleConfig.get(IQEditController.CONFIG_KEY_DATE_DEPENDENT_RESULTS); + config.setShowResultsDependendOnDate(showResDate == null ? IQEditController.CONFIG_VALUE_DATE_DEPENDENT_RESULT_ALWAYS : showResDate); config.setShowResultsStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_START_DATE)); config.setShowResultsEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_END_DATE)); + config.setShowResultsPassedStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_PASSED_START_DATE)); + config.setShowResultsPassedEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_PASSED_END_DATE)); + config.setShowResultsFailedStartDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_FAILED_START_DATE)); + config.setShowResultsFailedEndDate((Date) moduleConfig.get(IQEditController.CONFIG_KEY_RESULTS_FAILED_END_DATE)); Boolean showResHomepage = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE); config.setShowResultsOnHomepage(showResHomepage == null ? false : showResHomepage); Boolean showScoreInfo = (Boolean)moduleConfig.get(IQEditController.CONFIG_KEY_ENABLESCOREINFO); @@ -2606,7 +2610,7 @@ public class CourseElementWebService extends AbstractCourseNodeWebService { if(startDate != null && endDate != null) { moduleConfig.set(IQEditController.CONFIG_KEY_RESULTS_START_DATE, new Date(startDate)); moduleConfig.set(IQEditController.CONFIG_KEY_RESULTS_END_DATE, new Date(endDate)); - } + } if(showResultsOnHomepage != null) moduleConfig.set(IQEditController.CONFIG_KEY_RESULT_ON_HOME_PAGE, showResultsOnHomepage); if(showScoreInfo != null) moduleConfig.set(IQEditController.CONFIG_KEY_ENABLESCOREINFO, showScoreInfo); if(showQuestionProgress != null) moduleConfig.set(IQEditController.CONFIG_KEY_QUESTIONPROGRESS, showQuestionProgress); diff --git a/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java b/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java index f8654967dc76b69d1ae512e0085b13a36e31f6d9..171a471b61ac31ccfa01b49093f9391f6cc6e118 100644 --- a/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java +++ b/src/main/java/org/olat/restapi/support/vo/elements/TestConfigVO.java @@ -57,9 +57,13 @@ public class TestConfigVO { private Boolean showScoreInfo; private Boolean showResultsAfterFinish; private Boolean showResultsOnHomepage; - private Boolean showResultsDependendOnDate; + private String showResultsDependendOnDate; private Date showResultsStartDate; private Date showResultsEndDate; + private Date showResultsFailedStartDate; + private Date showResultsFailedEndDate; + private Date showResultsPassedStartDate; + private Date showResultsPassedEndDate; public TestConfigVO() { //make JAXB happy @@ -177,11 +181,11 @@ public class TestConfigVO { this.showResultsOnHomepage = showResultsOnHomepage; } - public Boolean getShowResultsDependendOnDate() { + public String getShowResultsDependendOnDate() { return showResultsDependendOnDate; } - public void setShowResultsDependendOnDate(Boolean showResultsDependendOnDate) { + public void setShowResultsDependendOnDate(String showResultsDependendOnDate) { this.showResultsDependendOnDate = showResultsDependendOnDate; } @@ -200,4 +204,36 @@ public class TestConfigVO { public void setShowResultsEndDate(Date showResultsEndDate) { this.showResultsEndDate = showResultsEndDate; } + + public Date getShowResultsFailedStartDate() { + return showResultsFailedStartDate; + } + + public void setShowResultsFailedStartDate(Date showResultsFailedStartDate) { + this.showResultsFailedStartDate = showResultsFailedStartDate; + } + + public Date getShowResultsFailedEndDate() { + return showResultsFailedEndDate; + } + + public void setShowResultsFailedEndDate(Date showResultsFailedEndDate) { + this.showResultsFailedEndDate = showResultsFailedEndDate; + } + + public Date getShowResultsPassedStartDate() { + return showResultsPassedStartDate; + } + + public void setShowResultsPassedStartDate(Date showResultsPassedStartDate) { + this.showResultsPassedStartDate = showResultsPassedStartDate; + } + + public Date getShowResultsPassedEndDate() { + return showResultsPassedEndDate; + } + + public void setShowResultsPassedEndDate(Date showResultsPassedEndDate) { + this.showResultsPassedEndDate = showResultsPassedEndDate; + } }