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