--- loncom/interface/Attic/lonspreadsheet.pm 2002/10/24 15:34:10 1.127 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/10/25 15:58:35 1.128 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.127 2002/10/24 15:34:10 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.128 2002/10/25 15:58:35 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -828,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) { @@ -838,8 +840,6 @@ sub expandnamed { $returnvalue = '$c{\''.$_.'\'}'; } } - } else { - $returnvalue = "'bad parameter name : $expression'"; } return $returnvalue; } @@ -1232,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++) { @@ -1522,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}; } @@ -1702,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) { @@ -1720,45 +1722,42 @@ sub updateclasssheet { # ----------------------------------- 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 # - # allkeys is used in the assessment sheets to provide labels + # parameter_labels is used in the assessment sheets to provide labels # for the parameters. - my %allkeys=('timestamp' => - 'parameter:Timestamp of Last Transaction
timestamp', - 'subnumber' => - 'parameter:Number of Submissions
subnumber', - 'tutornumber' => - 'parameter:Number of Tutor Responses
tutornumber', - '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 %parameter_labels= + ('timestamp' => + 'parameter:Timestamp of Last Transaction
timestamp', + 'subnumber' => + 'parameter:Number of Submissions
subnumber', + 'tutornumber' => + 'parameter:Number of Tutor Responses
tutornumber', + 'totalpoints' => + 'parameter:Total Points Granted
totalpoints'); # - # allassess holds the descriptions of all assessments - my %allassess; + # assesslist holds the descriptions of all assessments + my %assesslist; foreach ('Feedback','Evaluation','Tutoring','Discussion') { my $symb = '_'.lc($_); - $allassess{$symb} = join(':',('symb',$symb,$uname,$udom,$_)); + $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,$_)); } while (($_,undef) = each(%bighash)) { next if ($_!~/^src\_(\d+)\.(\d+)$/); @@ -1770,7 +1769,7 @@ sub updatestudentassesssheet { my $symb= &Apache::lonnet::declutter($bighash{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); - $allassess{$symb}='symb:'.&Apache::lonnet::escape($symb).':' + $assesslist{$symb}='symb:'.&Apache::lonnet::escape($symb).':' .$uname.':'.$udom.':'.$bighash{'title_'.$id}; next if ($stype ne 'assesscalc'); foreach my $key (split(/\,/, @@ -1784,22 +1783,24 @@ sub updatestudentassesssheet { &Apache::lonnet::metadata($srcf,$key.'.name'); } $display.='
'.$key; - $allkeys{$key}='parameter:'.$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 @@ -1866,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; @@ -1923,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++; @@ -2167,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; @@ -2187,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(/___=___/,$_); @@ -2215,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'}); } @@ -2260,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, @@ -2279,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; } } @@ -2300,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; } } } @@ -2320,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 @@ -2550,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 ...
\n"); @@ -2598,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; }