--- loncom/interface/Attic/londropadd.pm 2006/03/21 18:34:23 1.138 +++ loncom/interface/Attic/londropadd.pm 2012/04/24 21:05:15 1.179 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.138 2006/03/21 18:34:23 albertel Exp $ +# $Id: londropadd.pm,v 1.179 2012/04/24 21:05:15 droeschl Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,8 +26,23 @@ # http://www.lon-capa.org/ # # -############################################################### -############################################################## + +=head1 NAME + +Apache::londropadd.pm + +=head1 SYNOPSIS + +drop & add students + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=cut package Apache::londropadd; @@ -39,11 +54,17 @@ use Apache::Constants qw(:common :http R use Spreadsheet::WriteExcel; use Apache::lonstathelpers(); use Apache::lonlocal; +use Apache::longroup; +use LONCAPA(); -############################################################### -############################################################### sub header { - my $start_page=&Apache::loncommon::start_page('Enrollment Manager'); + my ($jscript,$loaditems) = @_; + my $start_page; + if (ref($loaditems) eq 'HASH') { + $start_page=&Apache::loncommon::start_page('Enrollment Manager',$jscript,{'add_entries' => $loaditems,}); + } else { + $start_page=&Apache::loncommon::start_page('Enrollment Manager',$jscript); + } return(<$end))) { - my $reply=&Apache::lonnet::modifystudent - # dom name id mode pass f m l g - ($udom,$unam,'', '', '',undef,undef,undef,undef, - $section,time,undef,undef,$desiredhost); - $result .= $reply.':'; - } - } - } - } - if ($result eq '') { - $result = 'Unable to find section for this student'; - } else { - $result =~ s/(ok:)+/ok/g; - } - return $result; -} +=pod + +=item domain_form() + + build a domain and server selection form + +=cut -############################################################### -############################################################### -# 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(); + my @domains = &Apache::lonnet::all_domains(); # build up the menu information to be passed to # &Apache::loncommon::linked_select_forms my %select_menus; @@ -115,7 +96,7 @@ sub domain_form { $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); + my %servers = &Apache::lonnet::get_servers($dom,'library'); foreach my $server (keys(%servers)) { $select_menus{$dom}->{'select2'}->{$server} = "$server $servers{$server}"; @@ -127,64 +108,76 @@ sub domain_form { return $result; } -############################################################### -############################################################### -# Menu Phase One +=pod + +=item print_main_menu() + + Menu Phase One + +=cut + sub print_main_menu { - my ($r,$enrl_permission,$view_permission,$grp_manage_permission, - $grp_view_permission)=@_; + my ($r,$permission)=@_; # - my ($cdom,$cnum) = split/_/,$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; + my $cdom=$env{'course.'.$cid.'.domain'}; + my $cnum=$env{'course.'.$cid.'.num'}; my @menu = ( { text => 'Upload a class list', help => 'Course_Create_Class_List', action => 'upload', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Enroll a single student', help => 'Course_Add_Student', action => 'enrollstudent', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Modify student data', help => 'Course_Modify_Student_Data', action => 'modifystudent', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'View Class List', help => 'Course_View_Class_List', action => 'classlist', - permission => $view_permission, + permission => $permission->{'view'}, }, { text => 'Drop Students', help => 'Course_Drop_Student', action => 'drop', - permission => $enrl_permission, + permission => $permission->{'enrl'}, }, { text => 'Automated Enrollment Manager', - permission => &Apache::lonnet::auto_run($cnum,$cdom), + permission => (&Apache::lonnet::auto_run($cnum,$cdom) + && $permission->{'enrl'}), url => '/adm/populate', }, { text => 'Create a new group', help => 'Course_Create_Group', - permission => $grp_manage_permission, - url => '/adm/coursegroups?refpage=enrl&action=create', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=create', }, { text => 'Modify an existing group', help => 'Course_Modify_Group', - permission => $grp_manage_permission, - url => '/adm/coursegroups?refpage=enrl&action=modify', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=modify', }, { text => 'Delete an existing group', help => 'Course_Delete_Group', - permission => $grp_manage_permission, - url => '/adm/coursegroups?refpage=enrl&action=delete', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=delete', + }, + { text => 'Re-enable a deleted group', + help => 'Course_Reenable_Group', + permission => $permission->{'grp_manage'}, + url => '/adm/coursegroups?refpage=enrl&action=reenable', }, { text => 'Enter an existing group', help => 'Course_Display_Group', - permission => $grp_view_permission, - url => '/adm/coursegroups?refpage=enrl&action=view', + permission => $permission->{'grp_view'}, + url => '/adm/coursegroups?refpage=enrl&action=view', }, ); my $menu_html = ''; @@ -209,13 +202,15 @@ sub print_main_menu { return; } -############################################################### -############################################################### + + sub hidden_input { my ($name,$value) = @_; return ''."\n"; } + + sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; @@ -247,9 +242,10 @@ sub print_upload_manager_header { $password_choice = 'int'; } # - my $javascript_validations=&javascript_validations('auth',$krbdefdom, - $password_choice); - my $checked=(($env{'form.noFirstLine'})?' checked="1"':''); + my $javascript_validations = + &javascript_validations('auth',$krbdefdom,$password_choice,undef, + $env{'request.role.domain'}); + my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); $r->print('

