Diff for /loncom/interface/loncoursedata.pm between versions 1.23 and 1.35

version 1.23, 2002/08/28 22:02:47 version 1.35, 2002/10/14 19:06:21
Line 139  sub DownloadClasslist { Line 139  sub DownloadClasslist {
     %classlist=&Apache::lonnet::dump('classlist',$courseDomain, $courseNumber);      %classlist=&Apache::lonnet::dump('classlist',$courseDomain, $courseNumber);
     foreach(keys (%classlist)) {      foreach(keys (%classlist)) {
         if(/^(con_lost|error|no_such_host)/i) {          if(/^(con_lost|error|no_such_host)/i) {
             return \%classlist;      return;
         }          }
     }      }
   
Line 309  sub ProcessTopResourceMap { Line 309  sub ProcessTopResourceMap {
         return 'Can not open Coursemap.';          return 'Can not open Coursemap.';
     }      }
   
       my $oldkeys;
       if(defined($cache->{'ResourceKeys'})) {
           $oldkeys = $cache->{'ResourceKeys'};
           foreach (split(':::', $cache->{'ResourceKeys'})) {
               delete $cache->{$_};
           }
           delete $cache->{'ResourceKeys'};
       }
   
     # Initialize state machine.  Set information pointing to top level map.      # Initialize state machine.  Set information pointing to top level map.
     my (@sequences, @currentResource, @finishResource);      my (@sequences, @currentResource, @finishResource);
     my ($currentSequence, $currentResourceID, $lastResourceID);      my ($currentSequence, $currentResourceID, $lastResourceID);
   
     $currentResourceID=$hash{'ids_/res/'.$ENV{'request.course.uri'}};      $currentResourceID=$hash{'ids_'.
         &Apache::lonnet::clutter($ENV{'request.course.uri'})};
     push(@currentResource, $currentResourceID);      push(@currentResource, $currentResourceID);
     $lastResourceID=-1;      $lastResourceID=-1;
     $currentSequence=-1;      $currentSequence=-1;
     my $topLevelSequenceNumber = $currentSequence;      my $topLevelSequenceNumber = $currentSequence;
   
     my %sequenceRecord;      my %sequenceRecord;
       my %allkeys;
     while(1) {      while(1) {
         if($c->aborted()) {          if($c->aborted()) {
             last;              last;
Line 344  sub ProcessTopResourceMap { Line 355  sub ProcessTopResourceMap {
             } else {              } else {
                 $cache->{'orderedSequences'}.=':'.$currentSequence;                  $cache->{'orderedSequences'}.=':'.$currentSequence;
             }              }
               $allkeys{'orderedSequences'}++;
   
     $lastResourceID=$hash{'map_finish_'.      $lastResourceID=$hash{'map_finish_'.
   $hash{'src_'.$currentResourceID}};    $hash{'src_'.$currentResourceID}};
Line 378  sub ProcessTopResourceMap { Line 390  sub ProcessTopResourceMap {
  $currentResourceID}));   $currentResourceID}));
   
     $cache->{$currentResourceID.':problem'}=$Problem;      $cache->{$currentResourceID.':problem'}=$Problem;
               $allkeys{$currentResourceID.':problem'}++;
     if(!defined($cache->{$currentSequence.':problems'})) {      if(!defined($cache->{$currentSequence.':problems'})) {
  $cache->{$currentSequence.':problems'}=$currentResourceID;   $cache->{$currentSequence.':problems'}=$currentResourceID;
     } else {      } else {
  $cache->{$currentSequence.':problems'}.=   $cache->{$currentSequence.':problems'}.=
     ':'.$currentResourceID;      ':'.$currentResourceID;
     }      }
               $allkeys{$currentSequence.':problems'}++;
   
     my $meta=$hash{'src_'.$currentResourceID};      my $meta=$hash{'src_'.$currentResourceID};
 #            $cache->{$currentResourceID.':title'}=  #            $cache->{$currentResourceID.':title'}=
 #                &Apache::lonnet::metdata($meta,'title');  #                &Apache::lonnet::metdata($meta,'title');
             $cache->{$currentResourceID.':title'}=              $cache->{$currentResourceID.':title'}=
                 $hash{'title_'.$currentResourceID};                  $hash{'title_'.$currentResourceID};
               $allkeys{$currentResourceID.':title'}++;
             $cache->{$currentResourceID.':source'}=              $cache->{$currentResourceID.':source'}=
                 $hash{'src_'.$currentResourceID};                  $hash{'src_'.$currentResourceID};
               $allkeys{$currentResourceID.':source'}++;
   
             # Get Parts for problem              # Get Parts for problem
             my %beenHere;              my %beenHere;
Line 408  sub ProcessTopResourceMap { Line 424  sub ProcessTopResourceMap {
                             $cache->{$currentSequence.':'.$currentResourceID.                              $cache->{$currentSequence.':'.$currentResourceID.
                                      ':parts'}.=':'.$partId;                                       ':parts'}.=':'.$partId;
                         }                          }
                           $allkeys{$currentSequence.':'.$currentResourceID.
                                     ':parts'}++;
                     }                      }
                     if($beenHere{'r:'.$partId.':'.$responseId} == 0) {                      if($beenHere{'r:'.$partId.':'.$responseId} == 0) {
                         $beenHere{'r:'.$partId.':'.$responseId}++;                          $beenHere{'r:'.$partId.':'.$responseId}++;
Line 421  sub ProcessTopResourceMap { Line 439  sub ProcessTopResourceMap {
                                      ':'.$partId.':responseIDs'}.=':'.                                       ':'.$partId.':responseIDs'}.=':'.
                                                                   $responseId;                                                                    $responseId;
                         }                          }
                           $allkeys{$currentSequence.':'.$currentResourceID.':'.
                                        $partId.':responseIDs'}++;
                     }                      }
                     if(/^optionresponse/ &&                       if(/^optionresponse/ && 
                        $beenHere{'o:'.$partId.':'.$currentResourceID} == 0) {                         $beenHere{'o:'.$partId.':'.$currentResourceID} == 0) {
Line 434  sub ProcessTopResourceMap { Line 454  sub ProcessTopResourceMap {
                                 $currentResourceID.':'.                                  $currentResourceID.':'.
                                 $partId.':'.$responseId;                                  $partId.':'.$responseId;
                         }                          }
                           $allkeys{'OptionResponses'}++;
                     }                      }
                 }                  }
             }              }
