--- loncom/interface/lonhelper.pm 2006/05/09 22:15:30 1.146 +++ loncom/interface/lonhelper.pm 2006/05/09 22:43:19 1.147 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # .helper XML handler to implement the LON-CAPA helper # -# $Id: lonhelper.pm,v 1.146 2006/05/09 22:15:30 foxr Exp $ +# $Id: lonhelper.pm,v 1.147 2006/05/09 22:43:19 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -2274,6 +2274,120 @@ no strict; use strict; use Apache::lonlocal; use Apache::lonnet; +# +# Utility function used when rendering tags. +# This function produces a list references to four +# arrays: +# (\@course_personel, \@current_members, \@expired_members, \@future_members) +# +# Where: +# course_personnel - Each element of this array is itself a reference to an array +# containing information about a member of the course staff. +# current_members - Each element of this array is itself a reference to an +# array that contains information about current students in +# the course. +# expired_members - Each element of this array is itself a reference to an +# array that contains information about students whose +# status has expired. +# future_members - Each element of this arrya is itself a reference to an +# array that contains information about students who will +# become active at a future date. +# +# Course personnel elements include: +# [0] Last, First of the user. +# [1] Role held by the user. +# [2] Empty. +# [3] Empty +# [4] username:domain of the user. +# +# Student member array elements are: +# [0] Last, First of the user. +# [1] Status of the user one of ("Active", "Future", or "Expired') +# depending on which array the user was put in. +# [2] Section the student is in. +# [3] Role of the member (student). +# [4] username:domain of the user. +# +sub get_people_in_class { + my %coursepersonnel = &Apache::lonnet::get_course_adv_roles(); + # + # Enumerate the course_personnel. + # + my @course_personnel; + for (sort keys %coursepersonnel) { + for my $role (split /,/, $coursepersonnel{$_}) { + # extract the names so we can sort them + my @people; + + for (split /,/, $role) { + push @people, [split /:/, $role]; + } + + @people = sort { $a->[0] cmp $b->[0] } @people; + + for my $person (@people) { + push @course_personnel, [join(':', @$person), $person->[0], '', $_]; + } + } + } + # Students must be split into the three categories: + + my @current_members; + my @future_members; + my @expired_members; + + # Indices into the coures data elements. + + my $section = &Apache::loncoursedata::CL_SECTION(); + my $fullname = &Apache::loncoursedata::CL_FULLNAME(); + my $status = &Apache::loncoursedata::CL_STATUS(); + my $start_date = &Apache::loncoursedata::CL_START(); + + + my $classlist = &Apache::loncoursedata::get_classlist(); + my @keys = keys %{$classlist}; + # Sort by: Section, name + @keys = sort { + if ($classlist->{$a}->[$section] ne $classlist->{$b}->[$section]) { + return $classlist->{$a}->[$section] cmp $classlist->{$b}->[$section]; + } + return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname]; + } @keys; + + + + + for (@keys) { + + if ( $classlist->{$_}->[$status] eq + 'Active') { + push @current_members, [$_, $classlist->{$_}->[$fullname], + $classlist->{$_}->[$section], + $classlist->{$_}->[$status], 'Student']; + } else { + # Need to figure out if this user is future or + # Expired... If the start date is in the future + # the user is future...else expired. + + my $now = time; + if ($classlist->{$_}->[$start_date] > $now) { + push @future_members, [$_, $classlist->{$_}->[$fullname], + $classlist->{$_}->[$section], + "Future", "Student"]; + } else { + push @expired_members, [$_, $classlist->{$_}->[$fullname], + $classlist->{$_}->[$section], + "Expired", "Student"]; + } + + } + } + return (\@course_personnel, + \@current_members, + \@expired_members, + \@future_members); + +} # # Utility function used when rendering the tag. @@ -2575,91 +2689,20 @@ sub render { } + my ($course_personnel, + $current_members, + $expired_members, + $future_members) = &get_people_in_class(); - # my $choices = []; - - # - # We need to parcel out the personel in to three arrays: - # $current_members[] - Contains those whose roles are currently active. - # $expired_members[] - Contains those whose roles have expired. - # $future_members[] - Contains those whose roles will become active in the - # future. - # - # Constants - my $section = &Apache::loncoursedata::CL_SECTION(); - my $fullname = &Apache::loncoursedata::CL_FULLNAME(); - my $status = &Apache::loncoursedata::CL_STATUS(); - my $start_date = &Apache::loncoursedata::CL_START(); - - my $current_members = []; - my $expired_members = []; - my $future_members = []; # Load up the non-students, if necessary - if ($self->{'coursepersonnel'}) { - my %coursepersonnel = Apache::lonnet::get_course_adv_roles(); - for (sort keys %coursepersonnel) { - for my $role (split /,/, $coursepersonnel{$_}) { - # extract the names so we can sort them - my @people; - - for (split /,/, $role) { - push @people, [split /:/, $role]; - } - - @people = sort { $a->[0] cmp $b->[0] } @people; - - for my $person (@people) { - push @$current_members, [join(':', @$person), $person->[0], '', $_]; - } - } - } - } - - # Load up the students - my $classlist = &Apache::loncoursedata::get_classlist(); - my @keys = keys %{$classlist}; - # Sort by: Section, name - @keys = sort { - if ($classlist->{$a}->[$section] ne $classlist->{$b}->[$section]) { - return $classlist->{$a}->[$section] cmp $classlist->{$b}->[$section]; - } - return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname]; - } @keys; - - - - - for (@keys) { - - if ( $classlist->{$_}->[$status] eq - 'Active') { - push @$current_members, [$_, $classlist->{$_}->[$fullname], - $classlist->{$_}->[$section], - $classlist->{$_}->[$status], 'Student']; - } else { - # Need to figure out if this user is future or - # Expired... If the start date is in the future - # the user is future...else expired. - - my $now = time; - if ($classlist->{$_}->[$start_date] > $now) { - push @$future_members, [$_, $classlist->{$_}->[$fullname], - $classlist->{$_}->[$section], - "Future", "Student"]; - } else { - push @$expired_members, [$_, $classlist->{$_}->[$fullname], - $classlist->{$_}->[$section], - "Expired", "Student"]; - } - - } + if ($self->{'coursepersonnel'}) { + unshift @$current_members, (@$course_personnel); } - # Current personel $result .= &render_student_list( $current_members,