version 1.145, 2006/05/09 21:44:18
|
version 1.147, 2006/05/09 22:43:19
|
Line 2274 no strict;
|
Line 2274 no strict;
|
use strict; |
use strict; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
# |
|
# Utility function used when rendering <student> 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 <student> tag. |
# Utility function used when rendering the <student> tag. |
Line 2282 use Apache::lonnet;
|
Line 2396 use Apache::lonnet;
|
# future...each one gets is own subpage of selection. |
# future...each one gets is own subpage of selection. |
# This sub renders one of these pages. |
# This sub renders one of these pages. |
# Parameters: |
# Parameters: |
# $sections - Set of sections in the course (hash reference). |
|
# $students - Students in the section. (ref to array of references |
# $students - Students in the section. (ref to array of references |
# to arrays). |
# to arrays). |
# $formprefix - form path prefix for form element names |
# $formprefix - form path prefix for form element names |
Line 2301 use Apache::lonnet;
|
Line 2414 use Apache::lonnet;
|
# HTML text to add to the rendering of the helper. |
# HTML text to add to the rendering of the helper. |
# |
# |
sub render_student_list { |
sub render_student_list { |
my ( |
my ($students, $formprefix, $defaultusers, |
$sections, $students, $formprefix, $defaultusers, |
|
$multiselect, $resultname, $javascript) = @_; |
$multiselect, $resultname, $javascript) = @_; |
|
|
my $result = ""; |
my $result = ""; |
Line 2421 SCRIPT
|
Line 2533 SCRIPT
|
# as well as from categories of personnel. |
# as well as from categories of personnel. |
|
|
if ($multiselect) { |
if ($multiselect) { |
|
# Make a section hash so we can add sections to the choice: |
|
|
|
my %sections; |
|
for my $student (@$students) { |
|
my $sect = $student->[2]; |
|
if ($sect ne "") { |
|
$sections{$sect} = 1; |
|
} |
|
} |
|
|
$result .= '<table><tr><td>'; |
$result .= '<table><tr><td>'; |
|
|
my $size = scalar(keys(%$sections)); |
my $size = scalar(keys(%sections)); |
$size += 3; # We have allstudents allpersonel nosection too. |
$size += 3; # We have allstudents allpersonel nosection too. |
if ($size > 5) { |
if ($size > 5) { |
$size = 5; |
$size = 5; |
Line 2434 SCRIPT
|
Line 2556 SCRIPT
|
$result .= '<option name="allpersonnel">All Course Personnel</option>'; |
$result .= '<option name="allpersonnel">All Course Personnel</option>'; |
$result .= '<option name="nosection">No Section</option>'; |
$result .= '<option name="nosection">No Section</option>'; |
$result .= "\n"; |
$result .= "\n"; |
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%$sections))) { |
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) { |
$result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n"; |
$result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n"; |
} |
} |
$result .= '</td><td valign="top">'; |
$result .= '</td><td valign="top">'; |
Line 2567 sub render {
|
Line 2689 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 |
# 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], '', $_]; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
if ($self->{'coursepersonnel'}) { |
# Load up the students |
unshift @$current_members, (@$course_personnel); |
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"]; |
|
} |
|
|
|
} |
|
} |
|
|
|
|
|
# Create a list of the sections that can be used to create the section |
|
# selection list boxes: |
|
# |
|
my %sections; |
|
for my $key (@keys) { |
|
my $section_name = $classlist->{$key}->[$section]; |
|
if ($section_name ne "") { |
|
$sections{$section_name} = 1; |
|
} |
|
} |
} |
|
|
|
|
if ($self->{'multichoice'}) { |
|
|
|
# The variable $choice_widget will have the html to make the choice |
|
# selector. |
|
my $size=5; |
|
if (scalar(keys(%sections)) < 5) { |
|
$size=scalar(keys(%sections)); |
|
} |
|
my $result = '<select multiple name="chosensections" size="'.$size.'">'."\n"; |
|
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) { |
|
$result .= "<option name=\"$sec\">$sec</option>\n"; |
|
} |
|
$result .= "<option>none</option></select>\n"; |
|
|
|
|
|
} |
|
|
|
# Current personel |
# Current personel |
|
|
$result .= &render_student_list(\%sections, |
$result .= &render_student_list( $current_members, |
$current_members, |
"current", |
"current", |
\%defaultUsers, |
\%defaultUsers, |
$self->{'multichoice'}, |
$self->{'multichoice'}, |
$self->{'variable'}, |
$self->{'variable'}, |
1); |
1); |
|
|
|
|
|
# If activeonly is not set then we can also give the expired students: |
# If activeonly is not set then we can also give the expired students: |
Line 2697 sub render {
|
Line 2719 sub render {
|
|
|
# And future. |
# And future. |
|
|
$result .= &render_student_list(\%sections, |
$result .= &render_student_list( $future_members, |
$future_members, |
"future", |
"future", |
\%defaultUsers, |
\%defaultUsers, |
$self->{'multichoice'}, |
$self->{'multichoice'}, |
$self->{'variable'}, |
$self->{'variable'}, |
0); |
0); |
|
# Past |
# Past |
|
|
$result .= &render_student_list(\%sections, |
$result .= &render_student_list($expired_members, |
$expired_members, |
"past", |
"past", |
\%defaultUsers, |
\%defaultUsers, |
|
$self->{'multichoice'}, |
$self->{'multichoice'}, |
$self->{'variable'}, |
$self->{'variable'}, |
0); |
0); |