Annotation of loncom/interface/londropadd.pm, revision 1.161
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to drop and add students in courses
3: #
1.161 ! raeburn 4: # $Id: londropadd.pm,v 1.160 2007/05/21 23:38:40 albertel Exp $
1.17 albertel 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: #
1.1 www 28: #
1.50 matthew 29: ###############################################################
1.82 www 30: ##############################################################
1.1 www 31:
32: package Apache::londropadd;
33:
34: use strict;
1.127 albertel 35: use Apache::lonnet;
1.24 albertel 36: use Apache::loncommon();
1.50 matthew 37: use Apache::lonhtmlcommon();
1.1 www 38: use Apache::Constants qw(:common :http REDIRECT);
1.60 matthew 39: use Spreadsheet::WriteExcel;
1.110 matthew 40: use Apache::lonstathelpers();
1.86 www 41: use Apache::lonlocal;
1.143 raeburn 42: use Apache::longroup;
1.152 albertel 43: use LONCAPA();
1.1 www 44:
1.50 matthew 45: ###############################################################
46: ###############################################################
1.10 www 47: sub header {
1.138 albertel 48: my $start_page=&Apache::loncommon::start_page('Enrollment Manager');
1.27 matthew 49: return(<<ENDHEAD);
1.138 albertel 50: $start_page
1.40 matthew 51: <form method="post" enctype="multipart/form-data"
52: action="/adm/dropadd" name="studentform">
1.1 www 53: ENDHEAD
1.10 www 54: }
55:
1.50 matthew 56: ###############################################################
57: ###############################################################
58: # Drop student from all sections of a course, except optional $csec
1.26 matthew 59: sub modifystudent {
1.33 matthew 60: my ($udom,$unam,$courseid,$csec,$desiredhost)=@_;
1.26 matthew 61: # if $csec is undefined, drop the student from all the courses matching
62: # this one. If $csec is defined, drop them from all other sections of
63: # this course and add them to section $csec
1.151 albertel 64: my $cdom = $env{'course.'.$courseid.'.domain'};
65: my $cnum = $env{'course.'.$courseid.'.num'};
1.26 matthew 66: my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
67: my ($tmp) = keys(%roles);
68: # Bail out if we were unable to get the students roles
1.35 matthew 69: return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.26 matthew 70: # Go through the roles looking for enrollment in this course
1.35 matthew 71: my $result = '';
1.26 matthew 72: foreach my $course (keys(%roles)) {
1.150 albertel 73: if ($course=~m{^/\Q$cdom\E/\Q$cnum\E(?:\/)*(?:\s+)*(\w+)*\_st$}) {
1.26 matthew 74: # We are in this course
1.25 matthew 75: my $section=$1;
1.150 albertel 76: $section='' if ($course eq "/$cdom/$cnum".'_st');
1.87 matthew 77: if (defined($csec) && $section eq $csec) {
1.71 matthew 78: $result .= 'ok:';
79: } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) {
1.27 matthew 80: my (undef,$end,$start)=split(/\_/,$roles{$course});
1.25 matthew 81: my $now=time;
1.143 raeburn 82: # if this is an active role
1.27 matthew 83: if (!($start && ($now<$start)) || !($end && ($now>$end))) {
1.25 matthew 84: my $reply=&Apache::lonnet::modifystudent
1.70 matthew 85: # dom name id mode pass f m l g
86: ($udom,$unam,'', '', '',undef,undef,undef,undef,
1.33 matthew 87: $section,time,undef,undef,$desiredhost);
1.35 matthew 88: $result .= $reply.':';
1.25 matthew 89: }
1.10 www 90: }
91: }
1.20 harris41 92: }
1.35 matthew 93: if ($result eq '') {
1.62 matthew 94: $result = 'Unable to find section for this student';
1.37 matthew 95: } else {
96: $result =~ s/(ok:)+/ok/g;
1.35 matthew 97: }
98: return $result;
1.10 www 99: }
100:
1.50 matthew 101: ###############################################################
102: ###############################################################
103: # build a domain and server selection form
1.31 matthew 104: sub domain_form {
105: my ($defdom) = @_;
106: # Set up domain and server selection forms
107: #
108: # Get the domains
1.156 albertel 109: my @domains = &Apache::lonnet::all_domains();
1.31 matthew 110: # build up the menu information to be passed to
111: # &Apache::loncommon::linked_select_forms
112: my %select_menus;
113: foreach my $dom (@domains) {
114: # set up the text for this domain
115: $select_menus{$dom}->{'text'}= $dom;
116: # we want a choice of 'default' as the default in the second menu
117: $select_menus{$dom}->{'default'}= 'default';
118: $select_menus{$dom}->{'select2'}->{'default'} = 'default';
119: # Now build up the other items in the second menu
1.157 albertel 120: my %servers = &Apache::lonnet::get_servers($dom,'library');
1.31 matthew 121: foreach my $server (keys(%servers)) {
122: $select_menus{$dom}->{'select2'}->{$server}
123: = "$server $servers{$server}";
124: }
125: }
126: my $result = &Apache::loncommon::linked_select_forms
127: ('studentform',' with home server ',$defdom,
128: 'lcdomain','lcserver',\%select_menus);
129: return $result;
130: }
131:
1.50 matthew 132: ###############################################################
133: ###############################################################
134: # Menu Phase One
135: sub print_main_menu {
1.132 raeburn 136: my ($r,$enrl_permission,$view_permission,$grp_manage_permission,
137: $grp_view_permission)=@_;
1.121 matthew 138: #
1.150 albertel 139: my $cid =$env{'request.course.id'};
140: my $cdom=$env{'course.'.$cid.'.domain'};
141: my $cnum=$env{'course.'.$cid.'.num'};
1.121 matthew 142: my @menu =
143: (
1.122 matthew 144: { text => 'Upload a class list',
1.121 matthew 145: help => 'Course_Create_Class_List',
146: action => 'upload',
147: permission => $enrl_permission,
148: },
149: { text => 'Enroll a single student',
150: help => 'Course_Add_Student',
151: action => 'enrollstudent',
152: permission => $enrl_permission,
153: },
154: { text => 'Modify student data',
155: help => 'Course_Modify_Student_Data',
156: action => 'modifystudent',
157: permission => $enrl_permission,
158: },
159: { text => 'View Class List',
160: help => 'Course_View_Class_List',
161: action => 'classlist',
162: permission => $view_permission,
163: },
164: { text => 'Drop Students',
165: help => 'Course_Drop_Student',
166: action => 'drop',
167: permission => $enrl_permission,
168: },
169: { text => 'Automated Enrollment Manager',
170: permission => &Apache::lonnet::auto_run($cnum,$cdom),
171: url => '/adm/populate',
172: },
1.145 albertel 173: { text => 'Create a new group',
174: help => 'Course_Create_Group',
175: permission => $grp_manage_permission,
176: url => '/adm/coursegroups?refpage=enrl&action=create',
177: },
178: { text => 'Modify an existing group',
179: help => 'Course_Modify_Group',
180: permission => $grp_manage_permission,
181: url => '/adm/coursegroups?refpage=enrl&action=modify',
182: },
1.153 raeburn 183: { text => 'Delete an existing group',
184: help => 'Course_Delete_Group',
185: permission => $grp_manage_permission,
186: url => '/adm/coursegroups?refpage=enrl&action=delete',
187: },
188: { text => 'Re-enable a deleted group',
189: help => 'Course_Reenable_Group',
190: permission => $grp_manage_permission,
191: url => '/adm/coursegroups?refpage=enrl&action=reenable',
192: },
1.145 albertel 193: { text => 'Enter an existing group',
194: help => 'Course_Display_Group',
195: permission => $grp_view_permission,
196: url => '/adm/coursegroups?refpage=enrl&action=view',
197: },
1.121 matthew 198: );
199: my $menu_html = '';
200: foreach my $menu_item (@menu) {
201: next if (! $menu_item->{'permission'});
202: $menu_html.='<p>';
203: $menu_html.='<font size="+1">';
204: if (exists($menu_item->{'url'})) {
205: $menu_html.=qq{<a href="$menu_item->{'url'}">};
206: } else {
207: $menu_html.=
208: qq{<a href="/adm/dropadd?action=$menu_item->{'action'}">};
209: }
210: $menu_html.= &mt($menu_item->{'text'}).'</a></font>';
211: if (exists($menu_item->{'help'})) {
212: $menu_html.=
213: &Apache::loncommon::help_open_topic($menu_item->{'help'});
214: }
215: $menu_html.='</p>'.$/;
1.113 raeburn 216: }
1.121 matthew 217: $r->print($menu_html);
218: return;
1.10 www 219: }
220:
1.50 matthew 221: ###############################################################
222: ###############################################################
1.89 matthew 223: sub hidden_input {
224: my ($name,$value) = @_;
225: return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'."\n";
226: }
227:
1.50 matthew 228: sub print_upload_manager_header {
1.23 albertel 229: my ($r,$datatoken,$distotal,$krbdefdom)=@_;
1.24 albertel 230: my $javascript;
1.99 matthew 231: #
1.127 albertel 232: if (! exists($env{'form.upfile_associate'})) {
233: $env{'form.upfile_associate'} = 'forward';
1.50 matthew 234: }
1.127 albertel 235: if ($env{'form.associate'} eq 'Reverse Association') {
236: if ( $env{'form.upfile_associate'} ne 'reverse' ) {
237: $env{'form.upfile_associate'} = 'reverse';
1.50 matthew 238: } else {
1.127 albertel 239: $env{'form.upfile_associate'} = 'forward';
1.50 matthew 240: }
241: }
1.127 albertel 242: if ($env{'form.upfile_associate'} eq 'reverse') {
1.50 matthew 243: $javascript=&upload_manager_javascript_reverse_associate();
1.24 albertel 244: } else {
1.50 matthew 245: $javascript=&upload_manager_javascript_forward_associate();
1.24 albertel 246: }
1.99 matthew 247: #
248: # Deal with restored settings
249: my $password_choice = '';
1.127 albertel 250: if (exists($env{'form.ipwd_choice'}) &&
251: $env{'form.ipwd_choice'} ne '') {
1.99 matthew 252: # If a column was specified for password, assume it is for an
253: # internal password. This is a bug waiting to be filed (could be
254: # local or krb auth instead of internal) but I do not have the
255: # time to mess around with this now.
256: $password_choice = 'int';
257: }
258: #
259: my $javascript_validations=&javascript_validations('auth',$krbdefdom,
260: $password_choice);
1.149 albertel 261: my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');
1.88 matthew 262: $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n".
263: "<hr>\n".
264: '<h3>'.&mt('Identify fields')."</h3>\n");
265: $r->print("<p>\n".
266: &mt('Total number of records found in file: [_1].',$distotal).
267: "\n".
268: "</p><hr>\n");
1.94 sakharuk 269: $r->print(&mt('Enter as many fields as you can. The system will inform you and bring you back to this page if the data selected is insufficient to enroll students in your class.')."<hr>\n");
1.89 matthew 270: $r->print(&hidden_input('action','upload').
271: &hidden_input('state','got_file').
272: &hidden_input('associate','').
273: &hidden_input('datatoken',$datatoken).
1.127 albertel 274: &hidden_input('fileupload',$env{'form.fileupload'}).
275: &hidden_input('upfiletype',$env{'form.upfiletype'}).
276: &hidden_input('upfile_associate',$env{'form.upfile_associate'}));
1.89 matthew 277: $r->print('<input type="button" value="Reverse Association" '.
278: 'name="'.&mt('Reverse Association').'" '.
279: 'onClick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />');
1.148 banghart 280: $r->print('<label><input type="checkbox" name="noFirstLine"'.$checked.'/>'.
1.131 albertel 281: &mt('Ignore First Line').'</label>');
1.89 matthew 282: $r->print("<hr />\n".
283: '<script type="text/javascript" language="Javascript">'."\n".
284: $javascript."\n".$javascript_validations.'</script>');
1.24 albertel 285: }
286:
1.50 matthew 287: ###############################################################
288: ###############################################################
1.24 albertel 289: sub javascript_validations {
1.96 raeburn 290: my ($mode,$krbdefdom,$curr_authtype,$curr_authfield)=@_;
1.89 matthew 291: my $authheader;
292: if ($mode eq 'auth') {
293: my %param = ( formname => 'studentform',
1.99 matthew 294: kerb_def_dom => $krbdefdom,
295: curr_authtype => $curr_authtype);
1.89 matthew 296: $authheader = &Apache::loncommon::authform_header(%param);
1.91 raeburn 297: } elsif ($mode eq 'createcourse') {
298: my %param = ( formname => 'ccrs',
1.99 matthew 299: kerb_def_dom => $krbdefdom,
300: curr_authtype => $curr_authtype );
1.91 raeburn 301: $authheader = &Apache::loncommon::authform_header(%param);
1.96 raeburn 302: } elsif ($mode eq 'modifycourse') {
303: my %param = ( formname => 'cmod',
304: kerb_def_dom => $krbdefdom,
305: mode => 'modifycourse',
306: curr_authtype => $curr_authtype,
307: curr_autharg => $curr_authfield );
308: $authheader = &Apache::loncommon::authform_header(%param);
1.89 matthew 309: }
1.96 raeburn 310:
1.91 raeburn 311:
1.89 matthew 312: my %alert = &Apache::lonlocal::texthash
313: (username => 'You need to specify the username field.',
314: authen => 'You must choose an authentication type.',
315: krb => 'You need to specify the Kerberos domain.',
316: ipass => 'You need to specify the initial password.',
317: name => 'The optional name field was not specified.',
318: snum => 'The optional student number field was not specified.',
1.142 raeburn 319: section => 'The optional section field was not specified.',
1.89 matthew 320: email => 'The optional email address field was not specified.',
321: continue => 'Continue enrollment?',
322: );
323:
324: # my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
325: my $function_name =(<<END);
1.73 www 326: function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) {
1.89 matthew 327: END
1.97 raeburn 328: my $auth_checks;
1.96 raeburn 329: if ($mode eq 'createcourse') {
330: $auth_checks .= (<<END);
1.97 raeburn 331: if (vf.autoadds[0].checked == true) {
1.96 raeburn 332: if (current.radiovalue == null || current.radiovalue == 'nochange') {
333: alert('$alert{'authen'}');
334: return;
335: }
336: }
337: END
338: } else {
1.91 raeburn 339: $auth_checks .= (<<END);
1.97 raeburn 340: var foundatype=0;
1.3 www 341: if (founduname==0) {
1.89 matthew 342: alert('$alert{'username'}');
1.3 www 343: return;
344: }
1.61 matthew 345: // alert('current.radiovalue = '+current.radiovalue);
1.119 albertel 346: if (current.radiovalue == null || current.radiovalue == '' || current.radiovalue == 'nochange') {
1.28 matthew 347: // They did not check any of the login radiobuttons.
1.89 matthew 348: alert('$alert{'authen'}');
1.28 matthew 349: return;
350: }
1.96 raeburn 351: END
352: }
1.97 raeburn 353: if ($mode eq 'createcourse') {
354: $auth_checks .= "
355: if ( (vf.autoadds[0].checked == true) &&
356: (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') ) {
357: ";
358: } elsif ($mode eq 'modifycourse') {
359: $auth_checks .= "
360: if (vf.elements[current.argfield].value == null || vf.elements[current.argfield].value == '') {
361: ";
362: }
1.96 raeburn 363: if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.97 raeburn 364: $auth_checks .= (<<END);
365: var alertmsg = '';
366: switch (current.radiovalue) {
367: case 'krb':
368: alertmsg = '$alert{'krb'}';
369: break;
370: default:
371: alertmsg = '';
1.96 raeburn 372: }
1.97 raeburn 373: if (alertmsg != '') {
374: alert(alertmsg);
375: return;
1.96 raeburn 376: }
377: }
378: END
379: } else {
380: $auth_checks .= (<<END);
1.28 matthew 381: foundatype=1;
1.29 matthew 382: if (current.argfield == null || current.argfield == '') {
1.28 matthew 383: var alertmsg = '';
1.29 matthew 384: switch (current.value) {
1.28 matthew 385: case 'krb':
1.89 matthew 386: alertmsg = '$alert{'krb'}';
1.28 matthew 387: break;
388: case 'loc':
389: case 'fsys':
1.89 matthew 390: alertmsg = '$alert{'ipass'}';
1.28 matthew 391: break;
392: case 'fsys':
393: alertmsg = '';
394: break;
395: default:
396: alertmsg = '';
1.3 www 397: }
1.28 matthew 398: if (alertmsg != '') {
399: alert(alertmsg);
1.3 www 400: return;
401: }
402: }
1.89 matthew 403: END
1.96 raeburn 404: }
1.142 raeburn 405: my $section_checks;
1.91 raeburn 406: my $optional_checks = '';
1.96 raeburn 407: if ( ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.91 raeburn 408: $optional_checks = (<<END);
409: vf.submit();
410: }
411: END
412: } else {
1.142 raeburn 413: $section_checks = §ion_check_js();
1.91 raeburn 414: $optional_checks = (<<END);
1.89 matthew 415: var message='';
416: if (foundname==0) {
417: message='$alert{'name'}';
1.24 albertel 418: }
1.89 matthew 419: if (foundid==0) {
420: if (message!='') {
421: message+='\\n';
422: }
423: message+='$alert{'snum'}';
424: }
425: if (foundsec==0) {
426: if (message!='') {
427: message+='\\n';
428: }
429: message+='$alert{'section'}';
430: }
431: if (foundemail==0) {
432: if (message!='') {
433: message+='\\n';
434: }
435: message+='$alert{'email'}';
1.74 matthew 436: }
437: if (message!='') {
1.89 matthew 438: message+= '\\n$alert{'continue'}';
439: if (confirm(message)) {
440: vf.state.value='enrolling';
441: vf.submit();
442: }
1.74 matthew 443: } else {
1.89 matthew 444: vf.state.value='enrolling';
445: vf.submit();
1.74 matthew 446: }
447: }
1.89 matthew 448: END
1.91 raeburn 449: }
1.89 matthew 450: my $result = $function_name;
1.96 raeburn 451: if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.89 matthew 452: $result .= $auth_checks;
453: }
1.142 raeburn 454: $result .= $optional_checks."\n".$section_checks;
1.96 raeburn 455: if ( ($mode eq 'auth') || ($mode eq 'createcourse') || ($mode eq 'modifycourse') ) {
1.89 matthew 456: $result .= $authheader;
457: }
458: return $result;
1.74 matthew 459: }
460:
1.50 matthew 461: ###############################################################
462: ###############################################################
463: sub upload_manager_javascript_forward_associate {
1.24 albertel 464: return(<<ENDPICK);
1.142 raeburn 465: function verify(vf,sec_caller) {
1.24 albertel 466: var founduname=0;
467: var foundpwd=0;
468: var foundname=0;
469: var foundid=0;
470: var foundsec=0;
1.73 www 471: var foundemail=0;
1.24 albertel 472: var tw;
473: for (i=0;i<=vf.nfields.value;i++) {
474: tw=eval('vf.f'+i+'.selectedIndex');
475: if (tw==1) { founduname=1; }
476: if ((tw>=2) && (tw<=6)) { foundname=1; }
477: if (tw==7) { foundid=1; }
478: if (tw==8) { foundsec=1; }
479: if (tw==9) { foundpwd=1; }
1.73 www 480: if (tw==10) { foundemail=1; }
1.24 albertel 481: }
1.73 www 482: verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail);
1.24 albertel 483: }
484:
1.49 matthew 485: //
486: // vf = this.form
487: // tf = column number
488: //
489: // values of nw
490: //
491: // 0 = none
492: // 1 = username
493: // 2 = names (lastname, firstnames)
494: // 3 = fname (firstname)
495: // 4 = mname (middlename)
496: // 5 = lname (lastname)
497: // 6 = gen (generation)
498: // 7 = id
499: // 8 = section
500: // 9 = ipwd (password)
1.73 www 501: // 10 = email address
502:
1.24 albertel 503: function flip(vf,tf) {
504: var nw=eval('vf.f'+tf+'.selectedIndex');
505: var i;
1.49 matthew 506: // make sure no other columns are labeled the same as this one
1.24 albertel 507: for (i=0;i<=vf.nfields.value;i++) {
508: if ((i!=tf) && (eval('vf.f'+i+'.selectedIndex')==nw)) {
509: eval('vf.f'+i+'.selectedIndex=0;')
510: }
511: }
1.49 matthew 512: // If we set this to 'lastname, firstnames', clear out all the ones
513: // set to 'fname','mname','lname','gen' (3,4,5,6) currently.
1.24 albertel 514: if (nw==2) {
515: for (i=0;i<=vf.nfields.value;i++) {
516: if ((eval('vf.f'+i+'.selectedIndex')>=3) &&
517: (eval('vf.f'+i+'.selectedIndex')<=6)) {
518: eval('vf.f'+i+'.selectedIndex=0;')
519: }
520: }
521: }
1.49 matthew 522: // If we set this to one of 'fname','mname','lname','gen' (3,4,5,6),
523: // clear out any that are set to 'lastname, firstnames' (2)
1.24 albertel 524: if ((nw>=3) && (nw<=6)) {
525: for (i=0;i<=vf.nfields.value;i++) {
526: if (eval('vf.f'+i+'.selectedIndex')==2) {
527: eval('vf.f'+i+'.selectedIndex=0;')
528: }
529: }
530: }
1.49 matthew 531: // If we set the password, make the password form below correspond to
532: // the new value.
1.24 albertel 533: if (nw==9) {
1.28 matthew 534: changed_radio('int',document.studentform);
535: set_auth_radio_buttons('int',document.studentform);
536: vf.intarg.value='';
537: vf.krbarg.value='';
1.24 albertel 538: vf.locarg.value='';
539: }
540: }
541:
542: function clearpwd(vf) {
543: var i;
544: for (i=0;i<=vf.nfields.value;i++) {
545: if (eval('vf.f'+i+'.selectedIndex')==9) {
546: eval('vf.f'+i+'.selectedIndex=0;')
547: }
548: }
549: }
550:
551: ENDPICK
552: }
553:
1.50 matthew 554: ###############################################################
555: ###############################################################
556: sub upload_manager_javascript_reverse_associate {
1.24 albertel 557: return(<<ENDPICK);
1.142 raeburn 558: function verify(vf,sec_caller) {
1.24 albertel 559: var founduname=0;
560: var foundpwd=0;
561: var foundname=0;
562: var foundid=0;
563: var foundsec=0;
564: var tw;
565: for (i=0;i<=vf.nfields.value;i++) {
566: tw=eval('vf.f'+i+'.selectedIndex');
567: if (i==0 && tw!=0) { founduname=1; }
568: if (((i>=1) && (i<=5)) && tw!=0 ) { foundname=1; }
569: if (i==6 && tw!=0) { foundid=1; }
570: if (i==7 && tw!=0) { foundsec=1; }
571: if (i==8 && tw!=0) { foundpwd=1; }
572: }
573: verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
574: }
575:
576: function flip(vf,tf) {
577: var nw=eval('vf.f'+tf+'.selectedIndex');
578: var i;
579: // picked the all one one name field, reset the other name ones to blank
580: if (tf==1 && nw!=0) {
581: for (i=2;i<=5;i++) {
582: eval('vf.f'+i+'.selectedIndex=0;')
583: }
584: }
585: //picked one of the piecewise name fields, reset the all in
586: //one field to blank
587: if ((tf>=2) && (tf<=5) && (nw!=0)) {
588: eval('vf.f1.selectedIndex=0;')
589: }
590: // intial password specified, pick internal authentication
591: if (tf==8 && nw!=0) {
1.28 matthew 592: changed_radio('int',document.studentform);
593: set_auth_radio_buttons('int',document.studentform);
594: vf.krbarg.value='';
595: vf.intarg.value='';
1.24 albertel 596: vf.locarg.value='';
597: }
598: }
599:
600: function clearpwd(vf) {
601: var i;
602: if (eval('vf.f8.selectedIndex')!=0) {
603: eval('vf.f8.selectedIndex=0;')
604: }
605: }
1.2 www 606: ENDPICK
1.23 albertel 607: }
1.10 www 608:
1.50 matthew 609: ###############################################################
610: ###############################################################
611: sub print_upload_manager_footer {
1.23 albertel 612: my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_;
1.64 albertel 613:
614: my ($krbdef,$krbdefdom) =
615: &Apache::loncommon::get_kerberos_defaults($defdom);
616: my %param = ( formname => 'document.studentform',
617: kerb_def_dom => $krbdefdom,
618: kerb_def_auth => $krbdef
619: );
1.127 albertel 620: if (exists($env{'form.ipwd_choice'}) &&
621: defined($env{'form.ipwd_choice'}) &&
622: $env{'form.ipwd_choice'} ne '') {
1.99 matthew 623: $param{'curr_authtype'} = 'int';
624: }
1.28 matthew 625: my $krbform = &Apache::loncommon::authform_kerberos(%param);
626: my $intform = &Apache::loncommon::authform_internal(%param);
627: my $locform = &Apache::loncommon::authform_local(%param);
1.31 matthew 628: my $domform = &domain_form($defdom);
1.68 matthew 629: my $date_table = &date_setting_table();
1.90 matthew 630: my $Str = "</table>\n";
631: $Str .= &hidden_input('nfields',$i);
632: $Str .= &hidden_input('keyfields',$keyfields);
633: $Str .= '<h3>'.&mt('Login Type')."</h3>\n";
634: $Str .= "<p>\n".
635: &mt('Note: this will not take effect if the user already exists').
1.130 www 636: &Apache::loncommon::help_open_topic('Auth_Options').
1.90 matthew 637: "</p><p>\n";
638: $Str .= $krbform."\n</p><p>\n".
639: $intform."\n</p><p>\n".
640: $locform."\n</p>\n";
641: $Str .= '<h3>'.&mt('LON-CAPA Domain for Students')."</h3>\n";
642: $Str .= "<p>\n".&mt('LON-CAPA domain: [_1]',$domform)."\n</p>\n";
643: $Str .= "<h3>".&mt('Starting and Ending Dates')."</h3>\n";
644: $Str .= "<p>\n".$date_table."</p>\n";
645: $Str .= "<h3>".&mt('Full Update')."</h3>\n";
1.131 albertel 646: $Str .= '<label><input type="checkbox" name="fullup" value="yes">'.
1.90 matthew 647: ' '.&mt('Full update (also print list of users not enrolled anymore)').
1.131 albertel 648: "</label></p>\n";
1.90 matthew 649: $Str .= "<h3>".&mt('Student Number')."</h3>\n";
1.131 albertel 650: $Str .= "<p>\n".'<label><input type="checkbox" name="forceid" value="yes">';
1.90 matthew 651: $Str .= &mt('Disable ID/Student Number Safeguard and Force Change '.
652: 'of Conflicting IDs (only do if you know what you are doing)').
1.131 albertel 653: "</label>\n</p><p>\n";
1.142 raeburn 654: $Str .= '<input type="button"'.
655: 'onClick="javascript:verify(this.form,this.form.csec)" '.
1.95 albertel 656: 'value="Update Class List" />'."<br />\n";
1.90 matthew 657: $Str .= &mt('Note: for large courses, this operation may be time '.
658: 'consuming');
659: $r->print($Str);
660: return;
1.23 albertel 661: }
1.24 albertel 662:
1.90 matthew 663: ###############################################################
664: ###############################################################
1.50 matthew 665: sub print_upload_manager_form {
1.23 albertel 666: my $r=shift;
1.99 matthew 667:
1.82 www 668: my $firstLine;
1.24 albertel 669: my $datatoken;
1.127 albertel 670: if (!$env{'form.datatoken'}) {
1.90 matthew 671: $datatoken=&Apache::loncommon::upfile_store($r);
1.24 albertel 672: } else {
1.127 albertel 673: $datatoken=$env{'form.datatoken'};
1.90 matthew 674: &Apache::loncommon::load_tmp_file($r);
1.24 albertel 675: }
676: my @records=&Apache::loncommon::upfile_record_sep();
1.127 albertel 677: if($env{'form.noFirstLine'}){
1.90 matthew 678: $firstLine=shift(@records);
679: }
1.23 albertel 680: my $total=$#records;
681: my $distotal=$total+1;
682: my $today=time;
683: my $halfyear=$today+15552000;
1.99 matthew 684: #
685: # Restore memorized settings
686: &Apache::loncommon::restore_course_settings
687: ('enrollment_upload',{ 'username_choice' => 'scalar', # column settings
688: 'names_choice' => 'scalar',
689: 'fname_choice' => 'scalar',
690: 'mname_choice' => 'scalar',
691: 'lname_choice' => 'scalar',
692: 'gen_choice' => 'scalar',
693: 'id_choice' => 'scalar',
694: 'sec_choice' => 'scalar',
695: 'ipwd_choice' => 'scalar',
696: 'email_choice' => 'scalar',
697: });
698: #
699: # Determine kerberos parameters as appropriate
1.127 albertel 700: my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.64 albertel 701: my ($krbdef,$krbdefdom) =
702: &Apache::loncommon::get_kerberos_defaults($defdom);
1.99 matthew 703: #
1.50 matthew 704: &print_upload_manager_header($r,$datatoken,$distotal,$krbdefdom);
1.24 albertel 705: my $i;
706: my $keyfields;
1.23 albertel 707: if ($total>=0) {
1.99 matthew 708: my @field=
1.127 albertel 709: (['username',&mt('Username'), $env{'form.username_choice'}],
710: ['names',&mt('Last Name, First Names'),$env{'form.names_choice'}],
711: ['fname',&mt('First Name'), $env{'form.fname_choice'}],
712: ['mname',&mt('Middle Names/Initials'),$env{'form.mname_choice'}],
713: ['lname',&mt('Last Name'), $env{'form.lname_choice'}],
714: ['gen', &mt('Generation'), $env{'form.gen_choice'}],
715: ['id', &mt('ID/Student Number'),$env{'form.id_choice'}],
1.142 raeburn 716: ['sec', &mt('Section'), $env{'form.sec_choice'}],
1.127 albertel 717: ['ipwd', &mt('Initial Password'),$env{'form.ipwd_choice'}],
718: ['email',&mt('EMail Address'), $env{'form.email_choice'}]);
719: if ($env{'form.upfile_associate'} eq 'reverse') {
1.24 albertel 720: &Apache::loncommon::csv_print_samples($r,\@records);
1.90 matthew 721: $i=&Apache::loncommon::csv_print_select_table($r,\@records,
722: \@field);
723: foreach (@field) {
724: $keyfields.=$_->[0].',';
725: }
1.24 albertel 726: chop($keyfields);
727: } else {
1.90 matthew 728: unshift(@field,['none','']);
729: $i=&Apache::loncommon::csv_samples_select_table($r,\@records,
730: \@field);
1.24 albertel 731: my %sone=&Apache::loncommon::record_sep($records[0]);
732: $keyfields=join(',',sort(keys(%sone)));
1.23 albertel 733: }
734: }
1.50 matthew 735: &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear);
1.10 www 736: }
737:
1.90 matthew 738: ###############################################################
739: ###############################################################
1.12 www 740: sub enroll_single_student {
741: my $r=shift;
1.80 matthew 742: # Remove non alphanumeric values from section
1.127 albertel 743: $env{'form.csec'}=~s/\W//g;
1.68 matthew 744: #
745: # We do the dates first because the action of making them the defaul
1.107 www 746: # in the course is entirely separate from the action of enrolling the
1.68 matthew 747: # student. Also, a failure in setting the dates as default is not fatal
748: # to the process of enrolling / modifying a student.
749: my ($startdate,$enddate) = &get_dates_from_form();
1.127 albertel 750: if ($env{'form.makedatesdefault'}) {
1.68 matthew 751: $r->print(&make_dates_default($startdate,$enddate));
752: }
753:
1.94 sakharuk 754: $r->print('<h3>'.&mt('Enrolling Student').'</h3>');
1.127 albertel 755: $r->print('<p>'.&mt('Enrolling').' '.$env{'form.cuname'}." \@ ".
756: $env{'form.lcdomain'}.'</p>');
1.150 albertel 757: if (($env{'form.cuname'})
758: && ($env{'form.cuname'}
759: eq &LONCAPA::clean_username($env{'form.cuname'}))
760: && ($env{'form.lcdomain'})
761: && ($env{'form.lcdomain'}
762: eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) {
1.31 matthew 763: # Deal with home server selection
1.127 albertel 764: my $domain=$env{'form.lcdomain'};
765: my $desiredhost = $env{'form.lcserver'};
1.31 matthew 766: if (lc($desiredhost) eq 'default') {
767: $desiredhost = undef;
768: } else {
1.157 albertel 769: my %home_servers =&Apache::lonnet::get_servers($domain,'library');
1.31 matthew 770: if (! exists($home_servers{$desiredhost})) {
1.94 sakharuk 771: $r->print('<font color="#ff0000">'.&mt('Error').':</font>'.
772: &mt('Invalid home server specified'));
1.31 matthew 773: return;
774: }
775: }
1.94 sakharuk 776: $r->print(" ".&mt('with server')." $desiredhost :") if (defined($desiredhost));
1.31 matthew 777: # End of home server selection logic
1.12 www 778: my $amode='';
779: my $genpwd='';
1.127 albertel 780: if ($env{'form.login'} eq 'krb') {
1.47 albertel 781: $amode='krb';
1.127 albertel 782: $amode.=$env{'form.krbver'};
783: $genpwd=$env{'form.krbarg'};
784: } elsif ($env{'form.login'} eq 'int') {
1.26 matthew 785: $amode='internal';
1.127 albertel 786: $genpwd=$env{'form.intarg'};
787: } elsif ($env{'form.login'} eq 'loc') {
1.15 albertel 788: $amode='localauth';
1.127 albertel 789: $genpwd=$env{'form.locarg'};
1.15 albertel 790: if (!$genpwd) { $genpwd=" "; }
791: }
1.127 albertel 792: my $home = &Apache::lonnet::homeserver($env{'form.cuname'},
793: $env{'form.lcdomain'});
1.34 matthew 794: if ((($amode) && ($genpwd)) || ($home ne 'no_host')) {
1.55 matthew 795: # Clean out any old roles the student has in this class.
1.127 albertel 796: &modifystudent($env{'form.lcdomain'},$env{'form.cuname'},
797: $env{'request.course.id'},$env{'form.csec'},
1.33 matthew 798: $desiredhost);
1.55 matthew 799: my $login_result = &Apache::lonnet::modifystudent
1.127 albertel 800: ($env{'form.lcdomain'},$env{'form.cuname'},
801: $env{'form.cstid'},$amode,$genpwd,
802: $env{'form.cfirst'},$env{'form.cmiddle'},
803: $env{'form.clast'},$env{'form.cgen'},
804: $env{'form.csec'},$enddate,
805: $startdate,$env{'form.forceid'},
806: $desiredhost,$env{'form.emailaddress'});
1.55 matthew 807: if ($login_result =~ /^ok/) {
808: $r->print($login_result);
1.94 sakharuk 809: $r->print("<p> ".&mt('If active, the new role will be available when the student next logs in to LON-CAPA.')."</p>");
1.55 matthew 810: } else {
1.94 sakharuk 811: $r->print(&mt('unable to enroll').": ".$login_result);
1.55 matthew 812: }
1.12 www 813: } else {
1.94 sakharuk 814: $r->print('<p><font color="#ff0000">'.&mt('ERROR').'</font> ');
1.79 matthew 815: if ($amode =~ /^krb/) {
1.94 sakharuk 816: $r->print(&mt('Missing Kerberos domain information.').' ');
1.79 matthew 817: } else {
1.94 sakharuk 818: $r->print(&mt('Invalid login mode or password.').' ');
1.79 matthew 819: }
1.127 albertel 820: $r->print('<b>'.&mt('Unable to enroll').' '.$env{'form.cuname'}.'.</b></p>');
1.79 matthew 821: }
1.12 www 822: } else {
1.94 sakharuk 823: $r->print(&mt('Invalid username or domain'));
1.26 matthew 824: }
1.155 www 825: $r->print("<p><a href='/adm/dropadd?action=enrollstudent'>".&mt("Enroll another student")."</a></p>");
1.12 www 826: }
827:
1.68 matthew 828: sub setup_date_selectors {
1.91 raeburn 829: my ($starttime,$endtime,$mode) = @_;
1.68 matthew 830: if (! defined($starttime)) {
831: $starttime = time;
1.114 raeburn 832: unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
1.127 albertel 833: if (exists($env{'course.'.$env{'request.course.id'}.
1.68 matthew 834: '.default_enrollment_start_date'})) {
1.127 albertel 835: $starttime = $env{'course.'.$env{'request.course.id'}.
1.68 matthew 836: '.default_enrollment_start_date'};
1.91 raeburn 837: }
1.68 matthew 838: }
839: }
840: if (! defined($endtime)) {
841: $endtime = time+(6*30*24*60*60); # 6 months from now, approx
1.91 raeburn 842: unless ($mode eq 'createcourse') {
1.127 albertel 843: if (exists($env{'course.'.$env{'request.course.id'}.
1.68 matthew 844: '.default_enrollment_end_date'})) {
1.127 albertel 845: $endtime = $env{'course.'.$env{'request.course.id'}.
1.68 matthew 846: '.default_enrollment_end_date'};
1.91 raeburn 847: }
1.68 matthew 848: }
849: }
850: my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform',
851: 'startdate',
852: $starttime);
853: my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform',
854: 'enddate',
855: $endtime);
1.114 raeburn 856: if ($mode eq 'create_enrolldates') {
857: $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
858: 'startenroll',
859: $starttime);
860: $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs',
861: 'endenroll',
862: $endtime);
863: }
864: if ($mode eq 'create_defaultdates') {
1.91 raeburn 865: $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs',
1.114 raeburn 866: 'startaccess',
1.91 raeburn 867: $starttime);
868: $enddateform = &Apache::lonhtmlcommon::date_setter('ccrs',
1.114 raeburn 869: 'endaccess',
1.91 raeburn 870: $endtime);
871: }
1.68 matthew 872: return ($startdateform,$enddateform);
873: }
874:
875: sub get_dates_from_form {
876: my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate');
877: my $enddate = &Apache::lonhtmlcommon::get_date_from_form('enddate');
1.127 albertel 878: if ($env{'form.no_end_date'}) {
1.68 matthew 879: $enddate = 0;
880: }
881: return ($startdate,$enddate);
882: }
883:
884: sub date_setting_table {
1.91 raeburn 885: my ($starttime,$endtime,$mode) = @_;
886: my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode);
1.68 matthew 887: my $dateDefault = '<nobr>'.
1.131 albertel 888: '<label><input type="checkbox" name="makedatesdefault" /> '.
1.160 albertel 889: &mt('make these dates the default for future enrollment').
890: '</label></nobr>';
1.114 raeburn 891: if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') {
1.91 raeburn 892: $dateDefault = ' ';
893: }
1.131 albertel 894: my $perpetual = '<nobr><label><input type="checkbox" name="no_end_date"';
1.68 matthew 895: if (defined($endtime) && $endtime == 0) {
896: $perpetual .= ' checked';
897: }
1.131 albertel 898: $perpetual.= ' /> '.&mt('no ending date').'</label></nobr>';
1.114 raeburn 899: if ($mode eq 'create_enrolldates') {
900: $perpetual = ' ';
901: }
1.68 matthew 902: my $result = '';
903: $result .= "<table>\n";
1.94 sakharuk 904: $result .= '<tr><td align="right">'.&mt('Starting Date').'</td>'.
1.68 matthew 905: '<td>'.$startform.'</td>'.
906: '<td>'.$dateDefault.'</td>'."</tr>\n";
1.94 sakharuk 907: $result .= '<tr><td align="right">'.&mt('Ending Date').'</td>'.
1.68 matthew 908: '<td>'.$endform.'</td>'.
909: '<td>'.$perpetual.'</td>'."</tr>\n";
910: $result .= "</table>\n";
911: return $result;
912: }
913:
914: sub make_dates_default {
915: my ($startdate,$enddate) = @_;
916: my $result = '';
1.127 albertel 917: my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
918: my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
1.68 matthew 919: my $put_result = &Apache::lonnet::put('environment',
920: {'default_enrollment_start_date'=>$startdate,
921: 'default_enrollment_end_date' =>$enddate},$dom,$crs);
922: if ($put_result eq 'ok') {
923: $result .= "Set default start and end dates for course<br />";
1.69 matthew 924: #
925: # Refresh the course environment
1.140 albertel 926: &Apache::lonnet::coursedescription($env{'request.course.id'},
927: {'freshen_cache' => 1});
1.68 matthew 928: } else {
1.94 sakharuk 929: $result .= &mt('Unable to set default dates for course').":".$put_result.
1.68 matthew 930: '<br />';
931: }
932: return $result;
933: }
934:
1.74 matthew 935: ##
936: ## Single student enrollment routines (some of them)
937: ##
938: sub get_student_username_domain_form {
939: my $r = shift;
940: my $domform = &Apache::loncommon::select_dom_form
1.127 albertel 941: ($env{'course.'.$env{'request.course.id'}.'.domain'},'cudomain',0);
1.94 sakharuk 942: my %lt=&Apache::lonlocal::texthash(
943: 'eos' => "Enroll One Student",
944: 'usr' => "Username",
945: 'dom' => "Domain",
946: 'been' => "Begin Enrollment",
947: );
1.74 matthew 948: $r->print(<<END);
949: <input type="hidden" name="action" value="enrollstudent" />
950: <input type="hidden" name="state" value="gotusername" />
1.94 sakharuk 951: <h3>$lt{'eos'}</h3>
1.74 matthew 952: <table>
1.159 www 953: <tr><td class="LC_dropadd_labeltext"><label for="cuname">$lt{'usr'}</label>:</td>
1.74 matthew 954: <td><input type="text" name="cuname" size="15" /></td></tr>
1.159 www 955: <tr><td class="LC_dropadd_labeltext"><label for="cudomain">$lt{'dom'}</label>:</td>
1.74 matthew 956: <td>$domform</td></tr>
1.159 www 957: <tr><td> </td>
1.74 matthew 958: <td>
1.94 sakharuk 959: <input type="submit" name="Begin Enrollment" value="$lt{'been'}" />
1.74 matthew 960: </td></tr>
961: </table>
1.120 albertel 962: <script type="text/javascript">
963: // the if prevents the script error if the browser can not handle this
964: if ( document.studentform.cuname ) { document.studentform.cuname.focus(); }
965: </script>
1.74 matthew 966: END
967: return;
968: }
969:
1.50 matthew 970: sub print_enroll_single_student_form {
1.10 www 971: my $r=shift;
1.94 sakharuk 972: $r->print("<h3>".&mt('Enroll One Student')."</h3>");
1.74 matthew 973: #
1.150 albertel 974: my $username = &LONCAPA::clean_username($env{'form.cuname'});
975: my $domain = &LONCAPA::clean_domain($env{'form.cudomain'});
1.74 matthew 976: my $home = &Apache::lonnet::homeserver($username,$domain);
977: # $new_user flags whether we are creating a new user or using an old one
978: my $new_user = 1;
979: if ($home ne 'no_host') {
980: $new_user = 0;
981: }
982: #
983: my $user_data_html = '';
984: my $javascript_validations = '';
985: if ($new_user) {
1.127 albertel 986: my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'};
1.74 matthew 987: # Set up authentication forms
988: my ($krbdef,$krbdefdom) =
1.75 matthew 989: &Apache::loncommon::get_kerberos_defaults($domain);
1.89 matthew 990: $javascript_validations=&javascript_validations('auth',$krbdefdom);
1.74 matthew 991: my %param = ( formname => 'document.studentform',
992: kerb_def_dom => $krbdefdom,
993: kerb_def_auth => $krbdef
994: );
995: my $krbform = &Apache::loncommon::authform_kerberos(%param);
996: my $intform = &Apache::loncommon::authform_internal(%param);
997: my $locform = &Apache::loncommon::authform_local(%param);
998: #
999: # Set up domain selection form
1000: my $homeserver_form = '';
1.157 albertel 1001: my %servers = &Apache::lonnet::get_servers($domain,'library');
1.74 matthew 1002: $homeserver_form = '<select name="lcserver" size="1">'."\n".
1003: '<option value="default" selected>default</option>'."\n";
1004: while (my ($servername,$serverdescription) = each (%servers)) {
1005: $homeserver_form .= '<option value="'.$servername.'">'.
1006: $serverdescription."</option>\n";
1007: }
1008: $homeserver_form .= "</select>\n";
1009: #
1010: #
1.94 sakharuk 1011: my %lt=&Apache::lonlocal::texthash(
1012: 'udf' => "User Data for",
1013: 'fn' => "First Name",
1014: 'mn' => "Middle Name",
1015: 'ln' => "Last Name",
1016: 'gen' => "Generation",
1017: 'hs' => "Home Server",
1018: 'pswd' => "Password",
1019: 'psam' => "Please select an authentication mechanism",
1.124 www 1020: 'mail' => "Email Address"
1.94 sakharuk 1021: );
1.130 www 1022: my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options');
1.74 matthew 1023: $user_data_html = <<END;
1.160 albertel 1024: <h3>$lt{'udf'} $username:$domain</h3>
1.74 matthew 1025: <table>
1.159 www 1026: <tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td>
1.160 albertel 1027: <td><input type="text" name="cfirst" size="15" /></td></tr>
1.159 www 1028: <tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td>
1.160 albertel 1029: <td><input type="text" name="cmiddle" size="15" /></td></tr>
1.159 www 1030: <tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td>
1.160 albertel 1031: <td><input type="text" name="clast" size="15" /></td></tr>
1.159 www 1032: <tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td>
1.160 albertel 1033: <td><input type="text" name="cgen" size="5" /> </td></tr>
1.159 www 1034: <tr><td class="LC_dropadd_labeltext"><label for="lcserver">$lt{'hs'}</label>:</td>
1.74 matthew 1035: <td>$homeserver_form</td></tr>
1.159 www 1036: <tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td>
1.124 www 1037: <td><input type="text" name="emailaddress" size="20" /></td></tr>
1.74 matthew 1038: </table>
1.94 sakharuk 1039: <h3>$lt{'pswd'}</h3>
1.130 www 1040: $lt{'psam'}$authhelp
1.74 matthew 1041: <table>
1042: <p>
1043: $krbform
1.75 matthew 1044: <br />
1.74 matthew 1045: $intform
1.75 matthew 1046: <br />
1.74 matthew 1047: $locform
1048: </p>
1049: END
1050: } else {
1051: # User already exists. Do not worry about authentication
1052: my %uenv = &Apache::lonnet::dump('environment',$domain,$username);
1.89 matthew 1053: $javascript_validations = &javascript_validations('noauth');
1.94 sakharuk 1054: my %lt=&Apache::lonlocal::texthash(
1055: 'udf' => "User Data for",
1056: 'fn' => "First Name",
1057: 'mn' => "Middle Name",
1058: 'ln' => "Last Name",
1059: 'gen' => "Generation",
1.124 www 1060: 'mail' => "Email Address",
1.94 sakharuk 1061: );
1.74 matthew 1062: $user_data_html = <<END;
1.160 albertel 1063: <h3>$lt{'udf'} $username:$domain</h3>
1.74 matthew 1064: <input type="hidden" name="lcserver" value="default" />
1065: <table>
1.159 www 1066: <tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td>
1.161 ! raeburn 1067: <td><input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /></td></tr>
1.159 www 1068: <tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td>
1.161 ! raeburn 1069: <td><input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /></td></tr>
1.159 www 1070: <tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td>
1.161 ! raeburn 1071: <td><input type="text" name="clast" value="$uenv{'lastname'}" size="15" /></td></tr>
1.160 albertel 1072: <tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td>
1.161 ! raeburn 1073: <td><input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> </td></tr>
1.160 albertel 1074: <tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td>
1.161 ! raeburn 1075: <td><input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" /></td></tr>
1.74 matthew 1076: </table>
1077: END
1078: }
1.68 matthew 1079: my $date_table = &date_setting_table();
1.74 matthew 1080: # Print it all out
1.94 sakharuk 1081: my %lt=&Apache::lonlocal::texthash(
1082: 'cd' => "Course Data",
1.142 raeburn 1083: 'gs' => "Section",
1.94 sakharuk 1084: 'idsn' => "ID/Student Number",
1085: 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
1086: 'eas' => "Enroll as student",
1087: );
1.50 matthew 1088: $r->print(<<END);
1.74 matthew 1089: <input type="hidden" name="action" value="enrollstudent" />
1090: <input type="hidden" name="state" value="done" />
1091: <input type="hidden" name="cuname" value="$username" />
1092: <input type="hidden" name="lcdomain" value="$domain" />
1.28 matthew 1093: <script type="text/javascript" language="Javascript">
1.142 raeburn 1094: function verify(vf,sec_caller) {
1.12 www 1095: var founduname=0;
1096: var foundpwd=0;
1097: var foundname=0;
1098: var foundid=0;
1099: var foundsec=0;
1100: var tw;
1.26 matthew 1101: if ((typeof(vf.cuname.value) !="undefined") && (vf.cuname.value!='') &&
1.31 matthew 1102: (typeof(vf.lcdomain.value)!="undefined") && (vf.lcdomain.value!='')) {
1.12 www 1103: founduname=1;
1104: }
1.14 harris41 1105: if ((typeof(vf.cfirst.value)!="undefined") && (vf.cfirst.value!='') &&
1.26 matthew 1106: (typeof(vf.clast.value) !="undefined") && (vf.clast.value!='')) {
1.12 www 1107: foundname=1;
1108: }
1.14 harris41 1109: if ((typeof(vf.csec.value)!="undefined") && (vf.csec.value!='')) {
1.12 www 1110: foundsec=1;
1.142 raeburn 1111: if (validate(sec_caller) == "error") {
1112: return;
1113: }
1.12 www 1114: }
1.14 harris41 1115: if ((typeof(vf.cstid.value)!="undefined") && (vf.cstid.value!='')) {
1.12 www 1116: foundid=1;
1117: }
1118: if (founduname==0) {
1119: alert('You need to specify at least the username and domain fields');
1120: return;
1121: }
1.24 albertel 1122: verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec);
1.12 www 1123: }
1124:
1.24 albertel 1125: $javascript_validations
1.12 www 1126:
1.24 albertel 1127: function clearpwd(vf) {
1128: //nothing else needs clearing
1.15 albertel 1129: }
1130:
1.12 www 1131: </script>
1.11 www 1132:
1.74 matthew 1133: $user_data_html
1.50 matthew 1134:
1.94 sakharuk 1135: <h3>$lt{'cd'}</h3>
1.50 matthew 1136:
1.159 www 1137: <p><label for="csec">$lt{'gs'}</label>: <input type="text" name="csec" size="5" />
1.160 albertel 1138: </p>
1.68 matthew 1139: $date_table
1.94 sakharuk 1140: <h3>$lt{'idsn'}</h3>
1.50 matthew 1141: <p>
1.160 albertel 1142: <label for="cstid">$lt{'idsn'}</label>: <input type="text" name="cstid" size="10" />
1.26 matthew 1143: </p><p>
1.131 albertel 1144: <label>
1.160 albertel 1145: <input type="checkbox" name="forceid" value="yes" />
1.94 sakharuk 1146: $lt{'disn'}
1.131 albertel 1147: </label>
1.50 matthew 1148: </p><p>
1.160 albertel 1149: <input type="button" onClick="verify(this.form,this.form.csec)" value="$lt{'eas'}" />
1.26 matthew 1150: </p>
1.50 matthew 1151: END
1152: return;
1.10 www 1153: }
1154:
1155: # ========================================================= Menu Phase Two Drop
1.51 matthew 1156: sub print_drop_menu {
1.10 www 1157: my $r=shift;
1.92 sakharuk 1158: $r->print("<h3>".&mt('Drop Students')."</h3>");
1.127 albertel 1159: my $cid=$env{'request.course.id'};
1.56 matthew 1160: my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist();
1161: if (! defined($classlist)) {
1.94 sakharuk 1162: $r->print(&mt('There are no students currently enrolled.')."\n");
1.51 matthew 1163: return;
1.25 matthew 1164: }
1.51 matthew 1165: # Print out the available choices
1.56 matthew 1166: &show_drop_list($r,$classlist,$keylist);
1.51 matthew 1167: return;
1.11 www 1168: }
1169:
1.40 matthew 1170: # ============================================== view classlist
1.50 matthew 1171: sub print_html_classlist {
1.103 matthew 1172: my ($r,$mode) = @_;
1.127 albertel 1173: if (! exists($env{'form.sortby'})) {
1174: $env{'form.sortby'} = 'username';
1.57 matthew 1175: }
1.147 albertel 1176: if ($env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
1.127 albertel 1177: $env{'form.Status'} = 'Active';
1.57 matthew 1178: }
1179: my $status_select = &Apache::lonhtmlcommon::StatusOptions
1.127 albertel 1180: ($env{'form.Status'});
1.150 albertel 1181: my $cid =$env{'request.course.id'};
1.127 albertel 1182: my $cdom=$env{'course.'.$cid.'.domain'};
1183: my $cnum=$env{'course.'.$cid.'.num'};
1.103 matthew 1184: #
1185: # List course personnel
1.100 www 1186: my %coursepersonnel=&Apache::lonnet::get_course_adv_roles($cdom.'/'.$cnum);
1.110 matthew 1187: #
1.127 albertel 1188: if (! defined($env{'form.output'}) ||
1189: $env{'form.output'} !~ /^(csv|excel|html)$/ ) {
1190: $env{'form.output'} = 'html';
1.110 matthew 1191: }
1192: #
1.139 albertel 1193: $r->print('<br />'.&Apache::loncommon::start_data_table());
1.110 matthew 1194: foreach my $role (sort keys %coursepersonnel) {
1195: next if ($role =~ /^\s*$/);
1.139 albertel 1196: $r->print(&Apache::loncommon::start_data_table_row().
1197: '<td>'.$role.'</td><td>');
1.110 matthew 1198: foreach my $user (split(',',$coursepersonnel{$role})) {
1199: my ($puname,$pudom)=split(':',$user);
1.100 www 1200: $r->print(' '.&Apache::loncommon::aboutmewrapper(
1.110 matthew 1201: &Apache::loncommon::plainname($puname,
1202: $pudom),
1203: $puname,$pudom));
1.100 www 1204: }
1.139 albertel 1205: $r->print('</td>'.&Apache::loncommon::end_data_table_row());
1.100 www 1206: }
1.139 albertel 1207: $r->print(&Apache::loncommon::end_data_table());
1.103 matthew 1208: #
1209: # Interface output
1210: $r->print('<input type="hidden" name="action" value="'.
1.127 albertel 1211: $env{'form.action'}.'" />');
1.103 matthew 1212: $r->print("<p>\n");
1.127 albertel 1213: if ($env{'form.action'} ne 'modifystudent') {
1.103 matthew 1214: my %lt=&Apache::lonlocal::texthash('csv' => "CSV",
1215: 'excel' => "Excel",
1216: 'html' => 'HTML');
1.110 matthew 1217: my $output_selector = '<select size="1" name="output" >';
1.103 matthew 1218: foreach my $outputformat ('html','csv','excel') {
1219: my $option = '<option value="'.$outputformat.'" ';
1.127 albertel 1220: if ($outputformat eq $env{'form.output'}) {
1.104 matthew 1221: $option .= 'selected ';
1.103 matthew 1222: }
1223: $option .='>'.$lt{$outputformat}.'</option>';
1224: $output_selector .= "\n".$option;
1225: }
1226: $output_selector .= '</select>';
1.159 www 1227: $r->print('<label>'.&mt('Output Format: [_1]',$output_selector).'</label>'.(' 'x3));
1.59 matthew 1228: }
1.159 www 1229: $r->print('<label>'.&mt('Student Status: [_1]',$status_select)."</label>\n");
1.105 matthew 1230: $r->print('<input type="submit" value="'.&mt('Update Display').'" />'.
1231: "\n</p>\n");
1.103 matthew 1232: #
1233: # Print the classlist
1234: $r->print('<h2>'.&mt('Current Class List').'</h2>');
1.56 matthew 1235: my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
1236: if (! defined($classlist)) {
1.94 sakharuk 1237: $r->print(&mt('There are no students currently enrolled.')."\n");
1.40 matthew 1238: } else {
1239: # Print out the available choices
1.127 albertel 1240: if ($env{'form.action'} eq 'modifystudent') {
1.110 matthew 1241: &show_class_list($r,'view','modify',
1.127 albertel 1242: $env{'form.Status'},$classlist,$keylist);
1.110 matthew 1243: } else {
1.127 albertel 1244: &show_class_list($r,$env{'form.output'},'aboutme',
1245: $env{'form.Status'},$classlist,$keylist);
1.50 matthew 1246: }
1.41 matthew 1247: }
1248: }
1249:
1.40 matthew 1250: # =================================================== Show student list to drop
1251: sub show_class_list {
1.110 matthew 1252: my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_;
1.127 albertel 1253: my $cid=$env{'request.course.id'};
1.142 raeburn 1254: my $cdom = $env{'course.'.$cid.'.domain'};
1255: my $cnum = $env{'course.'.$cid.'.num'};
1256: my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
1257: $classlist,$keylist,$cdom,$cnum);
1.60 matthew 1258: #
1259: # Variables for excel output
1.104 matthew 1260: my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
1.60 matthew 1261: #
1.103 matthew 1262: # Variables for csv output
1263: my ($CSVfile,$CSVfilename);
1264: #
1.127 albertel 1265: my $sortby = $env{'form.sortby'};
1.142 raeburn 1266: if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end|type)$/) {
1.53 matthew 1267: $sortby = 'username';
1268: }
1.134 raeburn 1269: if (! exists($env{'form.displayphotos'})) {
1270: $env{'form.displayphotos'} = 'off';
1271: }
1272: my $displayphotos = $env{'form.displayphotos'};
1273:
1.42 matthew 1274: # Print out header
1.114 raeburn 1275: unless ($mode eq 'autoenroll') {
1276: $r->print(<<END);
1.127 albertel 1277: <input type="hidden" name="state" value="$env{'form.state'}" />
1.114 raeburn 1278: END
1279: }
1.103 matthew 1280: $r->print(<<END);
1281: <input type="hidden" name="sortby" value="$sortby" />
1.134 raeburn 1282: <input type="hidden" name="displayphotos" value="$displayphotos" />
1.103 matthew 1283: END
1.114 raeburn 1284: if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') {
1.50 matthew 1285: if ($linkto eq 'aboutme') {
1.142 raeburn 1286: $r->print(&mt("Select a user name to view the user's personal page."));
1.50 matthew 1287: } elsif ($linkto eq 'modify') {
1.142 raeburn 1288: $r->print(&mt("Select a user name to modify the student's information"));
1.50 matthew 1289: }
1.94 sakharuk 1290: my %lt=&Apache::lonlocal::texthash(
1.110 matthew 1291: 'usrn' => "username",
1292: 'dom' => "domain",
1293: 'sn' => "student name",
1294: 'sec' => "section",
1.142 raeburn 1295: 'grp' => "active groups",
1.110 matthew 1296: 'start' => "start date",
1297: 'end' => "end date",
1.134 raeburn 1298: 'type' => "enroll type/action",
1299: 'photo' => "photo",
1.94 sakharuk 1300: );
1.114 raeburn 1301: unless ($mode eq 'autoenroll') {
1302: $r->print(<<END);
1.59 matthew 1303: <input type="hidden" name="sname" value="" />
1304: <input type="hidden" name="sdom" value="" />
1.114 raeburn 1305: END
1306: }
1.136 raeburn 1307: if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
1.134 raeburn 1308: $r->print('
1309: <script type="text/javascript">
1310: function photowindow(photolink) {
1311: var title = "Photo_Viewer";
1312: var options = "scrollbars=1,resizable=1,menubar=0";
1313: options += ",width=240,height=240";
1314: stdeditbrowser = open(photolink,title,options,"1");
1315: stdeditbrowser.focus();
1316: }
1317: </script>
1318: ');
1319: }
1.115 raeburn 1320: $r->print("
1.40 matthew 1321: <p>
1.139 albertel 1322: ".&Apache::loncommon::start_data_table()."
1.115 raeburn 1323: <tr>
1324: ");
1325: if ($mode eq 'autoenroll') {
1326: $r->print("
1327: <th><a href=\"javascript:document.studentform.sortby.value='type';document.studentform.submit();\">$lt{'type'}</a></th>
1328: ");
1329: } else {
1330: $r->print("
1331: <th>Count</th>
1332: ");
1333: }
1334: $r->print(<<END);
1335: <th>
1.94 sakharuk 1336: <a href="javascript:document.studentform.sortby.value='username';document.studentform.submit();">$lt{'usrn'}</a>
1.53 matthew 1337: </th><th>
1.94 sakharuk 1338: <a href="javascript:document.studentform.sortby.value='domain';document.studentform.submit();">$lt{'dom'}</a>
1.53 matthew 1339: </th><th>
1.57 matthew 1340: <a href="javascript:document.studentform.sortby.value='id';document.studentform.submit();">ID</a>
1.53 matthew 1341: </th><th>
1.94 sakharuk 1342: <a href="javascript:document.studentform.sortby.value='fullname';document.studentform.submit();">$lt{'sn'}</a>
1.53 matthew 1343: </th><th>
1.94 sakharuk 1344: <a href="javascript:document.studentform.sortby.value='section';document.studentform.submit();">$lt{'sec'}</a>
1.110 matthew 1345: </th><th>
1346: <a href="javascript:document.studentform.sortby.value='start';document.studentform.submit();">$lt{'start'}</a>
1347: </th><th>
1348: <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a>
1.142 raeburn 1349: </th><th>
1350: <a href="javascript:document.studentform.sortby.value='groups';document.studentform.submit();">$lt{'grp'}</a>
1.53 matthew 1351: </th>
1.40 matthew 1352: END
1.136 raeburn 1353: if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) {
1.135 albertel 1354: my %photo_options = &Apache::lonlocal::texthash(
1.134 raeburn 1355: 'on' => 'Show',
1356: 'off' => 'Hide',
1357: );
1358: my $photochg = 'on';
1359: if ($displayphotos eq 'on') {
1360: $photochg = 'off';
1361: }
1362: $r->print(' <th>'."\n".' '.
1363: '<a href="javascript:document.studentform.displayphotos.value='.
1364: "'".$photochg."'".';document.studentform.submit();">'.
1365: $photo_options{$photochg}.'</a> '.$lt{'photo'}."\n".
1366: ' </th>'."\n");
1367: }
1368: $r->print(" </tr>\n");
1.41 matthew 1369: } elsif ($mode eq 'csv') {
1.103 matthew 1370: #
1371: # Open a file
1372: $CSVfilename = '/prtspool/'.
1.127 albertel 1373: $env{'user.name'}.'_'.$env{'user.domain'}.'_'.
1.103 matthew 1374: time.'_'.rand(1000000000).'.csv';
1375: unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
1376: $r->log_error("Couldn't open $CSVfilename for output $!");
1377: $r->print("Problems occured in writing the csv file. ".
1378: "This error has been logged. ".
1379: "Please alert your LON-CAPA administrator.");
1380: $CSVfile = undef;
1381: }
1382: #
1383: # Write headers and data to file
1.58 matthew 1384: if($statusmode eq 'Expired') {
1.103 matthew 1385: print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";
1.58 matthew 1386: }
1.147 albertel 1387: if($statusmode eq 'Future') {
1388: print $CSVfile '"'.&mt('Students with future roles').'"'."\n";
1389: }
1.58 matthew 1390: if ($statusmode eq 'Any') {
1.103 matthew 1391: print $CSVfile '"'.join('","',map {
1392: &Apache::loncommon::csv_translate(&mt($_))
1393: } ("username","domain","ID","student name",
1.142 raeburn 1394: "section","start date","end date","status","active groups"))
1395: .'"'."\n";
1.58 matthew 1396: } else {
1.103 matthew 1397: print $CSVfile '"'.join('","',map {
1398: &Apache::loncommon::csv_translate(&mt($_))
1399: } ("username","domain","ID","student name",
1.142 raeburn 1400: "section","start date","end date","active groups")).'"'."\n";
1.58 matthew 1401: }
1.60 matthew 1402: } elsif ($mode eq 'excel') {
1403: # Create the excel spreadsheet
1.126 matthew 1404: ($excel_workbook,$excel_filename,$format) =
1405: &Apache::loncommon::create_workbook($r);
1406: return if (! defined($excel_workbook));
1.60 matthew 1407: $excel_sheet = $excel_workbook->addworksheet('classlist');
1408: #
1.76 albertel 1409: my $description = 'Class List for '.
1.127 albertel 1410: $env{'course.'.$env{'request.course.id'}.'.description'};
1.104 matthew 1411: $excel_sheet->write($row++,0,$description,$format->{'h1'});
1.60 matthew 1412: #
1413: $excel_sheet->write($row++,0,["username","domain","ID",
1.110 matthew 1414: "student name","section",
1.142 raeburn 1415: "start date","end date","status",
1416: "active groups"],
1.110 matthew 1417: $format->{'bold'});
1.41 matthew 1418: }
1.56 matthew 1419: #
1420: # Sort the students
1421: my %index;
1422: my $i;
1423: foreach (@$keylist) {
1424: $index{$_} = $i++;
1425: }
1.142 raeburn 1426: $index{'groups'} = scalar(@{$keylist});
1.56 matthew 1427: my $index = $index{$sortby};
1428: my $second = $index{'username'};
1429: my $third = $index{'domain'};
1.53 matthew 1430: my @Sorted_Students = sort {
1.56 matthew 1431: lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
1432: ||
1433: lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
1434: ||
1435: lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
1436: } (keys(%$classlist));
1.108 matthew 1437: my $studentcount = 0;
1.115 raeburn 1438: my $autocount = 0;
1439: my $manualcount = 0;
1440: my $unlockcount = 0;
1441: my $lockcount = 0;
1.53 matthew 1442: foreach my $student (@Sorted_Students) {
1.110 matthew 1443: my $sdata = $classlist->{$student};
1.142 raeburn 1444: my $groups = $classgroups->{$student};
1.110 matthew 1445: my $username = $sdata->[$index{'username'}];
1446: my $domain = $sdata->[$index{'domain'}];
1447: my $section = $sdata->[$index{'section'}];
1.142 raeburn 1448: my $active_groups;
1449: if (ref($groups->{active}) eq 'HASH') {
1450: $active_groups = join(', ',keys(%{$groups->{'active'}}));
1451: }
1.110 matthew 1452: my $name = $sdata->[$index{'fullname'}];
1453: my $id = $sdata->[$index{'id'}];
1454: my $status = $sdata->[$index{'status'}];
1455: my $start = $sdata->[$index{'start'}];
1456: my $end = $sdata->[$index{'end'}];
1.115 raeburn 1457: my $type = $sdata->[$index{'type'}];
1.57 matthew 1458: next if (($statusmode ne 'Any') && ($status ne $statusmode));
1.114 raeburn 1459: if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
1460: if (! defined($start) || $start == 0) {
1461: $start = &mt('none');
1462: } else {
1463: $start = &Apache::lonlocal::locallocaltime($start);
1464: }
1465: if (! defined($end) || $end == 0) {
1466: $end = &mt('none');
1467: } else {
1468: $end = &Apache::lonlocal::locallocaltime($end);
1469: }
1.139 albertel 1470: $r->print(&Apache::loncommon::start_data_table_row());
1.115 raeburn 1471: if ($mode eq 'autoenroll') {
1472: my $lockedtype = $sdata->[$index{'lockedtype'}];
1473: $studentcount++;
1474: my $cellentry;
1475: if ($type eq 'auto') {
1.131 albertel 1476: $cellentry = '<b>'.&mt('auto').'</b> <label><input type="checkbox" name="chgauto" value="'.$username.':'.$domain.'" /> Change</label>';
1.115 raeburn 1477: $autocount ++;
1478: } else {
1.131 albertel 1479: $cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><nobr><label><input type="checkbox" name="chgmanual" value="'.$username.':'.$domain.'" /> Change</label></nobr></td></tr><tr><td><nobr>';
1.115 raeburn 1480: $manualcount ++;
1481: if ($lockedtype) {
1.131 albertel 1482: $cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$username.':'.$domain.'" /> '.&mt('Unlock').'</label>';
1.115 raeburn 1483: $unlockcount ++;
1484: } else {
1.131 albertel 1485: $cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$username.':'.$domain.'" /> '.&mt('Lock').'</label>';
1.115 raeburn 1486: $lockcount ++;
1487: }
1.118 raeburn 1488: $cellentry .= '</nobr></td></tr></table>';
1.115 raeburn 1489: }
1490: $r->print("<td>$cellentry<td>\n ");
1491: } else {
1492: $r->print("<td>".(++$studentcount)."</td><td>\n ");
1493: }
1.51 matthew 1494: if ($linkto eq 'nothing') {
1495: $r->print($username);
1496: } elsif ($linkto eq 'aboutme') {
1497: $r->print(&Apache::loncommon::aboutmewrapper($username,
1498: $username,
1499: $domain));
1500: } elsif ($linkto eq 'modify') {
1.59 matthew 1501: $r->print('<a href="'.
1502: "javascript:document.studentform.sname.value='".
1503: $username.
1504: "';document.studentform.sdom.value='".$domain.
1505: "';document.studentform.state.value='selected".
1506: "';document.studentform.submit();".'">'.
1.53 matthew 1507: $username."</a>\n");
1.50 matthew 1508: }
1.51 matthew 1509: $r->print(<<"END");
1.50 matthew 1510: </td>
1.51 matthew 1511: <td>$domain</td>
1512: <td>$id</td>
1513: <td>$name</td>
1514: <td>$section</td>
1.110 matthew 1515: <td>$start</td>
1516: <td>$end</td>
1.142 raeburn 1517: <td>$active_groups</td>
1.114 raeburn 1518: END
1.134 raeburn 1519: if ($env{'course.'.$env{'request.course.id'}.
1.136 raeburn 1520: '.internal.showphoto'}) {
1.134 raeburn 1521: if ($displayphotos eq 'on') {
1.135 albertel 1522: my $imgurl =
1523: &Apache::lonnet::retrievestudentphoto($domain,
1524: $username,'gif',
1525: 'thumbnail');
1.134 raeburn 1526:
1527: $r->print(' <td align="right"><a href="javascript:photowindow('."'".&Apache::lonnet::studentphoto($domain,$username,'jpg')."'".')"><img src="'.$imgurl.'" border="1"></a></td>');
1528: } else {
1529: $r->print(' <td> </td> ');
1530: }
1531: }
1.139 albertel 1532: $r->print(&Apache::loncommon::end_data_table_row());
1.51 matthew 1533: } elsif ($mode eq 'csv') {
1.103 matthew 1534: next if (! defined($CSVfile));
1.51 matthew 1535: # no need to bother with $linkto
1.114 raeburn 1536: if (! defined($start) || $start == 0) {
1537: $start = &mt('none');
1538: } else {
1539: $start = &Apache::lonlocal::locallocaltime($start);
1540: }
1541: if (! defined($end) || $end == 0) {
1542: $end = &mt('none');
1543: } else {
1544: $end = &Apache::lonlocal::locallocaltime($end);
1545: }
1.51 matthew 1546: my @line = ();
1.110 matthew 1547: foreach ($username,$domain,$id,$name,$section,$start,$end) {
1.51 matthew 1548: push @line,&Apache::loncommon::csv_translate($_);
1.58 matthew 1549: }
1550: if ($statusmode eq 'Any') {
1551: push @line,&Apache::loncommon::csv_translate($status);
1.41 matthew 1552: }
1.142 raeburn 1553: push @line,&Apache::loncommon::csv_translate($active_groups);
1.103 matthew 1554: print $CSVfile '"'.join('","',@line).'"'."\n";
1.60 matthew 1555: } elsif ($mode eq 'excel') {
1.110 matthew 1556: $excel_sheet->write($row,0,[$username,$domain,$id,
1557: $name,$section]);
1558: my $col = 5;
1559: foreach my $time ($start,$end) {
1.129 matthew 1560: if (defined($time) && $time != 0) {
1561: $excel_sheet->write($row,$col++,
1.110 matthew 1562: &Apache::lonstathelpers::calc_serial($time),
1563: $format->{'date'});
1.129 matthew 1564: } else {
1565: $excel_sheet->write($row,$col++,'none');
1566: }
1.110 matthew 1567: }
1568: $excel_sheet->write($row,$col++,$status);
1.142 raeburn 1569: $excel_sheet->write($row,$col++,$active_groups);
1.110 matthew 1570: $row++;
1.40 matthew 1571: }
1572: }
1.114 raeburn 1573: if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') {
1.139 albertel 1574: $r->print(&Apache::loncommon::end_data_table().'<br />');
1.60 matthew 1575: } elsif ($mode eq 'excel') {
1576: $excel_workbook->close();
1577: $r->print('<p><a href="'.$excel_filename.'">'.
1.94 sakharuk 1578: &mt('Your Excel spreadsheet').'</a> '.&mt('is ready for download').'.</p>'."\n");
1.103 matthew 1579: } elsif ($mode eq 'csv') {
1580: close($CSVfile);
1581: $r->print('<a href="'.$CSVfilename.'">'.
1582: &mt('Your CSV file').'</a> is ready for download.'.
1583: "\n");
1584: $r->rflush();
1.60 matthew 1585: }
1.114 raeburn 1586: if ($mode eq 'autoenroll') {
1.115 raeburn 1587: return ($studentcount,$autocount,$manualcount,$lockcount,$unlockcount);
1.114 raeburn 1588: }
1.115 raeburn 1589: return;
1.40 matthew 1590: }
1591:
1.50 matthew 1592:
1593: #
1594: # print out form for modification of a single students data
1595: #
1596: sub print_modify_student_form {
1597: my $r = shift();
1598: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.59 matthew 1599: ['sdom','sname']);
1.127 albertel 1600: my $sname = $env{'form.sname'};
1601: my $sdom = $env{'form.sdom'};
1602: my $sortby = $env{'form.sortby'};
1.50 matthew 1603: # determine the students name information
1604: my %info=&Apache::lonnet::get('environment',
1605: ['firstname','middlename',
1.52 matthew 1606: 'lastname','generation','id'],
1.50 matthew 1607: $sdom, $sname);
1608: my ($tmp) = keys(%info);
1609: if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94 sakharuk 1610: $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'.
1.50 matthew 1611: '<p>'.
1.94 sakharuk 1612: &mt('Unable to retrieve environment data for').' '.$sname.
1613: &mt('in domain').' '.$sdom.'</p><p>'.
1.138 albertel 1614: &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p>'.&Apache::loncommon::end_page());
1.50 matthew 1615: return;
1616: }
1617: # determine the students starting and ending times and section
1618: my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
1.87 matthew 1619: if ($starttime =~ /^error/) {
1.94 sakharuk 1620: $r->print('<h2>'&mt('Error').'</h2>');
1.87 matthew 1621: $r->print('<p>'.$starttime.'</p>');
1622: return;
1623: }
1.101 matthew 1624: #
1.50 matthew 1625: # Deal with date forms
1.101 matthew 1626: my $current_date_description = '';
1627: my $textdate = '';
1628:
1629: if (! defined($starttime) || $starttime == 0) {
1630: $current_date_description = &mt('Current Starting Date: not set').
1631: '<br />';
1632: } else {
1633: $current_date_description =
1634: &mt('Current Starting Date: [_1]',
1635: &Apache::lonlocal::locallocaltime($starttime)).'<br />';
1636: }
1637: if (! defined($endtime) || $endtime == 0) {
1638: $current_date_description.= &mt('Current Ending Date: not set').
1639: '<br />';
1640: } else {
1641: $current_date_description.=
1642: &mt('Current Ending Date: [_1]',
1643: &Apache::lonlocal::locallocaltime($endtime)).'<br />';
1644:
1645: }
1.68 matthew 1646: my $date_table = &date_setting_table($starttime,$endtime);
1.59 matthew 1647: #
1.127 albertel 1648: if (! exists($env{'form.Status'}) ||
1.147 albertel 1649: $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) {
1.127 albertel 1650: $env{'form.Status'} = 'crap';
1.59 matthew 1651: }
1.94 sakharuk 1652: # Make sure student is enrolled in course
1653: my %lt=&Apache::lonlocal::texthash(
1654: 'mef' => "Modify Enrollment for",
1655: 'odcc' => "Only domain coordinators can change a users password.",
1656: 'sn' => "Student Name",
1657: 'fn' => "First",
1658: 'mn' => "Middle",
1659: 'ln' => "Last",
1660: 'gen' => "Generation",
1661: 'sid' => "Student ID",
1662: 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
1663: 'sec' => "Section",
1664: 'sm' => "Submit Modifications",
1665: );
1.142 raeburn 1666: # Check if section name is valid
1667: my $section_check = §ion_check_js();
1668: $r->print(<<"END");
1669: <script type="text/javascript">
1670: $section_check
1671: function secverify(formname,caller) {
1672: if (validate(caller) == "error") {
1673: return;
1674: } else {
1675: formname.submit();
1676: }
1677: }
1678: </script>
1.52 matthew 1679: <p>
1680: <font size="+1">
1.94 sakharuk 1681: $lt{'odcc'}
1.52 matthew 1682: </font>
1683: </p>
1.50 matthew 1684: <input type="hidden" name="slogin" value="$sname" />
1685: <input type="hidden" name="sdomain" value="$sdom" />
1686: <input type="hidden" name="action" value="modifystudent" />
1.53 matthew 1687: <input type="hidden" name="state" value="done" />
1688: <input type="hidden" name="sortby" value="$sortby" />
1.127 albertel 1689: <input type="hidden" name="Status" value="$env{'form.Status'}" />
1.94 sakharuk 1690: <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'}
1.50 matthew 1691: $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
1692: <p>
1.94 sakharuk 1693: <b>$lt{'sn'}</b>
1.50 matthew 1694: <table>
1.94 sakharuk 1695: <tr><th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th></tr>
1.50 matthew 1696: <tr><td>
1697: <input type="text" name="firstname" value="$info{'firstname'}" /></td><td>
1698: <input type="text" name="middlename" value="$info{'middlename'}" /></td><td>
1699: <input type="text" name="lastname" value="$info{'lastname'}" /></td><td>
1700: <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
1701: </table>
1702: </p><p>
1.160 albertel 1703: <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12" />
1.52 matthew 1704: </p><p>
1.131 albertel 1705: <label>
1.160 albertel 1706: <input type="checkbox" name="forceid" />
1.94 sakharuk 1707: $lt{'disn'}
1.131 albertel 1708: </label>
1.53 matthew 1709: </p><p>
1.160 albertel 1710: <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14" />
1.50 matthew 1711: </p>
1.101 matthew 1712: <p>$current_date_description</p>
1.68 matthew 1713: <p>$date_table</p>
1.142 raeburn 1714: <input type="button" value="$lt{'sm'}" onClick="secverify(this.form,this.form.section)" />
1.50 matthew 1715: END
1.138 albertel 1716: $r->print(&Apache::loncommon::end_page());
1.50 matthew 1717: return;
1718: }
1719:
1720: #
1721: # modify a single students section
1722: #
1723: sub modify_single_student {
1.138 albertel 1724: my ($r) = @_;
1.68 matthew 1725: #
1.80 matthew 1726: # Remove non alphanumeric values from the section
1.127 albertel 1727: $env{'form.section'} =~ s/\W//g;
1.77 matthew 1728: #
1.68 matthew 1729: # Do the date defaults first
1730: my ($starttime,$endtime) = &get_dates_from_form();
1.127 albertel 1731: if ($env{'form.makedatesdefault'}) {
1.68 matthew 1732: $r->print(&make_dates_default($starttime,$endtime));
1733: }
1.59 matthew 1734: # Get the 'sortby' and 'Status' variables so the user goes back to their
1735: # previous screen
1.127 albertel 1736: my $sortby = $env{'form.sortby'};
1737: my $status = $env{'form.Status'};
1.53 matthew 1738: #
1739: # We always need this information
1.127 albertel 1740: my $slogin = $env{'form.slogin'};
1741: my $sdom = $env{'form.sdomain'};
1.53 matthew 1742: #
1743: # Get the old data
1744: my %old=&Apache::lonnet::get('environment',
1745: ['firstname','middlename',
1746: 'lastname','generation','id'],
1747: $sdom, $slogin);
1.59 matthew 1748: $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
1.127 albertel 1749: $env{'request.course.id'});
1.53 matthew 1750: my ($tmp) = keys(%old);
1751: if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94 sakharuk 1752: $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");
1.53 matthew 1753: return;
1754: }
1755: undef $tmp;
1756: #
1757: # Get the new data
1.127 albertel 1758: my $firstname = $env{'form.firstname'};
1759: my $middlename = $env{'form.middlename'};
1760: my $lastname = $env{'form.lastname'};
1761: my $generation = $env{'form.generation'};
1762: my $section = $env{'form.section'};
1763: my $courseid = $env{'request.course.id'};
1764: my $sid = $env{'form.id'};
1.50 matthew 1765: my $displayable_starttime = localtime($starttime);
1766: my $displayable_endtime = localtime($endtime);
1.53 matthew 1767: #
1768: # check for forceid override
1.63 matthew 1769: if ((defined($old{'id'})) && ($old{'id'} ne '') &&
1.127 albertel 1770: ($sid ne $old{'id'}) && (! exists($env{'form.forceid'}))) {
1.94 sakharuk 1771: $r->print("<font color=\"ff0000\">".&mt('You changed the students id but did not disable the ID change safeguard. The students id will not be changed.')."</font>");
1.53 matthew 1772: $sid = $old{'id'};
1773: }
1774: #
1.50 matthew 1775: # talk to the user about what we are going to do
1.94 sakharuk 1776: my %lt=&Apache::lonlocal::texthash(
1777: 'mdu' => "Modifying data for user",
1778: 'si' => "Student Information",
1779: 'fd' => "Field",
1780: 'ov' => "Old Value",
1781: 'nv' => "New Value",
1782: 'fn' => "First name",
1783: 'mn' => "Middle name",
1784: 'ln' => "Last name",
1785: 'gen' => "Generation",
1786: 'sec' => "Section",
1787: 'ri' => "Role Information",
1788: 'st' => "Start Time",
1789: 'et' => "End Time",
1790: );
1.50 matthew 1791: $r->print(<<END);
1.94 sakharuk 1792: <h2>$lt{'mdu'} $slogin \@ $sdom </h2>
1793: <h3>$lt{'si'}</h3>
1.53 matthew 1794: <table rules="rows" border="1" cellpadding="3" >
1795: <tr>
1.94 sakharuk 1796: <th> $lt{'fd'} </th>
1797: <th> $lt{'ov'} </th>
1798: <th> $lt{'nv'} </th>
1.53 matthew 1799: </tr>
1800: <tr>
1.94 sakharuk 1801: <td> <b>$lt{'fn'}</b> </td>
1.53 matthew 1802: <td> $old{'firstname'} </td>
1803: <td> $firstname </td>
1804: </tr><tr>
1.94 sakharuk 1805: <td> <b>$lt{'mn'}</b> </td>
1.53 matthew 1806: <td> $old{'middlename'} </td>
1807: <td> $middlename </td>
1808: </tr><tr>
1.94 sakharuk 1809: <td> <b>$lt{'ln'}</b> </td>
1.53 matthew 1810: <td> $old{'lastname'} </td>
1811: <td> $lastname </td>
1812: </tr><tr>
1.94 sakharuk 1813: <td> <b>$lt{'gen'}</b> </td>
1.53 matthew 1814: <td> $old{'generation'} </td>
1815: <td> $generation </td>
1816: </tr><tr>
1817: <td> <b>ID</b> </td>
1818: <td> $old{'id'} </td>
1819: <td> $sid </td>
1.59 matthew 1820: </tr><tr>
1.94 sakharuk 1821: <td> <b>$lt{'sec'}</b> </td>
1.59 matthew 1822: <td> $old{'section'} </td>
1823: <td> $section</td>
1.53 matthew 1824: </tr>
1.50 matthew 1825: </table>
1.94 sakharuk 1826: <h3>$lt{'ri'}</h3>
1.50 matthew 1827: <table>
1.94 sakharuk 1828: <tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr>
1829: <tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime </td></tr>
1.50 matthew 1830: </table>
1.52 matthew 1831: <p>
1.50 matthew 1832: END
1.53 matthew 1833: #
1.63 matthew 1834: # Send request(s) to modify data (final undef is for 'desiredhost',
1835: # which is a moot point because the student already has an account.
1836: my $modify_section_results = &modifystudent($sdom,$slogin,
1.127 albertel 1837: $env{'request.course.id'},
1.63 matthew 1838: $section,undef);
1839: if ($modify_section_results !~ /^ok/) {
1.94 sakharuk 1840: $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
1.63 matthew 1841: }
1.52 matthew 1842: my $roleresults = &Apache::lonnet::modifystudent
1.53 matthew 1843: ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
1.127 albertel 1844: $generation,$section,$endtime,$starttime,$env{'form.forceid'});
1.53 matthew 1845: if ($roleresults eq 'refused' ) {
1.94 sakharuk 1846: $r->print(&mt('Your request to change the role information for this student was refused. You do not appear to have sufficient authority to change student information.'));
1.50 matthew 1847: } elsif ($roleresults !~ /ok/) {
1.94 sakharuk 1848: $r->print(&mt('An error occurred during the attempt to change the role information for this student.')." <br />".
1849: &mt('The error reported was')." ".
1.50 matthew 1850: $roleresults);
1.53 matthew 1851: &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
1852: " data for ".$slogin." \@ ".$sdom." by ".
1.127 albertel 1853: $env{'user.name'}." \@ ".$env{'user.domain'}.
1.53 matthew 1854: ":".$roleresults);
1.50 matthew 1855: } else { # everything is okay!
1.94 sakharuk 1856: $r->print(&mt('Student information updated successfully.')." <br />".
1857: &mt('The student must log out and log in again to see these changes.'));
1.50 matthew 1858: }
1.94 sakharuk 1859: my $Masd=&mt('Modify another students data');
1.50 matthew 1860: $r->print(<<END);
1.52 matthew 1861: </p><p>
1.59 matthew 1862: <input type="hidden" name="action" value="modifystudent" />
1863: <input type="hidden" name="sortby" value="$sortby" />
1864: <input type="hidden" name="Status" value="$status" />
1.94 sakharuk 1865: <a href="javascript:document.studentform.submit();">$Masd</a>
1.50 matthew 1866: END
1.138 albertel 1867: $r->print(&Apache::loncommon::end_page());
1.50 matthew 1868: return;
1869: }
1870:
1871: sub get_enrollment_data {
1872: my ($sname,$sdomain) = @_;
1.127 albertel 1873: my $courseid = $env{'request.course.id'};
1.151 albertel 1874: my $cdom = $env{'course.'.$courseid.'.domain'};
1875: my $cnum = $env{'course.'.$courseid.'.num'};
1.50 matthew 1876: my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
1877: my ($tmp) = keys(%roles);
1878: # Bail out if we were unable to get the students roles
1.87 matthew 1879: return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.50 matthew 1880: # Go through the roles looking for enrollment in this course
1881: my ($end,$start) = (undef,undef);
1882: my $section = '';
1883: my $count = scalar(keys(%roles));
1884: while (my ($course,$role) = each(%roles)) {
1.150 albertel 1885: if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) {
1.50 matthew 1886: #
1887: # Get active role
1888: $section=$1;
1889: (undef,$end,$start)=split(/\_/,$role);
1890: my $now=time;
1891: my $notactive=0;
1892: if ($start) {
1893: if ($now<$start) { $notactive=1; }
1894: }
1895: if ($end) {
1896: if ($now>$end) { $notactive=1; }
1897: }
1898: unless ($notactive) { return ($start,$end,$section); }
1899: }
1900: }
1901: return ($start,$end,$section);
1902: }
1903:
1.56 matthew 1904: #################################################
1905: #################################################
1906:
1907: =pod
1908:
1909: =item show_drop_list
1910:
1911: Display a list of students to drop
1912: Inputs:
1913:
1914: =over 4
1915:
1916: =item $r, Apache request
1917:
1918: =item $classlist, hash pointer returned from loncoursedata::get_classlist();
1919:
1920: =item $keylist, array pointer returned from loncoursedata::get_classlist()
1921: which describes the order elements are stored in the %$classlist values.
1922:
1923: =item $nosort, if true, sorting links are omitted.
1924:
1925: =back
1926:
1927: =cut
1928:
1929: #################################################
1930: #################################################
1.11 www 1931: sub show_drop_list {
1.56 matthew 1932: my ($r,$classlist,$keylist,$nosort)=@_;
1.127 albertel 1933: my $cid=$env{'request.course.id'};
1934: if (! exists($env{'form.sortby'})) {
1.59 matthew 1935: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1936: ['sortby']);
1937: }
1.127 albertel 1938: my $sortby = $env{'form.sortby'};
1.142 raeburn 1939: if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) {
1.54 matthew 1940: $sortby = 'username';
1941: }
1.142 raeburn 1942: my $cdom = $env{'course.'.$cid.'.domain'};
1943: my $cnum = $env{'course.'.$cid,'.num'};
1944: my ($classgroups) = &Apache::loncoursedata::get_group_memberships(
1.143 raeburn 1945: $classlist,$keylist,$cdom,$cnum);
1.56 matthew 1946: #
1.54 matthew 1947: my $action = "drop";
1948: $r->print(<<END);
1949: <input type="hidden" name="sortby" value="$sortby" />
1950: <input type="hidden" name="action" value="$action" />
1.50 matthew 1951: <input type="hidden" name="state" value="done" />
1.32 matthew 1952: <script>
1.51 matthew 1953: function checkAll(field) {
1.32 matthew 1954: for (i = 0; i < field.length; i++)
1955: field[i].checked = true ;
1956: }
1957:
1.51 matthew 1958: function uncheckAll(field) {
1.32 matthew 1959: for (i = 0; i < field.length; i++)
1960: field[i].checked = false ;
1961: }
1962: </script>
1963: <p>
1.26 matthew 1964: <input type="hidden" name="phase" value="four">
1.56 matthew 1965: END
1966:
1.110 matthew 1967: my %lt=&Apache::lonlocal::texthash('usrn' => "username",
1968: 'dom' => "domain",
1969: 'sn' => "student name",
1970: 'sec' => "section",
1971: 'start' => "start date",
1972: 'end' => "end date",
1.142 raeburn 1973: 'groups' => "active groups",
1.110 matthew 1974: );
1.56 matthew 1975: if ($nosort) {
1.139 albertel 1976: $r->print(&Apache::loncommon::start_data_table());
1.56 matthew 1977: $r->print(<<END);
1978: <tr>
1979: <th> </th>
1.94 sakharuk 1980: <th>$lt{'usrn'}</th>
1981: <th>$lt{'dom'}</th>
1.56 matthew 1982: <th>ID</th>
1.94 sakharuk 1983: <th>$lt{'sn'}</th>
1984: <th>$lt{'sec'}</th>
1.110 matthew 1985: <th>$lt{'start'}</th>
1986: <th>$lt{'end'}</th>
1.142 raeburn 1987: <th>$lt{'groups'}</th>
1.56 matthew 1988: </tr>
1989: END
1990:
1991: } else {
1.139 albertel 1992: $r->print(&Apache::loncommon::start_data_table());
1.56 matthew 1993: $r->print(<<END);
1.54 matthew 1994: <tr><th> </th>
1995: <th>
1.94 sakharuk 1996: <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
1.54 matthew 1997: </th><th>
1.94 sakharuk 1998: <a href="/adm/dropadd?action=$action&sortby=domain">$lt{'dom'}</a>
1.54 matthew 1999: </th><th>
2000: <a href="/adm/dropadd?action=$action&sortby=id">ID</a>
2001: </th><th>
1.94 sakharuk 2002: <a href="/adm/dropadd?action=$action&sortby=fullname">$lt{'sn'}</a>
1.54 matthew 2003: </th><th>
1.94 sakharuk 2004: <a href="/adm/dropadd?action=$action&sortby=section">$lt{'sec'}</a>
1.110 matthew 2005: </th><th>
2006: <a href="/adm/dropadd?action=$action&sortby=start">$lt{'start'}</a>
2007: </th><th>
2008: <a href="/adm/dropadd?action=$action&sortby=end">$lt{'end'}</a>
1.142 raeburn 2009: </th><th>
2010: <a href="/adm/dropadd?action=$action&sortby=groups">$lt{'groups'}</a>
1.54 matthew 2011: </th>
2012: </tr>
1.26 matthew 2013: END
1.56 matthew 2014: }
2015: #
2016: # Sort the students
2017: my %index;
2018: my $i;
2019: foreach (@$keylist) {
2020: $index{$_} = $i++;
2021: }
1.142 raeburn 2022: $index{'groups'} = scalar(@$keylist);
1.56 matthew 2023: my $index = $index{$sortby};
2024: my $second = $index{'username'};
2025: my $third = $index{'domain'};
1.54 matthew 2026: my @Sorted_Students = sort {
1.56 matthew 2027: lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
2028: ||
2029: lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
2030: ||
2031: lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
2032: } (keys(%$classlist));
1.54 matthew 2033: foreach my $student (@Sorted_Students) {
1.52 matthew 2034: my $error;
1.110 matthew 2035: my $sdata = $classlist->{$student};
2036: my $username = $sdata->[$index{'username'}];
2037: my $domain = $sdata->[$index{'domain'}];
2038: my $section = $sdata->[$index{'section'}];
2039: my $name = $sdata->[$index{'fullname'}];
2040: my $id = $sdata->[$index{'id'}];
2041: my $start = $sdata->[$index{'start'}];
2042: my $end = $sdata->[$index{'end'}];
1.142 raeburn 2043: my $groups = $classgroups->{$student};
2044: my $active_groups;
2045: if (ref($groups->{active}) eq 'HASH') {
2046: $active_groups = join(', ',keys(%{$groups->{'active'}}));
2047: }
1.110 matthew 2048: if (! defined($start) || $start == 0) {
2049: $start = &mt('none');
2050: } else {
2051: $start = &Apache::lonlocal::locallocaltime($start);
2052: }
2053: if (! defined($end) || $end == 0) {
2054: $end = &mt('none');
2055: } else {
2056: $end = &Apache::lonlocal::locallocaltime($end);
2057: }
2058: my $status = $sdata->[$index{'status'}];
1.51 matthew 2059: next if ($status ne 'Active');
2060: #
1.139 albertel 2061: $r->print(&Apache::loncommon::start_data_table_row());
1.51 matthew 2062: $r->print(<<"END");
2063: <td><input type="checkbox" name="droplist" value="$student"></td>
2064: <td>$username</td>
2065: <td>$domain</td>
2066: <td>$id</td>
2067: <td>$name</td>
2068: <td>$section</td>
1.110 matthew 2069: <td>$start</td>
2070: <td>$end</td>
1.142 raeburn 2071: <td>$active_groups</td>
1.26 matthew 2072: END
1.139 albertel 2073: $r->print(&Apache::loncommon::end_data_table_row());
1.25 matthew 2074: }
1.139 albertel 2075: $r->print(&Apache::loncommon::end_data_table().'<br />');
1.111 matthew 2076: %lt=&Apache::lonlocal::texthash(
1.94 sakharuk 2077: 'dp' => "Drop Students",
2078: 'ca' => "check all",
2079: 'ua' => "uncheck all",
2080: );
1.32 matthew 2081: $r->print(<<"END");
2082: </p><p>
1.94 sakharuk 2083: <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)">
2084: <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)">
2085: <p><input type=submit value="$lt{'dp'}"></p>
1.32 matthew 2086: END
1.51 matthew 2087: return;
1.10 www 2088: }
2089:
1.48 matthew 2090: #
2091: # Print out the initial form to get the courselist file
2092: #
2093: sub print_first_courselist_upload_form {
2094: my $r=shift;
1.88 matthew 2095: my $str;
2096: $str = '<input type="hidden" name="phase" value="two">';
2097: $str .= '<input type="hidden" name="action" value="upload" />';
2098: $str .= '<input type="hidden" name="state" value="got_file" />';
2099: $str .= "<h3>".&mt('Upload a class list')."</h3>\n";
2100: $str .= &Apache::loncommon::upfile_select_html();
2101: $str .= "<p>\n";
2102: $str .= '<input type="submit" name="fileupload" value="'.
2103: &mt('Upload class list').'">'."\n";
1.131 albertel 2104: $str .= '<label><input type="checkbox" name="noFirstLine" /> '.
2105: &mt('Ignore First Line')."</label></p>\n";
1.88 matthew 2106: $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
1.92 sakharuk 2107: &mt("How do I create a class list from a spreadsheet")).
1.88 matthew 2108: "<br />\n";
2109: $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
1.92 sakharuk 2110: &mt("How do I create a CSV file from a spreadsheet")).
1.88 matthew 2111: "<br />\n";
1.138 albertel 2112: $str .= &Apache::loncommon::end_page();
1.88 matthew 2113: $r->print($str);
1.48 matthew 2114: return;
2115: }
2116:
1.10 www 2117: # ================================================= Drop/Add from uploaded file
2118: sub upfile_drop_add {
2119: my $r=shift;
1.24 albertel 2120: &Apache::loncommon::load_tmp_file($r);
2121: my @studentdata=&Apache::loncommon::upfile_record_sep();
1.127 albertel 2122: if($env{'form.noFirstLine'}){shift(@studentdata);}
2123: my @keyfields = split(/\,/,$env{'form.keyfields'});
2124: my $cid = $env{'request.course.id'};
1.25 matthew 2125: my %fields=();
1.127 albertel 2126: for (my $i=0; $i<=$env{'form.nfields'}; $i++) {
2127: if ($env{'form.upfile_associate'} eq 'reverse') {
2128: if ($env{'form.f'.$i} ne 'none') {
2129: $fields{$keyfields[$i]}=$env{'form.f'.$i};
1.25 matthew 2130: }
2131: } else {
1.127 albertel 2132: $fields{$env{'form.f'.$i}}=$keyfields[$i];
1.25 matthew 2133: }
2134: }
1.99 matthew 2135: #
2136: # Store the field choices away
2137: foreach my $field (qw/username names
2138: fname mname lname gen id sec ipwd email/) {
1.127 albertel 2139: $env{'form.'.$field.'_choice'}=$fields{$field};
1.99 matthew 2140: }
2141: &Apache::loncommon::store_course_settings('enrollment_upload',
2142: { 'username_choice' => 'scalar',
2143: 'names_choice' => 'scalar',
2144: 'fname_choice' => 'scalar',
2145: 'mname_choice' => 'scalar',
2146: 'lname_choice' => 'scalar',
2147: 'gen_choice' => 'scalar',
2148: 'id_choice' => 'scalar',
2149: 'sec_choice' => 'scalar',
2150: 'ipwd_choice' => 'scalar',
2151: 'email_choice' => 'scalar' });
2152:
1.26 matthew 2153: #
1.68 matthew 2154: my ($startdate,$enddate) = &get_dates_from_form();
1.127 albertel 2155: if ($env{'form.makedatesdefault'}) {
1.68 matthew 2156: $r->print(&make_dates_default($startdate,$enddate));
2157: }
1.31 matthew 2158: # Determine domain and desired host (home server)
1.127 albertel 2159: my $domain=$env{'form.lcdomain'};
2160: my $desiredhost = $env{'form.lcserver'};
1.31 matthew 2161: if (lc($desiredhost) eq 'default') {
2162: $desiredhost = undef;
2163: } else {
1.157 albertel 2164: my %home_servers = &Apache::lonnet::get_servers($domain,'library');
1.31 matthew 2165: if (! exists($home_servers{$desiredhost})) {
1.88 matthew 2166: $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
2167: &mt('Invalid home server specified'));
1.138 albertel 2168: $r->print(&Apache::loncommon::end_page());
1.31 matthew 2169: return;
2170: }
2171: }
1.26 matthew 2172: # Determine authentication mechanism
2173: my $amode = '';
2174: my $genpwd = '';
1.127 albertel 2175: if ($env{'form.login'} eq 'krb') {
1.47 albertel 2176: $amode='krb';
1.127 albertel 2177: $amode.=$env{'form.krbver'};
2178: $genpwd=$env{'form.krbarg'};
2179: } elsif ($env{'form.login'} eq 'int') {
1.25 matthew 2180: $amode='internal';
1.127 albertel 2181: if ((defined($env{'form.intarg'})) && ($env{'form.intarg'})) {
2182: $genpwd=$env{'form.intarg'};
1.25 matthew 2183: }
1.127 albertel 2184: } elsif ($env{'form.login'} eq 'loc') {
1.25 matthew 2185: $amode='localauth';
1.127 albertel 2186: if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) {
2187: $genpwd=$env{'form.locarg'};
1.79 matthew 2188: }
2189: }
2190: if ($amode =~ /^krb/) {
2191: if (! defined($genpwd) || $genpwd eq '') {
2192: $r->print('<font color="red" size="+1">'.
1.88 matthew 2193: &mt('Unable to enroll students').'</font> '.
2194: &mt('No Kerberos domain was specified.').'</p>');
1.79 matthew 2195: $amode = ''; # This causes the loop below to be skipped
1.25 matthew 2196: }
2197: }
1.154 raeburn 2198: if ( $domain eq &LONCAPA::clean_domain($domain)
1.150 albertel 2199: && ($amode ne '')) {
1.26 matthew 2200: #######################################
2201: ## Enroll Students ##
2202: #######################################
1.88 matthew 2203: $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n");
1.25 matthew 2204: my $count=0;
2205: my $flushc=0;
2206: my %student=();
1.142 raeburn 2207: # Get information about course groups
1.143 raeburn 2208: my %curr_groups = &Apache::longroup::coursegroups();
1.26 matthew 2209: # Get new classlist
1.25 matthew 2210: foreach (@studentdata) {
2211: my %entries=&Apache::loncommon::record_sep($_);
1.26 matthew 2212: # Determine student name
1.25 matthew 2213: unless (($entries{$fields{'username'}} eq '') ||
2214: (!defined($entries{$fields{'username'}}))) {
1.26 matthew 2215: my ($fname, $mname, $lname,$gen) = ('','','','');
1.25 matthew 2216: if (defined($fields{'names'})) {
1.26 matthew 2217: ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
2218: /([^\,]+)\,\s*(\w+)\s*(.*)$/);
1.25 matthew 2219: } else {
2220: if (defined($fields{'fname'})) {
2221: $fname=$entries{$fields{'fname'}};
2222: }
2223: if (defined($fields{'mname'})) {
2224: $mname=$entries{$fields{'mname'}};
2225: }
2226: if (defined($fields{'lname'})) {
2227: $lname=$entries{$fields{'lname'}};
2228: }
2229: if (defined($fields{'gen'})) {
2230: $gen=$entries{$fields{'gen'}};
2231: }
2232: }
1.150 albertel 2233: if ($entries{$fields{'username'}}
2234: ne &LONCAPA::clean_username($entries{$fields{'username'}})) {
1.88 matthew 2235: $r->print('<br />'.
2236: &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
2237: $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
2238: '</b>');
1.25 matthew 2239: } else {
1.26 matthew 2240: # determine section number
1.25 matthew 2241: my $sec='';
2242: my $username=$entries{$fields{'username'}};
2243: if (defined($fields{'sec'})) {
2244: if (defined($entries{$fields{'sec'}})) {
2245: $sec=$entries{$fields{'sec'}};
2246: }
2247: }
1.80 matthew 2248: # remove non alphanumeric values from section
2249: $sec =~ s/\W//g;
1.142 raeburn 2250: if ($sec eq "none" || $sec eq 'all') {
2251: $r->print('<br />'.
2252: &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.',
2253: $username,$sec,$fname,$mname,$lname,$gen));
2254: next;
2255: } elsif (($sec ne '') && (exists($curr_groups{$sec}))) {
2256: $r->print('<br />'.
2257: &mt('<b>[_1]</b>: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.',
2258: $username,$sec,$fname,$mname,$lname,$gen));
2259: next;
2260: }
1.26 matthew 2261: # determine student id number
1.25 matthew 2262: my $id='';
2263: if (defined($fields{'id'})) {
2264: if (defined($entries{$fields{'id'}})) {
2265: $id=$entries{$fields{'id'}};
2266: }
2267: $id=~tr/A-Z/a-z/;
2268: }
1.73 www 2269: # determine email address
2270: my $email='';
2271: if (defined($fields{'email'})) {
2272: if (defined($entries{$fields{'email'}})) {
2273: $email=$entries{$fields{'email'}};
2274: unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
2275: }
2276: }
1.26 matthew 2277: # determine student password
1.25 matthew 2278: my $password='';
2279: if ($genpwd) {
2280: $password=$genpwd;
2281: } else {
2282: if (defined($fields{'ipwd'})) {
2283: if ($entries{$fields{'ipwd'}}) {
2284: $password=$entries{$fields{'ipwd'}};
2285: }
2286: }
2287: }
1.56 matthew 2288: # Clean up whitespace
2289: foreach (\$domain,\$username,\$id,\$fname,\$mname,
2290: \$lname,\$gen,\$sec) {
2291: $$_ =~ s/(\s+$|^\s+)//g;
2292: }
1.127 albertel 2293: if ($password || $env{'form.login'} eq 'loc') {
1.33 matthew 2294: &modifystudent($domain,$username,$cid,$sec,
2295: $desiredhost);
1.25 matthew 2296: my $reply=&Apache::lonnet::modifystudent
2297: ($domain,$username,$id,$amode,$password,
2298: $fname,$mname,$lname,$gen,$sec,$enddate,
1.127 albertel 2299: $startdate,$env{'form.forceid'},$desiredhost,
1.73 www 2300: $email);
1.26 matthew 2301: if ($reply ne 'ok') {
1.72 matthew 2302: $reply =~ s/^error://;
1.88 matthew 2303: $r->print('<br />'.
2304: &mt('<b>[_1]</b>: Unable to enroll: [_2]',$username,$reply));
1.10 www 2305: } else {
1.7 www 2306: $count++; $flushc++;
2307: $student{$username}=1;
1.6 www 2308: $r->print('. ');
1.7 www 2309: if ($flushc>15) {
2310: $r->rflush;
2311: $flushc=0;
2312: }
1.6 www 2313: }
1.25 matthew 2314: } else {
1.88 matthew 2315: $r->print('<br />'.
2316: &mt('<b>[_1]</b>: Unable to enroll. No password specified.',$username)
2317: );
1.25 matthew 2318: }
2319: }
1.26 matthew 2320: }
2321: } # end of foreach (@studentdata)
1.88 matthew 2322: $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
2323: "</p>\n");
2324: $r->print("<p>\n".
2325: &mt('If active, the new role will be available when the '.
2326: 'students next log in to LON-CAPA.')."</p>\n");
1.26 matthew 2327: #####################################
2328: # Drop students #
2329: #####################################
1.127 albertel 2330: if ($env{'form.fullup'} eq 'yes') {
1.88 matthew 2331: $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
1.26 matthew 2332: # Get current classlist
1.56 matthew 2333: my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
2334: if (! defined($classlist)) {
1.88 matthew 2335: $r->print(&mt('There are no students currently enrolled.').
2336: "\n");
1.56 matthew 2337: } else {
2338: # Remove the students we just added from the list of students.
1.25 matthew 2339: foreach (@studentdata) {
2340: my %entries=&Apache::loncommon::record_sep($_);
2341: unless (($entries{$fields{'username'}} eq '') ||
2342: (!defined($entries{$fields{'username'}}))) {
1.56 matthew 2343: delete($classlist->{$entries{$fields{'username'}}.
1.26 matthew 2344: ':'.$domain});
1.25 matthew 2345: }
2346: }
1.56 matthew 2347: # Print out list of dropped students.
2348: &show_drop_list($r,$classlist,$keylist,'nosort');
1.25 matthew 2349: }
2350: }
1.26 matthew 2351: } # end of unless
1.10 www 2352: }
2353:
1.11 www 2354: # ================================================================== Phase four
2355: sub drop_student_list {
2356: my $r=shift;
2357: my $count=0;
1.128 albertel 2358: my @droplist = &Apache::loncommon::get_env_multiple('form.droplist');
1.35 matthew 2359: foreach (@droplist) {
1.26 matthew 2360: my ($uname,$udom)=split(/\:/,$_);
1.56 matthew 2361: # drop student
1.127 albertel 2362: my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
1.37 matthew 2363: if ($result eq 'ok' || $result eq 'ok:') {
1.88 matthew 2364: $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
1.59 matthew 2365: $count++;
1.35 matthew 2366: } else {
1.88 matthew 2367: $r->print(
2368: &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
1.35 matthew 2369: '<br />');
2370: }
1.20 harris41 2371: }
1.88 matthew 2372: $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
2373: $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
1.11 www 2374: }
2375:
1.142 raeburn 2376: sub section_check_js {
2377: my $groupslist;
1.143 raeburn 2378: my %curr_groups = &Apache::longroup::coursegroups();
1.142 raeburn 2379: if (%curr_groups) {
2380: $groupslist = join('","',sort(keys(%curr_groups)));
2381: }
2382: return <<"END";
2383: function validate(caller) {
2384: var groups = new Array("$groupslist");
2385: var secname = caller.value;
2386: if ((secname == 'all') || (secname == 'none')) {
2387: alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name.");
2388: return 'error';
2389: }
2390: if (secname != '') {
2391: for (var k=0; k<groups.length; k++) {
2392: if (secname == groups[k]) {
2393: alert("'"+secname+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name.");
2394: return 'error';
2395: }
2396: }
2397: }
2398: return 'ok';
2399: }
2400: END
2401: }
2402:
1.50 matthew 2403: ###################################################################
2404: ###################################################################
2405:
2406: =pod
2407:
2408: =item &handler
2409:
2410: The typical handler you see in all these modules. Takes $r, the
2411: http request, as an argument.
2412:
2413: The response to the request is governed by two form variables
2414:
2415: form.action form.state response
2416: ---------------------------------------------------
2417: undefined undefined print main menu
2418: upload undefined print courselist upload menu
2419: upload got_file deal with uploaded file,
2420: print the upload managing menu
2421: upload enrolling enroll students based on upload
2422: drop undefined print the classlist ready to drop
2423: drop done drop the selected students
1.74 matthew 2424: enrollstudent undefined print student username domain form
2425: enrollstudent gotusername print single student enroll menu
1.50 matthew 2426: enrollstudent enrolling enroll student
2427: classlist undefined print html classlist
2428: classlist csv print csv classlist
2429: modifystudent undefined print classlist to select student to modify
2430: modifystudent selected print modify student menu
2431: modifystudent done make modifications to student record
2432:
2433: =cut
2434:
2435: ###################################################################
2436: ###################################################################
1.10 www 2437: sub handler {
1.26 matthew 2438: my $r=shift;
2439: if ($r->header_only) {
1.86 www 2440: &Apache::loncommon::content_type($r,'text/html');
1.26 matthew 2441: $r->send_http_header;
2442: return OK;
2443: }
1.48 matthew 2444: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.50 matthew 2445: ['action','state']);
1.102 matthew 2446:
2447: &Apache::lonhtmlcommon::clear_breadcrumbs();
2448: &Apache::lonhtmlcommon::add_breadcrumb
2449: ({href=>"/adm/dropadd",
2450: text=>"Enrollment Manager",
2451: faq=>9,bug=>'Instructor Interface',});
1.26 matthew 2452: # Needs to be in a course
1.127 albertel 2453: if (! ($env{'request.course.fn'})) {
1.121 matthew 2454: # Not in a course
1.127 albertel 2455: $env{'user.error.msg'}=
1.132 raeburn 2456: "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ".
2457: "or drop or add students";
1.50 matthew 2458: return HTTP_NOT_ACCEPTABLE;
2459: }
2460: #
1.121 matthew 2461: my $view_permission =
1.127 albertel 2462: &Apache::lonnet::allowed('vcl',$env{'request.course.id'});
1.121 matthew 2463: my $enrl_permission =
1.127 albertel 2464: &Apache::lonnet::allowed('cst',$env{'request.course.id'});
1.132 raeburn 2465:
2466: my $grp_view_permission =
2467: &Apache::lonnet::allowed('vcg',$env{'request.course.id'});
2468: my $grp_manage_permission =
2469: &Apache::lonnet::allowed('mdg',$env{'request.course.id'});
2470:
2471:
2472: if (! $grp_view_permission && ! $grp_manage_permission &&
2473: ! $view_permission && ! $enrl_permission) {
1.127 albertel 2474: $env{'user.error.msg'}=
1.132 raeburn 2475: "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ".
2476: "or drop or add students";
2477: return HTTP_NOT_ACCEPTABLE;
1.121 matthew 2478: }
1.132 raeburn 2479:
1.121 matthew 2480: #
1.50 matthew 2481: # Only output the header information if they did not request csv format
2482: #
1.103 matthew 2483: # Start page
2484: &Apache::loncommon::content_type($r,'text/html');
2485: $r->send_http_header;
2486: $r->print(&header());
1.50 matthew 2487: #
2488: # Main switch on form.action and form.state, as appropriate
1.127 albertel 2489: if (! exists($env{'form.action'})) {
1.141 albertel 2490: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager'));
1.132 raeburn 2491: &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission,
2492: $grp_view_permission);
1.127 albertel 2493: } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) {
1.102 matthew 2494: &Apache::lonhtmlcommon::add_breadcrumb
2495: ({href=>'/adm/dropadd?action=upload&state=',
1.106 matthew 2496: text=>"Upload Classlist"});
1.141 albertel 2497: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist',
2498: 'Course_Create_Class_List'));
1.127 albertel 2499: if (! exists($env{'form.state'})) {
1.50 matthew 2500: &print_first_courselist_upload_form($r);
1.127 albertel 2501: } elsif ($env{'form.state'} eq 'got_file') {
1.50 matthew 2502: &print_upload_manager_form($r);
1.127 albertel 2503: } elsif ($env{'form.state'} eq 'enrolling') {
2504: if ($env{'form.datatoken'}) {
1.26 matthew 2505: &upfile_drop_add($r);
1.50 matthew 2506: } else {
2507: # Hmmm, this is an error
1.26 matthew 2508: }
1.50 matthew 2509: } else {
2510: &print_first_courselist_upload_form($r);
1.26 matthew 2511: }
1.127 albertel 2512: } elsif ($env{'form.action'} eq 'drop' && $enrl_permission) {
1.102 matthew 2513: &Apache::lonhtmlcommon::add_breadcrumb
2514: ({href=>'/adm/dropadd?action=drop',
1.106 matthew 2515: text=>"Drop Students"});
1.141 albertel 2516: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students',
2517: 'Course_Drop_Student'));
1.127 albertel 2518: if (! exists($env{'form.state'})) {
1.51 matthew 2519: &print_drop_menu($r);
1.127 albertel 2520: } elsif ($env{'form.state'} eq 'done') {
1.26 matthew 2521: &drop_student_list($r);
1.50 matthew 2522: } else {
1.55 matthew 2523: &print_drop_menu($r);
1.26 matthew 2524: }
1.127 albertel 2525: } elsif ($env{'form.action'} eq 'enrollstudent' && $enrl_permission) {
1.102 matthew 2526: &Apache::lonhtmlcommon::add_breadcrumb
2527: ({href=>'/adm/dropadd?action=enrollstudent',
1.106 matthew 2528: text=>"Enroll Student"});
1.141 albertel 2529: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student',
2530: 'Course_Add_Student'));
1.127 albertel 2531: if (! exists($env{'form.state'})) {
1.74 matthew 2532: &get_student_username_domain_form($r);
1.127 albertel 2533: } elsif ($env{'form.state'} eq 'gotusername') {
1.50 matthew 2534: &print_enroll_single_student_form($r);
1.127 albertel 2535: } elsif ($env{'form.state'} eq 'enrolling') {
1.26 matthew 2536: &enroll_single_student($r);
1.50 matthew 2537: } else {
1.74 matthew 2538: &get_student_username_domain_form($r);
1.26 matthew 2539: }
1.127 albertel 2540: } elsif ($env{'form.action'} eq 'classlist' && $view_permission) {
1.102 matthew 2541: &Apache::lonhtmlcommon::add_breadcrumb
2542: ({href=>'/adm/dropadd?action=classlist',
1.106 matthew 2543: text=>"View Classlist"});
1.141 albertel 2544: $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist',
2545: 'Course_View_Class_List'));
1.127 albertel 2546: if (! exists($env{'form.state'})) {
1.103 matthew 2547: &print_html_classlist($r,undef);
1.127 albertel 2548: } elsif ($env{'form.state'} eq 'csv') {
1.103 matthew 2549: &print_html_classlist($r,'csv');
1.127 albertel 2550: } elsif ($env{'form.state'} eq 'excel') {
1.103 matthew 2551: &print_html_classlist($r,'excel');
1.50 matthew 2552: } else {
1.103 matthew 2553: &print_html_classlist($r,undef);
1.50 matthew 2554: }
1.127 albertel 2555: } elsif ($env{'form.action'} eq 'modifystudent' && $enrl_permission) {
1.102 matthew 2556: &Apache::lonhtmlcommon::add_breadcrumb
2557: ({href=>'/adm/dropadd?action=modifystudent',
1.106 matthew 2558: text=>"Modify Student Data"});
1.141 albertel 2559: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data',
2560: 'Course_Modify_Student_Data'));
1.127 albertel 2561: if (! exists($env{'form.state'})) {
1.50 matthew 2562: &print_html_classlist($r);
1.127 albertel 2563: } elsif ($env{'form.state'} eq 'selected') {
1.50 matthew 2564: &print_modify_student_form($r);
1.127 albertel 2565: } elsif ($env{'form.state'} eq 'done') {
1.50 matthew 2566: &modify_single_student($r);
2567: } else {
2568: &print_html_classlist($r);
2569: }
2570: } else {
2571: # We should not end up here, but I guess it is possible
2572: &Apache::lonnet::logthis("Undetermined state in londropadd.pm. ".
1.127 albertel 2573: "form.action = ".$env{'form.action'}.
1.50 matthew 2574: "Someone should fix this.");
1.141 albertel 2575: $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager'));
1.121 matthew 2576: &print_main_menu($r,$enrl_permission,$view_permission);
1.50 matthew 2577: }
2578: #
2579: # Finish up
1.138 albertel 2580: $r->print('</form>'.&Apache::loncommon::end_page());
1.26 matthew 2581: return OK;
1.1 www 2582: }
2583:
1.50 matthew 2584: ###################################################################
2585: ###################################################################
2586:
1.1 www 2587: 1;
2588: __END__
1.50 matthew 2589:
1.1 www 2590:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>