Diff for /loncom/interface/lonquickgrades.pm between versions 1.49.6.8 and 1.59

version 1.49.6.8, 2021/12/14 02:44:05 version 1.59, 2010/12/04 15:02:31
Line 29 Line 29
 package Apache::lonquickgrades;  package Apache::lonquickgrades;
   
 use strict;  use strict;
 use Apache::Constants qw(:common :http REDIRECT);  use Apache::Constants qw(:common :http);
 use POSIX;  use POSIX;
 use Apache::loncommon;  use Apache::loncommon;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::grades;  use Apache::grades;
 use Apache::lonuserstate;  
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 58  sub real_handler { Line 57  sub real_handler {
         return OK;          return OK;
     }      }
   
     my $cangrade=&Apache::lonnet::allowed('mgr');      # Send header, don't cache this page
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
   
     my $showPoints =      my $showPoints =
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
       my $notshowSPRSlink =
           (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));
       my $notshowTotals=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
       my $showCategories=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
   
     my $reinitresult;  
   
     if ($env{'request.course.id'}) {      my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      $r->print(&Apache::loncommon::start_page($title,undef,
         my $clientip = &Apache::lonnet::get_requestor_ip($r);                                              {'bread_crumbs' => $brcrum})
         my ($blocked,$blocktext) =               );
             &Apache::loncommon::blocking_status('grades',$clientip,$cnum,$cdom);  
         if ($blocked) {  
             my $checkrole = "cm./$cdom/$cnum";  
             if ($env{'request.course.sec'} ne '') {  
                 $checkrole .= "/$env{'request.course.sec'}";  
             }  
             unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&  
                     ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {  
                 &grades_blocked($r,$blocktext,$showPoints);  
                 return OK;  
             }  
         }  
     }  
   
     unless ($cangrade) {  
         # Check for critical messages and redirect if present.  
         my ($redirect,$url) = &Apache::loncommon::critical_redirect(300);  
         if ($redirect) {  
             &Apache::loncommon::content_type($r,'text/html');  
             $r->header_out(Location => $url);  
             return REDIRECT;  
         }  
   
         # Check if course needs to be re-initialized      &startGradeScreen($r,'quick');
         my $loncaparev = $r->dir_config('lonVersion');  
         ($reinitresult,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);  
   
         if ($reinitresult eq 'switch') {  
             &Apache::loncommon::content_type($r,'text/html');  
             $r->send_http_header;  
             $r->print(&Apache::loncommon::check_release_result(@reinit));  
             return OK;  
         } elsif ($reinitresult eq 'update') {  
             my $cid = $env{'request.course.id'};  
             my $cnum = $env{'course.'.$cid.'.num'};  
             my $cdom = $env{'course.'.$cid.'.domain'};  
             &Apache::loncommon::content_type($r,'text/html');  
             $r->send_http_header;  
             &startpage($r,$showPoints);  
             my $preamble = '<div id="LC_update_'.$cid.'" class="LC_info">'.  
                            '<br />'.  
                            &mt('Your course session is being updated because of recent changes by course personnel.').  
                            ' '.&mt('Please be patient').'.<br /></div>'.  
                            '<div style="padding:0;clear:both;margin:0;border:0"></div>';  
             my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);  
             &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Updating course'));  
             $r->rflush();  
             my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");  
             &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));  
             &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);  
             my $closure = <<ENDCLOSE;  
 <script type="text/javascript">  
 // <![CDATA[  
 \$("#LC_update_$cid").hide('slow');  
 // ]]>  
 </script>  
 ENDCLOSE  
             if ($ferr) {  
                 $r->print($closure.&Apache::loncommon::end_page());  
                 my $requrl = $r->uri;  
                 $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";  
                 $env{'user.reinit'} = 1;  
                 return HTTP_NOT_ACCEPTABLE;  
             } else {  
                $r->print($closure);  
             }  
         }  
     }  
   
     unless ($reinitresult eq 'update') {  
         # Send header, don't cache this page  
         &Apache::loncommon::no_cache($r);  
         $r->send_http_header;  
         &startpage($r,$showPoints);  
     }  
     $r->rflush();      $r->rflush();
   
     &startGradeScreen($r);  #    my $uname='korte';
   #    my $udom='gerd';
   
 #  
 # Pick student  
 #  
     my $uname;      my $uname;
     my $udom;      my $udom;
     my $stdid;  
     if ($cangrade) {      my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=
         if ($env{'form.uname'}) { $uname=$env{'form.uname'}; }         &getData($showPoints,$uname,$udom);
         if ($env{'form.udom'}) { $udom=$env{'form.udom'}; }  
         if ($env{'form.id'}) { $stdid=$env{'form.id'}; }      if ($showCategories) {
         if (($stdid) && ($udom)) {         &outputCategories($r,$showPoints,$notshowTotals,
             $uname=(&Apache::lonnet::idget($udom,[$stdid],'ids'))[1];                   $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
         }  
         if (($stdid) && (!$uname)) {  
             $r->print('<p><span class="LC_warning">'.&mt("Unknown Student/Employee ID: [_1]",$stdid).'</span></p>');  
             $stdid='';  
         }  
         if (($uname eq '') && ($udom eq '')) {  
             $uname = $env{'user.name'};  
             $udom = $env{'user.domain'};  
         }  
         $r->print('<form method="post" name="quickform" action="/adm/quickgrades">');  
         my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.  
            &Apache::loncommon::selectstudent_link('quickform','uname','udom');  
         $r->print("<p>\n".&Apache::loncommon::studentbrowser_javascript()."\n");  
         $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'  
                  ,'<input type="text" value="'.$uname.'" size="12" name="uname" />'  
                  ,'<input type="text" value="'.$stdid.'" size="12" name="id" /> '  
                  ,$chooseopt).  
                  '&nbsp;&nbsp;<input type="submit" name="display" value="'.&mt('Display Individual Student').'" /></p>');  
         if (($uname) && ($udom)) {  
             $r->print('<p>'.&mt('Full Name: [_1]',&Apache::loncommon::plainname($uname,$udom)).'</p>');  
         }  
     } else {      } else {
         $r->print('<p class="LC_info">'.&mt('This may take a few moments to display.').'</p>');         &outputTable($r,$showPoints,$notshowTotals,
                    $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
     }      }
     $r->rflush();      &endGradeScreen($r);
       return OK;
   
   }
   
   sub startGradeScreen {
       my ($r,$mode)=@_;
   
       my $showPoints =
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';
       my $notshowSPRSlink =
           (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));
     my $notshowTotals=      my $notshowTotals=
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
       my $showCategories=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
   
     my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,      my $allowed_to_view =  &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
         $topLevelRight,$topLevelAttempted) = &getData($showPoints,$uname,$udom);      my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
   
     if (ref($navmap)) {      if ($allowed_to_view) {
         &outputTable($r,$showPoints,$notshowTotals,$navmap,$totalParts,$totalPossible,         $r->print('<div id="LC_head_subbox">');
                      $totalRight,$totalAttempted,$topLevelParts,$topLevelRight,         if ($notshowTotals)  { $r->print ('&nbsp;'.&mt('Students do not see total points.').'&nbsp;'); }
                      $topLevelAttempted);         if ($notshowSPRSlink){ $r->print ('&nbsp;'.&mt('Students do not see link to spreadsheet.').'&nbsp;'); }
     } else {         if ($showPoints)     { $r->print ('&nbsp;'.&mt('Students will see points based on problem weights.').'&nbsp;'); }
         if ($cangrade) { $r->print("\n</form>\n"); }         if ($showCategories) { $r->print ('&nbsp;'.&mt('Students will see points based on categories.').'&nbsp;'); }
         my $requrl = $r->uri;         $r->print('&nbsp;'.&Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading').'</div>');
         $env{'user.error.msg'} = "$requrl:bre:0:0:Navmap initialization failed.";  
         return HTTP_NOT_ACCEPTABLE;  
     }      }
     if ($cangrade) { $r->print("\n</form>\n"); }  
     &endGradeScreen($r);  
     return OK;      $r->print("\n".'<ul class="LC_TabContentBigger" id="main">');
       $r->print("\n".'<li'.($mode eq 'quick'?' class="active"':'').'><a href="/adm/quickgrades"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                             ($showPoints?&mt('Points Overview'):($showCategories?&mt('Grades Overview'):&mt('Completion Overview'))).
                                             '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
   
       if (!($showPoints || $notshowSPRSlink) || ($allowed_to_view)) {
          $r->print("\n".'<li'.($mode eq 'spreadsheet'?' class="active"':'').'><a href="/adm/'.($allowed_to_view?'classcalc':'studentcalc').'"><b>'.
                                                                    &mt('Spreadsheet (Detailed)').'</b></a></li>');
       }
       if ($allowed_to_view) {
          $r->print("\n".'<li'.($mode eq 'chart'?' class="active"':'').'><a href="/adm/statistics?reportSelected=student_assessment"><b>'.
                                                                    &mt('Assessment Overview Chart').'</b></a></li>');
   
       }
       if ($allowed_to_edit) {
          $r->print("\n".'<li'.($mode eq 'grading'?' class="active"':'').'><a href="/adm/grades"><b>&nbsp;&nbsp;&nbsp;&nbsp;'.
                                                                    &mt('Problem Grading').'&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
       }
       $r->print("\n".'</ul>'."\n");
       $r->print('<div class="LC_Box" style="clear:both;margin:0;"><div id="maincoursedoc" style="margin:0 0;padding:0 0;"><div class="LC_ContentBox" id="mainCourseDocuments" style="display: block;">');
 }  }
   
 sub grades_blocked {  sub endGradeScreen {
     my ($r,$blocktext,$caller) = @_;     my ($r)=@_;
     my $title = 'Points Display';     $r->print('</div></div></div>');
     if ($caller eq 'spreadsheet') {  
         $title = 'Spreadsheet';  
     } elsif ($env{'course.'.$env{'request.course.id'}.'.grading'} ne 'standard') {  
         $title = 'Completed Problems Display';  
     }  
     my $brcrum = [{href=>"/adm/quickgrades",text => $title}];  
     &Apache::lonhtmlcommon::clear_breadcrumbs();  
     &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/quickgrades',  
                                             text=> $title});  
     my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs($title);  
     &Apache::loncommon::content_type($r,'text/html');  
     &Apache::loncommon::no_cache($r);  
     $r->send_http_header;  
     $r->print(&Apache::loncommon::start_page($title).  
               $breadcrumbs.  
               $blocktext.  
               &Apache::loncommon::end_page());  
     return;  
 }  }
   
 #  
 # Go through the complete course and collect data  
 #  
   
 sub getData {  sub getData {
   
     my ($showPoints,$uname,$udom)=@_;      my ($showPoints,$uname,$udom)=@_;
   
       &Apache::lonnet::logthis("About to call with $uname $udom");
   
     # Create the nav map      # Create the nav map
     my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);      my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);
   
     if (!defined($navmap)) {  
         return ();  
     }  
   
     my $res = $navmap->firstResource(); # temp resource to access constants      my $res = $navmap->firstResource(); # temp resource to access constants
   
     my $iterator = $navmap->getIterator(undef, undef, undef, 1);      my $iterator = $navmap->getIterator(undef, undef, undef, 1);
     my $depth = 1;      my $depth = 1;
     $iterator->next(); # ignore first BEGIN_MAP      $iterator->next(); # ignore first BEGIN_MAP
     my $curRes = $iterator->next();      my $curRes = $iterator->next();
       
     # General overview of the following: Walk along the course resources.      # General overview of the following: Walk along the course resources.
     # For every problem in the resource, tell its parent maps how many      # For every problem in the resource, tell its parent maps how many
     # parts and how many parts correct it has. After that, each map will      # parts and how many parts correct it has. After that, each map will