Line 449  sub ProcessTopResourceMap { Line 470  sub ProcessTopResourceMap {
  # Capture sequence information here   # Capture sequence information here
  $cache->{$currentSequence.':title'}=   $cache->{$currentSequence.':title'}=
     $hash{'title_'.$currentResourceID};      $hash{'title_'.$currentResourceID};
                   $allkeys{$currentSequence.':title'}++;
                 $cache->{$currentSequence.':source'}=                  $cache->{$currentSequence.':source'}=
                     $hash{'src_'.$currentResourceID};                      $hash{'src_'.$currentResourceID};
                   $allkeys{$currentSequence.':source'}++;
   
                 my $totalProblems=0;                  my $totalProblems=0;
                 foreach my $currentProblem (split(/\:/,                  foreach my $currentProblem (split(/\:/,
Line 474  sub ProcessTopResourceMap { Line 497  sub ProcessTopResourceMap {
     $cache->{$currentSequence.':columnWidth'}=      $cache->{$currentSequence.':columnWidth'}=
                         (scalar @titleLength);                          (scalar @titleLength);
  }   }
                   $allkeys{$currentSequence.':columnWidth'}++;
     } else {      } else {
                 # Remove sequence from list, if it contains no problems to                  # Remove sequence from list, if it contains no problems to
                 # display.                  # display.
Line 510  sub ProcessTopResourceMap { Line 534  sub ProcessTopResourceMap {
  $currentResourceID=pop(@currentResource);   $currentResourceID=pop(@currentResource);
     }      }
   
       my @theKeys = keys(%allkeys);
       my $newkeys = join(':::', @theKeys);
       $cache->{'ResourceKeys'} = join(':::', $newkeys);
       if($newkeys ne $oldkeys) {
           $cache->{'ResourceUpdated'} = 'true';
       } else {
           $cache->{'ResourceUpdated'} = 'false';
       }
   
     unless (untie(%hash)) {      unless (untie(%hash)) {
         &Apache::lonnet::logthis("<font color=blue>WARNING: ".          &Apache::lonnet::logthis("<font color=blue>WARNING: ".
                                  "Could not untie coursemap $fn (browse)".                                   "Could not untie coursemap $fn (browse)".
Line 553  browser Line 586  browser
 Output: @names  Output: @names
   
 @names:  An array of students whose information has been processed, and are to   @names:  An array of students whose information has been processed, and are to 
 be considered in an arbitrary order.  be considered in an arbitrary order.  The entries in @names are of the form
   username:domain.
   
   The values in $cache are as follows:
   
    *NOTE: for the following $name implies username:domain
    $name.':error'                  only defined if an error occured.  Value
                                    contains the error message
    $name.':lastDownloadTime'       unconverted time of the last update of a
                                    student\'s course data
    $name.'updateTime'              coverted time of the last update of a 
                                    student\'s course data
    $name.':username'               username of a student
    $name.':domain'                 domain of a student
    $name.':fullname'               full name of a student
    $name.':id'                     PID of a student
    $name.':Status'                 active/expired status of a student
    $name.':section'                section of a student
   
 =back  =back
   
Line 576  sub ProcessClasslist { Line 626  sub ProcessClasslist {
         if($c->aborted()) {          if($c->aborted()) {
             return ();              return ();
         }          }
         my $studentInformation = $classlist->{$name.':studentInformation'},          my $studentInformation = $classlist->{$name.':studentInformation'};
         my $sectionData = $classlist->{$name.':sections'},          my $date = $classlist->{$name};
         my $date = $classlist->{$name},  
         my ($studentName,$studentDomain) = split(/\:/,$name);          my ($studentName,$studentDomain) = split(/\:/,$name);
   
         $cache->{$name.':username'}=$studentName;          $cache->{$name.':username'}=$studentName;
Line 613  sub ProcessClasslist { Line 662  sub ProcessClasslist {
         $courseID=~s/^(\w)/\/$1/;          $courseID=~s/^(\w)/\/$1/;
   
         my $sec='';          my $sec='';
           my $sectionData = $classlist->{$name.':sections'};
         foreach my $key (keys (%$sectionData)) {          foreach my $key (keys (%$sectionData)) {
             my $value = $sectionData->{$key};              my $value = $sectionData->{$key};
             if ($key=~/^$courseID(?:\/)*(\w+)*\_st$/) {              if ($key=~/^$courseID(?:\/)*(\w+)*\_st$/) {
Line 620  sub ProcessClasslist { Line 670  sub ProcessClasslist {
                 if($key eq $courseID.'_st') {                  if($key eq $courseID.'_st') {
                     $tempsection='';                      $tempsection='';
                 }                  }
                 my ($dummy,$roleend,$rolestart)=split(/\_/,$value);                  my (undef,$roleend,$rolestart)=split(/\_/,$value);
                 if($roleend eq $end && $rolestart eq $start) {                  if($roleend eq $end && $rolestart eq $start) {
                     $sec = $tempsection;                      $sec = $tempsection;
                     last;                      last;
Line 693  sub ProcessStudentData { Line 743  sub ProcessStudentData {
         return;          return;
     }      }
   
       # This little delete thing, should not be here.  Move some other
       # time though.
       if(defined($cache->{$name.':keys'})) {
    foreach (split(':::', $cache->{$name.':keys'})) {
       delete $cache->{$name.':'.$_};
    }
           delete $cache->{$name.':keys'};
       }
   
       my %courseKeys;
     # user name:domain was prepended earlier in DownloadCourseInformation      # user name:domain was prepended earlier in DownloadCourseInformation
     foreach (keys %$courseData) {      foreach (keys %$courseData) {
    my $currentKey = $_;
    $currentKey =~ s/^$name//;
    $courseKeys{$currentKey}++;
         $cache->{$_}=$courseData->{$_};          $cache->{$_}=$courseData->{$_};
     }      }
   
       $cache->{$name.':keys'} = join(':::', keys(%courseKeys));
   
     return;      return;
 }  }
   
Line 753  sub ExtractStudentData { Line 818  sub ExtractStudentData {
         return;          return;
     }      }
   
       # This little delete thing, should not be here.  Move some other
       # time though.
       my %allkeys;
       if(defined($output->{$name.':keys'})) {
    foreach (split(':::', $output->{$name.':keys'})) {
       delete $output->{$name.':'.$_};
    }
           delete $output->{$name.':keys'};
       }
   
     my ($username,$domain)=split(':',$name);      my ($username,$domain)=split(':',$name);
   
     my $Version;      my $Version;
Line 768  sub ExtractStudentData { Line 843  sub ExtractStudentData {
   
             # Output dashes for all the parts of this problem if there              # Output dashes for all the parts of this problem if there
             # is no version information about the current problem.              # is no version information about the current problem.
               $output->{$name.':'.$problemID.':NoVersion'} = 'false';
               $allkeys{$name.':'.$problemID.':NoVersion'}++;
             if(!$LatestVersion) {              if(!$LatestVersion) {
                 foreach my $part (split(/\:/,$data->{$sequence.':'.                  foreach my $part (split(/\:/,$data->{$sequence.':'.
                                                       $problemID.                                                        $problemID.
Line 775  sub ExtractStudentData { Line 852  sub ExtractStudentData {
                     $output->{$name.':'.$problemID.':'.$part.':tries'} = 0;                      $output->{$name.':'.$problemID.':'.$part.':tries'} = 0;
                     $output->{$name.':'.$problemID.':'.$part.':awarded'} = 0;                      $output->{$name.':'.$problemID.':'.$part.':awarded'} = 0;
                     $output->{$name.':'.$problemID.':'.$part.':code'} = ' ';                      $output->{$name.':'.$problemID.':'.$part.':code'} = ' ';
       $allkeys{$name.':'.$problemID.':'.$part.':tries'}++;
       $allkeys{$name.':'.$problemID.':'.$part.':awarded'}++;
       $allkeys{$name.':'.$problemID.':'.$part.':code'}++;
                     $totalProblems++;                      $totalProblems++;
                 }                  }
                 $output->{$name.':'.$problemID.':NoVersion'} = 'true';                  $output->{$name.':'.$problemID.':NoVersion'} = 'true';
Line 860  sub ExtractStudentData { Line 940  sub ExtractStudentData {
                                                  ':parts'})) {                                                   ':parts'})) {
                 $output->{$name.':'.$problemID.':'.$part.':wrong'} =                   $output->{$name.':'.$problemID.':'.$part.':wrong'} = 
                     $partData{$part.':tries'};                      $partData{$part.':tries'};
    $allkeys{$name.':'.$problemID.':'.$part.':wrong'}++;
   
                 if($partData{$part.':code'} eq '*') {                  if($partData{$part.':code'} eq '*') {
                     $output->{$name.':'.$problemID.':'.$part.':wrong'}--;                      $output->{$name.':'.$problemID.':'.$part.':wrong'}--;
Line 875  sub ExtractStudentData { Line 956  sub ExtractStudentData {
                     $partData{$part.':code'};                      $partData{$part.':code'};
                 $output->{$name.':'.$problemID.':'.$part.':awarded'} =                  $output->{$name.':'.$problemID.':'.$part.':awarded'} =
                     $partData{$part.':awarded'};                      $partData{$part.':awarded'};
    $allkeys{$name.':'.$problemID.':'.$part.':tries'}++;
    $allkeys{$name.':'.$problemID.':'.$part.':code'}++;
    $allkeys{$name.':'.$problemID.':'.$part.':awarded'}++;
   
                 $totalAwarded += $partData{$part.':awarded'};                  $totalAwarded += $partData{$part.':awarded'};
                 $output->{$name.':'.$problemID.':'.$part.':timestamp'} =                  $output->{$name.':'.$problemID.':'.$part.':timestamp'} =
                     $partData{$part.':timestamp'};                      $partData{$part.':timestamp'};
    $allkeys{$name.':'.$problemID.':'.$part.':timestamp'}++;
   
                 foreach my $response (split(':', $data->{$sequence.':'.                  foreach my $response (split(':', $data->{$sequence.':'.
                                                          $problemID.':'.                                                           $problemID.':'.
                                                          $part.':responseIDs'})) {                                                           $part.':responseIDs'})) {
                     $output->{$name.':'.$problemID.':'.$part.':'.$response.                      $output->{$name.':'.$problemID.':'.$part.':'.$response.
                               ':submission'}=join(':::',@submissions);                                ':submission'}=join(':::',@submissions);
       $allkeys{$name.':'.$problemID.':'.$part.':'.$response.
        ':submission'}++;
                 }                  }
   
                 if($partData{$part.':code'} ne 'x') {                  if($partData{$part.':code'} ne 'x') {
Line 892  sub ExtractStudentData { Line 981  sub ExtractStudentData {
         }          }
   
         $output->{$name.':'.$sequence.':problemsCorrect'} = $problemsCorrect;          $output->{$name.':'.$sequence.':problemsCorrect'} = $problemsCorrect;
    $allkeys{$name.':'.$sequence.':problemsCorrect'}++;
         $problemsSolved += $problemsCorrect;          $problemsSolved += $problemsCorrect;
  $problemsCorrect=0;   $problemsCorrect=0;
     }      }
Line 899  sub ExtractStudentData { Line 989  sub ExtractStudentData {
     $output->{$name.':problemsSolved'} = $problemsSolved;      $output->{$name.':problemsSolved'} = $problemsSolved;
     $output->{$name.':totalProblems'} = $totalProblems;      $output->{$name.':totalProblems'} = $totalProblems;
     $output->{$name.':totalAwarded'} = $totalAwarded;      $output->{$name.':totalAwarded'} = $totalAwarded;
       $allkeys{$name.':problemsSolved'}++;
       $allkeys{$name.':totalProblems'}++;
       $allkeys{$name.':totalAwarded'}++;
   
       $output->{$name.':keys'} = join(':::', keys(%allkeys));
   
     return;      return;
 }  }
Line 989  sub ProcessFullName { Line 1084  sub ProcessFullName {
     my ($lastname, $generation, $firstname, $middlename)=@_;      my ($lastname, $generation, $firstname, $middlename)=@_;
     my $Str = '';      my $Str = '';
   
       # Strip whitespace preceeding & following name components.
       $lastname   =~ s/(\s+$|^\s+)//g;
       $generation =~ s/(\s+$|^\s+)//g;
       $firstname  =~ s/(\s+$|^\s+)//g;
       $middlename =~ s/(\s+$|^\s+)//g;
   
     if($lastname ne '') {      if($lastname ne '') {
  $Str .= $lastname.' ';   $Str .= $lastname;
  if($generation ne '') {   $Str .= ' '.$generation if ($generation ne '');
     $Str .= $generation;   $Str .= ',';
  } else {          $Str .= ' '.$firstname  if ($firstname ne '');
     chop($Str);          $Str .= ' '.$middlename if ($middlename ne '');
  }  
  $Str .= ', ';  
  if($firstname ne '') {  
     $Str .= $firstname.' ';  
  }  
  if($middlename ne '') {  
     $Str .= $middlename;  
  } else {  
     chop($Str);  
     if($firstname eq '') {  
  chop($Str);  
     }  
  }  
     } else {      } else {
  if($firstname ne '') {          $Str .= $firstname      if ($firstname ne '');
     $Str .= $firstname.' ';          $Str .= ' '.$middlename if ($middlename ne '');
  }          $Str .= ' '.$generation if ($generation ne '');
  if($middlename ne '') {  
     $Str .= $middlename.' ';  
  }  
  if($generation ne '') {  
     $Str .= $generation;  
  } else {  
     chop($Str);  
  }  
     }      }
   
     return $Str;      return $Str;
Line 1095  sub DownloadStudentCourseData { Line 1175  sub DownloadStudentCourseData {
     my $title = 'LON-CAPA Statistics';      my $title = 'LON-CAPA Statistics';
     my $heading = 'Download and Process Course Data';      my $heading = 'Download and Process Course Data';
     my $studentCount = scalar(@$students);      my $studentCount = scalar(@$students);
     my %cache;  
   
   
     my $WhatIWant;      my $WhatIWant;
     $WhatIWant = '(^version:|';      $WhatIWant = '(^version:|';
Line 1113  sub DownloadStudentCourseData { Line 1191  sub DownloadStudentCourseData {
     my $displayString;      my $displayString;
     my $count=0;      my $count=0;
     foreach (@$students) {      foreach (@$students) {
           my %cache;
   
         if($c->aborted()) { return 'Aborted'; }          if($c->aborted()) { return 'Aborted'; }
   
         if($status eq 'true') {          if($status eq 'true') {
Line 1122  sub DownloadStudentCourseData { Line 1202  sub DownloadStudentCourseData {
         }          }
   
         my $downloadTime='Not downloaded';          my $downloadTime='Not downloaded';
           my $needUpdate = 'false';
         if($checkDate eq 'true'  &&           if($checkDate eq 'true'  && 
            tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {             tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
             $downloadTime = $cache{$_.':lastDownloadTime'};              $downloadTime = $cache{$_.':lastDownloadTime'};
               $needUpdate = $cache{'ResourceUpdated'};
             untie(%cache);              untie(%cache);
         }          }
   
         if($c->aborted()) { return 'Aborted'; }          if($c->aborted()) { return 'Aborted'; }
   
         if($downloadTime eq 'Not downloaded') {          if($needUpdate eq 'true') {
             my $courseData =               $downloadTime = 'Not downloaded';
                 &DownloadCourseInformation($_, $courseID, $downloadTime,    }
                                            $WhatIWant);   my $courseData = 
             if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {      &DownloadCourseInformation($_, $courseID, $downloadTime, 
                 foreach my $key (keys(%$courseData)) {         $WhatIWant);
                     if($key =~ /^(con_lost|error|no_such_host)/i) {   if(tie(%cache,'GDBM_File',$cacheDB,&GDBM_WRCREAT(),0640)) {
                         $courseData->{$_.':error'} = 'No course data for '.$_;      foreach my $key (keys(%$courseData)) {
                         last;   if($key =~ /^(con_lost|error|no_such_host)/i) {
                     }      $courseData->{$_.':error'} = 'No course data for '.$_;
                 }      last;
                 if($extract eq 'true') {   }
                     &ExtractStudentData($courseData, \%cache, \%cache, $_);      }
                 } else {      if($extract eq 'true') {
                     &ProcessStudentData(\%cache, $courseData, $_);   &ExtractStudentData($courseData, \%cache, \%cache, $_);
                 }      } else {
                 untie(%cache);   &ProcessStudentData(\%cache, $courseData, $_);
             } else {      }
                 next;      untie(%cache);
             }   } else {
         }      next;
    }
     }      }
     if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); }      if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); }
   
Line 1170  sub DownloadStudentCourseDataSeparate { Line 1253  sub DownloadStudentCourseDataSeparate {
     $WhatIWant .= '|timestamp)';      $WhatIWant .= '|timestamp)';
     $WhatIWant .= ')';      $WhatIWant .= ')';
   
     &CheckForResidualDownload($courseID, $cacheDB, $students, $c);      &CheckForResidualDownload($cacheDB, 'true', 'true', $courseID, $r, $c);
   
     my %cache;  
   
     my $studentCount = scalar(@$students);      my $studentCount = scalar(@$students);
     if($status eq 'true') {      if($status eq 'true') {
Line 1191  sub DownloadStudentCourseDataSeparate { Line 1272  sub DownloadStudentCourseDataSeparate {
             &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);              &Apache::lonhtmlcommon::Update_PrgWin($displayString, $r);
         }          }
   
           my %cache;
         my $downloadTime='Not downloaded';          my $downloadTime='Not downloaded';
           my $needUpdate = 'false';
         if($checkDate eq 'true'  &&           if($checkDate eq 'true'  && 
            tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {             tie(%cache,'GDBM_File',$cacheDB,&GDBM_READER(),0640)) {
             $downloadTime = $cache{$_.':lastDownloadTime'};              $downloadTime = $cache{$_.':lastDownloadTime'};
               $needUpdate = $cache{'ResourceUpdated'};
             untie(%cache);              untie(%cache);
         }          }
   
Line 1202  sub DownloadStudentCourseDataSeparate { Line 1286  sub DownloadStudentCourseDataSeparate {
             return 'Aborted';              return 'Aborted';
         }          }
   
         if($downloadTime eq 'Not downloaded') {          if($needUpdate eq 'true') {
             my $error = 0;              $downloadTime = 'Not downloaded';
             my $courseData =    }
                 &DownloadCourseInformation($_, $courseID, $downloadTime,  
                                            $WhatIWant);          my $error = 0;
             my %downloadData;          my $courseData = 
             unless(tie(%downloadData,'GDBM_File',$residualFile,              &DownloadCourseInformation($_, $courseID, $downloadTime,
                        &GDBM_WRCREAT(),0640)) {                                         $WhatIWant);
                 return 'Failed to tie temporary download hash.';          my %downloadData;
             }          unless(tie(%downloadData,'GDBM_File',$residualFile,
             foreach my $key (keys(%$courseData)) {                     &GDBM_WRCREAT(),0640)) {
                 $downloadData{$key} = $courseData->{$key};              return 'Failed to tie temporary download hash.';
                 if($key =~ /^(con_lost|error|no_such_host)/i) {          }
                     $error = 1;          foreach my $key (keys(%$courseData)) {
                     last;              $downloadData{$key} = $courseData->{$key};
                 }              if($key =~ /^(con_lost|error|no_such_host)/i) {
                   $error = 1;
                   last;
             }              }
             if($error) {          }
                 foreach my $deleteKey (keys(%$courseData)) {          if($error) {
                     delete $downloadData{$deleteKey};              foreach my $deleteKey (keys(%$courseData)) {
                 }                  delete $downloadData{$deleteKey};
                 $downloadData{$_.':error'} = 'No course data for '.$_;  
             }              }
             untie(%downloadData);              $downloadData{$_.':error'} = 'No course data for '.$_;
         }          }
           untie(%downloadData);
     }      }
     if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); }      if($status eq 'true') { &Apache::lonhtmlcommon::Close_PrgWin($r); }
   
Line 1301  sub CheckForResidualDownload { Line 1387  sub CheckForResidualDownload {
     return 'OK';      return 'OK';
 }  }
   
   ################################################
   ################################################
   
   =pod
   
   =item &get_classlist();
   
   Retrieve the classist of a given class or of the current class.  Student
   information is returned from the classlist.db file and, if needed,
   from the students environment.
   
   Optional arguments are $cid, $cdom, and $cnum (course id, course domain,
   and course number, respectively).  Any omitted arguments will be taken 
   from the current environment ($ENV{'request.course.id'},
   $ENV{'course.'.$cid.'.domain'}, and $ENV{'course.'.$cid.'.num'}).
   
   Returns a reference to a hash which contains:
    keys    '$sname:$sdom'
    values  [$end,$start,$id,$section,$fullname]
   
   =cut
   
   ################################################
   ################################################
   
   sub get_classlist {
       my ($cid,$cdom,$cnum) = @_;
       $cid = $cid || $ENV{'request.course.id'};
       $cdom = $cdom || $ENV{'course.'.$cid.'.domain'};
       $cnum = $cnum || $ENV{'course.'.$cid.'.num'};
      my $now = time;
       #
       my %classlist=&Apache::lonnet::dump('classlist',$cdom,$cnum);
       while (my ($student,$info) = each(%classlist)) {
           return undef if ($student =~ /^(con_lost|error|no_such_host)/i);
           my ($sname,$sdom) = split(/:/,$student);
           my @Values = split(/:/,$info);
           my ($end,$start,$id,$section,$fullname);
           if (@Values > 2) {
               ($end,$start,$id,$section,$fullname) = @Values;
           } else { # We have to get the data ourselves
               ($end,$start) = @Values;
               $section = &Apache::lonnet::usection($sdom,$sname,$cid);
               my %info=&Apache::lonnet::get('environment',
                                             ['firstname','middlename',
                                              'lastname','generation','id'],
                                             $sdom, $sname);
               my ($tmp) = keys(%info);
               if ($tmp =~/^(con_lost|error|no_such_host)/i) {
                   $fullname = 'not available';
                   $id = 'not available';
               } else {
                   $fullname = &ProcessFullName(@info{qw/lastname generation 
                                                          firstname middlename/});
                   $id = $info{'id'};
               }
               # At this point, if we have the data (check for 'not available's
               # we could put it back into the classlist.db file. 
               # We have not decided to do that yet.
           }
           my $status='Expired';
           if(((!$end) || $now < $end) && ((!$start) || ($now > $start))) {
               $status='Active';
           }
           $classlist{$student} = 
               [$sdom,$sname,$end,$start,$id,$section,$fullname,$status];
       }
       if (wantarray()) {
           return (\%classlist,['domain','username','end','start','id',
                                'section','fullname','status']);
       } else {
           return \%classlist;
       }
   }
   
 # ----- END HELPER FUNCTIONS --------------------------------------------  # ----- END HELPER FUNCTIONS --------------------------------------------
   
 1;  1;
 __END__  __END__
   

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


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