--- loncom/interface/Attic/lonspreadsheet.pm 2002/10/18 13:46:01 1.118 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/24 15:34:10 1.127 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.118 2002/10/18 13:46:01 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.127 2002/10/24 15:34:10 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -122,20 +122,17 @@ my $tmpdir; ## sub mask { my ($lower,$upper)=@_; - - $lower=~/([A-Za-z]|\*)(\d+|\*)/; - my $la=$1; - my $ld=$2; - - $upper=~/([A-Za-z]|\*)(\d+|\*)/; - my $ua=$1; - my $ud=$2; + # + my ($la,$ld) = ($lower=~/([A-Za-z]|\*)(\d+|\*)/); + my ($ua,$ud) = ($upper=~/([A-Za-z]|\*)(\d+|\*)/); + # my $alpha=''; my $num=''; - + # if (($la eq '*') || ($ua eq '*')) { $alpha='[A-Za-z]'; } else { + if (($la=~/[A-Z]/) && ($ua=~/[A-Z]/) || ($la=~/[a-z]/) && ($ua=~/[a-z]/)) { $alpha='['.$la.'-'.$ua.']'; @@ -188,8 +185,8 @@ sub mask { } $num.=')'; } else { - if ($lda[$#lda]!=$uda[$#uda]) { - $num.='['.$lda[$#lda].'-'.$uda[$#uda].']'; + if ($lda[-1]!=$uda[-1]) { + $num.='['.$lda[-1].'-'.$uda[-1].']'; } } } @@ -208,7 +205,6 @@ sub initsheet { $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 @@ -221,12 +217,27 @@ sub initsheet { # rl: row label # os: other spreadsheets (for student spreadsheet only) -undef %sheet_values; -undef %t; -undef %f; -undef %c; -undef %rowlabel; -undef @os; +undef %sheet_values; # Holds the (computed, final) values for the sheet + # This is only written to by &calc, the spreadsheet computation routine. + # It is read by many functions +undef %t; # Holds the values of the spreadsheet temporarily. Set in &sett, + # which does the translation of strings like C5 into the value in C5. + # Used in &calc - %t holds the values that are actually eval'd. +undef %f; # Holds the formulas for each cell. This is the users + # (spreadsheet authors) data for each cell. + # set by &setformulas and returned by &getformulas + # &setformulas is called by &readsheet, &tmpread, &updateclasssheet, + # &updatestudentassesssheet, &loadstudent, &loadcourse + # &getformulas is called by &writesheet, &tmpwrite, &updateclasssheet, + # &updatestudentassesssheet, &loadstudent, &loadcourse, &loadassessment, +undef %c; # Holds the constants for a sheet. In the assessment + # sheets, this is the A column. Used in &MINPARM, &MAXPARM, &expandnamed, + # &sett, and &setconstants. There is no &getconstants. + # &setconstants is called by &loadstudent, &loadcourse, &load assessment, +undef @os; # Holds the names of other spreadsheets - this is used to specify + # the spreadsheets that are available for the assessment sheet. + # Set by &setothersheets. &setothersheets is called by &handler. A + # related subroutine is &othersheets. $maxrow = 0; $sheettype = ''; @@ -928,31 +939,60 @@ sub calc { return ''; } +# ------------------------------------------- End of "Inside of the safe space" +ENDDEFS + $safeeval->reval($code); + return $safeeval; +} + # # This is actually used for the student spreadsheet, not the assessment sheet # Do not be fooled by the name! # +sub templaterow { + my $sheet = shift; + 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=$sheet->{'f'}->{'template_'.$_}; + $fm=~s/[\'\"]/\&\#34;/g; + push(@cols,"'template_$_','$fm'".'___eq___'.$fm); + } + return @cols; +} + + sub outrowassess { # $n is the current row number - my $n=shift; + my $sheet = shift; + my $n=shift; + my $csv = $ENV{'form.showcsv'}; my @cols=(); if ($n) { - my ($usy,$ufn)=split(/__&&&\__/,$f{'A'.$n}); - if ($rowlabel{$usy}) { - $cols[0]=$rowlabel{$usy}.'
'. + my ($usy,$ufn)=split(/__&&&\__/,$sheet->{'f'}->{'A'.$n}); + if ($sheet->{'rowlabel'}->{$usy}) { + $cols[0]=&format_rowlabel($sheet->{'rowlabel'}->{$usy}); + if (! $csv) { + $cols[0].='
'. ''; } - $cols[0].=''; } else { $cols[0]='Export'; } @@ -960,18 +1000,19 @@ sub outrowassess { '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{$_.$n}; + my $fm=$sheet->{'f'}->{$_.$n}; $fm=~s/[\'\"]/\&\#34;/g; - push(@cols,"'$_$n','$fm'".'___eq___'.$sheet_values{$_.$n}); + push(@cols,"'$_$n','$fm'".'___eq___'.$sheet->{'values'}->{$_.$n}); } return @cols; } sub outrow { + my $sheet=shift; my $n=shift; my @cols=(); if ($n) { - $cols[0]=$rowlabel{$f{'A'.$n}}; + $cols[0]=&format_rowlabel($sheet->{'rowlabel'}->{$sheet->{'f'}->{'A'.$n}}); } else { $cols[0]='Export'; } @@ -979,93 +1020,83 @@ sub outrow { '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{$_.$n}; + my $fm=$sheet->{'f'}->{$_.$n}; $fm=~s/[\'\"]/\&\#34;/g; - push(@cols,"'$_$n','$fm'".'___eq___'.$sheet_values{$_.$n}); + push(@cols,"'$_$n','$fm'".'___eq___'.$sheet->{'values'}->{$_.$n}); } return @cols; } -sub exportrowa { - my @exportarray=(); - 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') { - push(@exportarray,$sheet_values{$_.'0'}); - } - 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 sub setformulas { - my ($safeeval,%f)=@_; - %{$safeeval->varglob('f')}=%f; + my ($sheet)=shift; + %{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}}; } # ------------------------------------------------ Add or change formula values sub setconstants { - my ($safeeval,%c)=@_; - %{$safeeval->varglob('c')}=%c; + my ($sheet)=shift; + my ($constants) = @_; + if (! ref($constants)) { + my %tmp = @_; + $constants = \%tmp; + } + $sheet->{'constants'} = $constants; + return %{$sheet->{'safe'}->varglob('c')}=%{$sheet->{'constants'}}; } # --------------------------------------------- Set names of other spreadsheets sub setothersheets { - my ($safeeval,@os)=@_; - @{$safeeval->varglob('os')}=@os; + my $sheet = shift; + my @othersheets = @_; + $sheet->{'othersheets'} = \@othersheets; + @{$sheet->{'safe'}->varglob('os')}=@othersheets; + return; } # ------------------------------------------------ Add or change formula values sub setrowlabels { - my ($safeeval,%rowlabel)=@_; - %{$safeeval->varglob('rowlabel')}=%rowlabel; + my $sheet=shift; + my ($rowlabel) = @_; + if (! ref($rowlabel)) { + my %tmp = @_; + $rowlabel = \%tmp; + } + $sheet->{'rowlabel'}=$rowlabel; } # ------------------------------------------------------- Calculate spreadsheet sub calcsheet { - my $safeeval=shift; - return $safeeval->reval('&calc();'); + my $sheet=shift; + my $result = $sheet->{'safe'}->reval('&calc();'); + %{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')}; + return $result; } # ---------------------------------------------------------------- Get formulas sub getformulas { - my $safeeval=shift; - return %{$safeeval->varglob('f')}; + my $sheet = shift; + return %{$sheet->{'safe'}->varglob('f')}; } # ----------------------------------------------------- Get value of $f{'A'.$n} sub getfa { - my ($safeeval,$n)=@_; - return $safeeval->reval('$f{"A'.$n.'"}'); + my $sheet = shift; + my ($n)=@_; + return $sheet->{'safe'}->reval('$f{"A'.$n.'"}'); } # ------------------------------------------------------------- Export of A-row sub exportdata { - my $safeeval=shift; - return $safeeval->reval('&exportrowa()'); + my $sheet=shift; + my @exportarray=(); + 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') { + push(@exportarray,$sheet->{'values'}->{$_.'0'}); + } + return @exportarray; } - # ========================================================== End of Spreadsheet # ============================================================================= @@ -1075,7 +1106,7 @@ sub exportdata { # --------------------------------------------- Produce output row n from sheet sub rown { - my ($safeeval,$n,$sheetdata)=@_; + my ($sheet,$n)=@_; my $defaultbg; my $rowdata=''; my $dataflag=0; @@ -1090,27 +1121,32 @@ sub rown { $rowdata.="\n".'"'.$n.'"'; } my $showf=0; - my $proc; + # + # Determine how many pink (uneditable) cells there are in this sheet. my $maxred=1; - my $sheettype=$sheetdata->{'sheettype'}; + my $sheettype=$sheet->{'sheettype'}; if ($sheettype eq 'studentcalc') { - $proc='&outrowassess'; $maxred=26; - } else { - $proc='&outrow'; - } - if ($sheettype eq 'assesscalc') { + } elsif ($sheettype eq 'assesscalc') { $maxred=1; } else { $maxred=26; } - if (&getfa($safeeval,$n)=~/^[\~\-]/) { $maxred=1; } + $maxred=1 if (&getfa($sheet,$n)=~/^[\~\-]/); + # + # Get the proper row + my @rowdata; if ($n eq '-') { - $proc='&templaterow'; + @rowdata = &templaterow($sheet); $n=-1; $dataflag=1; + } elsif ($sheettype eq 'studentcalc') { + @rowdata = &outrowassess($sheet,$n); + } else { + @rowdata = &outrow($sheet,$n); } - foreach ($safeeval->reval($proc.'('.$n.')')) { + # + foreach (@rowdata) { my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD'); my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_); if ((($vl ne '') || ($vl eq '0')) && @@ -1149,17 +1185,17 @@ sub rown { # ------------------------------------------------------------- Print out sheet sub outsheet { - my ($r,$safeeval,$sheetdata)=@_; + my ($r,$sheet)=@_; 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') { + if ($sheet->{'sheettype'} eq 'assesscalc') { $maxred=1; $realm='Assessment'; - } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { $maxred=26; $realm='User'; } @@ -1188,35 +1224,34 @@ sub outsheet { } $tabledata.="$_"; } - $tabledata.=''.&rown($safeeval,'-',$sheetdata). - &rown($safeeval,0,$sheetdata); + $tabledata.=''.&rown($sheet,'-'). + &rown($sheet,0); } $r->print($tabledata); # # Prepare to output rows my $row; - my $maxrow=$sheetdata->{'maxrow'}; # my @sortby=(); my @sortidx=(); - for ($row=1;$row<=$maxrow;$row++) { - push (@sortby, $safeeval->reval('$f{"A'.$row.'"}')); + for ($row=1;$row<=$sheet->{'maxrow'};$row++) { + push (@sortby, $sheet->{'safe'}->reval('$f{"A'.$row.'"}')); push (@sortidx, $row-1); } @sortidx=sort { lc($sortby[$a]) cmp lc($sortby[$b]); } @sortidx; # # Determine the type of child spreadsheets my $what='Student'; - if ($sheetdata->{'sheettype'} eq 'assesscalc') { + if ($sheet->{'sheettype'} eq 'assesscalc') { $what='Item'; - } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { + } elsif ($sheet->{'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,$sheetdata); + for ($row=0;$row<$sheet->{'maxrow'};$row++) { + my $thisrow=&rown($sheet,$sortidx[$row]+1); if ($thisrow) { if (($n/25==int($n/25)) && (!$ENV{'form.showcsv'})) { $r->print("\n
\n"); @@ -1239,11 +1274,12 @@ sub outsheet { # ----------------------------------------------- Read list of available sheets # sub othersheets { - my ($safeeval,$stype,$sheetdata)=@_; + my ($sheet,$stype)=@_; + $stype = $sheet->{'sheettype'} if (! defined($stype)); # - my $cnum = $sheetdata->{'cnum'}; - my $cdom = $sheetdata->{'cdom'}; - my $chome = $sheetdata->{'chome'}; + my $cnum = $sheet->{'cnum'}; + my $cdom = $sheet->{'cdom'}; + my $chome = $sheet->{'chome'}; # my @alternatives=(); my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum); @@ -1287,12 +1323,12 @@ sub parse_sheet { # -------------------------------------- Read spreadsheet formulas for a course # sub readsheet { - my ($safeeval,$sheetdata,$fn)=@_; + my ($sheet,$fn)=@_; # - my $stype = $sheetdata->{'sheettype'}; - my $cnum = $sheetdata->{'cnum'}; - my $cdom = $sheetdata->{'cdom'}; - my $chome = $sheetdata->{'chome'}; + my $stype = $sheet->{'sheettype'}; + my $cnum = $sheet->{'cnum'}; + my $cdom = $sheet->{'cdom'}; + my $chome = $sheet->{'chome'}; # if (! defined($fn)) { # There is no filename. Look for defaults in course and global, cache @@ -1313,11 +1349,13 @@ sub readsheet { } } # $fn now has a value - $sheetdata->{'filename'} = $fn; + $sheet->{'filename'} = $fn; # see if sheet is cached my $fstring=''; if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { - &setformulas($safeeval,split(/\_\_\_\;\_\_\_/,$fstring)); + my %tmp = split(/___;___/,$fstring); + $sheet->{'f'} = \%tmp; + &setformulas($sheet); } else { # Not cached, need to read my %f=(); @@ -1352,48 +1390,58 @@ sub readsheet { } # Cache and set $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); - &setformulas($safeeval,%f); + $sheet->{'f'}=\%f; + &setformulas($sheet); } } # -------------------------------------------------------- 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); + my $sheet={}; + $sheet->{'uname'} = $uname; + $sheet->{'udom'} = $udom; + $sheet->{'sheettype'} = $stype; + $sheet->{'usymb'} = $usymb; + $sheet->{'cid'} = $ENV{'request.course.id'}; + $sheet->{'csec'} = $Section{$uname.':'.$udom}; + $sheet->{'coursefilename'} = $ENV{'request.course.fn'}; + $sheet->{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + $sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; + $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; + $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom); + # + # + $sheet->{'f'} = {}; + $sheet->{'constants'} = {}; + $sheet->{'othersheets'} = []; + $sheet->{'rowlabel'} = {}; + # + # + $sheet->{'safe'}=&initsheet($sheet->{'sheettype'}); # - # Place all the %sheetdata items into the safe space + # Place all the %$sheet items into the safe space except the safe space + # itself my $initstring = ''; - foreach (keys(%sheetdata)) { - $initstring.= qq{\$$_="$sheetdata{$_}";}; + foreach (qw/uname udom sheettype usymb cid csec coursefilename + cnum cdom chome uhome/) { + $initstring.= qq{\$$_="$sheet->{$_}";}; } - $safeeval->reval($initstring); - return $safeeval,\%sheetdata; + $sheet->{'safe'}->reval($initstring); + return $sheet; } # ------------------------------------------------------------ Save spreadsheet sub writesheet { - my ($safeeval,$makedef,$sheetdata)=@_; - my $cid=$sheetdata->{'cid'}; + my ($sheet,$makedef)=@_; + my $cid=$sheet->{'cid'}; if (&Apache::lonnet::allowed('opa',$cid)) { - my %f=&getformulas($safeeval); - my $stype= $sheetdata->{'sheettype'}; - my $cnum = $sheetdata->{'cnum'}; - my $cdom = $sheetdata->{'cdom'}; - my $chome= $sheetdata->{'chome'}; - my $fn = $sheetdata->{'filename'}; + my %f=&getformulas($sheet); + my $stype= $sheet->{'sheettype'}; + my $cnum = $sheet->{'cnum'}; + my $cdom = $sheet->{'cdom'}; + my $chome= $sheet->{'chome'}; + my $fn = $sheet->{'filename'}; # Cache new sheet $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); # Write sheet @@ -1436,24 +1484,24 @@ sub writesheet { # "Modified workcopy" - interactive only # sub tmpwrite { - my ($safeeval,$sheetdata) = @_; + my ($sheet) = @_; my $fn=$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'. - $sheetdata->{'filename'}; + $ENV{'user.domain'}.'_spreadsheet_'.$sheet->{'usymb'}.'_'. + $sheet->{'filename'}; $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; if ($fh=Apache::File->new('>'.$fn)) { - print $fh join("\n",&getformulas($safeeval)); + print $fh join("\n",&getformulas($sheet)); } } # ---------------------------------------------------------- Read the temp copy sub tmpread { - my ($safeeval,$sheetdata,$nfield,$nform)=@_; + my ($sheet,$nfield,$nform)=@_; my $fn=$ENV{'user.name'}.'_'. - $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'. - $sheetdata->{'filename'}; + $ENV{'user.domain'}.'_spreadsheet_'.$sheet->{'usymb'}.'_'. + $sheet->{'filename'}; $fn=~s/\W/\_/g; $fn=$tmpdir.$fn.'.tmp'; my $fh; @@ -1489,7 +1537,8 @@ sub tmpread { } else { if ($nfield) { $fo{$nfield}=$nform; } } - &setformulas($safeeval,%fo); + $sheet->{'f'}=\%fo; + &setformulas($sheet); } ################################################## @@ -1501,7 +1550,7 @@ sub tmpread { Determine the value of a parameter. -Inputs: $what, the parameter needed, $safeeval, the safe space +Inputs: $what, the parameter needed, $sheet, the safe space Returns: The value of a parameter, or '' if none. @@ -1517,14 +1566,14 @@ this user and course. ################################################## ################################################## sub parmval { - my ($what,$safeeval,$sheetdata)=@_; - my $symb = $sheetdata->{'usymb'}; + my ($what,$sheet)=@_; + my $symb = $sheet->{'usymb'}; unless ($symb) { return ''; } # - my $cid = $sheetdata->{'cid'}; - my $csec = $sheetdata->{'csec'}; - my $uname = $sheetdata->{'uname'}; - my $udom = $sheetdata->{'udom'}; + my $cid = $sheet->{'cid'}; + my $csec = $sheet->{'csec'}; + my $uname = $sheet->{'uname'}; + my $udom = $sheet->{'udom'}; my $result=''; # my ($mapname,$id,$fn)=split(/\_\_\_/,$symb); @@ -1567,13 +1616,47 @@ sub parmval { return &Apache::lonnet::metadata($fn,$rwhat.'.default'); } +sub format_rowlabel { + my $rowlabel = shift; + my ($type,$labeldata) = split(':',$rowlabel,2); + my $result = ''; + if ($type eq 'symb') { + my ($symb,$uname,$udom,$title) = split(':',$labeldata); + $symb = &Apache::lonnet::unescape($symb); + if ($ENV{'form.showcsv'}) { + $result = $title; + } else { + $result = ''.$title.''; + } + } elsif ($type eq 'student') { + my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); + if ($ENV{'form.showcsv'}) { + $result = '"'. + join('","',($sname,$sdom,$fullname,$section,$id).'"'); + } else { + $result =''; + $result.=$section.' '.$id." ".$fullname.''; + } + } elsif ($type eq 'parameter') { + if ($ENV{'form.showcsv'}) { + $labeldata =~ s/
/ /g; + } + $result = $labeldata; + } else { + &Apache::lonnet::logthis("lonspreadsheet:bogus rowlabel type: $type"); + } + return $result; +} + # ---------------------------------------------- Update rows for course listing sub updateclasssheet { - my ($safeeval,$sheetdata) = @_; - my $cnum =$sheetdata->{'cnum'}; - my $cdom =$sheetdata->{'cdom'}; - my $cid =$sheetdata->{'cid'}; - my $chome =$sheetdata->{'chome'}; + my ($sheet) = @_; + my $cnum =$sheet->{'cnum'}; + my $cdom =$sheet->{'cdom'}; + my $cid =$sheet->{'cid'}; + my $chome =$sheet->{'chome'}; # %Section = (); @@ -1589,35 +1672,29 @@ sub updateclasssheet { my ($studentDomain,$studentName,$end,$start,$id,$studentSection, $fullname,$status) = @{$classlist->{$student}}; if ($ENV{'form.Status'} eq $status || $ENV{'form.Status'} eq 'Any') { - my $rowlabel=''; - if ($ENV{'form.showcsv'}) { - $rowlabel= '"'.join('","',($studentName,$studentDomain, - $fullname,$studentSection,$id).'"'); - } else { - $rowlabel=''; - $rowlabel.=$studentSection.' '.$id." ".$fullname; - $rowlabel.=''; - } - $currentlist{$student}=$rowlabel; + $currentlist{$student}=join(':',('student',$studentName, + $studentDomain,$fullname, + $studentSection,$id)); } } # # Find discrepancies between the course row table and this # - my %f=&getformulas($safeeval); + my %f=&getformulas($sheet); my $changed=0; # - my $maxrow=0; + $sheet->{'maxrow'}=0; my %existing=(); # # Now obsolete rows foreach (keys(%f)) { if ($_=~/^A(\d+)/) { - $maxrow=($1>$maxrow)?$1:$maxrow; + if ($1 > $sheet->{'maxrow'}) { + $sheet->{'maxrow'}= $1; + } $existing{$f{$_}}=1; unless ((defined($currentlist{$f{$_}})) || (!$1) || - ($f{$_}=~/^(\~\~\~|\-\-\-)/)) { + ($f{$_}=~/^(~~~|---)/)) { $f{$_}='!!! Obsolete'; $changed=1; } @@ -1628,27 +1705,29 @@ sub updateclasssheet { foreach (sort keys(%currentlist)) { unless ($existing{$_}) { $changed=1; - $maxrow++; - $f{'A'.$maxrow}=$_; + $sheet->{'maxrow'}++; + $f{'A'.$sheet->{'maxrow'}}=$_; } } - if ($changed) { &setformulas($safeeval,%f); } + if ($changed) { + $sheet->{'f'} = \%f; + &setformulas($sheet,%f); + } # - $sheetdata->{'maxrow'} = $maxrow; - &setrowlabels($safeeval,%currentlist); + &setrowlabels($sheet,\%currentlist); } # ----------------------------------- Update rows for student and assess sheets sub updatestudentassesssheet { - my ($safeeval,$sheetdata) = @_; + my ($sheet) = @_; my %bighash; - my $stype=$sheetdata->{'sheettype'}; - my $uname=$sheetdata->{'uname'}; - my $udom =$sheetdata->{'udom'}; - my %current=(); + my $stype=$sheet->{'sheettype'}; + my $uname=$sheet->{'uname'}; + my $udom =$sheet->{'udom'}; + $sheet->{'rowlabel'} = {}; if ($updatedata {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) { - %current=split(/\_\_\_\;\_\_\_/, + %{$sheet->{'rowlabel'}}=split(/___;___/, $updatedata{$ENV{'request.course.fn'}. '_'.$stype.'_'.$uname.'_'.$udom}); } else { @@ -1659,28 +1738,28 @@ sub updatestudentassesssheet { return 'Could not access course data'; } # Get all assessments + # + # allkeys is used in the assessment sheets to provide labels + # for the parameters. my %allkeys=('timestamp' => - 'Timestamp of Last Transaction
timestamp', + 'parameter:Timestamp of Last Transaction
timestamp', 'subnumber' => - 'Number of Submissions
subnumber', + 'parameter:Number of Submissions
subnumber', 'tutornumber' => - 'Number of Tutor Responses
tutornumber', + 'parameter:Number of Tutor Responses
tutornumber', 'totalpoints' => - 'Total Points Granted
totalpoints'); + 'parameter:Total Points Granted
totalpoints'); my $adduserstr=''; if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){ $adduserstr='&uname='.$uname.'&udom='.$udom; } - my %allassess = - ('_feedback' =>'Feedback', - '_evaluation' =>'Evaluation', - '_tutoring' =>'Tutoring', - '_discussion' =>'Discussion' - ); + # + # allassess holds the descriptions of all assessments + my %allassess; + foreach ('Feedback','Evaluation','Tutoring','Discussion') { + my $symb = '_'.lc($_); + $allassess{$symb} = join(':',('symb',$symb,$uname,$udom,$_)); + } while (($_,undef) = each(%bighash)) { next if ($_!~/^src\_(\d+)\.(\d+)$/); my $mapid=$1; @@ -1691,9 +1770,8 @@ sub updatestudentassesssheet { my $symb= &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); - $allassess{$symb}= - ''. - $bighash{'title_'.$id}.''; + $allassess{$symb}='symb:'.&Apache::lonnet::escape($symb).':' + .$uname.':'.$udom.':'.$bighash{'title_'.$id}; next if ($stype ne 'assesscalc'); foreach my $key (split(/\,/, &Apache::lonnet::metadata($srcf,'keys') @@ -1706,7 +1784,7 @@ sub updatestudentassesssheet { &Apache::lonnet::metadata($srcf,$key.'.name'); } $display.='
'.$key; - $allkeys{$key}=$display; + $allkeys{$key}='parameter:'.$display; } # end of foreach } } # end of foreach (keys(%bighash)) @@ -1716,63 +1794,66 @@ sub updatestudentassesssheet { # %allassess has a list of all resource displays by symb # if ($stype eq 'assesscalc') { - %current=%allkeys; + $sheet->{'rowlabel'} = \%allkeys; } elsif ($stype eq 'studentcalc') { - %current=%allassess; + $sheet->{'rowlabel'} = \%allassess; } $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}= - join('___;___',%current); + join('___;___',%{$sheet->{'rowlabel'}}); # Get current from cache } # Find discrepancies between the course row table and this # - my %f=&getformulas($safeeval); + my %f=&getformulas($sheet); my $changed=0; - my $maxrow=0; + $sheet->{'maxrow'} = 0; my %existing=(); # Now obsolete rows foreach (keys(%f)) { next if ($_!~/^A(\d+)/); - $maxrow=($1>$maxrow)?$1:$maxrow; - my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_}); + if ($1 > $sheet->{'maxrow'}) { + $sheet->{'maxrow'} = $1; + } + my ($usy,$ufn)=split(/__&&&\__/,$f{$_}); $existing{$usy}=1; - unless ((defined($current{$usy})) || (!$1) || - ($f{$_}=~/^(\~\~\~|\-\-\-)/)){ + unless ((exists($sheet->{'rowlabel'}->{$usy}) && + (defined($sheet->{'rowlabel'}->{$usy})) || (!$1) || + ($f{$_}=~/^(~~~|---)/))){ $f{$_}='!!! Obsolete'; $changed=1; } elsif ($ufn) { - $current{$usy} - =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/; + $sheet->{'rowlabel'}->{$usy} + =~s/assesscalc\?usymb\=/assesscalc\?ufn\=$ufn\&usymb\=/; } } # New and unknown keys - foreach (keys(%current)) { + foreach (keys(%{$sheet->{'rowlabel'}})) { unless ($existing{$_}) { $changed=1; - $maxrow++; - $f{'A'.$maxrow}=$_; + $sheet->{'maxrow'}++; + $f{'A'.$sheet->{'maxrow'}}=$_; } } - if ($changed) { &setformulas($safeeval,%f); } - $sheetdata->{'maxrow'} = $maxrow; - &setrowlabels($safeeval,%current); + if ($changed) { + $sheet->{'f'} = \%f; + &setformulas($sheet); + } # - undef %current; undef %existing; } # ------------------------------------------------ Load data for one assessment sub loadstudent { - my ($safeeval,$sheetdata)=@_; + my ($sheet)=@_; my %c=(); - my %f=&getformulas($safeeval); - $cachedassess=$sheetdata->{'uname'}.':'.$sheetdata->{'udom'}; + my %f=&getformulas($sheet); + $cachedassess=$sheet->{'uname'}.':'.$sheet->{'udom'}; # Get ALL the student preformance data - my @tmp = &Apache::lonnet::dump($sheetdata->{'cid'}, - $sheetdata->{'udom'}, - $sheetdata->{'uname'}, + my @tmp = &Apache::lonnet::dump($sheet->{'cid'}, + $sheet->{'udom'}, + $sheet->{'uname'}, undef); if ($tmp[0] !~ /^error:/) { %cachedstores = @tmp; @@ -1785,8 +1866,8 @@ sub loadstudent { my $row=$1; next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); my ($usy,$ufn)=split(/__&&&\__/,$f{$_}); - @assessdata=&exportsheet($sheetdata->{'uname'}, - $sheetdata->{'udom'}, + @assessdata=&exportsheet($sheet->{'uname'}, + $sheet->{'udom'}, 'assesscalc',$usy,$ufn); my $index=0; foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M', @@ -1807,16 +1888,17 @@ sub loadstudent { } $cachedassess=''; undef %cachedstores; - &setformulas($safeeval,%f); - &setconstants($safeeval,%c); + $sheet->{'f'} = \%f; + &setformulas($sheet); + &setconstants($sheet,\%c); } # --------------------------------------------------- Load data for one student # sub loadcourse { - my ($safeeval,$sheetdata,$r)=@_; + my ($sheet,$r)=@_; my %c=(); - my %f=&getformulas($safeeval); + my %f=&getformulas($sheet); my $total=0; foreach (keys(%f)) { if ($_=~/^A(\d+)/) { @@ -1867,8 +1949,9 @@ ENDPOP } } } - &setformulas($safeeval,%f); - &setconstants($safeeval,%c); + $sheet->{'f'}=\%f; + &setformulas($sheet); + &setconstants($sheet,\%c); $r->print(''); $r->rflush(); } @@ -1876,16 +1959,16 @@ ENDPOP # ------------------------------------------------ Load data for one assessment # sub loadassessment { - my ($safeeval,$sheetdata)=@_; + my ($sheet)=@_; - 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 $uhome = $sheet->{'uhome'}; + my $uname = $sheet->{'uname'}; + my $udom = $sheet->{'udom'}; + my $symb = $sheet->{'usymb'}; + my $cid = $sheet->{'cid'}; + my $cnum = $sheet->{'cnum'}; + my $cdom = $sheet->{'cdom'}; + my $chome = $sheet->{'chome'}; my $namespace; unless ($namespace=$cid) { return ''; } @@ -1970,29 +2053,29 @@ sub loadassessment { # my %c=(); if (tie(%parmhash,'GDBM_File', - $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,$sheetdata); - $c{$_}=$val; - $c{$f{$_}}=$val; + $sheet->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) { + my %f=&getformulas($sheet); + foreach my $cell (keys(%f)) { + next if ($cell !~ /^A/); + next if ($f{$cell} =~/^[\!\~\-]/); + if ($f{$cell}=~/^parameter/) { + if (defined($thisassess{$f{$cell}})) { + my $val = &parmval($f{$cell},$sheet); + $c{$cell} = $val; + $c{$f{$cell}} = $val; } } else { - my $key=$f{$_}; + my $key=$f{$cell}; my $ckey=$key; $key=~s/^stores\_/resource\./; $key=~s/\_/\./g; - $c{$_}=$returnhash{$key}; + $c{$cell}=$returnhash{$key}; $c{$ckey}=$returnhash{$key}; } } untie(%parmhash); } - &setconstants($safeeval,%c); + &setconstants($sheet,\%c); } # --------------------------------------------------------- Various form fields @@ -2025,12 +2108,12 @@ sub selectbox { # sub updatesheet { - my ($safeeval,$sheetdata)=@_; - my $stype=$sheetdata->{'sheettype'}; + my ($sheet)=@_; + my $stype=$sheet->{'sheettype'}; if ($stype eq 'classcalc') { - return &updateclasssheet($safeeval,$sheetdata); + return &updateclasssheet($sheet); } else { - return &updatestudentassesssheet($safeeval,$sheetdata); + return &updatestudentassesssheet($sheet); } } @@ -2040,14 +2123,14 @@ sub updatesheet { # sub loadrows { - my ($safeeval,$sheetdata,$r)=@_; - my $stype=$sheetdata->{'sheettype'}; + my ($sheet,$r)=@_; + my $stype=$sheet->{'sheettype'}; if ($stype eq 'classcalc') { - &loadcourse($safeeval,$sheetdata,$r); + &loadcourse($sheet,$r); } elsif ($stype eq 'studentcalc') { - &loadstudent($safeeval,$sheetdata); + &loadstudent($sheet); } else { - &loadassessment($safeeval,$sheetdata); + &loadassessment($sheet); } } @@ -2065,7 +2148,7 @@ sub forcedrecalc { if ($ENV{'form.forcerecalc'}) { return 1; } unless ($time) { return 1; } if ($stype eq 'assesscalc') { - my $map=(split(/\_\_\_/,$usymb))[0]; + my $map=(split(/___/,$usymb))[0]; if (&checkthis('::assesscalc:',$time) || &checkthis('::assesscalc:'.$map,$time) || &checkthis('::assesscalc:'.$usymb,$time) || @@ -2084,14 +2167,10 @@ sub forcedrecalc { } # ============================================================== Export handler -# -# Non-interactive call from with program -# - sub exportsheet { my ($uname,$udom,$stype,$usymb,$fn)=@_; my @exportarr=(); - if (($usymb=~/^\_(\w+)/) && (!$fn)) { + if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!$fn)) { $fn='default_'.$1; } # @@ -2100,8 +2179,8 @@ sub exportsheet { my $key=$uname.':'.$udom.':'.$stype.':'.$usymb; my $found=''; if ($oldsheets{$key}) { - foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) { - my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_); + foreach (split(/___&\___/,$oldsheets{$key})) { + my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { $found=$value; } @@ -2110,8 +2189,8 @@ sub exportsheet { unless ($found) { &cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom)); if ($oldsheets{$key}) { - foreach (split(/\_\_\_\&\_\_\_/,$oldsheets{$key})) { - my ($name,$value)=split(/\_\_\_\=\_\_\_/,$_); + foreach (split(/___&\___/,$oldsheets{$key})) { + my ($name,$value)=split(/___=___/,$_); if ($name eq $fn) { $found=$value; } @@ -2130,72 +2209,65 @@ sub exportsheet { # # Return what was cached # - @exportarr=split(/\_\_\_\;\_\_\_/,$found); - } else { - # - # Not cached - # - my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb); - &readsheet($thissheet,$sheetdata,$fn); - &updatesheet($thissheet,$sheetdata); - &loadrows($thissheet,$sheetdata); - &calcsheet($thissheet); - @exportarr=&exportdata($thissheet); - # - # Store now - # - my $cid=$ENV{'request.course.id'}; - my $current=''; - if ($stype eq 'studentcalc') { - $current=&Apache::lonnet::reply('get:'. - $ENV{'course.'.$cid.'.domain'}.':'. - $ENV{'course.'.$cid.'.num'}. - ':nohist_calculatedsheets:'. - &Apache::lonnet::escape($key), - $ENV{'course.'.$cid.'.home'}); - } else { - $current=&Apache::lonnet::reply('get:'.$sheetdata->{'udom'}.':'. - $sheetdata->{'uname'}. - ':nohist_calculatedsheets_'. - $ENV{'request.course.id'}.':'. - &Apache::lonnet::escape($key), - $sheetdata->{'uhome'}); - } - my %currentlystored=(); - unless ($current=~/^error\:/) { - foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) { - my ($name,$value)=split(/___=___/,$_); - $currentlystored{$name}=$value; - } - } - $currentlystored{$fn}=join('___;___',@exportarr); - # - my $newstore=''; - foreach (keys(%currentlystored)) { - if ($newstore) { $newstore.='___&___'; } - $newstore.=$_.'___=___'.$currentlystored{$_}; - } - my $now=time; - if ($stype eq 'studentcalc') { - &Apache::lonnet::reply('put:'. - $ENV{'course.'.$cid.'.domain'}.':'. - $ENV{'course.'.$cid.'.num'}. - ':nohist_calculatedsheets:'. - &Apache::lonnet::escape($key).'='. - &Apache::lonnet::escape($newstore).'&'. - &Apache::lonnet::escape($key).'.time='.$now, - $ENV{'course.'.$cid.'.home'}); - } else { - &Apache::lonnet::reply('put:'. - $sheetdata->{'udom'}.':'. - $sheetdata->{'uname'}. - ':nohist_calculatedsheets_'. - $ENV{'request.course.id'}.':'. - &Apache::lonnet::escape($key).'='. - &Apache::lonnet::escape($newstore).'&'. - &Apache::lonnet::escape($key).'.time='.$now, - $sheetdata->{'uhome'}); - } + @exportarr=split(/___;___/,$found); + return @exportarr; + } + # + # Not cached + # + my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb); + &readsheet($sheet,$fn); + &updatesheet($sheet); + &loadrows($sheet); + &calcsheet($sheet); + @exportarr=&exportdata($sheet); + # + # Store now + # + my $cid=$ENV{'request.course.id'}; + my $current=''; + if ($stype eq 'studentcalc') { + $current=&Apache::lonnet::reply('get:'. + $ENV{'course.'.$cid.'.domain'}.':'. + $ENV{'course.'.$cid.'.num'}. + ':nohist_calculatedsheets:'. + &Apache::lonnet::escape($key), + $ENV{'course.'.$cid.'.home'}); + } else { + $current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'. + $sheet->{'uname'}. + ':nohist_calculatedsheets_'. + $ENV{'request.course.id'}.':'. + &Apache::lonnet::escape($key), + $sheet->{'uhome'}); + } + my %currentlystored=(); + unless ($current=~/^error\:/) { + foreach (split(/___&\___/,&Apache::lonnet::unescape($current))) { + my ($name,$value)=split(/___=___/,$_); + $currentlystored{$name}=$value; + } + } + $currentlystored{$fn}=join('___;___',@exportarr); + # + my $newstore=''; + foreach (keys(%currentlystored)) { + if ($newstore) { $newstore.='___&___'; } + $newstore.=$_.'___=___'.$currentlystored{$_}; + } + my $now=time; + if ($stype eq 'studentcalc') { + &Apache::lonnet::put('nohist_calculatedsheets', + { $key => $newstore, + $key.time => $now }, + $ENV{'course.'.$cid.'.domain'}, + $ENV{'course.'.$cid.'.num'}) + } else { + &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, + { $key => $newstore, + $key.time => $now }, + $sheet->{'udom'}, + $sheet->{'uname'}) } return @exportarr; } @@ -2386,7 +2458,7 @@ ENDSCRIPT } # Read new sheet or modified worksheet $r->uri=~/\/(\w+)$/; - my ($sheet,$sheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); + my ($sheet)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'}); # # If a new formula had been entered, go from work copy if ($ENV{'form.unewfield'}) { @@ -2394,20 +2466,19 @@ ENDSCRIPT $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'}); + $sheet->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'}); } elsif ($ENV{'form.saveas'}) { - $sheetdata->{'filename'} = $ENV{'form.ufn'}; - &tmpread($sheet,$sheetdata); + $sheet->{'filename'} = $ENV{'form.ufn'}; + &tmpread($sheet); } else { - &readsheet($sheet,$sheetdata,$ENV{'form.ufn'}); + &readsheet($sheet,$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 ($sheet->{'sheettype'} ne 'classcalc') { + $r->print('

