Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.106 and 1.117

version 1.106, 2002/09/01 18:06:52 version 1.117, 2002/10/16 16:35:42
Line 26 Line 26
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Spreadsheet/Grades Display Handler  # Spreadsheet/Grades Display Handler
 #  #
 # 11/11,11/15,11/27,12/04,12/05,12/06,12/07,  
 # 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30,  
 # 01/01/01,02/01,03/01,19/01,20/01,22/01,  
 # 03/05,03/08,03/10,03/12,03/13,03/15,03/17,  
 # 03/19,03/20,03/21,03/27,04/05,04/09,  
 # 07/09,07/14,07/21,09/01,09/10,9/11,9/12,9/13,9/14,9/17,  
 # 10/16,10/17,10/20,11/05,11/28,12/27 Gerd Kortemeyer  
 # 01/14/02 Matthew  
 # 02/04/02 Matthew  
   
 # POD required stuff:  # POD required stuff:
   
 =head1 NAME  =head1 NAME
Line 54  not the grades of their peers.  The spre Line 44  not the grades of their peers.  The spre
 offering the ability to use Perl code to manipulate data, as well as many  offering the ability to use Perl code to manipulate data, as well as many
 built-in functions.  built-in functions.
   
   
 =head2 Functions available to user of lonspreadsheet  =head2 Functions available to user of lonspreadsheet
   
 =over 4  =over 4
Line 73  use GDBM_File; Line 62  use GDBM_File;
 use HTML::TokeParser;  use HTML::TokeParser;
 use Apache::lonhtmlcommon;  use Apache::lonhtmlcommon;
 #  #
   # Caches for coursewide information 
   #
   my %Section;
   
   #
 # Caches for previously calculated spreadsheets  # Caches for previously calculated spreadsheets
 #  #
   
Line 167  $chome= ''; Line 161  $chome= '';
 $cnum = '';  $cnum = '';
 $cdom = '';  $cdom = '';
 $cid  = '';  $cid  = '';
 $cfn  = '';  $coursefilename  = '';
   
 # symb  # symb
   