'.&mt('Uploading Class List')."

\n". "
\n". '

'.&mt('Identify fields')."

\n"); @@ -268,17 +264,19 @@ sub print_upload_manager_header { $r->print(''); - $r->print(''; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } @@ -905,7 +940,8 @@ sub make_dates_default { $result .= "Set default start and end dates for course
"; # # Refresh the course environment - &Apache::lonnet::coursedescription($env{'request.course.id'}); + &Apache::lonnet::coursedescription($env{'request.course.id'}, + {'freshen_cache' => 1}); } else { $result .= &mt('Unable to set default dates for course').":".$put_result. '
'; @@ -913,13 +949,32 @@ sub make_dates_default { return $result; } -## -## Single student enrollment routines (some of them) -## +=pod + +=item get_student_username_domain_form() + + Single student enrollment routines (some of them) + +=cut + sub get_student_username_domain_form { - my $r = shift; - my $domform = &Apache::loncommon::select_dom_form - ($env{'course.'.$env{'request.course.id'}.'.domain'},'cudomain',0); + my ($r,$elements,$response,$srch,$forcenewuser) = @_; + my $loaditems = { + 'onload' => "javascript:setFormElements(document.studentform)", + }; + $r->print(&header(undef,$loaditems)); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'','')", + text=>"Single user search"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); + my $defdom=$env{'request.role.domain'}; + + my $jscript = &Apache::loncommon::studentbrowser_javascript()."\n". + ''."\n"; + my %lt=&Apache::lonlocal::texthash( 'eos' => "Enroll One Student", 'usr' => "Username", @@ -927,36 +982,49 @@ sub get_student_username_domain_form { 'been' => "Begin Enrollment", ); $r->print(< - +$jscript

$lt{'eos'}

- - - - - - - -
$lt{'usr'}:
$lt{'dom'}:$domform
  - -
- END + $r->print($response); + $r->print(&single_user_entry_form($defdom,$srch,$forcenewuser)); return; } +sub single_user_entry_form { + my ($dom,$srch,$forcenewuser) = @_; + my $userpicker = + &Apache::loncommon::user_picker($dom,$srch,$forcenewuser, + 'document.studentform'); + my $srchbutton = &mt('Search'); + my $output = <<"ENDDOCUMENT"; + + + +$userpicker + +ENDDOCUMENT + return $output; +} + sub print_enroll_single_student_form { - my $r=shift; + my ($r,$jscript,$ccuname,$ccdomain,$srch) = @_; + $r->print(&header($jscript)); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'','')", + text=>"Single user search"}); + if ($env{'form.phase'} eq 'userpicked') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'get_user_info','select')", + text=>"Select user",}); + } + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'$env{'form.phase'}','modify')", + text=>"Set enrollment",}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); $r->print("

".&mt('Enroll One Student')."

