From c9861bdf8f731212d1b0c01dc01a9df5d3dfb315 Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Wed, 13 May 2009 02:10:57 +0000 Subject: [PATCH] More Survey refactoring refactored out repetitive checking of takenCount added i18n template variables to Survey template so that user is told what happened for timeouts etc.. --- .../root_import_survey_default-survey.wgpkg | Bin 0 -> 1470 bytes lib/WebGUI/Asset/Wobject/Survey.pm | 97 +++++++++--------- .../Asset/Wobject/Survey/ResponseJSON.pm | 2 +- lib/WebGUI/Help/Asset_Survey.pm | 4 +- lib/WebGUI/i18n/English/Asset_Survey.pm | 20 +++- 5 files changed, 71 insertions(+), 52 deletions(-) create mode 100644 docs/upgrades/packages-7.7.6/root_import_survey_default-survey.wgpkg diff --git a/docs/upgrades/packages-7.7.6/root_import_survey_default-survey.wgpkg b/docs/upgrades/packages-7.7.6/root_import_survey_default-survey.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..c7df236cb956475057f3e440796f4a753a04597e GIT binary patch literal 1470 zcmV;v1wr~BiwFP!000001MOICZyGre=5v3AwO`Vc+Q1SBfulL4uZgZnqlUD1I_{9e zI^bs4UfEtKz4pJ~*xtnkc1hJX(pAcS2n3Ixc|7Bpd0@A8_fMnI=(O9lTB8wm+70)L zmQSM=hRsH^)!c8jJ2e!B?QpM#V9VVDIc=X}yYbDVCYr(J$ z-QSjdzqk8Aa`uC$0{VWd$K1DpP^(Q1Zk`EPYP?HYn;-u-h|`QN>J>OaE6zYib_ zfg(v7V?{<-DLkGggee)I9{TI=M`m3rF7Sl-AEkn)L?}v(p@GpzV?h8Xdb-fI!CqkY z>xCFg_2Og71*{&KJuHjk1b`IQ`*q`(Uax{hRKgux45*4pfii7+Fv_g->+oSU2$5q! zQw6LFjO8h#&9xNOH?bl*(;wy}Q3f|;G{#H^_rhc@M>glgXe!9{6L(kwW+R)@5hVW* z9sYB|6cG$-QaFCNqb-oN*m<;bq%YIR0`L6ttBtXS*3ak4gBGj?_=b3_ERT%EkQtQV zk8g=gIfFc1WLF7QPSv z#Aiep9_9DPp3&K(!u}ghIuSS`qbtsDwguE!A#JtA#jRKMD+?$hF@Z@0*|Rs-660(f z)A0>7CqYyu7=os9O-1r>XE3D_&1oDXyAxq}tJ^wSUjAKlBnVpYOy6JoW{#Ocifb4} zSw?&X1>w;YG52aQ+kI;InK%61h zcl=#1So9pmDfHXiv#qN#8Uvb;=uM`!vM7wcn}iLGn@yBWiJxiSfyiftGbTWDG5ZwyhAXD|SbllSE6)#XXAXIgNtH^@bhGuJUa z$oKmX&}jii^rTL@6>Z z3$&c_`3ZZ;MPj4jIfqed6=IsZr!s@@R#|ynS4gaCapekr z*>hH8RliD5m2LFol4~=*i0W(kuFJiUHI+)EMAU4su=C!ipX~wzRl0E!Wkt}GyK=_g z>aJ4ElsojyZ_zTD!mo!p^C;3<3 z>AR%$>gfmeXXm8x7`LAvpI)-$$bnFKv5?Rm*W0OSn+a literal 0 HcmV?d00001 diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index e9fa15a5c..408284f9a 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -1212,11 +1212,12 @@ sub view { my $self = shift; my $var = $self->getMenuVars; - my ( $code, $overTakeLimit ) = $self->getResponseInfoForView(); + my ($lastResponseCompleteCode, $lastResponseEndDate) = $self->getLastResponseDetails(); - $var->{lastResponseCompleted} = $code; - $var->{lastResponseTimedOut} = $code > 1 ? 1 : 0; - $var->{maxResponsesSubmitted} = $overTakeLimit; + $var->{lastResponseCompleted} = $lastResponseCompleteCode == 1; + $var->{lastResponseEndDate} = WebGUI::DateTime->new($self->session, $lastResponseEndDate)->toUserTimeZone; + $var->{lastResponseTimedOut} = $lastResponseCompleteCode == 3; + $var->{maxResponsesSubmitted} = !$self->canTakeSurvey(); my $out = $self->processTemplate( $var, undef, $self->{_viewTemplate} ); @@ -1250,20 +1251,18 @@ sub getMenuVars { #------------------------------------------------------------------- -=head2 getResponseInfoForView ( ) +=head2 getLastResponseDetails ( ) -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. +Gets the completeCode and endDate for the most recent response =cut -sub getResponseInfoForView { +sub getLastResponseDetails { my $self = shift; - my ( $code, $taken ); + my ($lastResponseCompleteCode, $lastResponseEndDate); - my $maxResponsesPerUser = $self->getValue('maxResponsesPerUser'); - my $userId = $self->session->user->userId(); + my $userId = $self->session->user->userId(); my $anonId = $self->session->form->process('userid') || $self->session->http->getCookies->{Survey2AnonId} @@ -1272,7 +1271,6 @@ sub getResponseInfoForView { my $ip = $self->session->env->getIp; my $string; - #if there is an anonid or id is for a WG user if ( $anonId or $userId != 1 ) { $string = 'userId'; if ($anonId) { @@ -1284,15 +1282,11 @@ sub getResponseInfoForView { "select Survey_responseId from Survey_response where $string = ? and assetId = ? and isComplete = 0", [ $userId, $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", + ($lastResponseCompleteCode, $lastResponseEndDate) = $self->session->db->quickArray( + "select isComplete, endDate from Survey_response where $string = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1", [ $userId, $self->getId() ] ); } - $taken - = $self->session->db->quickScalar( - "select count(*) from Survey_response where $string = ? and assetId = ? and isComplete > 0", - [ $userId, $self->getId() ] ); } elsif ( $userId == 1 ) { @@ -1301,17 +1295,13 @@ sub getResponseInfoForView { [ $userId, $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', + ($lastResponseCompleteCode, $lastResponseEndDate) = $self->session->db->quickArray( + 'select isComplete, endDate from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0 order by endDate desc limit 1', [ $userId, $ip, $self->getId() ] ); } - $taken = $self->session->db->quickScalar( - 'select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ? and isComplete > 0', - [ $userId, $ip, $self->getId() ] - ); } - return ( $code, $maxResponsesPerUser > 0 && $taken >= $maxResponsesPerUser ); + return ($lastResponseCompleteCode, $lastResponseEndDate); } #------------------------------------------------------------------- @@ -1631,12 +1621,11 @@ sub surveyEnd { } } - # If we get this far, it's time to forward users to an exitUrl my $exitUrl = $opts{exitUrl}; undef $exitUrl if $exitUrl !~ /\w/; undef $exitUrl if $exitUrl eq 'undefined'; - $exitUrl = $exitUrl || $self->get('exitURL') || q{/}; + $exitUrl = $exitUrl || $self->get('exitURL') || $self->getUrl || q{/}; $exitUrl = $self->session->url->gateway($exitUrl) if($exitUrl !~ /^https?:/i); my $json = to_json( { type => 'forward', url => $exitUrl } ); $self->session->http->setMimeType('application/json'); @@ -1855,21 +1844,15 @@ sub responseId { } if ( !$responseId ) { my $maxResponsesPerUser = $self->get('maxResponsesPerUser'); - my $haveTaken; + my $takenCount; if ( $id == 1 ) { - $haveTaken - = $self->session->db->quickScalar( - 'select count(*) from Survey_response where userId = ? and ipAddress = ? and assetId = ?', - [ $id, $ip, $self->getId() ] ); + $takenCount = $self->takenCount( { userId => $id, ipAddress => $ip } ); } else { - $haveTaken - = $self->session->db->quickScalar( - "select count(*) from Survey_response where $string = ? and assetId = ?", - [ $id, $self->getId() ] ); + $takenCount = $self->takenCount( { $string => $id } ); } - if ( $maxResponsesPerUser == 0 || $haveTaken < $maxResponsesPerUser ) { + if ( $maxResponsesPerUser == 0 || $takenCount < $maxResponsesPerUser ) { $responseId = $self->session->db->setRow( 'Survey_response', 'Survey_responseId', { @@ -1891,7 +1874,7 @@ sub responseId { $self->persistResponseJSON(); } else { - $self->session->log->debug("haveTaken ($haveTaken) >= maxResponsesPerUser ($maxResponsesPerUser)"); + $self->session->log->debug("takenCount ($takenCount) >= maxResponsesPerUser ($maxResponsesPerUser)"); } } $self->{responseId} = $responseId; @@ -1899,6 +1882,33 @@ sub responseId { return $self->{responseId}; } +=head2 takenCount + +Counts the number of existing responses +N.B. only counts responses with completeCode of 1 +(others codes indicate abnormal completion such as restart +and thus should not count towards tally) + +=cut + +sub takenCount { + my $self = shift; + my %opts = validate(@_, { userId => 0, anonId => 0, ipAddress => 0 }); + + my $sql = 'select count(*) from Survey_response where'; + $sql .= ' assetId = ' . $self->session->db->quote($self->getId); + $sql .= ' and isComplete = 1'; + for my $o qw(userId anonId ipAddress) { + if (my $o_value = $opts{o}) { + $sql .= " and $o = " . $self->session->db->quote($o_value); + } + } + + my $count = $self->session->db->quickScalar($sql); + $self->session->log->debug($count); + return $count; +} + #------------------------------------------------------------------- =head2 canTakeSurvey @@ -1922,16 +1932,10 @@ sub canTakeSurvey { my $takenCount = 0; if ( $userId == 1 ) { - $takenCount = $self->session->db->quickScalar( - 'select count(*) from Survey_response where userId = ? and ipAddress = ? ' - . 'and assetId = ? and isComplete > ?', [ $userId, $ip, $self->getId(), 0 ] - ); + $takenCount = $self->takenCount( { userId => $userId, ipAddress => $ip }); } else { - $takenCount - = $self->session->db->quickScalar( - 'select count(*) from Survey_response where userId = ? and assetId = ? and isComplete > ?', - [ $userId, $self->getId(), 0 ] ); + $takenCount = $self->takenCount( { userId => $userId }); } # A maxResponsesPerUser value of 0 implies unlimited @@ -1942,7 +1946,6 @@ sub canTakeSurvey { $self->{canTake} = 1; } return $self->{canTake}; - } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm index 2da56f4d3..6952d57b9 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/ResponseJSON.pm @@ -553,7 +553,7 @@ sub recordResponses { $submittedAnswerResponse = $submittedResponses->{ $answer->{id} . '-year' } . " " . $submittedResponses->{ $answer->{id} . '-month' }; } else { if ( !defined $submittedAnswerResponse || $submittedAnswerResponse !~ /\S/ ) { - $self->session->log->debug("Skipping invalid submitted answer response: $submittedAnswerResponse"); + $self->session->log->debug("Skipping invalid submitted answer response: $submittedAnswerResponse") if $submittedAnswerResponse; next; } } diff --git a/lib/WebGUI/Help/Asset_Survey.pm b/lib/WebGUI/Help/Asset_Survey.pm index 6979a5ef4..b68148f88 100644 --- a/lib/WebGUI/Help/Asset_Survey.pm +++ b/lib/WebGUI/Help/Asset_Survey.pm @@ -15,8 +15,8 @@ our $HELP = { }, ], variables => [ - { 'name' => 'lastResponseCompleted' }, - { 'name' => 'lastResponseTimedOut' }, + { 'name' => 'lastResponseCompleted help' }, + { 'name' => 'lastResponseTimedOut help' }, { 'name' => 'maxResponsesSubmitted' }, ], related => [ diff --git a/lib/WebGUI/i18n/English/Asset_Survey.pm b/lib/WebGUI/i18n/English/Asset_Survey.pm index 9b11ad8d2..eaee68574 100644 --- a/lib/WebGUI/i18n/English/Asset_Survey.pm +++ b/lib/WebGUI/i18n/English/Asset_Survey.pm @@ -924,14 +924,30 @@ directly inside the answer_loop for other types of questions.|, context => q|The title of a template Help page.|, lastUpdated => 1078223096 }, - + 'lastResponseCompleted' => { + message => q|You completed this Survey|, + lastUpdated => 1242180657, + }, + + 'lastResponseTimedOut' => { + message => q|Your last Survey response timed out|, + lastUpdated => 1242180657, + }, + + 'lastResponseCompleted help' => { message => q|A boolean indicating whether the current user's last response was completed.|, context => q|Description of a template variable for a template Help page.|, lastUpdated => 0, }, + + 'lastResponseEndDate help' => { + message => q|The date that the user's last response was completed.|, + context => q|Description of a template variable for a template Help page.|, + lastUpdated => 0, + }, - 'lastResponseTimedOut' => { + 'lastResponseTimedOut help' => { message => q|A boolean indicating whether the current user's last response timed out.|, context => q|Description of a template variable for a template Help page.|, lastUpdated => 0,