[LON-CAPA-cvs] cvs: loncom /interface lonspreadsheet.pm

matthew lon-capa-cvs@mail.lon-capa.org
Fri, 25 Oct 2002 15:58:35 -0000


This is a MIME encoded message

--matthew1035561515
Content-Type: text/plain

matthew		Fri Oct 25 11:58:35 2002 EDT

  Modified files:              
    /loncom/interface	lonspreadsheet.pm 
  Log:
  Many minor changes.
  Never again should the message 'Bad parameter name' appear.
  A few comment changes, some minor formatting changes.
  Reworked portions of &updatestudentassesssheet.  Changed hash names from
      'allassess' to 'assesslist' and replaced 'allkeys' with 'parameter_labels'.
  Reworked some of &exportrow, more work to come.
  &expirationdates now uses lonnet::dump instead of reply.
  &cachedsheets now uses lonnet::dump instead of reply.
  
  
--matthew1035561515
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20021025115835.txt"

Index: loncom/interface/lonspreadsheet.pm
diff -u loncom/interface/lonspreadsheet.pm:1.127 loncom/interface/lonspreadsheet.pm:1.128
--- loncom/interface/lonspreadsheet.pm:1.127	Thu Oct 24 11:34:10 2002
+++ loncom/interface/lonspreadsheet.pm	Fri Oct 25 11:58:35 2002
@@ -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 @@
         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 @@
                     $returnvalue = '$c{\''.$_.'\'}';
                 }
             }
-        } else {
-            $returnvalue =  "'bad parameter name : $expression'";
         }
         return $returnvalue;
     }
@@ -1232,6 +1232,8 @@
     # 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 @@
         }
     }
     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 @@
     }
     #
     # 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 @@
 # ----------------------------------- 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<br>timestamp',
-                     'subnumber' =>
-                     'parameter:Number of Submissions<br>subnumber',
-                     'tutornumber' =>
-                     'parameter:Number of Tutor Responses<br>tutornumber',
-                     'totalpoints' =>
-                     'parameter:Total Points Granted<br>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<br>timestamp',
+             'subnumber' =>
+                 'parameter:Number of Submissions<br>subnumber',
+             'tutornumber' =>
+                 'parameter:Number of Tutor Responses<br>tutornumber',
+             'totalpoints' =>
+                 'parameter:Total Points Granted<br>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 @@
                 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 @@
                             &Apache::lonnet::metadata($srcf,$key.'.name');
                     }
                     $display.='<br>'.$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 @@
         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 @@
 	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 @@
 }
 
 # ============================================================== 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 @@
         }
     }
     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 @@
     #
     # 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 @@
         &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 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 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 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 @@
     } 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");
@@ -2598,7 +2593,7 @@
     } 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;
                 }

--matthew1035561515--