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

matthew lon-capa-cvs@mail.lon-capa.org
Sun, 01 Sep 2002 18:06:52 -0000


This is a MIME encoded message

--matthew1030903612
Content-Type: text/plain

matthew		Sun Sep  1 14:06:52 2002 EDT

  Modified files:              
    /loncom/interface	lonspreadsheet.pm 
  Log:
  Indentation and extraordinarily minor logic changes.
  
  
--matthew1030903612
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20020901140652.txt"

Index: loncom/interface/lonspreadsheet.pm
diff -u loncom/interface/lonspreadsheet.pm:1.105 loncom/interface/lonspreadsheet.pm:1.106
--- loncom/interface/lonspreadsheet.pm:1.105	Fri Aug 30 16:56:08 2002
+++ loncom/interface/lonspreadsheet.pm	Sun Sep  1 14:06:52 2002
@@ -1,5 +1,5 @@
 #
-# $Id: lonspreadsheet.pm,v 1.105 2002/08/30 20:56:08 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.106 2002/09/01 18:06:52 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1194,14 +1194,14 @@
     my $rowdata='';
     my $dataflag=0;
     unless ($n eq '-') {
-       $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
+        $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
     } else {
-       $defaultbg='#E0FF';
+        $defaultbg='#E0FF';
     }
     unless ($ENV{'form.showcsv'}) {
-       $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>";
+        $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>";
     } else {
-       $rowdata.="\n".'"'.$n.'"';
+        $rowdata.="\n".'"'.$n.'"';
     }
     my $showf=0;
     my $proc;
