Annotation of loncom/interface/lonselstudent.pm, revision 1.1
1.1 ! foxr 1: # The LearningOnline Network with CAPA
! 2: # lonselstudent.pm : Reusable subs for student selection.
! 3: #
! 4: # $Id$
! 5: #
! 6: # Copyright Michigan State University Board of Trustees
! 7: #
! 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 9: #
! 10: # LON-CAPA is free software; you can redistribute it and/or modify
! 11: # it under the terms of the GNU General Public License as published by
! 12: # the Free Software Foundation; either version 2 of the License, or
! 13: # (at your option) any later version.
! 14: #
! 15: # LON-CAPA is distributed in the hope that it will be useful,
! 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 18: # GNU General Public License for more details.
! 19: #
! 20: # You should have received a copy of the GNU General Public License
! 21: # along with LON-CAPA; if not, write to the Free Software
! 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 23: #
! 24: # /home/httpd/html/adm/gpl.txt
! 25: #
! 26: # http://www.lon-capa.org/
! 27: #
! 28:
! 29: package Apache::lonselstudent;
! 30: use Apache::lonnet;
! 31: use Apache::loncoursedata;
! 32: use HTML::Entities;
! 33:
! 34: #
! 35: # Utility function used when rendering <student> tags.
! 36: # This function produces a list references to four
! 37: # arrays:
! 38: # (\@course_personel, \@current_members, \@expired_members, \@future_members)
! 39: #
! 40: # Where:
! 41: # course_personnel - Each element of this array is itself a reference to an array
! 42: # containing information about a member of the course staff.
! 43: # current_members - Each element of this array is itself a reference to an
! 44: # array that contains information about current students in
! 45: # the course.
! 46: # expired_members - Each element of this array is itself a reference to an
! 47: # array that contains information about students whose
! 48: # status has expired.
! 49: # future_members - Each element of this arrya is itself a reference to an
! 50: # array that contains information about students who will
! 51: # become active at a future date.
! 52: #
! 53: # Course personnel elements include:
! 54: # [0] Last, First of the user.
! 55: # [1] Role held by the user.
! 56: # [2] Empty.
! 57: # [3] Empty
! 58: # [4] username:domain of the user.
! 59: #
! 60: # Student member array elements are:
! 61: # [0] Last, First of the user.
! 62: # [1] Status of the user one of ("Active", "Future", or "Expired')
! 63: # depending on which array the user was put in.
! 64: # [2] Section the student is in.
! 65: # [3] Role of the member (student).
! 66: # [4] username:domain of the user.
! 67: #
! 68: sub get_people_in_class {
! 69: my %coursepersonnel = &Apache::lonnet::get_course_adv_roles();
! 70: #
! 71: # Enumerate the course_personnel.
! 72: #
! 73: my @course_personnel;
! 74: for (sort keys %coursepersonnel) {
! 75: for my $role (split /,/, $coursepersonnel{$_}) {
! 76: # extract the names so we can sort them
! 77: my @people;
! 78:
! 79: for (split /,/, $role) {
! 80: push @people, [split /:/, $role];
! 81: }
! 82:
! 83: @people = sort { $a->[0] cmp $b->[0] } @people;
! 84:
! 85: for my $person (@people) {
! 86: push @course_personnel, [join(':', @$person), $person->[0], '', $_];
! 87: }
! 88: }
! 89: }
! 90: # Students must be split into the three categories:
! 91:
! 92: my @current_members;
! 93: my @future_members;
! 94: my @expired_members;
! 95:
! 96: # Indices into the coures data elements.
! 97:
! 98: my $section = &Apache::loncoursedata::CL_SECTION();
! 99: my $fullname = &Apache::loncoursedata::CL_FULLNAME();
! 100: my $status = &Apache::loncoursedata::CL_STATUS();
! 101: my $start_date = &Apache::loncoursedata::CL_START();
! 102:
! 103:
! 104: my $classlist = &Apache::loncoursedata::get_classlist();
! 105: my @keys = keys %{$classlist};
! 106: # Sort by: Section, name
! 107: @keys = sort {
! 108: if ($classlist->{$a}->[$section] ne $classlist->{$b}->[$section]) {
! 109: return $classlist->{$a}->[$section] cmp $classlist->{$b}->[$section];
! 110: }
! 111: return $classlist->{$a}->[$fullname] cmp $classlist->{$b}->[$fullname];
! 112: } @keys;
! 113:
! 114:
! 115:
! 116:
! 117: for (@keys) {
! 118:
! 119: if ( $classlist->{$_}->[$status] eq
! 120: 'Active') {
! 121: push @current_members, [$_, $classlist->{$_}->[$fullname],
! 122: $classlist->{$_}->[$section],
! 123: $classlist->{$_}->[$status], 'Student'];
! 124: } else {
! 125: # Need to figure out if this user is future or
! 126: # Expired... If the start date is in the future
! 127: # the user is future...else expired.
! 128:
! 129: my $now = time;
! 130: if ($classlist->{$_}->[$start_date] > $now) {
! 131: push @future_members, [$_, $classlist->{$_}->[$fullname],
! 132: $classlist->{$_}->[$section],
! 133: "Future", "Student"];
! 134: } else {
! 135: push @expired_members, [$_, $classlist->{$_}->[$fullname],
! 136: $classlist->{$_}->[$section],
! 137: "Expired", "Student"];
! 138: }
! 139:
! 140: }
! 141: }
! 142: return (\@course_personnel,
! 143: \@current_members,
! 144: \@expired_members,
! 145: \@future_members);
! 146:
! 147: }
! 148:
! 149: #
! 150: # Utility function used when rendering the <student> tag.
! 151: # This function renders a segment of course personel
! 152: # Personel are broken up by the helper into past, current and
! 153: # future...each one gets is own subpage of selection.
! 154: # This sub renders one of these pages.
! 155: # Parameters:
! 156: # $students - Students in the section. (ref to array of references
! 157: # to arrays).
! 158: # $formprefix - form path prefix for form element names
! 159: # This is used to make each form element
! 160: # so that the segments having to do with each
! 161: # set of students won't collide.
! 162: # $defaultusers - reference to a hash containng
! 163: # the set of users that should be on or off.
! 164: # $multiselect - True if multiselect allowed.
! 165: # $resultname - Name of result variable.
! 166: # $javascript - If true, the javascript to run this is output
! 167: # This should be true for the first call for a page
! 168: # and false for all other calls... only matters if
! 169: # multiselect is true.
! 170: # Returns:
! 171: # HTML text to add to the rendering of the helper.
! 172: #
! 173: sub render_student_list {
! 174: my ($students, $formprefix, $defaultusers,
! 175: $multiselect, $resultname, $javascript) = @_;
! 176:
! 177: my $result = "";
! 178:
! 179: if ($javascript && $multiselect) {
! 180: $result .= <<SCRIPT;
! 181: <script type="text/javascript">
! 182: // <!--
! 183:
! 184: function findElement(name) {
! 185: var i;
! 186: var ele;
! 187: for(i =0; i < document.forms.helpform.elements.length; i++) {
! 188: ele = document.forms.helpform.elements[i];
! 189: if(ele.name == name) {
! 190: return ele;
! 191: }
! 192: }
! 193: return null;
! 194: }
! 195: function isStudent(element) {
! 196: if(element.value.indexOf(":Student") != -1) {
! 197: return 1;
! 198: }
! 199: return 0;
! 200: }
! 201: function section(element) {
! 202: var i;
! 203: var info;
! 204: if (element.value.indexOf(':') != -1) {
! 205: info = element.value.split(':');
! 206: return info[2];
! 207: } else {
! 208: return "";
! 209: }
! 210: }
! 211: function rightSubForm(element, which) {
! 212: if (element.value.indexOf(which) != -1) {
! 213: return true;
! 214: } else {
! 215: return false;
! 216: }
! 217: }
! 218:
! 219: function setAllStudents(value, which) {
! 220: var i;
! 221: var ele;
! 222: for (i =0; i < document.forms.helpform.elements.length; i++) {
! 223: ele = document.forms.helpform.elements[i];
! 224: if(isStudent(ele) && rightSubForm(ele, which)) {
! 225: ele.checked=value;
! 226: }
! 227: }
! 228: }
! 229: function setAllCoursePersonnel(value, which) {
! 230: var i;
! 231: var ele;
! 232: for (i =0; i < document.forms.helpform.elements.length; i++) {
! 233: ele = document.forms.helpform.elements[i];
! 234: if(!isStudent(ele) && rightSubForm(ele, which)) {
! 235: ele.checked = value;
! 236: }
! 237: }
! 238: }
! 239: function setSection(which, value, subform) {
! 240: var i;
! 241: var ele;
! 242: for (i =0; i < document.forms.helpform.elements.length; i++) {
! 243: ele = document.forms.helpform.elements[i];
! 244: if (ele.value.indexOf(':') != -1) {
! 245: if ((section(ele) == which) && rightSubForm(ele, subform)) {
! 246: ele.checked = value;
! 247: }
! 248: }
! 249: }
! 250: }
! 251:
! 252: function setCheckboxes(listbox, which, value) {
! 253: var k;
! 254: var elem;
! 255: var what;
! 256: elem = findElement(listbox);
! 257: if (elem != null) {
! 258: for (k = 0; k < elem.length; k++) {
! 259: if (elem.options[k].selected) {
! 260: what = elem.options[k].text;
! 261: if (what == 'All Students') {
! 262: setAllStudents(value, which);
! 263: } else if (what == 'All Course Personnel') {
! 264: setAllCoursePersonnel(value, which);
! 265: } else if (what == 'No Section') {
! 266: setSection('',value, which);
! 267: } else {
! 268: setSection(what, value, which);
! 269: }
! 270: }
! 271: }
! 272: }
! 273: }
! 274: function selectSections(listbox, which) {
! 275: setCheckboxes(listbox, which, true);
! 276:
! 277: }
! 278: function unselectSections(listbox, which) {
! 279: setCheckboxes(listbox, which, false);
! 280: }
! 281:
! 282: // -->
! 283: </script>
! 284: SCRIPT
! 285:
! 286: }
! 287:
! 288: # If multiple selections are allowed, we have a listbox
! 289: # at the top which allows quick selections from each section
! 290: # as well as from categories of personnel.
! 291:
! 292: if ($multiselect) {
! 293: # Make a section hash so we can add sections to the choice:
! 294:
! 295: my %sections;
! 296: for my $student (@$students) {
! 297: my $sect = $student->[2];
! 298: if ($sect ne "") {
! 299: $sections{$sect} = 1;
! 300: }
! 301: }
! 302:
! 303: $result .= '<table><tr><td>';
! 304:
! 305: my $size = scalar(keys(%sections));
! 306: $size += 3; # We have allstudents allpersonel nosection too.
! 307: if ($size > 5) {
! 308: $size = 5;
! 309: }
! 310: $result .= '<select multiple name="'.$formprefix
! 311: .'.chosensections" size="'.$size.'">'."\n";
! 312: $result .= '<option name="allstudents">All Students</option>';
! 313: $result .= '<option name="allpersonnel">All Course Personnel</option>';
! 314: $result .= '<option name="nosection">No Section</option>';
! 315: $result .= "\n";
! 316: foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
! 317: $result .= '<option name="'.$sec.'">'.$sec.'</option>'."\n";
! 318: }
! 319: $result .= '</td><td valign="top">';
! 320: $result .= '<input type="button" name="'.$formprefix.'.select" value="Select" onclick='
! 321: ."'selectSections(\"$formprefix.chosensections\", \"$formprefix\")'".' /></td>';
! 322: $result .= '<td valign="top"><input type="button" name="'.$formprefix
! 323: .'.unselect" value="Unselect" onclick='.
! 324: "'unselectSections(\"$formprefix.chosensections\", \"$formprefix\")' ".' /></td></tr></table>';
! 325: }
! 326:
! 327: # Now we list the students, but the form element type
! 328: # will depend on whether or not multiselect is true.
! 329: # True -> checkboxes.
! 330: # False -> radiobuttons.
! 331:
! 332: $result .= "<table border=\"2\">\n";
! 333: $result .= '<tr><th></th><th align="center">Name</th>'."\n";
! 334: $result .= ' <th align="center">Section</th>'."\n";
! 335: $result .= ' <th align="center">Status</th>'."\n";
! 336: $result .= ' <th align="center">Role</th>'."\n";
! 337: $result .= ' <th align="center">Username : Domain</th></tr>'."\n";
! 338:
! 339: my $input_type;
! 340: if ($multiselect) {
! 341: $input_type = "checkbox";
! 342: } else {
! 343: $input_type = "radio";
! 344: }
! 345:
! 346: my $checked = 0;
! 347: for my $student (@$students) {
! 348: $result .= '<tr><td><input type="'.$input_type.'" name="'.
! 349: $resultname.".forminput".'"';
! 350: my $user = $student->[0];
! 351:
! 352: # Figure out which students are checked by default...
! 353:
! 354: if(%$defaultusers) {
! 355: if (exists ($defaultusers->{$user})) {
! 356: $result .= ' checked ="checked" ';
! 357: $checked = 1;
! 358: }
! 359: } elsif (!$multiselect && !$checked) {
! 360: $result .= ' checked="checked" ';
! 361: $checked = 1; # First one for radio if no default specified.
! 362: }
! 363: $result .= ' value="'. HTML::Entities::encode($user . ':'
! 364: .$student->[2] . ':'
! 365: .$student->[1] . ':'
! 366: .$student->[3] . ':'
! 367: .$student->[4] . ":"
! 368: .$formprefix, "<>&\"'")
! 369: ."\" /></td><td>\n";
! 370: $result .= HTML::Entities::encode($student->[1], '<>&"')
! 371: . '</td><td align="center" >'."\n";
! 372: $result .= HTML::Entities::encode($student->[2], '<>&"')
! 373: . '</td><td align="center">'."\n";
! 374: $result .= HTML::Entities::encode($student->[3], '<>&"')
! 375: . '</td><td align="center">'."\n";
! 376: $result .= HTML::Entities::encode($student->[4], '<>&"')
! 377: . '</td><td align="center">'."\n";
! 378: $result .= HTML::Entities::encode($student->[0], '<>&"')
! 379: . '</td></tr>'."\n";
! 380: }
! 381: $result .=" </table> <br /> <hr />\n";
! 382:
! 383: return $result;
! 384: }
! 385:
! 386: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>