User: '.$sheet->{'uname'}. + '
Domain: '.$sheet->{'udom'}); + $r->print('
Section/Group: '.$sheet->{'csec'}); if ($ENV{'form.usymb'}) { $r->print('
Assessment: '. $ENV{'form.usymb'}.''); @@ -2415,10 +2486,10 @@ ENDSCRIPT } # # 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'})) { + if (($sheet->{'sheettype'} eq 'classcalc' ) || + ($sheet->{'uname'} ne $ENV{'user.name'} ) || + ($sheet->{'udom'} ne $ENV{'user.domain'})) { + unless (&Apache::lonnet::allowed('vgr',$sheet->{'cid'})) { $r->print('

Access Permission Denied

'. ''); return OK; @@ -2428,15 +2499,15 @@ ENDSCRIPT $r->print('
'. '

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

'. ''. + 'uname='.$sheet->{'uname'}. + '&udom='.$sheet->{'udom'}.'">'. 'Level up: Student Sheet

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

'. 'Level up: Course Sheet

'); } @@ -2449,13 +2520,13 @@ ENDSCRIPT ''. 'make default:

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

'. '

'); - if ($sheetdata->{'sheettype'} eq 'studentcalc') { + if ($sheet->{'sheettype'} eq 'studentcalc') { &setothersheets($sheet, - &othersheets($sheet,'assesscalc',$sheetdata)); + &othersheets($sheet,'assesscalc')); } } # Cached sheets &expirationdates(); undef %oldsheets; undef %loadedcaches; - if ($sheetdata->{'sheettype'} eq 'classcalc') { + if ($sheet->{'sheettype'} eq 'classcalc') { $r->print("Loading previously calculated student sheets ...\n"); $r->rflush(); &cachedcsheets(); - } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') { + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { $r->print("Loading previously calculated assessment sheets ...\n"); $r->rflush(); - &cachedssheets($sheetdata->{'uname'},$sheetdata->{'udom'}, - $sheetdata->{'uhome'}); + &cachedssheets($sheet->{'uname'},$sheet->{'udom'},$sheet->{'uhome'}); } # Update sheet, load rows $r->print("Loaded sheet(s), updating rows ...
\n"); $r->rflush(); # - &updatesheet($sheet,$sheetdata); + &updatesheet($sheet); $r->print("Updated rows, loading row data ...\n"); $r->rflush(); # - &loadrows($sheet,$sheetdata,$r); + &loadrows($sheet,$r); $r->print("Loaded row data, calculating sheet ...
\n"); $r->rflush(); # @@ -2502,23 +2572,23 @@ ENDSCRIPT 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; + $fname.='_'.$sheet->{'sheettype'}; + $sheet->{'filename'} = $fname; $ENV{'form.ufn'}=$fname; $r->print('

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

'); } } # # Write the modified worksheet - $r->print('Current sheet: '.$sheetdata->{'filename'}.'

'); - &tmpwrite($sheet,$sheetdata); - if ($sheetdata->{'sheettype'} eq 'studentcalc') { + $r->print('Current sheet: '.$sheet->{'filename'}.'

'); + &tmpwrite($sheet); + if ($sheet->{'sheettype'} eq 'studentcalc') { $r->print('
Show rows with empty A column: '); } else { $r->print('
Show empty rows: '); - } + } # $r->print(&hiddenfield('userselhidden','true'). 'print('>'); # # CSV format checkbox (classcalc sheets only) - if ($sheetdata->{'sheettype'} eq 'classcalc') { - $r->print(' Output CSV format: print(' checked'); } - $r->print('>'); + $r->print(' Output CSV format: print(' checked') if ($ENV{'form.showcsv'}); + $r->print('>'); + if ($sheet->{'sheettype'} eq 'classcalc') { + $r->print(' Student Status: '. + &Apache::lonhtmlcommon::StatusOptions + ($ENV{'form.Status'},'sheet')); } # # Buttons to insert rows - $r->print(' Student Status: '. - &Apache::lonhtmlcommon::StatusOptions - ($ENV{'form.Status'},'sheet')); $r->print(< value='Insert Row Bottom'>
ENDINSERTBUTTONS # Print out sheet - &outsheet($r,$sheet,$sheetdata); + &outsheet($r,$sheet); $r->print(''); # Done return OK; @@ -2564,7 +2634,3 @@ ENDINSERTBUTTONS 1; __END__ - - - -