[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;
+}
###############################################