Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.29 and 1.35

version 1.29, 2001/01/02 20:19:34 version 1.35, 2001/01/20 12:29:37
Line 3 Line 3
 #  #
 # 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,  # 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  # 01/01/01,02/01,03/01,19/01,20/01 Gerd Kortemeyer
   
 package Apache::lonspreadsheet;  package Apache::lonspreadsheet;
   
Line 20  use HTML::TokeParser; Line 20  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 can/should be in the keys)  # (user and course can/should be in the keys)
 #  #
 use vars qw(%spreadsheets %courserdatas %userrdatas %defaultsheets);  
   my %spreadsheets;
   my %courserdatas;
   my %userrdatas;
   my %defaultsheets;
   my %updatedata;
   
 #  #
 # These global hashes are dependent on user, course and resource,   # These global hashes are dependent on user, course and resource, 
Line 423  ENDDEFS Line 428  ENDDEFS
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   
 sub setformulas {  sub setformulas {
     my ($safeeval,@f)=@_;      my ($safeeval,%f)=@_;
     $safeeval->reval('%f='."('".join("','",@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->reval('%c='."('".join("','",@c)."');");      %{$safeeval->varglob('c')}=%c;
 }  }
   
 # ------------------------------------------------ Add or change formula values  # ------------------------------------------------ Add or change formula values
   
 sub setrowlabels {  sub setrowlabels {
     my ($safeeval,@rl)=@_;      my ($safeeval,%rl)=@_;
     $safeeval->reval('%rl='."('".join("','",@rl)."');");      %{$safeeval->varglob('rl')}=%rl;
 }  }
   
 # ------------------------------------------------------- Calculate spreadsheet  # ------------------------------------------------------- Calculate spreadsheet
Line 459  sub getvalues { Line 464  sub getvalues {
   
 sub getformulas {  sub getformulas {
     my $safeeval=shift;      my $safeeval=shift;
     return $safeeval->reval('%f');      return %{$safeeval->varglob('f')};
 }  }
   
 # -------------------------------------------------------------------- Get type  # -------------------------------------------------------------------- Get type
Line 781  sub makenewsheet { Line 786  sub makenewsheet {
       '";$uhome="'.&Apache::lonnet::homeserver($uname,$udom).        '";$uhome="'.&Apache::lonnet::homeserver($uname,$udom).
       '";$sheettype="'.$stype.        '";$sheettype="'.$stype.
       '";$usymb="'.$usymb.        '";$usymb="'.$usymb.
         '";$csec="'.&Apache::lonnet::usection($udom,$uname,
                                               $ENV{'request.course.id'}).
       '";$cid="'.$ENV{'request.course.id'}.        '";$cid="'.$ENV{'request.course.id'}.
       '";$cfn="'.$ENV{'request.course.fn'}.        '";$cfn="'.$ENV{'request.course.fn'}.
       '";$cnum="'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.        '";$cnum="'.$ENV{'course.'.$ENV{'request.course.id'}.'.num'}.
Line 815  sub writesheet { Line 822  sub writesheet {
               $sheetdata,$chome);                $sheetdata,$chome);
     if ($reply eq 'ok') {      if ($reply eq 'ok') {
           $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.            $reply=&Apache::lonnet::reply('put:'.$cdom.':'.$cnum.':'.
               &stype.'_spreadsheets:'.                $stype.'_spreadsheets:'.
               &Apache::lonnet::escape($fn).'='.$ENV{'user.name'},                &Apache::lonnet::escape($fn).'='.$ENV{'user.name'},
               $chome);                $chome);
           if ($reply eq 'ok') {            if ($reply eq 'ok') {
Line 1054  sub updateclasssheet { Line 1061  sub updateclasssheet {
 sub updatestudentassesssheet {  sub updatestudentassesssheet {
     my $safeeval=shift;      my $safeeval=shift;
     my %bighash;      my %bighash;
       my $stype=&gettype($safeeval);
       my %current=();
       unless ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) {
 # -------------------------------------------------------------------- Tie hash  # -------------------------------------------------------------------- Tie hash
       if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',        if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
                        &GDBM_READER,0640)) {                         &GDBM_READER,0640)) {
Line 1062  sub updatestudentassesssheet { Line 1072  sub updatestudentassesssheet {
  my %allkeys=();   my %allkeys=();
         my %allassess=();          my %allassess=();
   
         my $stype=&gettype($safeeval);  
   
         map {          map {
     if ($_=~/^src\_(\d+)\.(\d+)$/) {      if ($_=~/^src\_(\d+)\.(\d+)$/) {
        my $mapid=$1;         my $mapid=$1;
Line 1100  sub updatestudentassesssheet { Line 1108  sub updatestudentassesssheet {
 # %allkeys has a list of storage and parameter displays by unikey  # %allkeys has a list of storage and parameter displays by unikey
 # %allassess has a list of all resource displays by symb  # %allassess has a list of all resource displays by symb
 #  #
 # -------------------- Find discrepancies between the course row table and this  
 #  
         my %f=&getformulas($safeeval);  
         my $changed=0;  
   
         my %current=();  
         if ($stype eq 'assesscalc') {          if ($stype eq 'assesscalc') {
     %current=%allkeys;      %current=%allkeys;
         } elsif ($stype eq 'studentcalc') {          } elsif ($stype eq 'studentcalc') {
             %current=%allassess;              %current=%allassess;
         }          }
           $updatedata{$ENV{'request.course.fn'}.'_'.$stype}=
       join('___;___',%current);
           undef %allkeys;
           undef %allassess;
       } else {
           return 'Could not access course data';
       }
   # ------------------------------------------------------ Get current from cache
       } else {
           %current=split(/\_\_\_\;\_\_\_/,
          $updatedata{$ENV{'request.course.fn'}.'_'.$stype});
       }
   # -------------------- Find discrepancies between the course row table and this
   #
           my %f=&getformulas($safeeval);
           my $changed=0;
   
         my $maxrow=0;          my $maxrow=0;
         my %existing=();          my %existing=();
Line 1136  sub updatestudentassesssheet { Line 1155  sub updatestudentassesssheet {
                 $f{'A'.$maxrow}=$_;                  $f{'A'.$maxrow}=$_;
             }              }
         } keys %current;                  } keys %current;        
            
         if ($changed) { &setformulas($safeeval,%f); }          if ($changed) { &setformulas($safeeval,%f); }
   
         &setmaxrow($safeeval,$maxrow);          &setmaxrow($safeeval,$maxrow);
         &setrowlabels($safeeval,%current);          &setrowlabels($safeeval,%current);
    
     } else {          undef %current;
         return 'Could not access course data';          undef %existing;
     }  
 }  }
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
Line 1157  sub loadstudent { Line 1175  sub loadstudent {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
    my $row=$1;     my $row=$1;
            unless ($f{$_}=~/^\!/) {             unless ($f{$_}=~/^\!/) {
      #         my @assessdata=split(/\_\_\_\;\_\_\_/,        my @assessdata=&exportsheet(&getuname($safeeval),
      #                        &Apache::lonnet::ssi(                                            &getudom($safeeval),
      #                  '/adm/assesscalc',('utarget' => 'export',                                            'assesscalc',$f{$_});
      #                                     'uname'   => $uname,  
      #                                     'udom'    => $udom,  
 #                  'usymb'   => $f{$_})));  
               my $index=0;                my $index=0;
 #              map {                map {
 #                  if ($assessdata[$index]) {                    if ($assessdata[$index]) {
 #     $c{$_.$row}=$assessdata[$index];       $c{$_.$row}=$assessdata[$index];
 #                     unless ($_ eq 'A') {                        unless ($_ eq 'A') { 
 # $f{$_.$row}='import';   $f{$_.$row}='import';
 #                     }                       }
 #  }    }
 #                  $index++;                    $index++;
 #              } ('A','B','C','D','E','F','G','H','I','J','K','L','M',                } ('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');                   'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    }     }
         }          }
     } keys %f;      } keys %f;
Line 1183  sub loadstudent { Line 1198  sub loadstudent {
   
 # --------------------------------------------------- Load data for one student  # --------------------------------------------------- Load data for one student
   
 sub loadclass {  sub loadcourse {
     my $safeeval=shift;      my $safeeval=shift;
     my %c=();      my %c=();
     my %f=&getformulas($safeeval);      my %f=&getformulas($safeeval);
     map {      map {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
    my $row=$1;     my $row=$1;
            unless ($f{$_}=~/^\!/) {             unless (($f{$_}=~/^\!/)
       my ($tname,$tdom)=split(/\:/,$_);  || ($row>200))
 #              my @assessdata=split(/\_\_\_\;\_\_\_/,   {
 #                             &Apache::lonnet::ssi(        my @studentdata=&exportsheet(&getuname($safeeval),
 #                      '/adm/studentcalc',('utarget' => 'export',                                             &getudom($safeeval),
 #                                          'uname'   => $tname,                                             'studentcalc');
 #                                          'udom'    => $tdom)));                undef %userrdatas; 
               my $index=0;                my $index=0;
 #              map {                map {
 #                  if ($assessdata[$index]) {                    if ($studentdata[$index]) {
 #     $c{$_.$row}=$assessdata[$index];       $c{$_.$row}=$studentdata[$index];
 #                     unless ($_ eq 'A') {                        unless ($_ eq 'A') { 
 # $f{$_.$row}='import';   $f{$_.$row}='import';
 #                     }                       }
 #  }    }
 #                  $index++;                    $index++;
 #              } ('A','B','C','D','E','F','G','H','I','J','K','L','M',                } ('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');                   'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
    }     }
         }          }
     } keys %f;      } keys %f;
Line 1252  sub loadassessment { Line 1267  sub loadassessment {
 # ----------------------------- returnhash now has all stores for this resource  # ----------------------------- returnhash now has all stores for this resource
   
 # ---------------------------- initialize coursedata and userdata for this user  # ---------------------------- initialize coursedata and userdata for this user
     %courseopt=();      undef %courseopt;
     %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        unless
         ((time-$courserdatas{$cid.'.last_cache'})<120) {          ((time-$courserdatas{$cid.'.last_cache'})<240) {
          my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.           my $reply=&Apache::lonnet::reply('dump:'.$cdom.':'.$cnum.
               ':resourcedata',$chome);                ':resourcedata',$chome);
          if ($reply!~/^error\:/) {           if ($reply!~/^error\:/) {
Line 1275  sub loadassessment { Line 1290  sub loadassessment {
       } split(/\&/,$courserdatas{$ENV{'request.course.id'}});        } split(/\&/,$courserdatas{$ENV{'request.course.id'}});
 # --------------------------------------------------- Get userdata (if present)  # --------------------------------------------------- Get userdata (if present)
       unless        unless
         ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<120) {          ((time-$userrdatas{$uname.'___'.$udom.'.last_cache'})<240) {
          my $reply=           my $reply=
        &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);         &Apache::lonnet::reply('dump:'.$udom.':'.$uname.':resourcedata',$uhome);
          if ($reply!~/^error\:/) {           if ($reply!~/^error\:/) {
Line 1385  sub exportsheet { Line 1400  sub exportsheet {
     &updatesheet($thissheet);      &updatesheet($thissheet);
     &loadrows($thissheet);      &loadrows($thissheet);
     &calcsheet($thissheet);      &calcsheet($thissheet);
     return &exportdata($thissheet);      my @returnthis=&exportdata($thissheet);
       undef $thissheet;
       return @returnthis;
 }  }
   
 # ================================================================ Main handler  # ================================================================ Main handler
Line 1484  ENDSCRIPT Line 1501  ENDSCRIPT
   
     my $asheet=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});      my $asheet=&makenewsheet($aname,$adom,$1,$ENV{'form.usymb'});
   
 #    if ($ENV{'form.unewfield'}) {  # ------------------------ If a new formula had been entered, go from work copy
 #        $r->print('<h2>Modified Workcopy</h2>');  
 #        $ENV{'form.unewformula'}=~s/\'/\"/g;      if ($ENV{'form.unewfield'}) {
 #        $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.          $r->print('<h2>Modified Workcopy</h2>');
 #                  $ENV{'form.unewformula'}.'<p>');          $ENV{'form.unewformula'}=~s/\'/\"/g;
 #        &setfilename($sheetone,$ENV{'form.ufn'});          $r->print('<p>New formula: '.$ENV{'form.unewfield'}.'='.
 # &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',                    $ENV{'form.unewformula'}.'<p>');
 #                 $ENV{'form.usymb'},          &setfilename($asheet,$ENV{'form.ufn'});
 #                 $ENV{'form.unewfield'},$ENV{'form.unewformula'});   &tmpread($asheet,
 #    } elsif ($ENV{'form.saveas'}) {                   $ENV{'form.unewfield'},$ENV{'form.unewformula'});
 #        &setfilename($sheetone,$ENV{'form.ufn'});  
 # &tmpread($sheetone,,       } elsif ($ENV{'form.saveas'}) {
 #                 $ENV{'form.usymb'});          &setfilename($asheet,$ENV{'form.ufn'});
 #    } else {   &tmpread($asheet);
 #        unless ($ENV{'form.ufn'}) {      } else {
 #    }#          &readsheet($asheet,$ENV{'form.ufn'});
 #      }
 #  if (&gettype($sheetone) eq 'classcalc') {  
 # ---------------------------------- For course view: get courselist and update  # -------------------------------------------------- Print out user information
 #       &updatestudentrows($sheetone);  
 #  } else {      unless (&gettype($asheet) eq 'classcalc') {
 # ----------------- For assessment and student: See if all import rows uptodate          $r->print('<p><b>User:</b> '.&getuname($asheet).
 #       $csec=&Apache::lonnet::usection($udom,$uname,$ENV{'request.course.id'});                    '<br><b>Domain:</b> '.&getudom($asheet));
 #       if ($csec eq '-1') {          if (&getcsec($asheet) eq '-1') {
 #          $r->print('<h3><font color=red>'.             $r->print('<h3><font color=red>'.
 #   "User '$uname' at domain '$udom' not a student in this course</font></h3>");                       'Not a student in this course</font></h3>');
 #       }          } else {
 #       &updaterows($sheetone);             $r->print('<br><b>Section/Group:</b> '.&getcsec($asheet));
 #       untie(%parmhash);          }
 #   } else {      }
 #       $r->print('<h3><font color=red>'.  
 #   'Could not initialize import fields (not in a course)</font></h3>');  # ---------------------------------------------------------------- Course title
 #   }  
 # }      $r->print('<h1>'.
               $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.'</h1>');
   
   
 # ---------------------------------------------------- See if something to save  # ---------------------------------------------------- See if something to save
 #    if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {  
 #        my $fname='';      if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
 # if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {          my $fname='';
 #            $fname=~s/\W/\_/g;   if ($ENV{'form.saveas'} && ($fname=$ENV{'form.newfn'})) {
 #            if ($fname eq 'default') { $fname='course_default'; }              $fname=~s/\W/\_/g;
 #            $fname.='_'.&gettype($sheetone);              if ($fname eq 'default') { $fname='course_default'; }
 #            &setfilename($sheetone,$fname);              $fname.='_'.&gettype($asheet);
 #            $ENV{'form.ufn'}=$fname;              &setfilename($asheet,$fname);
 #            my $reply=&writesheet($sheetone);              $ENV{'form.ufn'}=$fname;
 #            unless ($reroute) {      $r->print('<p>Saving spreadsheet: '.
 # $r->print('<p>Saving spreadsheet: '.$reply.'<p>');                           &writesheet($asheet,$ENV{'form.makedefufn'}).'<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/',     $r->print('<b>Current sheet:</b> '.&getfilename($asheet).'<p>');
  #             $ENV{'form.usymb'});  
 #     &tmpwrite($asheet);
 # ----------------------------------------------------- Print user, course, etc  
 #   unless ($reroute) {  # ----------------------------------------------------------------- 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',$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) {  
 #       $r->print('<h3>Group/Section: '.$csec.'</h3>');  
 #    }  
 #   }  
 # -------------------------------------------------------- Import and calculate  
 #  
 #    if (&gettype($sheetone) eq 'assesscalc') {  
 # &rowaassess($sheetone,$ENV{'form.usymb'});  
 #    } elsif  (&gettype($sheetone) eq 'studentcalc') {  
 # &rowazstudent($sheetone);  
 #    } else {  
 #        &rowazclass($sheetone);  
 #    }  
   
   
     &readsheet($asheet,'');      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)));
   
   
   # ----------------------------------------------------- Update sheet, load rows
   
     &updatesheet($asheet);      &updatesheet($asheet);
     &loadrows($asheet);      &loadrows($asheet);
   
Line 1592  ENDSCRIPT Line 1586  ENDSCRIPT
     &outsheet($r,$asheet);      &outsheet($r,$asheet);
     $r->print('</form></body></html>');      $r->print('</form></body></html>');
   
   # --------------------------------- We know this leaks, so terminate this child
   
       $r->child_terminate();
   
 # ------------------------------------------------------------------------ Done  # ------------------------------------------------------------------------ Done
   } else {    } else {

Removed from v.1.29  
changed lines
  Added in v.1.35


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