version 1.14, 2005/05/24 15:54:19
|
version 1.22, 2005/07/08 10:39:49
|
Line 35 use Apache::lonhtmlcommon();
|
Line 35 use Apache::lonhtmlcommon();
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::loncoursedata(); |
use Apache::loncoursedata(); |
use Apache::lonnavmaps(); |
use Apache::lonnavmaps(); |
|
use Apache::lonuserstate; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Time::Local; |
use Time::Local; |
|
|
Line 105 sub display_main_box {
|
Line 106 sub display_main_box {
|
degdiff => 'Degree of difficulty', |
degdiff => 'Degree of difficulty', |
numstudents => 'Total number of students with submissions', |
numstudents => 'Total number of students with submissions', |
); |
); |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
|
if ($command eq 'chgthreshold') { |
if ($command eq 'chgthreshold') { |
&display_config_box($r,$command,$tabbg,\%threshold_titles); |
&display_config_box($r,$command,$tabbg,\%threshold_titles,$cdom,$crs); |
} else { |
} else { |
&display_actions_box($r,$command,\%threshold_titles); |
&display_actions_box($r,$command,\%threshold_titles,$cdom,$crs); |
} |
} |
$r->print(<<END_OF_BLOCK); |
$r->print(<<END_OF_BLOCK); |
</td> |
</td> |
Line 146 ENDHEAD
|
Line 150 ENDHEAD
|
#------------------------------- |
#------------------------------- |
|
|
sub display_actions_box() { |
sub display_actions_box() { |
my ($r,$command,$threshold_titles) = @_; |
my ($r,$command,$threshold_titles,$cdom,$crs) = @_; |
|
|
my $rowColor1 = "#ffffff"; |
my $rowColor1 = "#ffffff"; |
my $rowColor2 = "#eeeeee"; |
my $rowColor2 = "#eeeeee"; |
Line 162 sub display_actions_box() {
|
Line 166 sub display_actions_box() {
|
my @tograde = (); |
my @tograde = (); |
my @bombs = (); |
my @bombs = (); |
my @warnings = (); |
my @warnings = (); |
|
my %res_title = (); |
|
|
my $domain=&Apache::loncommon::determinedomain(); |
my $domain=&Apache::loncommon::determinedomain(); |
my $function; |
my $function; |
Line 173 sub display_actions_box() {
|
Line 178 sub display_actions_box() {
|
} |
} |
|
|
my %threshold = ( |
my %threshold = ( |
av_attempts => 0, |
av_attempts => 2, |
degdiff => 0.01, |
degdiff => 0.5, |
numstudents => 0, |
numstudents => 2, |
); |
); |
|
|
my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain); |
my $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain); |
my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain); |
my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain); |
|
|
unless ($env{'request.course.id'}) { |
unless ($env{'request.course.id'}) { |
$r->print('<br /><b><center>You are accessing an invalid course</center></b><br /><br />'); |
$r->print('<br /><b><center>You are accessing an invalid course.</center></b><br /><br />'); |
return; |
return; |
} |
} |
|
|
|
my ($furl,$ferr)= |
|
&Apache::lonuserstate::readmap($cdom.'/'.$crs); |
|
$r->print('<font size="+1"><a href="'.$furl.'">Go to first resource</a></font><a href="/adm/preferences?action=changecourseinit"></font><br />Change your preferences</a> to suppress display of this screen when accessing courses as Course Coordinator in the future.<br /><hr />'); |
|
|
my $result; |
my $result; |
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
|
|
if ($command eq 'reset') { |
if ($command eq 'reset') { |
$result = &process_reset($cdom,$crs); |
$result = &process_reset($cdom,$crs); |
Line 200 sub display_actions_box() {
|
Line 207 sub display_actions_box() {
|
} |
} |
|
|
&get_curr_thresholds(\%threshold,$cdom,$crs); |
&get_curr_thresholds(\%threshold,$cdom,$crs); |
&getitems(\%unread,\%ungraded,\%bombed,\%triggered,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2,\%threshold,$cdom,$crs); |
&getitems(\%unread,\%ungraded,\%bombed,\%triggered,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2,\%threshold,$cdom,$crs,%res_title); |
my ($msgcount,$critmsgcount) = &getmail(\@newmsgs,\@critmsgs); |
my ($msgcount,$critmsgcount) = &getmail(\@newmsgs,\@critmsgs); |
|
|
$r->print('<br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">'); |
$r->print('<br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">'); |
Line 254 END
|
Line 261 END
|
my $bombnum = 0; |
my $bombnum = 0; |
if (@bombs > 0) { |
if (@bombs > 0) { |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Resource</small></b></td><td align="right"><b><small>Number of errors</small></b></td></tr>'); |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Resource</small></b></td><td align="right"><b><small>Number of errors</small></b></td></tr>'); |
# @bombs = sort { &cmp_title($a,$b) } @bombs; |
@bombs = sort { &cmp_title($a,$b,\%res_title) } @bombs; |
foreach my $bomb (@bombs) { |
foreach my $bomb (@bombs) { |
if ($bombnum %2 == 1) { |
if ($bombnum %2 == 1) { |
$rowColor = $rowColor1; |
$rowColor = $rowColor1; |
Line 283 END
|
Line 290 END
|
</tr> |
</tr> |
<tr> |
<tr> |
<td bgcolor="#ffffff"> |
<td bgcolor="#ffffff"> |
<table width="100%" cellspacing="0" cellpadding="0" border="0"> |
<table width="100%" cellspacing="2" cellpadding="2" border="0"> |
END |
END |
my $warningnum = 0; |
my $warningnum = 0; |
if (@warnings > 0) { |
if (@warnings > 0) { |
# @warnings = sort { &cmp_title($a,$b) } @warnings; |
@warnings = sort { &cmp_title($a,$b,\%res_title) } @warnings; |
$r->print('<form name="reset_tracking" method="post">'. |
$r->print('<form name="reset_tracking" method="post">'. |
' <input type="hidden" name="action" value="reset" />'."\n"); |
' <input type="hidden" name="action" value="reset" />'."\n"); |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Resource</small></b></td><td align="right"><b><small>Part</small></b></td><td align="right"><b><small>Num. students</small></b></td><td align="right"><b><small>Av. Attempts</small></b></td><td align="right"><b><small>Deg. Diff</small></b></td><td align="right"><b><small>Last Reset</small></b></td><td align="right"><b><small>Reset Count?</small></b></td></tr>'); |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Resource</small></b></td><td align="right"><b><small>Part</small></b></td><td align="right"><b><small>Num. students</small></b></td><td align="right"><b><small>Av. Attempts</small></b></td><td align="right"><b><small>Deg. Diff</small></b></td><td align="right"><b><small>Last Reset</small></b></td><td align="right"><b><small>Reset Count?</small></b></td></tr>'); |
Line 330 END
|
Line 337 END
|
|
|
if (@newdiscussions > 0) { |
if (@newdiscussions > 0) { |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Location</small></b></td><td><b><small>Type</small></b><td align="right"><b><small>Number of new posts</small></b></td></tr>'); |
$r->print('<tr bgcolor="#cccccc"><td><b><small>Location</small></b></td><td><b><small>Type</small></b><td align="right"><b><small>Number of new posts</small></b></td></tr>'); |
# @newdiscussions = sort { &cmp_title($a,$b) } @newdiscussions; |
@newdiscussions = sort { &cmp_title($a,$b,\%res_title) } @newdiscussions; |
my $rowNum = 0; |
my $rowNum = 0; |
foreach my $ressymb (@newdiscussions) { |
foreach my $ressymb (@newdiscussions) { |
my $forum_title = $unread{$ressymb}{'title'}; |
my $forum_title = $unread{$ressymb}{'title'}; |
Line 379 END
|
Line 386 END
|
} else { |
} else { |
$rowColor = $rowColor2; |
$rowColor = $rowColor2; |
} |
} |
$r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. <small></td><td valign="top"><small><a href="/adm/mail?">'.$msg->{'shortsub'}.'</a> </small></td><td valign="top"><small> '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' </small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>'); |
$r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. <small></td><td valign="top"><small><a href="/adm/communicate">'.$msg->{'shortsub'}.'</a> </small></td><td valign="top"><small> '.$msg->{'from'}.'@'.$msg->{'fromdom'}.' </small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>'); |
$rowNum ++; |
$rowNum ++; |
$mailcount ++; |
$mailcount ++; |
} |
} |
Line 437 END
|
Line 444 END
|
#------------------------------- |
#------------------------------- |
|
|
sub display_config_box() { |
sub display_config_box() { |
my ($r,$command,$tabbg,$threshold_titles) = @_; |
my ($r,$command,$tabbg,$threshold_titles,$cdom,$crs) = @_; |
my %threshold = (); |
my %threshold = (); |
my $rowColor1 = "#ffffff"; |
my $rowColor1 = "#ffffff"; |
my $rowColor2 = "#eeeeee"; |
my $rowColor2 = "#eeeeee"; |
Line 449 sub display_config_box() {
|
Line 456 sub display_config_box() {
|
degdiff => 'Degree of difficulty', |
degdiff => 'Degree of difficulty', |
numstudents => 'Total number of students with submissions', |
numstudents => 'Total number of students with submissions', |
); |
); |
&get_curr_thresholds(\%threshold); |
&get_curr_thresholds(\%threshold,$cdom,$crs); |
|
|
$r->print('<br /><form name="thresholdform" method="post"><table border="0" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%"> |
$r->print('<br /><form name="thresholdform" method="post"><table border="0" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%"> |
<table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> |
<table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000"> |
Line 495 sub display_config_box() {
|
Line 502 sub display_config_box() {
|
} |
} |
|
|
sub getitems { |
sub getitems { |
my ($unread,$ungraded,$bombed,$triggered,$newdiscussions,$tograde,$bombs,$warnings,$rowColor1,$rowColor2,$threshold,$cdom,$crs) = @_; |
my ($unread,$ungraded,$bombed,$triggered,$newdiscussions,$tograde,$bombs,$warnings,$rowColor1,$rowColor2,$threshold,$cdom,$crs,$res_title) = @_; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my @allres=$navmap->retrieveResources(); |
my @allres=$navmap->retrieveResources(); |
my %discussiontime = &Apache::lonnet::dump('discussiontimes',$cdom,$crs); |
my %discussiontime = &Apache::lonnet::dump('discussiontimes',$cdom,$crs); |
Line 507 sub getitems {
|
Line 514 sub getitems {
|
|
|
my %resourcetracker = &Apache::lonnet::dump('nohist_resourcetracker', |
my %resourcetracker = &Apache::lonnet::dump('nohist_resourcetracker', |
$cdom,$crs); |
$cdom,$crs); |
my %res_title; |
|
my $warningnum = 0; |
my $warningnum = 0; |
foreach my $key (keys(%lastread)) { |
foreach my $key (keys(%lastread)) { |
my $newkey = $key; |
my $newkey = $key; |
Line 523 sub getitems {
|
Line 529 sub getitems {
|
%{$$triggered{$symb}} = (); |
%{$$triggered{$symb}} = (); |
$$triggered{$symb}{numparts} = 0; |
$$triggered{$symb}{numparts} = 0; |
my $title = $resource->compTitle(); |
my $title = $resource->compTitle(); |
$res_title{$symb} = $title; |
$$res_title{$symb} = $title; |
my $ressymb = $resource->wrap_symb(); |
my $ressymb = $resource->wrap_symb(); |
# Check for unread discussion postings |
# Check for unread discussion postings |
if (defined($discussiontime{$ressymb})) { |
if ($resource->hasDiscussion()) { |
push(@discussions,$ressymb); |
push(@discussions,$ressymb); |
my $prevread = 0; |
my $prevread = 0; |
my $unreadcount = 0; |
my $unreadcount = 0; |
Line 555 sub getitems {
|
Line 561 sub getitems {
|
if ($resource->is_problem()) { |
if ($resource->is_problem()) { |
my $ctr = 0; |
my $ctr = 0; |
my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); |
my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); |
my ($partlist,$handgrade,$responseType) = &Apache::grades::response_type($url,$symb); |
my ($partlist,$handgrade,$responseType) = |
|
&Apache::grades::response_type($url,$symb); |
|
my $handgradeable; |
|
foreach my $value (values(%{$handgrade})) { |
|
if ($value eq 'yes') { $handgradeable=1; last; } |
|
} |
|
next if (!$handgradeable); |
|
|
foreach my $student (keys(%$classlist)) { |
foreach my $student (keys(%$classlist)) { |
my ($uname,$udom) = split(/:/,$student); |
my ($uname,$udom) = split(/:/,$student); |
my %status=&Apache::grades::student_gradeStatus($url,$symb,$udom,$uname,$partlist); |
my %status=&Apache::grades::student_gradeStatus($url,$symb,$udom,$uname,$partlist); |
Line 616 sub getitems {
|
Line 629 sub getitems {
|
} |
} |
if ($users > 0) { |
if ($users > 0) { |
$av_attempts = $attempts/$users; |
$av_attempts = $attempts/$users; |
|
$av_attempts = sprintf("%.2f",$av_attempts); |
} |
} |
if ((($degdiff ne '' && $degdiff >= $$threshold{'degdiff'}) || ($av_attempts ne '' && $av_attempts >= $$threshold{'av_attempts'})) && ($users >= $$threshold{'numstudents'})) { |
if ((($degdiff ne '' && $degdiff >= $$threshold{'degdiff'}) || ($av_attempts ne '' && $av_attempts >= $$threshold{'av_attempts'})) && ($users >= $$threshold{'numstudents'})) { |
$stats{$part}{degdiff} = $degdiff; |
$stats{$part}{degdiff} = $degdiff; |
$stats{$part}{attempts} = $av_attempts; |
$stats{$part}{attempts} = $av_attempts; |
$stats{$part}{users} = $users; |
$stats{$part}{users} = $users; |
my %resethash = &Apache::lonnet::restore($symb,'nohist_resourcetracker',$cdom,$crs); |
$lastreset{$part} = $resourcetracker{$symb."\0".$part."\0resettime"}; |
$lastreset{$part} = &get_counter_resets(\%resethash,$part); |
|
$warning = 1; |
$warning = 1; |
} |
} |
} |
} |
Line 663 sub getitems {
|
Line 676 sub getitems {
|
} |
} |
} |
} |
|
|
sub get_counter_resets { |
|
my ($resethash,$part) = @_; |
|
my $lastreset = 'None'; |
|
if ($$resethash{'version'}) { |
|
for (my $version=1;$version<=$$resethash{'version'};$version++) { |
|
if (exists($$resethash{$version.':'.$part.'prev_attempts'})) { |
|
$lastreset = $$resethash{$version.':timestamp'}; |
|
} |
|
} |
|
} |
|
unless ($lastreset eq 'None') { |
|
$lastreset = localtime($lastreset); |
|
} |
|
return $lastreset; |
|
} |
|
|
|
sub get_curr_thresholds { |
sub get_curr_thresholds { |
my ($threshold,$cdom,$crs) = @_; |
my ($threshold,$cdom,$crs) = @_; |
my %coursesettings = &Apache::lonnet::dump('environment', |
my %coursesettings = &Apache::lonnet::dump('environment', |
Line 705 sub process_reset {
|
Line 702 sub process_reset {
|
); |
); |
my @resets = (); |
my @resets = (); |
my %titles = (); |
my %titles = (); |
foreach my $key (keys %env) { |
foreach my $key (keys(%env)) { |
next if ($key !~ /^form\.reset_(.+)$/); |
next if ($key !~ /^form\.reset_(.+)$/); |
my $title = &Apache::lonnet::unescape($env{'form.title_'.$1}); |
my $title = &Apache::lonnet::unescape($env{'form.title_'.$1}); |
my $reset_item = &Apache::lonnet::unescape($1); |
my $reset_item = &Apache::lonnet::unescape($1); |
my %curr_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item); |
my %curr_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item); |
my %resethash = (); |
|
my %aggregates = (); |
my %aggregates = (); |
my ($symb,$part) = split/\0/,$reset_item; |
my ($symb,$part) = split(/\0/,$reset_item); |
foreach my $type (@agg_types) { |
foreach my $type (@agg_types) { |
$aggregates{$reset_item."\0".$type} = 0; |
$aggregates{$reset_item."\0".$type} = 0; |
$resethash{$part."\0".'prev_'.$type} = $curr_aggregates{$reset_item."\0".$type}; |
|
} |
} |
|
$aggregates{$reset_item."\0".'resettime'} = time; |
my $putresult = &Apache::lonnet::put('nohist_resourcetracker',\%aggregates, |
my $putresult = &Apache::lonnet::put('nohist_resourcetracker',\%aggregates, |
$dom,$crs); |
$dom,$crs); |
if ($putresult eq 'ok') { |
if ($putresult eq 'ok') { |
my $storeresult = &Apache::lonnet::cstore(\%resethash,$symb,'nohist_resourcetracker',$dom,$crs); |
|
$result .= $title.' -part '.$part.': '; |
$result .= $title.' -part '.$part.': '; |
my %new_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item); |
my %new_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item); |
foreach my $type (@agg_types) { |
foreach my $type (@agg_types) { |
Line 737 sub process_reset {
|
Line 732 sub process_reset {
|
|
|
sub process_update { |
sub process_update { |
my ($dom,$crs,$threshold_titles) = @_; |
my ($dom,$crs,$threshold_titles) = @_; |
my $setoutput = '<b>Changes to threshold(s):</b><br />'; |
my $setoutput = '<b>Changes to threshold(s) for problem tracking:</b><br />'; |
foreach (keys %env) { |
foreach (keys %env) { |
next if ($_!~/^form\.(.+)\_setparmval$/); |
next if ($_!~/^form\.(.+)\_setparmval$/); |
my $name = $1; |
my $name = $1; |
Line 823 sub getmail {
|
Line 818 sub getmail {
|
} |
} |
|
|
sub cmp_title { |
sub cmp_title { |
my ($atitle,$btitle) = (lc($_[0]->compTitle),lc($_[1]->compTitle)); |
my ($a,$b,$res_title) = @_; |
|
my ($atitle,$btitle) = (lc($$res_title{$a}),lc($$res_title{$b})); |
$atitle=~s/^\s*//; |
$atitle=~s/^\s*//; |
$btitle=~s/^\s*//; |
$btitle=~s/^\s*//; |
return $atitle cmp $btitle; |
return $atitle cmp $btitle; |