--- loncom/interface/statistics/lonsurveyreports.pm 2004/07/06 15:56:42 1.2 +++ loncom/interface/statistics/lonsurveyreports.pm 2005/03/01 22:04:55 1.3 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonsurveyreports.pm,v 1.2 2004/07/06 15:56:42 matthew Exp $ +# $Id: lonsurveyreports.pm,v 1.3 2005/03/01 22:04:55 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -96,7 +96,7 @@ sub BuildSurveyReportsPage { 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,12 +119,12 @@ 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'}); + ($resource->src); &make_HTML_report($r,$current_problem,\%Data,\@Students); } $r->print('
'); @@ -147,12 +147,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 +168,13 @@ sub SurveyProblemSelector { } $Str .= ''.$/; $Str .= ''.''. - ''. - ''. + ''. ''.$/; + 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 +182,15 @@ sub SurveyProblemSelector { if ($ENV{'form.problemchoice'} eq $value) { $checked = 'checked '; } - $Str .= ''.''. - ''. - ''. - ''.$/; + ''.$/; } $Str .= '
'.&mt('Sequence').''.&mt('Problem').''.&mt('Survey').'
'. - '{'res'}->src. + '?symb='.&Apache::lonnet::escape($problem->{'res'}->symb); + $Str .= '
'. + ''.''.$problem->{'seq'}->{'title'}.''.$problem->{'res'}->{'title'}.'
'. + '
'; return $Str; @@ -202,28 +207,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}++; @@ -252,14 +262,17 @@ sub make_HTML_report { &Compile_Student_Answers($problem,$ProblemData,$Students); # &output_hash('',$ProblemData); my $resource = $problem->{'resource'}; - foreach my $partid (@{$resource->{'parts'}}) { - my $partdata = $resource->{'partdata'}->{$partid}; - for (my $i=0;$i<=@{$partdata->{'ResponseIds'}};$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 $Str = ''.$/; - my $respid = $partdata->{'ResponseIds'}->[$i]; - my $resptype = $partdata->{'ResponseTypes'}->[$i]; + my $respid = $response_ids[$i]; + my $resptype = $response_types[$i]; my $data = $problem->{'responsedata'}->{$partid}->{$respid}; - next if (! defined($data) || ref($data) ne 'HASH'); + if (! defined($data) || ref($data) ne 'HASH') { + next; + } # Debugging code # $Str .= ''. # ''. @@ -270,7 +283,7 @@ sub make_HTML_report { ''. ''. ''. - ''.$/; + ''; if (exists($data->{'responses'}) && ref($data->{'responses'}) eq 'ARRAY') { &randomize_array($data->{'responses'}); @@ -284,6 +297,41 @@ sub make_HTML_report { '
'. ''.$/; } + } elsif (exists($data->{'foil_count'}) && + exists($data->{'foil_responses'})) { + $Str.=''; } elsif (exists($data->{'_count'}) && exists($data->{'foil_values'}) && exists($data->{'map'})) { @@ -370,8 +418,6 @@ sub CreateInterface { return $Str; } - - 1; __END__
'.$partid.''.&mt('Total').''.$data->{'_count'}.''.&mt('Part [_1], Response [_2]',$partid,$respid).'
'. + ''; + my $tmp = ''; + my @foils = sort(keys(%{$data->{'foil_responses'}})); + foreach my $foilid (@foils) { + my $prob_data = $ProblemData->{$partid.'.'.$respid}; + my $foil_count = $data->{'foil_count'}->{$foilid}; + my $foiltext = $prob_data->{'_Foils'}->{$foilid}->{'text'}; + my $foilname = $prob_data->{'_Foils'}->{$foilid}->{'name'}; + my $rowspan = scalar(@{$prob_data->{'_Options'}}); + my $preamble = ''. + ''. + ''; + foreach my $option (sort(@{$prob_data->{'_Options'}})){ + my $count = + $data->{'foil_responses'}->{$foilid}->{$option}; + $tmp .= $preamble. + ''. + ''. + ''.$/; + $preamble = ''; + } + } + $Str.=$tmp.'
'.join('', + (&mt('Foil Name'), + &mt('Foil Text'), + &mt('Option'), + &mt('Frequency'), + &mt('Percent'))).'
'. + $foilname.''. + $foiltext.''.$option.''.$count.''. + sprintf('%.2f',100*$count/$foil_count).'%'. + '