version 1.1, 2003/10/29 15:22:04
|
version 1.10, 2004/01/19 21:31:08
|
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 50 my @SubmitButtons = (
|
Line 51 my @SubmitButtons = (
|
text => 'Choose a different resource' }, |
text => 'Choose a different resource' }, |
); |
); |
|
|
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)=@_; |
|
# |
|
my %Saveable_Parameters = ('Status' => 'scalar', |
|
'Section' => 'array'); |
|
&Apache::loncommon::store_course_settings('submissiontime_analysis', |
|
\%Saveable_Parameters); |
|
&Apache::loncommon::restore_course_settings('submissiontime_analysis', |
|
\%Saveable_Parameters); |
|
# |
|
&Apache::lonstatistics::PrepareClasslist(); |
|
# |
$r->print('<h2>'.&mt('Submission Time Plots').'</h2>'); |
$r->print('<h2>'.&mt('Submission Time Plots').'</h2>'); |
$r->print(&CreateInterface()); |
$r->print(&CreateInterface()); |
# |
# |
Line 121 sub BuildSubmissionTimePage {
|
Line 115 sub BuildSubmissionTimePage {
|
$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->rflush(); |
$r->rflush(); |
$r->print(&analyze_times($r,$resource,\@Students,$part)); |
$r->print(&analyze_times($r,$resource,\@Students,$part)); |
} |
} |
Line 149 sub get_week_start {
|
Line 143 sub get_week_start {
|
|
|
sub analyze_times { |
sub analyze_times { |
my ($r,$resource,$students,$part) = @_; |
my ($r,$resource,$students,$part) = @_; |
|
# |
|
# Convenience arrays |
|
my @FullWeekDay = (qw/Sunday Monday Tuesday Wednesday Thursday Friday |
|
Saturday/); |
|
my @WeekDay = (qw/SUN MON TUE WED THU FRI SAT SUN/); |
|
my @Month = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/); |
|
# |
my $html; # holds results of analysis |
my $html; # holds results of analysis |
# Get the data |
# Get the data |
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 |
# Get first and last times |
|
my $span = &get_time_from_row($SubData->[-1]) - |
|
&get_time_from_row($SubData->[0]); |
|
if ($span == 0) { |
|
$html.= '<h2>There is no submission data for this resource</h2>'; |
|
return $html; |
|
} |
|
# |
# |
my (undef,undef,undef,$mday,$month,$year,$wday,$yday,$isdst) = |
my (undef,undef,undef,$mday,$month,$year,$wday,$yday,$isdst) = |
localtime(&get_time_from_row($SubData->[0])); |
localtime(&get_time_from_row($SubData->[0])); |
my $day_start = &Time::Local::timelocal(0,0,0,$mday,$month,$year); |
my $day_start = &Time::Local::timelocal(0,0,0,$mday,$month,$year); |
my $start_day_of_week = $wday; |
|
# |
|
my @WeekDay = (qw/SUN MON TUE WED THU FRI SAT SUN/); |
|
my @Month = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/); |
|
# |
|
my $cumulative_answers = 0; |
|
# |
|
my @Ydata; |
|
my @AnsData; |
|
my @Xlabel; |
|
# |
# |
|
# Configure the bins used to store the data. |
my $binsize = 3600; # seconds |
my $binsize = 3600; # seconds |
my $bins_per_day = 86400/$binsize; |
my $bins_per_day = 86400/$binsize; |
my $bincount = 0; |
my $bincount = 0; |
my $endtime = $day_start; |
my $endtime = $day_start; |
# |
# |
|
# Initialize loop variables |
my $max; |
my $max; |
|
my @Ydata=(0); |
|
my @AnsData=(0); |
|
my @Xlabel=($WeekDay[$wday]); |
|
my $cumulative_answers = 0; |
|
# |
foreach my $row (@$SubData) { |
foreach my $row (@$SubData) { |
my $subtime = &get_time_from_row($row); |
my $subtime = &get_time_from_row($row); |
while ($subtime > $endtime && $endtime < time) { |
while ($subtime > $endtime && $endtime < time) { |
Line 200 sub analyze_times {
|
Line 191 sub analyze_times {
|
$AnsData[$bincount]=$AnsData[$bincount-1]; |
$AnsData[$bincount]=$AnsData[$bincount-1]; |
$endtime += $binsize; |
$endtime += $binsize; |
if ($bincount % (86400/$binsize) == 0) { |
if ($bincount % (86400/$binsize) == 0) { |
$Xlabel[$bincount] = $WeekDay[$wday++]; |
$wday++; |
$wday %= 7; |
$wday %= 7; |
|
$Xlabel[$bincount] = $WeekDay[$wday]; |
} else { |
} else { |
$Xlabel[$bincount] = ''; |
$Xlabel[$bincount] = ''; |
} |
} |
Line 226 sub analyze_times {
|
Line 218 sub analyze_times {
|
$AnsData[$bincount]=$AnsData[$bincount-1]; |
$AnsData[$bincount]=$AnsData[$bincount-1]; |
$endtime += $binsize; |
$endtime += $binsize; |
if ($bincount % (86400/$binsize) == 0) { |
if ($bincount % (86400/$binsize) == 0) { |
|
$wday ++; |
|
$wday %= 7; |
$Xlabel[$bincount] = $WeekDay[$wday]; |
$Xlabel[$bincount] = $WeekDay[$wday]; |
} else { |
} else { |
$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) = localtime($day_start); |
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($day_start); |
$xlabel .= 'Sunday '.join(' ',($Month[$month],$mday,1900+$year)).' - '; |
$xlabel .= $FullWeekDay[$wday].' '. |
(undef,undef,undef,$mday,$month,$year) = localtime($endtime); |
join(' ',($Month[$month],$mday,1900+$year)).' - '; |
$xlabel .= 'Sunday '.join(' ',($Month[$month],$mday,1900+$year)); |
(undef,undef,undef,$mday,$month,$year,$wday) = localtime($endtime); |
|
$xlabel .= $FullWeekDay[$wday].' '. |
|
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', |
'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 259 sub analyze_times {
|
Line 267 sub analyze_times {
|
sub successful_submission { |
sub successful_submission { |
my ($row) = @_; |
my ($row) = @_; |
if (ref($row) eq 'ARRAY') { |
if (ref($row) eq 'ARRAY') { |
return $row->[1]; |
return $row->[&Apache::loncoursedata::RT_awarded()]; |
} |
} |
return undef; |
return undef; |
return 0; |
return 0; |
Line 268 sub successful_submission {
|
Line 276 sub successful_submission {
|
sub get_time_from_row { |
sub get_time_from_row { |
my ($row) = @_; |
my ($row) = @_; |
if (ref($row) eq 'ARRAY') { |
if (ref($row) eq 'ARRAY') { |
return $row->[3]; |
return $row->[&Apache::loncoursedata::RT_timestamp()]; |
} |
} |
return undef; |
return undef; |
} |
} |
Line 276 sub get_time_from_row {
|
Line 284 sub get_time_from_row {
|
sub get_tries_from_row { |
sub get_tries_from_row { |
my ($row) = @_; |
my ($row) = @_; |
if (ref($row) eq 'ARRAY') { |
if (ref($row) eq 'ARRAY') { |
return $row->[2]; |
return $row->[&Apache::loncoursedata::RT_tries()]; |
} |
} |
return undef; |
return undef; |
} |
} |
Line 352 sub ProblemSelector {
|
Line 360 sub ProblemSelector {
|
if ($ENV{'form.problemchoice'} eq $value) { |
if ($ENV{'form.problemchoice'} eq $value) { |
$checked = 'checked '; |
$checked = 'checked '; |
} |
} |
|
my $title = $res->{'title'}; |
|
if (! defined($title) || $title eq '') { |
|
($title) = ($res->{'src'} =~ m:/([^/]*)$:); |
|
} |
|
# &Apache::lonnet::logthis('title = :'.$title.':'); |
$seq_str .= '<tr><td>'. |
$seq_str .= '<tr><td>'. |
'<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'. |
'<input type="radio" name="problemchoice" value="'.$value.'" '.$checked.'/>'. |
'</td><td>'. |
'</td><td>'. |
'<a href="'.$res->{'src'}.'">'.$res->{'title'}.'</a> '; |
'<a href="'.$res->{'src'}.'">'.$title.'</a> '; |
} else { |
} else { |
|
my $title = $res->{'title'}; |
|
if (! defined($title) || $title eq '') { |
|
($title) = ($res->{'src'} =~ m:/([^/]*)$:); |
|
} |
$seq_str .= '<tr><td>'. |
$seq_str .= '<tr><td>'. |
' '.'</td><td>'. |
' '.'</td><td>'. |
'<a href="'.$res->{'src'}.'">'.$res->{'title'}.'</a>'. |
'<a href="'.$res->{'src'}.'">'.$title.'</a>'. |
"</td></tr>\n"; |
"</td></tr>\n"; |
foreach my $part (@{$res->{'parts'}}) { |
foreach my $part (@{$res->{'parts'}}) { |
my $value = &Apache::lonnet::escape |
my $value = &Apache::lonnet::escape |