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