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

version 1.2, 2002/07/17 12:38:25 version 1.6, 2002/07/25 21:23:51
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;
 }  }
   
 =pod  =pod
   
 =item &DownloadStudentCourseInformation()  =item &DownloadCourseInformation()
   
 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 165  database. Line 181  database.
   
 =cut  =cut
   
 sub DownloadStudentCourseInformation {  sub DownloadCourseInformation {
     my ($name,$courseID)=@_;      my ($namedata,$courseID,$lastDownloadTime)=@_;
     my ($studentName,$studentDomain) = split(/\:/,$name);      my %courseData;
       my ($name,$domain) = split(/\:/,$namedata);
     # Download student course data  
     my %courseData=&Apache::lonnet::dump($courseID,$studentDomain,  #    my $modifiedTime = &GetFileTimestamp($domain, $name,
  $studentName);  #                                      $courseID.'.db', 
   #                                      $Apache::lonnet::perlvar{'lonUsersDir'});
   #    if($lastDownloadTime >= $modifiedTime) {
   #        $courseData{'lastDownloadTime'}=time;
   #        $courseData{'UpToDate'} = 'true';
   #        return \%courseData;
   #    }
   
       # Download course data
       %courseData=&Apache::lonnet::dump($courseID, $domain, $name);
       $courseData{'UpToDate'} = 'false';
       $courseData{'lastDownloadTime'}=time;
     return \%courseData;      return \%courseData;
 }  }
   
