--- loncom/interface/Attic/londropadd.pm 2002/04/16 21:02:17 1.26 +++ loncom/interface/Attic/londropadd.pm 2002/08/22 21:05:25 1.47 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.26 2002/04/16 21:02:17 matthew Exp $ +# $Id: londropadd.pm,v 1.47 2002/08/22 21:05:25 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -59,24 +59,21 @@ use Apache::Constants qw(:common :http R # ================================================================ Print header sub header { - my $r=shift; - $r->print(< -LON-CAPA Student Drop/Add +LON-CAPA Enrollment Manager - - -

Drop/Add Students

-
-

Course: $ENV{'course.'.$ENV{'request.course.id'}.'.description'}

+$bodytag + ENDHEAD } # =========== Drop student from all sections of a course, except optional $csec sub modifystudent { - my ($udom,$unam,$courseid,$csec)=@_; + my ($udom,$unam,$courseid,$csec,$desiredhost)=@_; # if $csec is undefined, drop the student from all the courses matching # this one. If $csec is defined, drop them from all other sections of # this course and add them to section $csec @@ -85,42 +82,93 @@ sub modifystudent { my %roles = &Apache::lonnet::dump('roles',$udom,$unam); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles - return if ($tmp =~ /^(con_lost|error|no_such_host)/i); + return "$1" if ($tmp =~ /^(con_lost|error|no_such_host)/i); # Go through the roles looking for enrollment in this course + my $result = ''; foreach my $course (keys(%roles)) { - my $value = $roles{$course}; - if ($course=~/^$courseid(?:\/)*(\w+)*\_st$/) { + if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) { # We are in this course my $section=$1; $section='' if ($course eq $courseid.'_st'); - if (((!$section) && (!$csec)) || ($section ne $csec)) { - my (undef,$end,$start)=split(/\_/,$course); + if ( ((!$section) && (!$csec)) || ($section ne $csec) ) { + my (undef,$end,$start)=split(/\_/,$roles{$course}); my $now=time; - if (($start) && ($end) && ($now>$start) && ($now<$end)) { + if (!($start && ($now<$start)) || !($end && ($now>$end))) { my $reply=&Apache::lonnet::modifystudent - ($udom,$unam,'','','','','','','',$section,time); + ($udom,$unam,'','','','','','','', + $section,time,undef,undef,$desiredhost); + $result .= $reply.':'; } } } } + if ($result eq '') { + $result eq 'Unable to find section for this student'; + } else { + $result =~ s/(ok:)+/ok/g; + } + return $result; +} + +# ============ build a domain and server selection form +sub domain_form { + my ($defdom) = @_; + # Set up domain and server selection forms + # + # Get the domains + my @domains = &Apache::loncommon::get_domains(); + # build up the menu information to be passed to + # &Apache::loncommon::linked_select_forms + my %select_menus; + foreach my $dom (@domains) { + # set up the text for this domain + $select_menus{$dom}->{'text'}= $dom; + # we want a choice of 'default' as the default in the second menu + $select_menus{$dom}->{'default'}= 'default'; + $select_menus{$dom}->{'select2'}->{'default'} = 'default'; + # Now build up the other items in the second menu + my %servers = &Apache::loncommon::get_library_servers($dom); + foreach my $server (keys(%servers)) { + $select_menus{$dom}->{'select2'}->{$server} + = "$server $servers{$server}"; + } + } + my $result = &Apache::loncommon::linked_select_forms + ('studentform',' with home server ',$defdom, + 'lcdomain','lcserver',\%select_menus); + return $result; } # ============================================================== Menu Phase One sub menu_phase_one { my $r=shift; my $upfile_select=&Apache::loncommon::upfile_select_html(); + my $create_classlist_help = + &Apache::loncommon::help_open_topic("Course_Create_Class_List", + "How do I create a class list from a spreadsheet"); + my $create_csv_help = + &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + "How do I create a CSV file from a spreadsheet"); $r->print(<

Upload a courselist

$upfile_select -

-


+

+
+$create_classlist_help
+$create_csv_help + +


Enroll a single student

-

-


+

+
+

Classlist

+

+

+

Drop students

-

+

