[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm lonselstudent.pm
foxr
lon-capa-cvs@mail.lon-capa.org
Thu, 11 May 2006 21:10:22 -0000
This is a MIME encoded message
--foxr1147381822
Content-Type: text/plain
foxr Thu May 11 17:10:22 2006 EDT
Added files:
/loncom/interface lonselstudent.pm
Modified files:
/loncom/interface lonhelper.pm
Log:
Separated the stuff to render student selection lists into a separate
pacakge: lonselstudent.
--foxr1147381822
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20060511171022.txt"
Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.147 loncom/interface/lonhelper.pm:1.148
--- loncom/interface/lonhelper.pm:1.147 Tue May 9 18:43:19 2006
+++ loncom/interface/lonhelper.pm Thu May 11 17:10:21 2006
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# .helper XML handler to implement the LON-CAPA helper
#
-# $Id: lonhelper.pm,v 1.147 2006/05/09 22:43:19 foxr Exp $
+# $Id: lonhelper.pm,v 1.148 2006/05/11 21:10:21 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -183,7 +183,7 @@
use Apache::lonxml;
use Apache::lonlocal;
use Apache::lonnet;
-
+use Apache::lonselstudent;
# Register all the tags with the helper, so the helper can
# push and pop them
@@ -2274,357 +2274,6 @@
use strict;
use Apache::lonlocal;
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.
-# This function renders a segment of course personel
-# Personel are broken up by the helper into past, current and
-# future...each one gets is own subpage of selection.
-# This sub renders one of these pages.
-# Parameters:
-# $students - Students in the section. (ref to array of references
-# to arrays).
-# $formprefix - form path prefix for form element names
-# This is used to make each form element
-# so that the segments having to do with each
-# set of students won't collide.
-# $defaultusers - reference to a hash containng
-# the set of users that should be on or off.
-# $multiselect - True if multiselect allowed.
-# $resultname - Name of result variable.
-# $javascript - If true, the javascript to run this is output
-# This should be true for the first call for a page
-# and false for all other calls... only matters if
-# multiselect is true.
-# Returns:
-# HTML text to add to the rendering of the helper.
-#
-sub render_student_list {
- my ($students, $formprefix, $defaultusers,
- $multiselect, $resultname, $javascript) = @_;
-
- my $result = "";
-
- if ($javascript && $multiselect) {
- $result .= <<SCRIPT;
-<script type="text/javascript">
-// <!--
-
- function findElement(name) {
- var i;
- var ele;
- for(i =0; i < document.forms.helpform.elements.length; i++) {
- ele = document.forms.helpform.elements[i];
- if(ele.name == name) {
- return ele;
- }
- }
- return null;
- }
- function isStudent(element) {
- if(element.value.indexOf(":Student") != -1) {
- return 1;
- }
- return 0;
- }
- function section(element) {
- var i;
- var info;
- if (element.value.indexOf(':') != -1) {
- info = element.value.split(':');
- return info[2];
- } else {
- return "";
- }
- }
- function rightSubForm(element, which) {
- if (element.value.indexOf(which) != -1) {
- return true;
- } else {
- return false;
- }
- }
-
- function setAllStudents(value, which) {
- var i;
- var ele;
- for (i =0; i < document.forms.helpform.elements.length; i++) {
- ele = document.forms.helpform.elements[i];
- if(isStudent(ele) && rightSubForm(ele, which)) {
- ele.checked=value;
- }
- }
- }
- function setAllCoursePersonnel(value, which) {
- var i;
- var ele;
- for (i =0; i < document.forms.helpform.elements.length; i++) {
- ele = document.forms.helpform.elements[i];
- if(!isStudent(ele) && rightSubForm(ele, which)) {
- ele.checked = value;
- }
- }
- }
- function setSection(which, value, subform) {
- var i;
- var ele;
- for (i =0; i < document.forms.helpform.elements.length; i++) {
- ele = document.forms.helpform.elements[i];
- if (ele.value.indexOf(':') != -1) {
- if ((section(ele) == which) && rightSubForm(ele, subform)) {
- ele.checked = value;
- }
- }
- }
- }
-
- function setCheckboxes(listbox, which, value) {
- var k;
- var elem;
- var what;
- elem = findElement(listbox);
- if (elem != null) {
- for (k = 0; k < elem.length; k++) {
- if (elem.options[k].selected) {
- what = elem.options[k].text;
- if (what == 'All Students') {
- setAllStudents(value, which);
- } else if (what == 'All Course Personnel') {
- setAllCoursePersonnel(value, which);
- } else if (what == 'No Section') {
- setSection('',value, which);
- } else {
- setSection(what, value, which);
- }
- }
- }
- }
- }
- function selectSections(listbox, which) {
- setCheckboxes(listbox, which, true);
-
- }
- function unselectSections(listbox, which) {
- setCheckboxes(listbox, which, false);
- }
-
-// -->
-</script>
-SCRIPT
-
- }
-
- # If multiple selections are allowed, we have a listbox
- # at the top which allows quick selections from each section
- # as well as from categories of personnel.
-
- 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>';
-
- my $size = scalar(keys(%sections));
- $size += 3; # We have allstudents allpersonel nosection too.
- if ($size > 5) {
- $size = 5;
- }
- $result .= '<select multiple name="'.$formprefix
- .'.chosensections" size="'.$size.'">'."\n";
- $result .= '<option name="allstudents">All Students</option>';
- $result .= '<option name="allpersonnel">All Course Personnel</option>';
- $result .= '<option name="nosection">No Section</option>';
- $result .= "\n";
- foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
- $result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n";
- }
- $result .= '</td><td valign="top">';
- $result .= '<input type="button" name="'.$formprefix.'.select" value="Select" onclick='
- ."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
- $result .= '<td valign="top"><input type="button" name="'.$formprefix
- .'.unselect" value="Unselect" onclick='.
- "'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
- }
-
- # Now we list the students, but the form element type
- # will depend on whether or not multiselect is true.
- # True -> checkboxes.
- # False -> radiobuttons.
-
- $result .= "<table border=\"2\">\n";
- $result .= '<tr><th></th><th align="center">Name</th>'."\n";
- $result .= ' <th align="center">Section</th>'."\n";
- $result .= ' <th align="center">Status</th>'."\n";
- $result .= ' <th align="center">Role</th>'."\n";
- $result .= ' <th align="center">Username : Domain</th></tr>'."\n";
-
- my $input_type;
- if ($multiselect) {
- $input_type = "checkbox";
- } else {
- $input_type = "radio";
- }
-
- my $checked = 0;
- for my $student (@$students) {
- $result .= '<tr><td><input type="'.$input_type.'" name="'.
- $resultname.".forminput".'"';
- my $user = $student->[0];
-
- # Figure out which students are checked by default...
-
- if(%$defaultusers) {
- if (exists ($defaultusers->{$user})) {
- $result .= ' checked ="checked" ';
- $checked = 1;
- }
- } elsif (!$multiselect && !$checked) {
- $result .= ' checked="checked" ';
- $checked = 1; # First one for radio if no default specified.
- }
- $result .= ' value="'. HTML::Entities::encode($user . ':'
- .$student->[2] . ':'
- .$student->[1] . ':'
- .$student->[3] . ':'
- .$student->[4] . ":"
- .$formprefix, "<>&\"'")
- ."\" /></td><td>\n";
- $result .= HTML::Entities::encode($student->[1], '<>&"')
- . '</td><td align="center" >'."\n";
- $result .= HTML::Entities::encode($student->[2], '<>&"')
- . '</td><td align="center">'."\n";
- $result .= HTML::Entities::encode($student->[3], '<>&"')
- . '</td><td align="center">'."\n";
- $result .= HTML::Entities::encode($student->[4], '<>&"')
- . '</td><td align="center">'."\n";
- $result .= HTML::Entities::encode($student->[0], '<>&"')
- . '</td></tr>'."\n";
- }
- $result .=" </table> <br /> <hr />\n";
-
- return $result;
-}
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::student',
@@ -2692,7 +2341,7 @@
my ($course_personnel,
$current_members,
$expired_members,
- $future_members) = &get_people_in_class();
+ $future_members) = &Apache::lonselstudent::get_people_in_class();
@@ -2705,7 +2354,7 @@
# Current personel
- $result .= &render_student_list( $current_members,
+ $result .= &Apache::lonselstudent::render_student_list( $current_members,
"current",
\%defaultUsers,
$self->{'multichoice'},
@@ -2719,7 +2368,7 @@
# And future.
- $result .= &render_student_list( $future_members,
+ $result .= &Apache::lonselstudent::render_student_list( $future_members,
"future",
\%defaultUsers,
$self->{'multichoice'},
@@ -2727,7 +2376,7 @@
0);
# Past
- $result .= &render_student_list($expired_members,
+ $result .= &Apache::lonselstudent::render_student_list($expired_members,
"past",
\%defaultUsers,
$self->{'multichoice'},
Index: loncom/interface/lonselstudent.pm
+++ loncom/interface/lonselstudent.pm
# The LearningOnline Network with CAPA
# lonselstudent.pm : Reusable subs for student selection.
#
# $Id: lonselstudent.pm,v 1.1 2006/05/11 21:10:21 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
package Apache::lonselstudent;
use Apache::lonnet;
use Apache::loncoursedata;
use HTML::Entities;
#
# 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.
# This function renders a segment of course personel
# Personel are broken up by the helper into past, current and
# future...each one gets is own subpage of selection.
# This sub renders one of these pages.
# Parameters:
# $students - Students in the section. (ref to array of references
# to arrays).
# $formprefix - form path prefix for form element names
# This is used to make each form element
# so that the segments having to do with each
# set of students won't collide.
# $defaultusers - reference to a hash containng
# the set of users that should be on or off.
# $multiselect - True if multiselect allowed.
# $resultname - Name of result variable.
# $javascript - If true, the javascript to run this is output
# This should be true for the first call for a page
# and false for all other calls... only matters if
# multiselect is true.
# Returns:
# HTML text to add to the rendering of the helper.
#
sub render_student_list {
my ($students, $formprefix, $defaultusers,
$multiselect, $resultname, $javascript) = @_;
my $result = "";
if ($javascript && $multiselect) {
$result .= <<SCRIPT;
<script type="text/javascript">
// <!--
function findElement(name) {
var i;
var ele;
for(i =0; i < document.forms.helpform.elements.length; i++) {
ele = document.forms.helpform.elements[i];
if(ele.name == name) {
return ele;
}
}
return null;
}
function isStudent(element) {
if(element.value.indexOf(":Student") != -1) {
return 1;
}
return 0;
}
function section(element) {
var i;
var info;
if (element.value.indexOf(':') != -1) {
info = element.value.split(':');
return info[2];
} else {
return "";
}
}
function rightSubForm(element, which) {
if (element.value.indexOf(which) != -1) {
return true;
} else {
return false;
}
}
function setAllStudents(value, which) {
var i;
var ele;
for (i =0; i < document.forms.helpform.elements.length; i++) {
ele = document.forms.helpform.elements[i];
if(isStudent(ele) && rightSubForm(ele, which)) {
ele.checked=value;
}
}
}
function setAllCoursePersonnel(value, which) {
var i;
var ele;
for (i =0; i < document.forms.helpform.elements.length; i++) {
ele = document.forms.helpform.elements[i];
if(!isStudent(ele) && rightSubForm(ele, which)) {
ele.checked = value;
}
}
}
function setSection(which, value, subform) {
var i;
var ele;
for (i =0; i < document.forms.helpform.elements.length; i++) {
ele = document.forms.helpform.elements[i];
if (ele.value.indexOf(':') != -1) {
if ((section(ele) == which) && rightSubForm(ele, subform)) {
ele.checked = value;
}
}
}
}
function setCheckboxes(listbox, which, value) {
var k;
var elem;
var what;
elem = findElement(listbox);
if (elem != null) {
for (k = 0; k < elem.length; k++) {
if (elem.options[k].selected) {
what = elem.options[k].text;
if (what == 'All Students') {
setAllStudents(value, which);
} else if (what == 'All Course Personnel') {
setAllCoursePersonnel(value, which);
} else if (what == 'No Section') {
setSection('',value, which);
} else {
setSection(what, value, which);
}
}
}
}
}
function selectSections(listbox, which) {
setCheckboxes(listbox, which, true);
}
function unselectSections(listbox, which) {
setCheckboxes(listbox, which, false);
}
// -->
</script>
SCRIPT
}
# If multiple selections are allowed, we have a listbox
# at the top which allows quick selections from each section
# as well as from categories of personnel.
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>';
my $size = scalar(keys(%sections));
$size += 3; # We have allstudents allpersonel nosection too.
if ($size > 5) {
$size = 5;
}
$result .= '<select multiple name="'.$formprefix
.'.chosensections" size="'.$size.'">'."\n";
$result .= '<option name="allstudents">All Students</option>';
$result .= '<option name="allpersonnel">All Course Personnel</option>';
$result .= '<option name="nosection">No Section</option>';
$result .= "\n";
foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
$result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n";
}
$result .= '</td><td valign="top">';
$result .= '<input type="button" name="'.$formprefix.'.select" value="Select" onclick='
."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
$result .= '<td valign="top"><input type="button" name="'.$formprefix
.'.unselect" value="Unselect" onclick='.
"'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
}
# Now we list the students, but the form element type
# will depend on whether or not multiselect is true.
# True -> checkboxes.
# False -> radiobuttons.
$result .= "<table border=\"2\">\n";
$result .= '<tr><th></th><th align="center">Name</th>'."\n";
$result .= ' <th align="center">Section</th>'."\n";
$result .= ' <th align="center">Status</th>'."\n";
$result .= ' <th align="center">Role</th>'."\n";
$result .= ' <th align="center">Username : Domain</th></tr>'."\n";
my $input_type;
if ($multiselect) {
$input_type = "checkbox";
} else {
$input_type = "radio";
}
my $checked = 0;
for my $student (@$students) {
$result .= '<tr><td><input type="'.$input_type.'" name="'.
$resultname.".forminput".'"';
my $user = $student->[0];
# Figure out which students are checked by default...
if(%$defaultusers) {
if (exists ($defaultusers->{$user})) {
$result .= ' checked ="checked" ';
$checked = 1;
}
} elsif (!$multiselect && !$checked) {
$result .= ' checked="checked" ';
$checked = 1; # First one for radio if no default specified.
}
$result .= ' value="'. HTML::Entities::encode($user . ':'
.$student->[2] . ':'
.$student->[1] . ':'
.$student->[3] . ':'
.$student->[4] . ":"
.$formprefix, "<>&\"'")
."\" /></td><td>\n";
$result .= HTML::Entities::encode($student->[1], '<>&"')
. '</td><td align="center" >'."\n";
$result .= HTML::Entities::encode($student->[2], '<>&"')
. '</td><td align="center">'."\n";
$result .= HTML::Entities::encode($student->[3], '<>&"')
. '</td><td align="center">'."\n";
$result .= HTML::Entities::encode($student->[4], '<>&"')
. '</td><td align="center">'."\n";
$result .= HTML::Entities::encode($student->[0], '<>&"')
. '</td></tr>'."\n";
}
$result .=" </table> <br /> <hr />\n";
return $result;
}
1;
--foxr1147381822--