--- loncom/interface/lonquickgrades.pm 2021/02/18 14:48:02 1.120 +++ loncom/interface/lonquickgrades.pm 2024/01/05 19:10:30 1.127 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Quick Student Grades Display # -# $Id: lonquickgrades.pm,v 1.120 2021/02/18 14:48:02 raeburn Exp $ +# $Id: lonquickgrades.pm,v 1.127 2024/01/05 19:10:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -86,8 +86,9 @@ sub real_handler { 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',$cnum,$cdom); + &Apache::loncommon::blocking_status('grades',$clientip,$cnum,$cdom); if ($blocked) { my $checkrole = "cm./$cdom/$cnum"; if ($env{'request.course.sec'} ne '') { @@ -119,10 +120,14 @@ sub real_handler { $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'}; + } + my ($cid,$cnum,$cdom); + 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); @@ -160,9 +165,19 @@ ENDCLOSE $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::loncommon::get_supplemental($cnum,$cdom,'',$possdel); + unless ($refs_updated) { + &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental); + } + } } - unless ($reinitresult eq 'update') { + unless (($reinitresult eq 'main') || ($reinitresult eq 'both')) { # Send header, don't cache this page &Apache::loncommon::no_cache($r); $r->send_http_header; @@ -255,9 +270,36 @@ ENDCLOSE $totalRight,$totalAttempted,$topLevelParts,$topLevelRight, $topLevelAttempted); } else { - &outputTable($r,$showPoints,$notshowTotals,$navmap,$totalParts,$totalPossible, - $totalRight,$totalAttempted,$topLevelParts,$topLevelRight, - $topLevelAttempted); + my $nostdtotals; + if ($showPoints) { + if ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard') { + my $hidetotals = $env{'course.'.$env{'request.course.id'}.'.hidetotals'}; + if ($hidetotals eq 'all') { + $nostdtotals = 1; + } elsif ($hidetotals ne '') { + my $usec; + if ($cangrade) { + if (($uname eq $env{'user.name'}) && ($udom eq $env{'user.domain'})) { + $usec = $env{'request.course.sec'}; + } else { + $usec = &Apache::lonnet::getsection($udom,$uname,$env{'request.course.id'}); + } + } else { + $usec = $env{'request.course.sec'}; + } + if ($usec ne '') { + my %secnototals; + map { $secnototals{$_} = 1; } split(/,/,$hidetotals); + if ($secnototals{$usec}) { + $nostdtotals = 1; + } + } + } + } + } + &outputTable($r,$showPoints,$notshowTotals,$nostdtotals,$navmap, + $totalParts,$totalPossible,$totalRight,$totalAttempted, + $topLevelParts,$topLevelRight,$topLevelAttempted); } } else { if ($cangrade) { $r->print("\n\n"); } @@ -335,6 +377,8 @@ sub startGradeScreen { my $showPoints = $env{'course.'.$env{'request.course.id'}.'.grading'} eq 'standard'; + my $hidetotals = + $env{'course.'.$env{'request.course.id'}.'.hidetotals'}; my $notshowSPRSlink = (($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'external') || ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'externalnototals') @@ -363,6 +407,20 @@ sub startGradeScreen { 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); + if (($showPoints) && ($hidetotals ne '')) { + if ($hidetotals eq 'all') { + push(@notes,&mt('Students do not see course totals.')); + } else { + my @secs = split(/,/,$hidetotals); + if (@secs == 1) { + push(@notes,&mt('Students in section [_1] do not see course totals.', + $hidetotals)); + } elsif (@secs > 1) { + push(@notes,&mt('Students in sections [_1] do not see course totals.', + join(', ',@secs))); + } + } + } 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')); @@ -484,7 +542,8 @@ sub getData { 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; $iterator->next(); # ignore first BEGIN_MAP my $curRes = $iterator->next(); @@ -510,9 +569,17 @@ sub getData { while ( $depth > 0 ) { if ($curRes == $iterator->BEGIN_MAP()) {$depth++;} if ($curRes == $iterator->END_MAP()) { $depth--; } - - if (ref($curRes) && $curRes->is_gradable() && !$curRes->randomout && - ($curRes->deeplink ne 'absent')) + my ($deeplink,$nodeeplinkcheck,$symb); + $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 my $parts = $curRes->parts(); @@ -612,8 +679,8 @@ sub getData { sub outputTable { - my ($r,$showPoints,$notshowTotals,$navmap,$totalParts,$totalPossible,$totalRight, - $totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_; + my ($r,$showPoints,$notshowTotals,$nostdtotals,$navmap,$totalParts,$totalPossible, + $totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=@_; my @start = (255, 255, 192); my @end = (0, 192, 0); @@ -634,7 +701,8 @@ sub outputTable { # 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; $iterator->next(); # ignore first BEGIN_MAP my $curRes = $iterator->next(); @@ -698,16 +766,18 @@ sub outputTable { # show totals (if applicable), close table # if ($showPoints) { - my $maxHelpLink = &Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct"); + unless ($nostdtotals) { + my $maxHelpLink = &Apache::loncommon::help_open_topic("Quick_Grades_Possibly_Correct"); - $title = $showPoints ? "Points" : "Parts Done"; - my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done"); - $r->print(&Apache::loncommon::start_data_table_row() - .''.$totaltitle.': '.$totalRight.'
'); - $r->print(&mt('Max Possible To Date')." $maxHelpLink: $totalPossible
"); - $title = $showPoints ? "Points" : "Parts"; - $r->print(&mt("Total $title In Course").': '.$totalParts.'' - .&Apache::loncommon::end_data_table_row()); + $title = $showPoints ? "Points" : "Parts Done"; + my $totaltitle = $showPoints ? &mt("Awarded Total Points") : &mt("Total Parts Done"); + $r->print(&Apache::loncommon::start_data_table_row() + .''.$totaltitle.': '.$totalRight.'
'); + $r->print(&mt('Max Possible To Date')." $maxHelpLink: $totalPossible
"); + $title = $showPoints ? "Points" : "Parts"; + $r->print(&mt("Total $title In Course").': '.$totalParts.'' + .&Apache::loncommon::end_data_table_row()); + } } $r->print(&Apache::loncommon::end_data_table()); @@ -765,7 +835,8 @@ sub dumpdata { # 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; $iterator->next(); # ignore first BEGIN_MAP my $curRes = $iterator->next();