@@ -1225,97 +1225,102 @@
         $dataflag=1; 
     }
     foreach ($safeeval->reval($proc.'('.$n.')')) {
-       my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
-       my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
-       if ((($vl ne '') || ($vl eq '0')) &&
-           (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; }
-       if ($showf==0) { $vl=$_; }
-      unless ($ENV{'form.showcsv'}) {
-       if ($showf<=$maxred) { $bgcolor='#FFDDDD'; }
-       if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } 
-       if (($showf>$maxred) || ((!$n) && ($showf>0))) {
-	   if ($vl eq '') {
-	       $vl='<font size=+2 color='.$bgcolor.'>&#35;</font>';
-           }
-           $rowdata.=
-       '<td bgcolor='.$bgcolor.'><a href="javascript:celledit('.$fm.');">'.$vl.
-	       '</a></td>';
-       } else {
-           $rowdata.='<td bgcolor='.$bgcolor.'>&nbsp;'.$vl.'&nbsp;</td>';
-       }
-      } else {
-	  $rowdata.=',"'.$vl.'"';
-      }
-       $showf++;
+        my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
+        my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
+        if ((($vl ne '') || ($vl eq '0')) &&
+            (($showf==1) || ($sheettype ne 'studentcalc'))) { $dataflag=1; }
+        if ($showf==0) { $vl=$_; }
+        unless ($ENV{'form.showcsv'}) {
+            if ($showf<=$maxred) { $bgcolor='#FFDDDD'; }
+            if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } 
+            if (($showf>$maxred) || ((!$n) && ($showf>0))) {
+                if ($vl eq '') {
+                    $vl='<font size=+2 color='.$bgcolor.'>&#35;</font>';
+                }
+                $rowdata.='<td bgcolor='.$bgcolor.'>'.
+                    '<a href="javascript:celledit('.$fm.');">'.$vl.'</a></td>';
+            } else {
+                $rowdata.='<td bgcolor='.$bgcolor.'>&nbsp;'.$vl.'&nbsp;</td>';
+            }
+        } else {
+            $rowdata.=',"'.$vl.'"';
+        }
+        $showf++;
     }  # End of foreach($safeval...)
     if ($ENV{'form.showall'} || ($dataflag)) {
-       return $rowdata.($ENV{'form.showcsv'}?'':'</tr>');
+        return $rowdata.($ENV{'form.showcsv'}?'':'</tr>');
     } else {
-       return '';
+        return '';
     }
 }
 
 # ------------------------------------------------------------- Print out sheet
 
 sub outsheet {
-    my ($r,$safeeval)=@_;
-    my $maxred;
-    my $realm;
-    if (&gettype($safeeval) eq 'assesscalc') {
+    my ($r,$safeeval,$sheetdata)=@_;
+    my $maxred = 26;    # The maximum number of cells to show as 
+                        # red (uneditable) 
+                        # To make student sheets uneditable could we 
+                        # set $maxred = 52?
+                        #
+    my $realm='Course'; # 'assessment', 'user', or 'course' sheet
+    if ($sheetdata->{'sheettype'} eq 'assesscalc') {
         $maxred=1;
         $realm='Assessment';
-    } elsif (&gettype($safeeval) eq 'studentcalc') {
+    } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') {
         $maxred=26;
         $realm='User';
-    } else {
-        $maxred=26;
-        $realm='Course';
     }
-    my $maxyellow=52-$maxred;
+    #
+    # Column label
     my $tabledata;
-    unless ($ENV{'form.showcsv'}) {
-       $tabledata=
-        '<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'.
-                  $realm.'</font></th>'.
+    if ($ENV{'form.showcsv'}) {
+        $tabledata='<pre>';
+    } else { 
+        $tabledata='<table border=2><tr><th colspan=2 rowspan=2>'.
+            '<font size=+2>'.$realm.'</font></th>'.
                   '<td bgcolor=#FFDDDD colspan='.$maxred.
                   '><b><font size=+1>Import</font></b></td>'.
-                  '<td colspan='.$maxyellow.
+                  '<td colspan='.(52-$maxred).
 		  '><b><font size=+1>Calculations</font></b></td></tr><tr>';
-       my $showf=0;
-       foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M',
-                'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
-                'a','b','c','d','e','f','g','h','i','j','k','l','m',
-                'n','o','p','q','r','s','t','u','v','w','x','y','z') {
-           $showf++;
-           if ($showf<=$maxred) { 
-               $tabledata.='<td bgcolor="#FFDDDD">'; 
-           } else {
-               $tabledata.='<td>';
-           }
-           $tabledata.="<b><font size=+1>$_</font></b></td>";
-       }
-       $tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0);
-   } else { $tabledata='<pre>'; }
-
+        my $showf=0;
+        foreach ('A','B','C','D','E','F','G','H','I','J','K','L','M',
+                 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+                 'a','b','c','d','e','f','g','h','i','j','k','l','m',
+                 'n','o','p','q','r','s','t','u','v','w','x','y','z') {
+            $showf++;
+            if ($showf<=$maxred) { 
+                $tabledata.='<td bgcolor="#FFDDDD">'; 
+            } else {
+                $tabledata.='<td>';
+            }
+            $tabledata.="<b><font size=+1>$_</font></b></td>";
+        }
+        $tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0);
+    }
     $r->print($tabledata);
-
+    #
+    # Prepare to output rows
     my $row;
     my $maxrow=&getmaxrow($safeeval);
-
+    #
     my @sortby=();
     my @sortidx=();
     for ($row=1;$row<=$maxrow;$row++) {
-       $sortby[$row-1]=$safeeval->reval('$f{"A'.$row.'"}');
-       $sortidx[$row-1]=$row-1;
+        push (@sortby, $safeeval->reval('$f{"A'.$row.'"}'));
+        push (@sortidx, $row-1);
     }
     @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx;