"); # - my $username = $env{'form.cuname'}; - my $domain = $env{'form.cudomain'}; - $username=~s/\W//gs; - $domain=~s/\W//gs; - my $home = &Apache::lonnet::homeserver($username,$domain); + my $home = &Apache::lonnet::homeserver($ccuname,$ccdomain); # $new_user flags whether we are creating a new user or using an old one my $new_user = 1; if ($home ne 'no_host') { @@ -966,11 +1034,34 @@ sub print_enroll_single_student_form { my $user_data_html = ''; my $javascript_validations = ''; if ($new_user) { + my $usertoadd; + my $instsrch = { + srchin => 'instd', + srchby => 'uname', + srchtype => 'exact', + srchterm => $ccuname, + srchdomain => $ccdomain, + }; + if (($instsrch->{'srchterm'} ne '') && ($instsrch->{'srchdomain'} ne '')) { + $usertoadd = $instsrch->{'srchterm'}.':'.$instsrch->{'srchdomain'}; + } + my (%dirsrch_results,%inst_results); + if ($usertoadd) { + if (&Apache::loncreateuser::directorysrch_check($instsrch) eq 'ok') { + %dirsrch_results = &Apache::lonnet::inst_directory_query($instsrch); + if (ref($dirsrch_results{$usertoadd}) eq 'HASH') { + %inst_results = %{$dirsrch_results{$usertoadd}}; + } + } + } + my $defdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; # Set up authentication forms my ($krbdef,$krbdefdom) = - &Apache::loncommon::get_kerberos_defaults($domain); - $javascript_validations=&javascript_validations('auth',$krbdefdom); + &Apache::loncommon::get_kerberos_defaults($ccdomain); + $javascript_validations = + &Apache::lonuserutils::javascript_validations('auth',$krbdefdom, + undef,undef,$ccdomain); my %param = ( formname => 'document.studentform', kerb_def_dom => $krbdefdom, kerb_def_auth => $krbdef @@ -981,7 +1072,7 @@ sub print_enroll_single_student_form { # # Set up domain selection form my $homeserver_form = ''; - my %servers = &Apache::loncommon::get_library_servers($domain); + my %servers = &Apache::lonnet::get_servers($ccdomain,'library'); $homeserver_form = ' -$lt{'mn'}: - -$lt{'ln'}: - -$lt{'gen'}: - -$lt{'hs'}: +: + +: + +: + +: + +: $homeserver_form -$lt{'mail'}: - +: +

$lt{'pswd'}

$lt{'psam'}$authhelp -

-$krbform -
-$intform -
-$locform -

END + if ($krbform ne '') { + $user_data_html .= $krbform.'
'; + } + if ($intform ne '') { + $user_data_html .= $intform.'
'; + } + if ($locform ne '') { + $user_data_html .= $locform.'
'; + } + $user_data_html .= "\n

\n" } else { # User already exists. Do not worry about authentication - my %uenv = &Apache::lonnet::dump('environment',$domain,$username); - $javascript_validations = &javascript_validations('noauth'); + my %uenv = &Apache::lonnet::dump('environment',$ccdomain,$ccuname); + $javascript_validations = &Apache::lonuserutils::javascript_validations('noauth'); my %lt=&Apache::lonlocal::texthash( 'udf' => "User Data for", 'fn' => "First Name", 'mn' => "Middle Name", 'ln' => "Last Name", 'gen' => "Generation", - 'mail' => "Email Address", + 'mail' => "E-mail Address", ); $user_data_html = <$lt{'udf'} $username\@$domain +

$lt{'udf'} $ccuname:$ccdomain

- - - - - - - - - - + + + + + + + + + +
$lt{'fn'}: - -
$lt{'mn'}: - -
$lt{'ln'}: - -
$lt{'gen'}: - -
$lt{'mail'}: - -
:
:
:
:
:
END } - my $date_table = &date_setting_table(); + my $date_table = &Apache::lonuserutils::date_setting_table(); # Print it all out my %lt=&Apache::lonlocal::texthash( 'cd' => "Course Data", - 'gs' => "Group/Section", + 'gs' => "Section", 'idsn' => "ID/Student Number", 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)", 'eas' => "Enroll as student", ); $r->print(< - - - + + +

$lt{'odcc'} @@ -1644,8 +1876,8 @@ $lt{'odcc'} -

$lt{'mef'} $info{'firstname'} $info{'middlename'} -$info{'lastname'} $info{'generation'}, $sname\@$sdom

+

$lt{'mef'} $info{'firstname'} $info{'middlename'} +$info{'lastname'} $info{'generation'}, $sname:$sdom

