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