Diff for /loncom/interface/lonquickgrades.pm between versions 1.49.6.5.2.1 and 1.61

version 1.49.6.5.2.1, 2020/05/25 16:45:31 version 1.61, 2011/01/03 14:39:19
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;
     }      }
   
       # 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;  
   
     unless (&Apache::lonnet::allowed('mgr')) {      my $title = "Grading and Statistics";#$showPoints ? "Points Display" : "Completed Problems Display";
         # Check for critical messages and redirect if present.      my $brcrum = [{href=>"/adm/quickgrades",text => "Points Display"}];
         my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'grades');      $r->print(&Apache::loncommon::start_page($title,undef,
         if ($redirect) {                                              {'bread_crumbs' => $brcrum})
             &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();
   
     my $notshowSPRSlink =   #    my $uname='korte';
   #    my $udom='gerd';
   
       my $uname;
       my $udom;
   
       my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=
          &getData($showPoints,$uname,$udom);
   
       if ($showCategories) {
          &outputCategories($r,$showPoints,$notshowTotals,
                    $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
       } else {
          &outputTable($r,$showPoints,$notshowTotals,
                    $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
       }
       &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 'external')
       || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals'));        || ($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';
   
     # Create the nav map      my $allowed_to_view =  &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     my $navmap = Apache::lonnavmaps::navmap->new();      my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
   
     if (!defined($navmap)) {      if ($allowed_to_view) {
         my $requrl = $r->uri;         my @notes;
         $env{'user.error.msg'} = "$requrl:bre:0:0:Navamp initialization failed.";         push(@notes,&mt('Students do not see total points.')) if ($notshowTotals);
         return HTTP_NOT_ACCEPTABLE;         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 points based on categories.')) if ($showCategories);
          push(@notes, &Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));
          $r->print(&Apache::loncommon::head_subbox(join('&nbsp;&nbsp;',@notes)));
     }      }
   
     # Keep this hash in sync with %statusIconMap in lonnavmaps; they  
     # should match color/icon      $r->print("\n".'<ul class="LC_TabContentBigger" id="main">');
     my $res = $navmap->firstResource(); # temp resource to access constants      $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'))).
     if (!$showPoints && !$notshowSPRSlink ) {                                            '&nbsp;&nbsp;&nbsp;&nbsp;</b></a></li>');
         $r->print('<p>'  
                  .&mt('This screen shows how many problems (or problem parts) you have completed'      if (!($showPoints || $notshowSPRSlink) || ($allowed_to_view)) {
                      .', and how many you have not yet done.'         $r->print("\n".'<li'.($mode eq 'spreadsheet'?' class="active"':'').'><a href="/adm/'.($allowed_to_view?'classcalc':'studentcalc').'"><b>'.
                      .' You can also look at [_1]a detailed score sheet[_2].'                                                                   &mt('Spreadsheet (Detailed)').'</b></a></li>');
                      ,'<a href="/adm/studentcalc">','</a>')  
                  .'</p>');  
     }      }
       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>');
   
     $r->print('<p class="LC_info">'.&mt('This may take a few moments to display.').'</p>');      }
       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;">');
   }
   
     $r->rflush();  sub endGradeScreen {
      my ($r)=@_;
      $r->print('</div></div></div>');
   }
   
   
   sub getData {
   
       my ($showPoints,$uname,$udom)=@_;
   
     # End navmap using boilerplate      &Apache::lonnet::logthis("About to call with $uname $udom");
   
       # Create the nav map
       my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);
   
       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;
Line 273  ENDCLOSE Line 283  ENDCLOSE
         }          }
         $curRes = $iterator->next();          $curRes = $iterator->next();
     }      }
       return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
   }
   
     $iterator = $navmap->getIterator(undef, undef, undef, 1);  #
     $depth = 1;  # Outputting everything.
     $iterator->next(); # ignore first BEGIN_MAP  #
     $curRes = $iterator->next();  
   sub outputTable {
   
       my ($r,$showPoints,$notshowTotals,
              $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 290  ENDCLOSE Line 306  ENDCLOSE
              .'<th>'.&mt('Folder').'</th>');               .'<th>'.&mt('Folder').'</th>');
     my $title = &mt($showPoints ? "Points Scored" : "Done");      my $title = &mt($showPoints ? "Points Scored" : "Done");
     if ($totalAttempted) {      if ($totalAttempted) {
  $title .= " / " . &mt("Attempted");          $title .= " / " . &mt("Attempted");
     }      }
     $r->print("<th>$title".($notshowTotals?'':" / ".&mt('Total')).'</th>'      $r->print("<th>$title".($notshowTotals?'':" / ".&mt('Total')).'</th>'
              .&Apache::loncommon::end_data_table_header_row());               .&Apache::loncommon::end_data_table_header_row());
   #
   # Output of folder scores
   #
   
       my $iterator = $navmap->getIterator(undef, undef, undef, 1);
       my $depth = 1;
       $iterator->next(); # ignore first BEGIN_MAP
       my $curRes = $iterator->next();
   
     while ($depth > 0) {      while ($depth > 0) {
         if ($curRes == $iterator->BEGIN_MAP()) {$depth++;}          if ($curRes == $iterator->BEGIN_MAP()) {$depth++;}
         if ($curRes == $iterator->END_MAP()) { $depth--; }          if ($curRes == $iterator->END_MAP()) { $depth--; }
Line 341  ENDCLOSE Line 366  ENDCLOSE
     # 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 349  ENDCLOSE Line 374  ENDCLOSE
                  .&Apache::loncommon::end_data_table_row());                   .&Apache::loncommon::end_data_table_row());
     }      }
   
   #
   # 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()
              .&Apache::loncommon::end_page());               .&Apache::loncommon::end_page());
   
     return OK;  
 }  }
   
 sub startpage {  #
     my ($r,$showPoints) = @_;  # Outputting category-based grades.
     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,  sub outputCategories {
                                             {'bread_crumbs' => $brcrum})  
              );      my ($r,$showPoints,$notshowTotals,
              $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;
 }  }
   
 # 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.5.2.1  
changed lines
  Added in v.1.61


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