Diff for /loncom/interface/lonquickgrades.pm between versions 1.108 and 1.124

version 1.108, 2016/01/31 21:25:38 version 1.124, 2022/10/19 18:09:04
Line 77  sub real_handler { Line 77  sub real_handler {
     }      }
   
     my $cangrade=&Apache::lonnet::allowed('mgr');      my $cangrade=&Apache::lonnet::allowed('mgr');
       my $showPoints =
           (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard')
         || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));
   
       my $reinitresult;
   
       if ($env{'request.course.id'}) {
           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my $clientip = &Apache::lonnet::get_requestor_ip($r);
           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) {      unless ($cangrade) {
         # Check for critical messages and redirect if present.          # Check for critical messages and redirect if present.
         my ($redirect,$url) = &Apache::loncommon::critical_redirect(300);          my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'grades');
         if ($redirect) {          if ($redirect) {
             &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
             $r->header_out(Location => $url);              $r->header_out(Location => $url);
Line 89  sub real_handler { Line 113  sub real_handler {
   
         # Check if course needs to be re-initialized          # Check if course needs to be re-initialized
         my $loncaparev = $r->dir_config('lonVersion');          my $loncaparev = $r->dir_config('lonVersion');
         my ($result,@reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);          ($reinitresult,my @reinit) = &Apache::loncommon::needs_coursereinit($loncaparev);
   
         if ($result eq 'switch') {          if ($reinitresult eq 'switch') {
             &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
             $r->send_http_header;              $r->send_http_header;
             $r->print(&Apache::loncommon::check_release_result(@reinit));              $r->print(&Apache::loncommon::check_release_result(@reinit));
             return OK;              return OK;
         } elsif ($result eq 'update') {          }
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my ($cid,$cnum,$cdom);
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          if ($reinitresult) {
               $cid = $env{'request.course.id'};
               $cnum = $env{'course.'.$cid.'.num'};
               $cdom = $env{'course.'.$cid.'.domain'};
           }
           if (($reinitresult eq 'main') || ($reinitresult eq 'both')) {
               &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>';
               %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");              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) {              if ($ferr) {
                   $r->print($closure.&Apache::loncommon::end_page());
                 my $requrl = $r->uri;                  my $requrl = $r->uri;
                 $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";                  $env{'user.error.msg'}="$requrl:bre:0:0:Course not initialized";
                 $env{'user.reinit'} = 1;                  $env{'user.reinit'} = 1;
                 return HTTP_NOT_ACCEPTABLE;                  return HTTP_NOT_ACCEPTABLE;
               } else {
                  $r->print($closure);
               }
           } elsif ((&Apache::loncommon::course_type() eq 'Placement') &&
                    (!$env{'request.role.adv'})) {
               my $furl = &Apache::lonpageflip::first_accessible_resource();
               &Apache::loncommon::content_type($r,'text/html');
               $r->header_out(Location => $furl);
               return REDIRECT;
           }
           if (($reinitresult eq 'supp') || ($reinitresult eq 'both')) {
               my $possdel;
               if ($reinitresult eq 'supp') {
                   $possdel = 1;
               }
               my ($supplemental,$refs_updated) = &Apache::lonnet::get_supplemental($cnum,$cdom,'',$possdel);
               unless ($refs_updated) {
                   &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental);
             }              }
         }          }
     }      }
   
     # Send header, don't cache this page      unless (($reinitresult eq 'main') || ($reinitresult eq 'both')) {
     &Apache::loncommon::no_cache($r);          # Send header, don't cache this page
     $r->send_http_header;          &Apache::loncommon::no_cache($r);
           $r->send_http_header;
     my $showPoints =          &startpage($r,$showPoints);
         (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard')      }
       || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));      $r->rflush();
     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 $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})  
              );  
   
     &startGradeScreen($r,'quick');      &startGradeScreen($r,'quick');
   
Line 183  sub real_handler { Line 237  sub real_handler {
             $r->print('<p><span class="LC_warning">'.&mt("Unknown Student/Employee ID: [_1]",$stdid).'</span></p>');              $r->print('<p><span class="LC_warning">'.&mt("Unknown Student/Employee ID: [_1]",$stdid).'</span></p>');
             $stdid='';              $stdid='';
         }          }
           if (($uname eq '') && ($udom eq '')) {
               $uname = $env{'user.name'};
               $udom = $env{'user.domain'};
           }
         $r->print('<form method="post" name="quickform" action="/adm/quickgrades">');          $r->print('<form method="post" name="quickform" action="/adm/quickgrades">');
         my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.          my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
            &Apache::loncommon::selectstudent_link('quickform','uname','udom');             &Apache::loncommon::selectstudent_link('quickform','uname','udom');
