Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.7 and 1.10

version 1.7, 2000/12/06 23:23:38 version 1.10, 2000/12/09 19:14:20
Line 1 Line 1
 # 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 Gerd Kortemeyer  # 11/11,11/15,11/27,12/04,12/05,12/06,12/07,12/08,12/09 Gerd Kortemeyer
   
 package Apache::lonspreadsheet;  package Apache::lonspreadsheet;
   
 use strict;  use strict;
   use vars qw(%spreadsheets);
 use Safe;  use Safe;
 use Safe::Hole;  use Safe::Hole;
 use Opcode;  use Opcode;
Line 399  sub getfilename { Line 400  sub getfilename {
   
 sub rown {  sub rown {
     my ($safeeval,$n)=@_;      my ($safeeval,$n)=@_;
       my $defaultbg=((($n-1)/5)==int(($n-1)/5))?'#E0E0':'#FFFF';
     my $rowdata="\n<tr><td><b><font size=+1>$n</font></b></td>";      my $rowdata="\n<tr><td><b><font size=+1>$n</font></b></td>";
     my $showf=0;      my $showf=0;
     map {      map {
          my $bgcolor=$defaultbg.((($showf-1)/5==int(($showf-1)/5))?'99':'DD');
        my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);         my ($fm,$vl)=split(/\_\_\_eq\_\_\_/,$_);
        if ($showf==0) { $vl=$_; }         if ($showf==0) { $vl=$_; }
          if ($showf<=1) { $bgcolor='#FFDDDD'; }
          if (($n==0) && ($showf<=26)) { $bgcolor='#CCCCFF'; } 
        if ($showf>1) {         if ($showf>1) {
    if ($vl eq '') {     if ($vl eq '') {
        $vl='<font size=+2 color=white>&#35;</font>';         $vl='<font size=+2 color='.$bgcolor.'>&#35;</font>';
            }             }
            $rowdata.=             $rowdata.=
            '<td><a href="javascript:prompt('.$fm.');">'.$vl.         '<td bgcolor='.$bgcolor.'><a href="javascript:celledit('.$fm.');">'.$vl.
        '</a></td>';         '</a></td>';
        } else {         } else {
            $rowdata.='<td>&nbsp;'.$vl.'&nbsp;</td>';             $rowdata.='<td bgcolor='.$bgcolor.'>&nbsp;'.$vl.'&nbsp;</td>';
        }         }
        $showf++;         $showf++;
     } $safeeval->reval('&outrow('.$n.')');      } $safeeval->reval('&outrow('.$n.')');
Line 423  sub rown { Line 428  sub rown {
   
 sub outsheet {  sub outsheet {
     my $safeeval=shift;      my $safeeval=shift;
     my $tabledata='<table border=2><tr><td colspan=2>&nbsp;</td>';      my $tabledata='<table border=2><tr><td colspan=2>&nbsp;</td>'.
                     '<td bgcolor=#FFDDDD><b>A Import</b></td>';
     map {      map {
         $tabledata.="<td><b><font size=+1>$_</font></b></td>";          $tabledata.="<td><b><font size=+1>$_</font></b></td>";
     } ('A<br>Import','B','C','D','E','F','G','H','I','J','K','L','M',      } ('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',
        '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');
Line 444  sub outsheet { Line 450  sub outsheet {
 # --------------------------------------- Read spreadsheet formulas from a file  # --------------------------------------- Read spreadsheet formulas from a file
   
 sub readsheet {  sub readsheet {
     my ($safeeval,$fn)=shift;      my ($safeeval,$fn)=@_;
     &setfilename($safeeval,$fn);      &setfilename($safeeval,$fn);
     $fn=~/\.(\w+)/;      $fn=~/\.(\w+)/;
     &settype($safeeval,$1);      &settype($safeeval,$1);
     my %f=();      my %f=();
     my $content;      unless ($spreadsheets{$fn}) {
     {         $spreadsheets{$fn}='';
       my $fh=Apache::File->new($fn);         {
       $content=join('',<$fh>);           my $fh;
            if ($fh=Apache::File->new($fn)) {
               $spreadsheets{$fn}=join('',<$fh>);
            }
          }
     }      }
     {      {
       my $parser=HTML::TokeParser->new(\$content);        my $parser=HTML::TokeParser->new(\$spreadsheets{$fn});
       my $token;        my $token;
       while ($token=$parser->get_token) {        while ($token=$parser->get_token) {
          if ($token->[0] eq 'S') {           if ($token->[0] eq 'S') {
Line 469  sub readsheet { Line 479  sub readsheet {
     &setformulas($safeeval,%f);      &setformulas($safeeval,%f);
 }  }
   
   # ----------------------------------------------- Make a temp copy of the sheet
   
   sub tmpwrite {
       my ($safeeval,$tmpdir,$uname,$udom,$symb)=@_;
       my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);
       $fn=~s/\W/\_/g;
       $fn=$tmpdir.$fn.'.tmp';
       my $fh;
       if ($fh=Apache::File->new('>'.$fn)) {
    print $fh join("\n",&getformulas($safeeval));
       }
   }
   
   # ---------------------------------------------------------- Read the temp copy
   
   sub tmpread {
       my ($safeeval,$tmpdir,$uname,$udom,$symb,$nfield,$nform)=@_;
       my $fn=$uname.'_'.$udom.'_spreadsheet_'.&getfilename($safeeval);
       $fn=~s/\W/\_/g;
       $fn=$tmpdir.$fn.'.tmp';
       my $fh;
       my %fo=();
       if ($fh=Apache::File->new($fn)) {
           my $name;
           while ($name=<$fh>) {
       chomp($name);
               my $value=<$fh>;
               chomp($value);
               $fo{$name}=$value;
           }
       }
       $fo{$nfield}=$nform;
       &setformulas($safeeval,%fo);
   }
   
 # --------------------------------------------------------------- Read metadata  # --------------------------------------------------------------- Read metadata
   
 sub readmeta {  sub readmeta {
Line 523  sub updaterows { Line 568  sub updaterows {
     '___'.$resid.'___'.      '___'.$resid.'___'.
     &Apache::lonnet::declutter($srcf);      &Apache::lonnet::declutter($srcf);
  $allassess{$symb}=$bighash{'title_'.$id};   $allassess{$symb}=$bighash{'title_'.$id};
   
                  if ($stype eq 'assesscalc') {                   if ($stype eq 'assesscalc') {
                    map {                     map {
                        if ($_=~/^stores\_(.*)/) {                         if ($_=~/^stores\_(.*)/) {
Line 533  sub updaterows { Line 579  sub updaterows {
                               $display=                                $display=
          &Apache::lonnet::metadata($srcf,$key.'.name');           &Apache::lonnet::metadata($srcf,$key.'.name');
                           }                            }
   
   
                           $allkeys{$key}=$display;                            $allkeys{$key}=$display;
        }         }
                    } split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));                     } split(/\,/,&Apache::lonnet::metadata($srcf,'keys'));
Line 625  sub rowaassess { Line 673  sub rowaassess {
     &setconstants($safeeval,%c);      &setconstants($safeeval,%c);
 }  }
   
   # --------------------------------------------------------- Various form fields
   
   sub textfield {
       my ($title,$name,$value)=@_;
       return "\n<p><b>$title:</b><br>".
              '<input type=text name="'.$name.'" size=80 value="'.$value.'">';
   }
   
   sub hiddenfield {
       my ($name,$value)=@_;
       return "\n".'<input type=hidden name="'.$name.'" value="'.$value.'">';
   }
   
   sub selectbox {
       my ($title,$name,$value,%options)=@_;
       my $selout="\n<p><b>$title:</b><br>".'<select name="'.$name.'">';
       map {
           $selout.='<option value="'.$_.'"';
           if ($_ eq $value) { $selout.=' selected'; }
           $selout.='>'.$options{$_}.'</option>';
       } sort keys %options;
       return $selout.'</select>';
   }
   
   # ---------------------------------------------------------------- Main handler
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
Line 639  sub handler { Line 712  sub handler {
   
   if (($ENV{'request.course.fn'}) ||     if (($ENV{'request.course.fn'}) || 
       ($ENV{'request.state'} eq 'construct')) {         ($ENV{'request.state'} eq 'construct')) { 
    
   # --------------------------- Get query string for limited number of parameters
       map {
          my ($name, $value) = split(/=/,$_);
          $value =~ tr/+/ /;
          $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
          if (($name='uname') || ($name='udom') || ($name='usymb')) {
              unless ($ENV{'form.'.$name}) {
                 $ENV{'form.'.$name}=$value;
      }
          }
       } (split(/&/,$ENV{'QUERY_STRING'}));
   
   # ------------------------------------------- Nothing there? Must be login user
   
       unless ($ENV{'form.uname'}) {
    $ENV{'form.uname'}=$ENV{'user.name'};
           $ENV{'form.udom'}=$ENV{'user.domain'};
       }
   # ------------------------------------------------------------------- Open page
   
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
   
     $r->print('<html><head><title>LON-CAPA Spreadsheet</title></head>');      $r->print('<html><head><title>LON-CAPA Spreadsheet</title>');
     $r->print('<body bgcolor="#FFFFFF">');      $r->print(<<ENDSCRIPT);
    <script language="JavaScript">
   
       function celledit(cn,cf) {
           var cnf=prompt(cn,cf);
    if (cnf!=null) {
       document.sheet.unewfield.value=cn;
               document.sheet.unewformula.value=cnf;
               document.sheet.submit();
           }
       }
   
   </script>
   ENDSCRIPT
       $r->print('</head><body bgcolor="#FFFFFF">'.
          '<form action="'.$r->uri.'" name=sheet method=post>'.
          &hiddenfield('uname',$ENV{'form.uname'}).
          &hiddenfield('udom',$ENV{'form.udom'}).
          &hiddenfield('usymb',$ENV{'form.usymb'}).
          &hiddenfield('unewfield','').
          &hiddenfield('unewformula',''));
     my $sheetone=initsheet();      my $sheetone=initsheet();
     &setformulas($sheetone,      if ($ENV{'form.unewfield'}) {
    'B3' => 5, 'C4' => 6, 'C6' => 'B3+C4', 'C2' => 'C6+B5', 'B5'=>'&SUM("A*")',          $r->print('<h2>Modified Workcopy</h2>');
    'A1' => 'da1', 'A2'=>'da2', 'A3'=>'da3','A4'=>'da4','A5'=>'da5','A6'=>'da6',          $ENV{'form.unewformula'}=~s/\'/\"/g;
    'a1' => '28.7', 'a2' => 'C4+a1','G1'=>'&SUM("*25")');          $r->print('New formula: '.$ENV{'form.unewfield'}.'='.
     &setrowlabels($sheetone,                    $ENV{'form.unewformula'}.'<br>');
    'da1'=>'A Points','da2'=>'B Points','da3'=>'C Points',   &tmpread($sheetone,$r->dir_config('lonDaemons').'/tmp/',
    'da4'=>'Percentage Correct','da5'=>'Bonus Points','da6'=>'Points Awarded');                   $ENV{'form.uname'},$ENV{'form.udom'},$ENV{'form.usymb'},
     &setconstants($sheetone,                   $ENV{'form.unewfield'},$ENV{'form.unewformula'});
    'A1' => '3', 'A2'=>'4', 'A3'=>'0','A4'=>'76','A5'=>'1.5','A6'=>'6');          &setfilename($sheetone,$r->filename);
              $r->filename=~/\.(\w+)/;
     &setmaxrow($sheetone,6);          &settype($sheetone,$1);
      } else {
           &readsheet($sheetone,$r->filename);
       }
       &updaterows($sheetone);
       &tmpwrite($sheetone,$r->dir_config('lonDaemons').'/tmp/',
                 $ENV{'form.uname'},$ENV{'form.udom'},$ENV{'form.usymb'});
     &calcsheet($sheetone);      &calcsheet($sheetone);
     $r->print(&outsheet($sheetone));      $r->print(&outsheet($sheetone));
     $r->print('</body></html>');  
       $r->print('</form></body></html>');
   
   } else {    } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms

Removed from v.1.7  
changed lines
  Added in v.1.10


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