');
$r->rflush();
#
# Determine which problem we are to analyze
my $current_problem = &Apache::lonstathelpers::get_target_from_id
($ENV{'form.problemchoice'});
#
- my ($prev,$curr,$next) =
+ my ($navmap,$prev,$curr,$next) =
&Apache::lonstathelpers::get_prev_curr_next($current_problem,
'.',
'part_survey',
@@ -119,13 +123,18 @@ sub BuildSurveyReportsPage {
$r->print('resource is undefined');
} else {
my $resource = $current_problem->{'resource'};
- $r->print('
'.$resource->{'title'}.'
');
- $r->print('
'.$resource->{'src'}.'
');
+ $r->print('
'.$resource->compTitle.'
');
+ $r->print('
'.$resource->src.'
');
$r->print(&Apache::lonstathelpers::render_resource($resource));
$r->rflush();
my %Data = &Apache::lonstathelpers::get_problem_data
- ($resource->{'src'});
- &make_HTML_report($r,$current_problem,\%Data,\@Students);
+ ($resource->src);
+ if ($ENV{'form.output'} eq 'HTML' ||
+ ! defined($ENV{'form.output'})) {
+ &make_HTML_report($r,$current_problem,\%Data,\@Students);
+ } elsif ($ENV{'form.output'} eq 'Excel') {
+ &make_Excel_report($r,$current_problem,\%Data,\@Students);
+ }
}
$r->print('');
} else {
@@ -147,12 +156,13 @@ sub BuildSurveyReportsPage {
sub SurveyProblemSelector {
my $Str = '';
my @SurveyProblems;
- foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) {
- next if ($seq->{'num_assess'}<1);
- foreach my $res (@{$seq->{'contents'}}) {
- next if ($res->{'type'} ne 'assessment');
- foreach my $part (@{$res->{'parts'}}) {
- if ($res->{'partdata'}->{$part}->{'Survey'}) {
+ my ($navmap,@sequences) =
+ &Apache::lonstatistics::selected_sequences_with_assessments('all');
+ foreach my $seq (@sequences) {
+ my @resources = &Apache::lonstathelpers::get_resources($navmap,$seq);
+ foreach my $res (@resources) {
+ foreach my $part (@{$res->parts}) {
+ if ($res->is_survey($part)) {
push(@SurveyProblems,{res=>$res,seq=>$seq,part=>$part});
last;
}
@@ -167,12 +177,13 @@ sub SurveyProblemSelector {
}
$Str .= '
'.$/;
$Str .= '
'.'
'.
- '
'.&mt('Sequence').'
'.
- '
'.&mt('Problem').'
'.
+ '
'.&mt('Survey').'
'.
'
'.$/;
+ my $id;
foreach my $problem (@SurveyProblems) {
+ $id++;
my $value = &Apache::lonstathelpers::make_target_id
- ({symb=>$problem->{'res'}->{'symb'},
+ ({symb=>$problem->{'res'}->symb,
part=>$problem->{'part'},
respid=>undef,
resptype=>undef});
@@ -180,12 +191,15 @@ sub SurveyProblemSelector {
if ($ENV{'form.problemchoice'} eq $value) {
$checked = 'checked ';
}
- $Str .= '
';
return $Str;
@@ -202,28 +216,33 @@ sub Compile_Student_Answers {
my ($problem,$ProblemData,$Students) = @_;
my $resource = $problem->{'resource'};
foreach my $student (@$Students) {
- foreach my $partid (@{$resource->{'parts'}}) {
- my $partdata = $resource->{'partdata'}->{$partid};
- for (my $i=0;$i<=@{$partdata->{'ResponseIds'}};$i++) {
- my $respid = $partdata->{'ResponseIds'}->[$i];
- my $resptype = $partdata->{'ResponseTypes'}->[$i];
+ foreach my $partid (@{$resource->parts}) {
+ my @response_ids = $resource->responseIds($partid);
+ my @response_types = $resource->responseType($partid);
+ for (my $i=0;$i<=$#response_ids;$i++) {
+ my $respid = $response_ids[$i];
+ my $resptype = $response_types[$i];
my $results =
&Apache::loncoursedata::get_response_data_by_student
- ($student,$resource->{'symb'},$respid);
+ ($student,$resource->symb,$respid);
next if (! defined($results) || ref($results) ne 'ARRAY' ||
ref($results->[0]) ne 'ARRAY');
my $student_response =
$results->[0]->[&Apache::loncoursedata::RDs_submission()];
$problem->{'responsedata'}->{$partid}->{$respid}->{'_count'}++;
my $data = $problem->{'responsedata'}->{$partid}->{$respid};
- if ($resptype =~ /^(radiobutton|optionresponse)$/) {
- # Restricted response type can be categorized.
- #
- # Assume responses were not randomized and the order
- # represents their value. This is probably a dumb thing
- # to do...
- #
- my ($foil,$value) = split('=',$student_response);
+ if ($resptype =~ /^(option|match)$/) {
+ my @responses = split('&',$student_response);
+ foreach my $response (@responses) {
+ my ($foilid,$option) =
+ map {
+ &Apache::lonnet::unescape($_);
+ } split('=',$response);
+ $data->{'foil_count'}->{$foilid}++;
+ $data->{'foil_responses'}->{$foilid}->{$option}++;
+ }
+ } elsif ($resptype =~ /^(radiobutton)$/) {
+ my ($foil,$value) = map { &Apache::lonnet::unescape($_); } split('=',$student_response);
$value += 1; # explicitly increment it...
$data->{'foil_responses'}->{$foil}++;
$data->{'foil_values'}->{$value}++;
@@ -243,6 +262,122 @@ sub Compile_Student_Answers {
#########################################################
#########################################################
##
+## make_Excel_report
+##
+#########################################################
+#########################################################
+sub make_Excel_report {
+ my ($r,$problem,$problem_data,$students) = @_;
+ &Compile_Student_Answers($problem,$problem_data,$students);
+ my ($workbook,$filename,$format) = &Apache::loncommon::create_workbook($r);
+ if (! defined($workbook)) { return '';}
+ $r->print('');
+ my $worksheet = $workbook->addworksheet('Survey Reports');
+ #
+ my $rows_output=0;
+ $worksheet->write($rows_output++,0,
+ $ENV{'course.'.$ENV{'request.course.id'}.'.description'},
+ $format->{'h1'});
+ $rows_output++;
+ #
+ my $resource = $problem->{'resource'};
+ $worksheet->write($rows_output++,0,$resource->compTitle,$format->{'h2'});
+ foreach my $partid (@{$resource->parts}) {
+ my @response_ids = $resource->responseIds($partid);
+ my @response_types = $resource->responseType($partid);
+ for (my $i=0;$i<=$#response_ids;$i++) {
+ my $respid = $response_ids[$i];
+ my $resptype = $response_types[$i];
+ my $data = $problem->{'responsedata'}->{$partid}->{$respid};
+ my $cols_output=0;
+ $worksheet->write($rows_output,$cols_output++,
+ $resource->part_display($partid),$format->{'h3'});
+ $worksheet->write($rows_output,$cols_output++,
+ 'Response '.$respid.', '.$resptype,
+ $format->{'h3'});
+ $rows_output++;
+ if (exists($data->{'responses'}) &&
+ ref($data->{'responses'}) eq 'ARRAY') {
+ my $warned_about_size = 0;
+ foreach my $data (@{$data->{'responses'}}) {
+ if (length($data) > 255 && ! $warned_about_size) {
+ $r->print('
'.
+ &mt('[_1]:[_2] responses to [_3] may be too long to fit Excel spreadsheet.',
+ $resource->compTitle,
+ $resource->part_display($partid),
+ $respid).
+ '