Line 198  sub real_handler { Line 256  sub real_handler {
     }      }
     $r->rflush();      $r->rflush();
   
     my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=      my $notshowTotals=
        &getData($showPoints,$uname,$udom);          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals';
       my $showCategories=
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
   
     if ($showCategories) {      my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,
        &outputCategories($r,$showPoints,$notshowTotals,          $topLevelRight,$topLevelAttempted) = &getData($showPoints,$uname,$udom);
                  $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);  
       if (ref($navmap)) {
           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);
           }
     } else {      } else {
        &outputTable($r,$showPoints,$notshowTotals,          if ($cangrade) { $r->print("\n</form>\n"); }
                  $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);          my $requrl = $r->uri;
           $env{'user.error.msg'} = "$requrl:bre:0:0:Navmap initialization failed.";
           return HTTP_NOT_ACCEPTABLE;
     }      }
     if ($cangrade) { $r->print("\n</form>\n"); }      if ($cangrade) { $r->print("\n</form>\n"); }
     &endGradeScreen($r);      &endGradeScreen($r);
     return OK;      return OK;
   }
   
   sub grades_blocked {
       my ($r,$blocktext,$caller) = @_;
       my $title = 'Points Display';
       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;
 }  }
   
 sub getStudentCatGrade {  sub getStudentCatGrade {
Line 242  sub getAllStudentData { Line 336  sub getAllStudentData {
     }      }
 }  }
   
   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 {  sub startGradeScreen {
     my ($r,$mode)=@_;      my ($r,$mode)=@_;
Line 252  sub startGradeScreen { Line 354  sub startGradeScreen {
         (($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'));        || ($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=      my $showSPRSlink =
           $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'spreadsheet';
       my $showCategories =
         $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';          $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories';
    
       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_view =  &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $allowed_to_edit = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
     my $allowed_to_edit =  &Apache::lonnet::allowed('mgr',$env{'request.course.id'});      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) {      if ($allowed_to_view) {
        my @notes;         my @notes;
Line 266  sub startGradeScreen { Line 379  sub startGradeScreen {
        push(@notes,&mt('Students do not see link to spreadsheet.')) if ($notshowSPRSlink);         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 problem weights.')) if ($showPoints);
        push(@notes,&mt('Students will see points based on categories.')) if ($showCategories);         push(@notes,&mt('Students will see points based on categories.')) if ($showCategories);
          push(@notes,&mt('Students will see link to spreadsheet.')) if ($showSPRSlink);
        push(@notes, &Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));         push(@notes, &Apache::lonhtmlcommon::coursepreflink(&mt('Grade display settings'),'grading'));
        $r->print(&Apache::loncommon::head_subbox(join('&nbsp;&nbsp;',@notes)));         $r->print(&Apache::loncommon::head_subbox(join('&nbsp;&nbsp;',@notes)));
     }      }
Line 285  sub startGradeScreen { Line 399  sub startGradeScreen {
                                                                  &mt('Statistics and Reports').'</b></a></li>');                                                                   &mt('Statistics and Reports').'</b></a></li>');
   
        $r->print("\n".'<li'.($mode eq 'chart'?' class="active"':'').'><a href="/adm/statistics?reportSelected=student_assessment"><b>'.         $r->print("\n".'<li'.($mode eq 'chart'?' class="active"':'').'><a href="/adm/statistics?reportSelected=student_assessment"><b>'.
                                                                  &mt('Assessment Overview Chart').'</b></a></li>');                                                                   &mt('Assessment Chart').'</b></a></li>');
   
     }      }
     if ($allowed_to_edit) {      if ($allowed_to_edit) {
Line 304  sub startGradeScreen { Line 418  sub startGradeScreen {
 }  }
   
 sub endGradeScreen {  sub endGradeScreen {
    my ($r)=@_;      my ($r)=@_;
    $r->print('</div></div></div>'.&Apache::loncommon::end_page());      $r->print('</div></div></div>'.&Apache::loncommon::end_page());
       return;
 }  }
   
 # -----------  # -----------
Line 378  sub getData { Line 493  sub getData {
     # 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 $deeplinkcond = 1;
       my $iterator = $navmap->getIterator(undef, undef, undef, 1, undef, undef, $deeplinkcond);
     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 406  sub getData { Line 526  sub getData {
     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--; }
           my ($deeplink,$nodeeplinkcheck,$symb);
         if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout)          $nodeeplinkcheck = 1;
           if (ref($curRes)) {
               $symb = $curRes->symb();
               $deeplink = $curRes->deeplink('quickgrades');
               if ($deeplink eq 'absent') {
                   $nodeeplinkcheck = 0;
               }
           }
           if (ref($curRes) && $curRes->is_gradable() && !$curRes->randomout &&
               ($nodeeplinkcheck))
         {          {
             # Get number of correct, incorrect parts              # Get number of correct, incorrect parts
             my $parts = $curRes->parts();              my $parts = $curRes->parts();
Line 497  sub getData { Line 626  sub getData {
         }          }
         $curRes = $iterator->next();          $curRes = $iterator->next();
     }      }
     return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);      return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,
               $topLevelParts,$topLevelRight,$topLevelAttempted);
 }  }
   
 #  #
Line 506  sub getData { Line 636  sub getData {
   
 sub outputTable {  sub outputTable {
   
     my ($r,$showPoints,$notshowTotals,      my ($r,$showPoints,$notshowTotals,$navmap,$totalParts,$totalPossible,$totalRight,
            $navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_;          $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 528  sub outputTable { Line 658  sub outputTable {
 # Output of folder scores  # Output of folder scores
 #  #
   
     my $iterator = $navmap->getIterator(undef, undef, undef, 1);      my $deeplinkcond = 1;
       my $iterator = $navmap->getIterator(undef, undef, undef, 1, undef, undef, $deeplinkcond);
     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();
Line 605  sub outputTable { Line 736  sub outputTable {
     }      }
   
     $r->print(&Apache::loncommon::end_data_table());      $r->print(&Apache::loncommon::end_data_table());
       return;
 }  }
   
 #  #
Line 658  sub dumpdata { Line 790  sub dumpdata {
   
 # Run through the map and get all data  # Run through the map and get all data
   
     my $iterator = $navmap->getIterator(undef, undef, undef, 1);      my $deeplinkcond = 1;
       my $iterator = $navmap->getIterator(undef, undef, undef, 1, undef, undef, $deeplinkcond);
     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();

Removed from v.1.108  
changed lines
  Added in v.1.124


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