$lt{'sn'} @@ -1657,26 +1889,34 @@ $info{'lastname'} $info{'generation'}, $

-$lt{'sid'}: +$lt{'email'}: +

+$lt{'sid'}:

-$lt{'sec'}: +$lt{'sec'}:

$current_date_description

$date_table

- + END $r->print(&Apache::loncommon::end_page()); return; } -# -# modify a single students section -# + +=pod + +=item modify_single_student() + + modify a single students section + +=cut + sub modify_single_student { my ($r) = @_; # @@ -1684,9 +1924,10 @@ sub modify_single_student { $env{'form.section'} =~ s/\W//g; # # Do the date defaults first - my ($starttime,$endtime) = &get_dates_from_form(); + my ($starttime,$endtime) = &Apache::lonuserutils::get_dates_from_form(); if ($env{'form.makedatesdefault'}) { - $r->print(&make_dates_default($starttime,$endtime)); + $r->print(&Apache::lonuserutils::make_dates_default($starttime, + $endtime)); } # Get the 'sortby' and 'Status' variables so the user goes back to their # previous screen @@ -1700,13 +1941,13 @@ sub modify_single_student { # Get the old data my %old=&Apache::lonnet::get('environment', ['firstname','middlename', - 'lastname','generation','id'], - $sdom, $slogin); + 'lastname','generation','id', + 'permanentemail'],$sdom, $slogin); $old{'section'} = &Apache::lonnet::getsection($sdom,$slogin, $env{'request.course.id'}); my ($tmp) = keys(%old); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { - $r->print(&mt('There was an error determining the environment values for')." $slogin \@ $sdom."); + $r->print(&mt('There was an error determining the environment values for')." $slogin : $sdom."); return; } undef $tmp; @@ -1716,6 +1957,7 @@ sub modify_single_student { my $middlename = $env{'form.middlename'}; my $lastname = $env{'form.lastname'}; my $generation = $env{'form.generation'}; + my $permanentemail = $env{'form.permanentemail'}; my $section = $env{'form.section'}; my $courseid = $env{'request.course.id'}; my $sid = $env{'form.id'}; @@ -1740,65 +1982,111 @@ sub modify_single_student { 'mn' => "Middle name", 'ln' => "Last name", 'gen' => "Generation", + 'em' => "E-mail address", 'sec' => "Section", 'ri' => "Role Information", 'st' => "Start Time", 'et' => "End Time", ); $r->print(<$lt{'mdu'} $slogin \@ $sdom -

$lt{'si'}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$lt{'fd'} $lt{'ov'} $lt{'nv'}
$lt{'fn'} $old{'firstname'} $firstname
$lt{'mn'} $old{'middlename'} $middlename
$lt{'ln'} $old{'lastname'} $lastname
$lt{'gen'} $old{'generation'} $generation
ID $old{'id'} $sid
$lt{'sec'} $old{'section'} $section
-

$lt{'ri'}

+

$lt{'mdu'} $slogin:$sdom

