--- loncom/interface/Attic/lonspreadsheet.pm 2002/08/30 19:47:47 1.104 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/09/05 14:38:57 1.107 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.104 2002/08/30 19:47:47 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.107 2002/09/05 14:38:57 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1194,14 +1194,14 @@ sub rown { my $rowdata=''; my $dataflag=0; unless ($n eq '-') { - $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; + $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF'; } else { - $defaultbg='#E0FF'; + $defaultbg='#E0FF'; } unless ($ENV{'form.showcsv'}) { - $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; + $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>"; } else { - $rowdata.="\n".'"'.$n.'"'; + $rowdata.="\n".'"'.$n.'"'; } my $showf=0; my $proc; @@ -1225,97 +1225,102 @@ sub rown { $dataflag=1; } foreach ($safeeval->reval($proc.'('.$n.')')) { - my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); - my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); - if ((($vl ne '') || ($vl eq '0')) && - (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } - if ($showf==0) { $vl=$_; } - unless ($ENV{'form.showcsv'}) { - if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } - if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } - if (($showf>$maxred) || ((!$n) && ($showf>0))) { - if ($vl eq '') { - $vl='<font size=+2 color='.$bgcolor.'>#</font>'; - } - $rowdata.= - '<td bgcolor='.$bgcolor.'><a href="javascript:celledit('.$fm.');">'.$vl. - '</a></td>'; - } else { - $rowdata.='<td bgcolor='.$bgcolor.'> '.$vl.' </td>'; - } - } else { - $rowdata.=',"'.$vl.'"'; - } - $showf++; + my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); + my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); + if ((($vl ne '') || ($vl eq '0')) && + (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; } + if ($showf==0) { $vl=$_; } + unless ($ENV{'form.showcsv'}) { + if ($showf<=$maxred) { $bgcolor='#FFDDDD'; } + if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } + if (($showf>$maxred) || ((!$n) && ($showf>0))) { + if ($vl eq '') { + $vl='<font size=+2 color='.$bgcolor.'>#</font>'; + } + $rowdata.='<td bgcolor='.$bgcolor.'>'. + '<a href="javascript:celledit('.$fm.');">'.$vl.'</a></td>'; + } else { + $rowdata.='<td bgcolor='.$bgcolor.'> '.$vl.' </td>'; + } + } else { + $rowdata.=',"'.$vl.'"'; + } + $showf++; } # End of foreach($safeval...) if ($ENV{'form.showall'} || ($dataflag)) { - return $rowdata.($ENV{'form.showcsv'}?'':'</tr>'); + return $rowdata.($ENV{'form.showcsv'}?'':'</tr>'); } else { - return ''; + return ''; } } # ------------------------------------------------------------- Print out sheet sub outsheet { - my ($r,$safeeval)=@_; - my $maxred; - my $realm; - if (&gettype($safeeval) eq 'assesscalc') { + my ($r,$safeeval,$sheetdata)=@_; + my $maxred = 26; # The maximum number of cells to show as + # red (uneditable) + # To make student sheets uneditable could we + # set $maxred = 52? + # + my $realm='Course'; # 'assessment', 'user', or 'course' sheet + if ($sheetdata->{'sheettype'} eq 'assesscalc') { $maxred=1; $realm='Assessment'; - } elsif (&gettype($safeeval) eq 'studentcalc') { + } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { $maxred=26; $realm='User'; - } else { - $maxred=26; - $realm='Course'; } - my $maxyellow=52-$maxred; + # + # Column label my $tabledata; - unless ($ENV{'form.showcsv'}) { - $tabledata= - '<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'. - $realm.'</font></th>'. + if ($ENV{'form.showcsv'}) { + $tabledata='<pre>'; + } else { + $tabledata='<table border=2><tr><th colspan=2 rowspan=2>'. + '<font size=+2>'.$realm.'</font></th>'. '<td bgcolor=#FFDDDD colspan='.$maxred. '><b><font size=+1>Import</font></b></td>'. - '<td colspan='.$maxyellow. + '<td colspan='.(52-$maxred). '><b><font size=+1>Calculations</font></b></td></tr><tr>'; - my $showf=0; - foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', - 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', - 'a','b','c','d','e','f','g','h','i','j','k','l','m', - 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - $showf++; - if ($showf<=$maxred) { - $tabledata.='<td bgcolor="#FFDDDD">'; - } else { - $tabledata.='<td>'; - } - $tabledata.="<b><font size=+1>$_</font></b></td>"; - } - $tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0); - } else { $tabledata='<pre>'; } - + my $showf=0; + foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', + 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', + 'a','b','c','d','e','f','g','h','i','j','k','l','m', + 'n','o','p','q','r','s','t','u','v','w','x','y','z') { + $showf++; + if ($showf<=$maxred) { + $tabledata.='<td bgcolor="#FFDDDD">'; + } else { + $tabledata.='<td>'; + } + $tabledata.="<b><font size=+1>$_</font></b></td>"; + } + $tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0); + } $r->print($tabledata); - + # + # Prepare to output rows my $row; my $maxrow=&getmaxrow($safeeval); - + # my @sortby=(); my @sortidx=(); for ($row=1;$row<=$maxrow;$row++) { - $sortby[$row-1]=$safeeval->reval('$f{"A'.$row.'"}'); - $sortidx[$row-1]=$row-1; + push (@sortby, $safeeval->reval('$f{"A'.$row.'"}')); + push (@sortidx, $row-1); } @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx; - my $what='Student'; - if (&gettype($safeeval) eq 'assesscalc') { - $what='Item'; - } elsif (&gettype($safeeval) eq 'studentcalc') { - $what='Assessment'; - } - + # + # Determine the type of child spreadsheets + my $what='Student'; + if ($sheetdata->{'sheettype'} eq 'assesscalc') { + $what='Item'; + } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { + $what='Assessment'; + } + # + # Loop through the rows and output them one at a time my $n=0; for ($row=0;$row<$maxrow;$row++) { my $thisrow=&rown($safeeval,$sortidx[$row]+1); @@ -1324,9 +1329,10 @@ sub outsheet { $r->print("</table>\n<br>\n"); $r->rflush(); $r->print('<table border=2><tr><td> <td>'.$what.'</td>'); - $r->print('<td>'.join('</td><td>', - (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. - 'abcdefghijklmnopqrstuvwxyz'))). + $r->print('<td>'. + join('</td><td>', + (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + 'abcdefghijklmnopqrstuvwxyz'))). "</td></tr>\n"); } $n++; @@ -1389,12 +1395,13 @@ sub parse_sheet { # sub readsheet { - my ($safeeval,$fn)=@_; - my $stype = &gettype($safeeval); - my $cnum = &getcnum($safeeval); - my $cdom = &getcdom($safeeval); - my $chome = &getchome($safeeval); - + my ($safeeval,$sheetdata,$fn)=@_; + # + my $stype = $sheetdata->{'sheettype'}; + my $cnum = $sheetdata->{'cnum'}; + my $cdom = $sheetdata->{'cdom'}; + my $chome = $sheetdata->{'chome'}; + # if (! defined($fn)) { # There is no filename. Look for defaults in course and global, cache unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) { @@ -1461,21 +1468,27 @@ sub readsheet { sub makenewsheet { my ($uname,$udom,$stype,$usymb)=@_; + my %sheetdata=(); + $sheetdata{'uname'} = $uname; + $sheetdata{'udom'} = $udom; + $sheetdata{'sheettype'} = $stype; + $sheetdata{'usymb'} = $usymb; + $sheetdata{'cid'} = $ENV{'request.course.id'}; + $sheetdata{'csec'} = &Apache::lonnet::usection + ($udom,$uname,$ENV{'request.course.id'}); + $sheetdata{'cfn'} = $ENV{'request.course.fn'}; + $sheetdata{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + $sheetdata{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + $sheetdata{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; + $sheetdata{'uhome'} = &Apache::lonnet::homeserver($uname,$udom); + my $safeeval=initsheet($stype); - $safeeval->reval( - '$uname="'.$uname. - '";$udom="'.$udom. - '";$uhome="'.&Apache::lonnet::homeserver($uname,$udom). - '";$sheettype="'.$stype. - '";$usymb="'.$usymb. - '";$csec="'.&Apache::lonnet::usection($udom,$uname, - $ENV{'request.course.id'}). - '";$cid="'.$ENV{'request.course.id'}. - '";$cfn="'.$ENV{'request.course.fn'}. - '";$cnum="'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}. - '";$cdom="'.$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}. - '";$chome="'.$ENV{'course.'.$ENV{'request.course.id'}.'.home'}.'";'); - return $safeeval; + my $initstring = ''; + foreach (keys(%sheetdata)) { + $initstring.= qq{\$$_="$sheetdata{$_}";}; + } + $safeeval->reval($initstring); + return $safeeval,\%sheetdata; } # ------------------------------------------------------------ Save spreadsheet @@ -1615,14 +1628,14 @@ this user and course. ################################################## ################################################## sub parmval { - my ($what,$safeeval)=@_; - my $symb = &getusymb($safeeval); + my ($what,$safeeval,$sheetdata)=@_; + my $symb = $sheetdata->{'usymb'}; unless ($symb) { return ''; } # - my $cid = &getcid($safeeval); - my $csec = &getcsec($safeeval); - my $uname = &getuname($safeeval); - my $udom = &getudom($safeeval); + my $cid = $sheetdata->{'cid'}; + my $csec = $sheetdata->{'csec'}; + my $uname = $sheetdata->{'uname'}; + my $udom = $sheetdata->{'udom'}; my $result=''; # my ($mapname,$id,$fn)=split(/\_\_\_/,$symb); @@ -1646,18 +1659,18 @@ sub parmval { if ($uname) { return $useropt{$courselevelr} if ($useropt{$courselevelr}); return $useropt{$courselevelm} if ($useropt{$courselevelm}); - return $useropt{$courselevel} if ($useropt{$courselevel}); + return $useropt{$courselevel} if ($useropt{$courselevel}); } # third, check course if ($csec) { return $courseopt{$seclevelr} if ($courseopt{$seclevelr}); return $courseopt{$seclevelm} if ($courseopt{$seclevelm}); - return $courseopt{$seclevel} if ($courseopt{$seclevel}); + return $courseopt{$seclevel} if ($courseopt{$seclevel}); } # return $courseopt{$courselevelr} if ($courseopt{$courselevelr}); return $courseopt{$courselevelm} if ($courseopt{$courselevelm}); - return $courseopt{$courselevel} if ($courseopt{$courselevel}); + return $courseopt{$courselevel} if ($courseopt{$courselevel}); # second, check map parms my $thisparm = $parmhash{$symbparm}; return $thisparm if ($thisparm); @@ -1810,7 +1823,7 @@ sub updatestudentassesssheet { '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'. $adduserstr.'">Discussion</a>' ); - foreach (keys(%bighash)) { + while (($_,undef) = each(%bighash)) { next if ($_!~/^src\_(\d+)\.(\d+)$/); my $mapid=$1; my $resid=$2; @@ -1894,14 +1907,14 @@ sub updatestudentassesssheet { # ------------------------------------------------ Load data for one assessment sub loadstudent { - my $safeeval=shift; + my ($safeeval,$sheetdata)=@_; my %c=(); my %f=&getformulas($safeeval); - $cachedassess=&getuname($safeeval).':'.&getudom($safeeval); + $cachedassess=$sheetdata->{'uname'}.':'.$sheetdata->{'udom'}; # Get ALL the student preformance data - my @tmp = &Apache::lonnet::dump(&getcid($safeeval), - &getudom($safeeval), - &getuname($safeeval), + my @tmp = &Apache::lonnet::dump($sheetdata->{'cid'}, + $sheetdata->{'udom'}, + $sheetdata->{'uname'}, undef); if ($tmp[0] !~ /^error:/) { %cachedstores = @tmp; @@ -1914,8 +1927,8 @@ sub loadstudent { my $row=$1; next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); my ($usy,$ufn)=split(/__&&&\__/,$f{$_}); - @assessdata=&exportsheet(&getuname($safeeval), - &getudom($safeeval), + @assessdata=&exportsheet($sheetdata->{'uname'}, + $sheetdata->{'udom'}, 'assesscalc',$usy,$ufn); my $index=0; foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', @@ -1943,7 +1956,7 @@ sub loadstudent { # --------------------------------------------------- Load data for one student sub loadcourse { - my ($safeeval,$r)=@_; + my ($safeeval,$sheetdata,$r)=@_; my %c=(); my %f=&getformulas($safeeval); my $total=0; @@ -2005,16 +2018,16 @@ ENDPOP # ------------------------------------------------ Load data for one assessment sub loadassessment { - my $safeeval=shift; + my ($safeeval,$sheetdata)=@_; - my $uhome = &getuhome($safeeval); - my $uname = &getuname($safeeval); - my $udom = &getudom($safeeval); - my $symb = &getusymb($safeeval); - my $cid = &getcid($safeeval); - my $cnum = &getcnum($safeeval); - my $cdom = &getcdom($safeeval); - my $chome = &getchome($safeeval); + my $uhome = $sheetdata->{'uhome'}; + my $uname = $sheetdata->{'uname'}; + my $udom = $sheetdata->{'udom'}; + my $symb = $sheetdata->{'usymb'}; + my $cid = $sheetdata->{'cid'}; + my $cnum = $sheetdata->{'cnum'}; + my $cdom = $sheetdata->{'cdom'}; + my $chome = $sheetdata->{'chome'}; my $namespace; unless ($namespace=$cid) { return ''; } @@ -2070,15 +2083,14 @@ sub loadassessment { unless ($uhome eq 'no_host') { # Get coursedata - unless - ((time-$courserdatas{$cid.'.last_cache'})<240) { - my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum. - ':resourcedata',$chome); - if ($reply!~/^error\:/) { - $courserdatas{$cid}=$reply; - $courserdatas{$cid.'.last_cache'}=time; - } + unless ((time-$courserdatas{$cid.'.last_cache'})<240) { + my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum. + ':resourcedata',$chome); + if ($reply!~/^error\:/) { + $courserdatas{$cid}=$reply; + $courserdatas{$cid.'.last_cache'}=time; } + } foreach (split(/\&/,$courserdatas{$cid})) { my ($name,$value)=split(/\=/,$_); $courseopt{$userprefix.&Apache::lonnet::unescape($name)}= @@ -2122,7 +2134,7 @@ sub loadassessment { next if ($f{$_}=~/^[\!\~\-]/); if ($f{$_}=~/^parameter/) { if ($thisassess{$f{$_}}) { - my $val=&parmval($f{$_},$safeeval); + my $val=&parmval($f{$_},$safeeval,$sheetdata); $c{$_}=$val; $c{$f{$_}}=$val; } @@ -2170,8 +2182,8 @@ sub selectbox { # sub updatesheet { - my $safeeval=shift; - my $stype=&gettype($safeeval); + my ($safeeval,$sheetdata)=@_; + my $stype=$sheetdata->{'sheettype'}; if ($stype eq 'classcalc') { return &updateclasssheet($safeeval); } else { @@ -2185,14 +2197,14 @@ sub updatesheet { # sub loadrows { - my ($safeeval,$r)=@_; - my $stype=&gettype($safeeval); + my ($safeeval,$sheetdata,$r)=@_; + my $stype=$sheetdata->{'sheettype'}; if ($stype eq 'classcalc') { - &loadcourse($safeeval,$r); + &loadcourse($safeeval,$sheetdata,$r); } elsif ($stype eq 'studentcalc') { - &loadstudent($safeeval); + &loadstudent($safeeval,$sheetdata); } else { - &loadassessment($safeeval); + &loadassessment($safeeval,$sheetdata); } } @@ -2280,12 +2292,12 @@ sub exportsheet { # # Not cached # - my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb); - &readsheet($thissheet,$fn); - &updatesheet($thissheet); - &loadrows($thissheet); - &calcsheet($thissheet); - @exportarr=&exportdata($thissheet); + my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb); + &readsheet($thissheet,$sheetdata,$fn); + &updatesheet($thissheet,$sheetdata); + &loadrows($thissheet,$sheetdata); + &calcsheet($thissheet,$sheetdata); + @exportarr=&exportdata($thissheet,$sheetdata); # # Store now # @@ -2299,13 +2311,12 @@ sub exportsheet { &Apache::lonnet::escape($key), $ENV{'course.'.$cid.'.home'}); } else { - $current=&Apache::lonnet::reply('get:'. - &getudom($thissheet).':'. - &getuname($thissheet). + $current=&Apache::lonnet::reply('get:'.$sheetdata->{'udom'}.':'. + $sheetdata->{'uname'}. ':nohist_calculatedsheets_'. $ENV{'request.course.id'}.':'. &Apache::lonnet::escape($key), - &getuhome($thissheet)); + $sheetdata->{'uhome'}); } my %currentlystored=(); unless ($current=~/^error\:/) { @@ -2333,14 +2344,14 @@ sub exportsheet { $ENV{'course.'.$cid.'.home'}); } else { &Apache::lonnet::reply('put:'. - &getudom($thissheet).':'. - &getuname($thissheet). + $sheetdata->{'udom'}.':'. + $sheetdata->{'uname'}. ':nohist_calculatedsheets_'. $ENV{'request.course.id'}.':'. &Apache::lonnet::escape($key).'='. &Apache::lonnet::escape($newstore).'&'. &Apache::lonnet::escape($key).'.time='.$now, - &getuhome($thissheet)); + $sheetdata->{'uhome'}); } } return @exportarr; @@ -2432,39 +2443,45 @@ sub handler { return OK; } # Global directory configs - $includedir=$r->dir_config('lonIncludes'); - $tmpdir=$r->dir_config('lonDaemons').'/tmp/'; + $includedir = $r->dir_config('lonIncludes'); + $tmpdir = $r->dir_config('lonDaemons').'/tmp/'; # Needs to be in a course - if ($ENV{'request.course.fn'}) { - # Get query string for limited number of parameters - &Apache::loncommon::get_unprocessed_cgi - ($ENV{'QUERY_STRING'},['uname','udom','usymb','ufn']); - if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) { - $ENV{'form.ufn'}='default_'.$1; - } - # Interactive loading of specific sheet? - if (($ENV{'form.load'}) && ($ENV{'form.loadthissheet'} ne 'Default')) { - $ENV{'form.ufn'}=$ENV{'form.loadthissheet'}; - } - # Nothing there? Must be login user - my $aname; - my $adom; - - unless ($ENV{'form.uname'}) { - $aname=$ENV{'user.name'}; - $adom=$ENV{'user.domain'}; - } else { - $aname=$ENV{'form.uname'}; - $adom=$ENV{'form.udom'}; - } - # Open page - $r->content_type('text/html'); - $r->header_out('Cache-control','no-cache'); - $r->header_out('Pragma','no-cache'); - $r->send_http_header; - # Screen output - $r->print('<html><head><title>LON-CAPA Spreadsheet</title>'); - $r->print(<<ENDSCRIPT); + if (! $ENV{'request.course.fn'}) { + # Not in a course, or not allowed to modify parms + $ENV{'user.error.msg'}= + $r->uri.":opa:0:0:Cannot modify spreadsheet"; + return HTTP_NOT_ACCEPTABLE; + } + # Get query string for limited number of parameters + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['uname','udom','usymb','ufn']); + if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) { + $ENV{'form.ufn'}='default_'.$1; + } + # Interactive loading of specific sheet? + if (($ENV{'form.load'}) && ($ENV{'form.loadthissheet'} ne 'Default')) { + $ENV{'form.ufn'}=$ENV{'form.loadthissheet'}; + } + # + # Determine the user name and domain for the sheet. + my $aname; + my $adom; + unless ($ENV{'form.uname'}) { + $aname=$ENV{'user.name'}; + $adom=$ENV{'user.domain'}; + } else { + $aname=$ENV{'form.uname'}; + $adom=$ENV{'form.udom'}; + } + # + # Open page + $r->content_type('text/html'); + $r->header_out('Cache-control','no-cache'); + $r->header_out('Pragma','no-cache'); + $r->send_http_header; + # Screen output + $r->print('<html><head><title>LON-CAPA Spreadsheet</title>'); + $r->print(<<ENDSCRIPT); <script language="JavaScript"> function celledit(cn,cf) { @@ -2490,216 +2507,202 @@ sub handler { </script> ENDSCRIPT - $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet'). - '<form action="'.$r->uri.'" name=sheet method=post>'. - &hiddenfield('uname',$ENV{'form.uname'}). - &hiddenfield('udom',$ENV{'form.udom'}). - &hiddenfield('usymb',$ENV{'form.usymb'}). - &hiddenfield('unewfield',''). - &hiddenfield('unewformula','')); - # Send this out right away - $r->rflush(); - # Full recalc? - if ($ENV{'form.forcerecalc'}) { - $r->print('<h4>Completely Recalculating Sheet ...</h4>'); - undef %spreadsheets; - undef %courserdatas; - undef %userrdatas; - undef %defaultsheets; - undef %updatedata; - } - # Read new sheet or modified worksheet - $r->uri=~/\/(\w+)$/; - my $asheet=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); - # If a new formula had been entered, go from work copy - if ($ENV{'form.unewfield'}) { - $r->print('<h2>Modified Workcopy</h2>'); - $ENV{'form.unewformula'}=~s/\'/\"/g; - $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. - $ENV{'form.unewformula'}.'<p>'); - &setfilename($asheet,$ENV{'form.ufn'}); - &tmpread($asheet, - $ENV{'form.unewfield'},$ENV{'form.unewformula'}); - - } elsif ($ENV{'form.saveas'}) { - &setfilename($asheet,$ENV{'form.ufn'}); - &tmpread($asheet); + $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet'). + '<form action="'.$r->uri.'" name=sheet method=post>'); + $r->print(&hiddenfield('uname',$ENV{'form.uname'}). + &hiddenfield('udom',$ENV{'form.udom'}). + &hiddenfield('usymb',$ENV{'form.usymb'}). + &hiddenfield('unewfield',''). + &hiddenfield('unewformula','')); + $r->rflush(); + # + # Full recalc? + if ($ENV{'form.forcerecalc'}) { + $r->print('<h4>Completely Recalculating Sheet ...</h4>'); + undef %spreadsheets; + undef %courserdatas; + undef %userrdatas; + undef %defaultsheets; + undef %updatedata; + } + # Read new sheet or modified worksheet + $r->uri=~/\/(\w+)$/; + my ($asheet,$asheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); + # + # If a new formula had been entered, go from work copy + if ($ENV{'form.unewfield'}) { + $r->print('<h2>Modified Workcopy</h2>'); + $ENV{'form.unewformula'}=~s/\'/\"/g; + $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='. + $ENV{'form.unewformula'}.'<p>'); + &setfilename($asheet,$ENV{'form.ufn'}); + &tmpread($asheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); + } elsif ($ENV{'form.saveas'}) { + &setfilename($asheet,$ENV{'form.ufn'}); + &tmpread($asheet); + } else { + &readsheet($asheet,$asheetdata,$ENV{'form.ufn'}); + } + # Print out user information + unless ($asheetdata->{'sheettype'} eq 'classcalc') { + $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}. + '<br><b>Domain:</b> '.$asheetdata->{'udom'}); + if (&getcsec($asheet) eq '-1') { + $r->print('<h3><font color=red>'. + 'Not a student in this course</font></h3>'); } else { - &readsheet($asheet,$ENV{'form.ufn'}); + $r->print('<br><b>Section/Group:</b> '.$asheetdata->{'csec'}); } - # Print out user information - unless (&gettype($asheet) eq 'classcalc') { - $r->print('<p><b>User:</b> '.&getuname($asheet). - '<br><b>Domain:</b> '.&getudom($asheet)); - if (&getcsec($asheet) eq '-1') { - $r->print('<h3><font color=red>'. - 'Not a student in this course</font></h3>'); - } else { - $r->print('<br><b>Section/Group:</b> '.&getcsec($asheet)); + if ($ENV{'form.usymb'}) { + $r->print('<br><b>Assessment:</b> <tt>'. + $ENV{'form.usymb'}.'</tt>'); + } + } + # + # Check user permissions + if (($asheetdata->{'sheettype'} eq 'classcalc' ) || + ($asheetdata->{'uname'} ne $ENV{'user.name'} ) || + ($asheetdata->{'udom'} ne $ENV{'user.domain'})) { + unless (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'})) { + $r->print('<h1>Access Permission Denied</h1>'. + '</form></body></html>'); + return OK; + } + } + # Additional options + $r->print('<br />'. + '<input type="submit" name="forcerecalc" '. + 'value="Completely Recalculate Sheet"><p>'); + if ($asheetdata->{'sheettype'} eq 'assesscalc') { + $r->print('<p><font size=+2>'. + '<a href="/adm/studentcalc?'. + 'uname='.$asheetdata->{'uname'}. + '&udom='.$asheetdata->{'udom'}.'">'. + 'Level up: Student Sheet</a></font><p>'); + } + if (($asheetdata->{'sheettype'} eq 'studentcalc') && + (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'}))) { + $r->print ('<p><font size=+2><a href="/adm/classcalc">'. + 'Level up: Course Sheet</a></font><p>'); + } + # Save dialog + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my $fname=$ENV{'form.ufn'}; + $fname=~s/\_[^\_]+$//; + if ($fname eq 'default') { $fname='course_default'; } + $r->print('<input type=submit name=saveas value="Save as ...">'. + '<input type=text size=20 name=newfn value="'.$fname.'">'. + 'make default: <input type=checkbox name="makedefufn"><p>'); + } + $r->print(&hiddenfield('ufn',&getfilename($asheet))); + # Load dialog + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + $r->print('<p><input type=submit name=load value="Load ...">'. + '<select name="loadthissheet">'. + '<option name="default">Default</option>'); + foreach (&othersheets($asheet,$asheetdata->{'sheettype'})) { + $r->print('<option name="'.$_.'"'); + if ($ENV{'form.ufn'} eq $_) { + $r->print(' selected'); } - if ($ENV{'form.usymb'}) { - $r->print('<br><b>Assessment:</b> <tt>'. - $ENV{'form.usymb'}.'</tt>'); - } - } - # See if user can see this - if ((&gettype($asheet) eq 'classcalc') || - (&getuname($asheet) ne $ENV{'user.name'}) || - (&getudom($asheet) ne $ENV{'user.domain'})) { - unless (&Apache::lonnet::allowed('vgr',&getcid($asheet))) { - $r->print('<h1>Access Permission Denied</h1>'. - '</form></body></html>'); - return OK; - } - } - # Additional options - $r->print( - '<input type=submit name=forcerecalc value="Completely Recalculate Sheet"><p>' - ); - if (&gettype($asheet) eq 'assesscalc') { - $r->print ('<p><font size=+2><a href="/adm/studentcalc?uname='. - &getuname($asheet).'&udom='.&getudom($asheet).'">'. - 'Level up: Student Sheet</a></font><p>'); - } - if ((&gettype($asheet) eq 'studentcalc') && - (&Apache::lonnet::allowed('vgr',&getcid($asheet)))) { - $r->print ( - '<p><font size=+2><a href="/adm/classcalc">'. - 'Level up: Course Sheet</a></font><p>'); - } - # Save dialog - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { - my $fname=$ENV{'form.ufn'}; - $fname=~s/\_[^\_]+$//; - if ($fname eq 'default') { $fname='course_default'; } - $r->print - ('<input type=submit name=saveas value="Save as ...">'. - '<input type=text size=20 name=newfn value="'.$fname.'">'. - '(make default: <input type=checkbox name="makedefufn">)<p>'); - } - $r->print(&hiddenfield('ufn',&getfilename($asheet))); - # Load dialog - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { - $r->print('<p><input type=submit name=load value="Load ...">'. - '<select name="loadthissheet">'. - '<option name="default">Default</option>'); - foreach (&othersheets($asheet,&gettype($asheet))) { - $r->print('<option name="'.$_.'"'); - if ($ENV{'form.ufn'} eq $_) { - $r->print(' selected'); - } - $r->print('>'.$_.'</option>'); - } - $r->print('</select><p>'); - if (&gettype($asheet) eq 'studentcalc') { - &setothersheets($asheet,&othersheets($asheet,'assesscalc')); - } - } - # Cached sheets - &expirationdates(); - undef %oldsheets; - undef %loadedcaches; - if (&gettype($asheet) eq 'classcalc') { - $r->print - ("Loading previously calculated student sheets ...<br>\n"); - $r->rflush(); - &cachedcsheets(); - } elsif (&gettype($asheet) eq 'studentcalc') { - $r->print - ("Loading previously calculated assessment sheets ...<br>\n"); - $r->rflush(); - &cachedssheets(&getuname($asheet),&getudom($asheet), - &getuhome($asheet)); + $r->print('>'.$_.'</option>'); + } + $r->print('</select><p>'); + if (&gettype($asheet) eq 'studentcalc') { + &setothersheets($asheet,&othersheets($asheet,'assesscalc')); } - # Update sheet, load rows - $r->print("Loaded sheet(s), updating rows ...<br>\n"); - $r->rflush(); - # - &updatesheet($asheet); - $r->print("Updated rows, loading row data ...<br>\n"); + } + # Cached sheets + &expirationdates(); + undef %oldsheets; + undef %loadedcaches; + if ($asheetdata->{'sheettype'} eq 'classcalc') { + $r->print("Loading previously calculated student sheets ...\n"); $r->rflush(); - # - &loadrows($asheet,$r); - $r->print("Loaded row data, calculating sheet ...<br>\n"); + &cachedcsheets(); + } elsif ($asheetdata->{'sheettype'} eq 'studentcalc') { + $r->print("Loading previously calculated assessment sheets ...\n"); $r->rflush(); - # - my $calcoutput=&calcsheet($asheet); - $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>'); - # See if something to save - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { - my $fname=''; - if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { - $fname=~s/\W/\_/g; - if ($fname eq 'default') { $fname='course_default'; } - $fname.='_'.&gettype($asheet); - &setfilename($asheet,$fname); - $ENV{'form.ufn'}=$fname; - $r->print('<p>Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).'<p>'); - } + &cachedssheets($asheetdata->{'uname'},$asheetdata->{'udom'}, + $asheetdata->{'uhome'}); + } + # Update sheet, load rows + $r->print("Loaded sheet(s), updating rows ...<br>\n"); + $r->rflush(); + # + &updatesheet($asheet,$asheetdata); + $r->print("Updated rows, loading row data ...\n"); + $r->rflush(); + # + &loadrows($asheet,$asheetdata,$r); + $r->print("Loaded row data, calculating sheet ...<br>\n"); + $r->rflush(); + # + my $calcoutput=&calcsheet($asheet); + $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>'); + # See if something to save + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + my $fname=''; + if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) { + $fname=~s/\W/\_/g; + if ($fname eq 'default') { $fname='course_default'; } + $fname.='_'.$asheetdata->{'sheettype'}; + &setfilename($asheet,$fname); + $ENV{'form.ufn'}=$fname; + $r->print('<p>Saving spreadsheet: '. + &writesheet($asheet,$ENV{'form.makedefufn'}).'<p>'); } - #Write the modified worksheet - - $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); - - &tmpwrite($asheet); - - if (&gettype($asheet) eq 'studentcalc') { - $r->print('<br>Show rows with empty A column: '); + } + # + #Write the modified worksheet + $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>'); + &tmpwrite($asheet); + if ($asheetdata->{'sheettype'} eq 'studentcalc') { + $r->print('<br>Show rows with empty A column: '); } else { $r->print('<br>Show empty rows: '); } - + # $r->print(&hiddenfield('userselhidden','true'). - '<input type=checkbox name=showall onClick="submit()"'); - + '<input type="checkbox" name="showall" onClick="submit()"'); + # if ($ENV{'form.showall'}) { - $r->print(' checked'); + $r->print(' checked'); } else { - unless ($ENV{'form.userselhidden'}) { - unless - ($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') { - $r->print(' checked'); - $ENV{'form.showall'}=1; - } - } + unless ($ENV{'form.userselhidden'}) { + unless + ($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') { + $r->print(' checked'); + $ENV{'form.showall'}=1; + } + } } $r->print('>'); - - if (&gettype($asheet) eq 'classcalc') { - $r->print( - ' Output CSV format: <input type=checkbox name=showcsv onClick="submit()"'); - if ($ENV{'form.showcsv'}) { $r->print(' checked'); } - $r->print('>'); + # + # CSV format checkbox (classcalc sheets only) + if ($asheetdata->{'sheettype'} eq 'classcalc') { + $r->print(' Output CSV format: <input type="checkbox" '. + 'name="showcsv" onClick="submit()"'); + if ($ENV{'form.showcsv'}) { $r->print(' checked'); } + $r->print('>'); } - -# ------------------------------------------------------------------ Insertrows + # + # Buttons to insert rows $r->print(' Student Status: '. &Apache::lonhtmlcommon::StatusOptions ($ENV{'form.Status'},'sheet')); - - $r->print(<<ENDINSERTBUTTONS); + $r->print(<<ENDINSERTBUTTONS); <br> <input type='button' onClick='insertrow("top");' value='Insert Row Top'> <input type='button' onClick='insertrow("bottom");' value='Insert Row Bottom'><br> ENDINSERTBUTTONS - -# ------------------------------------------------------------- Print out sheet - - &outsheet($r,$asheet); + # Print out sheet + &outsheet($r,$asheet,$asheetdata); $r->print('</form></body></html>'); - -# ------------------------------------------------------------------------ Done - } else { -# ----------------------------- Not in a course, or not allowed to modify parms - $ENV{'user.error.msg'}= - $r->uri.":opa:0:0:Cannot modify spreadsheet"; - return HTTP_NOT_ACCEPTABLE; - } + # Done return OK; - } 1;