From 6598ca885458ca641a7fcfc3e1c937fa3603d9d3 Mon Sep 17 00:00:00 2001 From: Yung Han Khoe Date: Mon, 19 Jan 2009 12:49:20 +0000 Subject: [PATCH] rfe 9197: Survey timeout handling --- lib/WebGUI/Asset/Wobject/Survey.pm | 43 ++++++++++++++++++------ lib/WebGUI/i18n/English/Asset_Survey.pm | 30 ++++++++++++++++- root_import_survey.wgpkg | Bin 8968 -> 9029 bytes www/extras/wobject/Survey/survey.css | 7 +++- 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 601466171..fd78f56a7 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -57,6 +57,17 @@ sub definition { hoverHelp => $i18n->get('timelimit hoverHelp'), label => $i18n->get('timelimit') }, + doAfterTimeLimit => { + fieldType => 'selectBox', + defaultValue => 'exitUrl', + tab => 'properties', + hoverHelp => $i18n->get('do after timelimit hoverHelp'), + label => $i18n->get('do after timelimit label'), + options => { + 'exitUrl' => $i18n->get('exit url label'), + 'restartSurvey' => $i18n->get('restart survey label'), + }, + }, groupToEditSurvey => { fieldType => 'group', defaultValue => 4, @@ -738,6 +749,7 @@ sub www_view { } #------------------------------------------------------------------- + sub www_takeSurvey { my $self = shift; my %var; @@ -839,7 +851,8 @@ sub www_submitQuestions { #finds the questions to display next and builds the data structre to hold them #------------------------------------------------------------------- sub www_loadQuestions { - my $self = shift; + my $self = shift; + my $wasRestarted = shift; if ( !$self->canTakeSurvey() ) { $self->session->log->debug('canTakeSurvey false, surveyEnd'); @@ -867,7 +880,9 @@ sub www_loadQuestions { my $section = $self->response->nextSection(); #return $self->prepareShowSurveyTemplate($section,$questions); - $section->{id} = $self->response->nextSectionId(); + $section->{id} = $self->response->nextSectionId(); + $section->{wasRestarted} = $wasRestarted; + my $text = $self->prepareShowSurveyTemplate( $section, $questions ); return $text; } ## end sub www_loadQuestions @@ -911,18 +926,24 @@ sub surveyEnd { } ); } - if ( $url !~ /\w/ ) { $url = 0; } - if ( $url eq "undefined" ) { $url = 0; } - if ( !$url ) { - $url - = $self->session->db->quickScalar( - "select exitURL from Survey where assetId = ? order by revisionDate desc limit 1", - [ $self->getId() ] ); + if ($self->get('doAfterTimeLimit') eq 'restartSurvey' && $completeCode == 2){ + $self->response->startTime(time()); + undef $self->{response}; + undef $self->{responseId}; + return $self->www_loadQuestions('1'); + }else{ + if ( $url !~ /\w/ ) { $url = 0; } + if ( $url eq "undefined" ) { $url = 0; } if ( !$url ) { - $url = "/"; + $url + = $self->session->db->quickScalar( + "select exitURL from Survey where assetId = ? order by revisionDate desc limit 1", + [ $self->getId() ] ); + if ( !$url ) { + $url = "/"; + } } } - # $self->session->http->setRedirect($url); return encode_json( { "type", "forward", "url", $url } ); } ## end sub surveyEnd diff --git a/lib/WebGUI/i18n/English/Asset_Survey.pm b/lib/WebGUI/i18n/English/Asset_Survey.pm index 68a7f01a4..f54494f5f 100644 --- a/lib/WebGUI/i18n/English/Asset_Survey.pm +++ b/lib/WebGUI/i18n/English/Asset_Survey.pm @@ -247,7 +247,35 @@ our $I18N = { message => q|How many minutes the user has to finish the survey from the moment they start. 0 means unlimited time.|, lastUpdated => 1231193335, }, - + 'do after timelimit label' => { + message => q|Do After Time Limit:|, + lastUpdated => 1224686319, + context => q|label for the 'do after timelimit' field on the Properties tab of the Survey's edit screen.|, + }, + 'do after timelimit hoverHelp' => { + message => q|Select what happens after the time limit for finishing the survey has expired.|, + lastUpdated => 1231193335, + context => q|description of the 'do after timelimit' field on the Properties tab of the Survey's edit +screen|, + }, + 'exit url label' =>{ + message => q|Exit URL|, + lastUpdated => 0, + context => q|Label for the 'exit url' option of the 'do after timelimit' field on the Properties tab of the +Survey's edit screen|, + }, + 'restart survey label' =>{ + message => q|Restart Survey|, + lastUpdated => 0, + context => q|Label for the 'restart survey' option of the 'do after timelimit' field on the Properties tab of the +Survey's edit screen|, + }, + 'restart message' =>{ + message => q|The survey was restarted because the time limit for completing the survey was reached.|, + lastUpdated => 0, + context => q|The message shown to the user taking the survey when the survey is restarted after reaching +the time limit for completing the survey. This message is in the 'take survey' template.|, + }, }; 1; diff --git a/root_import_survey.wgpkg b/root_import_survey.wgpkg index 9567630b4c8baa8368c59c4b40517118775c1bc7..a91d554af199c991c8fefa3f0b3e7e6d82107add 100644 GIT binary patch literal 9029 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