Line 863  sub sett { Line 857  sub sett {
     }      }
     # Deal with the normal cells      # Deal with the normal cells
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if (($f{$_}) && ($_!~/template\_/)) {   if (exists($f{$_}) && ($_!~/template\_/)) {
             my $matches=($_=~/^$pattern(\d+)/);              my $matches=($_=~/^$pattern(\d+)/);
             if  (($matches) && ($1)) {              if  (($matches) && ($1)) {
         unless ($f{$_}=~/^\!/) {          unless ($f{$_}=~/^\!/) {
Line 1012  ENDDEFS Line 1006  ENDDEFS
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   
 sub setformulas {  sub setformulas {
     my ($safeeval,%f)=@_;      my ($safeeval,%f)=@_;
     %{$safeeval->varglob('f')}=%f;      %{$safeeval->varglob('f')}=%f;
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   
 sub setconstants {  sub setconstants {
     my ($safeeval,%c)=@_;      my ($safeeval,%c)=@_;
     %{$safeeval->varglob('c')}=%c;      %{$safeeval->varglob('c')}=%c;
 }  }
   
 # --------------------------------------------- Set names of other spreadsheets  # --------------------------------------------- Set names of other spreadsheets
   
 sub setothersheets {  sub setothersheets {
     my ($safeeval,@os)=@_;      my ($safeeval,@os)=@_;
     @{$safeeval->varglob('os')}=@os;      @{$safeeval->varglob('os')}=@os;
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   
 sub setrowlabels {  sub setrowlabels {
     my ($safeeval,%rowlabel)=@_;      my ($safeeval,%rowlabel)=@_;
     %{$safeeval->varglob('rowlabel')}=%rowlabel;      %{$safeeval->varglob('rowlabel')}=%rowlabel;
 }  }
   
 # ------------------------------------------------------- Calculate spreadsheet  # ------------------------------------------------------- Calculate spreadsheet
   
 sub calcsheet {  sub calcsheet {
     my $safeeval=shift;      my $safeeval=shift;
     return $safeeval->reval('&calc();');      return $safeeval->reval('&calc();');
 }  }
   
 # ------------------------------------------------------------------ Get values  
   
 sub getvalues {  
     my $safeeval=shift;  
     return $safeeval->reval('%sheet_values');  
 }  
   
 # ---------------------------------------------------------------- Get formulas  # ---------------------------------------------------------------- Get formulas
   
 sub getformulas {  sub getformulas {
     my $safeeval=shift;      my $safeeval=shift;
     return %{$safeeval->varglob('f')};      return %{$safeeval->varglob('f')};
 }  }
   
 # ----------------------------------------------------- Get value of $f{'A'.$n}  # ----------------------------------------------------- Get value of $f{'A'.$n}
   
 sub getfa {  sub getfa {
     my ($safeeval,$n)=@_;      my ($safeeval,$n)=@_;
     return $safeeval->reval('$f{"A'.$n.'"}');      return $safeeval->reval('$f{"A'.$n.'"}');
 }  }
   
 # -------------------------------------------------------------------- Get type  
   
 sub gettype {  
     my $safeeval=shift;  
     return $safeeval->reval('$sheettype');  
 }  
   
 # ------------------------------------------------------------------ Set maxrow  
   
 sub setmaxrow {  
     my ($safeeval,$row)=@_;  
     $safeeval->reval('$maxrow='.$row.';');  
 }  
   
 # ------------------------------------------------------------------ Get maxrow  
   
 sub getmaxrow {  
     my $safeeval=shift;  
     return $safeeval->reval('$maxrow');  
 }  
   
 # ---------------------------------------------------------------- Set filename  
   
 sub setfilename {  
     my ($safeeval,$fn)=@_;  
     $safeeval->reval('$filename="'.$fn.'";');  
 }  
   
 # ---------------------------------------------------------------- Get filename  
   
 sub getfilename {  
     my $safeeval=shift;  
     return $safeeval->reval('$filename');  
 }  
   
 # --------------------------------------------------------------- Get course ID  
   
 sub getcid {  
     my $safeeval=shift;  
     return $safeeval->reval('$cid');  
 }  
   
 # --------------------------------------------------------- Get course filename  
   
 sub getcfn {  
     my $safeeval=shift;  
     return $safeeval->reval('$cfn');  
 }  
   
 # ----------------------------------------------------------- Get course number  
   
 sub getcnum {  
     my $safeeval=shift;  
     return $safeeval->reval('$cnum');  
 }  
   
 # ------------------------------------------------------------- Get course home  
   
 sub getchome {  
     my $safeeval=shift;  
     return $safeeval->reval('$chome');  
 }  
   
 # ----------------------------------------------------------- Get course domain  
   
 sub getcdom {  
     my $safeeval=shift;  
     return $safeeval->reval('$cdom');  
 }  
   
 # ---------------------------------------------------------- Get course section  
   
 sub getcsec {  
     my $safeeval=shift;  
     return $safeeval->reval('$csec');  
 }  
   
 # --------------------------------------------------------------- Get user name  
   
 sub getuname {  
     my $safeeval=shift;  
     return $safeeval->reval('$uname');  
 }  
   
 # ------------------------------------------------------------- Get user domain  
   
 sub getudom {  
     my $safeeval=shift;  
     return $safeeval->reval('$udom');  
 }  
   
 # --------------------------------------------------------------- Get user home  
   
 sub getuhome {  
     my $safeeval=shift;  
     return $safeeval->reval('$uhome');  
 }  
   
 # -------------------------------------------------------------------- Get symb  
   
 sub getusymb {  
     my $safeeval=shift;  
     return $safeeval->reval('$usymb');  
 }  
   
 # ------------------------------------------------------------- Export of A-row  # ------------------------------------------------------------- Export of A-row
   
 sub exportdata {  sub exportdata {
     my $safeeval=shift;      my $safeeval=shift;
     return $safeeval->reval('&exportrowa()');      return $safeeval->reval('&exportrowa()');
Line 1189  sub exportdata { Line 1063  sub exportdata {
 # --------------------------------------------- Produce output row n from sheet  # --------------------------------------------- Produce output row n from sheet
   
 sub rown {  sub rown {
     my ($safeeval,$n)=@_;      my ($safeeval,$n,$sheetdata)=@_;
     my $defaultbg;      my $defaultbg;
     my $rowdata='';      my $rowdata='';
     my $dataflag=0;      my $dataflag=0;
Line 1206  sub rown { Line 1080  sub rown {
     my $showf=0;      my $showf=0;
     my $proc;      my $proc;
     my $maxred=1;      my $maxred=1;
     my $sheettype=&gettype($safeeval);      my $sheettype=$sheetdata->{'sheettype'};
     if ($sheettype eq 'studentcalc') {      if ($sheettype eq 'studentcalc') {
         $proc='&outrowassess';          $proc='&outrowassess';
         $maxred=26;          $maxred=26;
Line 1237  sub rown { Line 1111  sub rown {
                 if ($vl eq '') {                  if ($vl eq '') {
                     $vl='<font size=+2 color='.$bgcolor.'>&#35;</font>';                      $vl='<font size=+2 color='.$bgcolor.'>&#35;</font>';
                 }                  }
                 $rowdata.='<td bgcolor='.$bgcolor.'>'.                  $rowdata.='<td bgcolor='.$bgcolor.'>';
                     '<a href="javascript:celledit('.$fm.');">'.$vl.'</a></td>';                  if ($ENV{'request.role'} =~ /^st\./) {
                       $rowdata.=$vl;
                   } else {
                       $rowdata.='<a href="javascript:celledit('.$fm.');">'.
                           $vl.'</a>';
                   }
                   $rowdata.='</td>';
             } else {              } else {
                 $rowdata.='<td bgcolor='.$bgcolor.'>&nbsp;'.$vl.'&nbsp;</td>';                  $rowdata.='<td bgcolor='.$bgcolor.'>&nbsp;'.$vl.'&nbsp;</td>';
             }              }
Line 1296  sub outsheet { Line 1176  sub outsheet {
             }              }
             $tabledata.="<b><font size=+1>$_</font></b></td>";              $tabledata.="<b><font size=+1>$_</font></b></td>";
         }          }
         $tabledata.='</tr>'.&rown($safeeval,'-').&rown($safeeval,0);          $tabledata.='</tr>'.&rown($safeeval,'-',$sheetdata).
               &rown($safeeval,0,$sheetdata);
     }      }
     $r->print($tabledata);      $r->print($tabledata);
     #      #
     # Prepare to output rows      # Prepare to output rows
     my $row;      my $row;
     my $maxrow=&getmaxrow($safeeval);      my $maxrow=$sheetdata->{'maxrow'};
     #      #
     my @sortby=();      my @sortby=();
     my @sortidx=();      my @sortidx=();
Line 1310  sub outsheet { Line 1191  sub outsheet {
         push (@sortby, $safeeval->reval('$f{"A'.$row.'"}'));          push (@sortby, $safeeval->reval('$f{"A'.$row.'"}'));
         push (@sortidx, $row-1);          push (@sortidx, $row-1);
     }      }
     @sortidx=sort { $sortby[$a] cmp $sortby[$b]; } @sortidx;      @sortidx=sort { lc($sortby[$a]) cmp lc($sortby[$b]); } @sortidx;
     #      #
     # Determine the type of child spreadsheets      # Determine the type of child spreadsheets
     my $what='Student';      my $what='Student';
Line 1323  sub outsheet { Line 1204  sub outsheet {
     # Loop through the rows and output them one at a time      # Loop through the rows and output them one at a time
     my $n=0;      my $n=0;
     for ($row=0;$row<$maxrow;$row++) {      for ($row=0;$row<$maxrow;$row++) {
         my $thisrow=&rown($safeeval,$sortidx[$row]+1);          my $thisrow=&rown($safeeval,$sortidx[$row]+1,$sheetdata);
         if ($thisrow) {          if ($thisrow) {
             if (($n/25==int($n/25)) && (!$ENV{'form.showcsv'})) {              if (($n/25==int($n/25)) && (!$ENV{'form.showcsv'})) {
                 $r->print("</table>\n<br>\n");                  $r->print("</table>\n<br>\n");
Line 1346  sub outsheet { Line 1227  sub outsheet {
 # ----------------------------------------------- Read list of available sheets  # ----------------------------------------------- Read list of available sheets
 #   # 
 sub othersheets {  sub othersheets {
     my ($safeeval,$stype)=@_;      my ($safeeval,$stype,$sheetdata)=@_;
     #      #
     my $cnum  = &getcnum($safeeval);      my $cnum  = $sheetdata->{'cnum'};
     my $cdom  = &getcdom($safeeval);      my $cdom  = $sheetdata->{'cdom'};
     my $chome = &getchome($safeeval);      my $chome = $sheetdata->{'chome'};
     #      #
     my @alternatives=();      my @alternatives=();
     my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum);      my %results=&Apache::lonnet::dump($stype.'_spreadsheets',$cdom,$cnum);
Line 1393  sub parse_sheet { Line 1274  sub parse_sheet {
 #  #
 # -------------------------------------- Read spreadsheet formulas for a course  # -------------------------------------- Read spreadsheet formulas for a course
 #  #
   
 sub readsheet {  sub readsheet {
     my ($safeeval,$fn)=@_;      my ($safeeval,$sheetdata,$fn)=@_;
     my $stype = &gettype($safeeval);      #
     my $cnum  = &getcnum($safeeval);      my $stype = $sheetdata->{'sheettype'};
     my $cdom  = &getcdom($safeeval);      my $cnum  = $sheetdata->{'cnum'};
     my $chome = &getchome($safeeval);      my $cdom  = $sheetdata->{'cdom'};
       my $chome = $sheetdata->{'chome'};
       #
     if (! defined($fn)) {      if (! defined($fn)) {
         # There is no filename. Look for defaults in course and global, cache          # There is no filename. Look for defaults in course and global, cache
         unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) {          unless ($fn=$defaultsheets{$cnum.'_'.$cdom.'_'.$stype}) {
Line 1420  sub readsheet { Line 1301  sub readsheet {
         }          }
     }      }
     # $fn now has a value      # $fn now has a value
     &setfilename($safeeval,$fn);      $sheetdata->{'filename'} = $fn;
     # see if sheet is cached      # see if sheet is cached
     my $fstring='';      my $fstring='';
     if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {      if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) {
Line 1464  sub readsheet { Line 1345  sub readsheet {
 }  }
   
 # -------------------------------------------------------- Make new spreadsheet  # -------------------------------------------------------- Make new spreadsheet
   
 sub makenewsheet {  sub makenewsheet {
     my ($uname,$udom,$stype,$usymb)=@_;      my ($uname,$udom,$stype,$usymb)=@_;
     my %sheetdata=();      my %sheetdata=();
Line 1473  sub makenewsheet { Line 1353  sub makenewsheet {
     $sheetdata{'sheettype'} = $stype;      $sheetdata{'sheettype'} = $stype;
     $sheetdata{'usymb'} = $usymb;      $sheetdata{'usymb'} = $usymb;
     $sheetdata{'cid'}   = $ENV{'request.course.id'};      $sheetdata{'cid'}   = $ENV{'request.course.id'};
     $sheetdata{'csec'}  = &Apache::lonnet::usection      $sheetdata{'csec'}  = $Section{$uname.':'.$udom};
                                ($udom,$uname,$ENV{'request.course.id'});      $sheetdata{'coursefilename'}   = $ENV{'request.course.fn'};
     $sheetdata{'cfn'}   = $ENV{'request.course.fn'};  
     $sheetdata{'cnum'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};      $sheetdata{'cnum'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.num'};
     $sheetdata{'cdom'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};      $sheetdata{'cdom'}  = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'};
     $sheetdata{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};      $sheetdata{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'};
     $sheetdata{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);      $sheetdata{'uhome'} = &Apache::lonnet::homeserver($uname,$udom);
           
     my $safeeval=initsheet($stype);      my $safeeval=initsheet($stype);
       #
       # Place all the %sheetdata items into the safe space
     my $initstring = '';      my $initstring = '';
     foreach (keys(%sheetdata)) {      foreach (keys(%sheetdata)) {
         $initstring.= qq{\$$_="$sheetdata{$_}";};          $initstring.= qq{\$$_="$sheetdata{$_}";};
Line 1491  sub makenewsheet { Line 1372  sub makenewsheet {
 }  }
   
 # ------------------------------------------------------------ Save spreadsheet  # ------------------------------------------------------------ Save spreadsheet
   
 sub writesheet {  sub writesheet {
     my ($safeeval,$makedef)=@_;      my ($safeeval,$makedef,$sheetdata)=@_;
     my $cid=&getcid($safeeval);      my $cid=$sheetdata->{'cid'};
     if (&Apache::lonnet::allowed('opa',$cid)) {      if (&Apache::lonnet::allowed('opa',$cid)) {
         my %f=&getformulas($safeeval);          my %f=&getformulas($safeeval);
         my $stype=&gettype($safeeval);          my $stype= $sheetdata->{'sheettype'};
         my $cnum=&getcnum($safeeval);          my $cnum = $sheetdata->{'cnum'};
         my $cdom=&getcdom($safeeval);          my $cdom = $sheetdata->{'cdom'};
         my $chome=&getchome($safeeval);          my $chome= $sheetdata->{'chome'};
         my $fn=&getfilename($safeeval);          my $fn   = $sheetdata->{'filename'};
         # Cache new sheet          # Cache new sheet
         $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);          $spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f);
         # Write sheet          # Write sheet
Line 1543  sub writesheet { Line 1423  sub writesheet {
 # ----------------------------------------------- Make a temp copy of the sheet  # ----------------------------------------------- Make a temp copy of the sheet
 # "Modified workcopy" - interactive only  # "Modified workcopy" - interactive only
 #  #
   
 sub tmpwrite {  sub tmpwrite {
     my $safeeval=shift;      my ($safeeval,$sheetdata) = @_;
     my $fn=$ENV{'user.name'}.'_'.      my $fn=$ENV{'user.name'}.'_'.
         $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'.          $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'.
            &getfilename($safeeval);             $sheetdata->{'filename'};
     $fn=~s/\W/\_/g;      $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';      $fn=$tmpdir.$fn.'.tmp';
     my $fh;      my $fh;
Line 1558  sub tmpwrite { Line 1437  sub tmpwrite {
 }  }
   
 # ---------------------------------------------------------- Read the temp copy  # ---------------------------------------------------------- Read the temp copy
   
 sub tmpread {  sub tmpread {
     my ($safeeval,$nfield,$nform)=@_;      my ($safeeval,$sheetdata,$nfield,$nform)=@_;
     my $fn=$ENV{'user.name'}.'_'.      my $fn=$ENV{'user.name'}.'_'.
            $ENV{'user.domain'}.'_spreadsheet_'.&getusymb($safeeval).'_'.             $ENV{'user.domain'}.'_spreadsheet_'.$sheetdata->{'usymb'}.'_'.
            &getfilename($safeeval);             $sheetdata->{'filename'};
     $fn=~s/\W/\_/g;      $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';      $fn=$tmpdir.$fn.'.tmp';
     my $fh;      my $fh;
Line 1655  sub parmval { Line 1533  sub parmval {
     my $courselevelr = $usercourseprefix.'.'.$symbparm;      my $courselevelr = $usercourseprefix.'.'.$symbparm;
     my $courselevelm = $usercourseprefix.'.'.$mapparm;      my $courselevelm = $usercourseprefix.'.'.$mapparm;
     # fourth, check user      # fourth, check user
     if ($uname) {       if (defined($uname)) {
         return $useropt{$courselevelr} if ($useropt{$courselevelr});          return $useropt{$courselevelr} if (defined($useropt{$courselevelr}));
         return $useropt{$courselevelm} if ($useropt{$courselevelm});          return $useropt{$courselevelm} if (defined($useropt{$courselevelm}));
         return $useropt{$courselevel}  if ($useropt{$courselevel});          return $useropt{$courselevel}  if (defined($useropt{$courselevel}));
     }      }
     # third, check course      # third, check course
     if ($csec) {      if (defined($csec)) {
         return $courseopt{$seclevelr} if ($courseopt{$seclevelr});          return $courseopt{$seclevelr} if (defined($courseopt{$seclevelr}));
         return $courseopt{$seclevelm} if ($courseopt{$seclevelm});          return $courseopt{$seclevelm} if (defined($courseopt{$seclevelm}));
         return $courseopt{$seclevel}  if ($courseopt{$seclevel});          return $courseopt{$seclevel}  if (defined($courseopt{$seclevel}));
     }      }
     #      #
     return $courseopt{$courselevelr} if ($courseopt{$courselevelr});      return $courseopt{$courselevelr} if (defined($courseopt{$courselevelr}));
     return $courseopt{$courselevelm} if ($courseopt{$courselevelm});      return $courseopt{$courselevelm} if (defined($courseopt{$courselevelm}));
     return $courseopt{$courselevel}  if ($courseopt{$courselevel});      return $courseopt{$courselevel}  if (defined($courseopt{$courselevel}));
     # second, check map parms      # second, check map parms
     my $thisparm = $parmhash{$symbparm};      my $thisparm = $parmhash{$symbparm};
     return $thisparm if ($thisparm);      return $thisparm if (defined($thisparm));
     # first, check default      # first, check default
     return &Apache::lonnet::metadata($fn,$rwhat.'.default');      return &Apache::lonnet::metadata($fn,$rwhat.'.default');
 }  }
   
 # ---------------------------------------------- Update rows for course listing  # ---------------------------------------------- Update rows for course listing
 sub updateclasssheet {  sub updateclasssheet {
     my $safeeval=shift;      my ($safeeval,$sheetdata) = @_;
     my $cnum=&getcnum($safeeval);      my $cnum  =$sheetdata->{'cnum'};
     my $cdom=&getcdom($safeeval);      my $cdom  =$sheetdata->{'cdom'};
     my $cid=&getcid($safeeval);      my $cid   =$sheetdata->{'cid'};
     my $chome=&getchome($safeeval);      my $chome =$sheetdata->{'chome'};
       #
       %Section = ();
   
     #      #
     # Read class list and row labels      # Read class list and row labels
     my %classlist;      my %classlist;
Line 1708  sub updateclasssheet { Line 1589  sub updateclasssheet {
             my ($studentName,$studentDomain)=split(/\:/,$student);              my ($studentName,$studentDomain)=split(/\:/,$student);
             my $studentSection=&Apache::lonnet::usection($studentDomain,              my $studentSection=&Apache::lonnet::usection($studentDomain,
                                                          $studentName,$cid);                                                           $studentName,$cid);
             if ($studentSection==-1) {              $Section{$studentName.':'.$studentDomain} = $studentSection;
                 unless ($ENV{'form.showcsv'}) {  #            if ($studentSection==-1) {
                     $rowlabel='<font color=red>Data not available: '.  #                unless ($ENV{'form.showcsv'}) {
                         $studentName.'</font>';  #                    $rowlabel='<font color=red>Data not available: '.
                 } else {  #                        $studentName.'</font>';
                     $rowlabel='ERROR","'.$studentName.  #                } else {
                         '","Data not available","","","';  #                    $rowlabel='ERROR","'.$studentName.
                 }  #                        '","Data not available","","","';
             } else {  #                }
   #            } else {
                 my %reply=&Apache::lonnet::idrget($studentDomain,$studentName);                  my %reply=&Apache::lonnet::idrget($studentDomain,$studentName);
                 my %studentInformation=&Apache::lonnet::get                  my %studentInformation=&Apache::lonnet::get
                     ('environment',                      ('environment',
Line 1741  sub updateclasssheet { Line 1623  sub updateclasssheet {
                                          $studentInformation{'generation'})                                           $studentInformation{'generation'})
                                         ).'"';                                          ).'"';
                 }                  }
             }   #           }
             $currentlist{$student}=$rowlabel;              $currentlist{$student}=$rowlabel;
         } # end of if ($active)          } # end of if ($active)
     } # end of foreach my $student (keys(%classlist))      } # end of foreach my $student (keys(%classlist))
Line 1777  sub updateclasssheet { Line 1659  sub updateclasssheet {
     }      }
     if ($changed) { &setformulas($safeeval,%f); }      if ($changed) { &setformulas($safeeval,%f); }
     #      #
     &setmaxrow($safeeval,$maxrow);      $sheetdata->{'maxrow'} = $maxrow;
     &setrowlabels($safeeval,%currentlist);      &setrowlabels($safeeval,%currentlist);
 }  }
   
 # ----------------------------------- Update rows for student and assess sheets  # ----------------------------------- Update rows for student and assess sheets
 sub updatestudentassesssheet {  sub updatestudentassesssheet {
     my $safeeval=shift;      my ($safeeval,$sheetdata) = @_;
     my %bighash;      my %bighash;
     my $stype=&gettype($safeeval);      my $stype=$sheetdata->{'sheettype'};
       my $uname=$sheetdata->{'uname'};
       my $udom =$sheetdata->{'udom'};
     my %current=();      my %current=();
     if  ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) {      if  ($updatedata
            {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) {
         %current=split(/\_\_\_\;\_\_\_/,          %current=split(/\_\_\_\;\_\_\_/,
        $updatedata{$ENV{'request.course.fn'}.'_'.$stype});                         $updatedata{$ENV{'request.course.fn'}.
                                          '_'.$stype.'_'.$uname.'_'.$udom});
     } else {      } else {
         # Tie hash          # Tie hash
         tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',          tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
Line 1807  sub updatestudentassesssheet { Line 1693  sub updatestudentassesssheet {
                      'totalpoints' =>                       'totalpoints' =>
                      'Total Points Granted<br>totalpoints');                       'Total Points Granted<br>totalpoints');
         my $adduserstr='';          my $adduserstr='';
         if ((&getuname($safeeval) ne $ENV{'user.name'}) ||          if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){
             (&getudom($safeeval) ne $ENV{'user.domain'})) {              $adduserstr='&uname='.$uname.'&udom='.$udom;
             $adduserstr='&uname='.&getuname($safeeval).  
                 '&udom='.&getudom($safeeval);  
         }          }
         my %allassess =          my %allassess =
             ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.              ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.
Line 1822  sub updatestudentassesssheet { Line 1706  sub updatestudentassesssheet {
              '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'.               '_discussion' =>'<a href="/adm/assesscalc?usymb=_discussion'.
              $adduserstr.'">Discussion</a>'               $adduserstr.'">Discussion</a>'
              );               );
         foreach (keys(%bighash)) {          while (($_,undef) = each(%bighash)) {
             next if ($_!~/^src\_(\d+)\.(\d+)$/);              next if ($_!~/^src\_(\d+)\.(\d+)$/);
             my $mapid=$1;              my $mapid=$1;
             my $resid=$2;              my $resid=$2;
Line 1861  sub updatestudentassesssheet { Line 1745  sub updatestudentassesssheet {
         } elsif ($stype eq 'studentcalc') {          } elsif ($stype eq 'studentcalc') {
             %current=%allassess;              %current=%allassess;
         }          }
         $updatedata{$ENV{'request.course.fn'}.'_'.$stype}=          $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}=
             join('___;___',%current);              join('___;___',%current);
         # Get current from cache          # Get current from cache
     }      }
Line 1896  sub updatestudentassesssheet { Line 1780  sub updatestudentassesssheet {
         }          }
     }      }
     if ($changed) { &setformulas($safeeval,%f); }      if ($changed) { &setformulas($safeeval,%f); }
     &setmaxrow($safeeval,$maxrow);      $sheetdata->{'maxrow'} = $maxrow;
     &setrowlabels($safeeval,%current);      &setrowlabels($safeeval,%current);
     #      #
     undef %current;      undef %current;
Line 1953  sub loadstudent { Line 1837  sub loadstudent {
 }  }
   
 # --------------------------------------------------- Load data for one student  # --------------------------------------------------- Load data for one student
   #
 sub loadcourse {  sub loadcourse {
     my ($safeeval,$sheetdata,$r)=@_;      my ($safeeval,$sheetdata,$r)=@_;
     my %c=();      my %c=();
Line 2015  ENDPOP Line 1899  ENDPOP
 }  }
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
   #
 sub loadassessment {  sub loadassessment {
     my ($safeeval,$sheetdata)=@_;      my ($safeeval,$sheetdata)=@_;
   
Line 2047  sub loadassessment { Line 1931  sub loadassessment {
         #          #
         # restore individual          # restore individual
         #          #
         my $answer=&Apache::lonnet::reply(          %returnhash = &Apache::lonnet::restore($symb,$namespace,$udom,$uname);
                                           "restore:$udom:$uname:".          for (my $version=1;$version<=$returnhash{'version'};$version++) {
                                           &Apache::lonnet::escape($namespace).":".  
                                           &Apache::lonnet::escape($symb),$uhome);  
         foreach (split(/\&/,$answer)) {  
             my ($name,$value)=split(/\=/,$_);  
             $returnhash{&Apache::lonnet::unescape($name)}=  
                 &Apache::lonnet::unescape($value);  
         }  
         my $version;  
         for ($version=1;$version<=$returnhash{'version'};$version++) {  
             foreach (split(/\:/,$returnhash{$version.':keys'})) {              foreach (split(/\:/,$returnhash{$version.':keys'})) {
                 $returnhash{$_}=$returnhash{$version.':'.$_};                  $returnhash{$_}=$returnhash{$version.':'.$_};
             }               } 
         }          }
     }      }
       #
     # returnhash now has all stores for this resource      # returnhash now has all stores for this resource
     # convert all "_" to "." to be able to use libraries, multiparts, etc      # convert all "_" to "." to be able to use libraries, multiparts, etc
       #
       # This is dumb.  It is also necessary :(
     my @oldkeys=keys %returnhash;      my @oldkeys=keys %returnhash;
       #
     foreach (@oldkeys) {      foreach my $name (@oldkeys) {
         my $name=$_;          my $value=$returnhash{$name};
         my $value=$returnhash{$_};          delete $returnhash{$name};
         delete $returnhash{$_};  
         $name=~s/\_/\./g;          $name=~s/\_/\./g;
         $returnhash{$name}=$value;          $returnhash{$name}=$value;
     }      }
Line 2079  sub loadassessment { Line 1956  sub loadassessment {
     undef %useropt;      undef %useropt;
   
     my $userprefix=$uname.'_'.$udom.'_';      my $userprefix=$uname.'_'.$udom.'_';
       
     unless ($uhome eq 'no_host') {       unless ($uhome eq 'no_host') { 
         # Get coursedata          # Get coursedata
         unless ((time-$courserdatas{$cid.'.last_cache'})<240) {          unless ((time-$courserdatas{$cid.'.last_cache'})<240) {
             my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.              my %Tmp = &Apache::lonnet::dump('resourcedata',$cdom,$cnum);
                                              ':resourcedata',$chome);              $courserdatas{$cid}=\%Tmp;
             if ($reply!~/^error\:/) {              $courserdatas{$cid.'.last_cache'}=time;
                 $courserdatas{$cid}=$reply;  
                 $courserdatas{$cid.'.last_cache'}=time;  
             }  
         }          }
         foreach (split(/\&/,$courserdatas{$cid})) {          while (my ($name,$value) = each(%{$courserdatas{$cid}})) {
             my ($name,$value)=split(/\=/,$_);              $courseopt{$userprefix.$name}=$value;
             $courseopt{$userprefix.&Apache::lonnet::unescape($name)}=  
                 &Apache::lonnet::unescape($value);    
         }          }
         # Get userdata (if present)          # Get userdata (if present)
         unless          unless ((time-$userrdatas{$uname.'@'.$udom.'.last_cache'})<240) {
             ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {              my %Tmp = &Apache::lonnet::dump('resourcedata',$udom,$uname);
                 my $reply=              $userrdatas{$cid} = \%Tmp;
                     &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);              # Most of the time the user does not have a 'resourcedata.db' 
                 if ($reply!~/^error\:/) {              # file.  We need to cache that we got nothing instead of bothering
                     $userrdatas{$uname.'___'.$udom}=$reply;              # with requesting it every time.
                     $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;              $userrdatas{$uname.'@'.$udom.'.last_cache'}=time;
                 }          }
             }          while (my ($name,$value) = each(%{$userrdatas{$cid}})) {
         foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {              $useropt{$userprefix.$name}=$value;
             my ($name,$value)=split(/\=/,$_);  
             $useropt{$userprefix.&Apache::lonnet::unescape($name)}=  
                 &Apache::lonnet::unescape($value);  
         }          }
     }      }
     # now courseopt, useropt initialized for this user and course      # now courseopt, useropt initialized for this user and course
Line 2126  sub loadassessment { Line 1995  sub loadassessment {
     #      #
     my %c=();      my %c=();
     if (tie(%parmhash,'GDBM_File',      if (tie(%parmhash,'GDBM_File',
             &getcfn($safeeval).'_parms.db',&GDBM_READER(),0640)) {              $sheetdata->{'coursefilename'}.'_parms.db',&GDBM_READER(),0640)) {
         my %f=&getformulas($safeeval);          my %f=&getformulas($safeeval);
         foreach (keys(%f))  {          foreach (keys(%f))  {
             next if ($_!~/^A/);              next if ($_!~/^A/);
Line 2184  sub updatesheet { Line 2053  sub updatesheet {
     my ($safeeval,$sheetdata)=@_;      my ($safeeval,$sheetdata)=@_;
     my $stype=$sheetdata->{'sheettype'};      my $stype=$sheetdata->{'sheettype'};
     if ($stype eq 'classcalc') {      if ($stype eq 'classcalc') {
  return &updateclasssheet($safeeval);   return &updateclasssheet($safeeval,$sheetdata);
     } else {      } else {
         return &updatestudentassesssheet($safeeval);          return &updatestudentassesssheet($safeeval,$sheetdata);
     }      }
 }  }
   
Line 2292  sub exportsheet { Line 2161  sub exportsheet {
         # Not cached          # Not cached
         #                  #        
         my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb);          my ($thissheet,$sheetdata)=&makenewsheet($uname,$udom,$stype,$usymb);
         &readsheet($thissheet,$fn);          &readsheet($thissheet,$sheetdata,$fn);
         &updatesheet($thissheet,$sheetdata);          &updatesheet($thissheet,$sheetdata);
         &loadrows($thissheet,$sheetdata);          &loadrows($thissheet,$sheetdata);
         &calcsheet($thissheet,$sheetdata);           &calcsheet($thissheet); 
         @exportarr=&exportdata($thissheet,$sheetdata);          @exportarr=&exportdata($thissheet);
         #          #
         # Store now          # Store now
         #          #
Line 2432  sub cachedssheets { Line 2301  sub cachedssheets {
 # Interactive call to screen  # Interactive call to screen
 #  #
 #  #
   
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
       # Check this server
       my $loaderror=&Apache::lonnet::overloaderror($r);
       if ($loaderror) { return $loaderror; }
       # Check the course homeserver
       $loaderror= &Apache::lonnet::overloaderror($r,
                         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
       if ($loaderror) { return $loaderror; } 
       
     if ($r->header_only) {      if ($r->header_only) {
         $r->content_type('text/html');          $r->content_type('text/html');
         $r->send_http_header;          $r->send_http_header;
Line 2454  sub handler { Line 2330  sub handler {
     # Get query string for limited number of parameters      # Get query string for limited number of parameters
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                             ['uname','udom','usymb','ufn']);                                              ['uname','udom','usymb','ufn']);
       if ($ENV{'request.role'} =~ /^st\./) {
           delete $ENV{'form.unewfield'}   if (exists($ENV{'form.unewfield'}));
           delete $ENV{'form.unewformula'} if (exists($ENV{'form.unewformula'}));
       }
     if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) {      if (($ENV{'form.usymb'}=~/^\_(\w+)/) && (!$ENV{'form.ufn'})) {
         $ENV{'form.ufn'}='default_'.$1;          $ENV{'form.ufn'}='default_'.$1;
     }      }
Line 2480  sub handler { Line 2360  sub handler {
     $r->send_http_header;      $r->send_http_header;
     # Screen output      # Screen output
     $r->print('<html><head><title>LON-CAPA Spreadsheet</title>');      $r->print('<html><head><title>LON-CAPA Spreadsheet</title>');
     $r->print(<<ENDSCRIPT);      if ($ENV{'request.role'} !~ /^st\./) {
           $r->print(<<ENDSCRIPT);
 <script language="JavaScript">  <script language="JavaScript">
   
     function celledit(cn,cf) {      function celledit(cn,cf) {
Line 2506  sub handler { Line 2387  sub handler {
   
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
       }
     $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet').      $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet').
               '<form action="'.$r->uri.'" name=sheet method=post>');                '<form action="'.$r->uri.'" name=sheet method=post>');
     $r->print(&hiddenfield('uname',$ENV{'form.uname'}).      $r->print(&hiddenfield('uname',$ENV{'form.uname'}).
Line 2526  ENDSCRIPT Line 2408  ENDSCRIPT
     }      }
     # Read new sheet or modified worksheet      # Read new sheet or modified worksheet
     $r->uri=~/\/(\w+)$/;      $r->uri=~/\/(\w+)$/;
     my ($asheet,$asheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});      my ($sheet,$sheetdata)=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});
     #      #
     # If a new formula had been entered, go from work copy      # If a new formula had been entered, go from work copy
     if ($ENV{'form.unewfield'}) {      if ($ENV{'form.unewfield'}) {
Line 2534  ENDSCRIPT Line 2416  ENDSCRIPT
         $ENV{'form.unewformula'}=~s/\'/\"/g;          $ENV{'form.unewformula'}=~s/\'/\"/g;
         $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.          $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.
                   $ENV{'form.unewformula'}.'<p>');                    $ENV{'form.unewformula'}.'<p>');
         &setfilename($asheet,$ENV{'form.ufn'});          $sheetdata->{'filename'} = $ENV{'form.ufn'};
         &tmpread($asheet,$ENV{'form.unewfield'},$ENV{'form.unewformula'});          &tmpread($sheet,$sheetdata,
                    $ENV{'form.unewfield'},$ENV{'form.unewformula'});
     } elsif ($ENV{'form.saveas'}) {      } elsif ($ENV{'form.saveas'}) {
         &setfilename($asheet,$ENV{'form.ufn'});          $sheetdata->{'filename'} = $ENV{'form.ufn'};
         &tmpread($asheet);          &tmpread($sheet,$sheetdata);
     } else {      } else {
         &readsheet($asheet,$ENV{'form.ufn'});          &readsheet($sheet,$sheetdata,$ENV{'form.ufn'});
     }      }
     # Print out user information      # Print out user information
     unless ($asheetdata->{'sheettype'} eq 'classcalc') {      unless ($sheetdata->{'sheettype'} eq 'classcalc') {
         $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}.          $r->print('<p><b>User:</b> '.$sheetdata->{'uname'}.
                   '<br><b>Domain:</b> '.$asheetdata->{'udom'});                    '<br><b>Domain:</b> '.$sheetdata->{'udom'});
         if (&getcsec($asheet) eq '-1') {          $r->print('<br><b>Section/Group:</b> '.$sheetdata->{'csec'});
             $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'}) {          if ($ENV{'form.usymb'}) {
             $r->print('<br><b>Assessment:</b> <tt>'.              $r->print('<br><b>Assessment:</b> <tt>'.
                       $ENV{'form.usymb'}.'</tt>');                        $ENV{'form.usymb'}.'</tt>');
Line 2559  ENDSCRIPT Line 2437  ENDSCRIPT
     }      }
     #      #
     # Check user permissions      # Check user permissions
     if (($asheetdata->{'sheettype'} eq 'classcalc'       ) ||       if (($sheetdata->{'sheettype'} eq 'classcalc'       ) || 
         ($asheetdata->{'uname'}     ne $ENV{'user.name'} ) ||          ($sheetdata->{'uname'}     ne $ENV{'user.name'} ) ||
         ($asheetdata->{'udom'}      ne $ENV{'user.domain'})) {          ($sheetdata->{'udom'}      ne $ENV{'user.domain'})) {
         unless (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'})) {          unless (&Apache::lonnet::allowed('vgr',$sheetdata->{'cid'})) {
             $r->print('<h1>Access Permission Denied</h1>'.              $r->print('<h1>Access Permission Denied</h1>'.
                       '</form></body></html>');                        '</form></body></html>');
             return OK;              return OK;
Line 2572  ENDSCRIPT Line 2450  ENDSCRIPT
     $r->print('<br />'.      $r->print('<br />'.
               '<input type="submit" name="forcerecalc" '.                '<input type="submit" name="forcerecalc" '.
               'value="Completely Recalculate Sheet"><p>');                'value="Completely Recalculate Sheet"><p>');
     if ($asheetdata->{'sheettype'} eq 'assesscalc') {      if ($sheetdata->{'sheettype'} eq 'assesscalc') {
         $r->print('<p><font size=+2>'.          $r->print('<p><font size=+2>'.
                   '<a href="/adm/studentcalc?'.                    '<a href="/adm/studentcalc?'.
                   'uname='.$asheetdata->{'uname'}.                    'uname='.$sheetdata->{'uname'}.
                   '&udom='.$asheetdata->{'udom'}.'">'.                    '&udom='.$sheetdata->{'udom'}.'">'.
                   'Level up: Student Sheet</a></font><p>');                    'Level up: Student Sheet</a></font><p>');
     }      }
     if (($asheetdata->{'sheettype'} eq 'studentcalc') &&       if (($sheetdata->{'sheettype'} eq 'studentcalc') && 
         (&Apache::lonnet::allowed('vgr',$asheetdata->{'cid'}))) {          (&Apache::lonnet::allowed('vgr',$sheetdata->{'cid'}))) {
         $r->print ('<p><font size=+2><a href="/adm/classcalc">'.          $r->print ('<p><font size=+2><a href="/adm/classcalc">'.
                    'Level up: Course Sheet</a></font><p>');                     'Level up: Course Sheet</a></font><p>');
     }      }
Line 2593  ENDSCRIPT Line 2471  ENDSCRIPT
                   '<input type=text size=20 name=newfn value="'.$fname.'">'.                    '<input type=text size=20 name=newfn value="'.$fname.'">'.
                   'make default: <input type=checkbox name="makedefufn"><p>');                    'make default: <input type=checkbox name="makedefufn"><p>');
     }      }
     $r->print(&hiddenfield('ufn',&getfilename($asheet)));      $r->print(&hiddenfield('ufn',$sheetdata->{'filename'}));
     # Load dialog      # Load dialog
     if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
         $r->print('<p><input type=submit name=load value="Load ...">'.          $r->print('<p><input type=submit name=load value="Load ...">'.
                   '<select name="loadthissheet">'.                    '<select name="loadthissheet">'.
                   '<option name="default">Default</option>');                    '<option name="default">Default</option>');
         foreach (&othersheets($asheet,$asheetdata->{'sheettype'})) {          foreach (&othersheets($sheet,$sheetdata->{'sheettype'},$sheetdata)) {
             $r->print('<option name="'.$_.'"');              $r->print('<option name="'.$_.'"');
             if ($ENV{'form.ufn'} eq $_) {              if ($ENV{'form.ufn'} eq $_) {
                 $r->print(' selected');                  $r->print(' selected');
Line 2607  ENDSCRIPT Line 2485  ENDSCRIPT
             $r->print('>'.$_.'</option>');              $r->print('>'.$_.'</option>');
         }           } 
         $r->print('</select><p>');          $r->print('</select><p>');
         if (&gettype($asheet) eq 'studentcalc') {          if ($sheetdata->{'sheettype'} eq 'studentcalc') {
             &setothersheets($asheet,&othersheets($asheet,'assesscalc'));              &setothersheets($sheet,
                               &othersheets($sheet,'assesscalc',$sheetdata));
         }          }
     }      }
     # Cached sheets      # Cached sheets
     &expirationdates();      &expirationdates();
     undef %oldsheets;      undef %oldsheets;
     undef %loadedcaches;      undef %loadedcaches;
     if ($asheetdata->{'sheettype'} eq 'classcalc') {      if ($sheetdata->{'sheettype'} eq 'classcalc') {
         $r->print("Loading previously calculated student sheets ...\n");          $r->print("Loading previously calculated student sheets ...\n");
         $r->rflush();          $r->rflush();
         &cachedcsheets();          &cachedcsheets();
     } elsif ($asheetdata->{'sheettype'} eq 'studentcalc') {      } elsif ($sheetdata->{'sheettype'} eq 'studentcalc') {
         $r->print("Loading previously calculated assessment sheets ...\n");          $r->print("Loading previously calculated assessment sheets ...\n");
         $r->rflush();          $r->rflush();
         &cachedssheets($asheetdata->{'uname'},$asheetdata->{'udom'},          &cachedssheets($sheetdata->{'uname'},$sheetdata->{'udom'},
                        $asheetdata->{'uhome'});                         $sheetdata->{'uhome'});
     }      }
     # Update sheet, load rows      # Update sheet, load rows
     $r->print("Loaded sheet(s), updating rows ...<br>\n");      $r->print("Loaded sheet(s), updating rows ...<br>\n");
     $r->rflush();      $r->rflush();
     #      #
     &updatesheet($asheet,$asheetdata);      &updatesheet($sheet,$sheetdata);
     $r->print("Updated rows, loading row data ...\n");      $r->print("Updated rows, loading row data ...\n");
     $r->rflush();      $r->rflush();
     #      #
     &loadrows($asheet,$asheetdata,$r);      &loadrows($sheet,$sheetdata,$r);
     $r->print("Loaded row data, calculating sheet ...<br>\n");      $r->print("Loaded row data, calculating sheet ...<br>\n");
     $r->rflush();      $r->rflush();
     #      #
     my $calcoutput=&calcsheet($asheet);      my $calcoutput=&calcsheet($sheet);
     $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>');      $r->print('<h3><font color=red>'.$calcoutput.'</h3></font>');
     # See if something to save      # See if something to save
     if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
Line 2645  ENDSCRIPT Line 2524  ENDSCRIPT
         if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {          if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {
             $fname=~s/\W/\_/g;              $fname=~s/\W/\_/g;
             if ($fname eq 'default') { $fname='course_default'; }              if ($fname eq 'default') { $fname='course_default'; }
             $fname.='_'.$asheetdata->{'sheettype'};              $fname.='_'.$sheetdata->{'sheettype'};
             &setfilename($asheet,$fname);              $sheetdata->{'filename'} = $fname;
             $ENV{'form.ufn'}=$fname;              $ENV{'form.ufn'}=$fname;
             $r->print('<p>Saving spreadsheet: '.              $r->print('<p>Saving spreadsheet: '.
                       &writesheet($asheet,$ENV{'form.makedefufn'}).'<p>');                        &writesheet($sheet,$ENV{'form.makedefufn'},$sheetdata).
                         '<p>');
         }          }
     }      }
     #      #
     #Write the modified worksheet      # Write the modified worksheet
     $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>');      $r->print('<b>Current sheet:</b> '.$sheetdata->{'filename'}.'<p>');
     &tmpwrite($asheet);      &tmpwrite($sheet,$sheetdata);
     if ($asheetdata->{'sheettype'} eq 'studentcalc') {      if ($sheetdata->{'sheettype'} eq 'studentcalc') {
         $r->print('<br>Show rows with empty A column: ');          $r->print('<br>Show rows with empty A column: ');
     } else {      } else {
         $r->print('<br>Show empty rows: ');          $r->print('<br>Show empty rows: ');
Line 2679  ENDSCRIPT Line 2559  ENDSCRIPT
     $r->print('>');      $r->print('>');
     #      #
     # CSV format checkbox (classcalc sheets only)      # CSV format checkbox (classcalc sheets only)
     if ($asheetdata->{'sheettype'} eq 'classcalc') {      if ($sheetdata->{'sheettype'} eq 'classcalc') {
         $r->print(' Output CSV format: <input type="checkbox" '.          $r->print(' Output CSV format: <input type="checkbox" '.
                   'name="showcsv" onClick="submit()"');                    'name="showcsv" onClick="submit()"');
         if ($ENV{'form.showcsv'}) { $r->print(' checked'); }          if ($ENV{'form.showcsv'}) { $r->print(' checked'); }
Line 2698  value='Insert Row Top'> Line 2578  value='Insert Row Top'>
 value='Insert Row Bottom'><br>  value='Insert Row Bottom'><br>
 ENDINSERTBUTTONS  ENDINSERTBUTTONS
     # Print out sheet      # Print out sheet
     &outsheet($r,$asheet,$asheetdata);      &outsheet($r,$sheet,$sheetdata);
     $r->print('</form></body></html>');      $r->print('</form></body></html>');
     #  Done      #  Done
     return OK;      return OK;

Removed from v.1.106  
changed lines
  Added in v.1.117


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>