Diff for /loncom/interface/Attic/lonspreadsheet.pm between versions 1.107 and 1.111

version 1.107, 2002/09/05 14:38:57 version 1.111, 2002/09/27 18:29:15
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 167  $chome= ''; Line 156  $chome= '';
 $cnum = '';  $cnum = '';
 $cdom = '';  $cdom = '';
 $cid  = '';  $cid  = '';
 $cfn  = '';  $coursefilename  = '';
   
 # symb  # symb
   
Line 1111  sub getcid { Line 1100  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 1226  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 1305  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 1388  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 1459  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 1476  sub makenewsheet { Line 1469  sub makenewsheet {
     $sheetdata{'cid'}   = $ENV{'request.course.id'};      $sheetdata{'cid'}   = $ENV{'request.course.id'};
     $sheetdata{'csec'}  = &Apache::lonnet::usection      $sheetdata{'csec'}  = &Apache::lonnet::usection
                                ($udom,$uname,$ENV{'request.course.id'});                                 ($udom,$uname,$ENV{'request.course.id'});
     $sheetdata{'cfn'}   = $ENV{'request.course.fn'};      $sheetdata{'coursefilename'}   = $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 1485  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 1536  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 1550  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 1680  sub parmval { Line 1670  sub parmval {
   
 # ---------------------------------------------- Update rows for course listing  # ---------------------------------------------- Update rows for course listing
 sub updateclasssheet {  sub updateclasssheet {
     my $safeeval=shift;      my ($safeeval,$sheetdata) = @_;
     my $cnum=&getcnum($safeeval);      my $cnum  =$sheetdata->{'cnum'};
     my $cdom=&getcdom($safeeval);      my $cdom  =$sheetdata->{'cdom'};
     my $cid=&getcid($safeeval);      my $cid   =$sheetdata->{'cid'};
     my $chome=&getchome($safeeval);      my $chome =$sheetdata->{'chome'};
     #      #
     # Read class list and row labels      # Read class list and row labels
     my %classlist;      my %classlist;
Line 1709  sub updateclasssheet { Line 1699  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) {  #            if ($studentSection==-1) {
                 unless ($ENV{'form.showcsv'}) {  #                unless ($ENV{'form.showcsv'}) {
                     $rowlabel='<font color=red>Data not available: '.  #                    $rowlabel='<font color=red>Data not available: '.
                         $studentName.'</font>';  #                        $studentName.'</font>';
                 } else {  #                } else {
                     $rowlabel='ERROR","'.$studentName.  #                    $rowlabel='ERROR","'.$studentName.
                         '","Data not available","","","';  #                        '","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 1732  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 1784  sub updateclasssheet { Line 1774  sub updateclasssheet {
   
 # ----------------------------------- Update rows for student and assess sheets  # ----------------------------------- Update rows for student and assess sheets
 sub updatestudentassesssheet {  sub updatestudentassesssheet {
     my $safeeval=shift;      my ($safeeval,$sheetdata) = @_;
     my %bighash;      my %bighash;
     my $stype=&gettype($safeeval);      my $stype=$sheetdata->{'sheettype'};
       my $uname=$sheetdata->{'uname'};
       my $udom =$sheetdata->{'udom'};
     my %current=();      my %current=();
     if  ($updatedata{$ENV{'request.course.fn'}.'_'.$stype}) {      if  ($updatedata
            {$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}) {
         %current=split(/\_\_\_\;\_\_\_/,          %current=split(/\_\_\_\;\_\_\_/,
        $updatedata{$ENV{'request.course.fn'}.'_'.$stype});                         $updatedata{$ENV{'request.course.fn'}.
                                          '_'.$stype.'_'.$uname.'_'.$udom});
     } else {      } else {
         # Tie hash          # Tie hash
         tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',          tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db',
Line 1808  sub updatestudentassesssheet { Line 1802  sub updatestudentassesssheet {
                      'totalpoints' =>                       'totalpoints' =>
                      'Total Points Granted<br>totalpoints');                       'Total Points Granted<br>totalpoints');
         my $adduserstr='';          my $adduserstr='';
         if ((&getuname($safeeval) ne $ENV{'user.name'}) ||          if (($uname ne $ENV{'user.name'}) || ($udom ne $ENV{'user.domain'})){
             (&getudom($safeeval) ne $ENV{'user.domain'})) {              $adduserstr='&uname='.$uname.'&udom='.$udom;
             $adduserstr='&uname='.&getuname($safeeval).  
                 '&udom='.&getudom($safeeval);  
         }          }
         my %allassess =          my %allassess =
             ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.              ('_feedback' =>'<a href="/adm/assesscalc?usymb=_feedback'.
Line 1862  sub updatestudentassesssheet { Line 1854  sub updatestudentassesssheet {
         } elsif ($stype eq 'studentcalc') {          } elsif ($stype eq 'studentcalc') {
             %current=%allassess;              %current=%allassess;
         }          }
         $updatedata{$ENV{'request.course.fn'}.'_'.$stype}=          $updatedata{$ENV{'request.course.fn'}.'_'.$stype.'_'.$uname.'_'.$udom}=
             join('___;___',%current);              join('___;___',%current);
         # Get current from cache          # Get current from cache
     }      }
Line 1954  sub loadstudent { Line 1946  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 2016  ENDPOP Line 2008  ENDPOP
 }  }
   
 # ------------------------------------------------ Load data for one assessment  # ------------------------------------------------ Load data for one assessment
   #
 sub loadassessment {  sub loadassessment {
     my ($safeeval,$sheetdata)=@_;      my ($safeeval,$sheetdata)=@_;
   
Line 2048  sub loadassessment { Line 2040  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 2097  sub loadassessment { Line 2083  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;
                     $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 2127  sub loadassessment { Line 2112  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 2185  sub updatesheet { Line 2170  sub updatesheet {
     my ($safeeval,$sheetdata)=@_;      my ($safeeval,$sheetdata)=@_;
     my $stype=$sheetdata->{'sheettype'};      my $stype=$sheetdata->{'sheettype'};
     if ($stype eq 'classcalc') {      if ($stype eq 'classcalc') {
  return &updateclasssheet($safeeval);   return &updateclasssheet($safeeval,$sheetdata);
     } else {      } else {
         return &updatestudentassesssheet($safeeval);          return &updatestudentassesssheet($safeeval,$sheetdata);
     }      }
 }  }
   
Line 2433  sub cachedssheets { Line 2418  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 2455  sub handler { Line 2445  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 2481  sub handler { Line 2475  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 2507  sub handler { Line 2502  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 2547  ENDSCRIPT Line 2543  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 2608  ENDSCRIPT Line 2604  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.107  
changed lines
  Added in v.1.111


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