Line 422  sub ProcessTopResourceMap { Line 449  sub ProcessTopResourceMap {
   
 =pod  =pod
   
 =item &ProcessSection()  =item &ProcessClasslist()
   
 Determine the section number for a student for the class.  A student can have   
 multiple sections for the same class.  The correct one is chosen.  
   
 =over 4  
   
 Input: $sectionData, $courseid, $ActiveFlag  
   
 $sectionData:  A pointer to a hash containing all section data for this   
 student for the class  
   
 $courseid:  The course ID.  
   
 $ActiveFlag:  The student's active status (Active/Expired)  
   
 Output: $oldsection, $cursection, or -1  Taking the class list dumped from &DownloadClasslist(), all the 
   students and their non-class information is processed using the 
 $oldsection and $cursection and sections number that will be displayed in the   &ProcessStudentInformation() function.  A date stamp is also recorded for
 chart.  when the data was processed.
   
 -1 is returned if an error occurs.  
   
 =back  
   
 =cut  
   
 sub ProcessSection {  
     my ($sectionData,$courseid,$ActiveFlag)=@_;  
     $courseid=~s/\_/\//g;  
     $courseid=~s/^(\w)/\/$1/;  
   
     my $cursection='-1';  
     my $oldsection='-1';  
     my $status='Expired';  
     my $section='';  
     foreach my $key (keys (%$sectionData)) {  
  my $value = $sectionData->{$key};  
         if ($key=~/^$courseid(?:\/)*(\w+)*\_st$/) {  
     $section=$1;  
     if($key eq $courseid.'_st') {  
  $section='';  
     }  
   
     my ($dummy,$end,$start)=split(/\_/,$value);  
     my $now=time;  
             my $notactive=0;  
             if ($start) {  
                 if($now<$start) {  
                     $notactive=1;  
                 }  
             }  
             if($end) {  
                 if ($now>$end) {  
                     $notactive=1;  
                 }  
             }  
             if($notactive == 0) {  
                 $status='Active';  
                 $cursection=$section;  
                 last;  
             }  
             if($notactive == 1) {  
                 $oldsection=$section;  
             }  
  }  
     }  
     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   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,   stored in cache data.  The username, domain, class related date, PID, 
 full name, and section are all processed here.  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  
   
 $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  
   
 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  
   
 =item &ProcessClassList()  
   
 Taking the class list dumped from &DownloadPrerequisiteData(), all the   
 students and their non-class information is processed using the   
 &ProcessStudentInformation() function.  A date stamp is also recorded for  
 when the data was processed.  
   
 =over 4  =over 4
   
Line 589  Input: $cache, $classlist, $courseID, $C Line 468  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 488  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';
               $cache->{$name.':updateTime'}=' Not updated';
           }
   
           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 640  sub ProcessClassList { Line 572  sub ProcessClassList {
 =item &ProcessStudentData()  =item &ProcessStudentData()
   
 Takes the course data downloaded for a student in   Takes the course data downloaded for a student in 
 &DownloadStudentCourseInformation() and breaks it up into key value pairs  &DownloadCourseInformation() and breaks it up into key value pairs
 to be stored in the cached data.  The keys are comprised of the   to be stored in the cached data.  The keys are comprised of the 
 $username:$domain:$keyFromCourseDatabase.  The student username:domain is  $username:$domain:$keyFromCourseDatabase.  The student username:domain is
 stored away signifying that the student's information has been downloaded and   stored away signifying that the student's information has been downloaded and 
Line 662  Output: None Line 594  Output: None
 *NOTE:  There is no output, but an error message is stored away in the cache   *NOTE:  There is no output, but an error message is stored away in the cache 
 data.  This is checked in &FormatStudentData().  The key username:domain:error   data.  This is checked in &FormatStudentData().  The key username:domain:error 
 will only exist if an error occured.  The error is an error from   will only exist if an error occured.  The error is an error from 
 &DownloadStudentCourseInformation().  &DownloadCourseInformation().
   
 =back  =back
   
Line 671  will only exist if an error occured.  Th Line 603  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.';          if($courseData->{'lastDownloadTime'} eq 'Not downloaded') {
     } else {              $cache->{$name.':updateTime'} = ' Not updated';
         foreach my $key (keys (%$courseData)) {  
             $cache->{$name.':'.$key}=$courseData->{$key};  
         }  
         if(defined($cache->{'NamesOfStudents'})) {  
             $cache->{'NamesOfStudents'}.=':::'.$name;  
         } else {          } else {
             $cache->{'NamesOfStudents'}=$name;              $cache->{$name.':updateTime'}=
                   localtime($courseData->{'lastDownloadTime'});
         }          }
           return;
       }
   
       my @courseKeys = keys(%$courseData);
   
       foreach (@courseKeys) {
           if(/^(con_lost|error|no_such_host)/i) {
               $cache->{$name.':error'}='Could not download course data.';
               return;
           }
       }
   
       $cache->{$name.':lastDownloadTime'}=$courseData->{'lastDownloadTime'};
       if($courseData->{'lastDownloadTime'} eq 'Not downloaded') {
           $cache->{$name.':updateTime'} = ' Not updated';
       } else {
           $cache->{$name.':updateTime'}=
               localtime($courseData->{'lastDownloadTime'});
       }
       foreach (@courseKeys) {
           $cache->{$name.':'.$_}=$courseData->{$_};
     }      }
   
     return;      return;
 }  }
   
   sub LoadDiscussion {
       my ( $courseID)=@_;
       my %Discuss=();
       my %contrib=&Apache::lonnet::dump(
                   $courseID,
                   $ENV{'course.'.$courseID.'.domain'},
                   $ENV{'course.'.$courseID.'.num'});
     
       #my %contrib=&DownloadCourseInformation($name, $courseID, 0);
   
       foreach my $temp(keys %contrib) {
    if ($temp=~/^version/) {
       my $ver=$contrib{$temp};
       my ($dummy,$prb)=split(':',$temp);
       for (my $idx=1; $idx<=$ver; $idx++ ) {
    my $name=$contrib{"$idx:$prb:sendername"};
    $Discuss{"$name:$prb"}=$idx;
       }
    }
       }       
   
       return \%Discuss;
   }
   
 # ----- END PROCESSING FUNCTIONS ---------------------------------------  # ----- END PROCESSING FUNCTIONS ---------------------------------------
   
 =pod  =pod
Line 815  sub TestCacheData { Line 788  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.6


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