Line 284  sub getData { Line 206  sub getData {
             my $stack = $iterator->getStack();              my $stack = $iterator->getStack();
                           
             for my $part (@{$parts}) {              for my $part (@{$parts}) {
    my $completionStatus = $curRes->getCompletionStatus($part);
  my $dateStatus = $curRes->getDateStatus($part);   my $dateStatus = $curRes->getDateStatus($part);
                 my $weight = $curRes->weight($part);  
                 my $problemstatus = $curRes->problemstatus($part);                  if ($completionStatus == $curRes->EXCUSED()) {
   
                 if ($curRes->solved($part) eq 'excused') {  
                     next;                      next;
                 }                  }
  if ($showPoints) {   if ($showPoints) {
     my $score = 0;      my $score = 0;
     # If we're not telling status and the answer date isn't passed yet,       # If we're not telling status and the answer date isn't passed yet, 
     # it's an "attempted" point      # it's an "attempted" point
     if ((($problemstatus eq 'no') ||      if ((($curRes->problemstatus($part) eq 'no') ||
                          ($problemstatus eq 'no_feedback_ever')) &&                          ($curRes->problemstatus($part) eq 'no_feedback_ever')) &&
  ($dateStatus != $curRes->ANSWER_OPEN)) {   ($dateStatus != $curRes->ANSWER_OPEN)) {
  my $status = $curRes->simpleStatus($part);   my $status = $curRes->simpleStatus($part);
  if ($status == $curRes->ATTEMPTED) {   if ($status == $curRes->ATTEMPTED) {
     $partsAttempted += $weight;      $partsAttempted += $curRes->weight($part);
     $totalAttempted += $partsAttempted;      $totalAttempted += $partsAttempted;
  }   }
     } else {      } else {
  $score = &Apache::grades::compute_points($weight, $curRes->awarded($part));   $score = &Apache::grades::compute_points($curRes->weight($part), $curRes->awarded($part));
     }      }
     $partsRight += $score;      $partsRight += $score;
     $totalRight += $score;      $totalRight += $score;
     $partsCount += $weight;      $partsCount += $curRes->weight($part);
   
     if ($curRes->opendate($part) < $now) {      if ($curRes->opendate($part) < $now) {
  $totalPossible += $weight;   $totalPossible += $curRes->weight($part);
     }      }
     $totalParts += $weight;      $totalParts += $curRes->weight($part);
  } else {   } else {
     my $status = $curRes->simpleStatus($part);      my $status = $curRes->simpleStatus($part);
     my $thisright = 0;      my $thisright = 0;
Line 330  sub getData { Line 251  sub getData {
  $totalAttempted++;   $totalAttempted++;
     }      }
           
       my $dateStatus = $curRes->getDateStatus($part);
     $totalParts++;      $totalParts++;
     if ($curRes->opendate($part) < $now) {      if ($curRes->opendate($part) < $now) {
  $totalPossible++;   $totalPossible++;
Line 360  sub getData { Line 282  sub getData {
         }          }
         $curRes = $iterator->next();          $curRes = $iterator->next();
     }      }
     return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,      return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
             $topLevelParts,$topLevelRight,$topLevelAttempted);  
 }  }
   
 #  #
Line 370  sub getData { Line 291  sub getData {
   
 sub outputTable {  sub outputTable {
   
     my ($r,$showPoints,$notshowTotals,$navmap,$totalParts,$totalPossible,$totalRight,      my ($r,$showPoints,$notshowTotals,
         $totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;             $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;
   
     my @start = (255, 255, 192);      my @start = (255, 255, 192);
     my @end   = (0, 192, 0);      my @end   = (0, 192, 0);
Line 444  sub outputTable { Line 365  sub outputTable {
     # If there were any problems at the top level, print an extra "catchall"      # If there were any problems at the top level, print an extra "catchall"
     if ($topLevelParts > 0) {      if ($topLevelParts > 0) {
         my $ratio = $topLevelRight / $topLevelParts;          my $ratio = $topLevelRight / $topLevelParts;
         my $color = &mixColors(\@start, \@end, $ratio);          my $color = mixColors(\@start, \@end, $ratio);
         $r->print(&Apache::loncommon::start_data_table_row()          $r->print(&Apache::loncommon::start_data_table_row()
                  .'<td style="background-color:'.$color.';">');                   .'<td style="background-color:'.$color.';">');
         $r->print(&mt("Problems Not Contained In A Folder")."</td><td>");          $r->print(&mt("Problems Not Contained In A Folder")."</td><td>");
Line 456  sub outputTable { Line 377  sub outputTable {
 # show totals (if applicable), close table  # show totals (if applicable), close table
 #  #
     if ($showPoints) {      if ($showPoints) {
  my $maxHelpLink = &Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct");          my $maxHelpLink = Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct");
   
  $title = $showPoints ? "Points" : "Parts Done";          $title = $showPoints ? "Points" : "Parts Done";
  my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done");          my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done");
  $r->print(&Apache::loncommon::start_data_table_row()          $r->print(&Apache::loncommon::start_data_table_row()
                  .'<td colspan="2" align="right">'.$totaltitle.': <b>'.$totalRight.'</b><br />');                   .'<td colspan="2" align="right">'.$totaltitle.': <b>'.$totalRight.'</b><br />');
  $r->print(&mt('Max Possible To Date')." $maxHelpLink: <b>$totalPossible</b><br />");          $r->print(&mt('Max Possible To Date')." $maxHelpLink: <b>$totalPossible</b><br />");
  $title = $showPoints ? "Points" : "Parts";          $title = $showPoints ? "Points" : "Parts";
  $r->print(&mt("Total $title In Course").': <b>'.$totalParts.'</b></td>'          $r->print(&mt("Total $title In Course").': <b>'.$totalParts.'</b></td>'
                  .&Apache::loncommon::end_data_table_row());                   .&Apache::loncommon::end_data_table_row());
     }      }
   
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table()
     return;               .&Apache::loncommon::end_page());
 }  
   
 sub startpage {  
     my ($r,$showPoints) = @_;  
     my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";  
     my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];  
     $r->print(&Apache::loncommon::start_page($title,undef,  
                                             {'bread_crumbs' => $brcrum})  
              );  
 }  }
   
 sub startGradeScreen {  #
     my ($r)=@_;  # Outputting category-based grades.
   #
     my $showPoints =  
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard';  
     my $notshowSPRSlink =  
         (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external')  
       || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));  
     my $notshowTotals =  
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';  
     my $showSPRSlink =  
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'spreadsheet';  
   
     my $allowed_to_view = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});  
     if ((!$allowed_to_view) && ($env{'request.course.sec'} ne '')) {  
         $allowed_to_view = &Apache::lonnet::allowed('vgr',  
                                "$env{'request.course.id'}/$env{'request.course.sec'}");  
     }  
   
     my $allowed_to_edit = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});  sub outputCategories {
     if ((!$allowed_to_edit) && ($env{'request.course.sec'} ne '')) {  
         $allowed_to_edit = &Apache::lonnet::allowed('mgr',  
                                "$env{'request.course.id'}/$env{'request.course.sec'}");  
     }  
   
     if ($allowed_to_view) {      my ($r,$showPoints,$notshowTotals,
         my @notes;             $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;
         push(@notes,&mt('Students do not see total points.')) if ($notshowTotals);  
         push(@notes,&mt('Students do not see link to spreadsheet.')) if ($notshowSPRSlink);  
         push(@notes,&mt('Students will see points based on problem weights.')) if ($showPoints);  
         push(@notes,&mt('Students will see link to spreadsheet.')) if ($showSPRSlink);  
         push(@notes,&Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));  
         $r->print(&Apache::loncommon::head_subbox(join('&nbsp;&nbsp;',@notes)));  
     } elsif (!$allowed_to_edit) {  
         if (!$showPoints && !$notshowSPRSlink ) {  
             $r->print(&Apache::loncommon::head_subbox(  
                       &mt('This screen shows how many problems (or problem parts) you have completed'  
                      .', and how many you have not yet done.'  
                      .' You can also look at [_1]a detailed score sheet[_2].'  
                      ,'<a href="/adm/studentcalc">','</a>')));  
         }  
     }  
     return;  
 }  
   
 sub endGradeScreen {  
     my ($r)=@_;  
     $r->print(&Apache::loncommon::end_page());  
     return;  
 }  }
   
 # Pass this two refs to arrays for the start and end color, and a number  # Pass this two refs to arrays for the start and end color, and a number
 # from 0 to 1 for how much of the latter you want to mix in. It will  # from 0 to 1 for how much of the latter you want to mix in. It will
 # return a string ready to show ("#FFC309");  # return a string ready to show ("#FFC309");
   
 sub mixColors {  sub mixColors {
     my $start = shift;      my $start = shift;
     my $end = shift;      my $end = shift;

Removed from v.1.49.6.8  
changed lines
  Added in v.1.59


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>