Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.95 and 1.101

version 1.95, 2002/07/05 01:31:25 version 1.101, 2002/08/21 17:18:08
Line 71  use Apache::lonnet; Line 71  use Apache::lonnet;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use GDBM_File;  use GDBM_File;
 use HTML::TokeParser;  use HTML::TokeParser;
   use Apache::lonhtmlcommon;
 #  #
 # Caches for previously calculated spreadsheets  # Caches for previously calculated spreadsheets
 #  #
Line 112  my %parmhash; Line 112  my %parmhash;
   
 my %starttimes;  my %starttimes;
 my %usedtimes;  my %usedtimes;
   my %numbertimes;
   
 # Stuff that only the screen handler can know  # Stuff that only the screen handler can know
   
Line 129  sub initsheet { Line 130  sub initsheet {
     $safeeval->permit("sort");      $safeeval->permit("sort");
     $safeeval->deny(":base_io");      $safeeval->deny(":base_io");
     $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');      $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
       $safeeval->share('$@');
     my $code=<<'ENDDEFS';      my $code=<<'ENDDEFS';
 # ---------------------------------------------------- Inside of the safe space  # ---------------------------------------------------- Inside of the safe space
   
Line 766  sub expandnamed { Line 768  sub expandnamed {
         }          }
         if ($#matches == 0) {          if ($#matches == 0) {
             $returnvalue = '$c{\''.$matches[0].'\'}';              $returnvalue = '$c{\''.$matches[0].'\'}';
           } elsif ($#matches > 0) {
               # more than one match.  Look for a concise one
               $returnvalue =  "'non-unique parameter name : $expression'";
               foreach (@matches) {
                   if (/^$expression$/) {
                       $returnvalue = '$c{\''.$_.'\'}';
                   }
               }
         } else {          } else {
             $returnvalue =  "'bad parameter name : $expression'";              $returnvalue =  "'bad parameter name : $expression'";
         }          }
Line 781  sub sett { Line 791  sub sett {
     } else {      } else {
         $pattern='[A-Z]';          $pattern='[A-Z]';
     }      }
   
   # Deal with the template row
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if ($_=~/template\_(\w)/) {   if ($_=~/template\_(\w)/) {
   my $col=$1;    my $col=$1;
Line 807  sub sett { Line 819  sub sett {
   }    }
       }        }
     }      }
   
   # Deal with the normal cells
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if (($f{$_}) && ($_!~/template\_/)) {   if (($f{$_}) && ($_!~/template\_/)) {
             my $matches=($_=~/^$pattern(\d+)/);              my $matches=($_=~/^$pattern(\d+)/);
Line 822  sub sett { Line 836  sub sett {
             }              }
         }          }
     }      }
   # For inserted lines, [B-Z] is also valid
   
       unless ($sheettype eq 'assesscalc') {
          foreach (keys(%f)) {
      if ($_=~/[B-Z](\d+)/) {
          if ($f{'A'.$1}=~/^[\~\-]/) {
              $t{$_}=$f{$_};
                     $t{$_}=~s/\.\.+/\,/g;
                     $t{$_}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
                     $t{$_}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
                  }
              }
          }
       }
   
     # For some reason 'A0' gets special treatment...  This seems superfluous      # For some reason 'A0' gets special treatment...  This seems superfluous
     # but I imagine it is here for a reason.      # but I imagine it is here for a reason.
     $t{'A0'}=$f{'A0'};      $t{'A0'}=$f{'A0'};
