Annotation of loncom/interface/lonviewclasslist.pm, revision 1.8
1.1 matthew 1: # The LearningOnline Network with CAPA
2: # Handler to display the classlist
3: #
1.8 ! raeburn 4: # $Id: lonviewclasslist.pm,v 1.7 2006/08/25 03:26:05 raeburn Exp $
1.1 matthew 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: ##############################################################
30:
31: package Apache::lonviewclasslist;
32:
33: use strict;
34: use Apache::loncoursedata();
35: use Apache::loncommon();
36: use Apache::lonhtmlcommon();
37: use Apache::Constants qw(:common :http REDIRECT);
38: use Apache::lonlocal;
1.5 albertel 39: use Apache::lonnet;
1.1 matthew 40:
41:
42: ###################################################################
43: ###################################################################
44:
45: =pod
46:
47: =item &handler
48:
49: The typical handler you see in all these modules. Takes $r, the
50: http request, as an argument.
51:
52: =cut
53:
54: ###################################################################
55: ###################################################################
56: sub handler {
57: my $r=shift;
58: if ($r->header_only) {
59: &Apache::loncommon::content_type($r,'text/html');
60: $r->send_http_header;
61: return OK;
62: }
63: # &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
64: # ['action','state']);
65: &Apache::lonhtmlcommon::clear_breadcrumbs();
66: &Apache::lonhtmlcommon::add_breadcrumb
67: ({href=>"/adm/viewclasslist",
68: text=>"View Classlist",
69: faq=>9,bug=>'Instructor Interface',});
70: # Needs to be in a course
1.5 albertel 71: if (! ($env{'request.course.fn'})) {
72: $env{'user.error.msg'}=
1.1 matthew 73: "/adm/viewclasslist:not in course role";
74: return HTTP_NOT_ACCEPTABLE;
75: }
76: &Apache::loncommon::content_type($r,'text/html');
77: $r->send_http_header;
78: #
1.7 raeburn 79: my $start_page = &Apache::loncommon::start_page('Classlist');
1.6 albertel 80: my $breadcrumbs= &Apache::lonhtmlcommon::breadcrumbs(undef,
81: 'Enrollment Manager');
1.1 matthew 82: $r->print(<<ENDHEADER);
1.6 albertel 83: $start_page
1.1 matthew 84: $breadcrumbs
85: ENDHEADER
1.8 ! raeburn 86:
! 87: # Get classlist view settings
! 88: my %viewsettings = &retrieve_view_settings();
! 89:
1.1 matthew 90: # Print classlist
1.8 ! raeburn 91: if (keys(%viewsettings) > 0) {
! 92: $r->print(&html_classlist($r,\%viewsettings));
! 93: } else {
! 94: $r->print('<h3>'.
! 95: &mt("Display of a student-viewable course roster is not currently enabled.").
! 96: '</h3>');
1.1 matthew 97: }
98: #
99: # Finish up
1.6 albertel 100: $r->print(&Apache::loncommon::end_page());
1.1 matthew 101: return OK;
102: }
103:
1.8 ! raeburn 104: sub retrieve_view_settings {
! 105: my %viewsettings;
! 106: if (exists($env{'request.course.id'})) {
! 107: my $cid = $env{'request.course.id'};
! 108: my $viewpermission = 'course.'.$cid.'.student_classlist_view';
! 109: my $student_opt_in = 'course.'.$cid.'.student_classlist_opt_in';
! 110: my $portfiles_link = 'course.'.$cid.'.student_classlist_portfiles';
! 111: if (exists($env{$viewpermission}) &&
! 112: $env{$viewpermission} =~ /^(all|section)$/) {
! 113: $viewsettings{'permission'} = $env{$viewpermission};
! 114: if ($viewsettings{'permission'} =~ /^section$/i) {
! 115: $viewsettings{'limit_to_section'} = 1;
! 116: } else {
! 117: $viewsettings{'limit_to_section'} = 0;
! 118: }
! 119: $viewsettings{'student_opt_in'} = $env{$student_opt_in};
! 120: $viewsettings{'portfiles_link'} = $env{$portfiles_link};
! 121: }
1.1 matthew 122: }
1.8 ! raeburn 123: return %viewsettings;
1.1 matthew 124: }
125:
126: sub html_classlist {
1.8 ! raeburn 127: my ($r,$viewsettings) = @_;
! 128: my ($Str,$title,$secdisplay,$cid,$cdom,$cnum,$listtype,%publicroster);
! 129: my $fullroster = &Apache::loncoursedata::get_classlist();
! 130: my $classlist;
! 131:
! 132: if ($env{'form.action'} eq 'setenv') {
! 133: $Str .= &process_student_prefs();
! 134: }
! 135: $Str .= '<h3>'.&mt('Student-viewable course roster').'</h3>';
! 136:
! 137: $cid = $env{'request.course.id'};
! 138: $cdom = $env{'course.'.$cid.'.domain'};
! 139: $cnum = $env{'course.'.$cid.'.num'};
! 140:
! 141: if ($viewsettings->{'limit_to_section'}) {
1.5 albertel 142: if ($env{'request.course.sec'} eq '') {
1.8 ! raeburn 143: $title = '<h4>'.&mt('Students with no section').'</h4>';
! 144: $listtype = 'without a section';
! 145: } else {
! 146: $title ='<h4>'.&mt('Students in section "[_1]"',
! 147: $env{'request.course.sec'}).'</h4>';
! 148: $listtype = 'in the section';
! 149: $secdisplay = " ($env{'request.course.sec'}) ";
! 150: }
! 151: } else {
! 152: $title .= '<h4>'.&mt('Students in any section').'</h4>';
! 153: $listtype = 'in the course';
! 154: }
! 155:
! 156: if ($viewsettings->{'student_opt_in'}) {
! 157: if ($env{'request.role'} =~ /^st/) {
! 158: $Str .= &print_roster_form();
! 159: }
! 160: %publicroster = &Apache::lonnet::dump('publicroster',$cdom,$cnum);
! 161: }
! 162:
! 163: $Str .= $title;
! 164:
! 165: my $fullcount = 0;
! 166: my $publiccount = 0;
! 167: my $displaycount = 0;
! 168: my $sectionidx = &Apache::loncoursedata::CL_SECTION();
! 169: my $statusidx = &Apache::loncoursedata::CL_STATUS();
! 170:
! 171: foreach my $student (keys(%{$fullroster})) {
! 172: my $section = $fullroster->{$student}->[$sectionidx];
! 173: my $status = $fullroster->{$student}->[$statusidx];
! 174: next if (lc($status) ne 'active');
! 175: if ($viewsettings->{'limit_to_section'}) {
! 176: next if ($section ne $env{'request.course.sec'});
! 177: }
! 178: $fullcount ++;
! 179: if ($viewsettings->{'student_opt_in'}) {
! 180: if ($publicroster{$student}) {
! 181: $classlist->{$student} = $fullroster->{$student};
! 182: $publiccount ++;
! 183: }
! 184: } else {
! 185: $classlist->{$student} = $fullroster->{$student};
! 186: }
! 187: }
! 188: if ($viewsettings->{'student_opt_in'}) {
! 189: $displaycount = $publiccount;
! 190: if ($fullcount > $publiccount) {
! 191: if ($publiccount) {
! 192: $Str .= &mt('Only students who have opted to be listed in the roster ([_1] out of [_2] students) are shown.',$publiccount,$fullcount).'<br />';
! 193: } else {
! 194: if ($fullcount == 1) {
! 195: $Str .= &mt('The single student '.$listtype.'[_1] has opted not to be listed in the roster.',$secdisplay);
! 196: } else {
! 197: $Str .= &mt('None of the [_1] students '.$listtype.'[_2] have opted to be listed in the roster.',$fullcount,$secdisplay);
! 198: }
! 199: return $Str;
! 200: }
1.1 matthew 201: } else {
1.8 ! raeburn 202: if ($fullcount > 1) {
! 203: $Str .= &mt('All [_1] students '.$listtype.'[_2] have opted to be listed in the roster.',$fullcount,$secdisplay);
! 204: } elsif ($fullcount == 1) {
! 205: $Str .= &mt('The single student '.$listtype.'[_1] has opted to be listed in the roster.',$secdisplay);
! 206: }
! 207: }
! 208: } else {
! 209: $displaycount = $fullcount;
! 210: if ($fullcount > 1) {
! 211: $Str .= &mt('All [_1] students '.$listtype.'[_2] are listed in the roster.',$fullcount,$secdisplay);
! 212: } elsif ($fullcount == 1) {
! 213: $Str .= &mt('There is only a single student '.$listtype.'[_1]',$secdisplay);
1.1 matthew 214: }
215: }
1.8 ! raeburn 216: undef($fullroster);
! 217:
! 218: if (!$displaycount) {
! 219: $Str .= &mt('There are currently no students to display.');
! 220: return $Str;
! 221: }
! 222:
1.1 matthew 223: # Set up a couple variables.
224: my $usernameidx = &Apache::loncoursedata::CL_SNAME();
225: my $domainidx = &Apache::loncoursedata::CL_SDOM();
226: my $fullnameidx = &Apache::loncoursedata::CL_FULLNAME();
1.8 ! raeburn 227:
1.1 matthew 228: # Sort the students
229: my $sortby = $fullnameidx;
230: my @Sorted_Students = sort {
231: lc($classlist->{$a}->[$sortby]) cmp lc($classlist->{$b}->[$sortby])
232: } (keys(%$classlist));
1.8 ! raeburn 233: $Str .= '<br />'.&Apache::loncommon::start_data_table()."\n".
! 234: &Apache::loncommon::start_data_table_header_row()."\n".
1.1 matthew 235: '<th></th>'. # for the count
236: '<th>'.&mt('Student').'</th>'.
237: '<th>'.&mt('Username').'</th>';
1.8 ! raeburn 238: if (! $viewsettings->{'limit_to_section'}) {
1.1 matthew 239: $Str .= '<th>'.&mt('Section').'</th>';
240: }
1.8 ! raeburn 241: if ($viewsettings->{'portfiles_link'}) {
! 242: $Str .= '<th>'.&mt('Available Portfolio files').'</th>';
! 243: }
! 244: $Str .= &Apache::loncommon::end_data_table_header_row();
1.1 matthew 245: my $count ++;
246: foreach my $student (@Sorted_Students) {
247: my $username = $classlist->{$student}->[$usernameidx];
248: my $domain = $classlist->{$student}->[$domainidx];
249: my $fullname = $classlist->{$student}->[$fullnameidx];
250: if ($fullname =~ /^\s*$/) {
251: $fullname = &mt('Name not given');
252: }
253: my $section = $classlist->{$student}->[$sectionidx];
1.8 ! raeburn 254: if ($section eq '') {
! 255: $section = &mt('none');
1.1 matthew 256: }
1.8 ! raeburn 257: $Str .= &Apache::loncommon::start_data_table_row()."\n".
1.1 matthew 258: '<td>'.$count++.'</td>'.
259: '<td>'.&Apache::loncommon::aboutmewrapper($fullname,
260: $username,
261: $domain).'</td>'.
262: '<td>'.(' 'x2).
263: &Apache::loncommon::messagewrapper
1.2 raeburn 264: ('<img src="/adm/lonIcons/mailto.gif" border="0" /> '.
1.1 matthew 265: $username.'@'.$domain,$username,$domain).'</td>';
1.8 ! raeburn 266: if (! $viewsettings->{'limit_to_section'}) {
1.1 matthew 267: $Str .= '<td>'.$section.'</td>';
268: }
1.8 ! raeburn 269: if ($viewsettings->{'portfiles_link'}) {
! 270: my $filecounts = &Apache::lonaboutme::portfolio_files($r,'showlink',undef,undef,$domain,$username,$fullname);
! 271: my $link;
! 272: if (ref($filecounts) eq 'HASH') {
! 273: $link = &mt('[quant,_1,file,files,No files]',$filecounts->{'both'});
! 274: if ($filecounts->{'both'} > 0) {
! 275: $link = '<a href="/adm/'.$domain.'/'.$username.'/aboutme/portfolio?classlist">'.$link.'</a>';
! 276: }
! 277: } else {
! 278: $link = &mt("Error retrieving file information.");
! 279: }
! 280: $Str .= '<td>'.$link.'</td>';
! 281: }
! 282: $Str .= &Apache::loncommon::end_data_table_row()."\n";
1.1 matthew 283: }
1.8 ! raeburn 284: $Str .= &Apache::loncommon::end_data_table();
1.1 matthew 285: return $Str;
286: }
287:
1.8 ! raeburn 288: sub print_roster_form {
! 289: my $cid = $env{'request.course.id'};
! 290: my $showinroster = $env{'environment.internal.'.$cid.'.showinroster'};
! 291: my ($showoff,$showon);
! 292: if ($showinroster) {
! 293: $showon = ' checked="checked" ';
! 294: $showoff = ' ';
! 295: } else {
! 296: $showoff = ' checked="checked" ';
! 297: $showon = ' ';
! 298: }
! 299: my $output = '<hr /><h4>'.&mt('Your roster setting').'</h4>';
! 300: if ($showinroster) {
! 301: $output .= &mt('You are currently listed in the student-viewable roster.');
! 302: } else {
! 303: $output .= &mt('You are currently <b>not</b> listed in the student-viewable roster.');
! 304: }
! 305: $output .= '<br />'.&mt('Include yourself in the roster?').' '.
! 306: '<form name="studentparm" method="post">'.
! 307: '<span class="LC_nobreak"><label><input type="radio" name="showinroster" value="1"'.$showon.'/>'.&mt('Yes').'</label> <label>'.
! 308: '<input type="radio" name="showinroster" value="0"'.$showoff.'/>'.&mt('No').
! 309: '</label></span><br /><br />'.
! 310: '<input type="hidden" name="action" value="setenv" />'.
! 311: '<input type="submit" name="studentsubmit" value="'.&mt('Save').'" /></form><hr />';
! 312: return $output;
! 313: }
! 314:
! 315: sub process_student_prefs {
! 316: my $cid = $env{'request.course.id'};
! 317: my $cdom = $env{'course.'.$cid.'.domain'};
! 318: my $cnum = $env{'course.'.$cid.'.num'};
! 319: my $uname = $env{'user.name'};
! 320: my $udom = $env{'user.domain'};
! 321: my $student = $uname.':'.$udom;
! 322: my %pubroster = &Apache::lonnet::get('publicroster',[$student],$cdom,$cnum);
! 323: my $visibility = &mt('off');
! 324: my $showinroster = $env{'form.showinroster'};
! 325: if ($showinroster) {
! 326: $visibility = &mt('on');
! 327: }
! 328: my $sturoster = 0;
! 329: if ($pubroster{$student}) {
! 330: $sturoster = 1;
! 331: }
! 332: my $output;
! 333: if ($sturoster ne $showinroster) {
! 334: my %changeHash = (
! 335: 'environment.internal.'.$cid.'.showinroster' => $showinroster,
! 336: );
! 337: my $putresult = &Apache::lonnet::put('environment',
! 338: \%changeHash,$udom,$uname);
! 339: if ($putresult eq 'ok') {
! 340: &Apache::lonnet::appenv(%changeHash);
! 341: my $result = &Apache::lonnet::put('publicroster',{$student => $showinroster,},$cdom,$cnum);
! 342: if ($result eq 'ok') {
! 343: $output .= &mt('Display of your name in the student-viewable roster set to <b>[_1]</b>.',$visibility);
! 344: } else {
! 345: $output .= &mt('Error occurred saving display setting.');
! 346: }
! 347: } else {
! 348: $output .= &mt('Error occurred saving display setting.');
! 349: }
! 350: } else {
! 351: $output .= &mt('Display of your name in the student-viewable roster unchanged (set to <b>[_1]</b>).',$visibility);
! 352: }
! 353: return $output;
! 354: }
! 355:
! 356:
! 357:
! 358:
1.1 matthew 359: ###################################################################
360: ###################################################################
361:
362: 1;
363: __END__
364:
365:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>