ENDUPFORM } @@ -134,12 +182,14 @@ sub phase_two_header { } my $javascript_validations=&javascript_validations($krbdefdom); $r->print(<Uploading Class List

Identify fields

Total number of records found in file: $distotal
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 run your class.
- + + @@ -147,7 +197,7 @@ to this page if the data selected is ins
- @@ -156,36 +206,45 @@ ENDPICK sub javascript_validations { my ($krbdefdom)=@_; + my %param = ( formname => 'studentform', + kerb_def_dom => $krbdefdom ); + my $authheader = &Apache::loncommon::authform_header(%param); return (< 'document.studentform'); + my $krbform = &Apache::loncommon::authform_kerberos(%param); + my $intform = &Apache::loncommon::authform_internal(%param); + my $locform = &Apache::loncommon::authform_local(%param); + my $domform = &domain_form($defdom); $r->print(< @@ -416,22 +441,16 @@ sub phase_two_end {

Login Type

Note: this will not take effect if the user already exists

- -Kerberos authenticated with domain - +$krbform

- -Internally authenticated (with initial password -) +$intform

- -Local Authentication with argument - +$locform

LON-CAPA Domain for Students

-LON-CAPA domain:

+LON-CAPA domain: $domform

Starting and Ending Dates

@@ -452,7 +471,7 @@ LON-CAPA domain: Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)

-
+
Note: for large courses, this operation might be time consuming. ENDPICK } @@ -505,33 +524,57 @@ sub menu_phase_two_upload { sub enroll_single_student { my $r=shift; $r->print('

Enrolling Student

'); + $r->print('

Enrolling '.$ENV{'form.cuname'}." in domain ". + $ENV{'form.lcdomain'}.'

'); if (($ENV{'form.cuname'})&&($ENV{'form.cuname'}!~/\W/)&& - ($ENV{'form.cdomain'})&&($ENV{'form.cdomain'}!~/\W/)) { + ($ENV{'form.lcdomain'})&&($ENV{'form.lcdomain'}!~/\W/)) { + # Deal with home server selection + my $domain=$ENV{'form.lcdomain'}; + my $desiredhost = $ENV{'form.lcserver'}; + if (lc($desiredhost) eq 'default') { + $desiredhost = undef; + } else { + my %home_servers =&Apache::loncommon::get_library_servers($domain); + if (! exists($home_servers{$desiredhost})) { + $r->print('Error:'. + 'Invalid home server specified'); + return; + } + } + $r->print(" with server $desiredhost :") if (defined($desiredhost)); + # End of home server selection logic my $amode=''; my $genpwd=''; if ($ENV{'form.login'} eq 'krb') { - $amode='krb4'; - $genpwd=$ENV{'form.krbdom'}; + $amode='krb'; + $amode.=$ENV{'form.krbver'}; + $genpwd=$ENV{'form.krbarg'}; } elsif ($ENV{'form.login'} eq 'int') { $amode='internal'; - $genpwd=$ENV{'form.intpwd'}; + $genpwd=$ENV{'form.intarg'}; } elsif ($ENV{'form.login'} eq 'loc') { $amode='localauth'; $genpwd=$ENV{'form.locarg'}; if (!$genpwd) { $genpwd=" "; } } - if (($amode) && ($genpwd)) { - &modifystudent($ENV{'form.cdomain'},$ENV{'form.cuname'}, - $ENV{'request.course.id'},$ENV{'form.csec'}); + my $home = &Apache::lonnet::homeserver($ENV{'form.cuname'}, + $ENV{'form.lcdomain'}); + if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { + &modifystudent($ENV{'form.lcdomain'},$ENV{'form.cuname'}, + $ENV{'request.course.id'},$ENV{'form.csec'}, + $desiredhost); $r->print(&Apache::lonnet::modifystudent( - $ENV{'form.cdomain'},$ENV{'form.cuname'}, + $ENV{'form.lcdomain'},$ENV{'form.cuname'}, $ENV{'form.cstid'},$amode,$genpwd, $ENV{'form.cfirst'},$ENV{'form.cmiddle'}, $ENV{'form.clast'},$ENV{'form.cgen'}, $ENV{'form.csec'},$ENV{'form.enddate'}, - $ENV{'form.startdate'},$ENV{'form.forceid'})); + $ENV{'form.startdate'},$ENV{'form.forceid'}, + $desiredhost)); } else { - $r->print('Invalid login mode or password'); + $r->print('

ERROR '. + 'Invalid login mode or password. '. + 'Unable to enroll '.$ENV{'form.cuname'}.'.

'); } } else { $r->print('Invalid username or domain'); @@ -541,14 +584,23 @@ sub enroll_single_student { # ======================================================= Menu Phase Two Enroll sub menu_phase_two_enroll { my $r=shift; + $r->print("

Enroll One Student

"); my ($krbdefdom) = $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/; $krbdefdom=~tr/a-z/A-Z/; my $today = time; my $halfyear = $today+15552000; my $defdom=$r->dir_config('lonDefDomain'); my $javascript_validations=&javascript_validations($krbdefdom); + # Set up authentication forms + my %param = ( formname => 'document.studentform'); + my $krbform = &Apache::loncommon::authform_kerberos(%param); + my $intform = &Apache::loncommon::authform_internal(%param); + my $locform = &Apache::loncommon::authform_local(%param); + # Set up domain selection form + my $domform = &domain_form($defdom); + # Print it all out $r->print(< + +

@@ -714,7 +882,12 @@ END } } $r->print('
 usernamedomain

'); - $r->print(''); + $r->print(<<"END"); +

+   + +

+END } # ================================================= Drop/Add from uploaded file @@ -739,18 +912,30 @@ sub upfile_drop_add { my $enddate = $ENV{'form.enddate'}; if ($startdate=~/\D/) { $startdate=''; } if ($enddate=~/\D/) { $enddate=''; } - # + # Determine domain and desired host (home server) my $domain=$ENV{'form.lcdomain'}; + my $desiredhost = $ENV{'form.lcserver'}; + if (lc($desiredhost) eq 'default') { + $desiredhost = undef; + } else { + my %home_servers = &Apache::loncommon::get_library_servers($domain); + if (! exists($home_servers{$desiredhost})) { + $r->print('Error:'. + 'Invalid home server specified'); + return; + } + } # Determine authentication mechanism my $amode = ''; my $genpwd = ''; if ($ENV{'form.login'} eq 'krb') { - $amode='krb4'; - $genpwd=$ENV{'form.krbdom'}; + $amode='krb'; + $amode.=$ENV{'form.krbver'}; + $genpwd=$ENV{'form.krbarg'}; } elsif ($ENV{'form.login'} eq 'int') { $amode='internal'; - if ((defined($ENV{'form.intpwd'})) && ($ENV{'form.intpwd'})) { - $genpwd=$ENV{'form.intpwd'}; + if ((defined($ENV{'form.intarg'})) && ($ENV{'form.intarg'})) { + $genpwd=$ENV{'form.intarg'}; } } elsif ($ENV{'form.login'} eq 'loc') { $amode='localauth'; @@ -823,11 +1008,12 @@ sub upfile_drop_add { } } if ($password) { - &modifystudent($domain,$username,$cid,$sec); + &modifystudent($domain,$username,$cid,$sec, + $desiredhost); my $reply=&Apache::lonnet::modifystudent ($domain,$username,$id,$amode,$password, $fname,$mname,$lname,$gen,$sec,$enddate, - $startdate,$ENV{'form.forceid'}); + $startdate,$ENV{'form.forceid'},$desiredhost); if ($reply ne 'ok') { $r->print('

'. 'Error enrolling '.$username.': '. @@ -854,9 +1040,12 @@ sub upfile_drop_add { if ($ENV{'form.fullup'} eq 'yes') { $r->print('

Dropping Students

'); # Get current classlist - my %currentlist=&get_current_classlist + my ($error,%currentlist)=&get_current_classlist ($ENV{'course.'.$cid.'.domain'}, $ENV{'course.'.$cid.'.num'}); + if (defined($error)) { + $r->print('
ERROR:$error
'); + } if (defined(%currentlist)) { # Drop the students foreach (@studentdata) { @@ -870,8 +1059,7 @@ sub upfile_drop_add { # Print out list of dropped students &show_drop_list($r,%currentlist); } else { - $r->print(''. - '

Could not access classlist

'); + $r->print("There are no students currently enrolled.\n"); } } } # end of unless @@ -881,10 +1069,21 @@ sub upfile_drop_add { sub drop_student_list { my $r=shift; my $count=0; - foreach (@{$ENV{'form.droplist'}}) { + my @droplist; + if (ref($ENV{'form.droplist'})) { + @droplist = @{$ENV{'form.droplist'}}; + } else { + @droplist = ($ENV{'form.droplist'}); + } + foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); - &modifystudent($udom,$uname,$ENV{'request.course.id'}); - $r->print('Dropped '.$uname.' at '.$udom.'
'); + my $result = &modifystudent($udom,$uname,$ENV{'request.course.id'}); + if ($result eq 'ok' || $result eq 'ok:') { + $r->print('Dropped '.$uname.' at '.$udom.'
'); + } else { + $r->print('Error dropping '.$uname.' at '.$udom.': '.$result. + '
'); + } $count++; } $r->print('

Dropped '.$count.' student(s).'); @@ -894,7 +1093,6 @@ sub drop_student_list { # ================================================================ Main Handler sub handler { my $r=shift; - $Apache::lonxml::debug=1; if ($r->header_only) { $r->content_type('text/html'); $r->send_http_header; @@ -904,9 +1102,9 @@ sub handler { if (($ENV{'request.course.fn'}) && (&Apache::lonnet::allowed('cst',$ENV{'request.course.id'}))) { # Start page - $r->content_type('text/html'); + $r->content_type('text/html') if (! exists($ENV{'form.viewcsv'})); $r->send_http_header; - &header($r); + $r->print(&header()) if (! exists($ENV{'form.viewcsv'})); # Phase one, initial screen unless ($ENV{'form.phase'}) { &menu_phase_one($r); @@ -927,6 +1125,10 @@ sub handler { &menu_phase_two_enroll($r); } elsif ($ENV{'form.drop'}) { &menu_phase_two_drop($r); + } elsif ($ENV{'form.view'}) { + &menu_phase_two_view($r); + } elsif ($ENV{'form.viewcsv'}) { + &menu_phase_two_viewcsv($r); } } # Phase three @@ -944,7 +1146,7 @@ sub handler { &enroll_single_student($r); } # End - $r->print('

'); + $r->print('') if (! exists($ENV{'form.viewcsv'})); } else { # Not in a course, or not allowed to modify parms $ENV{'user.error.msg'}=