-        my $what='Student';
-        if (&gettype($safeeval) eq 'assesscalc') {
-	    $what='Item';
-	} elsif (&gettype($safeeval) eq 'studentcalc') {
-            $what='Assessment';
-        }
-
+    #
+    # Determine the type of child spreadsheets
+    my $what='Student';
+    if ($sheetdata->{'sheettype'} eq 'assesscalc') {
+        $what='Item';
+    } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') {
+        $what='Assessment';
+    }
+    #
+    # Loop through the rows and output them one at a time
     my $n=0;
     for ($row=0;$row<$maxrow;$row++) {
         my $thisrow=&rown($safeeval,$sortidx[$row]+1);
@@ -1324,9 +1329,10 @@
                 $r->print("</table>\n<br>\n");
                 $r->rflush();
                 $r->print('<table border=2><tr><td>&nbsp;<td>'.$what.'</td>');
-                $r->print('<td>'.join('</td><td>',
-                                      (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
-                                            'abcdefghijklmnopqrstuvwxyz'))).
+                $r->print('<td>'.
+                          join('</td><td>',
+                               (split(//,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
+                                      'abcdefghijklmnopqrstuvwxyz'))).
                           "</td></tr>\n");
             }
             $n++;
@@ -2436,39 +2442,45 @@
         return OK;
     }
     # Global directory configs
-    $includedir=$r->dir_config('lonIncludes');
-    $tmpdir=$r->dir_config('lonDaemons').'/tmp/';
+    $includedir = $r->dir_config('lonIncludes');
+    $tmpdir = $r->dir_config('lonDaemons').'/tmp/';
     # Needs to be in a course
