Skip to content
Snippets Groups Projects
Commit 54e270aa authored by srosse's avatar srosse
Browse files

OO-3544: leading time (based on Set assessment period setting) was not

calculated like the max time limit based on time limit configuration.
parent c37fbc42
No related branches found
No related tags found
No related merge requests found
...@@ -629,35 +629,38 @@ public class AssessmentTestDisplayController extends BasicController implements ...@@ -629,35 +629,38 @@ public class AssessmentTestDisplayController extends BasicController implements
*/ */
private Long getAssessmentTestMaxTimeLimit() { private Long getAssessmentTestMaxTimeLimit() {
int extra = extraTime == null ? 0 : extraTime.intValue(); int extra = extraTime == null ? 0 : extraTime.intValue();
long leadingTime = getLeadingTimeEndTestOption(); Long leadingTimeInMilliSeconds = getLeadingTimeEndTestOption();
long leadingDuration = Long.MAX_VALUE;
if(leadingTimeInMilliSeconds != null) {
double leadingDurationInSeconds = (leadingTimeInMilliSeconds + getAssessmentTestDuration()) / 1000.0d;
leadingDuration = Math.round(leadingDurationInSeconds);
}
if(overrideOptions != null && overrideOptions.getAssessmentTestMaxTimeLimit() != null) { if(overrideOptions != null && overrideOptions.getAssessmentTestMaxTimeLimit() != null) {
long timeLimits = overrideOptions.getAssessmentTestMaxTimeLimit().longValue(); long timeLimits = overrideOptions.getAssessmentTestMaxTimeLimit().longValue();
return timeLimits > 0 ? Math.min(leadingTime, timeLimits) + extra : null; return timeLimits > 0 ? Math.min(leadingDuration, timeLimits) + extra : null;
} }
AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful(); AssessmentTest assessmentTest = resolvedAssessmentTest.getRootNodeLookup().extractIfSuccessful();
if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) { if(assessmentTest.getTimeLimits() != null && assessmentTest.getTimeLimits().getMaximum() != null) {
long timeLimits = assessmentTest.getTimeLimits().getMaximum().longValue(); long timeLimits = assessmentTest.getTimeLimits().getMaximum().longValue();
return Math.min(leadingTime, timeLimits) + extra; return Math.min(leadingDuration, timeLimits) + extra;
} }
return null; return null;
} }
/** /**
* @return The number of seconds up to the defined end of the test (or a very long time if nothing is configured) * @return The number of milliseconds up to the defined end of the test (or a very long time if nothing is configured)
*/ */
private long getLeadingTimeEndTestOption() { private Long getLeadingTimeEndTestOption() {
if(overrideOptions != null && overrideOptions.getEndTestDate() != null) { if(overrideOptions != null && overrideOptions.getEndTestDate() != null) {
Date endTestDate = overrideOptions.getEndTestDate(); Date endTestDate = overrideOptions.getEndTestDate();
long diff = endTestDate.getTime() - currentRequestTimestamp.getTime(); long diff = endTestDate.getTime() - currentRequestTimestamp.getTime();
if(diff < 0l) { if(diff < 0l) {
diff = 0l; diff = 0l;
} }
if(diff > 0l) {
diff = diff / 1000l;
}
return diff; return diff;
} }
return 365 * 24 * 60 * 60;// default is a year return null;// default is a year
} }
/** /**
...@@ -674,6 +677,16 @@ public class AssessmentTestDisplayController extends BasicController implements ...@@ -674,6 +677,16 @@ public class AssessmentTestDisplayController extends BasicController implements
} }
return diff; return diff;
} }
/**
* @return The test duration in milliseconds
*/
private long getAssessmentTestDuration() {
TestSessionState testSessionState = testSessionController.getTestSessionState();
long duration = testSessionState.getDurationAccumulated();
duration += getRequestTimeStampDifferenceToNow();
return duration;
}
private void processQTIEvent(UserRequest ureq, QTIWorksAssessmentTestEvent qe) { private void processQTIEvent(UserRequest ureq, QTIWorksAssessmentTestEvent qe) {
if(timeLimitBarrier(ureq)) { if(timeLimitBarrier(ureq)) {
...@@ -2341,10 +2354,7 @@ public class AssessmentTestDisplayController extends BasicController implements ...@@ -2341,10 +2354,7 @@ public class AssessmentTestDisplayController extends BasicController implements
* @return The test duration in milliseconds * @return The test duration in milliseconds
*/ */
public long getAssessmentTestDuration() { public long getAssessmentTestDuration() {
TestSessionState testSessionState = testSessionController.getTestSessionState(); return AssessmentTestDisplayController.this.getAssessmentTestDuration();
long duration = testSessionState.getDurationAccumulated();
duration += getRequestTimeStampDifferenceToNow();
return duration;
} }
/** /**
......
...@@ -50,9 +50,9 @@ public class AssessmentTimerComponentRenderer extends DefaultComponentRenderer { ...@@ -50,9 +50,9 @@ public class AssessmentTimerComponentRenderer extends DefaultComponentRenderer {
sb.append("<div id='o_c").append(cmp.getDispatchID()).append("'><div id='o_qti_assessment_test_timer' class='clearfix'><i class='o_icon o_icon_timelimit'> </i> "); sb.append("<div id='o_c").append(cmp.getDispatchID()).append("'><div id='o_qti_assessment_test_timer' class='clearfix'><i class='o_icon o_icon_timelimit'> </i> ");
String[] attrs = new String[] { String[] attrs = new String[] {
"<span class='o_qti_timer'></span>", "<span class='o_qti_timer'></span>", // 0 The count down place holder
"<span class='o_qti_timer_duration'></span>", "<span class='o_qti_timer_duration'></span>", // 1 Test time limit
qtiWorksStatus.getAssessmentTestEndTime() qtiWorksStatus.getAssessmentTestEndTime() // 2 End time formatted hh:mm
}; };
sb.append(translator.translate("timelimit.running", attrs)) sb.append(translator.translate("timelimit.running", attrs))
.append("<span class='o_qti_times_up' style='display:none;'>").append(translator.translate("timelimit.finished")).append("</span>") .append("<span class='o_qti_times_up' style='display:none;'>").append(translator.translate("timelimit.finished")).append("</span>")
...@@ -64,7 +64,7 @@ public class AssessmentTimerComponentRenderer extends DefaultComponentRenderer { ...@@ -64,7 +64,7 @@ public class AssessmentTimerComponentRenderer extends DefaultComponentRenderer {
.append("/*<![CDATA[ */\n") .append("/*<![CDATA[ */\n")
.append("jQuery(function() {\n") .append("jQuery(function() {\n")
.append(" jQuery('#o_qti_assessment_test_timer').qtiTimer({\n") .append(" jQuery('#o_qti_assessment_test_timer').qtiTimer({\n")
.append(" startTime:").append(qtiWorksStatus.getAssessmentTestDuration()).append(",\n") .append(" testDuration:").append(qtiWorksStatus.getAssessmentTestDuration()).append(",\n")
.append(" availableTime:").append(qtiWorksStatus.getAssessmentTestMaximumTimeLimits()).append(",\n") .append(" availableTime:").append(qtiWorksStatus.getAssessmentTestMaximumTimeLimits()).append(",\n")
.append(" formName: '").append(form.getFormName()).append("',\n")//forn name .append(" formName: '").append(form.getFormName()).append("',\n")//forn name
.append(" dispIdField: '").append(form.getDispatchFieldId()).append("',\n")//form dispatch id .append(" dispIdField: '").append(form.getDispatchFieldId()).append("',\n")//form dispatch id
......
(function ($) { (function ($) {
$.fn.qtiTimer = function(options) { $.fn.qtiTimer = function(options) {
"use strict";
var settings = $.extend({ var settings = $.extend({
startTime: null, testDuration: null,
availableTime: null, availableTime: null,
formName: null,//forn name formName: null,//forn name
dispIdField: null,//form dispatch id dispIdField: null,//form dispatch id
...@@ -15,15 +15,16 @@ ...@@ -15,15 +15,16 @@
} }
var wrapperId = this.attr('id'); var wrapperId = this.attr('id');
var startTime = Date.now() - settings.startTime; var now = Date.now();
var startTime = now - settings.testDuration;
var availableTime = startTime + settings.availableTime; var availableTime = startTime + settings.availableTime;
var remainingTime = availableTime - Date.now(); var remainingTime = availableTime - now;
displayRemainingTime(wrapperId, settings.availableTime, remainingTime); displayRemainingTime(wrapperId, settings.availableTime, remainingTime);
var periodic = jQuery.periodic({period: 1000, decay:1.0, max_period: remainingTime + 1000 }, function() { var periodic = jQuery.periodic({period: 1000, decay:1.0, max_period: remainingTime + 1000 }, function() {
remainingTime = availableTime - Date.now(); var remaining = availableTime - Date.now();
if(remainingTime >= 0) { if(remaining >= 0) {
displayRemainingTime(wrapperId, settings.availableTime, remainingTime); displayRemainingTime(wrapperId, settings.availableTime, remaining);
} else { } else {
periodic.cancel(); periodic.cancel();
timesUp(settings); timesUp(settings);
......
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