Line 834  sub calc { Line 863  sub calc {
     undef %v;      undef %v;
     &sett();      &sett();
     my $notfinished=1;      my $notfinished=1;
       my $lastcalc='';
     my $depth=0;      my $depth=0;
     my $errormsg;  
     while ($notfinished) {      while ($notfinished) {
  $notfinished=0;   $notfinished=0;
         foreach (keys(%t)) {          foreach (keys(%t)) {
             my $old=$v{$_};              my $old=$v{$_};
             $v{$_}=eval($t{$_});              $v{$_}=eval $t{$_};
     if ($@) {      if ($@) {
  $v{$_}='"error"';   undef %v;
                 $errormsg.=$_.': '.$@."\n";                  return $_.': '.$@;
             }              }
     if ($v{$_} ne $old) { $notfinished=1; }      if ($v{$_} ne $old) { $notfinished=1; $lastcalc=$_; }
         }          }
         $depth++;          $depth++;
         if ($depth>100) {          if ($depth>100) {
     undef %v;      undef %v;
             return 'Maximum calculation depth exceeded';              return $lastcalc.': Maximum calculation depth exceeded';
         }          }
     }      }
     return $errormsg;      return '';
 }  }
   
 sub templaterow {  sub templaterow {
Line 985  sub getformulas { Line 1014  sub getformulas {
     return %{$safeeval->varglob('f')};      return %{$safeeval->varglob('f')};
 }  }
   
   # ----------------------------------------------------- Get value of $f{'A'.$n}
   
   sub getfa {
       my ($safeeval,$n)=@_;
       return $safeeval->reval('$f{"A'.$n.'"}');
   }
   
 # -------------------------------------------------------------------- Get type  # -------------------------------------------------------------------- Get type
   
 sub gettype {  sub gettype {
Line 1123  sub rown { Line 1159  sub rown {
     }      }
     my $showf=0;      my $showf=0;
     my $proc;      my $proc;
     my $maxred;      my $maxred=1;
     my $sheettype=&gettype($safeeval);      my $sheettype=&gettype($safeeval);
     if ($sheettype eq 'studentcalc') {      if ($sheettype eq 'studentcalc') {
         $proc='&outrowassess';          $proc='&outrowassess';
Line 1136  sub rown { Line 1172  sub rown {
     } else {      } else {
         $maxred=26;          $maxred=26;
     }      }
       if (&getfa($safeeval,$n)=~/^[\~\-]/) { $maxred=1; }
     if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; }      if ($n eq '-') { $proc='&templaterow'; $n=-1; $dataflag=1; }
     foreach ($safeeval->reval($proc.'('.$n.')')) {      foreach ($safeeval->reval($proc.'('.$n.')')) {
        my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');         my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
Line 1623  sub updateclasssheet { Line 1660  sub updateclasssheet {
             my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));              my ($end,$start)=split(/\:/,&Apache::lonnet::unescape($value));
             my $active=1;              my $active=1;
             if (($end) && ($now>$end)) { $active=0; }              if (($end) && ($now>$end)) { $active=0; }
               $active = 1 if ($ENV{'form.Status'} eq 'Any');
               $active = !$active if ($ENV{'form.Status'} eq 'Expired');
             if ($active) {              if ($active) {
                 my $rowlabel='';                  my $rowlabel='';
                 $name=&Apache::lonnet::unescape($name);                  $name=&Apache::lonnet::unescape($name);
Line 1677  sub updateclasssheet { Line 1716  sub updateclasssheet {
     if ($_=~/^A(\d+)/) {      if ($_=~/^A(\d+)/) {
                 $maxrow=($1>$maxrow)?$1:$maxrow;                  $maxrow=($1>$maxrow)?$1:$maxrow;
                 $existing{$f{$_}}=1;                  $existing{$f{$_}}=1;
  unless ((defined($currentlist{$f{$_}})) || (!$1)) {   unless ((defined($currentlist{$f{$_}})) || (!$1) ||
                           ($f{$_}=~/^(\~\~\~|\-\-\-)/)) {
    $f{$_}='!!! Obsolete';     $f{$_}='!!! Obsolete';
                    $changed=1;                     $changed=1;
                 }                  }
Line 1714  sub updatestudentassesssheet { Line 1754  sub updatestudentassesssheet {
     unless ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) {      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)) {
 # --------------------------------------------------------- Get all assessments  # --------------------------------------------------------- Get all assessments
   
  my %allkeys=('timestamp' =>    my %allkeys=('timestamp' => 
Line 1816  sub updatestudentassesssheet { Line 1856  sub updatestudentassesssheet {
                 $maxrow=($1>$maxrow)?$1:$maxrow;                  $maxrow=($1>$maxrow)?$1:$maxrow;
                 my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_});                  my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_});
                 $existing{$usy}=1;                  $existing{$usy}=1;
  unless ((defined($current{$usy})) || (!$1)) {   unless ((defined($current{$usy})) || (!$1) ||
    $f{$_}='!!! Obsolete';                          ($f{$_}=~/^(\~\~\~|\-\-\-)/)){
       $f{$_}='!!! Obsolete';
                    $changed=1;                     $changed=1;
         } elsif ($ufn) {          } elsif ($ufn) {
     $current{$usy}      $current{$usy}
Line 1870  sub loadstudent { Line 1911  sub loadstudent {
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
    my $row=$1;     my $row=$1;
            unless (($f{$_}=~/^\!/) || ($row==0)) {             unless (($f{$_}=~/^[\!\~\-]/) || ($row==0)) {
       my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_});        my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{$_});
       @assessdata=&exportsheet(&getuname($safeeval),        @assessdata=&exportsheet(&getuname($safeeval),
                                        &getudom($safeeval),                                         &getudom($safeeval),
Line 1909  sub loadcourse { Line 1950  sub loadcourse {
     my $total=0;      my $total=0;
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
     unless ($f{$_}=~/^\!/) { $total++; }      unless ($f{$_}=~/^[\!\~\-]/) { $total++; }
         }          }
     }      }
     my $now=0;      my $now=0;
Line 1929  ENDPOP Line 1970  ENDPOP
     foreach (keys(%f)) {      foreach (keys(%f)) {
  if ($_=~/^A(\d+)/) {   if ($_=~/^A(\d+)/) {
    my $row=$1;     my $row=$1;
            unless (($f{$_}=~/^\!/)  || ($row==0)) {             unless (($f{$_}=~/^[\!\~\-]/)  || ($row==0)) {
       my @studentdata=&exportsheet(split(/\:/,$f{$_}),        my @studentdata=&exportsheet(split(/\:/,$f{$_}),
                                            'studentcalc');                                             'studentcalc');
               undef %userrdatas;                undef %userrdatas;
Line 2089  sub loadassessment { Line 2130  sub loadassessment {
    my %c=();     my %c=();
   
    if (tie(%parmhash,'GDBM_File',     if (tie(%parmhash,'GDBM_File',
            &getcfn($safeeval).'_parms.db',&GDBM_READER,0640)) {             &getcfn($safeeval).'_parms.db',&GDBM_READER(),0640)) {
     my %f=&getformulas($safeeval);      my %f=&getformulas($safeeval);
     foreach (keys(%f))  {      foreach (keys(%f))  {
  if ($_=~/^A/) {   if ($_=~/^A/) {
             unless ($f{$_}=~/^\!/) {              unless ($f{$_}=~/^[\!\~\-]/) {
         if ($f{$_}=~/^parameter/) {          if ($f{$_}=~/^parameter/) {
  if ($thisassess{$f{$_}}) {   if ($thisassess{$f{$_}}) {
                   my $val=&parmval($f{$_},$safeeval);                    my $val=&parmval($f{$_},$safeeval);
Line 2488  $tmpdir=$r->dir_config('lonDaemons').'/t Line 2529  $tmpdir=$r->dir_config('lonDaemons').'/t
   
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     $r->print('</head><body bgcolor="#FFFFFF">'.     $r->print('</head>'.&Apache::loncommon::bodytag('Grades Spreadsheet').
        '<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'}).
Line 2554  ENDSCRIPT Line 2593  ENDSCRIPT
         }          }
     }      }
   
 # ---------------------------------------------------------------- Course title  
   
     $r->print('<h1>'.  
             $ENV{'course.'.$ENV{'request.course.id'}.'.description'}.  
              '</h1><h3>'.localtime().'</h3>');  
   
 # ---------------------------------------------------- See if user can see this  # ---------------------------------------------------- See if user can see this
   
     if ((&gettype($asheet) eq 'classcalc') ||       if ((&gettype($asheet) eq 'classcalc') || 
Line 2711  ENDSCRIPT Line 2744  ENDSCRIPT
     }      }
   
 # ------------------------------------------------------------------ Insertrows  # ------------------------------------------------------------------ Insertrows
       $r->print('&nbsp;Student Status: '.
                 &Apache::lonhtmlcommon::StatusOptions
                 ($ENV{'form.Status'},'sheet'));
   
    $r->print(<<ENDINSERTBUTTONS);     $r->print(<<ENDINSERTBUTTONS);
 <br>  <br>

Removed from v.1.95  
changed lines
  Added in v.1.101


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