Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.108 and 1.114

version 1.108, 2002/09/09 17:18:33 version 1.114, 2002/09/30 18:47:43
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 1111  sub getcid { Line 1105  sub getcid {
   
 # --------------------------------------------------------- Get course filename  # --------------------------------------------------------- Get course filename
   
 sub getcfn {  sub getcoursefilename {
     my $safeeval=shift;      my $safeeval=shift;
     return $safeeval->reval('$cfn');      return $safeeval->reval('$coursefilename');
 }  }
   
 # ----------------------------------------------------------- Get course number  # ----------------------------------------------------------- Get course number
Line 1237  sub rown { Line 1231  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 1310  sub outsheet { Line 1310  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 1393  sub parse_sheet { Line 1393  sub parse_sheet {
 #  #
 # -------------------------------------- Read spreadsheet formulas for a course  # -------------------------------------- Read spreadsheet formulas for a course
 #  #
   
 sub readsheet {  sub readsheet {
     my ($safeeval,$sheetdata,$fn)=@_;      my ($safeeval,$sheetdata,$fn)=@_;
     #      #
Line 1465  sub readsheet { Line 1464  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 1474  sub makenewsheet { Line 1472  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'};
Line 1492  sub makenewsheet { Line 1489  sub makenewsheet {
 }  }
   
 # ------------------------------------------------------------ Save spreadsheet  # ------------------------------------------------------------ Save spreadsheet
   
 sub writesheet {  sub writesheet {
     my ($safeeval,$makedef)=@_;      my ($safeeval,$makedef)=@_;
     my $cid=&getcid($safeeval);      my $cid=&getcid($safeeval);
Line 1544  sub writesheet { Line 1540  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=shift;
     my $fn=$ENV{'user.name'}.'_'.      my $fn=$ENV{'user.name'}.'_'.
Line 1559  sub tmpwrite { Line 1554  sub tmpwrite {
 }  }
   
 # ---------------------------------------------------------- Read the temp copy  # ---------------------------------------------------------- Read the temp copy
   
 sub tmpread {  sub tmpread {
     my ($safeeval,$nfield,$nform)=@_;      my ($safeeval,$nfield,$nform)=@_;
     my $fn=$ENV{'user.name'}.'_'.      my $fn=$ENV{'user.name'}.'_'.
Line 1686  sub updateclasssheet { Line 1680  sub updateclasssheet {
     my $cid   =$sheetdata->{'cid'};      my $cid   =$sheetdata->{'cid'};
     my $chome =$sheetdata->{'chome'};      my $chome =$sheetdata->{'chome'};
     #      #
       %Section = ();
   
       #
     # Read class list and row labels      # Read class list and row labels
     my %classlist;      my %classlist;
     my @tmp = &Apache::lonnet::dump('classlist',$cdom,$cnum);      my @tmp = &Apache::lonnet::dump('classlist',$cdom,$cnum);
Line 1709  sub updateclasssheet { Line 1706  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 1742  sub updateclasssheet { Line 1740  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 1956  sub loadstudent { Line 1954  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 2018  ENDPOP Line 2016  ENDPOP
 }  }
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
   #
 sub loadassessment {  sub loadassessment {
     my ($safeeval,$sheetdata)=@_;      my ($safeeval,$sheetdata)=@_;
   
Line 2050  sub loadassessment { Line 2048  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 (@oldkeys) {
         my $name=$_;          my $name=$_;
         my $value=$returnhash{$_};          my $value=$returnhash{$_};
Line 2099  sub loadassessment { Line 2091  sub loadassessment {
                 &Apache::lonnet::unescape($value);                    &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 $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\:/) {                  $userrdatas{$uname.'___'.$udom}=$reply;
                     $userrdatas{$uname.'___'.$udom}=$reply;  
                     $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;  
                 }  
             }              }
               # Most of the time the user does not have a 'resourcedata.db' 
               # file.  We need to cache that we got nothing instead of bothering
               # with requesting it every time.
               $userrdatas{$uname.'___'.$udom.'.last_cache'}=time;
           }
         foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {          foreach (split(/\&/,$userrdatas{$uname.'___'.$udom})) {
             my ($name,$value)=split(/\=/,$_);              my ($name,$value)=split(/\=/,$_);
             $useropt{$userprefix.&Apache::lonnet::unescape($name)}=              $useropt{$userprefix.&Apache::lonnet::unescape($name)}=
Line 2129  sub loadassessment { Line 2123  sub loadassessment {
     #      #
     my %c=();      my %c=();
     if (tie(%parmhash,'GDBM_File',      if (tie(%parmhash,'GDBM_File',
             &getcfn($safeeval).'_parms.db',&GDBM_READER(),0640)) {              &getcoursefilename($safeeval).'_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 2435  sub cachedssheets { Line 2429  sub cachedssheets {
 # Interactive call to screen  # Interactive call to screen
 #  #
 #  #
   
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
       my $loaderror=&Apache::lonnet::overloaderror($r);
       if ($loaderror) { return $loaderror; }
       $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 2457  sub handler { Line 2456  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 2483  sub handler { Line 2486  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 2509  sub handler { Line 2513  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 2549  ENDSCRIPT Line 2554  ENDSCRIPT
     unless ($asheetdata->{'sheettype'} eq 'classcalc') {      unless ($asheetdata->{'sheettype'} eq 'classcalc') {
         $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}.          $r->print('<p><b>User:</b> '.$asheetdata->{'uname'}.
                   '<br><b>Domain:</b> '.$asheetdata->{'udom'});                    '<br><b>Domain:</b> '.$asheetdata->{'udom'});
         if (&getcsec($asheet) eq '-1') {  #        if (&getcsec($asheet) eq '-1') {
             $r->print('<h3><font color=red>'.  #            $r->print('<h3><font color=red>'.
                       'Not a student in this course</font></h3>');  #                      'Not a student in this course</font></h3>');
         } else {  #        } else {
             $r->print('<br><b>Section/Group:</b> '.$asheetdata->{'csec'});              $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 2610  ENDSCRIPT Line 2615  ENDSCRIPT
             $r->print('>'.$_.'</option>');              $r->print('>'.$_.'</option>');
         }           } 
         $r->print('</select><p>');          $r->print('</select><p>');
         if (&gettype($asheet) eq 'studentcalc') {          if ($asheetdata->{'sheettype'} eq 'studentcalc') {
             &setothersheets($asheet,&othersheets($asheet,'assesscalc'));              &setothersheets($asheet,&othersheets($asheet,'assesscalc'));
         }          }
     }      }

Removed from v.1.108  
changed lines
  Added in v.1.114


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