--- loncom/interface/Attic/londropadd.pm 2006/11/23 00:17:01 1.149 +++ loncom/interface/Attic/londropadd.pm 2008/11/17 15:48:46 1.175 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to drop and add students in courses # -# $Id: londropadd.pm,v 1.149 2006/11/23 00:17:01 albertel Exp $ +# $Id: londropadd.pm,v 1.175 2008/11/17 15:48:46 jms Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,8 +26,23 @@ # http://www.lon-capa.org/ # # -############################################################### -############################################################## + +=head1 NAME + +Apache::londropadd + +=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; @@ -40,11 +55,16 @@ 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(<<ENDHEAD); $start_page <form method="post" enctype="multipart/form-data" @@ -52,16 +72,21 @@ $start_page ENDHEAD } -############################################################### -############################################################### -# Drop student from all sections of a course, except optional $csec +=pod + +=item modifystudent() + + Drop student from all sections of a course, except optional $csec + +=cut + sub modifystudent { 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 - $courseid=~s/\_/\//g; - $courseid=~s/^(\w)/\/$1/; + my $cdom = $env{'course.'.$courseid.'.domain'}; + my $cnum = $env{'course.'.$courseid.'.num'}; my %roles = &Apache::lonnet::dump('roles',$udom,$unam); my ($tmp) = keys(%roles); # Bail out if we were unable to get the students roles @@ -69,10 +94,10 @@ sub modifystudent { # Go through the roles looking for enrollment in this course my $result = ''; foreach my $course (keys(%roles)) { - if ($course=~/^$courseid(?:\/)*(?:\s+)*(\w+)*\_st$/) { + if ($course=~m{^/\Q$cdom\E/\Q$cnum\E(?:\/)*(?:\s+)*(\w+)*\_st$}) { # We are in this course my $section=$1; - $section='' if ($course eq $courseid.'_st'); + $section='' if ($course eq "/$cdom/$cnum".'_st'); if (defined($csec) && $section eq $csec) { $result .= 'ok:'; } elsif ( ((!$section) && (!$csec)) || ($section ne $csec) ) { @@ -97,15 +122,20 @@ sub modifystudent { return $result; } -############################################################### -############################################################### -# build a domain and server selection form +=pod + +=item domain_form() + + build a domain and server selection form + +=cut + 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; @@ -116,7 +146,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}"; @@ -128,64 +158,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 => $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 => 'Delete an existing group', -# help => 'Course_Delete_Group', -# permission => $grp_manage_permission, -# url => '/adm/coursegroups?refpage=enrl&action=delete', -# }, { 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 = ''; @@ -210,13 +252,15 @@ sub print_main_menu { return; } -############################################################### -############################################################### + + sub hidden_input { my ($name,$value) = @_; return '<input type="hidden" name="'.$name.'" value="'.$value.'" />'."\n"; } + + sub print_upload_manager_header { my ($r,$datatoken,$distotal,$krbdefdom)=@_; my $javascript; @@ -248,8 +292,9 @@ sub print_upload_manager_header { $password_choice = 'int'; } # - my $javascript_validations=&javascript_validations('auth',$krbdefdom, - $password_choice); + my $javascript_validations = + &javascript_validations('auth',$krbdefdom,$password_choice,undef, + $env{'request.role.domain'}); my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); $r->print('<h3>'.&mt('Uploading Class List')."</h3>\n". "<hr>\n". @@ -276,10 +321,12 @@ sub print_upload_manager_header { $javascript."\n".$javascript_validations.'</script>'); } -############################################################### -############################################################### + + + + sub javascript_validations { - my ($mode,$krbdefdom,$curr_authtype,$curr_authfield)=@_; + my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain)=@_; my $authheader; if ($mode eq 'auth') { my %param = ( formname => 'studentform', @@ -288,7 +335,7 @@ sub javascript_validations { $authheader = &Apache::loncommon::authform_header(%param); } elsif ($mode eq 'createcourse') { my %param = ( formname => 'ccrs', - kerb_def_dom => $krbdefdom, + kerb_def_dom => $krbdefdom, curr_authtype => $curr_authtype ); $authheader = &Apache::loncommon::authform_header(%param); } elsif ($mode eq 'modifycourse') { @@ -317,6 +364,7 @@ sub javascript_validations { my $function_name =(<<END); function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail) { END + my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($domain); my $auth_checks; if ($mode eq 'createcourse') { $auth_checks .= (<<END); @@ -331,9 +379,13 @@ END $auth_checks .= (<<END); var foundatype=0; if (founduname==0) { - alert('$alert{'username'}'); + alert('$alert{'username'}'); return; } + +END + if ($authnum > 1) { + $auth_checks .= (<<END); // alert('current.radiovalue = '+current.radiovalue); if (current.radiovalue == null || current.radiovalue == '' || current.radiovalue == 'nochange') { // They did not check any of the login radiobuttons. @@ -341,6 +393,7 @@ END return; } END + } } if ($mode eq 'createcourse') { $auth_checks .= " @@ -402,7 +455,7 @@ END } END } else { - $section_checks = §ion_check_js(); + $section_checks = &Apache::lonuserutils::section_check_js(); $optional_checks = (<<END); var message=''; if (foundname==0) { @@ -450,8 +503,9 @@ END return $result; } -############################################################### -############################################################### + + + sub upload_manager_javascript_forward_associate { return(<<ENDPICK); function verify(vf,sec_caller) { @@ -543,8 +597,9 @@ function clearpwd(vf) { ENDPICK } -############################################################### -############################################################### + + + sub upload_manager_javascript_reverse_associate { return(<<ENDPICK); function verify(vf,sec_caller) { @@ -598,8 +653,9 @@ function clearpwd(vf) { ENDPICK } -############################################################### -############################################################### + + + sub print_upload_manager_footer { my ($r,$i,$keyfields,$defdom,$today,$halfyear)=@_; @@ -652,8 +708,9 @@ sub print_upload_manager_footer { return; } -############################################################### -############################################################### + + + sub print_upload_manager_form { my $r=shift; @@ -727,10 +784,12 @@ sub print_upload_manager_form { &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear); } -############################################################### -############################################################### + + + + sub enroll_single_student { - my $r=shift; + my ($r,$srcharray) = @_; # Remove non alphanumeric values from section $env{'form.csec'}=~s/\W//g; # @@ -738,23 +797,28 @@ sub enroll_single_student { # in the course is entirely separate from the action of enrolling the # student. Also, a failure in setting the dates as default is not fatal # to the process of enrolling / modifying a student. - my ($startdate,$enddate) = &get_dates_from_form(); + my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); if ($env{'form.makedatesdefault'}) { - $r->print(&make_dates_default($startdate,$enddate)); + $r->print(&Apache::lonuserutils::make_dates_default($startdate, + $enddate)); } $r->print('<h3>'.&mt('Enrolling Student').'</h3>'); - $r->print('<p>'.&mt('Enrolling').' '.$env{'form.cuname'}." \@ ". - $env{'form.lcdomain'}.'</p>'); - if (($env{'form.cuname'})&&($env{'form.cuname'}!~/\W/)&& - ($env{'form.lcdomain'})&&($env{'form.lcdomain'}!~/\W/)) { + $r->print('<p>'.&mt('Enrolling [_1] : [_2]',$env{'form.cuname'}, + $env{'form.lcdomain'}).'</p>'); + if (($env{'form.cuname'}) + && ($env{'form.cuname'} + eq &LONCAPA::clean_username($env{'form.cuname'})) + && ($env{'form.lcdomain'}) + && ($env{'form.lcdomain'} + eq &LONCAPA::clean_domain($env{'form.lcdomain'}))) { # 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); + my %home_servers =&Apache::lonnet::get_servers($domain,'library'); if (! exists($home_servers{$desiredhost})) { $r->print('<font color="#ff0000">'.&mt('Error').':</font>'. &mt('Invalid home server specified')); @@ -781,7 +845,7 @@ sub enroll_single_student { $env{'form.lcdomain'}); if ((($amode) && ($genpwd)) || ($home ne 'no_host')) { # Clean out any old roles the student has in this class. - &modifystudent($env{'form.lcdomain'},$env{'form.cuname'}, + &Apache::lonuserutils::modifystudent($env{'form.lcdomain'},$env{'form.cuname'}, $env{'request.course.id'},$env{'form.csec'}, $desiredhost); my $login_result = &Apache::lonnet::modifystudent @@ -810,6 +874,22 @@ sub enroll_single_student { } else { $r->print(&mt('Invalid username or domain')); } + $r->print("<p><a href='/adm/dropadd?action=enrollstudent'>".&mt("Enroll another student")."</a></p>"); + if (ref($srcharray) eq 'ARRAY') { + foreach my $item (@{$srcharray},'ccuname','ccdomain') { + $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n"); + } + } + foreach my $item ('sortby','seluname','seludom') { + if (exists($env{'form.'.$item})) { + $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n"); + } + } + $r->print('<input type="hidden" name="phase" value="get_user_info" />'."\n". + '<input type="hidden" name="currstate" value="" />'."\n". + '<input type="hidden" name="prevphase" value="" />'."\n". + '<input type="hidden" name="action" value="enrollstudent" />'."\n". + '<input type="hidden" name="state" value="gotusername" />'); } sub setup_date_selectors { @@ -873,7 +953,8 @@ sub date_setting_table { my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); my $dateDefault = '<nobr>'. '<label><input type="checkbox" name="makedatesdefault" /> '. - &mt('make these dates the default for future enrollment').'</label>'; + &mt('make these dates the default for future enrollment'). + '</label></nobr>'; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; } @@ -918,13 +999,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". + '<script type="text/javascript">'."\n". + &Apache::lonhtmlcommon::set_form_elements($elements->{'studentform'}). + '</script>'."\n"; + my %lt=&Apache::lonlocal::texthash( 'eos' => "Enroll One Student", 'usr' => "Username", @@ -932,36 +1032,49 @@ sub get_student_username_domain_form { 'been' => "Begin Enrollment", ); $r->print(<<END); -<input type="hidden" name="action" value="enrollstudent" /> -<input type="hidden" name="state" value="gotusername" /> +$jscript <h3>$lt{'eos'}</h3> -<table> -<tr><th>$lt{'usr'}:</th> - <td><input type="text" name="cuname" size="15" /></td></tr> -<tr><th>$lt{'dom'}:</th> - <td>$domform</td></tr> -<tr><th> </th> - <td> - <input type="submit" name="Begin Enrollment" value="$lt{'been'}" /> - </td></tr> -</table> -<script type="text/javascript"> -// the if prevents the script error if the browser can not handle this -if ( document.studentform.cuname ) { document.studentform.cuname.focus(); } -</script> 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"; +<input type="hidden" name="action" value="enrollstudent" /> +<input type="hidden" name="state" value="gotusername" /> +<input type="hidden" name="phase" value="get_user_info" /> +$userpicker +<input name="userrole" type="button" value="$srchbutton" onclick="javascript:validateEntry(document.studentform)" /> +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("<h3>".&mt('Enroll One Student')."</h3>"); # - 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') { @@ -971,11 +1084,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 @@ -986,7 +1122,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 = '<select name="lcserver" size="1">'."\n". '<option value="default" selected>default</option>'."\n"; while (my ($servername,$serverdescription) = each (%servers)) { @@ -997,48 +1133,51 @@ sub print_enroll_single_student_form { # # my %lt=&Apache::lonlocal::texthash( - 'udf' => "User Data for", + 'udf' => "Personal Data", 'fn' => "First Name", 'mn' => "Middle Name", 'ln' => "Last Name", 'gen' => "Generation", 'hs' => "Home Server", - 'pswd' => "Password", + 'pswd' => "Login Data", 'psam' => "Please select an authentication mechanism", 'mail' => "Email Address" ); my $authhelp=&Apache::loncommon::help_open_topic('Auth_Options'); $user_data_html = <<END; -<h3>$lt{'udf'} $username\@$domain</h3> +<h3>$lt{'udf'} $ccuname:$ccdomain</h3> <table> -<tr><th>$lt{'fn'}:</th> - <td><input type="text" name="cfirst" size="15"></td></tr> -<tr><th>$lt{'mn'}:</th> - <td><input type="text" name="cmiddle" size="15"></td></tr> -<tr><th>$lt{'ln'}:</th> - <td><input type="text" name="clast" size="15"></td></tr> -<tr><th>$lt{'gen'}:</th> - <td><input type="text" name="cgen" size="5"> </td></tr> -<tr><th>$lt{'hs'}:</th> +<tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td> + <td><input type="text" name="cfirst" size="15" value="$inst_results{'firstname'}" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td> + <td><input type="text" name="cmiddle" size="15" value="$inst_results{'middlename'}" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td> + <td><input type="text" name="clast" size="15" value="$inst_results{'lastname'}" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td> + <td><input type="text" name="cgen" size="5" value="$inst_results{'generation'}" /> </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="lcserver">$lt{'hs'}</label>:</td> <td>$homeserver_form</td></tr> -<tr><th>$lt{'mail'}:</th> - <td><input type="text" name="emailaddress" size="20" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td> + <td><input type="text" name="emailaddress" size="20" value="$inst_results{'permanentemail'}" /></td></tr> </table> <h3>$lt{'pswd'}</h3> $lt{'psam'}$authhelp -<table> <p> -$krbform -<br /> -$intform -<br /> -$locform -</p> END + if ($krbform ne '') { + $user_data_html .= $krbform.'<br />'; + } + if ($intform ne '') { + $user_data_html .= $intform.'<br />'; + } + if ($locform ne '') { + $user_data_html .= $locform.'<br />'; + } + $user_data_html .= "\n</p>\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", @@ -1048,33 +1187,23 @@ END 'mail' => "Email Address", ); $user_data_html = <<END; -<h3>$lt{'udf'} $username\@$domain</h3> +<h3>$lt{'udf'} $ccuname:$ccdomain</h3> <input type="hidden" name="lcserver" value="default" /> <table> -<tr><th>$lt{'fn'}:</th> - <td> - <input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /> - </td></tr> -<tr><th>$lt{'mn'}:</th> - <td> - <input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /> - </td></tr> -<tr><th>$lt{'ln'}:</th> - <td> - <input type="text" name="clast"value="$uenv{'lastname'}" size="15" /> - </td></tr> -<tr><th>$lt{'gen'}:</th> - <td> - <input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> - </td></tr> -<tr><th>$lt{'mail'}:</th> - <td> - <input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" /> - </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cfirst">$lt{'fn'}</label>:</td> + <td><input type="text" name="cfirst" value="$uenv{'firstname'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cmiddle">$lt{'mn'}</label>:</td> + <td><input type="text" name="cmiddle" value="$uenv{'middlename'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="clast">$lt{'ln'}</label>:</td> + <td><input type="text" name="clast" value="$uenv{'lastname'}" size="15" /></td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="cgen">$lt{'gen'}</label>:</td> + <td><input type="text" name="cgen" value="$uenv{'generation'}" size="5" /> </td></tr> +<tr><td class="LC_dropadd_labeltext"><label for="emailaddress">$lt{'mail'}</label>:</td> + <td><input type="text" name="emailaddress" value="$uenv{'permanentemail'}" size="20" /></td></tr> </table> 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", @@ -1085,9 +1214,9 @@ END ); $r->print(<<END); <input type="hidden" name="action" value="enrollstudent" /> -<input type="hidden" name="state" value="done" /> -<input type="hidden" name="cuname" value="$username" /> -<input type="hidden" name="lcdomain" value="$domain" /> +<input type="hidden" name="state" value="gotusername" /> +<input type="hidden" name="cuname" value="$ccuname" /> +<input type="hidden" name="lcdomain" value="$ccdomain" /> <script type="text/javascript" language="Javascript"> function verify(vf,sec_caller) { var founduname=0; @@ -1132,26 +1261,45 @@ $user_data_html <h3>$lt{'cd'}</h3> -<p>$lt{'gs'}: <input type="text" name="csec" size="5" /> -<p> -$date_table +<p><label for="csec">$lt{'gs'}</label>: <input type="text" name="csec" size="5" /> </p> +$date_table <h3>$lt{'idsn'}</h3> <p> -$lt{'idsn'}: <input type="text" name="cstid" size="10"> +<label for="cstid">$lt{'idsn'}</label>: <input type="text" name="cstid" size="10" /> </p><p> <label> -<input type="checkbox" name="forceid" value="yes"> +<input type="checkbox" name="forceid" value="yes" /> $lt{'disn'} </label> </p><p> -<input type="button" onClick="verify(this.form,this.form.csec)" value="$lt{'eas'}"> +<input type="button" onClick="verify(this.form,this.form.csec)" value="$lt{'eas'}" /> </p> END + $r->print('<input type="hidden" name="currstate" value="" />'."\n". + '<input type="hidden" name="phase" value="" />'."\n". + '<input type="hidden" name="prevphase" value="'.$env{'form.phase'}.'" />'."\n"); + if (ref($srch) eq 'HASH') { + foreach my $item (sort(keys(%{$srch}))) { + $r->print('<input type="hidden" name="'.$item.'" value="'.$srch->{$item}.'" />'."\n"); + } + } + foreach my $item ('sortby','seluname','seludom') { + if (exists($env{'form.'.$item})) { + $r->print('<input type="hidden" name="'.$item.'" value="'.$env{'form.'.$item}.'" />'."\n"); + } + } return; } -# ========================================================= Menu Phase Two Drop +=pod + +=item print_drop_menu() + + Menu Phase Two Drop + +=cut + sub print_drop_menu { my $r=shift; $r->print("<h3>".&mt('Drop Students')."</h3>"); @@ -1166,9 +1314,17 @@ sub print_drop_menu { return; } -# ============================================== view classlist + +=pod + +=item print_html_classlist() + + view classlist + +=cut + sub print_html_classlist { - my ($r,$mode) = @_; + my ($r,$mode,$permission) = @_; if (! exists($env{'form.sortby'})) { $env{'form.sortby'} = 'username'; } @@ -1177,7 +1333,7 @@ sub print_html_classlist { } my $status_select = &Apache::lonhtmlcommon::StatusOptions ($env{'form.Status'}); - my $cid=$env{'request.course.id'}; + my $cid =$env{'request.course.id'}; my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; # @@ -1223,15 +1379,25 @@ sub print_html_classlist { $output_selector .= "\n".$option; } $output_selector .= '</select>'; - $r->print(&mt('Output Format: [_1]',$output_selector).(' 'x3)); + $r->print('<label>'.&mt('Output Format: [_1]',$output_selector).'</label>'.(' 'x3)); } - $r->print(&mt('Student Status: [_1]',$status_select)."\n"); + $r->print('<label>'.&mt('Student Status: [_1]',$status_select)."</label>\n"); $r->print('<input type="submit" value="'.&mt('Update Display').'" />'. "\n</p>\n"); # # Print the classlist $r->print('<h2>'.&mt('Current Class List').'</h2>'); my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist(); + + if (exists($permission->{'view_section'})) { + my $sec = &Apache::loncoursedata::CL_SECTION(); + foreach my $student (keys(%{$classlist})) { + if ($classlist->{$student}[$sec] ne $permission->{'view_section'}) { + delete($classlist->{$student}); + } + } + } + if (! defined($classlist)) { $r->print(&mt('There are no students currently enrolled.')."\n"); } else { @@ -1246,7 +1412,15 @@ sub print_html_classlist { } } -# =================================================== Show student list to drop + +=pod + +=item show_class_list() + + Show student list to drop + +=cut + sub show_class_list { my ($r,$mode,$linkto,$statusmode,$classlist,$keylist)=@_; my $cid=$env{'request.course.id'}; @@ -1270,6 +1444,11 @@ sub show_class_list { } my $displayphotos = $env{'form.displayphotos'}; + if (! exists($env{'form.displayclickers'})) { + $env{'form.displayclickers'} = 'off'; + } + my $displayclickers = $env{'form.displayclickers'}; + # Print out header unless ($mode eq 'autoenroll') { $r->print(<<END); @@ -1279,6 +1458,7 @@ END $r->print(<<END); <input type="hidden" name="sortby" value="$sortby" /> <input type="hidden" name="displayphotos" value="$displayphotos" /> +<input type="hidden" name="displayclickers" value="$displayclickers" /> END if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { if ($linkto eq 'aboutme') { @@ -1295,6 +1475,8 @@ END 'start' => "start date", 'end' => "end date", 'type' => "enroll type/action", + 'email' => "email address", + 'clicker'=> "clicker id", 'photo' => "photo", ); unless ($mode eq 'autoenroll') { @@ -1347,8 +1529,28 @@ function photowindow(photolink) { <a href="javascript:document.studentform.sortby.value='end';document.studentform.submit();">$lt{'end'}</a> </th><th> <a href="javascript:document.studentform.sortby.value='groups';document.studentform.submit();">$lt{'grp'}</a> + </th><th> + <a href="javascript:document.studentform.sortby.value='email';document.studentform.submit();">$lt{'email'}</a> </th> END + +# Clicker display on or off? + + my %clicker_options = &Apache::lonlocal::texthash( + 'on' => 'Show', + 'off' => 'Hide', + ); + my $clickerchg = 'on'; + if ($displayclickers eq 'on') { + $clickerchg = 'off'; + } + $r->print(' <th>'."\n".' '. + '<a href="javascript:document.studentform.displayclickers.value='. + "'".$clickerchg."'".';document.studentform.submit();">'. + $clicker_options{$clickerchg}.'</a> '.$lt{'clicker'}."\n". + ' </th>'."\n"); + +# Photo display on or off? if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { my %photo_options = &Apache::lonlocal::texthash( 'on' => 'Show', @@ -1365,6 +1567,9 @@ END ' </th>'."\n"); } $r->print(" </tr>\n"); + +# Done with the HTML header line + } elsif ($mode eq 'csv') { # # Open a file @@ -1373,9 +1578,9 @@ END time.'_'.rand(1000000000).'.csv'; unless ($CSVfile = Apache::File->new('>/home/httpd'.$CSVfilename)) { $r->log_error("Couldn't open $CSVfilename for output $!"); - $r->print("Problems occured in writing the csv file. ". - "This error has been logged. ". - "Please alert your LON-CAPA administrator."); + $r->print(&mt('Problems occurred in writing the csv file. ' + .'This error has been logged. ' + .'Please alert your LON-CAPA administrator.')); $CSVfile = undef; } # @@ -1390,13 +1595,15 @@ END print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","status","active groups")) + "section","start date","end date","status", + "active groups","email address")) .'"'."\n"; } else { print $CSVfile '"'.join('","',map { &Apache::loncommon::csv_translate(&mt($_)) } ("username","domain","ID","student name", - "section","start date","end date","active groups")).'"'."\n"; + "section","start date","end date", + "active groups","email address")).'"'."\n"; } } elsif ($mode eq 'excel') { # Create the excel spreadsheet @@ -1412,9 +1619,12 @@ END $excel_sheet->write($row++,0,["username","domain","ID", "student name","section", "start date","end date","status", - "active groups"], + "active groups","email address"], $format->{'bold'}); } + +# Done with header lines in all formats + # # Sort the students my %index; @@ -1451,10 +1661,17 @@ END my $name = $sdata->[$index{'fullname'}]; my $id = $sdata->[$index{'id'}]; my $status = $sdata->[$index{'status'}]; + next if (($statusmode ne 'Any') && ($status ne $statusmode)); my $start = $sdata->[$index{'start'}]; my $end = $sdata->[$index{'end'}]; my $type = $sdata->[$index{'type'}]; - next if (($statusmode ne 'Any') && ($status ne $statusmode)); + + my %emails = &Apache::loncommon::getemails($username,$domain); + my $email; + if ($emails{'permanentemail'} =~ /\S/) { + $email = $emails{'permanentemail'}; + } + if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { if (! defined($start) || $start == 0) { $start = &mt('none'); @@ -1514,7 +1731,21 @@ END <td>$start</td> <td>$end</td> <td>$active_groups</td> + <td>$email</td> END + +# Clickers + if ($displayclickers eq 'on') { + my $clickers = + (&Apache::lonnet::userenvironment($domain,$username,'clickers'))[1]; + if ($clickers!~/\w/) { $clickers='-'; } + $r->print('<td>'.$clickers.'</td>'); + } else { + $r->print(' <td> </td> '); + } + +# Photos + if ($env{'course.'.$env{'request.course.id'}. '.internal.showphoto'}) { if ($displayphotos eq 'on') { @@ -1550,6 +1781,7 @@ END push @line,&Apache::loncommon::csv_translate($status); } push @line,&Apache::loncommon::csv_translate($active_groups); + push @line,&Apache::loncommon::csv_translate($email); print $CSVfile '"'.join('","',@line).'"'."\n"; } elsif ($mode eq 'excel') { $excel_sheet->write($row,0,[$username,$domain,$id, @@ -1566,6 +1798,7 @@ END } $excel_sheet->write($row,$col++,$status); $excel_sheet->write($row,$col++,$active_groups); + $excel_sheet->write($row,$col++,$email); $row++; } } @@ -1589,9 +1822,14 @@ END } -# -# print out form for modification of a single students data -# +=pod + +=item print_modify_student_form() + + print out form for modification of a single students data + +=cut + sub print_modify_student_form { my $r = shift(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, @@ -1602,8 +1840,8 @@ sub print_modify_student_form { # determine the students name information my %info=&Apache::lonnet::get('environment', ['firstname','middlename', - 'lastname','generation','id'], - $sdom, $sname); + 'lastname','generation','id', + 'permanentemail'], $sdom, $sname); my ($tmp) = keys(%info); if ($tmp =~ /^(con_lost|error|no_such_host)/i) { $r->print('<font color="#ff0000" size="+2">'.&mt('Error').'</font>'. @@ -1642,7 +1880,8 @@ sub print_modify_student_form { &Apache::lonlocal::locallocaltime($endtime)).'<br />'; } - my $date_table = &date_setting_table($starttime,$endtime); + my $date_table = + &Apache::lonuserutils::date_setting_table($starttime,$endtime); # if (! exists($env{'form.Status'}) || $env{'form.Status'} !~ /^(Any|Expired|Active|Future)$/) { @@ -1657,13 +1896,14 @@ sub print_modify_student_form { 'mn' => "Middle", 'ln' => "Last", 'gen' => "Generation", + 'email' => "E-mail address", 'sid' => "Student ID", 'disn' => "Disable ID/Student Number Safeguard and Force Change of Conflicting IDs (only do if you know what you are doing)", 'sec' => "Section", 'sm' => "Submit Modifications", ); # Check if section name is valid - my $section_check = §ion_check_js(); + my $section_check = &Apache::lonuserutils::section_check_js(); $r->print(<<"END"); <script type="text/javascript"> $section_check @@ -1686,8 +1926,8 @@ $lt{'odcc'} <input type="hidden" name="state" value="done" /> <input type="hidden" name="sortby" value="$sortby" /> <input type="hidden" name="Status" value="$env{'form.Status'}" /> -<h2>$lt{'mef'} $info{'firstname'} $info{'middlename'} -$info{'lastname'} $info{'generation'}, $sname\@$sdom</h2> +<h3>$lt{'mef'} $info{'firstname'} $info{'middlename'} +$info{'lastname'} $info{'generation'}, $sname:$sdom</h3> <p> <b>$lt{'sn'}</b> <table> @@ -1699,14 +1939,16 @@ $info{'lastname'} $info{'generation'}, $ <input type="text" name="generation" value="$info{'generation'}" /></td></tr> </table> </p><p> -<b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12"/> +<b>$lt{'email'}</b>: <input type="text" name="permanentemail" value="$info{'permanentemail'}" size="30" /> +</p><p> +<b>$lt{'sid'}</b>: <input type="text" name="id" value="$info{'id'}" size="12" /> </p><p> <label> -<input type="checkbox" name="forceid" > +<input type="checkbox" name="forceid" /> $lt{'disn'} </label> </p><p> -<b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14"/> +<b>$lt{'sec'}</b>: <input type="text" name="section" value="$section" size="14" /> </p> <p>$current_date_description</p> <p>$date_table</p> @@ -1716,9 +1958,15 @@ END return; } -# -# modify a single students section -# + +=pod + +=item modify_single_student() + + modify a single students section + +=cut + sub modify_single_student { my ($r) = @_; # @@ -1726,9 +1974,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 @@ -1742,13 +1991,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; @@ -1758,6 +2007,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'}; @@ -1782,65 +2032,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(<<END); - <h2>$lt{'mdu'} $slogin \@ $sdom </h2> -<h3>$lt{'si'}</h3> -<table rules="rows" border="1" cellpadding="3" > -<tr> - <th> $lt{'fd'} </th> - <th> $lt{'ov'} </th> - <th> $lt{'nv'} </th> -</tr> -<tr> - <td> <b>$lt{'fn'}</b> </td> - <td> $old{'firstname'} </td> - <td> $firstname </td> -</tr><tr> - <td> <b>$lt{'mn'}</b> </td> - <td> $old{'middlename'} </td> - <td> $middlename </td> -</tr><tr> - <td> <b>$lt{'ln'}</b> </td> - <td> $old{'lastname'} </td> - <td> $lastname </td> -</tr><tr> - <td> <b>$lt{'gen'}</b> </td> - <td> $old{'generation'} </td> - <td> $generation </td> -</tr><tr> - <td> <b>ID</b> </td> - <td> $old{'id'} </td> - <td> $sid </td> -</tr><tr> - <td> <b>$lt{'sec'}</b> </td> - <td> $old{'section'} </td> - <td> $section</td> -</tr> -</table> -<h3>$lt{'ri'}</h3> + <h3>$lt{'mdu'} $slogin:$sdom </h3> +END + $r->print(<<END); <table> -<tr><td align="right"><b>$lt{'st'}:</b></td><td> $displayable_starttime </td></tr> -<tr><td align="right"><b>$lt{'et'}:</b></td><td> $displayable_endtime </td></tr> + <tr> + <td> + <table class="LC_nested_outer"> + <tr> + <th>$lt{si}</th> + </tr> + <tr> + <td> + <table class="LC_nested"> + <tr class="LC_info_row"> + <td class="LC_left_item"> $lt{'fd'} </td> + <td class="LC_left_item"> $lt{'ov'} </td> + <td class="LC_left_item"> $lt{'nv'} </td> + </tr> + <tr class="LC_odd_row"> + <td class="LC_left_item"> <b>$lt{'fn'}</b> </td> + <td class="LC_left_item"> $old{'firstname'} </td> + <td class="LC_left_item"> $firstname </td> + </tr> + <tr> + <td class="LC_left_item"> <b>$lt{'mn'}</b> </td> + <td class="LC_left_item"> $old{'middlename'} </td> + <td class="LC_left_item"> $middlename </td> + </tr> + <tr class="LC_odd_row"> + <td class="LC_left_item"> <b>$lt{'ln'}</b> </td> + <td class="LC_left_item"> $old{'lastname'} </td> + <td class="LC_left_item"> $lastname </td> + </tr> + <tr> + <td class="LC_left_item"> <b>$lt{'gen'}</b> </td> + <td class="LC_left_item"> $old{'generation'} </td> + <td class="LC_left_item"> $generation </td> + </tr> + <tr class="LC_odd_row"> + <td class="LC_left_item"> <b>ID</b> </td> + <td class="LC_left_item"> $old{'id'} </td> + <td class="LC_left_item"> $sid </td> + </tr> + <tr> + <td class="LC_left_item"> <b>$lt{'em'}</b> </td> + <td class="LC_left_item"> $old{'permanentemail'} </td> + <td class="LC_left_item"> $permanentemail </td> + <tr class="LC_odd_row"> + <td> <b>$lt{'sec'}</b> </td> + <td> $old{'section'} </td> + <td> $section</td> + </tr> + </table> + </td> + </tr> + </table> + <br /> + <table class="LC_nested_outer"> + <tr> + <th>$lt{'ri'}</th> + </tr> + <tr> + <td> + <table class="LC_nested"> + <tr class="LC_odd_row"> + <td class="LC_left_item"><b>$lt{'st'}:</b></td> + <td class="LC_right_item"> $displayable_starttime </td> + </tr> + <tr> + <td class="LC_left_item"><b>$lt{'et'}:</b></td> + <td class="LC_right_item"> $displayable_endtime </td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> </table> <p> 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.')."<br />"); + $r->print(&mt('An error occurred during the attempt to change the section for this student.')."<br />"); } 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/) { @@ -1848,8 +2144,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.')." <br />". @@ -1870,7 +2166,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 @@ -1880,7 +2177,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; @@ -1899,12 +2196,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: @@ -1924,8 +2219,6 @@ which describes the order elements are s =cut -################################################# -################################################# sub show_drop_list { my ($r,$classlist,$keylist,$nosort)=@_; my $cid=$env{'request.course.id'}; @@ -2085,9 +2378,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; @@ -2112,7 +2411,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); @@ -2159,7 +2466,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('<font color="#ff0000">'.&mt('Error').'</font>'. &mt('Invalid home server specified')); @@ -2193,7 +2500,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 ## ####################################### @@ -2227,7 +2535,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('<br />'. &mt('<b>[_1]</b>: Unacceptable username for user [_2] [_3] [_4] [_5]', $entries{$fields{'username'}},$fname,$mname,$lname,$gen). @@ -2287,8 +2596,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, @@ -2355,7 +2665,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).'<br>'); $count++; @@ -2396,12 +2707,35 @@ function validate(caller) { END } -################################################################### -################################################################### +sub get_permission { + my %permission; + $permission{'view'} = + &Apache::lonnet::allowed('vcl',$env{'request.course.id'}); + if (!$permission{'view'}) { + my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'}; + $permission{'view'} = &Apache::lonnet::allowed('vcl',$scope); + if ($permission{'view'}) { + $permission{'view_section'} = $env{'request.course.sec'}; + } + } + + $permission{'enrl'} = + &Apache::lonnet::allowed('cst',$env{'request.course.id'}); + + $permission{'grp_view'} = + &Apache::lonnet::allowed('vcg',$env{'request.course.id'}); + $permission{'grp_manage'} = + &Apache::lonnet::allowed('mdg',$env{'request.course.id'}); + my $allowed = 0; + foreach my $perm (values(%permission)) { + if ($perm) { $allowed=1; last; } + } + return (\%permission,$allowed); +} =pod -=item &handler +=item &handler() The typical handler you see in all these modules. Takes $r, the http request, as an argument. @@ -2428,8 +2762,6 @@ The response to the request is governed =cut -################################################################### -################################################################### sub handler { my $r=shift; if ($r->header_only) { @@ -2454,22 +2786,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; } @@ -2479,14 +2802,14 @@ 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(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission,$grp_manage_permission, - $grp_view_permission); - } elsif ($env{'form.action'} eq 'upload' && $enrl_permission) { + 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"}); @@ -2505,7 +2828,8 @@ 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"}); @@ -2518,58 +2842,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('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 = '<script type="text/javascript">'.$jsback.'</script>'; + &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('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('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(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment Manager')); - &print_main_menu($r,$enrl_permission,$view_permission); + &print_main_menu($r,$permission); } # # Finish up @@ -2577,10 +2972,12 @@ sub handler { return OK; } -################################################################### -################################################################### 1; __END__ +=pod +=back + +=cut