diff --git a/docs/upgrades/upgrade_7.6.14-7.7.0.pl b/docs/upgrades/upgrade_7.6.14-7.7.0.pl index 78afb4d48..8140cae2a 100644 --- a/docs/upgrades/upgrade_7.6.14-7.7.0.pl +++ b/docs/upgrades/upgrade_7.6.14-7.7.0.pl @@ -37,6 +37,7 @@ addGroupToAddToMatrix( $session ); addScreenshotTemplatesToMatrix( $session ); surveyDoAfterTimeLimit($session); surveyRemoveResponseTemplate($session); +surveyEndWorkflow($session); installAssetHistory($session); # Passive Analytics @@ -85,6 +86,14 @@ sub surveyDoAfterTimeLimit { print "DONE!\n" unless $quiet; } +#---------------------------------------------------------------------------- +sub surveyEndWorkflow { + my $session = shift; + print "\tAdding column onSurveyEndWorkflowId to Survey table... " unless $quiet; + $session->db->write('alter table Survey add onSurveyEndWorkflowId varchar(22) character set utf8 collate utf8_bin'); + print "DONE!\n" unless $quiet; +} + #---------------------------------------------------------------------------- sub surveyRemoveResponseTemplate { my $session = shift; diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 8792acc00..95282db7c 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -182,6 +182,17 @@ sub definition { autoGenerate => 0, noFormPost => 1, }, + onSurveyEndWorkflowId => { + tab => 'properties', + defaultValue => undef, + type => 'WebGUI::Asset::Wobject::Survey', + fieldType => 'workflow', + label => 'Survey End Workflow', + hoverHelp => 'Workflow to run when user completes the Survey', + # label => $i18n->get('editForm workflowIdAddEntry label'), + # hoverHelp => $i18n->get('editForm workflowIdAddEntry description'), + none => 1, + }, ); push @{$definition}, { @@ -928,6 +939,47 @@ sub getResponseInfoForView { #------------------------------------------------------------------- +=head2 newByResponseId ( responseId ) + +Class method. Instantiates a Survey instance from the given L<"responseId">, and loads the +user response into the Survey instance. + +=head3 responseId + +An existing L<"responseId">. Will be loaded even if the response isComplete. + +=cut + +sub newByResponseId { + my $class = shift; + my ($session, $responseId) = validate_pos(@_, {isa => 'WebGUI::Session'}, { type => SCALAR }); + + my ($assetId, $userId) = $session->db->quickArray('select assetId, userId from Survey_response where Survey_responseId = ?', + [$responseId]); + + if (!$assetId) { + $session->log->warn("ResponseId not bound to valid assetId: $responseId"); + return; + } + + if (!$userId) { + $session->log->warn("ResponseId not bound to valid userId: $responseId"); + return; + } + + if (my $survey = $class->new($session, $assetId)) { + # Set the responseId manually rather than calling $self->responseId so that we + # can load a response regardless of whether it's marked isComplete + $survey->{responseId} = $responseId; + return $survey; + } else { + $session->log->warn("Unable to instantiate Asset for assetId: $assetId"); + return; + } +} + +#------------------------------------------------------------------- + =head2 www_takeSurvey The take survey page does very little. It is a simple shell (controlled by surveyTakeTemplateId). @@ -1104,7 +1156,6 @@ sub surveyEnd { $completeCode = defined $completeCode ? $completeCode : 1; if ( my $responseId = $self->responseId ) { - # $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', { @@ -1113,7 +1164,20 @@ sub surveyEnd { isComplete => $completeCode } ); - } + + # Trigger workflow + if ( my $workflowId = $self->get('onSurveyEndWorkflowId') ) { + $self->session->log->debug("Triggering onSurveyEndWorkflowId workflow: $workflowId"); + WebGUI::Workflow::Instance->create( + $self->session, + { workflowId => $workflowId, + methodName => 'newByResponseId', + className => 'WebGUI::Asset::Wobject::Survey', + parameters => $responseId, + } + )->start; + } + } if ($self->get('doAfterTimeLimit') eq 'restartSurvey' && $completeCode == 2){ $self->responseJSON->startTime(scalar time); undef $self->{_responseJSON}; @@ -1310,6 +1374,8 @@ If specified, this user is used rather than the current user sub responseId { my $self = shift; my ($userId) = validate_pos(@_, {type => SCALAR, optional => 1}); + + my $user = WebGUI::User->new($self->session, $userId); if (!defined $self->{responseId}) { @@ -1371,7 +1437,7 @@ sub responseId { Survey_responseId => 'new', userId => $id, ipAddress => $ip, - username => $self->session->user->username, + username => $user ? $user->username : $self->session->user->username, startDate => scalar time, #WebGUI::DateTime->now->toDatabase, endDate => 0, #WebGUI::DateTime->now->toDatabase, assetId => $self->getId(), diff --git a/t/Asset/Wobject/Survey.t b/t/Asset/Wobject/Survey.t index 9d8a1ea36..e2361a58a 100644 --- a/t/Asset/Wobject/Survey.t +++ b/t/Asset/Wobject/Survey.t @@ -18,7 +18,7 @@ my $session = WebGUI::Test->session; #---------------------------------------------------------------------------- # Tests -my $tests = 10; +my $tests = 11; plan tests => $tests + 1; #---------------------------------------------------------------------------- @@ -60,6 +60,10 @@ $survey->surveyJSON_update([1,1], { variable => 'S1Q1' }); $session->user( { userId =>3 } ); $survey->responseIdCookies(0); +my $responseId = $survey->responseId; +my $s = WebGUI::Asset::Wobject::Survey->newByResponseId($session, $responseId); +is($s->getId, $survey->getId, 'newByResponseId returns same Survey'); + #for my $address (@{ $survey->responseJSON->surveyOrder }) { # diag (Dumper $address); #} @@ -87,6 +91,7 @@ $survey->responseIdCookies(0); } } + } #----------------------------------------------------------------------------