-    if ($ENV{'request.course.fn'}) { 
-        # Get query string for limited number of parameters
-        &Apache::loncommon::get_unprocessed_cgi
-            ($ENV{'QUERY_STRING'},['uname','udom','usymb','ufn']);
-        if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) {
-            $ENV{'form.ufn'}='default_'.$1;
-        }
-        # Interactive loading of specific sheet?
-        if (($ENV{'form.load'}) && ($ENV{'form.loadthissheet'} ne 'Default')) {
-            $ENV{'form.ufn'}=$ENV{'form.loadthissheet'};
-        }
-        # Nothing there? Must be login user
-        my $aname;
-        my $adom;
-
-        unless ($ENV{'form.uname'}) {
-            $aname=$ENV{'user.name'};
-            $adom=$ENV{'user.domain'};
-        } else {
-            $aname=$ENV{'form.uname'};
-            $adom=$ENV{'form.udom'};
-        }
-        # Open page
-        $r->content_type('text/html');
-        $r->header_out('Cache-control','no-cache');
-        $r->header_out('Pragma','no-cache');
-        $r->send_http_header;
-        # Screen output
-        $r->print('<html><head><title>LON-CAPA Spreadsheet</title>');
-        $r->print(<<ENDSCRIPT);
+    if (! $ENV{'request.course.fn'}) { 
+        # Not in a course, or not allowed to modify parms
+        $ENV{'user.error.msg'}=
+            $r->uri.":opa:0:0:Cannot modify spreadsheet";
+        return HTTP_NOT_ACCEPTABLE; 
+    }
+    # Get query string for limited number of parameters
+    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                            ['uname','udom','usymb','ufn']);
+    if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) {
+        $ENV{'form.ufn'}='default_'.$1;
+    }
+    # Interactive loading of specific sheet?
+    if (($ENV{'form.load'}) && ($ENV{'form.loadthissheet'} ne 'Default')) {
+        $ENV{'form.ufn'}=$ENV{'form.loadthissheet'};
+    }
+    #
+    # Determine the user name and domain for the sheet.
+    my $aname;
+    my $adom;
+    unless ($ENV{'form.uname'}) {
+        $aname=$ENV{'user.name'};
+        $adom=$ENV{'user.domain'};
+    } else {
+        $aname=$ENV{'form.uname'};
+        $adom=$ENV{'form.udom'};
+    }
+    #
+    # Open page
+    $r->content_type('text/html');
+    $r->header_out('Cache-control','no-cache');
+    $r->header_out('Pragma','no-cache');
+    $r->send_http_header;
+    # Screen output
+    $r->print('<html><head><title>LON-CAPA Spreadsheet</title>');
+    $r->print(<<ENDSCRIPT);
 <script language="JavaScript">
 
     function celledit(cn,cf) {
@@ -2494,219 +2506,202 @@
 
 </script>
 ENDSCRIPT
-        $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet').
-                  '<form action="'.$r->uri.'" name=sheet method=post>'.
-                  &hiddenfield('uname',$ENV{'form.uname'}).
-                  &hiddenfield('udom',$ENV{'form.udom'}).
-                  &hiddenfield('usymb',$ENV{'form.usymb'}).
-                  &hiddenfield('unewfield','').
-                  &hiddenfield('unewformula',''));
-        # Send this out right away
-        $r->rflush();
-        # Full recalc?
-        if ($ENV{'form.forcerecalc'}) {
-            $r->print('<h4>Completely Recalculating Sheet ...</h4>');
-            undef %spreadsheets;
-            undef %courserdatas;
-            undef %userrdatas;
-            undef %defaultsheets;
-            undef %updatedata;
-        }
-        # Read new sheet or modified worksheet
-        $r->uri=~/\/(\w+)$/;
-        my ($asheet,$asheetdata)=&makenewsheet
-                                      ($aname,$adom,$1,$ENV{'form.usymb'});
-        # If a new formula had been entered, go from work copy
-        if ($ENV{'form.unewfield'}) {
-            $r->print('<h2>Modified Workcopy</h2>');
-            $ENV{'form.unewformula'}=~s/\'/\"/g;
-            $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.
-                      $ENV{'form.unewformula'}.'<p>');
-            &setfilename($asheet,$ENV{'form.ufn'});
-            &tmpread($asheet,
-                     $ENV{'form.unewfield'},$ENV{'form.unewformula'});
-            
-        } elsif ($ENV{'form.saveas'}) {
-            &setfilename($asheet,$ENV{'form.ufn'});
-            &tmpread($asheet);
+    $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet').
+              '<form action="'.$r->uri.'" name=sheet method=post>');
+    $r->print(&hiddenfield('uname',$ENV{'form.uname'}).
+              &hiddenfield('udom',$ENV{'form.udom'}).
+              &hiddenfield('usymb',$ENV{'form.usymb'}).
+              &hiddenfield('unewfield','').
+              &hiddenfield('unewformula',''));
+    $r->rflush();
+    #
+    # Full recalc?
+    if ($ENV{'form.forcerecalc'}) {
+        $r->print('<h4>Completely Recalculating Sheet ...</h4>');
+        undef %spreadsheets;
+        undef %courserdatas;
+        undef %userrdatas;
+        undef %defaultsheets;
+        undef %updatedata;
+    }
+    # Read new sheet or modified worksheet
+    $r->uri=~/\/(\w+)$/;
+    my ($asheet,$asheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});
+    #
+    # If a new formula had been entered, go from work copy
+    if ($ENV{'form.unewfield'}) {
+        $r->print('<h2>Modified Workcopy</h2>');
+        $ENV{'form.unewformula'}=~s/\'/\"/g;
+        $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.
+                  $ENV{'form.unewformula'}.'<p>');
+        &setfilename($asheet,$ENV{'form.ufn'});
+        &tmpread($asheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'});
+    } elsif ($ENV{'form.saveas'}) {
+        &setfilename($asheet,$ENV{'form.ufn'});
+        &tmpread($asheet);
+    } else {
+        &readsheet($asheet,$ENV{'form.ufn'});
+    }
+    # Print out user information
+    unless ($asheetdata->{'sheettype'} eq 'classcalc') {
+        $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}.
+                  '<br><b>Domain:</b> '.$asheetdata->{'udom'});
+        if (&getcsec($asheet) eq '-1') {
+            $r->print('<h3><font color=red>'.
+                      'Not a student in this course</font></h3>');
         } else {
-            &readsheet($asheet,$ENV{'form.ufn'});
+            $r->print('<br><b>Section/Group:</b> '.$asheetdata->{'csec'});
         }
