From f18d4e193ef7c701ff417488a043acdad04c633e Mon Sep 17 00:00:00 2001 From: Patrick Donelan Date: Thu, 14 May 2009 07:14:38 +0000 Subject: [PATCH] Added crud for Survey test suites --- ...ot_import_survey_default-survey-edit.wgpkg | Bin 2002 -> 2019 bytes docs/upgrades/upgrade_7.7.5-7.7.6.pl | 9 + lib/WebGUI/Asset/Wobject/Survey.pm | 372 +++++++++++++++++- lib/WebGUI/Asset/Wobject/Survey/Test.pm | 88 +++++ lib/WebGUI/i18n/English/Asset_Survey.pm | 40 ++ 5 files changed, 502 insertions(+), 7 deletions(-) create mode 100644 lib/WebGUI/Asset/Wobject/Survey/Test.pm diff --git a/docs/upgrades/packages-7.7.6/root_import_survey_default-survey-edit.wgpkg b/docs/upgrades/packages-7.7.6/root_import_survey_default-survey-edit.wgpkg index 9af1c4a429117d7abf6adb56e51a28b26fed61c1..0a4e0e496b748fa2e6fc552a442b12d80f29f6f2 100644 GIT binary patch literal 2019 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 + print "DONE!\n" unless $quiet; +} + sub addCollaborationColumns { my $session = shift; print "\tAdding columns to store htmlArea Rich Editor and Filter Code for Replies in Collaboration Table ..." unless $quiet; diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 5b08b1a39..b7a8d66f1 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -650,6 +650,18 @@ sub www_editSurvey { return $self->processTemplate( {}, $self->get('surveyEditTemplateId') ); } +sub getAdminConsole { + my $self = shift; + my $ac = $self->SUPER::getAdminConsole; + my $i18n = WebGUI::International->new($self->session, "Asset_Survey"); + my $edit = WebGUI::International->new($self->session, "WebGUI")->get(575); + $ac->addSubmenuItem($self->session->url->page("func=edit"), $edit); + $ac->addSubmenuItem($self->session->url->page("func=editSurvey"), "$edit Survey"); + $ac->addSubmenuItem($self->session->url->page("func=graph"), $i18n->get('survey visualization')); + $ac->addSubmenuItem($self->session->url->page("func=editTestSuite"), $i18n->get("test suite")); + return $ac; +} + #------------------------------------------------------------------- =head2 www_graph ( ) @@ -668,12 +680,7 @@ sub www_graph { my $i18n = WebGUI::International->new($session, "Asset_Survey"); - use WebGUI::AdminConsole; - my $ac = WebGUI::AdminConsole->new($self->session, $i18n->get('survey visualization')); - $ac->setIcon($session->url->extras('assets/survey.gif')); - my $edit = WebGUI::International->new($session, "WebGUI")->get(575); - $ac->addSubmenuItem($self->session->url->page("func=edit"), $edit); - $ac->addSubmenuItem($self->session->url->page("func=editSurvey"), "$edit Survey"); + my $ac = $self->getAdminConsole; eval 'use GraphViz'; if ($@) { @@ -733,7 +740,7 @@ sub www_submitObjectEdit { my $self = shift; return $self->session->privilege->insufficient() - if !$self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); my $params = $self->session->form->paramsHashRef(); @@ -2334,4 +2341,355 @@ sub www_downloadDefaultQuestionTypes{ return $self->export( "WebGUI-Survey-DefaultQuestionTypes.json", $content ); } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#------------------------------------------------------------------- + +=head2 www_deleteTest ( ) + +Deletes a test + +=cut + +sub www_deleteTest { + my $self = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + my $test = WebGUI::Asset::Wobject::Survey::Test->new($session, $session->form->get("testId")); + if (defined $test) { + $test->delete; + } + return $self->www_editTestSuite; +} + +#------------------------------------------------------------------ + +=head2 www_demoteTest ( ) + +Moves a Test down one position + +=cut + +sub www_demoteTest { + my $self = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + my $test = WebGUI::Asset::Wobject::Survey::Test->new($session, $session->form->get("testId")); + if (defined $test) { + $test->demote; + } + return $self->www_editTestSuite; +} + +#------------------------------------------------------------------- + +=head2 www_editTestSuite ( $error ) + +Configure a set of tests + +=head3 $error + +Allows another method to pass an error into this method, to display to the user. + +=cut + +sub www_editTestSuite { + my $self = shift; + my $error = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + if ($error) { + $error = qq|
$error
\n|; + } + my $i18n = WebGUI::International->new($session, "Asset_Survey"); + my $addmenu = '
'; + $addmenu .= sprintf '%s', $session->url->page('func=editTest'), $i18n->get('add a test'); + $addmenu .= '
'; + + my $testsFound = 0; + my $tests = ''; + my $getATest = WebGUI::Asset::Wobject::Survey::Test->getAllIterator($session); + my $icon = $session->icon; + while (my $test = $getATest->()) { + $testsFound++; + my $id = $test->getId; + my $name = $test->get('name'); + $tests .= ''; + } + $tests .= '
' . $i18n->get('test name') . '
' + . $icon->delete( 'func=deleteTest;testId='.$id, undef, $i18n->get('confirm delete test')) + . $icon->edit( 'func=editTest;testId='.$id) + . $icon->moveDown('func=demoteTest;testId='.$id) + . $icon->moveUp( 'func=promoteTest;testId='.$id) + . ''.$name.'
'; + + my $out = $error . $addmenu; + $out .= $tests if $testsFound; + + my $ac = $self->getAdminConsole; + return $ac->render($out, 'Survey'); +} + +##------------------------------------------------------------------- +# +#=head2 www_editTestSuiteSave ( ) +# +#Saves the results of www_editTestSuite() +# +#=cut +# +#sub www_editTestSuiteSave { +# my $self = shift; +# my $session = $self->session; +# +# return $self->session->privilege->insufficient() +# unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); +# my $session = shift; +# return $session->privilege->insufficient() unless canView($session); +# my $i18n = WebGUI::International->new($session, 'Survey'); +# return www_editTestSuite($session, $i18n->get('already active')) +# if analysisActive($session); +# my $workflow = WebGUI::Workflow->new($session, 'Survey000001'); +# return www_editTestSuite($session, $i18n->get('workflow deleted')) unless defined $workflow; +# my $delta = $session->form->process('pauseInterval','integer'); +# my $activities = $workflow->getActivities(); +# ##Note, they're in order, and the order is known. +# $activities->[0]->set('deltaInterval', $delta); +# $activities->[1]->set('userId', $session->user->userId); +# my $instance = WebGUI::Workflow::Instance->create($session, { +# workflowId => $workflow->getId, +# priority => 1, +# }); +# if (!defined $instance) { +# return www_editTestSuite($session, $i18n->get('currently running')) if $session->stow->get('singletonWorkflowClash'); +# return www_editTestSuite($session, $i18n->get('error creating workflow')); +# } +# $instance->start('skipRealtime'); +# $session->db->write('update surveyStatus set startDate=NOW(), userId=?, endDate=?, running=1', [$session->user->userId, '']); +# return www_editTestSuite($session); +#} + + +#------------------------------------------------------------------- + +=head2 www_editTest ( ) + +Displays a form to edit the properties test. + +=cut + +sub www_editTest { + my $self = shift; + my $error = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + if ($error) { + $error = qq|
$error
\n|; + } + ##Make a Survey test to use to populate the form. + my $testId = $session->form->get('testId'); + my $test; + if ($testId) { + $test = WebGUI::Asset::Wobject::Survey::Test->new($session, $testId); + } + else { + ##We need a temporary test so that we can call dynamicForm, below + $testId = 'new'; + $test = WebGUI::Asset::Wobject::Survey::Test->create($session, { assetId => $self->getId }); + } + + ##Build the form + my $form = WebGUI::HTMLForm->new($session); + $form->hidden( name=>"func", value=>"editTestSave"); + $form->hidden( name=>"testId", value=>$testId); + $form->hidden( name=>"assetId", value=>$self->getId); + $form->dynamicForm([WebGUI::Asset::Wobject::Survey::Test->crud_definition($session)], 'properties', $test); + $form->submit; + + my $i18n = WebGUI::International->new($session, 'Asset_Survey'); + my $ac = $self->getAdminConsole; + + if ($testId eq 'new') { + $test->delete; + } + return $ac->render($error.$form->print, $i18n->get('Edit Test')); +} + +#------------------------------------------------------------------- + +=head2 www_editTestSave ( ) + +Saves the results of www_editTest(). + +=cut + +sub www_editTestSave { + my $self = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + my $form = $session->form; + +# eval { +# 'fooBarBaz' =~ qr/$regexp/; +# }; +# if ($@) { +# my $error = $@; +# $error =~ s/at \S+?\.pm line \d+.*$//; +# my $i18n = WebGUI::International->new($session, 'Asset_Survey'); +# $error = join ' ', $i18n->get('Regular Expression Error:'), $error; +# return www_editTest($session, $error); +# } + + my $testId = $form->get('testId'); + my $test; + if ($testId eq 'new') { + $test = WebGUI::Asset::Wobject::Survey::Test->create($session, { assetId => $self->getId }); + } + else { + $test = WebGUI::Asset::Wobject::Survey::Test->new($session, $testId); + } + $test->updateFromFormPost if $test; + return $self->www_editTestSuite; +} + + +#------------------------------------------------------------------ + +=head2 www_promoteTest ( ) + +Moves a test up one position + +=head3 session + +A reference to the current session. + +=cut + +sub www_promoteTest { + my $self = shift; + my $session = $self->session; + + return $self->session->privilege->insufficient() + unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); + + my $test = WebGUI::Asset::Wobject::Survey::Test->new($session, $session->form->get("testId")); + if (defined $test) { + $test->promote; + } + return $self->www_editTestSuite; +} + +##------------------------------------------------------------------- +# +#=head2 www_settings ( ) +# +#Configure Test Suite settings. +# +#=cut +# +#sub www_settings { +# my $self = shift; +# my $error = shift; +# my $session = $self->session; +# +# return $self->session->privilege->insufficient() +# unless $self->session->user->isInGroup( $self->get('groupToEditSurvey') ); +# +# if ($error) { +# $error = qq|
$error
\n|; +# } +# my $i18n = WebGUI::International->new($session, "Asset_Survey"); +# my $f = WebGUI::HTMLForm->new($session); +# $f->hidden( +# name=>'func', +# value=>'settingsSave' +# ); +# $f->integer( +# name => 'pauseInterval', +# value => $session->form->get('pauseInterval') || $session->setting->get('surveyInterval') || 300, +# label => $i18n->get('default pause interval'), +# hoverHelp => $i18n->get('default pause interval help'), +# ); +# $f->yesNo( +# name => 'deleteDelta', +# value => $session->form->get('deleteDelta') || $session->setting->get('surveyDeleteDelta') || 0, +# label => $i18n->get('Delete Delta Table?'), +# hoverHelp => $i18n->get('Delete Delta Table? help'), +# ); +# $f->yesNo( +# name => 'enabled', +# value => $session->form->get('enabled') || $session->setting->get('surveyEnabled') || 0, +# label => $i18n->get('Enabled?'), +# hoverHelp => $i18n->get('Enabled? help'), +# ); +# $f->submit(); +# my $ac = WebGUI::AdminConsole->new($session,'survey'); +# $ac->addSubmenuItem($session->url->page('surveyfunc=editTestSuite'), $i18n->get('Test Suite')); +# return $ac->render($error.$f->print, 'Test Suite Settings'); +#} +# +##------------------------------------------------------------------- +# +#=head2 www_settingsSave ( session ) +# +#Save Test Suite settings. +# +#=cut +# +#sub www_settingsSave { +# my $self = shift; +# my $session = $self->session; +# +# return $self->session->privilege->insufficient() +# my $session = shift; +# return $session->privilege->insufficient() unless canView($session); +# my $form = $session->form; +# $session->setting->set('surveyInterval', $form->process('pauseInterval', 'integer')); +# $session->setting->set('surveyDeleteDelta', $form->process('deleteDelta', 'yesNo' )); +# $session->setting->set('surveyEnabled', $form->process('enabled', 'yesNo' )); +# return www_settings($session); +#} + 1; diff --git a/lib/WebGUI/Asset/Wobject/Survey/Test.pm b/lib/WebGUI/Asset/Wobject/Survey/Test.pm new file mode 100644 index 000000000..8c9f7a6bf --- /dev/null +++ b/lib/WebGUI/Asset/Wobject/Survey/Test.pm @@ -0,0 +1,88 @@ +package WebGUI::Asset::Wobject::Survey::Test; + +use base qw/WebGUI::Crud/; +use WebGUI::International; + +=head1 NAME + +Package WebGUI::Asset::Wobject::Survey::Test; + +=head1 DESCRIPTION + +Base class for Survey tests + +=head1 METHODS + +These methods are available from this class: + +=cut + +#------------------------------------------------------------------- + +=head2 crud_definition ( ) + +WebGUI::Crud definition for this class. + +=head3 tableName + +Survey_test + +=head3 tableKey + +testId + +=head3 assetId + +testId + +=head3 sequenceKey + +assetId, e.g. each Survey instance has its own sequence of tests. + +=head3 properties + +=head4 assetId + +Identifies the Survey instance. + +=head4 name + +A name for the test + +=head4 test + +The test code + +=cut + +sub crud_definition { + my ( $class, $session ) = @_; + my $definition = $class->SUPER::crud_definition($session); + $definition->{tableName} = 'Survey_test'; + $definition->{tableKey} = 'testId'; + $definition->{sequenceKey} = 'assetId'; + my $properties = $definition->{properties}; + my $i18n = WebGUI::International->new($session); + $properties->{assetId} = { + fieldType => 'hidden', + defaultValue => undef, + }; + $properties->{name} = { + fieldType => 'text', + label => $i18n->get( 'test name', 'Asset_Survey' ), + hoverHelp => $i18n->get( 'test name help', 'Asset_Survey' ), + defaultValue => '', + }; + $properties->{test} = { + fieldType => 'codearea', + label => $i18n->get( 'test code', 'Asset_Survey' ), + hoverHelp => $i18n->get( 'test code help', 'Asset_Survey' ), + syntax => 'perl', + defaultValue => 'test()', + }; + return $definition; +} + +1; + +#vim:ft=perl diff --git a/lib/WebGUI/i18n/English/Asset_Survey.pm b/lib/WebGUI/i18n/English/Asset_Survey.pm index 9d21057ed..d5bc883ce 100644 --- a/lib/WebGUI/i18n/English/Asset_Survey.pm +++ b/lib/WebGUI/i18n/English/Asset_Survey.pm @@ -1528,6 +1528,46 @@ section/answer.|, context => q|Finish button label on Take Survey page|, lastUpdated => 0, }, + + 'add a test' => { + message => q{Add a test}, + lastUpdated => 0, + }, + + 'confirm delete test' => { + message => q{Are you sure you want to delete this test?}, + lastUpdated => 0, + }, + + 'test suite' => { + message => q{Test Suite}, + lastUpdated => 0, + }, + + 'edit test' => { + message => q{Edit Test}, + lastUpdated => 0, + }, + + 'test name' => { + message => q{Test Name}, + lastUpdated => 0, + }, + + 'test name help' => { + message => q{A descriptive name for this test}, + lastUpdated => 0, + }, + + 'test code' => { + message => q{Test Code}, + lastUpdated => 0, + }, + + 'test code help' => { + message => q{The test code}, + lastUpdated => 0, + }, };