[LON-CAPA-cvs] cvs: loncom /interface loncommon.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Tue, 15 Nov 2005 15:14:17 -0000


raeburn		Tue Nov 15 10:14:17 2005 EDT

  Modified files:              
    /loncom/interface	loncommon.pm 
  Log:
  &get_course_users() now includes filtering based on sections and can take an additional optional argument.  If the additional argument (a reference to a hash) is included in the call, user information - fullname, id etc. will be written to the hash (keys = username:domain), as an array, with indices as defined by loncouasredata::CL_*().    
  
  
Index: loncom/interface/loncommon.pm
diff -u loncom/interface/loncommon.pm:1.287 loncom/interface/loncommon.pm:1.288
--- loncom/interface/loncommon.pm:1.287	Thu Nov 10 13:05:47 2005
+++ loncom/interface/loncommon.pm	Tue Nov 15 10:14:17 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.287 2005/11/10 18:05:47 albertel Exp $
+# $Id: loncommon.pm,v 1.288 2005/11/15 15:14:17 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -3094,53 +3094,98 @@
 3. access status: users must have - either active, 
 previous, future, or all.
 4. reference to array of permissible roles
-5. reference to results object (hash of hashes).
+5. reference to array of section restrictions (optional)
+6. reference to results object (hash of hashes).
+7. reference to optional userdata hash
 Keys of top level hash are roles.
 Keys of inner hashes are username:domain, with 
 values set to access type.
-                                                                                
+Optional userdata hash returns an array with arguments in the 
+same order as loncoursedata::get_classlist() for student data.
+
+Entries for end, start, section and status are blank because
+of the possibility of multiple values for non-student roles.
+
 =cut
                                                                                 
 ###############################################
                                                                                 
 sub get_course_users {
-    my ($cdom,$cnum,$types,$roles,$users) = @_;
+    my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_;
+    my %idx = ();
+
+    $idx{udom} = &Apache::loncoursedata::CL_SDOM();
+    $idx{uname} =  &Apache::loncoursedata::CL_SNAME();
+    $idx{end} = &Apache::loncoursedata::CL_END();
+    $idx{start} = &Apache::loncoursedata::CL_START();
+    $idx{id} = &Apache::loncoursedata::CL_ID();
+    $idx{section} = &Apache::loncoursedata::CL_SECTION();
+    $idx{fullname} = &Apache::loncoursedata::CL_FULLNAME();
+    $idx{status} = &Apache::loncoursedata::CL_STATUS();
+
     if (grep/^st$/,@{$roles}) {
-        my $statusidx = &Apache::loncoursedata::CL_STATUS();
-        my $startidx = &Apache::loncoursedata::CL_START();
-        my $endidx = &Apache::loncoursedata::CL_END();
         my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist($cdom,$cnum);
         my $now = time;
         foreach my $student (keys(%{$classlist})) {
+            my $match = 0;
+            if (defined($sections) && (ref($sections) eq 'ARRAY')) {
+                if (@{$sections} > 0) {
+                    unless(grep/^$$classlist{$student}[$idx{section}]$/,@{$sections}) {
+                        next;
+                    }
+                }
+            } 
             if (defined($$types{'active'})) {
-                if ($$classlist{$student}[$statusidx] eq 'Active') {
+                if ($$classlist{$student}[$idx{status}] eq 'Active') {
                     push(@{$$users{st}{$student}},'active');
+                    $match = 1;
                 }
             }
             if (defined($$types{'previous'})) {
-                if ($$classlist{$student}[$endidx] <= $now) {
+                if ($$classlist{$student}[$idx{end}] <= $now) {
                     push(@{$$users{st}{$student}},'previous');
+                    $match = 1;
                 }
             }
             if (defined($$types{'future'})) {
-                if (($$classlist{$student}[$startidx] > $now) && ($$classlist{$student}[$endidx] > $now) || ($$classlist{$student}[$endidx] == 0) || ($$classlist{$student}[$endidx] eq '')) {
+                if (($$classlist{$student}[$idx{start}] > $now) && ($$classlist{$student}[$idx{end}] > $now) || ($$classlist{$student}[$idx{end}] == 0) || ($$classlist{$student}[$idx{end}] eq '')) {
                     push(@{$$users{st}{$student}},'future');
+                    $match = 1;
                 }
             }
+            if ($match && defined($userdata)) {
+                $$userdata{$student} = $$classlist{$student};
+            }
         }
     }
     if ((@{$roles} > 0) && (@{$roles} ne "st")) {
         my @coursepersonnel = &Apache::lonnet::getkeys('nohist_userroles',$cdom,$cnum);
         foreach my $person (@coursepersonnel) {
+            my $match = 0;
             my ($role,$user) = ($person =~ /^([^:]*):([^:]+:[^:]+)/);
             $user =~ s/:$//;
             if (($role) && (grep(/^$role$/,@{$roles}))) {
-                my ($uname,$udom) = split(/:/,$user);
+                my ($uname,$udom,$usec) = split(/:/,$user);
+                unless ($usec eq '') {
+                    if (defined($sections) && (ref($sections) eq 'ARRAY')) {
+                        if (@{$sections} > 0) {
+                            unless(grep/^$usec$/,@{$sections}) {
+                                next;
+                            }
+                        }
+                    }
+                }
                 if ($uname ne '' && $udom ne '') {
                     my $status = &check_user_status($udom,$uname,$cdom,$cnum,$role);
                     foreach my $type (keys(%{$types})) { 
                         if ($status eq $type) {
-                            $$users{$role}{$user} = $type;
+                            @{$$users{$role}{$user}} = $type;
+                            $match = 1;
+                        }
+                    }
+                    if ($match && defined($userdata)) {
+                        unless(exists($$userdata{$uname.':'.$udom})) {
+                            &get_user_info($udom,$uname,\%idx,$userdata);
                         }
                     }
                 }
@@ -3151,7 +3196,12 @@
                 my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum);
                 if ( defined($csettings{'internal.courseowner'}) ) {
                     my $owner = $csettings{'internal.courseowner'};
-                    $$users{'ow'}{$owner.':'.$cdom} = 'any';
+                    @{$$users{'ow'}{$owner.':'.$cdom}} = 'any';
+                    if (defined($userdata)) {
+                        unless(exists($$userdata{$owner.':'.$cdom})) {
+                            &get_user_info($cdom,$owner,\%idx,$userdata);
+                        }
+                    }
                 }
             }
         }
@@ -3159,7 +3209,23 @@
     return;
 }
 
-
+sub get_user_info {
+    my ($udom,$uname,$idx,$userdata) = @_;
+    my %userinfo = &Apache::lonnet::get('environment',['firstname','middlename','lastname','generation','id'],$udom,$uname);
+    if (grep/^(con_lost|error|no_such_host)/,keys(%userinfo)) {
+        &Apache::lonnet::logthis('get_user_info error for '.$uname.':'.$udom);
+        $$userdata{$uname.':'.$udom}[$$idx{udom}] = $udom;
+        $$userdata{$uname.':'.$udom}[$$idx{uname}] = $uname; 
+    } else {
+        $userinfo{fullname} = &Apache::lonnet::format_name(@userinfo{qw/firstname middlename lastname generation/},'lastname');
+        $userinfo{uname} = $uname;
+        $userinfo{udom} = $udom;
+        foreach my $item (qw/uname udom id fullname/) {
+            $$userdata{$uname.':'.$udom}[$$idx{$item}] = $userinfo{$item};
+        }
+    }
+    return;
+}
 
 ###############################################