-        # Print out user information
-        unless ($asheetdata->{'sheettype'} eq 'classcalc') {
-            $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}.
-                      '<br><b>Domain:</b> '.$asheetdata->{'udom'});
-            if (&getcsec($asheet) eq '-1') {
-                $r->print('<h3><font color=red>'.
-                          'Not a student in this course</font></h3>');
-            } else {
-                $r->print('<br><b>Section/Group:</b> '.$asheetdata->{'csec'});
+        if ($ENV{'form.usymb'}) {
+            $r->print('<br><b>Assessment:</b> <tt>'.
+                      $ENV{'form.usymb'}.'</tt>');
+        }
+    }
+    #
+    # Check user permissions
+    if (($asheetdata->{'sheettype'} eq 'classcalc'       ) || 
+        ($asheetdata->{'uname'}     ne $ENV{'user.name'} ) ||
+        ($asheetdata->{'udom'}      ne $ENV{'user.domain'})) {
+        unless (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'})) {
+            $r->print('<h1>Access Permission Denied</h1>'.
+                      '</form></body></html>');
+            return OK;
+        }
+    }
+    # Additional options
+    $r->print('<br />'.
+              '<input type="submit" name="forcerecalc" '.
+              'value="Completely Recalculate Sheet"><p>');
+    if ($asheetdata->{'sheettype'} eq 'assesscalc') {
+        $r->print('<p><font size=+2>'.
+                  '<a href="/adm/studentcalc?'.
+                  'uname='.$asheetdata->{'uname'}.
+                  '&udom='.$asheetdata->{'udom'}.'">'.
+                  'Level up: Student Sheet</a></font><p>');
+    }
+    if (($asheetdata->{'sheettype'} eq 'studentcalc') && 
+        (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'}))) {
+        $r->print ('<p><font size=+2><a href="/adm/classcalc">'.
+                   'Level up: Course Sheet</a></font><p>');
+    }
+    # Save dialog
+    if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
+        my $fname=$ENV{'form.ufn'};
+        $fname=~s/\_[^\_]+$//;
+        if ($fname eq 'default') { $fname='course_default'; }
+        $r->print('<input type=submit name=saveas value="Save as ...">'.
+                  '<input type=text size=20 name=newfn value="'.$fname.'">'.
+                  'make default: <input type=checkbox name="makedefufn"><p>');
+    }
+    $r->print(&hiddenfield('ufn',&getfilename($asheet)));
+    # Load dialog
+    if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
+        $r->print('<p><input type=submit name=load value="Load ...">'.
+                  '<select name="loadthissheet">'.
+                  '<option name="default">Default</option>');
+        foreach (&othersheets($asheet,$asheetdata->{'sheettype'})) {
+            $r->print('<option name="'.$_.'"');
+            if ($ENV{'form.ufn'} eq $_) {
+                $r->print(' selected');
             }
-            if ($ENV{'form.usymb'}) {
-                $r->print('<br><b>Assessment:</b> <tt>'.
-                          $ENV{'form.usymb'}.'</tt>');
-            }
-        }
-        # See if user can see this
-        if (($asheetdata->{'sheettype'} eq 'classcalc'       ) || 
-            ($asheetdata->{'uname'}     ne $ENV{'user.name'} ) ||
-            ($asheetdata->{'udom'}      ne $ENV{'user.domain'})) {
-            unless (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'})) {
-                $r->print('<h1>Access Permission Denied</h1>'.
-                          '</form></body></html>');
-                return OK;
-            }
-        }
-        # Additional options
-        $r->print(
- '<input type=submit name=forcerecalc value="Completely Recalculate Sheet"><p>'
-                  );
-        if ($asheetdata->{'sheettype'} eq 'assesscalc') {
-            $r->print('<p><font size=+2>'.
-                      '<a href="/adm/studentcalc?'.
-                      'uname='.$asheetdata->{'uname'}.
-                      '&udom='.$asheetdata->{'udom'}.'">'.
-                      'Level up: Student Sheet</a></font><p>');
-        }
-        if (($asheetdata->{'sheettype'} eq 'studentcalc') && 
-            (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'}))) {
-            $r->print (
-                       '<p><font size=+2><a href="/adm/classcalc">'.
-                       'Level up: Course Sheet</a></font><p>');
-        }
-        # Save dialog
-        if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
-            my $fname=$ENV{'form.ufn'};
-            $fname=~s/\_[^\_]+$//;
-            if ($fname eq 'default') { $fname='course_default'; }
-            $r->print
-                ('<input type=submit name=saveas value="Save as ...">'.
-                 '<input type=text size=20 name=newfn value="'.$fname.'">'.
-                 '(make default: <input type=checkbox name="makedefufn">)<p>');
-        }
-        $r->print(&hiddenfield('ufn',&getfilename($asheet)));
-        # Load dialog
-        if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
-            $r->print('<p><input type=submit name=load value="Load ...">'.
-                      '<select name="loadthissheet">'.
-                      '<option name="default">Default</option>');
-            foreach (&othersheets($asheet,$asheetdata->{'sheettype'})) {
-                $r->print('<option name="'.$_.'"');
-                if ($ENV{'form.ufn'} eq $_) {
-                    $r->print(' selected');
-                }
-                $r->print('>'.$_.'</option>');
-            } 
-            $r->print('</select><p>');
-            if (&gettype($asheet) eq 'studentcalc') {
-                &setothersheets($asheet,&othersheets($asheet,'assesscalc'));
-            }
-        }
-        # Cached sheets
-        &expirationdates();
-        undef %oldsheets;
-        undef %loadedcaches;
-        if ($asheetdata->{'sheettype'} eq 'classcalc') {
-            $r->print
-                ("Loading previously calculated student sheets ...<br>\n");
-            $r->rflush();
-            &cachedcsheets();
-        } elsif ($asheetdata->{'sheettype'} eq 'studentcalc') {
-            $r->print
-                ("Loading previously calculated assessment sheets ...<br>\n");
-            $r->rflush();
-            &cachedssheets($asheetdata->{'uname'},$asheetdata->{'udom'},
-                           $asheetdata->{'uhome'});
+            $r->print('>'.$_.'</option>');
+        } 
+        $r->print('</select><p>');
+        if (&gettype($asheet) eq 'studentcalc') {
+            &setothersheets($asheet,&othersheets($asheet,'assesscalc'));
         }
