diff --git a/docs/upgrades/packages-7.6.10/root_import_survey_default_gradebook_report.wgpkg b/docs/upgrades/packages-7.6.10/root_import_survey_default_gradebook_report.wgpkg new file mode 100644 index 000000000..fe3fa9028 Binary files /dev/null and b/docs/upgrades/packages-7.6.10/root_import_survey_default_gradebook_report.wgpkg differ diff --git a/lib/WebGUI/Asset/Wobject/Survey.pm b/lib/WebGUI/Asset/Wobject/Survey.pm index 68a92c0cc..57fc295cf 100644 --- a/lib/WebGUI/Asset/Wobject/Survey.pm +++ b/lib/WebGUI/Asset/Wobject/Survey.pm @@ -15,6 +15,7 @@ use Tie::IxHash; use JSON; use WebGUI::International; use WebGUI::Form::File; +use WebGUI::Utility; use base 'WebGUI::Asset::Wobject'; use WebGUI::Asset::Wobject::Survey::SurveyJSON; use WebGUI::Asset::Wobject::Survey::ResponseJSON; @@ -589,9 +590,30 @@ returns the output. =cut sub view { + my $self = shift; + my $var = $self->getMenuVars; + + 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 getMenuVars ( ) + +Returns the top menu template variables as a hashref. + +=cut + +sub getMenuVars { 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'); @@ -601,15 +623,9 @@ sub view { $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 + return \%var; +} #------------------------------------------------------------------- @@ -1116,22 +1132,51 @@ sub canTakeSurvey { } ## end sub canTakeSurvey #------------------------------------------------------------------- -sub www_viewGradeBook { - my $self = shift; +=head2 www_viewGradeBook (){ + +Returns the Grade Book screen. + +=cut + +sub www_viewGradeBook { + my $self = shift; + my $db = $self->session->db; + return $self->session->privilege->insufficient() unless ( $self->session->user->isInGroup( $self->get("groupToViewReports") ) ); + my $var = $self->getMenuVars; + $self->loadTempReportTable(); - my @peoples - = $self->session->db->quickArray( "SELECT UNIQUE(Survey_responseId) from Survey_tempReport where assetId = ?", - [ $self->getId() ] ); - for my $people (@peoples) { - - #my $ + my $paginator = WebGUI::Paginator->new($self->session,$self->getUrl('func=viewGradebook')); + $paginator->setDataByQuery("select userId,username,ipAddress,Survey_responseId,startDate,endDate + from Survey_response + where assetId=".$db->quote($self->getId)." order by username,ipAddress,startDate"); + my $users = $paginator->getPageData; + $self->loadSurveyJSON(); + $var->{question_count} = $self->survey->questionCount; + + my @responseloop; + foreach my $user (@$users) { + my ($correctCount) = $db->quickArray("select count(*) from Survey_tempReport + where Survey_responseId=? and isCorrect=1",[$user->{Survey_responseId}]); + push(@responseloop, { + # response_url is left out because it looks like Survey doesn't have a viewIndividualSurvey feature + # yet. + #'response_url'=>$self->getUrl('func=viewIndividualSurvey;responseId='.$user->{Survey_responseId}), + 'response_user_name'=>($user->{userId} eq '1') ? $user->{ipAddress} : $user->{username}, + 'response_count_correct' => $correctCount, + 'response_percent' => round(($correctCount/$var->{question_count})*100) + }); } + $var->{response_loop} = \@responseloop; + $paginator->appendTemplateVars($var); + + my $out = $self->processTemplate( $var, $self->get("gradebookTemplateId") ); + return $self->session->style->process( $out, $self->get("styleTemplateId") ); } ## end sub www_viewGradeBook diff --git a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm index dc024ff54..68661f2f7 100644 --- a/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm +++ b/lib/WebGUI/Asset/Wobject/Survey/SurveyJSON.pm @@ -975,6 +975,25 @@ sub question { return $self->{sections}->[ $$address[0] ]->{questions}->[ $$address[1] ]; } +#------------------------------------------------------------------- + +=head2 questionCount (){ + +Return the total number of questions in this survey. + +=cut + +sub questionCount { + my $self = shift; + my $count; + for ( my $s = 0; $s <= $#{ $self->sections() }; $s++ ) { + $count = $count + scalar @{$self->questions( [$s] )}; + } + return $count; +} + +#------------------------------------------------------------------- + =head2 answers ($address) Return a reference to all answers from a particular question. diff --git a/lib/WebGUI/i18n/English/Asset_Survey.pm b/lib/WebGUI/i18n/English/Asset_Survey.pm index cd70d43c2..b81362d36 100644 --- a/lib/WebGUI/i18n/English/Asset_Survey.pm +++ b/lib/WebGUI/i18n/English/Asset_Survey.pm @@ -497,6 +497,24 @@ our $I18N = { lastUpdated => 0, }, + 'percentage label' => { + message => q|Percentage|, + context => q|Label for the Percentage column on the gradebook screen.|, + lastUpdated => 0 + }, + + 'user label' => { + message => q|User|, + context => q|Label for the User column on the gradebook screen.|, + lastUpdated => 0 + }, + + 'score label' => { + message => q|Score|, + context => q|Label for the Score column on the gradebook screen.|, + lastUpdated => 0 + }, + }; 1;