--- loncom/interface/Attic/lonspreadsheet.pm 2002/08/30 19:47:47 1.104 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/18 13:46:01 1.118 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.104 2002/08/30 19:47:47 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.118 2002/10/18 13:46:01 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,16 +26,6 @@ # The LearningOnline Network with CAPA # Spreadsheet/Grades Display Handler # -# 11/11,11/15,11/27,12/04,12/05,12/06,12/07, -# 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30, -# 01/01/01,02/01,03/01,19/01,20/01,22/01, -# 03/05,03/08,03/10,03/12,03/13,03/15,03/17, -# 03/19,03/20,03/21,03/27,04/05,04/09, -# 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17, -# 10/16,10/17,10/20,11/05,11/28,12/27 Gerd Kortemeyer -# 01/14/02 Matthew -# 02/04/02 Matthew - # POD required stuff: =head1 NAME @@ -54,7 +44,6 @@ not the grades of their peers. The spre offering the ability to use Perl code to manipulate data, as well as many built-in functions. - =head2 Functions available to user of lonspreadsheet =over 4 @@ -72,6 +61,12 @@ use Apache::Constants qw(:common :http); use GDBM_File; use HTML::TokeParser; use Apache::lonhtmlcommon; +use Apache::loncoursedata; +# +# Caches for coursewide information +# +my %Section; + # # Caches for previously calculated spreadsheets # @@ -122,60 +117,9 @@ my $tmpdir; # ============================================================================= # ===================================== Implements an instance of a spreadsheet -sub initsheet { - my $safeeval = new Safe(shift); - my $safehole = new Safe::Hole; - $safeeval->permit("entereval"); - $safeeval->permit(":base_math"); - $safeeval->permit("sort"); - $safeeval->deny(":base_io"); - $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); - $safeeval->share('$@'); - my $code=<<'ENDDEFS'; -# ---------------------------------------------------- Inside of the safe space - -# -# f: formulas -# t: intermediate format (variable references expanded) -# v: output values -# c: preloaded constants (A-column) -# rl: row label -# os: other spreadsheets (for student spreadsheet only) - -undef %sheet_values; -undef %t; -undef %f; -undef %c; -undef %rowlabel; -undef @os; - -$maxrow = 0; -$sheettype = ''; - -# filename/reference of the sheet -$filename = ''; - -# user data -$uname = ''; -$uhome = ''; -$udom = ''; - -# course data - -$csec = ''; -$chome= ''; -$cnum = ''; -$cdom = ''; -$cid = ''; -$cfn = ''; - -# symb - -$usymb = ''; - -# error messages -$errormsg = ''; - +## +## mask - used to reside in the safe space. +## sub mask { my ($lower,$upper)=@_; @@ -199,7 +143,6 @@ sub mask { $alpha='['.$la.'-Za-'.$ua.']'; } } - if (($ld eq '*') || ($ud eq '*')) { $num='\d+'; } else { @@ -219,7 +162,9 @@ sub mask { } else { my @lda=($ld=~m/\d/g); my @uda=($ud=~m/\d/g); - my $i; $j=0; $notdone=1; + my $i; + my $j=0; + my $notdone=1; for ($i=0;($i<=$#lda)&&($notdone);$i++) { if ($lda[$i]==$uda[$i]) { $num.=$lda[$i]; @@ -252,6 +197,65 @@ sub mask { return '^'.$alpha.$num."\$"; } + + +sub initsheet { + my $safeeval = new Safe(shift); + my $safehole = new Safe::Hole; + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->permit("sort"); + $safeeval->deny(":base_io"); + $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); + $safehole->wrap(\&Apache::lonspreadsheet::mask,$safeeval,'&mask'); + $safehole->wrap(\&Apache::lonspreadsheet::templaterow,$safeeval,'&templaterow'); + $safeeval->share('$@'); + my $code=<<'ENDDEFS'; +# ---------------------------------------------------- Inside of the safe space + +# +# f: formulas +# t: intermediate format (variable references expanded) +# v: output values +# c: preloaded constants (A-column) +# rl: row label +# os: other spreadsheets (for student spreadsheet only) + +undef %sheet_values; +undef %t; +undef %f; +undef %c; +undef %rowlabel; +undef @os; + +$maxrow = 0; +$sheettype = ''; + +# filename/reference of the sheet +$filename = ''; + +# user data +$uname = ''; +$uhome = ''; +$udom = ''; + +# course data + +$csec = ''; +$chome= ''; +$cnum = ''; +$cdom = ''; +$cid = ''; +$coursefilename = ''; + +# symb + +$usymb = ''; + +# error messages +$errormsg = ''; + + #------------------------------------------------------- =item UWCALC(hashname,modules,units,date) @@ -863,7 +867,7 @@ sub sett { } # Deal with the normal cells foreach (keys(%f)) { - if (($f{$_}) && ($_!~/template\_/)) { + if (exists($f{$_}) && ($_!~/template\_/)) { my $matches=($_=~/^$pattern(\d+)/); if (($matches) && ($1)) { unless ($f{$_}=~/^\!/) { @@ -924,20 +928,6 @@ sub calc { return ''; } -sub templaterow { - my @cols=(); - $cols[0]='Template'; - 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') { - my $fm=$f{'template_'.$_}; - $fm=~s/[\'\"]/\&\#34;/g; - push(@cols,"'template_$_','$fm'".'___eq___'.$fm); - } - return @cols; -} - # # This is actually used for the student spreadsheet, not the assessment sheet # Do not be fooled by the name! @@ -1005,175 +995,71 @@ sub exportrowa { return @exportarray; } +sub templaterow { + my @cols=(); + $cols[0]='Template'; + 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') { + my $fm=$f{'template_'.$_}; + $fm=~s/[\'\"]/\&\#34;/g; + push(@cols,"'template_$_','$fm'".'___eq___'.$fm); + } + return @cols; +} + + # ------------------------------------------- End of "Inside of the safe space" ENDDEFS $safeeval->reval($code); return $safeeval; } -# ------------------------------------------------ Add or change formula values +# ------------------------------------------------ Add or change formula values sub setformulas { my ($safeeval,%f)=@_; %{$safeeval->varglob('f')}=%f; } # ------------------------------------------------ Add or change formula values - sub setconstants { my ($safeeval,%c)=@_; %{$safeeval->varglob('c')}=%c; } # --------------------------------------------- Set names of other spreadsheets - sub setothersheets { my ($safeeval,@os)=@_; @{$safeeval->varglob('os')}=@os; } # ------------------------------------------------ Add or change formula values - sub setrowlabels { my ($safeeval,%rowlabel)=@_; %{$safeeval->varglob('rowlabel')}=%rowlabel; } # ------------------------------------------------------- Calculate spreadsheet - sub calcsheet { my $safeeval=shift; return $safeeval->reval('&calc();'); } -# ------------------------------------------------------------------ Get values - -sub getvalues { - my $safeeval=shift; - return $safeeval->reval('%sheet_values'); -} - # ---------------------------------------------------------------- Get formulas - sub getformulas { my $safeeval=shift; return %{$safeeval->varglob('f')}; } # ----------------------------------------------------- Get value of $f{'A'.$n} - sub getfa { my ($safeeval,$n)=@_; return $safeeval->reval('$f{"A'.$n.'"}'); } -# -------------------------------------------------------------------- Get type - -sub gettype { - my $safeeval=shift; - return $safeeval->reval('$sheettype'); -} - -# ------------------------------------------------------------------ Set maxrow - -sub setmaxrow { - my ($safeeval,$row)=@_; - $safeeval->reval('$maxrow='.$row.';'); -} - -# ------------------------------------------------------------------ Get maxrow - -sub getmaxrow { - my $safeeval=shift; - return $safeeval->reval('$maxrow'); -} - -# ---------------------------------------------------------------- Set filename - -sub setfilename { - my ($safeeval,$fn)=@_; - $safeeval->reval('$filename="'.$fn.'";'); -} - -# ---------------------------------------------------------------- Get filename - -sub getfilename { - my $safeeval=shift; - return $safeeval->reval('$filename'); -} - -# --------------------------------------------------------------- Get course ID - -sub getcid { - my $safeeval=shift; - return $safeeval->reval('$cid'); -} - -# --------------------------------------------------------- Get course filename - -sub getcfn { - my $safeeval=shift; - return $safeeval->reval('$cfn'); -} - -# ----------------------------------------------------------- Get course number - -sub getcnum { - my $safeeval=shift; - return $safeeval->reval('$cnum'); -} - -# ------------------------------------------------------------- Get course home - -sub getchome { - my $safeeval=shift; - return $safeeval->reval('$chome'); -} - -# ----------------------------------------------------------- Get course domain - -sub getcdom { - my $safeeval=shift; - return $safeeval->reval('$cdom'); -} - -# ---------------------------------------------------------- Get course section - -sub getcsec { - my $safeeval=shift; - return $safeeval->reval('$csec'); -} - -# --------------------------------------------------------------- Get user name - -sub getuname { - my $safeeval=shift; - return $safeeval->reval('$uname'); -} - -# ------------------------------------------------------------- Get user domain - -sub getudom { - my $safeeval=shift; - return $safeeval->reval('$udom'); -} - -# --------------------------------------------------------------- Get user home - -sub getuhome { - my $safeeval=shift; - return $safeeval->reval('$uhome'); -} - -# -------------------------------------------------------------------- Get symb - -sub getusymb { - my $safeeval=shift; - return $safeeval->reval('$usymb'); -} - # ------------------------------------------------------------- Export of A-row - sub exportdata { my $safeeval=shift; return $safeeval->reval('&exportrowa()'); @@ -1189,24 +1075,24 @@ sub exportdata { # --------------------------------------------- Produce output row n from sheet sub rown { - my ($safeeval,$n)=@_; + my ($safeeval,$n,$sheetdata)=@_; my $defaultbg; 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$n"; + $rowdata.="\n$n"; } else { - $rowdata.="\n".'"'.$n.'"'; + $rowdata.="\n".'"'.$n.'"'; } my $showf=0; my $proc; my $maxred=1; - my $sheettype=&gettype($safeeval); + my $sheettype=$sheetdata->{'sheettype'}; if ($sheettype eq 'studentcalc') { $proc='&outrowassess'; $maxred=26; @@ -1225,108 +1111,121 @@ 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='#'; - } - $rowdata.= - ''.$vl. - ''; - } else { - $rowdata.=' '.$vl.' '; - } - } 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='#'; + } + $rowdata.=''; + if ($ENV{'request.role'} =~ /^st\./) { + $rowdata.=$vl; + } else { + $rowdata.=''. + $vl.''; + } + $rowdata.=''; + } else { + $rowdata.=' '.$vl.' '; + } + } else { + $rowdata.=',"'.$vl.'"'; + } + $showf++; } # End of foreach($safeval...) if ($ENV{'form.showall'} || ($dataflag)) { - return $rowdata.($ENV{'form.showcsv'}?'':''); + return $rowdata.($ENV{'form.showcsv'}?'':''); } 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= - ''. + if ($ENV{'form.showcsv'}) { + $tabledata='
';
+    } else { 
+        $tabledata='
'. - $realm.'
'. ''. - ''; - 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.='"; - } - $tabledata.=''.&rown($safeeval,'-').&rown($safeeval,0); - } else { $tabledata='
'; }
-
+        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.='
"; + } + $tabledata.=''.&rown($safeeval,'-',$sheetdata). + &rown($safeeval,0,$sheetdata); + } $r->print($tabledata); - + # + # Prepare to output rows my $row; - my $maxrow=&getmaxrow($safeeval); - + my $maxrow=$sheetdata->{'maxrow'}; + # 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'; - } - + @sortidx=sort { lc($sortby[$a]) cmp lc($sortby[$b]); } @sortidx; + # + # 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); + my $thisrow=&rown($safeeval,$sortidx[$row]+1,$sheetdata); if ($thisrow) { if (($n/25==int($n/25)) && (!$ENV{'form.showcsv'})) { $r->print("
'. + ''.$realm.'ImportCalculations
'; - } else { - $tabledata.=''; - } - $tabledata.="$_
'; + } else { + $tabledata.=''; + } + $tabledata.="$_
\n
\n"); $r->rflush(); $r->print(''); - $r->print('\n"); } $n++; @@ -1340,11 +1239,11 @@ sub outsheet { # ----------------------------------------------- Read list of available sheets # sub othersheets { - my ($safeeval,$stype)=@_; + my ($safeeval,$stype,$sheetdata)=@_; # - my $cnum = &getcnum($safeeval); - my $cdom = &getcdom($safeeval); - my $chome = &getchome($safeeval); + my $cnum = $sheetdata->{'cnum'}; + my $cdom = $sheetdata->{'cdom'}; + my $chome = $sheetdata->{'chome'}; # my @alternatives=(); my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum); @@ -1387,14 +1286,14 @@ sub parse_sheet { # # -------------------------------------- Read spreadsheet formulas for a course # - 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}) { @@ -1414,7 +1313,7 @@ sub readsheet { } } # $fn now has a value - &setfilename($safeeval,$fn); + $sheetdata->{'filename'} = $fn; # see if sheet is cached my $fstring=''; if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { @@ -1458,38 +1357,43 @@ sub readsheet { } # -------------------------------------------------------- Make new spreadsheet - 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'} = $Section{$uname.':'.$udom}; + $sheetdata{'coursefilename'} = $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; + # + # Place all the %sheetdata items into the safe space + my $initstring = ''; + foreach (keys(%sheetdata)) { + $initstring.= qq{\$$_="$sheetdata{$_}";}; + } + $safeeval->reval($initstring); + return $safeeval,\%sheetdata; } # ------------------------------------------------------------ Save spreadsheet - sub writesheet { - my ($safeeval,$makedef)=@_; - my $cid=&getcid($safeeval); + my ($safeeval,$makedef,$sheetdata)=@_; + my $cid=$sheetdata->{'cid'}; if (&Apache::lonnet::allowed('opa',$cid)) { my %f=&getformulas($safeeval); - my $stype=&gettype($safeeval); - my $cnum=&getcnum($safeeval); - my $cdom=&getcdom($safeeval); - my $chome=&getchome($safeeval); - my $fn=&getfilename($safeeval); + my $stype= $sheetdata->{'sheettype'}; + my $cnum = $sheetdata->{'cnum'}; + my $cdom = $sheetdata->{'cdom'}; + my $chome= $sheetdata->{'chome'}; + my $fn = $sheetdata->{'filename'}; # Cache new sheet $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); # Write sheet @@ -1531,12 +1435,11 @@ sub writesheet { # ----------------------------------------------- Make a temp copy of the sheet # "Modified workcopy" - interactive only # - sub tmpwrite { - my $safeeval=shift; + my ($safeeval,$sheetdata) = @_; my $fn=$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. - &getfilename($safeeval); + $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'. + $sheetdata->{'filename'}; $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -1546,12 +1449,11 @@ sub tmpwrite { } # ---------------------------------------------------------- Read the temp copy - sub tmpread { - my ($safeeval,$nfield,$nform)=@_; + my ($safeeval,$sheetdata,$nfield,$nform)=@_; my $fn=$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'. - &getfilename($safeeval); + $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'. + $sheetdata->{'filename'}; $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -1615,14 +1517,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); @@ -1643,96 +1545,63 @@ sub parmval { my $courselevelr = $usercourseprefix.'.'.$symbparm; my $courselevelm = $usercourseprefix.'.'.$mapparm; # fourth, check user - if ($uname) { - return $useropt{$courselevelr} if ($useropt{$courselevelr}); - return $useropt{$courselevelm} if ($useropt{$courselevelm}); - return $useropt{$courselevel} if ($useropt{$courselevel}); + if (defined($uname)) { + return $useropt{$courselevelr} if (defined($useropt{$courselevelr})); + return $useropt{$courselevelm} if (defined($useropt{$courselevelm})); + return $useropt{$courselevel} if (defined($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}); + if (defined($csec)) { + return $courseopt{$seclevelr} if (defined($courseopt{$seclevelr})); + return $courseopt{$seclevelm} if (defined($courseopt{$seclevelm})); + return $courseopt{$seclevel} if (defined($courseopt{$seclevel})); } # - return $courseopt{$courselevelr} if ($courseopt{$courselevelr}); - return $courseopt{$courselevelm} if ($courseopt{$courselevelm}); - return $courseopt{$courselevel} if ($courseopt{$courselevel}); + return $courseopt{$courselevelr} if (defined($courseopt{$courselevelr})); + return $courseopt{$courselevelm} if (defined($courseopt{$courselevelm})); + return $courseopt{$courselevel} if (defined($courseopt{$courselevel})); # second, check map parms my $thisparm = $parmhash{$symbparm}; - return $thisparm if ($thisparm); + return $thisparm if (defined($thisparm)); # first, check default return &Apache::lonnet::metadata($fn,$rwhat.'.default'); } # ---------------------------------------------- Update rows for course listing sub updateclasssheet { - my $safeeval=shift; - my $cnum=&getcnum($safeeval); - my $cdom=&getcdom($safeeval); - my $cid=&getcid($safeeval); - my $chome=&getchome($safeeval); + my ($safeeval,$sheetdata) = @_; + my $cnum =$sheetdata->{'cnum'}; + my $cdom =$sheetdata->{'cdom'}; + my $cid =$sheetdata->{'cid'}; + my $chome =$sheetdata->{'chome'}; + # + %Section = (); + # # Read class list and row labels - my %classlist; - my @tmp = &Apache::lonnet::dump('classlist',$cdom,$cnum); - if ($tmp[0] !~ /^error/) { - %classlist = @tmp; - } else { - return 'Could not access course data'; - } - undef @tmp; + my $classlist = &Apache::loncoursedata::get_classlist(); + if (! defined($classlist)) { + return 'Could not access course classlist'; + } # my %currentlist=(); - my $now=time; - foreach my $student (keys(%classlist)) { - my ($end,$start)=split(/\:/,$classlist{$student}); - my $active=1; - $active = 0 if (($end) && ($now>$end)); - $active = 1 if ($ENV{'form.Status'} eq 'Any'); - $active = !$active if ($ENV{'form.Status'} eq 'Expired'); - if ($active) { + foreach my $student (keys(%$classlist)) { + my ($studentDomain,$studentName,$end,$start,$id,$studentSection, + $fullname,$status) = @{$classlist->{$student}}; + if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') { my $rowlabel=''; - my ($studentName,$studentDomain)=split(/\:/,$student); - my $studentSection=&Apache::lonnet::usection($studentDomain, - $studentName,$cid); - if ($studentSection==-1) { - unless ($ENV{'form.showcsv'}) { - $rowlabel='Data not available: '. - $studentName.''; - } else { - $rowlabel='ERROR","'.$studentName. - '","Data not available","","","'; - } + if ($ENV{'form.showcsv'}) { + $rowlabel= '"'.join('","',($studentName,$studentDomain, + $fullname,$studentSection,$id).'"'); } else { - my %reply=&Apache::lonnet::idrget($studentDomain,$studentName); - my %studentInformation=&Apache::lonnet::get - ('environment', - ['lastname','generation','firstname','middlename','id'], - $studentDomain,$studentName); - if (! $ENV{'form.showcsv'}) { - $rowlabel=''. - $studentSection.' '; - foreach ('id','firstname','middlename', - 'lastname','generation'){ - $rowlabel.=$studentInformation{$_}." "; - } - $rowlabel.=''; - } else { - $rowlabel= '"'.join('","', - ($studentSection, - $studentInformation{'id'}, - $studentInformation{'firstname'}, - $studentInformation{'middlename'}, - $studentInformation{'lastname'}, - $studentInformation{'generation'}) - ).'"'; - } + $rowlabel=''; + $rowlabel.=$studentSection.' '.$id." ".$fullname; + $rowlabel.=''; } $currentlist{$student}=$rowlabel; - } # end of if ($active) - } # end of foreach my $student (keys(%classlist)) + } + } # # Find discrepancies between the course row table and this # @@ -1765,19 +1634,23 @@ sub updateclasssheet { } if ($changed) { &setformulas($safeeval,%f); } # - &setmaxrow($safeeval,$maxrow); + $sheetdata->{'maxrow'} = $maxrow; &setrowlabels($safeeval,%currentlist); } # ----------------------------------- Update rows for student and assess sheets sub updatestudentassesssheet { - my $safeeval=shift; + my ($safeeval,$sheetdata) = @_; my %bighash; - my $stype=&gettype($safeeval); + my $stype=$sheetdata->{'sheettype'}; + my $uname=$sheetdata->{'uname'}; + my $udom =$sheetdata->{'udom'}; my %current=(); - if ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) { + if ($updatedata + {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) { %current=split(/\_\_\_\;\_\_\_/, - $updatedata{$ENV{'request.course.fn'}.'_'.$stype}); + $updatedata{$ENV{'request.course.fn'}. + '_'.$stype.'_'.$uname.'_'.$udom}); } else { # Tie hash tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', @@ -1795,10 +1668,8 @@ sub updatestudentassesssheet { 'totalpoints' => 'Total Points Granted
totalpoints'); my $adduserstr=''; - if ((&getuname($safeeval) ne $ENV{'user.name'}) || - (&getudom($safeeval) ne $ENV{'user.domain'})) { - $adduserstr='&uname='.&getuname($safeeval). - '&udom='.&getudom($safeeval); + if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){ + $adduserstr='&uname='.$uname.'&udom='.$udom; } my %allassess = ('_feedback' =>'Discussion' ); - foreach (keys(%bighash)) { + while (($_,undef) = each(%bighash)) { next if ($_!~/^src\_(\d+)\.(\d+)$/); my $mapid=$1; my $resid=$2; @@ -1849,7 +1720,7 @@ sub updatestudentassesssheet { } elsif ($stype eq 'studentcalc') { %current=%allassess; } - $updatedata{$ENV{'request.course.fn'}.'_'.$stype}= + $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}= join('___;___',%current); # Get current from cache } @@ -1884,7 +1755,7 @@ sub updatestudentassesssheet { } } if ($changed) { &setformulas($safeeval,%f); } - &setmaxrow($safeeval,$maxrow); + $sheetdata->{'maxrow'} = $maxrow; &setrowlabels($safeeval,%current); # undef %current; @@ -1894,14 +1765,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 +1785,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', @@ -1941,9 +1812,9 @@ 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; @@ -2003,18 +1874,18 @@ 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 ''; } @@ -2035,30 +1906,23 @@ sub loadassessment { # # restore individual # - my $answer=&Apache::lonnet::reply( - "restore:$udom:$uname:". - &Apache::lonnet::escape($namespace).":". - &Apache::lonnet::escape($symb),$uhome); - foreach (split(/\&/,$answer)) { - my ($name,$value)=split(/\=/,$_); - $returnhash{&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); - } - my $version; - for ($version=1;$version<=$returnhash{'version'};$version++) { + %returnhash = &Apache::lonnet::restore($symb,$namespace,$udom,$uname); + for (my $version=1;$version<=$returnhash{'version'};$version++) { foreach (split(/\:/,$returnhash{$version.':keys'})) { $returnhash{$_}=$returnhash{$version.':'.$_}; } } } + # # returnhash now has all stores for this resource # convert all "_" to "." to be able to use libraries, multiparts, etc + # + # This is dumb. It is also necessary :( my @oldkeys=keys %returnhash; - - foreach (@oldkeys) { - my $name=$_; - my $value=$returnhash{$_}; - delete $returnhash{$_}; + # + foreach my $name (@oldkeys) { + my $value=$returnhash{$name}; + delete $returnhash{$name}; $name=~s/\_/\./g; $returnhash{$name}=$value; } @@ -2067,37 +1931,28 @@ sub loadassessment { undef %useropt; my $userprefix=$uname.'_'.$udom.'_'; - + 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; - } - } - foreach (split(/\&/,$courserdatas{$cid})) { - my ($name,$value)=split(/\=/,$_); - $courseopt{$userprefix.&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); + unless ((time-$courserdatas{$cid.'.last_cache'})<240) { + my %Tmp = &Apache::lonnet::dump('resourcedata',$cdom,$cnum); + $courserdatas{$cid}=\%Tmp; + $courserdatas{$cid.'.last_cache'}=time; + } + while (my ($name,$value) = each(%{$courserdatas{$cid}})) { + $courseopt{$userprefix.$name}=$value; } # Get userdata (if present) - unless - ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) { - my $reply= - &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome); - if ($reply!~/^error\:/) { - $userrdatas{$uname.'___'.$udom}=$reply; - $userrdatas{$uname.'___'.$udom.'.last_cache'}=time; - } - } - foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) { - my ($name,$value)=split(/\=/,$_); - $useropt{$userprefix.&Apache::lonnet::unescape($name)}= - &Apache::lonnet::unescape($value); + unless ((time-$userrdatas{$uname.'@'.$udom.'.last_cache'})<240) { + my %Tmp = &Apache::lonnet::dump('resourcedata',$udom,$uname); + $userrdatas{$cid} = \%Tmp; + # Most of the time the user does not have a 'resourcedata.db' + # file. We need to cache that we got nothing instead of bothering + # with requesting it every time. + $userrdatas{$uname.'@'.$udom.'.last_cache'}=time; + } + while (my ($name,$value) = each(%{$userrdatas{$cid}})) { + $useropt{$userprefix.$name}=$value; } } # now courseopt, useropt initialized for this user and course @@ -2115,14 +1970,14 @@ sub loadassessment { # my %c=(); if (tie(%parmhash,'GDBM_File', - &getcfn($safeeval).'_parms.db',&GDBM_READER(),0640)) { + $sheetdata->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) { my %f=&getformulas($safeeval); foreach (keys(%f)) { next if ($_!~/^A/); 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,12 +2025,12 @@ 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); + return &updateclasssheet($safeeval,$sheetdata); } else { - return &updatestudentassesssheet($safeeval); + return &updatestudentassesssheet($safeeval,$sheetdata); } } @@ -2185,14 +2040,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,10 +2135,10 @@ sub exportsheet { # # Not cached # - my $thissheet=&makenewsheet($uname,$udom,$stype,$usymb); - &readsheet($thissheet,$fn); - &updatesheet($thissheet); - &loadrows($thissheet); + my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb); + &readsheet($thissheet,$sheetdata,$fn); + &updatesheet($thissheet,$sheetdata); + &loadrows($thissheet,$sheetdata); &calcsheet($thissheet); @exportarr=&exportdata($thissheet); # @@ -2299,13 +2154,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 +2187,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; @@ -2422,48 +2276,69 @@ sub cachedssheets { # Interactive call to screen # # - - sub handler { my $r=shift; + + if (! exists($ENV{'form.Status'})) { + $ENV{'form.Status'} = 'Active'; + } + # Check this server + my $loaderror=&Apache::lonnet::overloaderror($r); + if ($loaderror) { return $loaderror; } + # Check the course homeserver + $loaderror= &Apache::lonnet::overloaderror($r, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + if ($loaderror) { return $loaderror; } + if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; 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('LON-CAPA Spreadsheet'); + 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{'request.role'} =~ /^st\./) { + delete $ENV{'form.unewfield'} if (exists($ENV{'form.unewfield'})); + delete $ENV{'form.unewformula'} if (exists($ENV{'form.unewformula'})); + } + 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('LON-CAPA Spreadsheet'); + if ($ENV{'request.role'} !~ /^st\./) { $r->print(< @@ -2490,216 +2365,201 @@ sub handler { ENDSCRIPT - $r->print(''.&Apache::loncommon::bodytag('Grades Spreadsheet'). - '
'. - &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('

Completely Recalculating Sheet ...

'); - 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('

Modified Workcopy

'); - $ENV{'form.unewformula'}=~s/\'/\"/g; - $r->print('

New formula: '.$ENV{'form.unewfield'}.'='. - $ENV{'form.unewformula'}.'

'); - &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,$ENV{'form.ufn'}); - } - # Print out user information - unless (&gettype($asheet) eq 'classcalc') { - $r->print('

User: '.&getuname($asheet). - '
Domain: '.&getudom($asheet)); - if (&getcsec($asheet) eq '-1') { - $r->print('

'. - 'Not a student in this course

'); - } else { - $r->print('
Section/Group: '.&getcsec($asheet)); + } + $r->print(''.&Apache::loncommon::bodytag('Grades Spreadsheet'). + ''); + $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('

Completely Recalculating Sheet ...

'); + undef %spreadsheets; + undef %courserdatas; + undef %userrdatas; + undef %defaultsheets; + undef %updatedata; + } + # Read new sheet or modified worksheet + $r->uri=~/\/(\w+)$/; + my ($sheet,$sheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); + # + # If a new formula had been entered, go from work copy + if ($ENV{'form.unewfield'}) { + $r->print('

Modified Workcopy

'); + $ENV{'form.unewformula'}=~s/\'/\"/g; + $r->print('

New formula: '.$ENV{'form.unewfield'}.'='. + $ENV{'form.unewformula'}.'

'); + $sheetdata->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet,$sheetdata, + $ENV{'form.unewfield'},$ENV{'form.unewformula'}); + } elsif ($ENV{'form.saveas'}) { + $sheetdata->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet,$sheetdata); + } else { + &readsheet($sheet,$sheetdata,$ENV{'form.ufn'}); + } + # Print out user information + unless ($sheetdata->{'sheettype'} eq 'classcalc') { + $r->print('

User: '.$sheetdata->{'uname'}. + '
Domain: '.$sheetdata->{'udom'}); + $r->print('
Section/Group: '.$sheetdata->{'csec'}); + if ($ENV{'form.usymb'}) { + $r->print('
Assessment: '. + $ENV{'form.usymb'}.''); + } + } + # + # Check user permissions + if (($sheetdata->{'sheettype'} eq 'classcalc' ) || + ($sheetdata->{'uname'} ne $ENV{'user.name'} ) || + ($sheetdata->{'udom'} ne $ENV{'user.domain'})) { + unless (&Apache::lonnet::allowed('vgr',$sheetdata->{'cid'})) { + $r->print('

Access Permission Denied

'. + ''); + return OK; + } + } + # Additional options + $r->print('
'. + '

'); + if ($sheetdata->{'sheettype'} eq 'assesscalc') { + $r->print('

'. + ''. + 'Level up: Student Sheet

'); + } + if (($sheetdata->{'sheettype'} eq 'studentcalc') && + (&Apache::lonnet::allowed('vgr',$sheetdata->{'cid'}))) { + $r->print ('

'. + 'Level up: Course Sheet

'); + } + # 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(''. + ''. + 'make default:

'); + } + $r->print(&hiddenfield('ufn',$sheetdata->{'filename'})); + # Load dialog + if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { + $r->print('

'. + '

' - ); - if (&gettype($asheet) eq 'assesscalc') { - $r->print ('

'. - 'Level up: Student Sheet

'); - } - if ((&gettype($asheet) eq 'studentcalc') && - (&Apache::lonnet::allowed('vgr',&getcid($asheet)))) { - $r->print ( - '

'. - 'Level up: Course Sheet

'); - } - # 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 - (''. - ''. - '(make default: )

'); - } - $r->print(&hiddenfield('ufn',&getfilename($asheet))); - # Load dialog - if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { - $r->print('

'. - '

'); - 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 ...
\n"); - $r->rflush(); - &cachedcsheets(); - } elsif (&gettype($asheet) eq 'studentcalc') { - $r->print - ("Loading previously calculated assessment sheets ...
\n"); - $r->rflush(); - &cachedssheets(&getuname($asheet),&getudom($asheet), - &getuhome($asheet)); + $r->print('>'.$_.''); + } + $r->print('

'); + if ($sheetdata->{'sheettype'} eq 'studentcalc') { + &setothersheets($sheet, + &othersheets($sheet,'assesscalc',$sheetdata)); } - # Update sheet, load rows - $r->print("Loaded sheet(s), updating rows ...
\n"); - $r->rflush(); - # - &updatesheet($asheet); - $r->print("Updated rows, loading row data ...
\n"); + } + # Cached sheets + &expirationdates(); + undef %oldsheets; + undef %loadedcaches; + if ($sheetdata->{'sheettype'} eq 'classcalc') { + $r->print("Loading previously calculated student sheets ...\n"); $r->rflush(); - # - &loadrows($asheet,$r); - $r->print("Loaded row data, calculating sheet ...
\n"); + &cachedcsheets(); + } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { + $r->print("Loading previously calculated assessment sheets ...\n"); $r->rflush(); - # - my $calcoutput=&calcsheet($asheet); - $r->print('

'.$calcoutput.'

'); - # 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('

Saving spreadsheet: '. - &writesheet($asheet,$ENV{'form.makedefufn'}).'

'); - } + &cachedssheets($sheetdata->{'uname'},$sheetdata->{'udom'}, + $sheetdata->{'uhome'}); + } + # Update sheet, load rows + $r->print("Loaded sheet(s), updating rows ...
\n"); + $r->rflush(); + # + &updatesheet($sheet,$sheetdata); + $r->print("Updated rows, loading row data ...\n"); + $r->rflush(); + # + &loadrows($sheet,$sheetdata,$r); + $r->print("Loaded row data, calculating sheet ...
\n"); + $r->rflush(); + # + my $calcoutput=&calcsheet($sheet); + $r->print('

'.$calcoutput.'

'); + # 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.='_'.$sheetdata->{'sheettype'}; + $sheetdata->{'filename'} = $fname; + $ENV{'form.ufn'}=$fname; + $r->print('

Saving spreadsheet: '. + &writesheet($sheet,$ENV{'form.makedefufn'},$sheetdata). + '

'); } - #Write the modified worksheet - - $r->print('Current sheet: '.&getfilename($asheet).'

'); - - &tmpwrite($asheet); - - if (&gettype($asheet) eq 'studentcalc') { - $r->print('
Show rows with empty A column: '); + } + # + # Write the modified worksheet + $r->print('Current sheet: '.$sheetdata->{'filename'}.'

'); + &tmpwrite($sheet,$sheetdata); + if ($sheetdata->{'sheettype'} eq 'studentcalc') { + $r->print('
Show rows with empty A column: '); } else { $r->print('
Show empty rows: '); } - + # $r->print(&hiddenfield('userselhidden','true'). - '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: print(' checked'); } - $r->print('>'); + # + # CSV format checkbox (classcalc sheets only) + if ($sheetdata->{'sheettype'} eq 'classcalc') { + $r->print(' Output CSV format: print(' checked'); } + $r->print('>'); } - -# ------------------------------------------------------------------ Insertrows + # + # Buttons to insert rows $r->print(' Student Status: '. &Apache::lonhtmlcommon::StatusOptions ($ENV{'form.Status'},'sheet')); - - $r->print(<print(<
ENDINSERTBUTTONS - -# ------------------------------------------------------------- Print out sheet - - &outsheet($r,$asheet); + # Print out sheet + &outsheet($r,$sheet,$sheetdata); $r->print(''); - -# ------------------------------------------------------------------------ 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;

 '.$what.''.join('', - (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. - 'abcdefghijklmnopqrstuvwxyz'))). + $r->print(''. + join('', + (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + 'abcdefghijklmnopqrstuvwxyz'))). "