-        # Update sheet, load rows
-        $r->print("Loaded sheet(s), updating rows ...<br>\n");
-        $r->rflush();
-        #
-        &updatesheet($asheet,$asheetdata);
-        $r->print("Updated rows, loading row data ...<br>\n");
+    }
+    # Cached sheets
+    &expirationdates();
+    undef %oldsheets;
+    undef %loadedcaches;
+    if ($asheetdata->{'sheettype'} eq 'classcalc') {
+        $r->print("Loading previously calculated student sheets ...\n");
         $r->rflush();
-        #
-        &loadrows($asheet,$asheetdata,$r);
-        $r->print("Loaded row data, calculating sheet ...<br>\n");
+        &cachedcsheets();
+    } elsif ($asheetdata->{'sheettype'} eq 'studentcalc') {
+        $r->print("Loading previously calculated assessment sheets ...\n");
         $r->rflush();
-        #
-        my $calcoutput=&calcsheet($asheet);
-        $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>');
-        # See if something to save
-        if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
-            my $fname='';
-            if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {
-                $fname=~s/\W/\_/g;
-                if ($fname eq 'default') { $fname='course_default'; }
-                $fname.='_'.$asheetdata->{'sheettype'};
-                &setfilename($asheet,$fname);
-                $ENV{'form.ufn'}=$fname;
-                $r->print('<p>Saving spreadsheet: '.
-                          &writesheet($asheet,$ENV{'form.makedefufn'}).'<p>');
-            }
+        &cachedssheets($asheetdata->{'uname'},$asheetdata->{'udom'},
+                       $asheetdata->{'uhome'});
+    }
+    # Update sheet, load rows
+    $r->print("Loaded sheet(s), updating rows ...<br>\n");
+    $r->rflush();
+    #
+    &updatesheet($asheet,$asheetdata);
+    $r->print("Updated rows, loading row data ...\n");
+    $r->rflush();
+    #
+    &loadrows($asheet,$asheetdata,$r);
+    $r->print("Loaded row data, calculating sheet ...<br>\n");
+    $r->rflush();
+    #
+    my $calcoutput=&calcsheet($asheet);
+    $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>');
+    # See if something to save
+    if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
+        my $fname='';
+        if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {
+            $fname=~s/\W/\_/g;
+            if ($fname eq 'default') { $fname='course_default'; }
+            $fname.='_'.$asheetdata->{'sheettype'};
+            &setfilename($asheet,$fname);
+            $ENV{'form.ufn'}=$fname;
+            $r->print('<p>Saving spreadsheet: '.
+                      &writesheet($asheet,$ENV{'form.makedefufn'}).'<p>');
         }