+END + $r->print(< -$lt{'st'}: $displayable_starttime -$lt{'et'}: $displayable_endtime + + + + + + + + + +
$lt{si}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
$lt{'fd'} $lt{'ov'} $lt{'nv'}
$lt{'fn'} $old{'firstname'} $firstname
$lt{'mn'} $old{'middlename'} $middlename
$lt{'ln'} $old{'lastname'} $lastname
$lt{'gen'} $old{'generation'} $generation
ID $old{'id'} $sid
$lt{'em'} $old{'permanentemail'} $permanentemail
$lt{'sec'} $old{'section'} $section
+
+
+ + + + + + + +
$lt{'ri'}
+ + + + + + + + + +
$lt{'st'}: $displayable_starttime
$lt{'et'}: $displayable_endtime
+
+ +

END # # Send request(s) to modify data (final undef is for 'desiredhost', # which is a moot point because the student already has an account. - my $modify_section_results = &modifystudent($sdom,$slogin, - $env{'request.course.id'}, - $section,undef); + my $modify_section_results = + &Apache::lonuserutils::modifystudent($sdom,$slogin, + $env{'request.course.id'}, + $section,undef); if ($modify_section_results !~ /^ok/) { - $r->print(&mt('An error occured during the attempt to change the section for this student.')."
"); + $r->print(&mt('An error occurred during the attempt to change the section for this student.')."
"); } my $roleresults = &Apache::lonnet::modifystudent ($sdom,$slogin,$sid,undef,undef,$firstname,$middlename,$lastname, - $generation,$section,$endtime,$starttime,$env{'form.forceid'}); + $generation,$section,$endtime,$starttime,$env{'form.forceid'}, + undef,$permanentemail); + if ($old{'permanentemail'} ne $permanentemail) { + &Apache::loncommon::flush_email_cache($slogin,$sdom); + } if ($roleresults eq 'refused' ) { $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.')); } elsif ($roleresults !~ /ok/) { @@ -1806,8 +2094,8 @@ END &mt('The error reported was')." ". $roleresults); &Apache::lonnet::logthis("londropadd:failed attempt to modify student". - " data for ".$slogin." \@ ".$sdom." by ". - $env{'user.name'}." \@ ".$env{'user.domain'}. + " data for ".$slogin." : ".$sdom." by ". + $env{'user.name'}." : ".$env{'user.domain'}. ":".$roleresults); } else { # everything is okay! $r->print(&mt('Student information updated successfully.')."
". @@ -1828,7 +2116,8 @@ END sub get_enrollment_data { my ($sname,$sdomain) = @_; my $courseid = $env{'request.course.id'}; - $courseid =~ s:_:/:g; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$sdomain,$sname); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -1838,7 +2127,7 @@ sub get_enrollment_data { my $section = ''; my $count = scalar(keys(%roles)); while (my ($course,$role) = each(%roles)) { - if ($course=~ /^\/$courseid\/*\s*(\w+)*_st$/ ) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E/*\s*(\w+)*_st$} ) { # # Get active role $section=$1; @@ -1857,12 +2146,10 @@ sub get_enrollment_data { return ($start,$end,$section); } -################################################# -################################################# =pod -=item show_drop_list +=item show_drop_list() Display a list of students to drop Inputs: @@ -1882,8 +2169,6 @@ which describes the order elements are s =cut -################################################# -################################################# sub show_drop_list { my ($r,$classlist,$keylist,$nosort)=@_; my $cid=$env{'request.course.id'}; @@ -1892,9 +2177,13 @@ sub show_drop_list { ['sortby']); } my $sortby = $env{'form.sortby'}; - if ($sortby !~ /^(username|domain|section|fullname|id|start|end)$/) { + if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) { $sortby = 'username'; } + my $cdom = $env{'course.'.$cid.'.domain'}; + my $cnum = $env{'course.'.$cid,'.num'}; + my ($classgroups) = &Apache::loncoursedata::get_group_memberships( + $classlist,$keylist,$cdom,$cnum); # my $action = "drop"; $r->print(< "section", 'start' => "start date", 'end' => "end date", + 'groups' => "active groups", ); if ($nosort) { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1935,12 +2225,13 @@ my %lt=&Apache::lonlocal::texthash('usrn $lt{'sec'} $lt{'start'} $lt{'end'} + $lt{'groups'} END } else { + $r->print(&Apache::loncommon::start_data_table()); $r->print(<   $lt{'usrn'} @@ -1956,6 +2247,8 @@ END $lt{'start'} $lt{'end'} + + $lt{'groups'} END @@ -1967,6 +2260,7 @@ END foreach (@$keylist) { $index{$_} = $i++; } + $index{'groups'} = scalar(@$keylist); my $index = $index{$sortby}; my $second = $index{'username'}; my $third = $index{'domain'}; @@ -1987,6 +2281,11 @@ END my $id = $sdata->[$index{'id'}]; my $start = $sdata->[$index{'start'}]; my $end = $sdata->[$index{'end'}]; + my $groups = $classgroups->{$student}; + my $active_groups; + if (ref($groups->{active}) eq 'HASH') { + $active_groups = join(', ',keys(%{$groups->{'active'}})); + } if (! defined($start) || $start == 0) { $start = &mt('none'); } else { @@ -2000,8 +2299,8 @@ END my $status = $sdata->[$index{'status'}]; next if ($status ne 'Active'); # + $r->print(&Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - $username $domain @@ -2010,10 +2309,11 @@ END $section $start $end - + $active_groups END + $r->print(&Apache::loncommon::end_data_table_row()); } - $r->print('
'); + $r->print(&Apache::loncommon::end_data_table().'
'); %lt=&Apache::lonlocal::texthash( 'dp' => "Drop Students", 'ca' => "check all", @@ -2028,9 +2328,15 @@ END return; } -# -# Print out the initial form to get the courselist file -# + +=pod + +=item print_first_courselist_upload_form() + + Print out the initial form to get the courselist file + +=cut + sub print_first_courselist_upload_form { my $r=shift; my $str; @@ -2055,7 +2361,15 @@ sub print_first_courselist_upload_form { return; } -# ================================================= Drop/Add from uploaded file + +=pod + +=item upfile_drop_add() + + Drop/Add from uploaded file + +=cut + sub upfile_drop_add { my $r=shift; &Apache::loncommon::load_tmp_file($r); @@ -2102,7 +2416,7 @@ sub upfile_drop_add { if (lc($desiredhost) eq 'default') { $desiredhost = undef; } else { - my %home_servers = &Apache::loncommon::get_library_servers($domain); + my %home_servers = &Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print(''.&mt('Error').''. &mt('Invalid home server specified')); @@ -2136,7 +2450,8 @@ sub upfile_drop_add { $amode = ''; # This causes the loop below to be skipped } } - unless (($domain=~/\W/) || ($amode eq '')) { + if ( $domain eq &LONCAPA::clean_domain($domain) + && ($amode ne '')) { ####################################### ## Enroll Students ## ####################################### @@ -2144,6 +2459,8 @@ sub upfile_drop_add { my $count=0; my $flushc=0; my %student=(); + # Get information about course groups + my %curr_groups = &Apache::longroup::coursegroups(); # Get new classlist foreach (@studentdata) { my %entries=&Apache::loncommon::record_sep($_); @@ -2168,7 +2485,8 @@ sub upfile_drop_add { $gen=$entries{$fields{'gen'}}; } } - if ($entries{$fields{'username'}}=~/\W/) { + if ($entries{$fields{'username'}} + ne &LONCAPA::clean_username($entries{$fields{'username'}})) { $r->print('
'. &mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', $entries{$fields{'username'}},$fname,$mname,$lname,$gen). @@ -2184,6 +2502,17 @@ sub upfile_drop_add { } # remove non alphanumeric values from section $sec =~ s/\W//g; + if ($sec eq "none" || $sec eq 'all') { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a reserved word.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } elsif (($sec ne '') && (exists($curr_groups{$sec}))) { + $r->print('
'. + &mt('[_1]: Unable to enroll: section name "[_2]" for user [_3] [_4] [_5] [_6] is a course group. Section names and group names must be distinct.', + $username,$sec,$fname,$mname,$lname,$gen)); + next; + } # determine student id number my $id=''; if (defined($fields{'id'})) { @@ -2217,8 +2546,9 @@ sub upfile_drop_add { $$_ =~ s/(\s+$|^\s+)//g; } if ($password || $env{'form.login'} eq 'loc') { - &modifystudent($domain,$username,$cid,$sec, - $desiredhost); + &Apache::lonuserutils::modifystudent($domain, + $username,$cid, + $sec,$desiredhost); my $reply=&Apache::lonnet::modifystudent ($domain,$username,$id,$amode,$password, $fname,$mname,$lname,$gen,$sec,$enddate, @@ -2245,7 +2575,7 @@ sub upfile_drop_add { } } } # end of foreach (@studentdata) - $r->print("

