version 1.139, 2006/05/05 10:59:51
|
version 1.152, 2006/05/30 12:46:09
|
Line 183 use Apache::File;
|
Line 183 use Apache::File;
|
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::longroup; |
|
use Apache::lonselstudent; |
|
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
|
|
# Register all the tags with the helper, so the helper can |
# Register all the tags with the helper, so the helper can |
# push and pop them |
# push and pop them |
Line 468 sub _varsInFile {
|
Line 471 sub _varsInFile {
|
my $self = shift; |
my $self = shift; |
my @vars = (); |
my @vars = (); |
for my $key (keys %{$self->{VARS}}) { |
for my $key (keys %{$self->{VARS}}) { |
push @vars, &Apache::lonnet::escape($key) . '=' . |
push @vars, &escape($key) . '=' . |
&Apache::lonnet::escape($self->{VARS}->{$key}); |
&escape($self->{VARS}->{$key}); |
} |
} |
return join ('&', @vars); |
return join ('&', @vars); |
} |
} |
Line 2275 use strict;
|
Line 2278 use strict;
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
|
# |
|
# 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: |
|
# $sections - Set of sections in the course (hash reference). |
|
# $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. |
|
# Returns: |
|
# HTML text to add to the rendering of the helper. |
|
# |
|
sub render_student_list { |
|
my ($self, |
|
$sections, $students, $formprefix, $defaultusers) = @_; |
|
|
|
my $multiselect = $self->{'multichoice'}; |
|
my $result = ""; |
|
|
|
# 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) { |
|
$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\")'".' /></td>'; |
|
$result .= '<td valign="top"><input type="button" name="'.$formprefix |
|
.'.unselect" value="Unselect" onClick='. |
|
"'unselectSections(\"$formprefix.chosensections\")' ".' /></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="'. |
|
$self->{'variable'}.".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 (!$self->{'multichoice'} && !$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], "<>&\"'") |
|
."\" /></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 { |
BEGIN { |
&Apache::lonhelper::register('Apache::lonhelper::student', |
&Apache::lonhelper::register('Apache::lonhelper::student', |
('student')); |
('student')); |
Line 2432 sub render {
|
Line 2322 sub render {
|
my $buttons = ''; |
my $buttons = ''; |
my $var = $self->{'variable'}; |
my $var = $self->{'variable'}; |
|
|
if ($self->{'multichoice'}) { |
|
$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 setAllStudents(value) { |
|
var i; |
|
var ele; |
|
for (i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if(isStudent(ele)) { |
|
ele.checked=value; |
|
} |
|
} |
|
} |
|
function setAllCoursePersonnel(value) { |
|
var i; |
|
var ele; |
|
for (i =0; i < document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if(!isStudent(ele)) { |
|
ele.checked = value; |
|
} |
|
} |
|
} |
|
function setSection(which, value) { |
|
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) { |
|
ele.checked = value; |
|
} |
|
} |
|
} |
|
} |
|
|
|
function setCheckboxes(listbox, 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); |
|
} else if (what == 'All Course Personnel') { |
|
setAllCoursePersonnel(value); |
|
} else if (what == 'No Section') { |
|
setSection('',value); |
|
} else { |
|
setSection(what, value); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
function selectSections(listbox) { |
|
setCheckboxes(listbox, true); |
|
|
|
} |
|
function unselectSections(listbox) { |
|
setCheckboxes(listbox, false); |
|
} |
|
/* ----------------------------- */ |
|
|
|
function checkall(value, checkName) { |
|
for (i=0; i<document.forms.helpform.elements.length; i++) { |
|
ele = document.forms.helpform.elements[i]; |
|
if (ele.name == checkName + '.forminput') { |
|
document.forms.helpform.elements[i].checked=value; |
|
} |
|
} |
|
} |
|
function checksec(value) { |
|
for (i=0; i<document.forms.helpform.elements.length; i++) { |
|
comp = document.forms.helpform.elements.chksec.value; |
|
if (document.forms.helpform.elements[i].value.indexOf(':'+comp+':') != -1) { |
|
if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) { |
|
document.forms.helpform.elements[i].checked=value; |
|
} |
|
} |
|
} |
|
} |
|
function checkactive() { |
|
for (i=0; i<document.forms.helpform.elements.length; i++) { |
|
if (document.forms.helpform.elements[i].value.indexOf(':Active') != -1) { |
|
document.forms.helpform.elements[i].checked=true; |
|
} |
|
} |
|
} |
|
function checkexpired() { |
|
for (i=0; i<document.forms.helpform.elements.length; i++) { |
|
if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) { |
|
document.forms.helpform.elements[i].checked=true; |
|
} |
|
} |
|
} |
|
function uncheckexpired() { |
|
for (i=0; i<document.forms.helpform.elements.length; i++) { |
|
if (document.forms.helpform.elements[i].value.indexOf(':Expired') != -1) { |
|
document.forms.helpform.elements[i].checked=false; |
|
} |
|
} |
|
} |
|
function getDesiredState() { // Return desired person state radio value. |
|
numRadio = document.forms.helpform.personstate.length; |
|
for (i =0; i < numRadio; i++) { |
|
if (document.forms.helpform.personstate[i].checked) { |
|
return document.forms.helpform.personstate[i].value; |
|
} |
|
} |
|
return ""; |
|
} |
|
|
|
function checksections(value) { // Check selected sections. |
|
numSections = document.forms.helpform.chosensections.length; |
|
desiredState = getDesiredState(); |
|
|
|
for (var option = 0; option < numSections; option++) { |
|
if(document.forms.helpform.chosensections.options[option].selected) { |
|
section = document.forms.helpform.chosensections.options[option].text; |
|
if (section == "none") { |
|
section =""; |
|
} |
|
for (i = 0; i < document.forms.helpform.elements.length; i++ ) { |
|
if (document.forms.helpform.elements[i].value.indexOf(':') != -1) { |
|
info = document.forms.helpform.elements[i].value.split(':'); |
|
hisSection = info[2]; |
|
hisState = info[4]; |
|
if (desiredState == hisState || |
|
desiredState == "All") { |
|
if(hisSection == section || |
|
section =="" ) { |
|
document.forms.helpform.elements[i].checked = value; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
// --> |
|
</script> |
|
SCRIPT |
|
|
|
my %lt=&Apache::lonlocal::texthash( |
|
'ocs' => "Select Only Current Students", |
|
'ues' => "Unselect Expired Students", |
|
'sas' => "Select All Students", |
|
'uas' => "Unselect All Students", |
|
'sfsg' => "Select Current Students for Section/Group", |
|
'ufsg' => "Unselect for Section/Group"); |
|
|
|
$buttons = <<BUTTONS; |
|
<br /> |
|
<table> |
|
|
|
<tr> |
|
<td><input type="button" onclick="checkall(true, '$var')" value="$lt{'sas'}" /></td> |
|
<td> <input type="button" onclick="checkall(false, '$var')" value="$lt{'uas'}" /><br /></td> |
|
</tr> |
|
|
|
</table> |
|
<br /> |
|
BUTTONS |
|
# $result .= $buttons; |
|
|
|
} |
|
|
|
if (defined $self->{ERROR_MSG}) { |
if (defined $self->{ERROR_MSG}) { |
$result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; |
$result .= '<font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />'; |
Line 2651 BUTTONS
|
Line 2341 BUTTONS
|
} |
} |
|
|
|
|
|
my ($course_personnel, |
|
$current_members, |
|
$expired_members, |
|
$future_members) = &Apache::lonselstudent::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], '', $_]; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
# Load up the students |
if ($self->{'coursepersonnel'}) { |
my $classlist = &Apache::loncoursedata::get_classlist(); |
unshift @$current_members, (@$course_personnel); |
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 .= $self->render_student_list(\%sections, |
$result .= &Apache::lonselstudent::render_student_list( $current_members, |
$current_members, |
"helpform", |
"current", |
"current", |
\%defaultUsers); |
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
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: |
# |
# |
if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) { |
if (!$self->{'activeonly'} && ((scalar @$expired_members) > 0)) { |
|
|
# Past |
|
|
|
$result .= $self->render_student_list(\%sections, |
|
$expired_members, |
|
"past", |
|
\%defaultUsers); |
|
|
|
# And future. |
# And future. |
|
|
$result .= $self->render_student_list(\%sections, |
$result .= &Apache::lonselstudent::render_student_list( $future_members, |
$future_members, |
"helpform", |
"future", |
"future", |
\%defaultUsers); |
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
0); |
|
# Past |
|
|
|
$result .= &Apache::lonselstudent::render_student_list($expired_members, |
|
"helpform", |
|
"past", |
|
\%defaultUsers, |
|
$self->{'multichoice'}, |
|
$self->{'variable'}, |
|
0); |
} |
} |
|
|
|
|
Line 3232 sub start_section {
|
Line 2831 sub start_section {
|
|
|
my $section = Apache::loncoursedata::CL_SECTION(); |
my $section = Apache::loncoursedata::CL_SECTION(); |
my $classlist = Apache::loncoursedata::get_classlist(); |
my $classlist = Apache::loncoursedata::get_classlist(); |
foreach (keys %$classlist) { |
foreach my $user (keys(%$classlist)) { |
my $sectionName = $classlist->{$_}->[$section]; |
my $section_name = $classlist->{$user}[$section]; |
if (!$sectionName) { |
if (!$section_name) { |
$choices{"No section assigned"} = ""; |
$choices{"No section assigned"} = ""; |
} else { |
} else { |
$choices{$sectionName} = $sectionName; |
$choices{$section_name} = $section_name; |
} |
} |
} |
} |
|
|
for my $sectionName (sort(keys(%choices))) { |
if (exists($choices{"No section assigned"})) { |
push @{$paramHash->{CHOICES}}, [$sectionName, $sectionName]; |
push(@{$paramHash->{CHOICES}}, |
|
['No section assigned','No section assigned']); |
|
delete($choices{"No section assigned"}); |
|
} |
|
for my $section_name (sort {lc($a) cmp lc($b) } (keys(%choices))) { |
|
push @{$paramHash->{CHOICES}}, [$section_name, $section_name]; |
} |
} |
return if ($token->[2]{'onlysections'}); |
return if ($token->[2]{'onlysections'}); |
|
|
# add in groups to the end of the list |
# add in groups to the end of the list |
my %curr_groups; |
my %curr_groups = &Apache::longroup::coursegroups(); |
if (&Apache::loncommon::coursegroups(\%curr_groups)) { |
foreach my $group_name (sort(keys(%curr_groups))) { |
foreach my $group_name (sort(keys(%curr_groups))) { |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
|
} |
|
} |
} |
} |
} |
|
|
Line 3313 sub start_group {
|
Line 2915 sub start_group {
|
# Populate the CHOICES element |
# Populate the CHOICES element |
my %choices; |
my %choices; |
|
|
my %curr_groups; |
my %curr_groups = &Apache::longroup::coursegroups(); |
if (&Apache::loncommon::coursegroups(\%curr_groups)) { |
foreach my $group_name (sort {lc($a) cmp lc($b)} (keys(%curr_groups))) { |
foreach my $group_name (sort(keys(%curr_groups))) { |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
push(@{$paramHash->{CHOICES}}, [$group_name, $group_name]); |
|
} |
|
} |
} |
} |
} |
|
|
Line 3803 sub render {
|
Line 3403 sub render {
|
if ($vars->{GRANULARITY} eq 'whole_course') { |
if ($vars->{GRANULARITY} eq 'whole_course') { |
$resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>'; |
$resourceString .= '<li>'.&mt('for <b>all resources in the course</b>').'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 11; # general course, see lonparmset.pm perldoc |
$level = 14; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 9; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 6; |
$level = 6; |
} else { |
} else { |
$level = 3; |
$level = 3; |
Line 3819 sub render {
|
Line 3421 sub render {
|
$symb = $res->symb(); |
$symb = $res->symb(); |
$resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; |
$resourceString .= '<li>'.&mt('for the map named [_1]',"<b>$title</b>").'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 10; # general course, see lonparmset.pm perldoc |
$level = 13; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 8; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 5; |
$level = 5; |
} else { |
} else { |
$level = 2; |
$level = 2; |
Line 3836 sub render {
|
Line 3440 sub render {
|
my $title = $res->compTitle(); |
my $title = $res->compTitle(); |
$resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>'; |
$resourceString .= '<li>'.&mt('for the resource named [_1] part [_2]',"<b>$title</b>","<b>$part</b>").'</li>'; |
if ($vars->{TARGETS} eq 'course') { |
if ($vars->{TARGETS} eq 'course') { |
$level = 7; # general course, see lonparmset.pm perldoc |
$level = 10; # general course, see lonparmset.pm perldoc |
} elsif ($vars->{TARGETS} eq 'section') { |
} elsif ($vars->{TARGETS} eq 'section') { |
|
$level = 7; |
|
} elsif ($vars->{TARGETS} eq 'group') { |
$level = 4; |
$level = 4; |
} else { |
} else { |
$level = 1; |
$level = 1; |