--- loncom/interface/lonquickgrades.pm 2011/06/02 01:34:34 1.98
+++ loncom/interface/lonquickgrades.pm 2024/12/10 04:52:30 1.128
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Quick Student Grades Display
#
-# $Id: lonquickgrades.pm,v 1.98 2011/06/02 01:34:34 www Exp $
+# $Id: lonquickgrades.pm,v 1.128 2024/12/10 04:52:30 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -29,22 +29,30 @@
package Apache::lonquickgrades;
use strict;
-use Apache::Constants qw(:common :http);
+use Apache::Constants qw(:common :http REDIRECT);
use POSIX;
use Apache::loncommon;
use Apache::lonlocal;
use Apache::lonnet;
use Apache::grades;
-use Time::HiRes;
-my $time=0;
+use Apache::loncoursedata;
+use Apache::lonstudentassessment;
+use Apache::lonuserstate;
-sub tim {
- my ($label)=@_;
- my $tt=&Time::HiRes::time();
- my $dt=$tt-$time;
- &Apache::lonnet::logthis("qg $label ".$dt);
- $time=$tt;
-}
+use Time::HiRes;
+use Spreadsheet::WriteExcel;
+use Spreadsheet::WriteExcel::Utility();
+#
+# Excel data
+#
+my $excel_sheet;
+my $excel_workbook;
+my $filename;
+my $format;
+my $request_aborted;
+my $header_row;
+my $cols_output;
+my %prog_state;
sub handler {
@@ -68,31 +76,117 @@ sub real_handler {
return OK;
}
- # Send header, don't cache this page
- &Apache::loncommon::no_cache($r);
- $r->send_http_header;
-
+ 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 $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;
- 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})
- );
+ 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) {
+ # Check for critical messages and redirect if present.
+ my ($redirect,$url) = &Apache::loncommon::critical_redirect(300,'grades');
+ if ($redirect) {
+ &Apache::loncommon::content_type($r,'text/html');
+ $r->header_out(Location => $url);
+ return REDIRECT;
+ }
+
+ # Check if course needs to be re-initialized
+ 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;
+ }
+ 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);
+ my $preamble = '
'.
+ '
'.
+ &mt('Your course session is being updated because of recent changes by course personnel.').
+ ' '.&mt('Please be patient').'.
'.
+ '';
+ %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
+ 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);
+ }
+ } 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::loncommon::get_supplemental($cnum,$cdom,'',$possdel);
+ unless ($refs_updated) {
+ &Apache::loncommon::set_supp_httprefs($cnum,$cdom,$supplemental);
+ }
+ }
+ }
+
+ unless (($reinitresult eq 'main') || ($reinitresult eq 'both')) {
+ # Send header, don't cache this page
+ &Apache::loncommon::no_cache($r);
+ $r->send_http_header;
+ &startpage($r,$showPoints);
+ }
+ $r->rflush();
&startGradeScreen($r,'quick');
- my $cangrade=&Apache::lonnet::allowed('mgr');
#
# Pick student
#
@@ -100,16 +194,53 @@ sub real_handler {
my $udom;
my $stdid;
if ($cangrade) {
+ $r->print("".&mt("Download Multiple")."
".
+ ''."\n"
+ );
+ $r->print("
".&mt("Display Individual")."
");
if ($env{'form.uname'}) { $uname=$env{'form.uname'}; }
if ($env{'form.udom'}) { $udom=$env{'form.udom'}; }
if ($env{'form.id'}) { $stdid=$env{'form.id'}; }
if (($stdid) && ($udom)) {
- $uname=(&Apache::lonnet::idget($udom,$stdid))[1];
+ $uname=(&Apache::lonnet::idget($udom,[$stdid],'ids'))[1];
}
if (($stdid) && (!$uname)) {
$r->print(''.&mt("Unknown Student/Employee ID: [_1]",$stdid).'
');
$stdid='';
}
+ if (($uname eq '') && ($udom eq '')) {
+ $uname = $env{'user.name'};
+ $udom = $env{'user.domain'};
+ }
$r->print('\n"); }
+ my $requrl = $r->uri;
+ $env{'user.error.msg'} = "$requrl:bre:0:0:Navmap initialization failed.";
+ return HTTP_NOT_ACCEPTABLE;
}
if ($cangrade) { $r->print("\n\n"); }
&endGradeScreen($r);
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 {
+ my ($uname,$udom,$usec,%categories)=@_;
+ my ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted)=
+ &getData(1,$uname,$udom,$usec);
+ return &output_category_table(undef,0,$navmap,0,%categories);
+}
+
+sub getAllStudentData {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %categories=&Apache::lonnet::dump('grading_categories',$cdom,$cnum);
+
+ my $classlist = &Apache::loncoursedata::get_classlist();
+
+ my $statusidx = &Apache::loncoursedata::CL_STATUS();
+ my $usernameidx = &Apache::loncoursedata::CL_SNAME();
+ my $domainidx = &Apache::loncoursedata::CL_SDOM();
+ my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
+ my $sectionidx = &Apache::loncoursedata::CL_SECTION();
+
+ foreach my $key (keys(%{$classlist})) {
+ my $student = $classlist->{$key};
+ my $perc=&getStudentCatGrade($classlist->{$student}->[$usernameidx],
+ $classlist->{$student}->[$domainidx],
+ $classlist->{$student}->[$sectionidx],
+ %categories);
+ }
+}
+
+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 {
@@ -146,24 +380,52 @@ 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')
|| ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'categories'));
- my $notshowTotals=
+ my $notshowTotals =
$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';
+
+ 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) {
my @notes;
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'));
$r->print(&Apache::loncommon::head_subbox(join(' ',@notes)));
}
@@ -183,7 +445,7 @@ sub startGradeScreen {
&mt('Statistics and Reports').'');
$r->print("\n".''.
- &mt('Assessment Overview Chart').'');
+ &mt('Assessment Chart').'');
}
if ($allowed_to_edit) {
@@ -192,7 +454,7 @@ sub startGradeScreen {
if ($env{'form.symb'}) {
$r->print("\n".' '.
+ '&command=gradingmenu"> '.
&mt('Problem Grading').' ');
}
@@ -202,25 +464,93 @@ sub startGradeScreen {
}
sub endGradeScreen {
- my ($r)=@_;
- $r->print(''.&Apache::loncommon::end_page());
+ my ($r)=@_;
+ $r->print(''.&Apache::loncommon::end_page());
+ return;
+}
+
+# -----------
+
+
+sub excel_cleanup {
+ undef ($excel_sheet);
+ undef ($excel_workbook);
+ undef ($filename);
+ undef ($format);
}
+sub excel_initialize {
+ my ($r) = @_;
+
+ &excel_cleanup();
+
+ # Create sheet
+ ($excel_workbook,$filename,$format)=
+ &Apache::loncommon::create_workbook($r);
+ return if (! defined($excel_workbook));
+ #
+ # Add a worksheet
+ my $sheetname = $env{'course.'.$env{'request.course.id'}.'.description'};
+ $sheetname = &Apache::loncommon::clean_excel_name($sheetname);
+ $excel_sheet = $excel_workbook->addworksheet($sheetname);
+ #
+ # Put the course description in the header
+ $excel_sheet->write($header_row,$cols_output++,
+ $env{'course.'.$env{'request.course.id'}.'.description'},
+ $format->{'h1'});
+}
+
+sub excel_finish {
+ my ($r) = @_;
+ if ($request_aborted || ! defined($excel_sheet)) {
+ &excel_cleanup();
+ return;
+ }
+ #
+ # Write the excel file
+ $excel_workbook->close();
+ #
+ # Close the progress window
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ #
+ # Tell the user where to get their excel file
+ $r->print('
'.
+ ''.&mt('Your Excel spreadsheet').''."\n");
+ $r->rflush();
+ &excel_cleanup();
+ return;
+}
+
+
+#
+# CSV data
+#
+# -----------
+
+#
+# Go through the complete course and collect data
+#
+
sub getData {
- my ($showPoints,$uname,$udom)=@_;
+ my ($showPoints,$uname,$udom,$usec)=@_;
# Create the nav map
- my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom);
+ my $navmap = Apache::lonnavmaps::navmap->new($uname,$udom,$usec);
+
+ if (!defined($navmap)) {
+ return ();
+ }
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();
-
+
# General overview of the following: Walk along the course resources.
# 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
@@ -242,8 +572,17 @@ sub getData {
while ( $depth > 0 ) {
if ($curRes == $iterator->BEGIN_MAP()) {$depth++;}
if ($curRes == $iterator->END_MAP()) { $depth--; }
-
- if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout)
+ 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();
@@ -333,7 +672,8 @@ sub getData {
}
$curRes = $iterator->next();
}
- return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,$topLevelParts,$topLevelRight,$topLevelAttempted);
+ return ($navmap,$totalParts,$totalPossible,$totalRight,$totalAttempted,
+ $topLevelParts,$topLevelRight,$topLevelAttempted);
}
#
@@ -342,8 +682,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);
@@ -364,7 +704,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();
@@ -428,19 +769,22 @@ 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());
+ return;
}
#
@@ -472,7 +816,7 @@ sub outputCategories {
&Apache::lonnet::put('grading_categories',\%categories,$cdom,$cnum);
}
# new categories loaded now
- &output_category_table($r,$cangrade,$navmap,%categories);
+ &output_category_table($r,$cangrade,$navmap,1,%categories);
#
if ($cangrade) {
$r->print(&Apache::loncommon::resourcebrowser_javascript().
@@ -482,40 +826,6 @@ sub outputCategories {
''.
'');
}
-#
-# Debug
-#
-# my %data=&dumpdata($navmap);
-# foreach (keys(%data)) {
-# $r->print("\n
".$_.'='.$data{$_});
-# }
-# my @debugarray=('5:1','4:3','1:1','5:5','6:7');
-# $r->print("Array: ".join(',',@debugarray).'
');
-# $r->print("0,0,0: ".join(',',&drop(0,0,0,@debugarray)).'
');
-# $r->print("1,0,0: ".join(',',&drop(1,0,0,@debugarray)).'
');
-# $r->print("0,1,0: ".join(',',&drop(0,1,0,@debugarray)).'
');
-# $r->print("1,1,0: ".join(',',&drop(1,1,0,@debugarray)).'
');
-#
-# $r->print("0,0,2: ".join(',',&drop(0,0,2,@debugarray)).'
');
-# $r->print("1,0,2: ".join(',',&drop(1,0,2,@debugarray)).'
');
-# $r->print("0,1,2: ".join(',',&drop(0,1,2,@debugarray)).'
');
-# $r->print("1,1,2: ".join(',',&drop(1,1,2,@debugarray)).'
');
-#
-# $r->print("0,0,4: ".join(',',&drop(0,0,4,@debugarray)).'
');
-# $r->print("1,0,4: ".join(',',&drop(1,0,4,@debugarray)).'
');
-# $r->print("0,1,4: ".join(',',&drop(0,1,4,@debugarray)).'
');
-# $r->print("1,1,4: ".join(',',&drop(1,1,4,@debugarray)).'
');
-#
-# $r->print("0,0,5: ".join(',',&drop(0,0,5,@debugarray)).'
');
-# $r->print("1,0,5: ".join(',',&drop(1,0,5,@debugarray)).'
');
-# $r->print("0,1,5: ".join(',',&drop(0,1,5,@debugarray)).'
');
-# $r->print("1,1,5: ".join(',',&drop(1,1,5,@debugarray)).'
');
-#
-# $r->print("0,0,7: ".join(',',&drop(0,0,7,@debugarray)).'
');
-# $r->print("1,0,7: ".join(',',&drop(1,0,7,@debugarray)).'
');
-# $r->print("0,1,7: ".join(',',&drop(0,1,7,@debugarray)).'
');
-# $r->print("1,1,7: ".join(',',&drop(1,1,7,@debugarray)).'
');
-
}
#
@@ -528,7 +838,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();
@@ -598,21 +909,23 @@ sub process_category_edits {
#
sub output_category_table {
- my ($r,$cangrade,$navmaps,%categories)=@_;
+ my ($r,$cangrade,$navmaps,$output,%categories)=@_;
my $totalweight=0;
my $totalpoints=0;
- $r->print(&Apache::loncommon::start_data_table());
+ if ($output) {
+ $r->print(&Apache::loncommon::start_data_table());
#
- &output_category_table_header($r,$cangrade);
+ &output_category_table_header($r,$cangrade);
+ }
#
my @order=split(/\,/,$categories{'order'});
#
my %performance=&dumpdata($navmaps);
my $maxpos=$#order;
for (my $i=0;$i<=$maxpos;$i++) {
- my ($correct,$possible,$type,$weight)=&output_and_calc_category($r,$cangrade,$navmaps,$order[$i],$i,$maxpos,\%performance,1,%categories);
+ my ($correct,$possible,$type,$weight)=&output_and_calc_category($r,$cangrade,$navmaps,$order[$i],$i,$maxpos,\%performance,$output,%categories);
unless ($possible) { next; }
$totalpoints+=$weight*$correct/$possible;
$totalweight+=$weight;
@@ -621,9 +934,10 @@ sub output_category_table {
my $perc=0;
if ($totalweight) { $perc=100.*$totalpoints/$totalweight; }
- &bottom_line_category($r,$cangrade,$perc);
-#
- $r->print(&Apache::loncommon::end_data_table());
+ if ($output) {
+ &bottom_line_category($r,$cangrade,$perc);
+ $r->print(&Apache::loncommon::end_data_table());
+ }
return $perc;
}
@@ -649,14 +963,15 @@ sub output_category_table_header {
sub output_and_calc_category {
my ($r,$cangrade,$navmaps,$id,$currentpos,$maxpos,$performance,$output,%categories)=@_;
+
+ if ($output) { $r->print("\n".&Apache::loncommon::start_data_table_row()); }
- my $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
- my %lt=&Apache::lonlocal::texthash(
+ if ($output && $cangrade) {
+ my $iconpath = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL') . "/");
+ my %lt=&Apache::lonlocal::texthash(
'up' => 'Move Up',
'dw' => 'Move Down');
- if ($output) { $r->print("\n".&Apache::loncommon::start_data_table_row()); }
- if ($output && $cangrade) {
$r->print(<