--- loncom/interface/loncommon.pm 2005/11/08 03:08:15 1.283 +++ loncom/interface/loncommon.pm 2005/11/15 15:52:51 1.290 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.283 2005/11/08 03:08:15 albertel Exp $ +# $Id: loncommon.pm,v 1.290 2005/11/15 15:52:51 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1149,7 +1149,7 @@ sub domain_select { } &get_domains; if ($multiple) { $domains{''}=&mt('Any domain'); - return &multiple_select_form($name,$value,4,%domains); + return &multiple_select_form($name,$value,4,\%domains); } else { return &select_form($name,$value,%domains); } @@ -1159,7 +1159,7 @@ sub domain_select { =pod -=item * multiple_select_form($name,$value,$size,%hash) +=item * multiple_select_form($name,$value,$size,$hash,$order) Returns a string containing a "; - foreach (sort(keys(%$hash))) { - $output.='\n"; + my @order = ref($order) ? @$order + : sort(keys(%$hash)); + foreach my $key (@order) { + $output.='\n"; } $output.="\n"; return $output; @@ -2771,6 +2774,10 @@ sub bodytag { @@ -2879,7 +2886,7 @@ ENDROLE # return(< + @@ -3087,64 +3094,108 @@ Incoming parameters: 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) = @_; - if (grep/^st$/,@{$roles}) { - my $statusidx = &Apache::loncoursedata::CL_STATUS(); - my $startidx = &Apache::loncoursedata::CL_START(); - my $endidx = &Apache::loncoursedata::CL_END(); + 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 ($classlist,$keylist)=&Apache::loncoursedata::get_classlist($cdom,$cnum); my $now = time; foreach my $student (keys(%{$classlist})) { + my $match = 0; + if (ref($sections) eq 'ARRAY') && (@{$sections} > 0) { + unless(grep(/^\Q$$classlist{$student}[$idx{section}]\E$/, + @{$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); + if (($role) && (grep(/^\Q$role\E$/,@{$roles}))) { + my ($uname,$udom,$usec) = split(/:/,$user); + if ($usec ne '' && (ref($sections) eq 'ARRAY') && + @{$sections} > 0) { + unless(grep(/^\Q$usec\E$/,@{$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) && + !exists($$userdata{$uname.':'.$udom})) { + &get_user_info($udom,$uname,\%idx,$userdata); + } } } } - if (grep/^ow$/,@{$roles}) { + if (grep(/^ow$/,@{$roles})) { if ((defined($cdom)) && (defined($cnum))) { 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) && + !exists($$userdata{$owner.':'.$cdom})) { + &get_user_info($cdom,$owner,\%idx,$userdata); + } } } } @@ -3152,7 +3203,14 @@ sub get_course_users { return; } - +sub get_user_info { + my ($udom,$uname,$idx,$userdata) = @_; + $$userdata{$uname.':'.$udom}[$$idx{fullname}] = + &plainname($uname,$udom,'lastname'); + $$userdata{$uname.':'.$udom}[$$idx{uname}] = $uname + $$userdata{$uname.':'.$udom}[$$idx{uname}] = $udom + return; +} ###############################################
$upperleft $messages