Annotation of loncom/interface/londropadd.pm, revision 1.104
1.1 www 1: # The LearningOnline Network with CAPA
2: # Handler to drop and add students in courses
3: #
1.104 ! matthew 4: # $Id: londropadd.pm,v 1.103 2004/02/26 22:42:21 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");
1157: $r->print('<input type="submit" value="'.&mt('Refresh Display').'" />'."\n</p>\n");
1158:
1159: #
1160: # Print the classlist
1161: $r->print('<h2>'.&mt('Current Class List').'</h2>');
1.56 matthew 1162: my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
1163: if (! defined($classlist)) {
1.94 sakharuk 1164: $r->print(&mt('There are no students currently enrolled.')."\n");
1.40 matthew 1165: } else {
1166: # Print out the available choices
1.50 matthew 1167: if ($ENV{'form.action'} eq 'modifystudent') {
1.53 matthew 1168: &show_class_list($r,'view','modify','modifystudent',
1.57 matthew 1169: $ENV{'form.Status'},$classlist,$keylist);
1.103 matthew 1170: } elsif (! defined($mode) || $mode eq '') {
1.53 matthew 1171: &show_class_list($r,'view','aboutme','classlist',
1.57 matthew 1172: $ENV{'form.Status'},$classlist,$keylist);
1.103 matthew 1173: } elsif ($mode eq 'csv' || $mode eq 'excel') {
1174: &show_class_list($r,$mode,'nolink','csv',
1175: $ENV{'form.Status'},$classlist,$keylist);
1.50 matthew 1176: }
1.41 matthew 1177: }
1178: }
1179:
1.40 matthew 1180: # =================================================== Show student list to drop
1181: sub show_class_list {
1.56 matthew 1182: my ($r,$mode,$linkto,$action,$statusmode,$classlist,$keylist)=@_;
1.40 matthew 1183: my $cid=$ENV{'request.course.id'};
1.60 matthew 1184: #
1185: # Variables for excel output
1.104 ! matthew 1186: my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format);
1.60 matthew 1187: #
1.103 matthew 1188: # Variables for csv output
1189: my ($CSVfile,$CSVfilename);
1190: #
1.53 matthew 1191: my $sortby = $ENV{'form.sortby'};
1192: if ($sortby !~ /^(username|domain|section|fullname|id)$/) {
1193: $sortby = 'username';
1194: }
1.42 matthew 1195: # Print out header
1.103 matthew 1196: $r->print(<<END);
1197: <input type="hidden" name="sortby" value="$sortby" />
1198: <input type="hidden" name="sname" value="" />
1199: <input type="hidden" name="sdom" value="" />
1200: END
1.41 matthew 1201: if ($mode eq 'view') {
1.50 matthew 1202: if ($linkto eq 'aboutme') {
1.94 sakharuk 1203: $r->print(&mt('Select a user name to view the users personal page.'));
1.50 matthew 1204: } elsif ($linkto eq 'modify') {
1.94 sakharuk 1205: $r->print(&mt('Select a user name to modify the students information'));
1.50 matthew 1206: }
1.94 sakharuk 1207: my %lt=&Apache::lonlocal::texthash(
1208: 'usrn' => "username",
1209: 'dom' => "domain",
1210: 'sn' => "student name",
1211: 'sec' => "section",
1212: );
1.41 matthew 1213: $r->print(<<END);
1.59 matthew 1214:
1.53 matthew 1215: <input type="hidden" name="sortby" value="$sortby" />
1.59 matthew 1216: <input type="hidden" name="sname" value="" />
1217: <input type="hidden" name="sdom" value="" />
1.40 matthew 1218: <p>
1219: <table border=2>
1.53 matthew 1220: <tr><th>
1.94 sakharuk 1221: <a href="javascript:document.studentform.sortby.value='username';document.studentform.submit();">$lt{'usrn'}</a>
1.53 matthew 1222: </th><th>
1.94 sakharuk 1223: <a href="javascript:document.studentform.sortby.value='domain';document.studentform.submit();">$lt{'dom'}</a>
1.53 matthew 1224: </th><th>
1.57 matthew 1225: <a href="javascript:document.studentform.sortby.value='id';document.studentform.submit();">ID</a>
1.53 matthew 1226: </th><th>
1.94 sakharuk 1227: <a href="javascript:document.studentform.sortby.value='fullname';document.studentform.submit();">$lt{'sn'}</a>
1.53 matthew 1228: </th><th>
1.94 sakharuk 1229: <a href="javascript:document.studentform.sortby.value='section';document.studentform.submit();">$lt{'sec'}</a>
1.53 matthew 1230: </th>
1231: </tr>
1.40 matthew 1232: END
1.41 matthew 1233: } elsif ($mode eq 'csv') {
1.103 matthew 1234: #
1235: # Open a file
1236: $CSVfilename = '/prtspool/'.
1237: $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
1238: time.'_'.rand(1000000000).'.csv';
1239: unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) {
1240: $r->log_error("Couldn't open $CSVfilename for output $!");
1241: $r->print("Problems occured in writing the csv file. ".
1242: "This error has been logged. ".
1243: "Please alert your LON-CAPA administrator.");
1244: $CSVfile = undef;
1245: }
1246: #
1247: # Write headers and data to file
1.58 matthew 1248: if($statusmode eq 'Expired') {
1.103 matthew 1249: print $CSVfile '"'.&mt('Students with expired roles').'"'."\n";
1.58 matthew 1250: }
1251: if ($statusmode eq 'Any') {
1.103 matthew 1252: print $CSVfile '"'.join('","',map {
1253: &Apache::loncommon::csv_translate(&mt($_))
1254: } ("username","domain","ID","student name",
1255: "section","status")).'"'."\n";
1.58 matthew 1256: } else {
1.103 matthew 1257: print $CSVfile '"'.join('","',map {
1258: &Apache::loncommon::csv_translate(&mt($_))
1259: } ("username","domain","ID","student name",
1260: "section")).'"'."\n";
1.58 matthew 1261: }
1.60 matthew 1262: } elsif ($mode eq 'excel') {
1263: # Create the excel spreadsheet
1264: $excel_filename = '/prtspool/'.
1265: $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
1266: time.'_'.rand(1000000000).'.xls';
1267: $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.
1268: $excel_filename);
1269: $excel_workbook->set_tempdir('/home/httpd/perl/tmp');
1.104 ! matthew 1270: #
! 1271: $format = &Apache::loncommon::define_excel_formats($excel_workbook);
1.60 matthew 1272: $excel_sheet = $excel_workbook->addworksheet('classlist');
1273: #
1.76 albertel 1274: my $description = 'Class List for '.
1.60 matthew 1275: $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
1.104 ! matthew 1276: $excel_sheet->write($row++,0,$description,$format->{'h1'});
1.60 matthew 1277: #
1278: $excel_sheet->write($row++,0,["username","domain","ID",
1.104 ! matthew 1279: "student name","section","status"],$format->{'bold'});
1.41 matthew 1280: }
1.56 matthew 1281: #
1282: # Sort the students
1283: my %index;
1284: my $i;
1285: foreach (@$keylist) {
1286: $index{$_} = $i++;
1287: }
1288: my $index = $index{$sortby};
1289: my $second = $index{'username'};
1290: my $third = $index{'domain'};
1.53 matthew 1291: my @Sorted_Students = sort {
1.56 matthew 1292: lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
1293: ||
1294: lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
1295: ||
1296: lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
1297: } (keys(%$classlist));
1.53 matthew 1298: foreach my $student (@Sorted_Students) {
1.56 matthew 1299: my $username = $classlist->{$student}->[$index{'username'}];
1300: my $domain = $classlist->{$student}->[$index{'domain'}];
1301: my $section = $classlist->{$student}->[$index{'section'}];
1302: my $name = $classlist->{$student}->[$index{'fullname'}];
1303: my $id = $classlist->{$student}->[$index{'id'}];
1304: my $status = $classlist->{$student}->[$index{'status'}];
1.57 matthew 1305: next if (($statusmode ne 'Any') && ($status ne $statusmode));
1.51 matthew 1306: if ($mode eq 'view') {
1307: $r->print("<tr>\n <td>\n ");
1308: if ($linkto eq 'nothing') {
1309: $r->print($username);
1310: } elsif ($linkto eq 'aboutme') {
1311: $r->print(&Apache::loncommon::aboutmewrapper($username,
1312: $username,
1313: $domain));
1314: } elsif ($linkto eq 'modify') {
1.59 matthew 1315: $r->print('<a href="'.
1316: "javascript:document.studentform.sname.value='".
1317: $username.
1318: "';document.studentform.sdom.value='".$domain.
1319: "';document.studentform.state.value='selected".
1320: "';document.studentform.submit();".'">'.
1.53 matthew 1321: $username."</a>\n");
1.50 matthew 1322: }
1.51 matthew 1323: $r->print(<<"END");
1.50 matthew 1324: </td>
1.51 matthew 1325: <td>$domain</td>
1326: <td>$id</td>
1327: <td>$name</td>
1328: <td>$section</td>
1.40 matthew 1329: </tr>
1330: END
1.51 matthew 1331: } elsif ($mode eq 'csv') {
1.103 matthew 1332: next if (! defined($CSVfile));
1.51 matthew 1333: # no need to bother with $linkto
1334: my @line = ();
1335: foreach ($username,$domain,$id,$name,$section) {
1336: push @line,&Apache::loncommon::csv_translate($_);
1.58 matthew 1337: }
1338: if ($statusmode eq 'Any') {
1339: push @line,&Apache::loncommon::csv_translate($status);
1.41 matthew 1340: }
1.103 matthew 1341: print $CSVfile '"'.join('","',@line).'"'."\n";
1.60 matthew 1342: } elsif ($mode eq 'excel') {
1343: $excel_sheet->write($row++,0,[$username,$domain,$id,
1344: $name,$section,$status]);
1.40 matthew 1345: }
1346: }
1.60 matthew 1347: if ($mode eq 'view') {
1348: $r->print('</table><br>');
1349: } elsif ($mode eq 'excel') {
1350: $excel_workbook->close();
1351: $r->print('<p><a href="'.$excel_filename.'">'.
1.94 sakharuk 1352: &mt('Your Excel spreadsheet').'</a> '.&mt('is ready for download').'.</p>'."\n");
1.103 matthew 1353: } elsif ($mode eq 'csv') {
1354: close($CSVfile);
1355: $r->print('<a href="'.$CSVfilename.'">'.
1356: &mt('Your CSV file').'</a> is ready for download.'.
1357: "\n");
1358: $r->rflush();
1.60 matthew 1359: }
1.40 matthew 1360: }
1361:
1.50 matthew 1362:
1363: #
1364: # print out form for modification of a single students data
1365: #
1366: sub print_modify_student_form {
1367: my $r = shift();
1368: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.59 matthew 1369: ['sdom','sname']);
1.53 matthew 1370: my $sname = $ENV{'form.sname'};
1371: my $sdom = $ENV{'form.sdom'};
1372: my $sortby = $ENV{'form.sortby'};
1.50 matthew 1373: # determine the students name information
1374: my %info=&Apache::lonnet::get('environment',
1375: ['firstname','middlename',
1.52 matthew 1376: 'lastname','generation','id'],
1.50 matthew 1377: $sdom, $sname);
1378: my ($tmp) = keys(%info);
1379: if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94 sakharuk 1380: $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'.
1.50 matthew 1381: '<p>'.
1.94 sakharuk 1382: &mt('Unable to retrieve environment data for').' '.$sname.
1383: &mt('in domain').' '.$sdom.'</p><p>'.
1384: &mt('Please contact your LON-CAPA administrator regarding this situation.').'</p></body></html>');
1.50 matthew 1385: return;
1386: }
1387: # determine the students starting and ending times and section
1388: my ($starttime,$endtime,$section) = &get_enrollment_data($sname,$sdom);
1.87 matthew 1389: if ($starttime =~ /^error/) {
1.94 sakharuk 1390: $r->print('<h2>'&mt('Error').'</h2>');
1.87 matthew 1391: $r->print('<p>'.$starttime.'</p>');
1392: return;
1393: }
1.101 matthew 1394: #
1.50 matthew 1395: # Deal with date forms
1.101 matthew 1396: my $current_date_description = '';
1397: my $textdate = '';
1398:
1399: if (! defined($starttime) || $starttime == 0) {
1400: $current_date_description = &mt('Current Starting Date: not set').
1401: '<br />';
1402: } else {
1403: $current_date_description =
1404: &mt('Current Starting Date: [_1]',
1405: &Apache::lonlocal::locallocaltime($starttime)).'<br />';
1406: }
1407: if (! defined($endtime) || $endtime == 0) {
1408: $current_date_description.= &mt('Current Ending Date: not set').
1409: '<br />';
1410: } else {
1411: $current_date_description.=
1412: &mt('Current Ending Date: [_1]',
1413: &Apache::lonlocal::locallocaltime($endtime)).'<br />';
1414:
1415: }
1.68 matthew 1416: my $date_table = &date_setting_table($starttime,$endtime);
1.59 matthew 1417: #
1418: if (! exists($ENV{'form.Status'}) ||
1419: $ENV{'form.Status'} !~ /^(Any|Expired|Active)$/) {
1420: $ENV{'form.Status'} = 'crap';
1421: }
1.94 sakharuk 1422: # Make sure student is enrolled in course
1423: my %lt=&Apache::lonlocal::texthash(
1424: 'mef' => "Modify Enrollment for",
1425: 'odcc' => "Only domain coordinators can change a users password.",
1426: 'sn' => "Student Name",
1427: 'fn' => "First",
1428: 'mn' => "Middle",
1429: 'ln' => "Last",
1430: 'gen' => "Generation",
1431: 'sid' => "Student ID",
1432: 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)",
1433: 'sec' => "Section",
1434: 'sm' => "Submit Modifications",
1435: );
1.50 matthew 1436: $r->print(<<END);
1.52 matthew 1437: <p>
1438: <font size="+1">
1.94 sakharuk 1439: $lt{'odcc'}
1.52 matthew 1440: </font>
1441: </p>
1.50 matthew 1442: <input type="hidden" name="slogin" value="$sname" />
1443: <input type="hidden" name="sdomain" value="$sdom" />
1444: <input type="hidden" name="action" value="modifystudent" />
1.53 matthew 1445: <input type="hidden" name="state" value="done" />
1446: <input type="hidden" name="sortby" value="$sortby" />
1.59 matthew 1447: <input type="hidden" name="Status" value="$ENV{'form.Status'}" />
1.94 sakharuk 1448: <h2>$lt{'mef'} $info{'firstname'} $info{'middlename'}
1.50 matthew 1449: $info{'lastname'} $info{'generation'}, $sname\@$sdom</h2>
1450: <p>
1.94 sakharuk 1451: <b>$lt{'sn'}</b>
1.50 matthew 1452: <table>
1.94 sakharuk 1453: <tr><th>$lt{'fn'}</th><th>$lt{'mn'}</th><th>$lt{'ln'}</th><th>$lt{'gen'}</th></tr>
1.50 matthew 1454: <tr><td>
1455: <input type="text" name="firstname" value="$info{'firstname'}" /></td><td>
1456: <input type="text" name="middlename" value="$info{'middlename'}" /></td><td>
1457: <input type="text" name="lastname" value="$info{'lastname'}" /></td><td>
1458: <input type="text" name="generation" value="$info{'generation'}" /></td></tr>
1459: </table>
1460: </p><p>
1.94 sakharuk 1461: <b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/>
1.52 matthew 1462: </p><p>
1.53 matthew 1463: <input type="checkbox" name="forceid" >
1.94 sakharuk 1464: $lt{'disn'}
1.53 matthew 1465: </p><p>
1.101 matthew 1466: <b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/>
1.50 matthew 1467: </p>
1.101 matthew 1468: <p>$current_date_description</p>
1.68 matthew 1469: <p>$date_table</p>
1.94 sakharuk 1470: <input type="submit" value="$lt{'sm'}" />
1.50 matthew 1471: </body></html>
1472: END
1473: return;
1474: }
1475:
1476: #
1477: # modify a single students section
1478: #
1479: sub modify_single_student {
1480: my $r = shift;
1.68 matthew 1481: #
1.80 matthew 1482: # Remove non alphanumeric values from the section
1483: $ENV{'form.section'} =~ s/\W//g;
1.77 matthew 1484: #
1.68 matthew 1485: # Do the date defaults first
1486: my ($starttime,$endtime) = &get_dates_from_form();
1487: if ($ENV{'form.makedatesdefault'}) {
1488: $r->print(&make_dates_default($starttime,$endtime));
1489: }
1.59 matthew 1490: # Get the 'sortby' and 'Status' variables so the user goes back to their
1491: # previous screen
1.53 matthew 1492: my $sortby = $ENV{'form.sortby'};
1.59 matthew 1493: my $status = $ENV{'form.Status'};
1.53 matthew 1494: #
1495: # We always need this information
1496: my $slogin = $ENV{'form.slogin'};
1497: my $sdom = $ENV{'form.sdomain'};
1498: #
1499: # Get the old data
1500: my %old=&Apache::lonnet::get('environment',
1501: ['firstname','middlename',
1502: 'lastname','generation','id'],
1503: $sdom, $slogin);
1.59 matthew 1504: $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin,
1505: $ENV{'request.course.id'});
1.53 matthew 1506: my ($tmp) = keys(%old);
1507: if ($tmp =~ /^(con_lost|error|no_such_host)/i) {
1.94 sakharuk 1508: $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom.");
1.53 matthew 1509: return;
1510: }
1511: undef $tmp;
1512: #
1513: # Get the new data
1.50 matthew 1514: my $firstname = $ENV{'form.firstname'};
1515: my $middlename = $ENV{'form.middlename'};
1516: my $lastname = $ENV{'form.lastname'};
1517: my $generation = $ENV{'form.generation'};
1518: my $section = $ENV{'form.section'};
1519: my $courseid = $ENV{'request.course.id'};
1.52 matthew 1520: my $sid = $ENV{'form.id'};
1.50 matthew 1521: my $displayable_starttime = localtime($starttime);
1522: my $displayable_endtime = localtime($endtime);
1.53 matthew 1523: #
1524: # check for forceid override
1.63 matthew 1525: if ((defined($old{'id'})) && ($old{'id'} ne '') &&
1526: ($sid ne $old{'id'}) && (! exists($ENV{'form.forceid'}))) {
1.94 sakharuk 1527: $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 1528: $sid = $old{'id'};
1529: }
1530: #
1.50 matthew 1531: # talk to the user about what we are going to do
1.94 sakharuk 1532: my %lt=&Apache::lonlocal::texthash(
1533: 'mdu' => "Modifying data for user",
1534: 'si' => "Student Information",
1535: 'fd' => "Field",
1536: 'ov' => "Old Value",
1537: 'nv' => "New Value",
1538: 'fn' => "First name",
1539: 'mn' => "Middle name",
1540: 'ln' => "Last name",
1541: 'gen' => "Generation",
1542: 'sec' => "Section",
1543: 'ri' => "Role Information",
1544: 'st' => "Start Time",
1545: 'et' => "End Time",
1546: );
1.50 matthew 1547: $r->print(<<END);
1.94 sakharuk 1548: <h2>$lt{'mdu'} $slogin \@ $sdom </h2>
1549: <h3>$lt{'si'}</h3>
1.53 matthew 1550: <table rules="rows" border="1" cellpadding="3" >
1551: <tr>
1.94 sakharuk 1552: <th> $lt{'fd'} </th>
1553: <th> $lt{'ov'} </th>
1554: <th> $lt{'nv'} </th>
1.53 matthew 1555: </tr>
1556: <tr>
1.94 sakharuk 1557: <td> <b>$lt{'fn'}</b> </td>
1.53 matthew 1558: <td> $old{'firstname'} </td>
1559: <td> $firstname </td>
1560: </tr><tr>
1.94 sakharuk 1561: <td> <b>$lt{'mn'}</b> </td>
1.53 matthew 1562: <td> $old{'middlename'} </td>
1563: <td> $middlename </td>
1564: </tr><tr>
1.94 sakharuk 1565: <td> <b>$lt{'ln'}</b> </td>
1.53 matthew 1566: <td> $old{'lastname'} </td>
1567: <td> $lastname </td>
1568: </tr><tr>
1.94 sakharuk 1569: <td> <b>$lt{'gen'}</b> </td>
1.53 matthew 1570: <td> $old{'generation'} </td>
1571: <td> $generation </td>
1572: </tr><tr>
1573: <td> <b>ID</b> </td>
1574: <td> $old{'id'} </td>
1575: <td> $sid </td>
1.59 matthew 1576: </tr><tr>
1.94 sakharuk 1577: <td> <b>$lt{'sec'}</b> </td>
1.59 matthew 1578: <td> $old{'section'} </td>
1579: <td> $section</td>
1.53 matthew 1580: </tr>
1.50 matthew 1581: </table>
1.94 sakharuk 1582: <h3>$lt{'ri'}</h3>
1.50 matthew 1583: <table>
1.94 sakharuk 1584: <tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr>
1585: <tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime </td></tr>
1.50 matthew 1586: </table>
1.52 matthew 1587: <p>
1.50 matthew 1588: END
1.53 matthew 1589: #
1.63 matthew 1590: # Send request(s) to modify data (final undef is for 'desiredhost',
1591: # which is a moot point because the student already has an account.
1592: my $modify_section_results = &modifystudent($sdom,$slogin,
1593: $ENV{'request.course.id'},
1594: $section,undef);
1595: if ($modify_section_results !~ /^ok/) {
1.94 sakharuk 1596: $r->print(&mt('An error occured during the attempt to change the section for this student.')."<br />");
1.63 matthew 1597: }
1.52 matthew 1598: my $roleresults = &Apache::lonnet::modifystudent
1.53 matthew 1599: ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname,
1600: $generation,$section,$endtime,$starttime,$ENV{'form.forceid'});
1601: if ($roleresults eq 'refused' ) {
1.94 sakharuk 1602: $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 1603: } elsif ($roleresults !~ /ok/) {
1.94 sakharuk 1604: $r->print(&mt('An error occurred during the attempt to change the role information for this student.')." <br />".
1605: &mt('The error reported was')." ".
1.50 matthew 1606: $roleresults);
1.53 matthew 1607: &Apache::lonnet::logthis("londropadd:failed attempt to modify student".
1608: " data for ".$slogin." \@ ".$sdom." by ".
1609: $ENV{'user.name'}." \@ ".$ENV{'user.domain'}.
1610: ":".$roleresults);
1.50 matthew 1611: } else { # everything is okay!
1.94 sakharuk 1612: $r->print(&mt('Student information updated successfully.')." <br />".
1613: &mt('The student must log out and log in again to see these changes.'));
1.50 matthew 1614: }
1.94 sakharuk 1615: my $Masd=&mt('Modify another students data');
1.50 matthew 1616: $r->print(<<END);
1.52 matthew 1617: </p><p>
1.59 matthew 1618: <input type="hidden" name="action" value="modifystudent" />
1619: <input type="hidden" name="sortby" value="$sortby" />
1620: <input type="hidden" name="Status" value="$status" />
1.94 sakharuk 1621: <a href="javascript:document.studentform.submit();">$Masd</a>
1.50 matthew 1622: </body></html>
1623: END
1624: return;
1625: }
1626:
1627: sub get_enrollment_data {
1628: my ($sname,$sdomain) = @_;
1629: my $courseid = $ENV{'request.course.id'};
1630: $courseid =~ s:_:/:g;
1631: my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname);
1632: my ($tmp) = keys(%roles);
1633: # Bail out if we were unable to get the students roles
1.87 matthew 1634: return ('error'.$tmp) if ($tmp =~ /^(con_lost|error|no_such_host)/i);
1.50 matthew 1635: # Go through the roles looking for enrollment in this course
1636: my ($end,$start) = (undef,undef);
1637: my $section = '';
1638: my $count = scalar(keys(%roles));
1639: while (my ($course,$role) = each(%roles)) {
1640: if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) {
1641: #
1642: # Get active role
1643: $section=$1;
1644: (undef,$end,$start)=split(/\_/,$role);
1645: my $now=time;
1646: my $notactive=0;
1647: if ($start) {
1648: if ($now<$start) { $notactive=1; }
1649: }
1650: if ($end) {
1651: if ($now>$end) { $notactive=1; }
1652: }
1653: unless ($notactive) { return ($start,$end,$section); }
1654: }
1655: }
1656: return ($start,$end,$section);
1657: }
1658:
1.56 matthew 1659: #################################################
1660: #################################################
1661:
1662: =pod
1663:
1664: =item show_drop_list
1665:
1666: Display a list of students to drop
1667: Inputs:
1668:
1669: =over 4
1670:
1671: =item $r, Apache request
1672:
1673: =item $classlist, hash pointer returned from loncoursedata::get_classlist();
1674:
1675: =item $keylist, array pointer returned from loncoursedata::get_classlist()
1676: which describes the order elements are stored in the %$classlist values.
1677:
1678: =item $nosort, if true, sorting links are omitted.
1679:
1680: =back
1681:
1682: =cut
1683:
1684: #################################################
1685: #################################################
1.11 www 1686: sub show_drop_list {
1.56 matthew 1687: my ($r,$classlist,$keylist,$nosort)=@_;
1.11 www 1688: my $cid=$ENV{'request.course.id'};
1.59 matthew 1689: if (! exists($ENV{'form.sortby'})) {
1690: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1691: ['sortby']);
1692: }
1.54 matthew 1693: my $sortby = $ENV{'form.sortby'};
1694: if ($sortby !~ /^(username|domain|section|fullname|id)$/) {
1695: $sortby = 'username';
1696: }
1.56 matthew 1697: #
1.54 matthew 1698: my $action = "drop";
1699: $r->print(<<END);
1700: <input type="hidden" name="sortby" value="$sortby" />
1701: <input type="hidden" name="action" value="$action" />
1.50 matthew 1702: <input type="hidden" name="state" value="done" />
1.32 matthew 1703: <script>
1.51 matthew 1704: function checkAll(field) {
1.32 matthew 1705: for (i = 0; i < field.length; i++)
1706: field[i].checked = true ;
1707: }
1708:
1.51 matthew 1709: function uncheckAll(field) {
1.32 matthew 1710: for (i = 0; i < field.length; i++)
1711: field[i].checked = false ;
1712: }
1713: </script>
1714: <p>
1.26 matthew 1715: <input type="hidden" name="phase" value="four">
1.56 matthew 1716: END
1717:
1718: if ($nosort) {
1.94 sakharuk 1719: my %lt=&Apache::lonlocal::texthash(
1720: 'usrn' => "username",
1721: 'dom' => "domain",
1722: 'sn' => "student name",
1723: 'sec' => "section",
1724: );
1.56 matthew 1725: $r->print(<<END);
1726: <table border=2>
1727: <tr>
1728: <th> </th>
1.94 sakharuk 1729: <th>$lt{'usrn'}</th>
1730: <th>$lt{'dom'}</th>
1.56 matthew 1731: <th>ID</th>
1.94 sakharuk 1732: <th>$lt{'sn'}</th>
1733: <th>$lt{'sec'}</th>
1.56 matthew 1734: </tr>
1735: END
1736:
1737: } else {
1.94 sakharuk 1738: my %lt=&Apache::lonlocal::texthash(
1739: 'usrn' => "username",
1740: 'dom' => "domain",
1741: 'sn' => "student name",
1742: 'sec' => "section",
1743: );
1.56 matthew 1744: $r->print(<<END);
1.26 matthew 1745: <table border=2>
1.54 matthew 1746: <tr><th> </th>
1747: <th>
1.94 sakharuk 1748: <a href="/adm/dropadd?action=$action&sortby=username">$lt{'usrn'}</a>
1.54 matthew 1749: </th><th>
1.94 sakharuk 1750: <a href="/adm/dropadd?action=$action&sortby=domain">$lt{'dom'}</a>
1.54 matthew 1751: </th><th>
1752: <a href="/adm/dropadd?action=$action&sortby=id">ID</a>
1753: </th><th>
1.94 sakharuk 1754: <a href="/adm/dropadd?action=$action&sortby=fullname">$lt{'sn'}</a>
1.54 matthew 1755: </th><th>
1.94 sakharuk 1756: <a href="/adm/dropadd?action=$action&sortby=section">$lt{'sec'}</a>
1.54 matthew 1757: </th>
1758: </tr>
1.26 matthew 1759: END
1.56 matthew 1760: }
1761: #
1762: # Sort the students
1763: my %index;
1764: my $i;
1765: foreach (@$keylist) {
1766: $index{$_} = $i++;
1767: }
1768: my $index = $index{$sortby};
1769: my $second = $index{'username'};
1770: my $third = $index{'domain'};
1.54 matthew 1771: my @Sorted_Students = sort {
1.56 matthew 1772: lc($classlist->{$a}->[$index]) cmp lc($classlist->{$b}->[$index])
1773: ||
1774: lc($classlist->{$a}->[$second]) cmp lc($classlist->{$b}->[$second])
1775: ||
1776: lc($classlist->{$a}->[$third]) cmp lc($classlist->{$b}->[$third])
1777: } (keys(%$classlist));
1.54 matthew 1778: foreach my $student (@Sorted_Students) {
1.52 matthew 1779: my $error;
1.56 matthew 1780: my $username = $classlist->{$student}->[$index{'username'}];
1781: my $domain = $classlist->{$student}->[$index{'domain'}];
1782: my $section = $classlist->{$student}->[$index{'section'}];
1783: my $name = $classlist->{$student}->[$index{'fullname'}];
1784: my $id = $classlist->{$student}->[$index{'id'}];
1785: my $status = $classlist->{$student}->[$index{'status'}];
1.51 matthew 1786: next if ($status ne 'Active');
1787: #
1788: $r->print(<<"END");
1.26 matthew 1789: <tr>
1.51 matthew 1790: <td><input type="checkbox" name="droplist" value="$student"></td>
1791: <td>$username</td>
1792: <td>$domain</td>
1793: <td>$id</td>
1794: <td>$name</td>
1795: <td>$section</td>
1.26 matthew 1796: </tr>
1797: END
1.25 matthew 1798: }
1799: $r->print('</table><br>');
1.94 sakharuk 1800: my %lt=&Apache::lonlocal::texthash(
1801: 'dp' => "Drop Students",
1802: 'ca' => "check all",
1803: 'ua' => "uncheck all",
1804: );
1.32 matthew 1805: $r->print(<<"END");
1806: </p><p>
1.94 sakharuk 1807: <input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)">
1808: <input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)">
1809: <p><input type=submit value="$lt{'dp'}"></p>
1.32 matthew 1810: END
1.51 matthew 1811: return;
1.10 www 1812: }
1813:
1.48 matthew 1814: #
1815: # Print out the initial form to get the courselist file
1816: #
1817: sub print_first_courselist_upload_form {
1818: my $r=shift;
1.88 matthew 1819: my $str;
1820: $str = '<input type="hidden" name="phase" value="two">';
1821: $str .= '<input type="hidden" name="action" value="upload" />';
1822: $str .= '<input type="hidden" name="state" value="got_file" />';
1823: $str .= "<h3>".&mt('Upload a class list')."</h3>\n";
1824: $str .= &Apache::loncommon::upfile_select_html();
1825: $str .= "<p>\n";
1826: $str .= '<input type="submit" name="fileupload" value="'.
1827: &mt('Upload class list').'">'."\n";
1828: $str .= '<input type="checkbox" name="noFirstLine" /> '.
1829: &mt('Ignore First Line')."</p>\n";
1830: $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List",
1.92 sakharuk 1831: &mt("How do I create a class list from a spreadsheet")).
1.88 matthew 1832: "<br />\n";
1833: $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV",
1.92 sakharuk 1834: &mt("How do I create a CSV file from a spreadsheet")).
1.88 matthew 1835: "<br />\n";
1836: $str .= "</body>\n</html>\n";
1837: $r->print($str);
1.48 matthew 1838: return;
1839: }
1840:
1.10 www 1841: # ================================================= Drop/Add from uploaded file
1842: sub upfile_drop_add {
1843: my $r=shift;
1.24 albertel 1844: &Apache::loncommon::load_tmp_file($r);
1845: my @studentdata=&Apache::loncommon::upfile_record_sep();
1.82 www 1846: if($ENV{'form.noFirstLine'}){shift(@studentdata);}
1.26 matthew 1847: my @keyfields = split(/\,/,$ENV{'form.keyfields'});
1848: my $cid = $ENV{'request.course.id'};
1.25 matthew 1849: my %fields=();
1.26 matthew 1850: for (my $i=0; $i<=$ENV{'form.nfields'}; $i++) {
1.25 matthew 1851: if ($ENV{'form.upfile_associate'} eq 'reverse') {
1852: if ($ENV{'form.f'.$i} ne 'none') {
1853: $fields{$keyfields[$i]}=$ENV{'form.f'.$i};
1854: }
1855: } else {
1856: $fields{$ENV{'form.f'.$i}}=$keyfields[$i];
1857: }
1858: }
1.99 matthew 1859: #
1860: # Store the field choices away
1861: foreach my $field (qw/username names
1862: fname mname lname gen id sec ipwd email/) {
1863: $ENV{'form.'.$field.'_choice'}=$fields{$field};
1864: }
1865: &Apache::loncommon::store_course_settings('enrollment_upload',
1866: { 'username_choice' => 'scalar',
1867: 'names_choice' => 'scalar',
1868: 'fname_choice' => 'scalar',
1869: 'mname_choice' => 'scalar',
1870: 'lname_choice' => 'scalar',
1871: 'gen_choice' => 'scalar',
1872: 'id_choice' => 'scalar',
1873: 'sec_choice' => 'scalar',
1874: 'ipwd_choice' => 'scalar',
1875: 'email_choice' => 'scalar' });
1876:
1.26 matthew 1877: #
1.68 matthew 1878: my ($startdate,$enddate) = &get_dates_from_form();
1879: if ($ENV{'form.makedatesdefault'}) {
1880: $r->print(&make_dates_default($startdate,$enddate));
1881: }
1.31 matthew 1882: # Determine domain and desired host (home server)
1.25 matthew 1883: my $domain=$ENV{'form.lcdomain'};
1.31 matthew 1884: my $desiredhost = $ENV{'form.lcserver'};
1885: if (lc($desiredhost) eq 'default') {
1886: $desiredhost = undef;
1887: } else {
1.45 matthew 1888: my %home_servers = &Apache::loncommon::get_library_servers($domain);
1.31 matthew 1889: if (! exists($home_servers{$desiredhost})) {
1.88 matthew 1890: $r->print('<font color="#ff0000">'.&mt('Error').'</font>'.
1891: &mt('Invalid home server specified'));
1892: $r->print("</body>\n</html>\n");
1.31 matthew 1893: return;
1894: }
1895: }
1.26 matthew 1896: # Determine authentication mechanism
1897: my $amode = '';
1898: my $genpwd = '';
1.25 matthew 1899: if ($ENV{'form.login'} eq 'krb') {
1.47 albertel 1900: $amode='krb';
1901: $amode.=$ENV{'form.krbver'};
1.28 matthew 1902: $genpwd=$ENV{'form.krbarg'};
1.25 matthew 1903: } elsif ($ENV{'form.login'} eq 'int') {
1904: $amode='internal';
1.28 matthew 1905: if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) {
1906: $genpwd=$ENV{'form.intarg'};
1.25 matthew 1907: }
1908: } elsif ($ENV{'form.login'} eq 'loc') {
1909: $amode='localauth';
1910: if ((defined($ENV{'form.locarg'})) && ($ENV{'form.locarg'})) {
1911: $genpwd=$ENV{'form.locarg'};
1.79 matthew 1912: }
1913: }
1914: if ($amode =~ /^krb/) {
1915: if (! defined($genpwd) || $genpwd eq '') {
1916: $r->print('<font color="red" size="+1">'.
1.88 matthew 1917: &mt('Unable to enroll students').'</font> '.
1918: &mt('No Kerberos domain was specified.').'</p>');
1.79 matthew 1919: $amode = ''; # This causes the loop below to be skipped
1.25 matthew 1920: }
1921: }
1922: unless (($domain=~/\W/) || ($amode eq '')) {
1.26 matthew 1923: #######################################
1924: ## Enroll Students ##
1925: #######################################
1.88 matthew 1926: $r->print('<h3>'.&mt('Enrolling Students')."</h3>\n<p>\n");
1.25 matthew 1927: my $count=0;
1928: my $flushc=0;
1929: my %student=();
1.26 matthew 1930: # Get new classlist
1.25 matthew 1931: foreach (@studentdata) {
1932: my %entries=&Apache::loncommon::record_sep($_);
1.26 matthew 1933: # Determine student name
1.25 matthew 1934: unless (($entries{$fields{'username'}} eq '') ||
1935: (!defined($entries{$fields{'username'}}))) {
1.26 matthew 1936: my ($fname, $mname, $lname,$gen) = ('','','','');
1.25 matthew 1937: if (defined($fields{'names'})) {
1.26 matthew 1938: ($lname,$fname,$mname)=($entries{$fields{'names'}}=~
1939: /([^\,]+)\,\s*(\w+)\s*(.*)$/);
1.25 matthew 1940: } else {
1941: if (defined($fields{'fname'})) {
1942: $fname=$entries{$fields{'fname'}};
1943: }
1944: if (defined($fields{'mname'})) {
1945: $mname=$entries{$fields{'mname'}};
1946: }
1947: if (defined($fields{'lname'})) {
1948: $lname=$entries{$fields{'lname'}};
1949: }
1950: if (defined($fields{'gen'})) {
1951: $gen=$entries{$fields{'gen'}};
1952: }
1953: }
1954: if ($entries{$fields{'username'}}=~/\W/) {
1.88 matthew 1955: $r->print('<br />'.
1956: &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]',
1957: $entries{$fields{'username'}},$fname,$mname,$lname,$gen).
1958: '</b>');
1.25 matthew 1959: } else {
1.26 matthew 1960: # determine section number
1.25 matthew 1961: my $sec='';
1962: my $username=$entries{$fields{'username'}};
1963: if (defined($fields{'sec'})) {
1964: if (defined($entries{$fields{'sec'}})) {
1965: $sec=$entries{$fields{'sec'}};
1966: }
1967: }
1.80 matthew 1968: # remove non alphanumeric values from section
1969: $sec =~ s/\W//g;
1.26 matthew 1970: # determine student id number
1.25 matthew 1971: my $id='';
1972: if (defined($fields{'id'})) {
1973: if (defined($entries{$fields{'id'}})) {
1974: $id=$entries{$fields{'id'}};
1975: }
1976: $id=~tr/A-Z/a-z/;
1977: }
1.73 www 1978: # determine email address
1979: my $email='';
1980: if (defined($fields{'email'})) {
1981: if (defined($entries{$fields{'email'}})) {
1982: $email=$entries{$fields{'email'}};
1983: unless ($email=~/^[^\@]+\@[^\@]+$/) { $email=''; }
1984: }
1985: }
1.26 matthew 1986: # determine student password
1.25 matthew 1987: my $password='';
1988: if ($genpwd) {
1989: $password=$genpwd;
1990: } else {
1991: if (defined($fields{'ipwd'})) {
1992: if ($entries{$fields{'ipwd'}}) {
1993: $password=$entries{$fields{'ipwd'}};
1994: }
1995: }
1996: }
1.56 matthew 1997: # Clean up whitespace
1998: foreach (\$domain,\$username,\$id,\$fname,\$mname,
1999: \$lname,\$gen,\$sec) {
2000: $$_ =~ s/(\s+$|^\s+)//g;
2001: }
1.84 albertel 2002: if ($password || $ENV{'form.login'} eq 'loc') {
1.33 matthew 2003: &modifystudent($domain,$username,$cid,$sec,
2004: $desiredhost);
1.25 matthew 2005: my $reply=&Apache::lonnet::modifystudent
2006: ($domain,$username,$id,$amode,$password,
2007: $fname,$mname,$lname,$gen,$sec,$enddate,
1.73 www 2008: $startdate,$ENV{'form.forceid'},$desiredhost,
2009: $email);
1.26 matthew 2010: if ($reply ne 'ok') {
1.72 matthew 2011: $reply =~ s/^error://;
1.88 matthew 2012: $r->print('<br />'.
2013: &mt('<b>[_1]</b>: Unable to enroll: [_2]',$username,$reply));
1.10 www 2014: } else {
1.7 www 2015: $count++; $flushc++;
2016: $student{$username}=1;
1.6 www 2017: $r->print('. ');
1.7 www 2018: if ($flushc>15) {
2019: $r->rflush;
2020: $flushc=0;
2021: }
1.6 www 2022: }
1.25 matthew 2023: } else {
1.88 matthew 2024: $r->print('<br />'.
2025: &mt('<b>[_1]</b>: Unable to enroll. No password specified.',$username)
2026: );
1.25 matthew 2027: }
2028: }
1.26 matthew 2029: }
2030: } # end of foreach (@studentdata)
1.88 matthew 2031: $r->print("</p>\n<p>\n".&mt('Processed [_1] student(s).',$count).
2032: "</p>\n");
2033: $r->print("<p>\n".
2034: &mt('If active, the new role will be available when the '.
2035: 'students next log in to LON-CAPA.')."</p>\n");
1.26 matthew 2036: #####################################
2037: # Drop students #
2038: #####################################
1.25 matthew 2039: if ($ENV{'form.fullup'} eq 'yes') {
1.88 matthew 2040: $r->print('<h3>'.&mt('Dropping Students')."</h3>\n");
1.26 matthew 2041: # Get current classlist
1.56 matthew 2042: my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist();
2043: if (! defined($classlist)) {
1.88 matthew 2044: $r->print(&mt('There are no students currently enrolled.').
2045: "\n");
1.56 matthew 2046: } else {
2047: # Remove the students we just added from the list of students.
1.25 matthew 2048: foreach (@studentdata) {
2049: my %entries=&Apache::loncommon::record_sep($_);
2050: unless (($entries{$fields{'username'}} eq '') ||
2051: (!defined($entries{$fields{'username'}}))) {
1.56 matthew 2052: delete($classlist->{$entries{$fields{'username'}}.
1.26 matthew 2053: ':'.$domain});
1.25 matthew 2054: }
2055: }
1.56 matthew 2056: # Print out list of dropped students.
2057: &show_drop_list($r,$classlist,$keylist,'nosort');
1.25 matthew 2058: }
2059: }
1.26 matthew 2060: } # end of unless
1.10 www 2061: }
2062:
1.11 www 2063: # ================================================================== Phase four
2064: sub drop_student_list {
2065: my $r=shift;
2066: my $count=0;
1.35 matthew 2067: my @droplist;
2068: if (ref($ENV{'form.droplist'})) {
2069: @droplist = @{$ENV{'form.droplist'}};
2070: } else {
2071: @droplist = ($ENV{'form.droplist'});
2072: }
2073: foreach (@droplist) {
1.26 matthew 2074: my ($uname,$udom)=split(/\:/,$_);
1.56 matthew 2075: # drop student
1.35 matthew 2076: my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'});
1.37 matthew 2077: if ($result eq 'ok' || $result eq 'ok:') {
1.88 matthew 2078: $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'<br>');
1.59 matthew 2079: $count++;
1.35 matthew 2080: } else {
1.88 matthew 2081: $r->print(
2082: &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
1.35 matthew 2083: '<br />');
2084: }
1.20 harris41 2085: }
1.88 matthew 2086: $r->print('<p><b>'.&mt('Dropped [_1] student(s).',$count).'</b></p>');
2087: $r->print('<p>'.&mt('Re-enrollment will re-activate data.')) if ($count);
1.11 www 2088: }
2089:
1.50 matthew 2090: ###################################################################
2091: ###################################################################
2092:
2093: =pod
2094:
2095: =item &handler
2096:
2097: The typical handler you see in all these modules. Takes $r, the
2098: http request, as an argument.
2099:
2100: The response to the request is governed by two form variables
2101:
2102: form.action form.state response
2103: ---------------------------------------------------
2104: undefined undefined print main menu
2105: upload undefined print courselist upload menu
2106: upload got_file deal with uploaded file,
2107: print the upload managing menu
2108: upload enrolling enroll students based on upload
2109: drop undefined print the classlist ready to drop
2110: drop done drop the selected students
1.74 matthew 2111: enrollstudent undefined print student username domain form
2112: enrollstudent gotusername print single student enroll menu
1.50 matthew 2113: enrollstudent enrolling enroll student
2114: classlist undefined print html classlist
2115: classlist csv print csv classlist
2116: modifystudent undefined print classlist to select student to modify
2117: modifystudent selected print modify student menu
2118: modifystudent done make modifications to student record
2119:
2120: =cut
2121:
2122: ###################################################################
2123: ###################################################################
1.10 www 2124: sub handler {
1.26 matthew 2125: my $r=shift;
2126: if ($r->header_only) {
1.86 www 2127: &Apache::loncommon::content_type($r,'text/html');
1.26 matthew 2128: $r->send_http_header;
2129: return OK;
2130: }
1.48 matthew 2131: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.50 matthew 2132: ['action','state']);
1.102 matthew 2133:
2134: &Apache::lonhtmlcommon::clear_breadcrumbs();
2135: &Apache::lonhtmlcommon::add_breadcrumb
2136: ({href=>"/adm/dropadd",
2137: text=>"Enrollment Manager",
2138: faq=>9,bug=>'Instructor Interface',});
1.26 matthew 2139: # Needs to be in a course
1.50 matthew 2140: if (! (($ENV{'request.course.fn'}) &&
2141: (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'})))) {
2142: # Not in a course, or not allowed to modify parms
2143: $ENV{'user.error.msg'}=
2144: "/adm/dropadd:cst:0:0:Cannot drop or add students";
2145: return HTTP_NOT_ACCEPTABLE;
2146: }
2147: #
2148: # Only output the header information if they did not request csv format
2149: #
1.102 matthew 2150: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
2151: ['state','action']);
1.103 matthew 2152: # Start page
2153: &Apache::loncommon::content_type($r,'text/html');
2154: $r->send_http_header;
2155: $r->print(&header());
1.50 matthew 2156: #
2157: # Main switch on form.action and form.state, as appropriate
2158: if (! exists($ENV{'form.action'})) {
1.102 matthew 2159: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2160: (undef,'Enrollment Manager'));
1.50 matthew 2161: &print_main_menu($r);
2162: } elsif ($ENV{'form.action'} eq 'upload') {
1.102 matthew 2163: &Apache::lonhtmlcommon::add_breadcrumb
2164: ({href=>'/adm/dropadd?action=upload&state=',
2165: text=>"Upload Classlist",
2166: faq=>9,bug=>'Instructor Interface',});
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',
2185: text=>"Drop Students",
2186: faq=>9,bug=>'Instructor Interface',});
2187: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2188: (undef,'Drop Students'));
1.50 matthew 2189: if (! exists($ENV{'form.state'})) {
1.51 matthew 2190: &print_drop_menu($r);
1.50 matthew 2191: } elsif ($ENV{'form.state'} eq 'done') {
1.26 matthew 2192: &drop_student_list($r);
1.50 matthew 2193: } else {
1.55 matthew 2194: &print_drop_menu($r);
1.26 matthew 2195: }
1.50 matthew 2196: } elsif ($ENV{'form.action'} eq 'enrollstudent') {
1.102 matthew 2197: &Apache::lonhtmlcommon::add_breadcrumb
2198: ({href=>'/adm/dropadd?action=enrollstudent',
2199: text=>"Enroll Student",
2200: faq=>9,bug=>'Instructor Interface',});
2201: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2202: (undef,'Enroll Student'));
1.50 matthew 2203: if (! exists($ENV{'form.state'})) {
1.74 matthew 2204: &get_student_username_domain_form($r);
2205: } elsif ($ENV{'form.state'} eq 'gotusername') {
1.50 matthew 2206: &print_enroll_single_student_form($r);
2207: } elsif ($ENV{'form.state'} eq 'enrolling') {
1.26 matthew 2208: &enroll_single_student($r);
1.50 matthew 2209: } else {
1.74 matthew 2210: &get_student_username_domain_form($r);
1.26 matthew 2211: }
1.50 matthew 2212: } elsif ($ENV{'form.action'} eq 'classlist') {
1.102 matthew 2213: &Apache::lonhtmlcommon::add_breadcrumb
2214: ({href=>'/adm/dropadd?action=classlist',
2215: text=>"View Classlist",
2216: faq=>9,bug=>'Instructor Interface',});
2217: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2218: (undef,'View Classlist'));
1.50 matthew 2219: if (! exists($ENV{'form.state'})) {
1.103 matthew 2220: &print_html_classlist($r,undef);
1.50 matthew 2221: } elsif ($ENV{'form.state'} eq 'csv') {
1.103 matthew 2222: &print_html_classlist($r,'csv');
1.60 matthew 2223: } elsif ($ENV{'form.state'} eq 'excel') {
1.103 matthew 2224: &print_html_classlist($r,'excel');
1.50 matthew 2225: } else {
1.103 matthew 2226: &print_html_classlist($r,undef);
1.50 matthew 2227: }
2228: } elsif ($ENV{'form.action'} eq 'modifystudent') {
1.102 matthew 2229: &Apache::lonhtmlcommon::add_breadcrumb
2230: ({href=>'/adm/dropadd?action=modifystudent',
2231: text=>"Modify Student Data",
2232: faq=>9,bug=>'Instructor Interface',});
2233: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2234: (undef,'Modify Student Data'));
1.50 matthew 2235: if (! exists($ENV{'form.state'})) {
2236: &print_html_classlist($r);
2237: } elsif ($ENV{'form.state'} eq 'selected') {
2238: &print_modify_student_form($r);
2239: } elsif ($ENV{'form.state'} eq 'done') {
2240: &modify_single_student($r);
2241: } else {
2242: &print_html_classlist($r);
2243: }
2244: } else {
2245: # We should not end up here, but I guess it is possible
2246: &Apache::lonnet::logthis("Undetermined state in londropadd.pm. ".
2247: "form.action = ".$ENV{'form.action'}.
2248: "Someone should fix this.");
1.102 matthew 2249: $r->print(&Apache::lonhtmlcommon::breadcrumbs
2250: (undef,'Enrollment Manager'));
1.50 matthew 2251: &print_main_menu($r);
2252: }
2253: #
2254: # Finish up
1.103 matthew 2255: $r->print('</form></body></html>');
1.26 matthew 2256: return OK;
1.1 www 2257: }
2258:
1.50 matthew 2259: ###################################################################
2260: ###################################################################
2261:
1.1 www 2262: 1;
2263: __END__
1.50 matthew 2264:
1.1 www 2265:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>