Diff for /loncom/interface/loncoursedata.pm between versions 1.2 and 1.3

version 1.2, 2002/07/17 12:38:25 version 1.3, 2002/07/22 20:35:05
Line 70  here in the future. Line 70  here in the future.
   
 =pod  =pod
   
 =item &DownloadNamePIDSection()  =item &DownloadClasslist()
   
 Collects lastname, generation, middlename, firstname, PID, and section for each  Collects lastname, generation, middlename, firstname, PID, and section for each
 student from their environment database.  The list of students is built from  student from their environment database.  The list of students is built from
Line 101  middlename, and PID : Key is $name.'stud Line 101  middlename, and PID : Key is $name.'stud
   
 =cut  =cut
   
 sub DownloadStudentNamePIDSection {  sub DownloadClasslist {
     my ($courseID, $c)=@_;      my ($courseID, $lastDownloadTime, $c)=@_;
     my ($courseDomain,$courseNumber)=split(/\_/,$courseID);      my ($courseDomain,$courseNumber)=split(/\_/,$courseID);
       my %classlist;
   
     my %classlist=&Apache::lonnet::dump('classlist',$courseDomain,      my $modifiedTime = &GetFileTimestamp($courseDomain, $courseNumber,
                                         $courseNumber);                                       'classlist.db', 
                                        $Apache::lonnet::perlvar{'lonUsersDir'});
   
       if($lastDownloadTime ne 'Not downloaded' &&
          $lastDownloadTime >= $modifiedTime && $modifiedTime >= 0) {
           $classlist{'lastDownloadTime'}=time;
           $classlist{'UpToDate'} = 'true';
           return \%classlist;
       }
   
       %classlist=&Apache::lonnet::dump('classlist',$courseDomain, $courseNumber);
     my ($checkForError)=keys (%classlist);      my ($checkForError)=keys (%classlist);
     if($checkForError =~ /^(con_lost|error|no_such_host)/i) {      if($checkForError =~ /^(con_lost|error|no_such_host)/i) {
         return \%classlist;          return \%classlist;
Line 135  sub DownloadStudentNamePIDSection { Line 146  sub DownloadStudentNamePIDSection {
   
         #Section          #Section
         my %section=&Apache::lonnet::dump('roles',$studentDomain,$studentName);          my %section=&Apache::lonnet::dump('roles',$studentDomain,$studentName);
         $classlist{$name.':section'}=\%section;          $classlist{$name.':sections'}=\%section;
     }      }
   
       $classlist{'UpToDate'} = 'false';
       $classlist{'lastDownloadTime'}=time;
   
     return \%classlist;      return \%classlist;
 }  }
   
Line 146  sub DownloadStudentNamePIDSection { Line 160  sub DownloadStudentNamePIDSection {
 =item &DownloadStudentCourseInformation()  =item &DownloadStudentCourseInformation()
   
 Dump of all the course information for a single student.  There is no  Dump of all the course information for a single student.  There is no
 pruning of data, it is all stored in a hash and returned.  pruning of data, it is all stored in a hash and returned.  It also
   checks the timestamp of the students course database file and only downloads
   if it has been modified since the last download.
   
 =over 4  =over 4
   
Line 166  database. Line 182  database.
 =cut  =cut
   
 sub DownloadStudentCourseInformation {  sub DownloadStudentCourseInformation {
     my ($name,$courseID)=@_;      my ($name,$courseID,$lastDownloadTime)=@_;
       my %courseData;
     my ($studentName,$studentDomain) = split(/\:/,$name);      my ($studentName,$studentDomain) = split(/\:/,$name);
   
       my $modifiedTime = &GetFileTimestamp($studentDomain, $studentName,
                                         $courseID.'.db', 
                                         $Apache::lonnet::perlvar{'lonUsersDir'});
       if($lastDownloadTime >= $modifiedTime) {
           $courseData{'lastDownloadTime'}=time;
           $courseData{'UpToDate'} = 'true';
           return \%courseData;
       }
   
     # Download student course data      # Download student course data
     my %courseData=&Apache::lonnet::dump($courseID,$studentDomain,      %courseData=&Apache::lonnet::dump($courseID, $studentDomain, $studentName);
  $studentName);      $courseData{'UpToDate'} = 'false';
       $courseData{'lastDownloadTime'}=time;
     return \%courseData;      return \%courseData;
 }  }
   
Line 447  chart. Line 474  chart.
   
 =back  =back
   
 =cut  
   
 sub ProcessSection {  sub ProcessSection {
     my ($sectionData,$courseid,$ActiveFlag)=@_;      my ($sectionData,$courseid,$ActiveFlag)=@_;
Line 455  sub ProcessSection { Line 481  sub ProcessSection {
     $courseid=~s/^(\w)/\/$1/;      $courseid=~s/^(\w)/\/$1/;
   
     my $cursection='-1';      my $cursection='-1';
     my $oldsection='-1';      my $oldend='-1';
     my $status='Expired';      my $status='Expired';
     my $section='';      my $section='';
     foreach my $key (keys (%$sectionData)) {      foreach my $key (keys (%$sectionData)) {
Line 485  sub ProcessSection { Line 511  sub ProcessSection {
                 last;                  last;
             }              }
             if($notactive == 1) {              if($notactive == 1) {
                 $oldsection=$section;                  if($end > $oldend) {
                       $cursection=$section;
                       $oldend = $end;
                   }
             }              }
  }   }
     }      }
     if($status eq $ActiveFlag) {  
         if($cursection eq '-1') {  
             return $oldsection;  
         }  
         return $cursection;  
     }  
     if($ActiveFlag eq 'Any') {  
         if($cursection eq '-1') {  
             return $oldsection;  
         }  
         return $cursection;  
     }  
     return '-1';  
 }  
   
 =pod  
   
 =item &ProcessNamePIDSection()  
   
 Takes data downloaded for a student and breaks it up into managable pieces and   
 stored in cache data.  The username, domain, class related date, PID,   
 full name, and section are all processed here.  
   
 =over 4  
   
 Input: $cache, $studentInformation, $section, $date, $name, $courseID  
   
 $cache:  A hash pointer to store the data      return ($cursections, $status);
   }
 $studentInformation:  Student information is what was requested in   
 &DownloadPrerequistedData().  See that function for what data is requested.  
   
 $section: A hash pointer to class section related information.  
   
 $date:  A composite of the start and end date for this class for this  
 student.  Format:  end:start  
   
 $name:  the username:domain information  
   
 $courseID: The course ID  
   
 Output: None  
   
 *NOTE:  There is no return value, but if an error occurs a key is added to   
 the cache data with the value being the error message.  The key is   
 username:domain:error.  It will only exist if an error occurs.  
   
 =back  
   
 =cut  =cut
   
 sub ProcessStudentNamePIDSection {  
     my ($cache,$studentInformation,$section,$date,$name,$courseID,$status)=@_;  
     my ($studentName,$studentDomain) = split(/\:/,$name);  
   
     $cache->{$name.':username'}=$studentName;  
     $cache->{$name.':domain'}=$studentDomain;  
     $cache->{$name.':date'}=$date;  
   
     my ($checkForError)=keys(%$studentInformation);  
     if($checkForError =~ /^(con_lost|error|no_such_host)/i) {  
  $cache->{$name.':error'}=  
     'Could not download student environment data.';  
  $cache->{$name.':fullname'}='';  
  $cache->{$name.':id'}='';  
     } else {  
  $cache->{$name.':fullname'}=&ProcessFullName(  
                                           $studentInformation->{'lastname'},  
           $studentInformation->{'generation'},  
           $studentInformation->{'firstname'},  
                                           $studentInformation->{'middlename'});  
  $cache->{$name.':id'}=$studentInformation->{'id'};  
     }  
   
     my $sec=&ProcessSection($section, $courseID, $status);  
     if($sec != -1) {  
         $cache->{$name.':section'}=$sec;  
     } else {  
         $cache->{$name.':section'}='';  
     }  
   
     return;  
 }  
   
 =pod  =pod
   
 =item &ProcessClassList()  =item &ProcessClasslist()
   
 Taking the class list dumped from &DownloadPrerequisiteData(), all the   Taking the class list dumped from &DownloadClasslist(), all the 
 students and their non-class information is processed using the   students and their non-class information is processed using the 
 &ProcessStudentInformation() function.  A date stamp is also recorded for  &ProcessStudentInformation() function.  A date stamp is also recorded for
 when the data was processed.  when the data was processed.
   
   Takes data downloaded for a student and breaks it up into managable pieces and 
   stored in cache data.  The username, domain, class related date, PID, 
   full name, and section are all processed here.
   
   
 =over 4  =over 4
   
 Input: $cache, $classlist, $courseID, $ChartDB, $c  Input: $cache, $classlist, $courseID, $ChartDB, $c
Line 589  Input: $cache, $classlist, $courseID, $C Line 545  Input: $cache, $classlist, $courseID, $C
 $cache: A hash pointer to store the data  $cache: A hash pointer to store the data
   
 $classlist:  The hash of data collected about a student from   $classlist:  The hash of data collected about a student from 
 &DownloadPrerequisteData().  The hash contains a list of students, a pointer   &DownloadClasslist().  The hash contains a list of students, a pointer 
 to a hash of student information for each student, and each student's section   to a hash of student information for each student, and each student's section 
 number.  number.
   
Line 609  be considered in an arbitrary order. Line 565  be considered in an arbitrary order.
   
 =cut  =cut
   
 sub ProcessClassList {  sub ProcessClasslist {
     my ($cache,$classlist,$courseID,$status,$c)=@_;      my ($cache,$classlist,$courseID,$c)=@_;
     my @names=();      my @names=();
   
       $cache->{'ClasslistTimeStamp'}=$classlist->{'lastDownloadTime'};
       if($classlist->{'UpToDate'} eq 'true') {
           return split(/:::/,$cache->{'NamesOfStudents'});;
       }
   
     foreach my $name (keys(%$classlist)) {      foreach my $name (keys(%$classlist)) {
         if($name =~ /\:section/ || $name =~ /\:studentInformation/ ||          if($name =~ /\:section/ || $name =~ /\:studentInformation/ ||
            $name eq '') {             $name eq '' || $name eq 'UpToDate' || $name eq 'lastDownloadTime') {
             next;              next;
         }          }
         if($c->aborted()) {          if($c->aborted()) {
             last;              return ();
         }          }
         push(@names,$name);          push(@names,$name);
         &ProcessStudentNamePIDSection($cache,          my $studentInformation = $classlist->{$name.':studentInformation'},
                                      $classlist->{$name.':studentInformation'},          my $sectionData = $classlist->{$name.':sections'},
                                      $classlist->{$name.':section'},          my $date = $classlist->{$name},
                                      $classlist->{$name},          my ($studentName,$studentDomain) = split(/\:/,$name);
                                      $name,$courseID,$status);  
           $cache->{$name.':username'}=$studentName;
           $cache->{$name.':domain'}=$studentDomain;
           if(!defined($cache->{$name.':lastDownloadTime'})) {
               $cache->{$name.':lastDownloadTime'}='Not downloaded';
           }
   
           my ($checkForError)=keys(%$studentInformation);
           if($checkForError =~ /^(con_lost|error|no_such_host)/i) {
               $cache->{$name.':error'}=
                   'Could not download student environment data.';
               $cache->{$name.':fullname'}='';
               $cache->{$name.':id'}='';
           } else {
               $cache->{$name.':fullname'}=&ProcessFullName(
                                             $studentInformation->{'lastname'},
                                             $studentInformation->{'generation'},
                                             $studentInformation->{'firstname'},
                                             $studentInformation->{'middlename'});
               $cache->{$name.':id'}=$studentInformation->{'id'};
           }
   
           my ($end, $start)=split(':',$date);
           $courseID=~s/\_/\//g;
           $courseID=~s/^(\w)/\/$1/;
   
           my $sec='';
           foreach my $key (keys (%$sectionData)) {
               my $value = $sectionData->{$key};
               if ($key=~/^$courseID(?:\/)*(\w+)*\_st$/) {
                   my $tempsection=$1;
                   if($key eq $courseID.'_st') {
                       $tempsection='';
                   }
                   my ($dummy,$roleend,$rolestart)=split(/\_/,$value);
                   if($roleend eq $end && $rolestart eq $start) {
                       $sec = $tempsection;
                       last;
                   }
               }
           }
   
           my $status='Expired';
           if(((!$end) || time < $end) && ((!$start) || (time > $start))) {
               $status='Active';
           }
           $cache->{$name.':Status'}=$status;
           $cache->{$name.':section'}=$sec;
     }      }
   
     # Time of download      $cache->{'ClasslistTimestamp'}=time;
     $cache->{'time'}=localtime();      $cache->{'NamesOfStudents'}=join(':::',@names);
   
     return @names;      return @names;
 }  }
Line 671  will only exist if an error occured.  Th Line 679  will only exist if an error occured.  Th
 sub ProcessStudentData {  sub ProcessStudentData {
     my ($cache,$courseData,$name)=@_;      my ($cache,$courseData,$name)=@_;
   
     my ($checkForError) = keys(%$courseData);      if($courseData->{'UpToDate'} eq 'true') {
     if($checkForError =~ /^(con_lost|error|no_such_host)/i) {          $cache->{$name.':lastDownloadTime'}=$courseData->{'lastDownloadTime'};
         $cache->{$name.':error'}='Could not download course data.';          return;
     } else {      }
         foreach my $key (keys (%$courseData)) {  
             $cache->{$name.':'.$key}=$courseData->{$key};      my @courseKeys = keys(%$courseData);
         }  
         if(defined($cache->{'NamesOfStudents'})) {      foreach (@courseKeys) {
             $cache->{'NamesOfStudents'}.=':::'.$name;          if(/^(con_lost|error|no_such_host)/i) {
         } else {              $cache->{$name.':error'}='Could not download course data.';
             $cache->{'NamesOfStudents'}=$name;              return;
         }          }
     }      }
   
       $cache->{$name.':lastDownloadTime'}=$courseData->{'lastDownloadTime'};
       foreach (@courseKeys) {
           $cache->{$name.':'.$_}=$courseData->{$_};
       }
   
     return;      return;
 }  }
   
Line 815  sub TestCacheData { Line 828  sub TestCacheData {
     return $isCached;      return $isCached;
 }  }
   
 #sub CheckStatus {  sub GetFileTimestamp {
 #    my ($name, $data, $status)=@_;      my ($studentDomain,$studentName,$filename,$root)=@_;
       $studentDomain=~s/\W//g;
 #    if($status eq 'Any') {      $studentName=~s/\W//g;
 #        my $section = ' ';      my $subdir=$studentName.'__';
 #        foreach (split(':',$data->{$name.':Sections'})) {      $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
 #            if($data->{$name.':'.$_.'Status'} eq 'Active') {      my $proname="$studentDomain/$subdir/$studentName";
 #                return $_;      $proname .= '/'.$filename;
 #            }      my @dir = &Apache::lonnet::dirlist($proname, $studentDomain, $studentName,
 #            $section = $_;                                         $root);
 #        }      my $fileStat = $dir[0];
 #        return $_;      my @stats = split('&', $fileStat);
 #    }      if(@stats) {
           return $stats[9];
 #    foreach (split(':',$data->{$name.':Sections'})) {      } else {
 #        if($data->{$name.':'.$_.'Status'} eq $status) {          return -1;
 #            return $_;      }
 #        }  }
 #    }  
   
 #    foreach (split(':',$data->{$name.':Sections'})) {  
 #        if($data->{$name.':'.$_.'Status'} eq 'Any') {  
 #            return $_;  
 #        }  
 #    }  
   
 #    return 'not found';  
 #}  
   
 # ----- END HELPER FUNCTIONS --------------------------------------------  # ----- END HELPER FUNCTIONS --------------------------------------------
   

Removed from v.1.2  
changed lines
  Added in v.1.3


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