Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.20 and 1.27

version 1.20, 2000/12/30 17:13:54 version 1.27, 2001/01/02 12:12:43
Line 2 Line 2
 # Spreadsheet/Grades Display Handler  # Spreadsheet/Grades Display Handler
 #  #
 # 11/11,11/15,11/27,12/04,12/05,12/06,12/07,  # 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 Gerd Kortemeyer  # 12/08,12/09,12/11,12/12,12/15,12/16,12/18,12/19,12/30,
   # 01/01/01,02/01 Gerd Kortemeyer
   
 package Apache::lonspreadsheet;  package Apache::lonspreadsheet;
   
Line 17  use HTML::TokeParser; Line 18  use HTML::TokeParser;
   
 #  #
 # These cache hashes need to be independent of user, resource and course  # These cache hashes need to be independent of user, resource and course
 # (user and course are in the keys)  # (user and course can/should be in the keys)
 #  #
 use vars qw(%spreadsheets %courserdatas %userrdatas);  use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets);
   
 #  #
 # These global hashes are dependent on user, course and resource,   # These global hashes are dependent on user, course and resource, 
 # and need to be initialized every time when a sheet is calculated  # and need to be initialized every time when a sheet is calculated
Line 27  use vars qw(%spreadsheets %courserdatas Line 29  use vars qw(%spreadsheets %courserdatas
 my %courseopt;  my %courseopt;
 my %useropt;  my %useropt;
 my %parmhash;  my %parmhash;
 my $csec;  
 my $uname;  
 my $udom;  
   
 # =============================================================================  # =============================================================================
 # ===================================== Implements an instance of a spreadsheet  # ===================================== Implements an instance of a spreadsheet
Line 60  sub initsheet { Line 59  sub initsheet {
   
 $maxrow=0;  $maxrow=0;
 $sheettype='';  $sheettype='';
   
   # filename/reference of the sheet
   
 $filename='';  $filename='';
   
   # user data
   $uname='';
   $uhome='';
   $udom='';
   
   # course data
   
   $csec='';
   $chome='';
   $cnum='';
   $cdom='';
   
   # symb
   
   $usymb='';
   
 sub mask {  sub mask {
     my ($lower,$upper)=@_;      my ($lower,$upper)=@_;
   
Line 328  sub calc { Line 346  sub calc {
     return '';      return '';
 }  }
   
   sub templaterow {
       my @cols=();
       $cols[0]='<b><font size=+1>Template</font></b>';
       map {
           my $fm=$f{'template_'.$_};
           $fm=~s/[\'\"]/\&\#34;/g;
           $cols[$#cols+1]="'template_$_','$fm'".'___eq___'.$fm;
       } ('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');
       return @cols;
   }
   
 sub outrowassess {  sub outrowassess {
     my $n=shift;      my $n=shift;
     my @cols=();      my @cols=();
Line 351  sub outrow { Line 383  sub outrow {
     my $n=shift;      my $n=shift;
     my @cols=();      my @cols=();
     if ($n) {      if ($n) {
        $cols[0]=$rl{$f{'A'.$n}}.' stuff';         $cols[0]=$rl{$f{'A'.$n}};
     } else {      } else {
        $cols[0]='<b><font size=+1>Export</font></b>';         $cols[0]='<b><font size=+1>Export</font></b>';
     }      }
Line 437  sub gettype { Line 469  sub gettype {
     my $safeeval=shift;      my $safeeval=shift;
     return $safeeval->reval('$sheettype');      return $safeeval->reval('$sheettype');
 }  }
   
 # ------------------------------------------------------------------ Set maxrow  # ------------------------------------------------------------------ Set maxrow
   
 sub setmaxrow {  sub setmaxrow {
Line 465  sub getfilename { Line 498  sub getfilename {
     return $safeeval->reval('$filename');      return $safeeval->reval('$filename');
 }  }
   
   # ----------------------------------------------------------- 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 exportrow {  sub exportrow {
Line 475  sub exportrow { Line 564  sub exportrow {
 # ========================================================== End of Spreadsheet  # ========================================================== End of Spreadsheet
 # =============================================================================  # =============================================================================
   
   #
   # Procedures for screen output
   #
 # --------------------------------------------- Produce output row n from sheet  # --------------------------------------------- Produce output row n from sheet
   
 sub rown {  sub rown {
     my ($safeeval,$n)=@_;      my ($safeeval,$n)=@_;
     my $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';      my $defaultbg;
     my $rowdata="\n<tr><td><b><font size=+1>$n</font></b></td>";      my $rowdata='';
       unless ($n eq '-') {
          $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
       } else {
          $defaultbg='#E0FF';
       }
       if ((($n-1)/25)==int(($n-1)/25)) {
           my $what='Student';
           if (&gettype($safeeval) eq 'assesscalc') {
       $what='Item';
    } elsif (&gettype($safeeval) eq 'studentcalc') {
               $what='Assessment';
           }
    $rowdata.="</table>\n<br><table border=2>".
           '<tr><td>&nbsp;<td>'.$what.'</td>';
           map {
              $rowdata.='<td>'.$_.'</td>';
           } ('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');
           $rowdata.='</tr>';
       }
       $rowdata.="\n<tr><td><b><font size=+1>$n</font></b></td>";
     my $showf=0;      my $showf=0;
     my $proc;      my $proc;
     my $maxred;      my $maxred;
Line 492  sub rown { Line 606  sub rown {
         $proc='&outrow';          $proc='&outrow';
         $maxred=26;          $maxred=26;
     }      }
       if ($n eq '-') { $proc='&templaterow'; $n=-1; }
     map {      map {
        my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');         my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
        my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);         my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
Line 516  sub rown { Line 631  sub rown {
 # ------------------------------------------------------------- Print out sheet  # ------------------------------------------------------------- Print out sheet
   
 sub outsheet {  sub outsheet {
     my $safeeval=shift;      my ($r,$safeeval)=@_;
     my $maxred;      my $maxred;
     my $realm;      my $realm;
     if (&gettype($safeeval) eq 'assesscalc') {      if (&gettype($safeeval) eq 'assesscalc') {
Line 530  sub outsheet { Line 645  sub outsheet {
         $realm='Course';          $realm='Course';
     }      }
     my $maxyellow=52-$maxred;      my $maxyellow=52-$maxred;
     my $tabledata='<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'.      my $tabledata=
           '<table border=2><tr><th colspan=2 rowspan=2><font size=+2>'.
                   $realm.'</font></th>'.                    $realm.'</font></th>'.
                   '<td bgcolor=#FFDDDD colspan='.$maxred.                    '<td bgcolor=#FFDDDD colspan='.$maxred.
                   '><b><font size=+1>Import</font></b></td>'.                    '><b><font size=+1>Import</font></b></td>'.
Line 552  sub outsheet { Line 668  sub outsheet {
     $tabledata.='</tr>';      $tabledata.='</tr>';
     my $row;      my $row;
     my $maxrow=&getmaxrow($safeeval);      my $maxrow=&getmaxrow($safeeval);
       $tabledata.=&rown($safeeval,'-');
       $r->print($tabledata);
     for ($row=0;$row<=$maxrow;$row++) {      for ($row=0;$row<=$maxrow;$row++) {
         $tabledata.=&rown($safeeval,$row);          $r->print(&rown($safeeval,$row));
     }      }
     $tabledata.='</table>';      $r->print('</table>');
 }  }
   
   #
   # -------------------------------------- Read spreadsheet formulas for a course
   #
   
   sub readsheet {
     my ($safeeval,$fn)=@_;
     my $stype=&gettype($safeeval);
     my $cnum=&getcnum($safeeval);
   
   # --------- There is no filename. Look for defaults in course and global, cache
   
     unless($fn) {
         unless ($fn=$defaultsheets{$cnum.'_'.$stype}) {
            $fn=&Apache::lonnet::reply('get:'.
                   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
                   $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
                   ':environment:spreadsheet_default_'.&gettype($safeeval),
                        $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
            unless (($fn) && ($fn!~/^error\:/)) {
        $fn='default_'.$stype;
            }
            $defaultsheets{$cnum.'_'.$stype}=$fn; 
         }
     }
   
   # ---------------------------------------------------------- fn now has a value
   
 # ------------------------------------- Read spreadsheet formulas from a course    &setfilename($safeeval,$fn);
   
 sub readsheet {  # ------------------------------------------------------ see if sheet is cached
     my ($safeeval,$fn,$r)=@_;    my $fstring='';
     my %f=();    if ($fstring=$spreadsheets{$cnum.'_'.$stype.'_'.$fn}) {
     unless ($fn) {        &setformulas($sheetone,split(/\_\_\_\;\_\_\_/,$fstring));
     } else {
   
   # ---------------------------------------------------- Not cached, need to read
   
        my %f=();
   
        if ($fn=~/^default\_/) {
  my $sheetxml='';   my $sheetxml='';
        {         {
          my $fh;           my $fh;
Line 574  sub readsheet { Line 724  sub readsheet {
                $sheetxml=join('',<$fh>);                 $sheetxml=join('',<$fh>);
           }            }
        }         }
        my $parser=HTML::TokeParser->new(\$sheetxml);          my $parser=HTML::TokeParser->new(\$sheetxml);
        my $token;          my $token;
        while ($token=$parser->get_token) {          while ($token=$parser->get_token) {
           if ($token->[0] eq 'S') {            if ($token->[0] eq 'S') {
       if ($token->[1] eq 'field') {        if ($token->[1] eq 'field') {
   $f{$token->[2]->{'col'}.$token->[2]->{'row'}}=    $f{$token->[2]->{'col'}.$token->[2]->{'row'}}=
Line 587  sub readsheet { Line 737  sub readsheet {
                      $parser->get_text('/template');                       $parser->get_text('/template');
              }               }
           }            }
        }          }
        &setfilename($safeeval,'default_'.&gettype($safeeval));        } else {
     } else {          my $sheet='';
        &setfilename($safeeval,$fn);          my $reply=&Apache::lonnet::reply('dump:'.
        unless ($spreadsheets{$fn}) {  
           $spreadsheets{$fn}='';  
           my $reply=&Apache::lonnet::reply('dump:'.  
               $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.                $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
               $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn,                $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.$fn,
               $ENV{'course.'.$ENV{'request.course.id'}.'.home'});                $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
           unless ($reply=~/^error\:/) {            unless ($reply=~/^error\:/) {
              $spreadsheets{$fn}=$reply;               $sheet=$reply;
           }    }
             map {
                my ($name,$value)=split(/\=/,$_);
                $f{&Apache::lonnet::unescape($name)}=
           &Apache::lonnet::unescape($value);
             } split(/\&/,$sheet);
        }         }
        map {  # --------------------------------------------------------------- Cache and set
            my ($name,$value)=split(/\=/,$_);         $spreadsheets{$cnum.'_'.$stype.'_'.$fn}=join('___;___',%f);       
            $f{&Apache::lonnet::unescape($name)}=         &setformulas($safeeval,%f);
       &Apache::lonnet::unescape($value);  
        } split(/\&/,$spreadsheets{$fn});  
     }      }
   
     &setformulas($safeeval,%f);  
 }  }
   
 # ------------------------------------------------------------ Save spreadsheet  # ------------------------------------------------------------ Save spreadsheet
Line 629  sub writesheet { Line 777  sub writesheet {
               &getfilename($safeeval).':'.                &getfilename($safeeval).':'.
               $sheetdata,                $sheetdata,
               $ENV{'course.'.$ENV{'request.course.id'}.'.home'});                $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
   }         if ($reply eq 'ok') {
             return &Apache::lonnet::reply('put:'.
                 $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
                 $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.':'.
                 &gettype($safeeval).'_spreadsheets:'.
                 &Apache::lonnet::escape(&getfilename($safeeval)).'='.
                 $ENV{'user.name'},
                 $ENV{'course.'.$ENV{'request.course.id'}.'.home'});    
         } else {
     return $reply;
         }
     }
     return 'unauthorized';
 }  }
   
 # ----------------------------------------------- Make a temp copy of the sheet  # ----------------------------------------------- Make a temp copy of the sheet
   
 sub tmpwrite {  sub tmpwrite {
     my ($safeeval,$tmpdir,$symb)=@_;      my ($safeeval,$tmpdir,$symb)=@_;
     my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);      my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
     $fn=~s/\W/\_/g;      $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';      $fn=$tmpdir.$fn.'.tmp';
     my $fh;      my $fh;
Line 649  sub tmpwrite { Line 809  sub tmpwrite {
   
 sub tmpread {  sub tmpread {
     my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_;      my ($safeeval,$tmpdir,$symb,$nfield,$nform)=@_;
     my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);      my $fn=$uname.'_'.$udom.'_spreadsheet_'.$symb.'_'.&getfilename($safeeval);
     $fn=~s/\W/\_/g;      $fn=~s/\W/\_/g;
     $fn=$tmpdir.$fn.'.tmp';      $fn=$tmpdir.$fn.'.tmp';
     my $fh;      my $fh;
Line 663  sub tmpread { Line 823  sub tmpread {
             $fo{$name}=$value;              $fo{$name}=$value;
         }          }
     }      }
     $fo{$nfield}=$nform;      if ($nfield) { $fo{$nfield}=$nform; }
     &setformulas($safeeval,%fo);      &setformulas($safeeval,%fo);
 }  }
   
Line 770  sub parmval { Line 930  sub parmval {
                   
 }  }
   
   # ---------------------------------------------- Update rows for course listing
   
   sub updatestudentrows {
       my $safeeval=shift;
       my $cid=$ENV{'request.course.id'};
       my $classlst=&Apache::lonnet::reply
                    ('dump:'.$ENV{'course.'.$cid.'.domain'}.':'.
                     $ENV{'course.'.$cid.'.num'}.':classlist',
                     $ENV{'course.'.$cid.'.home'});
       my %currentlist=();
       my $now=time;
       unless ($classlst=~/^error\:/) {
           map {
               my ($name,$value)=split(/\=/,$_);
               my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));
               my $active=1;
               if (($end) && ($now>$end)) { $active=0; }
               if ($active) {
                   my $rowlabel='';
                   $name=&Apache::lonnet::unescape($name);
                   my ($cname,$cdom)=split(/\:/,$name);
                   my $csec=
                &Apache::lonnet::usection($cdom,$cname,$ENV{'request.course.id'});
                   if ($csec==-1) {
                       $rowlabel='<font color=red>Data not available: '.$name.
         '</font>';
                   } else {
                       my %reply=&Apache::lonnet::idrget($cdom,$cname);
                       my $reply=&Apache::lonnet::reply('get:'.$cdom.':'.$cname.
         ':environment:firstname&middlename&lastname&generation',
                         &Apache::lonnet::homeserver($cname,$cdom));
                       $rowlabel=$csec.'&nbsp;'.$reply{$cname}.'<br>';
                       map {
                           $rowlabel.=&Apache::lonnet::unescape($_).' ';
                       } split(/\&/,$reply);
                   }
                  
    $currentlist{&Apache::lonnet::unescape($name)}=$rowlabel;
               }
           } split(/\&/,$classlst);
   #
   # -------------------- Find discrepancies between the course row table and this
   #
           my %f=&getformulas($safeeval);
           my $changed=0;
   
           my $maxrow=0;
           my %existing=();
   
   # ----------------------------------------------------------- Now obsolete rows
    map {
       if ($_=~/^A(\d+)/) {
                   $maxrow=($1>$maxrow)?$1:$maxrow;
                   $existing{$f{$_}}=1;
    unless ((defined($currentlist{$f{$_}})) || (!$1)) {
      $f{$_}='!!! Obsolete';
                      $changed=1;
                   }
               }
           } keys %f;
   
   # -------------------------------------------------------- New and unknown keys
        
           map {
               unless ($existing{$_}) {
    $changed=1;
                   $maxrow++;
                   $f{'A'.$maxrow}=$_;
               }
           } sort keys %currentlist;        
        
           if ($changed) { &setformulas($safeeval,%f); }
   
           &setmaxrow($safeeval,$maxrow);
           &setrowlabels($safeeval,%currentlist);
   
       } else {
           return 'Could not access course data';
       }
   }
 # ----------------------------------------------------------------- Update rows  # ----------------------------------------------------------------- Update rows
   
 sub updaterows {  sub updaterows {
Line 869  sub updaterows { Line 1108  sub updaterows {
     }      }
 }  }
   
 # --------------------------------------------------- Load data for one student  # ------------------------------------------------ Load data for one assessment
   
 sub rowazstudent {  sub rowazstudent {
     my $safeeval=shift;      my $safeeval=shift;
Line 881  sub rowazstudent { Line 1120  sub rowazstudent {
            unless ($f{$_}=~/^\!/) {             unless ($f{$_}=~/^\!/) {
               my @assessdata=split(/\_\_\_\;\_\_\_/,                my @assessdata=split(/\_\_\_\;\_\_\_/,
                              &Apache::lonnet::ssi(                               &Apache::lonnet::ssi(
         '/res/msu/korte/junk.assesscalc',('utarget' => 'export',                         '/adm/assesscalc',('utarget' => 'export',
                                           'uname'   => $uname,                                            'uname'   => $uname,
                                           'udom'    => $udom,                                            'udom'    => $udom,
                   'usymb'   => $f{$_})));                    'usymb'   => $f{$_})));
Line 903  sub rowazstudent { Line 1142  sub rowazstudent {
     &setconstants($safeeval,%c);      &setconstants($safeeval,%c);
 }  }
   
   # --------------------------------------------------- Load data for one student
   
   sub rowazclass {
       my $safeeval=shift;
       my %c=();
       my %f=&getformulas($safeeval);
       map {
    if ($_=~/^A(\d+)/) {
      my $row=$1;
              unless ($f{$_}=~/^\!/) {
         my ($tname,$tdom)=split(/\:/,$_);
                 my @assessdata=split(/\_\_\_\;\_\_\_/,
                                &Apache::lonnet::ssi(
                         '/adm/studentcalc',('utarget' => 'export',
                                             'uname'   => $tname,
                                             'udom'    => $tdom)));
                 my $index=0;
                 map {
                     if ($assessdata[$index]) {
        $c{$_.$row}=$assessdata[$index];
                        unless ($_ eq 'A') { 
    $f{$_.$row}='import';
                        }
     }
                     $index++;
                 } ('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');
      }
           }
       } keys %f;
       &setformulas($safeeval,%f);
       &setconstants($safeeval,%c);
   }
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
   
 sub rowaassess {  sub rowaassess {
Line 1086  sub handler { Line 1359  sub handler {
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     $r->print('</head><body bgcolor="#FFFFFF">'.      $r->print('</head><body bgcolor="#FFFFFF">'.
          '<img align=right src=/adm/lonIcons/lonlogos.gif>'.
          '<h1>LON-CAPA Spreadsheet</h1>'.
        '<form action="'.$r->uri.'" name=sheet method=post>'.         '<form action="'.$r->uri.'" name=sheet method=post>'.
        &hiddenfield('uname',$ENV{'form.uname'}).         &hiddenfield('uname',$ENV{'form.uname'}).
        &hiddenfield('udom',$ENV{'form.udom'}).         &hiddenfield('udom',$ENV{'form.udom'}).
        &hiddenfield('usymb',$ENV{'form.usymb'}).         &hiddenfield('usymb',$ENV{'form.usymb'}).
        &hiddenfield('ufn',$ENV{'form.ufn'}).  
        &hiddenfield('unewfield','').         &hiddenfield('unewfield','').
        &hiddenfield('unewformula',''));         &hiddenfield('unewformula',''));
   }    }
       $r->rflush();
 # ---------------------------------------- Read new sheet or modified worksheet  # ---------------------------------------- Read new sheet or modified worksheet
   
     my $sheetone=initsheet();      my $sheetone=initsheet();
Line 1103  ENDSCRIPT Line 1377  ENDSCRIPT
     if ($ENV{'form.unewfield'}) {      if ($ENV{'form.unewfield'}) {
         $r->print('<h2>Modified Workcopy</h2>');          $r->print('<h2>Modified Workcopy</h2>');
         $ENV{'form.unewformula'}=~s/\'/\"/g;          $ENV{'form.unewformula'}=~s/\'/\"/g;
         $r->print('New formula: '.$ENV{'form.unewfield'}.'='.          $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.
                   $ENV{'form.unewformula'}.'<br>');                    $ENV{'form.unewformula'}.'<p>');
         &setfilename($sheetone,$ENV{'form.ufn'});          &setfilename($sheetone,$ENV{'form.ufn'});
  &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',   &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',
                  $ENV{'form.usymb'},                   $ENV{'form.usymb'},
                  $ENV{'form.unewfield'},$ENV{'form.unewformula'});                   $ENV{'form.unewfield'},$ENV{'form.unewformula'});
       } elsif ($ENV{'form.saveas'}) {
           &setfilename($sheetone,$ENV{'form.ufn'});
    &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',
                    $ENV{'form.usymb'});
     } else {      } else {
         &readsheet($sheetone,$ENV{'form.ufn'},$r);          unless ($ENV{'form.ufn'}) {
     }      }
   
 # --------------------------------------------- See if all import rows uptodate    if (&gettype($sheetone) eq 'classcalc') {
   # ---------------------------------- For course view: get courselist and update
          &updatestudentrows($sheetone);
     } else {
   # ----------------- For assessment and student: See if all import rows uptodate
   
     if (tie(%parmhash,'GDBM_File',      if (tie(%parmhash,'GDBM_File',
        $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) {         $ENV{'request.course.fn'}.'_parms.db',&GDBM_READER,0640)) {
Line 1128  ENDSCRIPT Line 1410  ENDSCRIPT
        $r->print('<h3><font color=red>'.         $r->print('<h3><font color=red>'.
    'Could not initialize import fields (not in a course)</font></h3>');     'Could not initialize import fields (not in a course)</font></h3>');
    }     }
    }
   # ---------------------------------------------------- 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.='_'.&gettype($sheetone);
               &setfilename($sheetone,$fname);
               $ENV{'form.ufn'}=$fname;
               my $reply=&writesheet($sheetone);
               unless ($reroute) {
    $r->print('<p>Saving spreadsheet: '.$reply.'<p>');
               }
               if ($ENV{'form.makedefufn'}) {
                   my $reply=&Apache::lonnet::reply('put:'.
                        $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}.':'.
                        $ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
                        ':environment:spreadsheet_default_'.
                        &gettype($sheetone).'='.
                        &Apache::lonnet::escape($fname),
                        $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
                  unless ($reroute) {
              $r->print('<p>Making default spreadsheet: '.$reply.'<p>');
                  }
               }
           }
       }
 # ------------------------------------------------ Write the modified worksheet  # ------------------------------------------------ Write the modified worksheet
   
    &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/',     &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/',
Line 1136  ENDSCRIPT Line 1445  ENDSCRIPT
   
 # ----------------------------------------------------- Print user, course, etc  # ----------------------------------------------------- Print user, course, etc
    unless ($reroute) {     unless ($reroute) {
     $r->print("<b>User '$uname' at domain '$udom' for '".      if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
               $ENV{'course.'.$ENV{'request.course.id'}.'.description'}."'");          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',$ENV{'form.ufn'}));
       unless (&gettype($sheetone) eq 'classcalc') {
           $r->print('<br><b>User:</b> '.$uname.'<br><b>Domain:</b> '.$udom);
       }
       $r->print('<h1>'.
               $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>');
     if ($csec) {      if ($csec) {
        $r->print(", group/section '$csec'");         $r->print('<h3>Group/Section: '.$csec.'</h3>');
     }      }
     $r->print("</b>\n");  
    }     }
 # -------------------------------------------------------- Import and calculate  # -------------------------------------------------------- Import and calculate
   
Line 1149  ENDSCRIPT Line 1469  ENDSCRIPT
  &rowaassess($sheetone,$ENV{'form.usymb'});   &rowaassess($sheetone,$ENV{'form.usymb'});
     } elsif  (&gettype($sheetone) eq 'studentcalc') {      } elsif  (&gettype($sheetone) eq 'studentcalc') {
  &rowazstudent($sheetone);   &rowazstudent($sheetone);
       } else {
           &rowazclass($sheetone);
     }      }
     my $calcoutput=&calcsheet($sheetone);      my $calcoutput=&calcsheet($sheetone);
     unless ($reroute) {      unless ($reroute) {
Line 1157  ENDSCRIPT Line 1479  ENDSCRIPT
   
 # ------------------------------------------------------- Print or export sheet  # ------------------------------------------------------- Print or export sheet
    unless ($reroute) {        unless ($reroute) {   
     $r->print(&outsheet($sheetone));      &outsheet($r,$sheetone);
   
     $r->print('</form></body></html>');      $r->print('</form></body></html>');
   } else {    } else {

Removed from v.1.20  
changed lines
  Added in v.1.27


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