-        #Write the modified worksheet
-
-            $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>');
-
-            &tmpwrite($asheet);
-
+    }
+    #
+    #Write the modified worksheet
+    $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>');
+    &tmpwrite($asheet);
     if ($asheetdata->{'sheettype'} eq 'studentcalc') {
-	$r->print('<br>Show rows with empty A column: ');
+        $r->print('<br>Show rows with empty A column: ');
     } else {
         $r->print('<br>Show empty rows: ');
     } 
-
+    #
     $r->print(&hiddenfield('userselhidden','true').
-             '<input type=checkbox name=showall onClick="submit()"');
-
+              '<input type="checkbox" name="showall" onClick="submit()"');
+    #
     if ($ENV{'form.showall'}) { 
-       $r->print(' checked'); 
+        $r->print(' checked'); 
     } else {
-	unless ($ENV{'form.userselhidden'}) {
-           unless 
-	($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') {
-          $r->print(' checked');
-          $ENV{'form.showall'}=1;
-           }
-       }
+        unless ($ENV{'form.userselhidden'}) {
+            unless 
+                ($ENV{'course.'.$ENV{'request.course.id'}.'.hideemptyrows'} eq 'yes') {
+                    $r->print(' checked');
+                    $ENV{'form.showall'}=1;
+                }
+        }
     }
     $r->print('>');
-
+    #
+    # CSV format checkbox (classcalc sheets only)
     if ($asheetdata->{'sheettype'} eq 'classcalc') {
-       $r->print(
-   ' Output CSV format: <input type=checkbox name=showcsv onClick="submit()"');
-       if ($ENV{'form.showcsv'}) { $r->print(' checked'); }
-       $r->print('>');
+        $r->print(' Output CSV format: <input type="checkbox" '.
+                  'name="showcsv" onClick="submit()"');
+        if ($ENV{'form.showcsv'}) { $r->print(' checked'); }
+        $r->print('>');
     }
-
-# ------------------------------------------------------------------ Insertrows
+    #
+    # Buttons to insert rows
     $r->print('&nbsp;Student Status: '.
               &Apache::lonhtmlcommon::StatusOptions
               ($ENV{'form.Status'},'sheet'));
-
-   $r->print(<<ENDINSERTBUTTONS);
+    $r->print(<<ENDINSERTBUTTONS);
 <br>
 <input type='button' onClick='insertrow("top");' 
 value='Insert Row Top'>
 <input type='button' onClick='insertrow("bottom");' 
 value='Insert Row Bottom'><br>
 ENDINSERTBUTTONS
-
-# ------------------------------------------------------------- Print out sheet
-
-    &outsheet($r,$asheet);
+    # Print out sheet
+    &outsheet($r,$asheet,$asheetdata);
     $r->print('</form></body></html>');
-
-# ------------------------------------------------------------------------ Done
-  } else {
-# ----------------------------- Not in a course, or not allowed to modify parms
-      $ENV{'user.error.msg'}=
-        $r->uri.":opa:0:0:Cannot modify spreadsheet";
-      return HTTP_NOT_ACCEPTABLE; 
-  }
+    #  Done
     return OK;
-
 }
 
 1;

--matthew1030903612--