\n

\n".&mt('Processed [_1] student(s).',$count). + $r->print("

\n

\n".&mt('Processed [quant,_1,student].',$count). "

\n"); $r->print("

\n". &mt('If active, the new role will be available when the '. @@ -2285,7 +2615,8 @@ sub drop_student_list { foreach (@droplist) { my ($uname,$udom)=split(/\:/,$_); # drop student - my $result = &modifystudent($udom,$uname,$env{'request.course.id'}); + my $result = &Apache::lonuserutils::modifystudent($udom,$uname, + $env{'request.course.id'}); if ($result eq 'ok' || $result eq 'ok:') { $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'
'); $count++; @@ -2295,16 +2626,66 @@ sub drop_student_list { '
'); } } - $r->print('

'.&mt('Dropped [_1] student(s).',$count).'

'); + $r->print('

'.&mt('Dropped [quant,_1,student].',$count).'

'); $r->print('

'.&mt('Re-enrollment will re-activate data.')) if ($count); } -################################################################### -################################################################### +sub section_check_js { + my $groupslist; + my %curr_groups = &Apache::longroup::coursegroups(); + if (%curr_groups) { + $groupslist = join('","',sort(keys(%curr_groups))); + } + return <<"END"; +function validate(caller) { + var groups = new Array("$groupslist"); + var secname = caller.value; + if ((secname == 'all') || (secname == 'none')) { + alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name."); + return 'error'; + } + if (secname != '') { + for (var k=0; kheader_only) { @@ -2357,22 +2736,13 @@ sub handler { return HTTP_NOT_ACCEPTABLE; } # - my $view_permission = - &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); - my $enrl_permission = - &Apache::lonnet::allowed('cst',$env{'request.course.id'}); - - my $grp_view_permission = - &Apache::lonnet::allowed('vcg',$env{'request.course.id'}); - my $grp_manage_permission = - &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); + my ($permission,$allowed) = &get_permission(); - if (! $grp_view_permission && ! $grp_manage_permission && - ! $view_permission && ! $enrl_permission) { + if (!$allowed) { $env{'user.error.msg'}= - "/adm/coursegroups:cst:0:0:Cannot manage or view course groups, ". - "or drop or add students"; + "/adm/dropadd:cst:0:0:Cannot manage or view course groups, ". + "or drop or add students"; return HTTP_NOT_ACCEPTABLE; } @@ -2382,20 +2752,19 @@ sub handler { # Start page &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - $r->print(&header()); # # Main switch on form.action and form.state, as appropriate if (! exists($env{'form.action'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission, - $grp_view_permission); - } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) { + $r->print(&header()); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); + my $action = &print_main_menu($r,$permission); + } elsif ($env{'form.action'} eq 'upload' && $permission->{'enrl'}) { + $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=upload&state=', text=>"Upload Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Upload Classlist','Course_Create_Class_List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Classlist', + 'Course_Create_Class_List')); if (! exists($env{'form.state'})) { &print_first_courselist_upload_form($r); } elsif ($env{'form.state'} eq 'got_file') { @@ -2409,12 +2778,13 @@ sub handler { } else { &print_first_courselist_upload_form($r); } - } elsif ($env{'form.action'} eq 'drop' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'drop' && $permission->{'enrl'}) { + $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=drop', text=>"Drop Students"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Drop Students','Course_Drop_Student')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); if (! exists($env{'form.state'})) { &print_drop_menu($r); } elsif ($env{'form.state'} eq 'done') { @@ -2422,59 +2792,129 @@ sub handler { } else { &print_drop_menu($r); } - } elsif ($env{'form.action'} eq 'enrollstudent' && $enrl_permission) { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/dropadd?action=enrollstudent', - text=>"Enroll Student"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enroll Student','Course_Add_Student')); - if (! exists($env{'form.state'})) { - &get_student_username_domain_form($r); - } elsif ($env{'form.state'} eq 'gotusername') { - &print_enroll_single_student_form($r); + } elsif ($env{'form.action'} eq 'enrollstudent' && $permission->{'enrl'}) { + my @search = ('srchterm','srchby','srchin','srchtype','srchdomain'); + my ($jsback,$elements) = &Apache::loncreateuser::crumb_utilities(); + my $jscript = ''; + &Apache::loncreateuser::restore_prev_selections(); + my $srch; + foreach my $item (@search) { + $srch->{$item} = $env{'form.'.$item}; + } + + if ($env{'form.state'} eq 'gotusername') { + if ($env{'form.phase'} eq 'get_user_info') { + my ($currstate,$response,$forcenewuser,$results) = + &Apache::loncreateuser::user_search_result($srch); + if ($env{'form.currstate'} eq 'modify') { + $currstate = $env{'form.currstate'}; + } + if ($currstate eq 'select') { + $r->print(&header()); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.usersrchform,'','')", + text=>"Single user search"}, + {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", + text=>"Select User",}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); + &Apache::loncreateuser::print_user_selection_page($r, + $response,$srch,$results,'enrollstudent',\@search); + } elsif ($currstate eq 'modify') { + my ($ccuname,$ccdomain); + if (($srch->{'srchby'} eq 'uname') && + ($srch->{'srchtype'} eq 'exact')) { + $ccuname = $srch->{'srchterm'}; + $ccdomain= $srch->{'srchdomain'}; + } else { + my @matchedunames = keys(%{$results}); + ($ccuname,$ccdomain) = split(/:/,$matchedunames[0]); + } + $ccuname =&LONCAPA::clean_username($ccuname); + $ccdomain=&LONCAPA::clean_domain($ccdomain); + &print_enroll_single_student_form($r,$jscript,$ccuname, + $ccdomain,$srch,$response); + } elsif ($currstate eq 'query') { + $r->print(&header($jscript)); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'','')", + text=>"Single user search"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); + &Apache::loncreateuser::print_user_query_page($r,'enrollstudent'); + } else { + &get_student_username_domain_form($r,$elements,$response, + $srch,$forcenewuser); + } + } elsif ($env{'form.phase'} eq 'userpicked') { + my $ccuname = &LONCAPA::clean_username($env{'form.seluname'}); + my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'}); + &print_enroll_single_student_form($r,$jscript,$ccuname, + $ccdomain,$srch); + } else { + &get_student_username_domain_form($r,$elements,undef,$srch); + } } elsif ($env{'form.state'} eq 'enrolling') { - &enroll_single_student($r); + $r->print(&header($jscript)); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'','')", + text=>"Single user search"}); + if ($env{'form.prevphase'} eq 'userpicked') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'get_user_info','select')", + text=>"Select user",}); + } + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.studentform,'$env{'form.prevphase'}','modify')", + text=>"Set enrollment",}, + {href=>"javascript:backPage(document.studentform,$env{'form.phase'},'')", + text=>"Result",}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enroll Student', + 'Course_Add_Student')); + &enroll_single_student($r,\@search); } else { - &get_student_username_domain_form($r); + &get_student_username_domain_form($r,$elements,undef,$srch); } - } elsif ($env{'form.action'} eq 'classlist' && $view_permission) { + } elsif ($env{'form.action'} eq 'classlist' && $permission->{'view'}) { + $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=classlist', text=>"View Classlist"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'View Classlist','Course_View_Class_List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('View Classlist', + 'Course_View_Class_List')); if (! exists($env{'form.state'})) { - &print_html_classlist($r,undef); + &print_html_classlist($r,undef,$permission); } elsif ($env{'form.state'} eq 'csv') { - &print_html_classlist($r,'csv'); + &print_html_classlist($r,'csv',$permission); } elsif ($env{'form.state'} eq 'excel') { - &print_html_classlist($r,'excel'); + &print_html_classlist($r,'excel',$permission); } else { - &print_html_classlist($r,undef); + &print_html_classlist($r,undef,$permission); } - } elsif ($env{'form.action'} eq 'modifystudent' && $enrl_permission) { + } elsif ($env{'form.action'} eq 'modifystudent' && $permission->{'enrl'}) { + $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/dropadd?action=modifystudent', text=>"Modify Student Data"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Modify Student Data','Course_Modify_Student_Data')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Modify Student Data', + 'Course_Modify_Student_Data')); if (! exists($env{'form.state'})) { - &print_html_classlist($r); + &print_html_classlist($r,undef,$permission); } elsif ($env{'form.state'} eq 'selected') { &print_modify_student_form($r); } elsif ($env{'form.state'} eq 'done') { &modify_single_student($r); } else { - &print_html_classlist($r); + &print_html_classlist($r,undef,$permission); } } else { # We should not end up here, but I guess it is possible &Apache::lonnet::logthis("Undetermined state in londropadd.pm. ". "form.action = ".$env{'form.action'}. "Someone should fix this."); - $r->print(&Apache::lonhtmlcommon::breadcrumbs - (undef,'Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission); + $r->print(&header()); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); + &print_main_menu($r,$permission); } # # Finish up @@ -2482,10 +2922,12 @@ sub handler { return OK; } -################################################################### -################################################################### 1; __END__ +=pod + +=back +=cut