--- loncom/interface/Attic/lonspreadsheet.pm 2002/10/22 13:09:49 1.120 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/25 15:58:35 1.128 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.120 2002/10/22 13:09:49 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.128 2002/10/25 15:58:35 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 @@ -238,8 +234,6 @@ undef %c; # Holds the constants for a sh # 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 %rowlabel; # Holds the 'prefix' for each row. Set by &setrowlabels. - # &setrowlabels is called by &updateclasssheet, &updatestudentassesssheet, 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 @@ -834,9 +828,11 @@ sub expandnamed { foreach $parameter (keys(%c)) { push @matches,$parameter if ($parameter =~ /$expression/); } - if ($#matches == 0) { + if (scalar(@matches )== 0) { + return; + } elsif (scalar(@matches) == 1) { $returnvalue = '$c{\''.$matches[0].'\'}'; - } elsif ($#matches > 0) { + } elsif (scalar(@matches) > 0) { # more than one match. Look for a concise one $returnvalue = "'non-unique parameter name : $expression'"; foreach (@matches) { @@ -844,8 +840,6 @@ sub expandnamed { $returnvalue = '$c{\''.$_.'\'}'; } } - } else { - $returnvalue = "'bad parameter name : $expression'"; } return $returnvalue; } @@ -945,19 +939,42 @@ 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]='<b><font size=+1>Template</font></b>'; + 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 $sheet = shift; my $n=shift; - my $csv = 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].='<br>'. '<select name="sel_'.$n.'" onChange="changesheet('.$n.')">'. @@ -967,7 +984,7 @@ sub outrowassess { $cols[0]=''; } if (! $csv) { - foreach (@os) { + foreach (@{$sheet->{'othersheets'}}) { $cols[0].='<option name="'.$_.'"'; if ($ufn eq $_) { $cols[0].=' selected'; @@ -983,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]='<b><font size=+1>Export</font></b>'; } @@ -1002,44 +1020,13 @@ 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}; - $fm=~s/[\'\"]/\&\#34;/g; - 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]='<b><font size=+1>Template</font></b>'; - 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_'.$_}; + my $fm=$sheet->{'f'}->{$_.$n}; $fm=~s/[\'\"]/\&\#34;/g; - push(@cols,"'template_$_','$fm'".'___eq___'.$fm); + push(@cols,"'$_$n','$fm'".'___eq___'.$sheet->{'values'}->{$_.$n}); } return @cols; } - -# ------------------------------------------- End of "Inside of the safe space" -ENDDEFS - $safeeval->reval($code); - return $safeeval; -} - - # ------------------------------------------------ Add or change formula values sub setformulas { my ($sheet)=shift; @@ -1049,6 +1036,12 @@ sub setformulas { # ------------------------------------------------ Add or change formula values sub setconstants { my ($sheet)=shift; + my ($constants) = @_; + if (! ref($constants)) { + my %tmp = @_; + $constants = \%tmp; + } + $sheet->{'constants'} = $constants; return %{$sheet->{'safe'}->varglob('c')}=%{$sheet->{'constants'}}; } @@ -1064,7 +1057,12 @@ sub setothersheets { # ------------------------------------------------ Add or change formula values sub setrowlabels { my $sheet=shift; - %{$sheet->{'safe'}->varglob('rowlabel')}=%{$sheet->{'rowlabel'}}; + my ($rowlabel) = @_; + if (! ref($rowlabel)) { + my %tmp = @_; + $rowlabel = \%tmp; + } + $sheet->{'rowlabel'}=$rowlabel; } # ------------------------------------------------------- Calculate spreadsheet @@ -1091,10 +1089,14 @@ sub getfa { # ------------------------------------------------------------- Export of A-row sub exportdata { my $sheet=shift; - return $sheet->{'safe'}->reval('&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; } - # ========================================================== End of Spreadsheet # ============================================================================= @@ -1119,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=$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($sheet,$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 ($sheet->{'safe'}->reval($proc.'('.$n.','.$ENV{'form.showcsv'}.')')) { + # + 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')) && @@ -1225,6 +1232,8 @@ sub outsheet { # Prepare to output rows my $row; # + # Sort the rows in some manner + # my @sortby=(); my @sortidx=(); for ($row=1;$row<=$sheet->{'maxrow'};$row++) { @@ -1515,7 +1524,7 @@ sub tmpread { } } if ($nform eq 'changesheet') { - $fo{'A'.$nfield}=(split(/\_\_\&\&\&\_\_/,$fo{'A'.$nfield}))[0]; + $fo{'A'.$nfield}=(split(/__&&&\__/,$fo{'A'.$nfield}))[0]; unless ($ENV{'form.sel_'.$nfield} eq 'Default') { $fo{'A'.$nfield}.='__&&&__'.$ENV{'form.sel_'.$nfield}; } @@ -1609,6 +1618,40 @@ 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 = '<a href="/adm/assesscalc?usymb='.$symb. + '&uname='.$uname.'&udom='.$udom.'">'.$title.'</a>'; + } + } 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 ='<a href="/adm/studentcalc?uname='.$sname. + '&udom='.$sdom.'">'; + $result.=$section.' '.$id." ".$fullname.'</a>'; + } + } elsif ($type eq 'parameter') { + if ($ENV{'form.showcsv'}) { + $labeldata =~ s/<br>/ /g; + } + $result = $labeldata; + } else { + &Apache::lonnet::logthis("lonspreadsheet:bogus rowlabel type: $type"); + } + return $result; +} + # ---------------------------------------------- Update rows for course listing sub updateclasssheet { my ($sheet) = @_; @@ -1631,17 +1674,9 @@ 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='<a href="/adm/studentcalc?uname='.$studentName. - '&udom='.$studentDomain.'">'; - $rowlabel.=$studentSection.' '.$id." ".$fullname; - $rowlabel.='</a>'; - } - $currentlist{$student}=$rowlabel; + $currentlist{$student}=join(':',('student',$studentName, + $studentDomain,$fullname, + $studentSection,$id)); } } # @@ -1669,11 +1704,11 @@ sub updateclasssheet { } # # New and unknown keys - foreach (sort keys(%currentlist)) { - unless ($existing{$_}) { + foreach my $student (sort keys(%currentlist)) { + unless ($existing{$student}) { $changed=1; $sheet->{'maxrow'}++; - $f{'A'.$sheet->{'maxrow'}}=$_; + $f{'A'.$sheet->{'maxrow'}}=$student; } } if ($changed) { @@ -1681,62 +1716,48 @@ sub updateclasssheet { &setformulas($sheet,%f); } # - $sheet->{'rowlabel'} = \%currentlist; - &setrowlabels($sheet); + &setrowlabels($sheet,\%currentlist); } # ----------------------------------- Update rows for student and assess sheets sub updatestudentassesssheet { my ($sheet) = @_; + # my %bighash; - my $stype=$sheet->{'sheettype'}; - my $uname=$sheet->{'uname'}; - my $udom =$sheet->{'udom'}; + # + my $stype = $sheet->{'sheettype'}; + my $uname = $sheet->{'uname'}; + my $udom = $sheet->{'udom'}; $sheet->{'rowlabel'} = {}; - if ($updatedata - {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) { - %{$sheet->{'rowlabel'}}=split(/___;___/, - $updatedata{$ENV{'request.course.fn'}. - '_'.$stype.'_'.$uname.'_'.$udom}); + my $identifier =$sheet->{'coursefilename'}.'_'.$stype.'_'.$uname.'_'.$udom; + if ($updatedata{$identifier}) { + %{$sheet->{'rowlabel'}}=split(/___;___/,$updatedata{$identifier}); } else { # Tie hash - tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', + tie(%bighash,'GDBM_File',$sheet->{'coursefilename'}.'.db', &GDBM_READER(),0640); if (! tied(%bighash)) { return 'Could not access course data'; } # Get all assessments - my %allkeys=('timestamp' => - 'Timestamp of Last Transaction<br>timestamp', - 'subnumber' => - 'Number of Submissions<br>subnumber', - 'tutornumber' => - 'Number of Tutor Responses<br>tutornumber', - 'totalpoints' => - 'Total Points Granted<br>totalpoints'); - my $adduserstr=''; - if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){ - $adduserstr='&uname='.$uname.'&udom='.$udom; - } - my %allassess; - if (! $ENV{'form.showcsv'}) { - %allassess = - ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'. - $adduserstr.'">Feedback</a>', - '_evaluation' =>'<a href="/adm/assesscalc?usymb=_evaluation'. - $adduserstr.'">Evaluation</a>', - '_tutoring' =>'<a href="/adm/assesscalc?usymb=_tutoring'. - $adduserstr.'">Tutoring</a>', - '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'. - $adduserstr.'">Discussion</a>' - ); - } else { - %allassess = - ('_feedback' => "Feedback", - '_evaluation' => "Evaluation", - '_tutoring' => "Tutoring", - '_discussion' => "Discussion", - ); + # + # parameter_labels is used in the assessment sheets to provide labels + # for the parameters. + my %parameter_labels= + ('timestamp' => + 'parameter:Timestamp of Last Transaction<br>timestamp', + 'subnumber' => + 'parameter:Number of Submissions<br>subnumber', + 'tutornumber' => + 'parameter:Number of Tutor Responses<br>tutornumber', + 'totalpoints' => + 'parameter:Total Points Granted<br>totalpoints'); + # + # assesslist holds the descriptions of all assessments + my %assesslist; + foreach ('Feedback','Evaluation','Tutoring','Discussion') { + my $symb = '_'.lc($_); + $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,$_)); } while (($_,undef) = each(%bighash)) { next if ($_!~/^src\_(\d+)\.(\d+)$/); @@ -1748,13 +1769,8 @@ sub updatestudentassesssheet { my $symb= &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); - if (! $ENV{'form.showcsv'}) { - $allassess{$symb}= - '<a href="/adm/assesscalc?usymb='.$symb.$adduserstr.'">'. - $bighash{'title_'.$id}.'</a>'; - } else { - $allassess{$symb}=$bighash{'title_'.$id}; - } + $assesslist{$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') @@ -1767,22 +1783,24 @@ sub updatestudentassesssheet { &Apache::lonnet::metadata($srcf,$key.'.name'); } $display.='<br>'.$key; - $allkeys{$key}=$display; + $parameter_labels{$key}='parameter:'.$display; } # end of foreach } } # end of foreach (keys(%bighash)) untie(%bighash); # - # %allkeys has a list of storage and parameter displays by unikey - # %allassess has a list of all resource displays by symb + # %parameter_labels has a list of storage and parameter displays by + # unikey + # %assesslist has a list of all resource, by symb # if ($stype eq 'assesscalc') { - $sheet->{'rowlabel'} = \%allkeys; + $sheet->{'rowlabel'} = \%parameter_labels; } elsif ($stype eq 'studentcalc') { - $sheet->{'rowlabel'} = \%allassess; + $sheet->{'rowlabel'} = \%assesslist; } - $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}= - join('___;___',%{$sheet->{'rowlabel'}}); + $updatedata{$sheet->{'coursefilename'}.'_'.$stype.'_' + .$uname.'_'.$udom}= + join('___;___',%{$sheet->{'rowlabel'}}); # Get current from cache } # Find discrepancies between the course row table and this @@ -1822,7 +1840,6 @@ sub updatestudentassesssheet { $sheet->{'f'} = \%f; &setformulas($sheet); } - &setrowlabels($sheet); # undef %existing; } @@ -1850,7 +1867,7 @@ sub loadstudent { my $row=$1; next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); my ($usy,$ufn)=split(/__&&&\__/,$f{$_}); - @assessdata=&exportsheet($sheet->{'uname'}, + @assessdata=&exportsheet($sheet,$sheet->{'uname'}, $sheet->{'udom'}, 'assesscalc',$usy,$ufn); my $index=0; @@ -1873,9 +1890,8 @@ sub loadstudent { $cachedassess=''; undef %cachedstores; $sheet->{'f'} = \%f; - $sheet->{'constants'} = \%c; &setformulas($sheet); - &setconstants($sheet); + &setconstants($sheet,\%c); } # --------------------------------------------------- Load data for one student @@ -1908,7 +1924,7 @@ ENDPOP next if ($_!~/^A(\d+)/); my $row=$1; next if (($f{$_}=~/^[\!\~\-]/) || ($row==0)); - my @studentdata=&exportsheet(split(/\:/,$f{$_}), + my @studentdata=&exportsheet($sheet,split(/\:/,$f{$_}), 'studentcalc'); undef %userrdatas; $now++; @@ -1935,9 +1951,8 @@ ENDPOP } } $sheet->{'f'}=\%f; - $sheet->{'constants'}=\%c; &setformulas($sheet); - &setconstants($sheet); + &setconstants($sheet,\%c); $r->print('<script>popwin.close()</script>'); $r->rflush(); } @@ -2041,28 +2056,27 @@ sub loadassessment { if (tie(%parmhash,'GDBM_File', $sheet->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) { my %f=&getformulas($sheet); - foreach (keys(%f)) { - next if ($_!~/^A/); - next if ($f{$_}=~/^[\!\~\-]/); - if ($f{$_}=~/^parameter/) { - if ($thisassess{$f{$_}}) { - my $val=&parmval($f{$_},$sheet); - $c{$_}=$val; - $c{$f{$_}}=$val; + 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); } - $sheet->{'constants'}=\%c; - &setconstants($sheet); + &setconstants($sheet,\%c); } # --------------------------------------------------------- Various form fields @@ -2154,8 +2168,14 @@ sub forcedrecalc { } # ============================================================== Export handler +# exportsheet +# returns the export row for a spreadsheet. +# sub exportsheet { - my ($uname,$udom,$stype,$usymb,$fn)=@_; + my ($sheet,$uname,$udom,$stype,$usymb,$fn)=@_; + $uname = $uname || $sheet->{'uname'}; + $udom = $udom || $sheet->{'udom'}; + $stype = $stype || $sheet->{'sheettype'}; my @exportarr=(); if (defined($usymb) && ($usymb=~/^\_(\w+)/) && (!$fn)) { $fn='default_'.$1; @@ -2174,7 +2194,7 @@ sub exportsheet { } } unless ($found) { - &cachedssheets($uname,$udom,&Apache::lonnet::homeserver($uname,$udom)); + &cachedssheets($sheet,$uname,$udom); if ($oldsheets{$key}) { foreach (split(/___&\___/,$oldsheets{$key})) { my ($name,$value)=split(/___=___/,$_); @@ -2202,29 +2222,28 @@ sub exportsheet { # # Not cached # - my ($sheet)=&makenewsheet($uname,$udom,$stype,$usymb); - &readsheet($sheet,$fn); - &updatesheet($sheet); - &loadrows($sheet); - &calcsheet($sheet); - @exportarr=&exportdata($sheet); + my ($newsheet)=&makenewsheet($uname,$udom,$stype,$usymb); + &readsheet($newsheet,$fn); + &updatesheet($newsheet); + &loadrows($newsheet); + &calcsheet($newsheet); + @exportarr=&exportdata($newsheet); # # Store now # - my $cid=$ENV{'request.course.id'}; + my $cid=$newsheet->{'cid'}; my $current=''; if ($stype eq 'studentcalc') { - $current=&Apache::lonnet::reply('get:'. - $ENV{'course.'.$cid.'.domain'}.':'. - $ENV{'course.'.$cid.'.num'}. + $current=&Apache::lonnet::reply('get:'.$sheet->{'cdom'}.':'. + $sheet->{'cnum'}. ':nohist_calculatedsheets:'. &Apache::lonnet::escape($key), - $ENV{'course.'.$cid.'.home'}); + $sheet->{'chome'}); } else { $current=&Apache::lonnet::reply('get:'.$sheet->{'udom'}.':'. $sheet->{'uname'}. ':nohist_calculatedsheets_'. - $ENV{'request.course.id'}.':'. + $sheet->{'cid'}.':'. &Apache::lonnet::escape($key), $sheet->{'uhome'}); } @@ -2247,8 +2266,7 @@ sub exportsheet { &Apache::lonnet::put('nohist_calculatedsheets', { $key => $newstore, $key.time => $now }, - $ENV{'course.'.$cid.'.domain'}, - $ENV{'course.'.$cid.'.num'}) + $sheet->{'cid'},$sheet->{'cnum'}); } else { &Apache::lonnet::put('nohist_calculatedsheets_'.$sheet->{'cid'}, { $key => $newstore, @@ -2266,17 +2284,11 @@ sub exportsheet { sub expirationdates { undef %expiredates; my $cid=$ENV{'request.course.id'}; - my $reply=&Apache::lonnet::reply('dump:'. - $ENV{'course.'.$cid.'.domain'}.':'. - $ENV{'course.'.$cid.'.num'}. - ':nohist_expirationdates', - $ENV{'course.'.$cid.'.home'}); - unless ($reply=~/^error\:/) { - foreach (split(/\&/,$reply)) { - my ($name,$value)=split(/\=/,$_); - $expiredates{&Apache::lonnet::unescape($name)} - =&Apache::lonnet::unescape($value); - } + my @tmp = &Apache::lonnet::dump('nohist_expirationdates', + $ENV{'course.'.$cid.'.domain'}, + $ENV{'course.'.$cid.'.num'}); + if (lc($tmp[0])!~/^error/){ + %expiredates = @tmp; } } @@ -2287,16 +2299,13 @@ sub expirationdates { sub cachedcsheets { my $cid=$ENV{'request.course.id'}; - my $reply=&Apache::lonnet::reply('dump:'. - $ENV{'course.'.$cid.'.domain'}.':'. - $ENV{'course.'.$cid.'.num'}. - ':nohist_calculatedsheets', - $ENV{'course.'.$cid.'.home'}); - unless ($reply=~/^error\:/) { - foreach ( split(/\&/,$reply)) { - my ($name,$value)=split(/\=/,$_); - $oldsheets{&Apache::lonnet::unescape($name)} - =&Apache::lonnet::unescape($value); + my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets', + $ENV{'course.'.$cid.'.domain'}, + $ENV{'course.'.$cid.'.num'}); + if ($tmp[0] !~ /^error/) { + my %StupidTempHash = @tmp; + while (my ($key,$value) = each %StupidTempHash) { + $oldsheets{$key} = $value; } } } @@ -2307,22 +2316,21 @@ sub cachedcsheets { # sub cachedssheets { - my ($sname,$sdom,$shome)=@_; - unless (($loadedcaches{$sname.'_'.$sdom}) || ($shome eq 'no_host')) { - my $cid=$ENV{'request.course.id'}; - my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname. - ':nohist_calculatedsheets_'. - $ENV{'request.course.id'}, - $shome); - unless ($reply=~/^error\:/) { - foreach ( split(/\&/,$reply)) { - my ($name,$value)=split(/\=/,$_); - $oldsheets{&Apache::lonnet::unescape($name)} - =&Apache::lonnet::unescape($value); + my ($sheet,$uname,$udom) = @_; + $uname = $uname || $sheet->{'uname'}; + $udom = $udom || $sheet->{'udom'}; + if (! $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}) { + my @tmp = &Apache::lonnet::dump('nohist_calculatedsheets', + $sheet->{'udom'}, + $sheet->{'uname'}); + if ($tmp[0] !~ /^error/) { + my %StupidTempHash = @tmp; + while (my ($key,$value) = each %StupidTempHash) { + $oldsheets{$key} = $value; + } + $loadedcaches{$sheet->{'uname'}.'_'.$sheet->{'udom'}}=1; } } - $loadedcaches{$sname.'_'.$sdom}=1; - } } # ===================================================== Calculated sheets cache @@ -2537,7 +2545,7 @@ ENDSCRIPT } elsif ($sheet->{'sheettype'} eq 'studentcalc') { $r->print("Loading previously calculated assessment sheets ...\n"); $r->rflush(); - &cachedssheets($sheet->{'uname'},$sheet->{'udom'},$sheet->{'uhome'}); + &cachedssheets($sheet); } # Update sheet, load rows $r->print("Loaded sheet(s), updating rows ...<br>\n"); @@ -2585,7 +2593,7 @@ ENDSCRIPT } else { unless ($ENV{'form.userselhidden'}) { unless - ($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') { + ($ENV{'course.'.$sheet->{'cid'}.'.hideemptyrows'} eq 'yes') { $r->print(' checked'); $ENV{'form.showall'}=1; }