version 1.4, 2003/11/11 22:14:28
|
version 1.15, 2004/06/04 21:42:19
|
Line 33 use Apache::loncommon();
|
Line 33 use Apache::loncommon();
|
use Apache::lonhtmlcommon(); |
use Apache::lonhtmlcommon(); |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lonstatistics; |
use Apache::lonstatistics; |
|
use Apache::lonstathelpers; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use HTML::Entities(); |
use HTML::Entities(); |
use Time::Local(); |
use Time::Local(); |
Line 44 my $plotcolors = ['#33ff00',
|
Line 45 my $plotcolors = ['#33ff00',
|
]; |
]; |
|
|
my @SubmitButtons = ( |
my @SubmitButtons = ( |
{ name => 'ProblemAnalyis', |
{ name => 'PrevProblemAnalysis', |
|
text => 'Previous Problem' }, |
|
{ name => 'ProblemAnalysis', |
text => 'Analyze Problem Again' }, |
text => 'Analyze Problem Again' }, |
|
{ name => 'NextProblemAnalysis', |
|
text => 'Next Problem' }, |
{ name => 'SelectAnother', |
{ name => 'SelectAnother', |
text => 'Choose a different resource' }, |
text => 'Choose a different Problem' }, |
); |
); |
|
|
sub render_resource { |
|
my ($resource) = @_; |
|
## |
|
## Render the problem |
|
my $base; |
|
($base,undef) = ($resource->{'src'} =~ m|(.*/)[^/]*$|); |
|
$base = "http://".$ENV{'SERVER_NAME'}.$base; |
|
my $rendered_problem = |
|
&Apache::lonnet::ssi_body($resource->{'src'}); |
|
$rendered_problem =~ s/<\s*form\s*/<nop /g; |
|
$rendered_problem =~ s|(<\s*/form\s*>)|<\/nop>|g; |
|
return '<table bgcolor="ffffff"><tr><td>'. |
|
'<base href="'.$base.'" />'. |
|
$rendered_problem. |
|
'</td></tr></table>'; |
|
} |
|
|
|
sub BuildSubmissionTimePage { |
sub BuildSubmissionTimePage { |
my ($r,$c)=@_; |
my ($r,$c)=@_; |
# |
# |
Line 79 sub BuildSubmissionTimePage {
|
Line 67 sub BuildSubmissionTimePage {
|
# |
# |
&Apache::lonstatistics::PrepareClasslist(); |
&Apache::lonstatistics::PrepareClasslist(); |
# |
# |
$r->print('<h2>'.&mt('Submission Time Plots').'</h2>'); |
|
$r->print(&CreateInterface()); |
$r->print(&CreateInterface()); |
# |
# |
my @Students = @Apache::lonstatistics::Students; |
my @Students = @Apache::lonstatistics::Students; |
Line 88 sub BuildSubmissionTimePage {
|
Line 75 sub BuildSubmissionTimePage {
|
$r->print('<h2>There are no students in the sections selected</h2>'); |
$r->print('<h2>There are no students in the sections selected</h2>'); |
} |
} |
# |
# |
&Apache::loncoursedata::clear_internal_caches(); |
my @CacheButtonHTML = |
if (exists($ENV{'form.ClearCache'}) || |
&Apache::lonstathelpers::manage_caches($r,'Statistics','stats_status'); |
exists($ENV{'form.updatecaches'}) || |
|
(exists($ENV{'form.firstanalysis'}) && |
|
$ENV{'form.firstanalysis'} ne 'no')) { |
|
&Apache::lonstatistics::Gather_Full_Student_Data($r); |
|
} |
|
if (! exists($ENV{'form.firstanalysis'})) { |
|
$r->print('<input type="hidden" name="firstanalysis" value="yes" />'); |
|
} else { |
|
$r->print('<input type="hidden" name="firstanalysis" value="no" />'); |
|
} |
|
$r->rflush(); |
$r->rflush(); |
# |
# |
if (! exists($ENV{'form.problemchoice'}) || |
if (! exists($ENV{'form.problemchoice'}) || |
Line 108 sub BuildSubmissionTimePage {
|
Line 85 sub BuildSubmissionTimePage {
|
&mt('Graph Problem Submission Times').'" />'); |
&mt('Graph Problem Submission Times').'" />'); |
$r->print(' 'x5); |
$r->print(' 'x5); |
$r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>'); |
$r->print('<h3>'.&mt('Please select a problem to analyze').'</h3>'); |
$r->print(&ProblemSelector()); |
$r->print(&Apache::lonstathelpers::ProblemSelector('.')); |
} else { |
} else { |
foreach my $button (@SubmitButtons) { |
foreach my $button (@SubmitButtons) { |
$r->print('<input type="submit" name="'.$button->{'name'}.'" '. |
$r->print('<input type="submit" name="'.$button->{'name'}.'" '. |
'value="'.&mt($button->{'text'}).'" />'); |
'value="'.&mt($button->{'text'}).'" />'); |
$r->print(' 'x5); |
$r->print(' 'x5); |
} |
} |
|
foreach my $html (@CacheButtonHTML) { |
|
$r->print($html.(' 'x5)); |
|
} |
|
$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) = |
|
&Apache::lonstathelpers::get_prev_curr_next($current_problem, |
|
'.', |
|
'part'); |
|
if (exists($ENV{'form.PrevProblemAnalysis'}) && defined($prev)) { |
|
$current_problem = $prev; |
|
} elsif (exists($ENV{'form.NextProblemAnalysis'}) && defined($next)) { |
|
$current_problem = $next; |
|
} else { |
|
$current_problem = $curr; |
|
} |
|
# |
|
# Store the current problem choice and send it out in the form |
|
$ENV{'form.problemchoice'} = |
|
&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'}.'" />'); |
# |
# |
$r->print('<hr />'); |
$r->print('<hr />'); |
# |
|
my ($symb,$part) = &get_problem_symb( |
|
&Apache::lonnet::unescape($ENV{'form.problemchoice'})); |
|
$r->rflush(); |
$r->rflush(); |
# |
# |
my $resource = &get_resource_from_symb($symb); |
my $resource = $current_problem->{'resource'}; |
if (! defined($resource)) { |
if (! defined($resource)) { |
$r->print('resource is undefined'); |
$r->print('resource is undefined'); |
} else { |
} else { |
$r->print('<h1>'.$resource->{'title'}.'</h1>'); |
$r->print('<h1>'.$resource->{'title'}.'</h1>'); |
$r->print('<h3>'.$resource->{'src'}.'</h3>'); |
$r->print('<h3>'.$resource->{'src'}.'</h3>'); |
$r->rflush(); |
$r->rflush(); |
$r->print(&render_resource($resource)); |
$r->print(&Apache::lonstathelpers::render_resource($resource)); |
|
$r->print('<br />'); |
$r->rflush(); |
$r->rflush(); |
$r->print(&analyze_times($r,$resource,\@Students,$part)); |
$r->print(&analyze_times($r,$resource,\@Students, |
|
$current_problem->{'part'})); |
} |
} |
$r->print('<hr />'); |
$r->print('<hr />'); |
} |
} |
Line 171 sub analyze_times {
|
Line 171 sub analyze_times {
|
my $SubData = &Apache::loncoursedata::get_response_time_data |
my $SubData = &Apache::loncoursedata::get_response_time_data |
($students,$resource->{'symb'},$part); |
($students,$resource->{'symb'},$part); |
if (! defined($SubData) || ! ref($SubData)) { |
if (! defined($SubData) || ! ref($SubData)) { |
$html.= '<h2>There is no submission data for this resource</h2>'; |
$html.= '<h2>There is no submission data for this problem</h2>'; |
return $html; |
return $html; |
} |
} |
my $NumSub = scalar(@{$SubData}); |
my $NumSub = scalar(@{$SubData}); |
if (! @{$SubData}) { |
if (! @{$SubData}) { |
$html.= '<h2>There is no submission data for this resource</h2>'; |
$html.= '<h2>There is no submission data for this problem</h2>'; |
return $html; |
return $html; |
} |
} |
# Process the data |
# Process the data |
Line 241 sub analyze_times {
|
Line 241 sub analyze_times {
|
$Xlabel[$bincount] = ''; |
$Xlabel[$bincount] = ''; |
} |
} |
} |
} |
|
my $numstudents = scalar(@$students); |
|
for (my $i=0;$i<=$#AnsData;$i++) { |
|
$AnsData[$i] = int(100*($AnsData[$i]/$numstudents)); |
|
} |
my $title = 'Number of Submissions and Number Correct'; |
my $title = 'Number of Submissions and Number Correct'; |
my $xlabel; |
my $xlabel; |
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($day_start); |
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($day_start); |
Line 250 sub analyze_times {
|
Line 253 sub analyze_times {
|
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($endtime); |
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($endtime); |
$xlabel .= $FullWeekDay[$wday].' '. |
$xlabel .= $FullWeekDay[$wday].' '. |
join(' ',($Month[$month],$mday,1900+$year)); |
join(' ',($Month[$month],$mday,1900+$year)); |
|
my $width = 50+2*$bincount; |
|
if ($width < 250) { |
|
$width = 250; |
|
} |
$html .= &Apache::loncommon::DrawXYYGraph($title, |
$html .= &Apache::loncommon::DrawXYYGraph($title, |
$xlabel, |
$xlabel, |
'Number of Submissions per hour', |
'Submissions vs Time', |
$plotcolors, |
$plotcolors, |
\@Xlabel, |
\@Xlabel, |
\@Ydata, |
\@Ydata, |
0,$max, |
0,$max, |
\@AnsData, |
\@AnsData, |
0,scalar(@$students), |
0,100, |
(xskip => $bins_per_day, |
(xskip => $bins_per_day, |
x_ticks => $bins_per_day, |
x_ticks => $bins_per_day, |
x_tick_offset => $bins_per_day, |
x_tick_offset => $bins_per_day, |
width => 50+2*$bincount) |
width => $width, |
|
y1_label=>'Number of Submissions per hour', |
|
y2_label=>'Percent of Students answering Correctly', |
|
'data.1.label'=>'Submissions per hour', |
|
'data.2.label'=>'Percent correct', |
|
) |
); |
); |
$html .= '<br />'; |
$html .= '<br />'; |
return $html; |
return $html; |
Line 316 sub CreateInterface {
|
Line 328 sub CreateInterface {
|
## |
## |
## Build the menu |
## Build the menu |
my $Str = ''; |
my $Str = ''; |
|
$Str .= &Apache::lonhtmlcommon::breadcrumbs(undef,'Submission Time Plots'); |
|
$Str .= '<p>'; |
$Str .= '<table cellspacing="5">'."\n"; |
$Str .= '<table cellspacing="5">'."\n"; |
$Str .= '<tr>'; |
$Str .= '<tr>'; |
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Sections').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<td align="center"><b>'.&mt('Enrollment Status').'</b></td>'; |
$Str .= '<td align="center"> </td>'; |
|
$Str .= '</tr>'."\n"; |
$Str .= '</tr>'."\n"; |
## |
## |
## |
## |
Line 331 sub CreateInterface {
|
Line 344 sub CreateInterface {
|
$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>'; |
# |
|
my $only_seq_with_assessments = sub { |
|
my $s=shift; |
|
if ($s->{'num_assess'} < 1) { |
|
return 0; |
|
} else { |
|
return 1; |
|
} |
|
}; |
|
&Apache::lonstatistics::MapSelect('Maps','multiple,all',5, |
|
$only_seq_with_assessments); |
|
## |
|
## |
|
$Str .= '</tr>'."\n"; |
$Str .= '</tr>'."\n"; |
$Str .= '</table>'."\n"; |
$Str .= '</table>'."\n"; |
|
# |
|
$Str .= '<nobr>'.&mt('Status: [_1]', |
|
'<input type="text" '. |
|
'name="stats_status" size="60" value="" />'). |
|
'</nobr>'.'</p>'; |
|
## |
return $Str; |
return $Str; |
} |
} |
|
|
sub ProblemSelector { |
|
my $Str; |
|
$Str = "<table>\n"; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
next if ($seq->{'num_assess'}<1); |
|
my $seq_str = ''; |
|
foreach my $res (@{$seq->{'contents'}}) { |
|
next if ($res->{'type'} ne 'assessment'); |
|
if (@{$res->{'parts'}} == 1) { |
|
my $value = &Apache::lonnet::escape($res->{'symb'}.':'. |
|
$res->{'parts'}->[0]); |
|
my $checked; |
|
if ($ENV{'form.problemchoice'} eq $value) { |
|
$checked = 'checked '; |
|
} |
|
$seq_str .= '<tr><td>'. |
|
'<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'. |
|
'</td><td>'. |
|
'<a href="'.$res->{'src'}.'">'.$res->{'title'}.'</a> '; |
|
} else { |
|
$seq_str .= '<tr><td>'. |
|
' '.'</td><td>'. |
|
'<a href="'.$res->{'src'}.'">'.$res->{'title'}.'</a>'. |
|
"</td></tr>\n"; |
|
foreach my $part (@{$res->{'parts'}}) { |
|
my $value = &Apache::lonnet::escape |
|
($res->{'symb'}.':'.$part); |
|
my $checked; |
|
if ($ENV{'form.problemchoice'} eq $value) { |
|
$checked = 'checked '; |
|
} |
|
$seq_str .= '<tr><td>'. |
|
'<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'. |
|
'</td><td>'.(' 'x5).'part '.$part."</td></tr>\n"; |
|
} |
|
} |
|
} |
|
if ($seq_str ne '') { |
|
$Str .= '<tr><td> </td><td><b>'.$seq->{'title'}.'</b></td>'. |
|
"</tr>\n".$seq_str; |
|
} |
|
} |
|
$Str .= "</table>\n"; |
|
return $Str; |
|
} |
|
|
|
######################################################### |
|
######################################################### |
|
## |
|
## Misc functions (ought to be put in a module) |
|
## |
|
######################################################### |
|
######################################################### |
|
sub get_problem_symb { |
|
my $problemstring = shift(); |
|
my ($symb,$partid) = ($problemstring=~ /^(.*):([^:]*)$/); |
|
return ($symb,$partid); |
|
} |
|
|
|
sub get_resource_from_symb { |
|
my ($symb) = @_; |
|
foreach my $seq (&Apache::lonstatistics::Sequences_with_Assess()) { |
|
foreach my $res (@{$seq->{'contents'}}) { |
|
if ($res->{'symb'} eq $symb) { |
|
return $res; |
|
} |
|
} |
|
} |
|
return undef; |
|
} |
|
|
|
1; |
1; |
|
|
__END__ |
__END__ |