version 1.1, 2004/06/15 14:22:45
|
version 1.26, 2011/12/21 21:25:51
|
Line 27
|
Line 27
|
package Apache::lonsurveyreports; |
package Apache::lonsurveyreports; |
|
|
use strict; |
use strict; |
use Apache::lonnet(); |
use Apache::lonnet; |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
|
use Apache::lonquickgrades(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lonstatistics; |
use Apache::lonstatistics; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonstathelpers; |
use Apache::lonstathelpers; |
|
use Spreadsheet::WriteExcel; |
use HTML::Entities(); |
use HTML::Entities(); |
use Time::Local(); |
use Time::Local(); |
|
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
|
|
|
|
my @SubmitButtons = ({ name => 'PrevProblem', |
my @SubmitButtons = ( |
|
{ name => 'break'}, |
|
{ name => 'PrevProblem', |
text => 'Previous Survey' }, |
text => 'Previous Survey' }, |
{ name => 'NextProblem', |
{ name => 'NextProblem', |
text => 'Next Survey' }, |
text => 'Next Survey' }, |
{ name => 'break'}, |
|
{ name => 'SelectAnother', |
{ name => 'SelectAnother', |
text => 'Choose a different Survey Problem' }, |
text => 'Choose a different Survey' }, |
|
{ name => 'break'}, |
{ name => 'Generate', |
{ name => 'Generate', |
text => 'Generate Report'}, |
text => 'Generate Report'}, |
); |
); |
Line 57 sub BuildSurveyReportsPage {
|
Line 64 sub BuildSurveyReportsPage {
|
); |
); |
&Apache::loncommon::store_course_settings('survey_reports', |
&Apache::loncommon::store_course_settings('survey_reports', |
\%Saveable_Parameters); |
\%Saveable_Parameters); |
&Apache::loncommon::restore_course_settings('survey_resports', |
&Apache::loncommon::restore_course_settings('survey_reports', |
\%Saveable_Parameters); |
\%Saveable_Parameters); |
# |
# |
&Apache::lonstatistics::PrepareClasslist(); |
&Apache::lonstatistics::PrepareClasslist(); |
|
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Student Submission Reports')); |
|
&Apache::lonquickgrades::startGradeScreen($r,'statistics'); |
|
|
# |
# |
$r->print(&CreateInterface()); |
$r->print(&CreateInterface()); |
# |
# |
my @Students = @Apache::lonstatistics::Students; |
my @Students = @Apache::lonstatistics::Students; |
# |
# |
if (@Students < 1) { |
if (@Students < 1) { |
$r->print('<h2>There are no students in the sections selected</h2>'); |
$r->print('<p class="LC_warning">'.&mt('There are no students in the sections selected.').'</p>'); |
} |
} |
# |
# |
my @CacheButtonHTML = |
my @CacheButtonHTML = |
&Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); |
&Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); |
$r->rflush(); |
$r->rflush(); |
# |
# |
if (exists($ENV{'form.problemchoice'}) && |
if (exists($env{'form.problemchoice'}) && |
! exists($ENV{'form.SelectAnother'})) { |
! exists($env{'form.SelectAnother'})) { |
|
$r->print(' 'x3); |
foreach my $button (@SubmitButtons) { |
foreach my $button (@SubmitButtons) { |
if ($button->{'name'} eq 'break') { |
if ($button->{'name'} eq 'break') { |
$r->print("<br />\n"); |
$r->print("<br />\n"); |
Line 90 sub BuildSurveyReportsPage {
|
Line 101 sub BuildSurveyReportsPage {
|
} |
} |
# |
# |
$r->print('<hr />'); |
$r->print('<hr />'); |
|
$r->print('<h4>'. |
|
&Apache::lonlocal::locallocaltime(time).', '. |
|
&Apache::lonstatistics::section_and_enrollment_description(). |
|
'</h4>'); |
$r->rflush(); |
$r->rflush(); |
# |
# |
# Determine which problem we are to analyze |
# Determine which problem we are to analyze |
my $current_problem = &Apache::lonstathelpers::get_target_from_id |
my $current_problem = &Apache::lonstathelpers::get_target_from_id |
($ENV{'form.problemchoice'}); |
($env{'form.problemchoice'}); |
# |
# |
my ($prev,$curr,$next) = |
my ($navmap,$prev,$curr,$next) = |
&Apache::lonstathelpers::get_prev_curr_next($current_problem, |
&Apache::lonstathelpers::get_prev_curr_next($current_problem, |
'.', |
'.', |
'part_survey', |
'part_survey', |
); |
); |
if (exists($ENV{'form.PrevProblem'}) && defined($prev)) { |
if (exists($env{'form.PrevProblem'}) && defined($prev)) { |
$current_problem = $prev; |
$current_problem = $prev; |
} elsif (exists($ENV{'form.NextProblem'}) && defined($next)) { |
} elsif (exists($env{'form.NextProblem'}) && defined($next)) { |
$current_problem = $next; |
$current_problem = $next; |
} else { |
} else { |
$current_problem = $curr; |
$current_problem = $curr; |
} |
} |
# |
# |
# Store the current problem choice and send it out in the form |
# Store the current problem choice and send it out in the form |
$ENV{'form.problemchoice'} = |
$env{'form.problemchoice'} = |
&Apache::lonstathelpers::make_target_id($current_problem); |
&Apache::lonstathelpers::make_target_id($current_problem); |
$r->print('<input type="hidden" name="problemchoice" value="'. |
$r->print('<input type="hidden" name="problemchoice" value="'. |
$ENV{'form.problemchoice'}.'" />'); |
$env{'form.problemchoice'}.'" />'); |
# |
# |
if (! defined($current_problem->{'resource'})) { |
if (! defined($current_problem->{'resource'})) { |
$r->print('resource is undefined'); |
$r->print('resource is undefined'); |
} else { |
} else { |
my $resource = $current_problem->{'resource'}; |
my $resource = $current_problem->{'resource'}; |
$r->print('<h1>'.$resource->{'title'}.'</h1>'); |
$r->print('<h1>'.$resource->compTitle.'</h1>'); |
$r->print('<h3>'.$resource->{'src'}.'</h3>'); |
$r->print('<h3>'.$resource->src.'</h3>'); |
$r->print(&Apache::lonstathelpers::render_resource($resource)); |
if ($env{'form.renderprob'} eq 'true') { |
|
$r->print('<hr />' |
|
.&Apache::lonstathelpers::render_resource($resource) |
|
.'<hr />' |
|
); |
|
} |
$r->rflush(); |
$r->rflush(); |
my %Data = &Apache::lonstathelpers::get_problem_data |
my %Data = &Apache::lonstathelpers::get_problem_data |
($resource->{'src'}); |
($resource->src); |
&make_HTML_report($r,$current_problem,\%Data,\@Students); |
&compile_student_answers($r,$current_problem,\%Data,\@Students); |
|
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); |
|
} elsif ($env{'form.output'} eq 'TXT') { |
|
&make_text_report($r,$current_problem,\%Data,\@Students); |
|
} |
} |
} |
$r->print('<hr />'); |
$r->print('<hr />'); |
} else { |
} else { |
Line 147 sub BuildSurveyReportsPage {
|
Line 175 sub BuildSurveyReportsPage {
|
sub SurveyProblemSelector { |
sub SurveyProblemSelector { |
my $Str = ''; |
my $Str = ''; |
my @SurveyProblems; |
my @SurveyProblems; |
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess('all')) { |
my ($navmap,@sequences) = |
next if ($seq->{'num_assess'}<1); |
&Apache::lonstatistics::selected_sequences_with_assessments('all'); |
foreach my $res (@{$seq->{'contents'}}) { |
foreach my $seq (@sequences) { |
next if ($res->{'type'} ne 'assessment'); |
my @resources = &Apache::lonstathelpers::get_resources($navmap,$seq); |
foreach my $part (@{$res->{'parts'}}) { |
foreach my $res (@resources) { |
if ($res->{'partdata'}->{$part}->{'Survey'}) { |
foreach my $part (@{$res->parts}) { |
|
if (($res->is_survey($part)) || ($res->is_anonsurvey($part))) { |
push(@SurveyProblems,{res=>$res,seq=>$seq,part=>$part}); |
push(@SurveyProblems,{res=>$res,seq=>$seq,part=>$part}); |
last; |
last; |
} |
} |
Line 160 sub SurveyProblemSelector {
|
Line 189 sub SurveyProblemSelector {
|
} |
} |
} |
} |
if (! scalar(@SurveyProblems)) { |
if (! scalar(@SurveyProblems)) { |
$Str = '<h1>'. |
$Str = '<p class="LC_warning">'. |
&mt('There are no survey problems in this course'). |
&mt('There are no survey problems in this course.'). |
'</h1>'.$/; |
'</p>'.$/; |
return $Str; |
return $Str; |
} |
} |
$Str .= '<table>'.$/; |
$Str .= '<table>'.$/; |
$Str .= '<tr>'.'<td></td>'. |
$Str .= '<tr>'.'<td></td>'. |
'<th>'.&mt('Sequence').'</th>'. |
'<th>'.&mt('Survey').'</th>'. |
'<th>'.&mt('Problem').'</th>'. |
|
'</tr>'.$/; |
'</tr>'.$/; |
|
my $id; |
foreach my $problem (@SurveyProblems) { |
foreach my $problem (@SurveyProblems) { |
|
$id++; |
my $value = &Apache::lonstathelpers::make_target_id |
my $value = &Apache::lonstathelpers::make_target_id |
({symb=>$problem->{'res'}->{'symb'}, |
({symb=>$problem->{'res'}->symb, |
part=>$problem->{'part'}, |
part=>$problem->{'part'}, |
respid=>undef, |
respid=>undef, |
resptype=>undef}); |
resptype=>undef}); |
my $checked = ''; |
my $checked = ''; |
if ($ENV{'form.problemchoice'} eq $value) { |
if ($env{'form.problemchoice'} eq $value) { |
$checked = 'checked '; |
$checked = 'checked="checked" '; |
} |
} |
$Str .= '<tr>'.'<td>'. |
my $link = $problem->{'res'}->link. |
'<input type="radio" name="problemchoice" '. |
'?symb='.&escape($problem->{'res'}->shown_symb); |
|
$Str .= '<tr><td>'. |
|
'<input type="radio" name="problemchoice" id="'.$id.'" '. |
'value="'.$value.'" '.$checked.'/>'.'</td>'. |
'value="'.$value.'" '.$checked.'/>'.'</td>'. |
'<td>'.$problem->{'seq'}->{'title'}.'</td>'. |
'<td><span class="LC_nobreak">'. |
'<td>'.$problem->{'res'}->{'title'}.'</td>'. |
'<label for="'.$id.'">'.$problem->{'res'}->compTitle.' ('.$problem->{'seq'}->compTitle.')'.'</label>'. |
'</tr>'.$/; |
(' 'x2). |
|
'<a target="preview" href="'.$link.'">'.&mt('View survey').'</a></span></td></tr>'.$/; |
} |
} |
$Str .= '</table>'; |
$Str .= '</table>'; |
return $Str; |
return $Str; |
Line 198 sub SurveyProblemSelector {
|
Line 231 sub SurveyProblemSelector {
|
## |
## |
######################################################### |
######################################################### |
######################################################### |
######################################################### |
sub Compile_Student_Answers { |
sub compile_student_answers { |
my ($problem,$ProblemData,$Students) = @_; |
my ($r,$problem,$ProblemData,$Students) = @_; |
my $resource = $problem->{'resource'}; |
my $resource = $problem->{'resource'}; |
|
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,scalar(@$Students)); |
foreach my $student (@$Students) { |
foreach my $student (@$Students) { |
foreach my $partid (@{$resource->{'parts'}}) { |
foreach my $partid (@{$resource->parts}) { |
my $partdata = $resource->{'partdata'}->{$partid}; |
my @response_ids = $resource->responseIds($partid); |
for (my $i=0;$i<=@{$partdata->{'ResponseIds'}};$i++) { |
my @response_types = $resource->responseType($partid); |
my $respid = $partdata->{'ResponseIds'}->[$i]; |
for (my $i=0;$i<=$#response_ids;$i++) { |
my $resptype = $partdata->{'ResponseTypes'}->[$i]; |
my $respid = $response_ids[$i]; |
|
my $resptype = $response_types[$i]; |
my $results = |
my $results = |
&Apache::loncoursedata::get_response_data_by_student |
&Apache::loncoursedata::get_response_data_by_student |
($student,$resource->{'symb'},$respid); |
($student,$resource->symb,$respid); |
next if (! defined($results) || ref($results) ne 'ARRAY' || |
next if (! defined($results) || ref($results) ne 'ARRAY' || |
ref($results->[0]) ne 'ARRAY'); |
ref($results->[0]) ne 'ARRAY'); |
my $student_response = |
my $student_response = |
$results->[0]->[&Apache::loncoursedata::RDs_submission()]; |
$results->[0]->[&Apache::loncoursedata::RDs_submission()]; |
$problem->{'responsedata'}->{$partid}->{$respid}->{'_count'}++; |
$problem->{'responsedata'}->{$partid}->{$respid}->{'_count'}++; |
my $data = $problem->{'responsedata'}->{$partid}->{$respid}; |
my $data = $problem->{'responsedata'}->{$partid}->{$respid}; |
if ($resptype =~ /^(radiobutton|optionresponse)$/) { |
if ($resptype =~ /^(option|match)$/) { |
# Restricted response type can be categorized. |
my @responses = split('&',$student_response); |
# |
foreach my $response (@responses) { |
# Assume responses were not randomized and the order |
my ($foilid,$option) = |
# represents their value. This is probably a dumb thing |
map { |
# to do... |
&unescape($_); |
# |
} split('=',$response); |
my ($foil,$value) = split('=',$student_response); |
$data->{'foil_count'}->{$foilid}++; |
|
$data->{'foil_responses'}->{$foilid}->{$option}++; |
|
} |
|
} elsif ($resptype =~ /^(radiobutton)$/) { |
|
my ($foil,$value) = map { &unescape($_); } split('=',$student_response); |
$value += 1; # explicitly increment it... |
$value += 1; # explicitly increment it... |
$data->{'foil_responses'}->{$foil}++; |
$data->{'foil_responses'}->{$foil}++; |
$data->{'foil_values'}->{$value}++; |
$data->{'foil_values'}->{$value}++; |
if (! exists($data->{'map'}->{$value})) { |
if (! exists($data->{'map'}->{$value})) { |
$data->{'map'}->{$value} = $foil; |
$data->{'map'}->{$value} = $foil; |
|
$data->{'map_fv'}->{$foil} = $value; |
} |
} |
} else { |
} else { |
# Variable stuff (essays, raw numbers, strings) go here |
# Variable stuff (essays, raw numbers, strings) go here |
Line 236 sub Compile_Student_Answers {
|
Line 276 sub Compile_Student_Answers {
|
} |
} |
} |
} |
} |
} |
|
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
} |
} |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
return; |
|
} |
|
|
|
|
|
######################################################### |
|
######################################################### |
|
## |
|
## make_text_report |
|
## |
|
######################################################### |
|
######################################################### |
|
sub make_text_report { |
|
my ($r,$problem,$problem_data,$students) = @_; |
|
my ($file,$filename) = &Apache::loncommon::create_text_file($r,'txt'); |
|
if (! defined($file)) { return '';} |
|
$r->print('<script>'. |
|
'window.document.Statistics.stats_status.value="'. |
|
&mt('Building text document.'). |
|
'";</script>'); |
|
my $resource = $problem->{'resource'}; |
|
print $file $resource->compTitle.$/; |
|
print $file &Apache::lonstatistics::section_and_enrollment_description(). |
|
' '.&mt('Generated on [_1]',&Apache::lonlocal::locallocaltime(time)). |
|
$/; |
|
my $something_has_been_output = 0; |
|
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}; |
|
if (exists($data->{'responses'}) && |
|
ref($data->{'responses'}) eq 'ARRAY') { |
|
# Essay type response |
|
print $file ('-'x40).$/; |
|
print $file |
|
$resource->part_display($partid).', '.$respid.':'.$resptype.$/; |
|
foreach my $submission (@{$data->{'responses'}}) { |
|
print $file ('-'x20).$/; |
|
$submission =~ s/(\\r\\n|\\n)/\n/g; |
|
$submission =~ s/\\(\'|\"|\`)/$1/g; |
|
print $file $submission.$/.$/; |
|
$something_has_been_output=1; |
|
} |
|
} |
|
} |
|
} |
|
close($file); |
|
if($something_has_been_output) { |
|
$r->print('<p class="LC_info"><a href="'.$filename.'">'. |
|
&mt('Your text file'). |
|
'</a></p>'."\n"); |
|
$r->print('<script>'. |
|
'window.document.Statistics.stats_status.value="'. |
|
&mt('Done compiling text file. See link below to download.'). |
|
'";</script>'); |
|
} else { |
|
$r->print('<p class="LC_warning">' |
|
.&mt('There is no essay or string response data to output for this survey.') |
|
.'</p>'); |
|
} |
|
$r->rflush(); |
|
return; |
|
} |
|
|
|
|
|
######################################################### |
|
######################################################### |
|
## |
|
## make_Excel_report |
|
## |
|
######################################################### |
|
######################################################### |
|
sub make_Excel_report { |
|
my ($r,$problem,$problem_data,$students) = @_; |
|
my ($workbook,$filename,$format) = &Apache::loncommon::create_workbook($r); |
|
if (! defined($workbook)) { return '';} |
|
$r->print('<script>'. |
|
'window.document.Statistics.stats_status.value="'. |
|
&mt('Building spreadsheet.'). |
|
'";</script>'); |
|
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('<p class="LC_warning">'. |
|
&mt('[_1]:[_2] responses to [_3] may be too long to fit Excel spreadsheet.', |
|
$resource->compTitle, |
|
$resource->part_display($partid), |
|
$respid). |
|
'</p>'); |
|
$r->rflush(); |
|
$warned_about_size=1; |
|
} |
|
$worksheet->write($rows_output++,0,$data); |
|
} |
|
} elsif (exists($data->{'foil_count'}) && |
|
exists($data->{'foil_responses'})) { |
|
my $respdata = $problem_data->{$partid.'.'.$respid}; |
|
my @rowdata = ('Foil Name','Foil Text','Option', |
|
'Frequency'); |
|
$worksheet->write_row($rows_output++,0, |
|
\@rowdata,$format->{'h4'}); |
|
# |
|
my @foils = sort(keys(%{$respdata->{'_Foils'}})); |
|
foreach my $foilid (@foils) { |
|
my $foil_count = $data->{'foil_count'}->{$foilid}; |
|
my $foiltext = $respdata->{'_Foils'}->{$foilid}->{'text'}; |
|
my $foilname = $respdata->{'_Foils'}->{$foilid}->{'name'}; |
|
$foiltext = &HTML::Entities::decode($foilname); |
|
my $cols_output=0; |
|
$worksheet->write($rows_output,$cols_output++,$foilname); |
|
$worksheet->write($rows_output,$cols_output++,$foiltext); |
|
my $option_start_col = $cols_output; |
|
# |
|
foreach my $option (sort(@{$respdata->{'_Options'}})){ |
|
$cols_output= $option_start_col; |
|
$worksheet->write($rows_output,$cols_output++, |
|
$option); |
|
my $count= |
|
$data->{'foil_responses'}->{$foilid}->{$option}; |
|
$worksheet->write($rows_output,$cols_output++,$count); |
|
$rows_output++; |
|
} |
|
} |
|
} elsif (exists($data->{'_count'}) && |
|
exists($data->{'foil_values'}) && |
|
exists($data->{'map'})) { |
|
my $respdata = $problem_data->{$partid.'.'.$respid}; |
|
my @rowdata = ('Foil Name','Foil Text','Frequency'); |
|
$worksheet->write_row($rows_output++,0, |
|
\@rowdata,$format->{'h4'}); |
|
my @foils = sort(keys(%{$respdata->{'_Foils'}})); |
|
foreach my $foilid (@foils) { |
|
undef(@rowdata); |
|
my $value = $data->{'map_fv'}->{$foilid}; |
|
push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'name'}); |
|
push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'text'}); |
|
push(@rowdata,$data->{'foil_values'}->{$value}); |
|
$worksheet->write_row($rows_output++,0,\@rowdata); |
|
} |
|
} |
|
$rows_output++; |
|
} #response ids |
|
} # partids |
|
$workbook->close(); |
|
$r->print('<p class="LC_info"><a href="'.$filename.'">'. |
|
&mt('Your Excel spreadsheet.'). |
|
'</a></p>'."\n"); |
|
$r->print('<script>'. |
|
'window.document.Statistics.stats_status.value="'. |
|
&mt('Done compiling spreadsheet. See link below to download.'). |
|
'";</script>'); |
|
$r->rflush(); |
return; |
return; |
} |
} |
|
|
Line 249 sub Compile_Student_Answers {
|
Line 471 sub Compile_Student_Answers {
|
######################################################### |
######################################################### |
sub make_HTML_report { |
sub make_HTML_report { |
my ($r,$problem,$ProblemData,$Students) = @_; |
my ($r,$problem,$ProblemData,$Students) = @_; |
&Compile_Student_Answers($problem,$ProblemData,$Students); |
|
# &output_hash('',$ProblemData); |
|
my $resource = $problem->{'resource'}; |
my $resource = $problem->{'resource'}; |
foreach my $partid (@{$resource->{'parts'}}) { |
foreach my $partid (@{$resource->parts}) { |
my $partdata = $resource->{'partdata'}->{$partid}; |
my @response_ids = $resource->responseIds($partid); |
for (my $i=0;$i<=@{$partdata->{'ResponseIds'}};$i++) { |
my @response_types = $resource->responseType($partid); |
|
for (my $i=0;$i<=$#response_ids;$i++) { |
my $Str = '<table>'.$/; |
my $Str = '<table>'.$/; |
my $respid = $partdata->{'ResponseIds'}->[$i]; |
my $respid = $response_ids[$i]; |
my $resptype = $partdata->{'ResponseTypes'}->[$i]; |
my $resptype = $response_types[$i]; |
my $data = $problem->{'responsedata'}->{$partid}->{$respid}; |
my $data = $problem->{'responsedata'}->{$partid}->{$respid}; |
next if (! defined($data) || ref($data) ne 'HASH'); |
if (! defined($data) || ref($data) ne 'HASH') { |
|
next; |
|
} |
# Debugging code |
# Debugging code |
# $Str .= '<tr>'. |
# $Str .= '<tr>'. |
# '<td>'.$partid.'</td>'. |
# '<td>'.$partid.'</td>'. |
Line 269 sub make_HTML_report {
|
Line 492 sub make_HTML_report {
|
$Str .= '<tr>'. |
$Str .= '<tr>'. |
'<td><b>'.&mt('Total').'</b></td>'. |
'<td><b>'.&mt('Total').'</b></td>'. |
'<td>'.$data->{'_count'}.'</td>'. |
'<td>'.$data->{'_count'}.'</td>'. |
'<td> </td>'. |
'<td>'.&mt('Part [_1], Response [_2]', |
'</tr>'.$/; |
$resource->part_display($partid),$respid).'</td>'. |
|
'</tr>'; |
if (exists($data->{'responses'}) && |
if (exists($data->{'responses'}) && |
ref($data->{'responses'}) eq 'ARRAY') { |
ref($data->{'responses'}) eq 'ARRAY') { |
&randomize_array($data->{'responses'}); |
&randomize_array($data->{'responses'}); |
Line 284 sub make_HTML_report {
|
Line 508 sub make_HTML_report {
|
'</pre><hr /></td>'. |
'</pre><hr /></td>'. |
'</tr>'.$/; |
'</tr>'.$/; |
} |
} |
|
} elsif (exists($data->{'foil_count'}) && |
|
exists($data->{'foil_responses'})) { |
|
$Str.='<tr>' |
|
.'<td colspan="3">' |
|
.&Apache::loncommon::start_data_table() |
|
.&Apache::loncommon::start_data_table_header_row(); |
|
my $tmp = '<th>'.join('</th><th>', |
|
(&mt('Foil Name'), |
|
&mt('Foil Text'), |
|
&mt('Option'), |
|
&mt('Frequency'), |
|
&mt('Percent'))).'</th>' |
|
.&Apache::loncommon::end_data_table_header_row(); |
|
my @foils = sort(keys(%{$ProblemData->{$partid.'.'.$respid}->{'_Foils'}})); |
|
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 = &Apache::loncommon::start_data_table_row(). |
|
'<td valign="top" rowspan="'.$rowspan.'">'. |
|
$foilname.'</td>'. |
|
'<td valign="top" rowspan="'.$rowspan.'">'. |
|
$foiltext.'</td>'; |
|
foreach my $option (sort(@{$prob_data->{'_Options'}})){ |
|
my $count = |
|
$data->{'foil_responses'}->{$foilid}->{$option}; |
|
$tmp .= $preamble. |
|
'<td>'.$option.'</td>'. |
|
'<td align="right">'.$count.'</td>'. |
|
'<td align="right">'. |
|
sprintf('%.2f',100*$count/$foil_count).'%'. |
|
'</td>'.&Apache::loncommon::end_data_table_row().$/; |
|
$preamble = &Apache::loncommon::continue_data_table_row(); #&Apache::loncommon::start_data_table_row(); |
|
} |
|
} |
|
$Str.=$tmp.&Apache::loncommon::end_data_table() |
|
.'</td></tr>'; |
} elsif (exists($data->{'_count'}) && |
} elsif (exists($data->{'_count'}) && |
exists($data->{'foil_values'}) && |
exists($data->{'foil_values'}) && |
exists($data->{'map'})) { |
exists($data->{'map'})) { |
Line 291 sub make_HTML_report {
|
Line 554 sub make_HTML_report {
|
my $total = $data->{'_count'}; |
my $total = $data->{'_count'}; |
my $sum = 0; |
my $sum = 0; |
my $tmp; |
my $tmp; |
foreach my $value (sort(keys(%{$data->{'foil_values'}}))) { |
my @foils = sort(keys(%{$ProblemData->{$partid.'.'.$respid} |
|
->{'_Foils'}})); |
|
foreach my $foilid (@foils) { |
|
my $value = $data->{'map_fv'}->{$foilid}; |
my $count = $data->{'foil_values'}->{$value}; |
my $count = $data->{'foil_values'}->{$value}; |
my $foilid = $data->{'map'}->{$value}; |
|
my $foiltext = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'text'}; |
my $foiltext = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'text'}; |
my $foilname = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'name'}; |
my $foilname = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'name'}; |
$sum = $value * $data->{'foil_values'}->{$value}; |
$tmp .= &Apache::loncommon::start_data_table_row(). |
$tmp .= '<tr>'. |
|
'<td>'.$foilname.'</td>'. |
'<td>'.$foilname.'</td>'. |
'<td>'.$foiltext.'</td>'. |
'<td>'.$foiltext.'</td>'. |
'<td align="right">'.$count.'</td>'. |
'<td align="right">'.$count.'</td>'. |
'<td align="right">'. |
'<td align="right">'. |
sprintf("%.2f",$count/$total*100).'%</td>'. |
sprintf("%.2f",$count/$total*100).'%</td>'. |
'</tr>'.$/; |
&Apache::loncommon::end_data_table_row().$/; |
} |
} |
$Str .= '<tr>'. |
$Str.='<tr>' |
'<td><b>'.&mt('mean').'</b></td>'. |
.'<td colspan="3">' |
'<td>'.sprintf("%.2f",$sum/$total).'</td>'. |
.&Apache::loncommon::start_data_table() |
'<td> </td>'. |
.&Apache::loncommon::start_data_table_header_row() |
'<td> </td>'. |
.'<th>'.&mt('Foil Name').'</th>' |
'</tr>'.$/. |
.'<th>'.&mt('Text').'</th>' |
'<tr>'. |
.'<th>'.&mt('Frequency').'</th>' |
'<th>'.&mt('Foil Name').'</th>'. |
.'<th>'.&mt('Percent').'</th>' |
'<th>'.&mt('Text').'</th>'. |
.&Apache::loncommon::end_data_table_header_row().$/ |
'<th>'.&mt('Freq').'</th>'. |
.$tmp |
'<th>'.&mt('Percent').'</th>'. |
.&Apache::loncommon::end_data_table() |
'</tr>'.$/. |
.'</td></tr>'; |
$tmp; |
|
} |
} |
$Str.= '</table><hr />'; |
$Str.= '</table>'; |
$r->print($Str); |
$r->print($Str); |
$r->rflush(); |
$r->rflush(); |
} |
} |
Line 348 sub CreateInterface {
|
Line 611 sub CreateInterface {
|
## |
## |
## Environment variable initialization |
## Environment variable initialization |
my $Str = ''; |
my $Str = ''; |
$Str .= &Apache::lonhtmlcommon::breadcrumbs |
my $output_selector = '<select name="output" size="5">'.$/; |
(undef,'Student Submission Reports'); |
if (! exists($env{'form.output'})) { |
|
$env{'form.output'} = 'HTML'; |
|
} |
|
foreach my $output_format ( {name=>'HTML',text=>&mt("HTML") }, |
|
{name=>'Excel',text=>&mt("Excel") }, |
|
{name=>'TXT',text=>&mt("Text (essays only)") }, |
|
) { |
|
$output_selector.='<option value="'.$output_format->{'name'}.'"'; |
|
if ($env{'form.output'} eq $output_format->{'name'}) { |
|
$output_selector.=' selected="selected"'; |
|
} |
|
$output_selector.= '>'.$output_format->{'text'}.'</option>'.$/; |
|
} |
|
$output_selector .= '</select>'.$/; |
$Str .= '<p>'; |
$Str .= '<p>'; |
$Str .= '<table cellspacing="5">'."\n"; |
$Str .= &Apache::loncommon::start_data_table(); |
$Str .= '<tr>'; |
$Str .= &Apache::loncommon::start_data_table_header_row(); |
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
$Str .= '<th>'.&mt('Sections').'</th>'; |
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<th>'.&mt('Groups').'</th>'; |
$Str .= '</tr>'."\n"; |
$Str .= '<th>'.&mt('Access Status').'</th>'; |
|
$Str .= '<th>'.&mt('Output Format').'</th>'; |
|
$Str .= '<th>'.&mt('Options').'</th>'; |
|
$Str .= &Apache::loncommon::end_data_table_header_row(); |
# |
# |
$Str .= '<tr><td align="center">'."\n"; |
$Str .= &Apache::loncommon::start_data_table_row(); |
|
$Str .= '<td align="center">'."\n"; |
$Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); |
$Str .= &Apache::lonstatistics::SectionSelect('Section','multiple',5); |
$Str .= '</td>'; |
$Str .= '</td>'; |
# |
# |
|
$Str .= '<td align="center">'."\n"; |
|
$Str .= &Apache::lonstatistics::GroupSelect('Group','multiple',5); |
|
$Str .= '</td>'; |
|
# |
$Str .= '<td align="center">'; |
$Str .= '<td align="center">'; |
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); |
$Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); |
$Str .= '</td>'; |
$Str .= '</td>'; |
# |
# |
$Str .= '</tr>'."\n"; |
$Str .= '<td align="center">'.$output_selector.'</td>'; |
$Str .= '</table>'."\n"; |
# |
|
# Render problem checkbox |
|
my $prob_checkbox = '<input type="checkbox" name="renderprob" '; |
|
if (exists($env{'form.renderprob'}) && $env{'form.renderprob'} eq 'true') { |
|
$prob_checkbox .= 'checked="checked" '; |
|
} |
|
$prob_checkbox .= 'value="true" />'; |
|
$Str .= |
|
'<td valign="top">' |
|
.'<label>' |
|
.$prob_checkbox.&mt('Show problem') |
|
.'</label>' |
|
.'</td>'; |
|
# |
|
$Str .= &Apache::loncommon::end_data_table_row(); |
|
$Str .= &Apache::loncommon::end_data_table(); |
# |
# |
$Str .= '<nobr>'.&mt('Status: [_1]', |
$Str .= '</p>'; |
'<input type="text" '. |
|
'name="stats_status" size="60" value="" />'). |
|
'</nobr>'.'</p>'; |
|
## |
## |
return $Str; |
return $Str; |
} |
} |
|
|
|
|
|
|
1; |
1; |
|
|
__END__ |
__END__ |