Corrected survey timeout issues.
This commit is contained in:
parent
20070aac8d
commit
5741d71445
3 changed files with 189 additions and 87 deletions
|
|
@ -887,8 +887,8 @@ SQL
|
|||
'link' => $postUrl,
|
||||
guid => $postUrl,
|
||||
description => $post->get('synopsis'),
|
||||
epochDate => $post->get('creationDate'),
|
||||
pubDate => $datetime->epochToMail($post->get('creationDate')),
|
||||
epochDate => $post->get('revisionDate'),
|
||||
pubDate => $datetime->epochToMail($post->get('revisionDate')),
|
||||
attachmentLoop => $attachmentLoop,
|
||||
userDefined1 => $post->get("userDefined1"),
|
||||
userDefined2 => $post->get("userDefined2"),
|
||||
|
|
|
|||
|
|
@ -39,23 +39,23 @@ sub definition {
|
|||
label => "Template ID"
|
||||
},
|
||||
showProgress => {
|
||||
fieldType => "yesNo",
|
||||
fieldType => "yesNo",
|
||||
defaultValue => 0,
|
||||
tab => 'properties',
|
||||
label => "Show user their progress"
|
||||
tab => 'properties',
|
||||
label => "Show user their progress"
|
||||
},
|
||||
showTimeLimit => {
|
||||
fieldType => "yesNo",
|
||||
fieldType => "yesNo",
|
||||
defaultValue => 0,
|
||||
tab => 'properties',
|
||||
label => "Show user their time remaining"
|
||||
tab => 'properties',
|
||||
label => "Show user their time remaining"
|
||||
},
|
||||
timeLimit => {
|
||||
fieldType => 'integer',
|
||||
timeLimit => {
|
||||
fieldType => 'integer',
|
||||
defaultValue => 0,
|
||||
tab => 'properties',
|
||||
hoverHelp => $i18n->get('timelimit hoverHelp'),
|
||||
label => $i18n->get('timelimit')
|
||||
tab => 'properties',
|
||||
hoverHelp => $i18n->get('timelimit hoverHelp'),
|
||||
label => $i18n->get('timelimit')
|
||||
},
|
||||
groupToEditSurvey => {
|
||||
fieldType => 'group',
|
||||
|
|
@ -260,9 +260,9 @@ Loads the initial edit survey page. All other edit actions are JSON calls from
|
|||
|
||||
sub www_editSurvey {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
|
||||
|
||||
my %var;
|
||||
my $out = $self->processTemplate( \%var, $self->get("surveyEditTemplateId") );
|
||||
|
|
@ -273,9 +273,9 @@ sub www_editSurvey {
|
|||
#-------------------------------------------------------------------
|
||||
sub www_submitObjectEdit {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
|
||||
|
||||
# my $ref = @{from_json($self->session->form->process("data"))};
|
||||
my $responses = $self->session->form->paramsHashRef();
|
||||
|
|
@ -339,10 +339,10 @@ sub deleteObject {
|
|||
#-------------------------------------------------------------------
|
||||
sub www_newObject {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
|
||||
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
|
||||
|
||||
my $ref;
|
||||
|
||||
my $ids = $self->session->form->process("data");
|
||||
|
|
@ -363,11 +363,11 @@ sub www_newObject {
|
|||
#-------------------------------------------------------------------
|
||||
sub www_dragDrop {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
|
||||
|
||||
my $p = from_json( $self->session->form->process("data") );
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
|
||||
|
||||
my $p = from_json( $self->session->form->process("data") );
|
||||
|
||||
my @tid = split /-/, $p->{target}->{id};
|
||||
my @bid = split /-/, $p->{before}->{id};
|
||||
|
|
@ -415,6 +415,7 @@ sub www_dragDrop {
|
|||
$self->survey->insertObject( $target, [ $bid[0], $bid[1], $bid[2] ] );
|
||||
}
|
||||
else {
|
||||
|
||||
#else put it back where it was
|
||||
$self->survey->insertObject( $target, \@tid );
|
||||
}
|
||||
|
|
@ -579,19 +580,90 @@ sub view {
|
|||
my $self = shift;
|
||||
my %var;
|
||||
|
||||
$var{'edit_survey_url'} = $self->getUrl('func=editSurvey');
|
||||
$var{'take_survey_url'} = $self->getUrl('func=takeSurvey');
|
||||
$var{'view_simple_results_url'} = $self->getUrl('func=exportSimpleResults');
|
||||
$var{'view_transposed_results_url'} = $self->getUrl('func=exportTransposedResults');
|
||||
$var{'view_statistical_overview_url'} = $self->getUrl('func=viewStatisticalOverview');
|
||||
$var{'view_grade_book_url'} = $self->getUrl('func=viewGradeBook');
|
||||
$var{'user_canTakeSurvey'} = $self->session->user->isInGroup( $self->get("groupToTakeSurvey") );
|
||||
$var{'user_canViewReports'} = $self->session->user->isInGroup( $self->get("groupToViewReports") );
|
||||
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
|
||||
$var{'edit_survey_url'} = $self->getUrl('func=editSurvey');
|
||||
$var{'take_survey_url'} = $self->getUrl('func=takeSurvey');
|
||||
$var{'view_simple_results_url'} = $self->getUrl('func=exportSimpleResults');
|
||||
$var{'view_transposed_results_url'} = $self->getUrl('func=exportTransposedResults');
|
||||
$var{'view_statistical_overview_url'} = $self->getUrl('func=viewStatisticalOverview');
|
||||
$var{'view_grade_book_url'} = $self->getUrl('func=viewGradeBook');
|
||||
$var{'user_canTakeSurvey'} = $self->session->user->isInGroup( $self->get("groupToTakeSurvey") );
|
||||
$var{'user_canViewReports'} = $self->session->user->isInGroup( $self->get("groupToViewReports") );
|
||||
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
|
||||
$var{'user_canEditSurvey'} = $self->session->user->isInGroup( $self->get("groupToEditSurvey") );
|
||||
my ( $code, $overTakeLimit ) = $self->getResponseInfoForView();
|
||||
$var{'lastResponseCompleted'} = $code;
|
||||
$var{'lastResponseTimedOut'} = $code > 1 ? 1 : 0;
|
||||
$var{'maxResponsesSubmitted'} = $overTakeLimit;
|
||||
my $out = $self->processTemplate( \%var, undef, $self->{_viewTemplate} );
|
||||
|
||||
return $out;
|
||||
}
|
||||
} ## end sub view
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 getResponseInfoForView ( )
|
||||
|
||||
Looks to see if this user has a response, looks at the last one to see if it was completed or timed out.
|
||||
Then it checks to see if the user has reached the max number of responses.
|
||||
|
||||
=cut
|
||||
|
||||
sub getResponseInfoForView {
|
||||
my $self = shift;
|
||||
|
||||
my ( $code, $taken );
|
||||
|
||||
my $maxTakes = $self->getValue("maxResponsesPerUser");
|
||||
my $id = $self->session->user->userId();
|
||||
my $anonId
|
||||
= $self->session->form->process("userid")
|
||||
|| $self->session->http->getCookies->{"Survey2AnonId"}
|
||||
|| undef;
|
||||
$self->session->http->setCookie( "Survey2AnonId", $anonId ) if ($anonId);
|
||||
my $ip = $self->session->env->getIp;
|
||||
my $string;
|
||||
|
||||
#if there is an anonid or id is for a WG user
|
||||
if ( $anonId or $id != 1 ) {
|
||||
$string = 'userId';
|
||||
if ($anonId) {
|
||||
$string = 'anonId';
|
||||
$id = $anonId;
|
||||
}
|
||||
my $responseId
|
||||
= $self->session->db->quickScalar(
|
||||
"select Survey_responseId from Survey_response where $string = ? and assetId = ? and isComplete = 0",
|
||||
[ $id, $self->getId() ] );
|
||||
if ( !$responseId ) {
|
||||
$code = $self->session->db->quickScalar(
|
||||
"select isComplete from Survey_response where $string = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1",
|
||||
[ $id, $self->getId() ]
|
||||
);
|
||||
}
|
||||
$taken
|
||||
= $self->session->db->quickScalar(
|
||||
"select count(*) from Survey_response where $string = ? and assetId = ? and isComplete > 0",
|
||||
[ $id, $self->getId() ] );
|
||||
|
||||
} ## end if ( $anonId or $id !=...
|
||||
elsif ( $id == 1 ) {
|
||||
my $responseId = $self->session->db->quickScalar(
|
||||
"select Survey_responseId from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete = 0",
|
||||
[ $id, $ip, $self->getId() ]
|
||||
);
|
||||
if ( !$responseId ) {
|
||||
$code = $self->session->db->quickScalar(
|
||||
"select isComplete from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1",
|
||||
[ $id, $ip, $self->getId() ]
|
||||
);
|
||||
}
|
||||
$taken = $self->session->db->quickScalar(
|
||||
"select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0",
|
||||
[ $id, $ip, $self->getId() ]
|
||||
);
|
||||
} ## end elsif ( $id == 1 )
|
||||
return ( $code, $taken >= $maxTakes );
|
||||
} ## end sub getResponseInfoForView
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
|
|
@ -615,24 +687,26 @@ sub www_takeSurvey {
|
|||
my $responseId = $self->getResponseId();
|
||||
if ( !$responseId ) {
|
||||
$self->session->log->debug('No responseId, surveyEnd');
|
||||
# return $self->surveyEnd(); # disabled. let the js handle the exitUrl redirection
|
||||
} else {
|
||||
|
||||
# return $self->surveyEnd(); # disabled. let the js handle the exitUrl redirection
|
||||
}
|
||||
else {
|
||||
$self->session->log->debug("ResponseId: $responseId");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
my $out = $self->processTemplate( \%var, $self->get("surveyTakeTemplateId") );
|
||||
return $self->session->style->process($out,$self->get("styleTemplateId"));
|
||||
}
|
||||
return $self->session->style->process( $out, $self->get("styleTemplateId") );
|
||||
} ## end sub www_takeSurvey
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_deleteResponses {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ($self->session->user->isInGroup($self->get('groupToEditSurvey')));
|
||||
|
||||
$self->session->db->write('delete from Survey_response where assetId = ?',[$self->getId]);
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get('groupToEditSurvey') ) );
|
||||
|
||||
$self->session->db->write( 'delete from Survey_response where assetId = ?', [ $self->getId ] );
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
@ -650,7 +724,7 @@ sub www_submitQuestions {
|
|||
my $responseId = $self->getResponseId();
|
||||
if ( !$responseId ) {
|
||||
$self->session->log->debug('No response id, surveyEnd');
|
||||
return $self->surveyEnd();
|
||||
return $self->surveyEnd();
|
||||
}
|
||||
|
||||
my $responses = $self->session->form->paramsHashRef();
|
||||
|
|
@ -660,7 +734,7 @@ sub www_submitQuestions {
|
|||
|
||||
$self->loadBothJSON();
|
||||
|
||||
my $termInfo = $self->response->recordResponses($self->session, $responses);
|
||||
my $termInfo = $self->response->recordResponses( $self->session, $responses );
|
||||
|
||||
$self->saveResponseJSON();
|
||||
|
||||
|
|
@ -718,9 +792,9 @@ sub www_loadQuestions {
|
|||
$self->session->log->debug('No responseId, surveyEnd');
|
||||
return $self->surveyEnd();
|
||||
}
|
||||
if($self->response->hasTimedOut($self->get('timeLimit'))){
|
||||
if ( $self->response->hasTimedOut( $self->get('timeLimit') ) ) {
|
||||
$self->session->log->debug('Response hasTimedOut, surveyEnd');
|
||||
return $self->surveyEnd();
|
||||
return $self->surveyEnd( undef, 2 );
|
||||
}
|
||||
|
||||
if ( $self->response->surveyEnd() ) {
|
||||
|
|
@ -740,19 +814,41 @@ sub www_loadQuestions {
|
|||
} ## end sub www_loadQuestions
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
#called when the survey is over.
|
||||
|
||||
=head2 surveyEnd ( [ $url ], [ $completeCode ] )
|
||||
|
||||
Marks the survey completed with either 1 or the $completeCode and then sends the url to the site home or if defined, $url.
|
||||
|
||||
=head3 $url
|
||||
|
||||
An optional url to send the user to upon survey completion.
|
||||
|
||||
=head3 $completeCode
|
||||
|
||||
An optional code (defaults to 1) to say how the user completed the survey.
|
||||
|
||||
1 is normal completion.
|
||||
2 is timed out.
|
||||
|
||||
=cut
|
||||
|
||||
sub surveyEnd {
|
||||
my $self = shift;
|
||||
my $url = shift;
|
||||
|
||||
if (my $responseId = $self->getResponseId()) { #also loads the survey and response
|
||||
# $self->session->db->write("update Survey_response set endDate = ? and isComplete = 1 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]);
|
||||
my $self = shift;
|
||||
my $url = shift;
|
||||
my $completeCode = shift;
|
||||
|
||||
$completeCode = defined $completeCode ? $completeCode : 1;
|
||||
|
||||
if ( my $responseId = $self->getResponseId() ) { #also loads the survey and response
|
||||
# $self->session->db->write("update Survey_response set endDate = ? and isComplete > 0 where Survey_responseId = ?",[WebGUI::DateTime->now->toDatabase,$responseId]);
|
||||
$self->session->db->setRow(
|
||||
"Survey_response",
|
||||
"Survey_responseId", {
|
||||
Survey_responseId => $responseId,
|
||||
endDate => time(),#WebGUI::DateTime->now->toDatabase,
|
||||
isComplete => 1
|
||||
endDate => time(), #WebGUI::DateTime->now->toDatabase,
|
||||
isComplete => $completeCode
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
@ -767,8 +863,9 @@ sub surveyEnd {
|
|||
$url = "/";
|
||||
}
|
||||
}
|
||||
# $self->session->http->setRedirect($url);
|
||||
return to_json({ "type", "forward", "url", $url });
|
||||
|
||||
# $self->session->http->setRedirect($url);
|
||||
return to_json( { "type", "forward", "url", $url } );
|
||||
} ## end sub surveyEnd
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -815,12 +912,13 @@ sub prepareShowSurveyTemplate {
|
|||
$$q{'verte'} = "</p>";
|
||||
}
|
||||
} ## end foreach my $q (@$questions)
|
||||
$section->{'questions'} = $questions;
|
||||
$section->{'questions'} = $questions;
|
||||
$section->{'questionsAnswered'} = $self->response->{questionsAnswered};
|
||||
$section->{'totalQuestions'} = @{$self->response->surveyOrder};
|
||||
$section->{'showProgress'} = $self->get('showProgress');
|
||||
$section->{'showTimeLimit'} = $self->get('showTimeLimit');
|
||||
$section->{'minutesLeft'} = int((($self->response->startTime() + (60 * $self->get('timeLimit'))) - time())/60);
|
||||
$section->{'totalQuestions'} = @{ $self->response->surveyOrder };
|
||||
$section->{'showProgress'} = $self->get('showProgress');
|
||||
$section->{'showTimeLimit'} = $self->get('showTimeLimit');
|
||||
$section->{'minutesLeft'}
|
||||
= int( ( ( $self->response->startTime() + ( 60 * $self->get('timeLimit') ) ) - time() ) / 60 );
|
||||
|
||||
my $out = $self->processTemplate( $section, $self->get("surveyQuestionsId") );
|
||||
|
||||
|
|
@ -944,8 +1042,8 @@ sub getResponseId {
|
|||
userId => $id,
|
||||
ipAddress => $ip,
|
||||
username => $self->session->user->username,
|
||||
startDate => $time,#WebGUI::DateTime->now->toDatabase,
|
||||
endDate => 0,#WebGUI::DateTime->now->toDatabase,
|
||||
startDate => $time, #WebGUI::DateTime->now->toDatabase,
|
||||
endDate => 0, #WebGUI::DateTime->now->toDatabase,
|
||||
assetId => $self->getId(),
|
||||
anonId => $anonId
|
||||
}
|
||||
|
|
@ -954,7 +1052,7 @@ sub getResponseId {
|
|||
$self->response->createSurveyOrder();
|
||||
$self->{responseId} = $responseId;
|
||||
$self->saveResponseJSON();
|
||||
|
||||
|
||||
} ## end if ( $haveTaken < $allowedTakes)
|
||||
else {
|
||||
$self->session->log->debug("haveTaken ($haveTaken) >= allowedTakes ($allowedTakes)");
|
||||
|
|
@ -985,14 +1083,14 @@ sub canTakeSurvey {
|
|||
if ( $id == 1 ) {
|
||||
$takenCount = $self->session->db->quickScalar(
|
||||
"select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ?
|
||||
and isComplete = ?", [ $id, $ip, $self->getId(), 1 ]
|
||||
and isComplete > ?", [ $id, $ip, $self->getId(), 0 ]
|
||||
);
|
||||
}
|
||||
else {
|
||||
$takenCount
|
||||
= $self->session->db->quickScalar(
|
||||
"select count(*) from Survey_response where userId = ? and assetId = ? and isComplete = ?",
|
||||
[ $id, $self->getId(), 1 ] );
|
||||
"select count(*) from Survey_response where userId = ? and assetId = ? and isComplete > ?",
|
||||
[ $id, $self->getId(), 0 ] );
|
||||
}
|
||||
|
||||
if ( $takenCount >= $maxTakes ) {
|
||||
|
|
@ -1004,32 +1102,36 @@ sub canTakeSurvey {
|
|||
return $self->{canTake};
|
||||
|
||||
} ## end sub canTakeSurvey
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_viewGradeBook{
|
||||
sub www_viewGradeBook {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get("groupToViewReports") ) );
|
||||
|
||||
|
||||
$self->loadTempReportTable();
|
||||
|
||||
my @peoples = $self->session->db->quickArray("SELECT UNIQUE(Survey_responseId) from Survey_tempReport where assetId = ?",[$self->getId()]);
|
||||
for my $people(@peoples){
|
||||
|
||||
my @peoples
|
||||
= $self->session->db->quickArray( "SELECT UNIQUE(Survey_responseId) from Survey_tempReport where assetId = ?",
|
||||
[ $self->getId() ] );
|
||||
for my $people (@peoples) {
|
||||
|
||||
#my $
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
} ## end sub www_viewGradeBook
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub www_exportSimpleResults{
|
||||
sub www_exportSimpleResults {
|
||||
my $self = shift;
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
|
||||
return $self->session->privilege->insufficient()
|
||||
unless ( $self->session->user->isInGroup( $self->get("groupToViewReports") ) );
|
||||
|
||||
|
||||
$self->loadTempReportTable();
|
||||
|
||||
|
||||
my $filename = $self->session->url->escape( $self->get("title") . "_results.tab" );
|
||||
my $content
|
||||
= $self->session->db->quickTab(
|
||||
|
|
|
|||
|
|
@ -693,7 +693,7 @@ Logs an error to the webgui log file, using the session logger.
|
|||
sub log {
|
||||
my ( $self, $message ) = @_;
|
||||
if ( defined $self->{log} ) {
|
||||
$self->{log}->error($message);
|
||||
$self->{log}->debug($message);
|
||||
}
|
||||
}
|
||||
1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue