--- loncom/interface/loncreateuser.pm 2007/12/21 15:33:32 1.217 +++ loncom/interface/loncreateuser.pm 2008/03/12 02:45:06 1.238 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.217 2007/12/21 15:33:32 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.238 2008/03/12 02:45:06 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -76,30 +76,30 @@ my $authformfsys; my $authformloc; sub initialize_authen_forms { - my ($dom,$curr_authtype,$mode) = @_; - my ($krbdefdom)=( $ENV{'SERVER_NAME'}=~/(\w+\.\w+)$/); - $krbdefdom= uc($krbdefdom); - my %param = ( formname => 'document.cu', + my ($dom,$formname,$curr_authtype,$mode) = @_; + my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom); + my %param = ( formname => $formname, kerb_def_dom => $krbdefdom, + kerb_def_auth => $krbdef, domain => $dom, ); my %abv_auth = &auth_abbrev(); - if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):$/) { + if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):(.*)$/) { my $long_auth = $1; + my $curr_autharg = $2; my %abv_auth = &auth_abbrev(); $param{'curr_authtype'} = $abv_auth{$long_auth}; if ($long_auth =~ /^krb(4|5)$/) { $param{'curr_kerb_ver'} = $1; + $param{'curr_autharg'} = $curr_autharg; } if ($mode eq 'modifyuser') { $param{'mode'} = $mode; } } -# no longer static due to configurable kerberos defaults -# $loginscript = &Apache::loncommon::authform_header(%param); + $loginscript = &Apache::loncommon::authform_header(%param); + $authformkrb = &Apache::loncommon::authform_kerberos(%param); $authformnop = &Apache::loncommon::authform_nochange(%param); -# no longer static due to configurable kerberos defaults -# $authformkrb = &Apache::loncommon::authform_kerberos(%param); $authformint = &Apache::loncommon::authform_internal(%param); $authformfsys = &Apache::loncommon::authform_filesystem(%param); $authformloc = &Apache::loncommon::authform_local(%param); @@ -156,21 +156,21 @@ END_SCRIPT $custom_off = ' '; $showquota = $currquota; if ($longinsttype eq '') { - $defaultinfo = &mt('For this user, the default quota would be [_1] - Mb.',$defquota); + $defaultinfo = &mt('For this user, the default quota would be [_1]' + .' Mb.',$defquota); } else { - $defaultinfo = &mt("For this user, the default quota would be [_1] - Mb, as determined by the user's institutional - affiliation ([_2]).",$defquota,$longinsttype); + $defaultinfo = &mt("For this user, the default quota would be [_1]". + " Mb, as determined by the user's institutional". + " affiliation ([_2]).",$defquota,$longinsttype); } } else { if ($longinsttype eq '') { - $defaultinfo = &mt('For this user, the default quota is [_1] - Mb.',$defquota); + $defaultinfo = &mt('For this user, the default quota is [_1]' + .' Mb.',$defquota); } else { - $defaultinfo = &mt("For this user, the default quota of [_1] - Mb, is determined by the user's institutional - affiliation ([_2]).",$defquota,$longinsttype); + $defaultinfo = &mt("For this user, the default quota of [_1]". + " Mb, is determined by the user's institutional". + " affiliation ([_2]).",$defquota,$longinsttype); } } my $output = $quota_javascript. @@ -220,6 +220,7 @@ sub print_username_entry_form { my %loaditems = ( 'onload' => "javascript:setFormElements(document.$formtoset)", ); + my %breadcrumb_text = &singleuser_breadcrumb(); my $start_page = &Apache::loncommon::start_page('User Management', $jscript,{'add_entries' => \%loaditems,}); @@ -230,32 +231,29 @@ sub print_username_entry_form { } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.crtuser)", - text=>"Single user search", + text=>$breadcrumb_text{'search'}, faq=>282,bug=>'Instructor Interface',}); } - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); + my $helpitem = 'Course_Change_Privileges'; + if ($env{'form.action'} eq 'custom') { + $helpitem = 'Course_Editing_Custom_Roles'; + } elsif ($env{'form.action'} eq 'singlestudent') { + $helpitem = 'Course_Add_Student'; + } + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', + $helpitem); my %existingroles=&Apache::lonuserutils::my_custom_roles(); my $choice=&Apache::loncommon::select_form('make new role','rolename', ('make new role' => 'Generate new role ...',%existingroles)); my %lt=&Apache::lonlocal::texthash( - 'srch' => "User Search", - or => "or", + 'srst' => 'Search for a user and enroll as a student', + 'srad' => 'Search for a user and modify/add user information or roles', 'usr' => "Username", 'dom' => "Domain", 'ecrp' => "Edit Custom Role Privileges", 'nr' => "Name of Role", 'cre' => "Custom Role Editor", - 'mod' => "to modify user information or add/modify roles", - 'enrl' => "to enroll one student", ); - my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface'); - my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); - my $helpsist=&Apache::loncommon::help_open_topic('Course_Add_Student'); - my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles'); - my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain'); - if ($sellink) { - $sellink = "$lt{'or'} ".$sellink; - } $r->print($start_page."\n".$crumbs); if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { @@ -263,19 +261,19 @@ sub print_username_entry_form {
-

$lt{'ecrp'}$helpecpr

+

$lt{'ecrp'}

$lt{'nr'}: $choice
ENDCUSTOM } } else { - my $actiontext = $lt{'mod'}.$helpsiur; + my $actiontext = $lt{'srad'}; if ($env{'form.action'} eq 'singlestudent') { - $actiontext = $lt{'enrl'}.$helpsist; + $actiontext = $lt{'srst'}; } $r->print(" -

$lt{'srch'} $sellink $actiontext

"); +

$actiontext

"); if ($env{'form.origform'} ne 'crtusername') { $r->print("\n".$response); } @@ -287,7 +285,7 @@ ENDCUSTOM sub entry_form { my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); - my $usertype; + my ($usertype,$inexact); if (ref($srch) eq 'HASH') { if (($srch->{'srchin'} eq 'dom') && ($srch->{'srchby'} eq 'uname') && @@ -297,6 +295,8 @@ sub entry_form { my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username'); $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules); + } else { + $inexact = 1; } } my $cancreate = @@ -305,6 +305,11 @@ sub entry_form { &Apache::loncommon::user_picker($dom,$srch,$forcenewuser, 'document.crtuser',$cancreate,$usertype); my $srchbutton = &mt('Search'); + if ($env{'form.action'} eq 'singlestudent') { + $srchbutton = &mt('Search and Enroll'); + } elsif ($cancreate && $responsemsg ne '' && $inexact) { + $srchbutton = &mt('Search or Add New User'); + } my $output = <<"ENDBLOCK";
@@ -313,33 +318,56 @@ $userpicker
ENDBLOCK - if ($cancreate && $env{'form.phase'} eq '') { + if ($env{'form.phase'} eq '') { my $defdom=$env{'request.role.domain'}; my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); - my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); my %lt=&Apache::lonlocal::texthash( + 'enro' => 'Enroll one student', + 'admo' => 'Add/modify a single user', + 'crea' => 'create new user if required', + 'uskn' => "username is known", 'crnu' => 'Create a new user', 'usr' => 'Username', 'dom' => 'in domain', - 'cra' => 'Create user', + 'enrl' => 'Enroll', + 'cram' => 'Create/Modify user', ); + my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain'); + my ($title,$buttontext,$showresponse); + if ($env{'form.action'} eq 'singlestudent') { + $title = $lt{'enro'}; + $buttontext = $lt{'enrl'}; + } else { + $title = $lt{'admo'}; + $buttontext = $lt{'cram'}; + } + if ($cancreate) { + $title .= ' ('.$lt{'crea'}.')'; + } else { + $title .= ' ('.$lt{'uskn'}.')'; + } + if ($env{'form.origform'} eq 'crtusername') { + $showresponse = $responsemsg; + } $output .= <<"ENDDOCUMENT"; +
- + -

$lt{crnu}$helpcrt

-$responsemsg +

$title

+$showresponse - + +
$lt{'usr'}:  $lt{'dom'}:$domform  $sellink  
@@ -377,7 +405,7 @@ END # =================================================================== Phase two sub print_user_selection_page { - my ($r,$response,$srch,$srch_results,$operation,$srcharray,$context) = @_; + my ($r,$response,$srch,$srch_results,$srcharray,$context) = @_; my @fields = ('username','domain','lastname','firstname','permanentemail'); my $sortby = $env{'form.sortby'}; @@ -412,27 +440,24 @@ ENDSCRIPT 'permanentemail' => "permanent e-mail", ); $r->print(&Apache::loncommon::start_page('User Management',$jscript)); - if ($operation eq 'createuser') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.usersrchform,'','')", - text=>"Create/modify user", - faq=>282,bug=>'Instructor Interface',}, - {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", - text=>"Select User", - faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + + my %breadcrumb_text = &singleuser_breadcrumb(); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.usersrchform,'','')", + text=>$breadcrumb_text{'search'}, + faq=>282,bug=>'Instructor Interface',}, + {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", + text=>$breadcrumb_text{'userpicked'}, + faq=>282,bug=>'Instructor Interface',}); + if ($env{'form.action'} eq 'singleuser') { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + 'Course_Change_Privileges')); $r->print("$lt{'usrch'}
"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'usel'}.'

'); - } elsif ($operation eq 'enrollstudent') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.usersrchform,'','')", - text=>"Create/modify student", - faq=>282,bug=>'Instructor Interface',}, - {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", - text=>"Select Student", - faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + } elsif ($env{'form.action'} eq 'singlestudent') { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + 'Course_Add_Student')); $r->print($jscript."$lt{'stusrch'}
"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'stusel'}.'

'); @@ -509,8 +534,7 @@ sub print_user_modification_page { $formname = 'cu'; } my %abv_auth = &auth_abbrev(); - my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser, - %alerts,%curr_rules,%got_rules); + my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules); my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain); if ($uhome eq 'no_host') { my $usertype; @@ -565,32 +589,10 @@ sub print_user_modification_page { } } else { $newuser = 0; - my $currentauth = - &Apache::lonnet::queryauthenticate($ccuname,$ccdomain); - if ($currentauth =~ /^(krb4|krb5|unix|internal|localauth):/) { - $curr_authtype = $abv_auth{$1}; - if ($currentauth =~ /^krb(4|5)/) { - $curr_kerb_ver = $1; - } - } } if ($response) { $response = '
'.$response; } - my $defdom=$env{'request.role.domain'}; - - my ($krbdef,$krbdefdom) = - &Apache::loncommon::get_kerberos_defaults($defdom); - - my %param = ( formname => 'document.cu', - kerb_def_dom => $krbdefdom, - kerb_def_auth => $krbdef, - curr_authtype => $curr_authtype, - curr_kerb_ver => $curr_kerb_ver, - domain => $ccdomain, - ); - $loginscript = &Apache::loncommon::authform_header(%param); - $authformkrb = &Apache::loncommon::authform_kerberos(%param); my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); my $dc_setcourse_code = ''; @@ -601,9 +603,12 @@ sub print_user_modification_page { my $js = &validation_javascript($context,$ccdomain,$pjump_def, $groupslist,$newuser,$formname,\%loaditem); + my $args = {'add_entries' => \%loaditem}; + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + } my $start_page = - &Apache::loncommon::start_page('User Management', - $js,{'add_entries' => \%loaditem,}); + &Apache::loncommon::start_page('User Management',$js,$args); my %breadcrumb_text = &singleuser_breadcrumb(); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage($form)", @@ -620,7 +625,12 @@ sub print_user_modification_page { ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')", text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}); - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); + my $helpitem = 'Course_Change_Privileges'; + if ($env{'form.action'} eq 'singlestudent') { + $helpitem = 'Course_Add_Student'; + } + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', + $helpitem); my $forminfo =<<"ENDFORMINFO";
@@ -643,7 +653,7 @@ ENDFORMINFO # Current user has quota modification privileges $portfolioform = '
'.&portfolio_quota($ccuname,$ccdomain); } - &initialize_authen_forms($ccdomain); + &initialize_authen_forms($ccdomain,$formname); my %lt=&Apache::lonlocal::texthash( 'cnu' => 'Create New User', 'ast' => 'as a student', @@ -764,8 +774,7 @@ ENDCHANGEUSER $r->print(&Apache::lonuserutils::forceid_change($context)); } $r->print(''); - my $user_auth_text = - &user_authentication($ccuname,$ccdomain,$krbdefdom,\%abv_auth); + my $user_auth_text = &user_authentication($ccuname,$ccdomain,$formname); my $user_quota_text; if (&Apache::lonnet::allowed('mpq',$ccdomain)) { # Current user has quota modification privileges @@ -809,141 +818,44 @@ ENDNOPORTPRIV &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses); } } ## End of new user/old user logic - my $addrolesdisplay = 0; - $r->print('

'.&mt('Add Roles').'

'); -# -# Co-Author -# - if (&Apache::lonuserutils::authorpriv($env{'user.name'}, - $env{'request.role.domain'}) && - ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { - # No sense in assigning co-author role to yourself - $addrolesdisplay = 1; - my $cuname=$env{'user.name'}; - my $cudom=$env{'request.role.domain'}; - my %lt=&Apache::lonlocal::texthash( - 'cs' => "Construction Space", - 'act' => "Activate", - 'rol' => "Role", - 'ext' => "Extent", - 'sta' => "Start", - 'end' => "End", - 'cau' => "Co-Author", - 'caa' => "Assistant Co-Author", - 'ssd' => "Set Start Date", - 'sed' => "Set End Date" - ); - $r->print('

'.$lt{'cs'}.'

'."\n". - &Apache::loncommon::start_data_table()."\n". - &Apache::loncommon::start_data_table_header_row()."\n". - ''.$lt{'act'}.''.$lt{'rol'}.''. - ''.$lt{'ext'}.''.$lt{'sta'}.''. - ''.$lt{'end'}.''."\n". - &Apache::loncommon::end_data_table_header_row()."\n". - &Apache::loncommon::start_data_table_row()."\n". - ' - - - '.$lt{'cau'}.' - '.$cudom.'_'.$cuname.' - - '.$lt{'ssd'}.' - -'.$lt{'sed'}.''."\n". - &Apache::loncommon::end_data_table_row()."\n". - &Apache::loncommon::start_data_table_row()."\n". -' -'.$lt{'caa'}.' -'.$cudom.'_'.$cuname.' - -'.$lt{'ssd'}.' - -'.$lt{'sed'}.''."\n". - &Apache::loncommon::end_data_table_row()."\n". - &Apache::loncommon::end_data_table()); - } elsif ($env{'request.role'} =~ /^au\./) { - if (!(&Apache::lonuserutils::authorpriv($env{'user.name'}, - $env{'request.role.domain'}))) { - $r->print(''. - &mt('You do not have privileges to assign co-author roles.'). - ''); - } elsif (($env{'user.name'} eq $ccuname) && - ($env{'user.domain'} eq $ccdomain)) { - $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted')); - } - } -# -# Domain level -# - my $num_domain_level = 0; - my $domaintext = - '

'.&mt('Domain Level').'

'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('Activate').''.&mt('Role').''. - &mt('Extent').''. - ''.&mt('Start').''.&mt('End').''. - &Apache::loncommon::end_data_table_header_row(); - foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) { - foreach my $role ('dc','li','dg','au','sc') { - if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) { - my $plrole=&Apache::lonnet::plaintext($role); - my %lt=&Apache::lonlocal::texthash( - 'ssd' => "Set Start Date", - 'sed' => "Set End Date" - ); - $num_domain_level ++; - $domaintext .= -&Apache::loncommon::start_data_table_row(). -' -'.$plrole.' -'.$thisdomain.' - -'.$lt{'ssd'}.' - -'.$lt{'sed'}.''. -&Apache::loncommon::end_data_table_row(); - } - } - } - $domaintext.= &Apache::loncommon::end_data_table(); - if ($num_domain_level > 0) { - $r->print($domaintext); - $addrolesdisplay = 1; - } -# -# Course level -# - if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) { - $r->print(&course_level_dc($1,'Course')); - $r->print('
'."\n"); - } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/$}) { - if ($addrolesdisplay) { - $r->print('
print(' onClick="verify_message(this.form)" \>'."\n"); + if ($env{'form.action'} eq 'singlestudent') { + $r->print('
'."\n"); + } else { + $r->print('

'.&mt('Add Roles').'

'); + my $addrolesdisplay = 0; + if ($context eq 'domain' || $context eq 'author') { + $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain); + } + if ($context eq 'domain') { + my $add_domainroles = &new_domain_roles($r); + if (!$addrolesdisplay) { + $addrolesdisplay = $add_domainroles; + } + $r->print(&course_level_dc($env{'request.role.domain'},'Course')); + $r->print('
'."\n"); + } elsif ($context eq 'author') { + if ($addrolesdisplay) { + $r->print('
print(' onClick="auth_check()" \>'."\n"); + } else { + $r->print('onClick="this.form.submit()" \>'."\n"); + } } else { - $r->print('onClick="this.form.submit()" \>'."\n"); + $r->print('
'. + &mt('Back to previous page').''); } } else { - $r->print('
'. - &mt('Back to previous page').''); + $r->print(&course_level_table(%inccourses)); + $r->print('
'."\n"); } - } else { - $r->print(&course_level_table(%inccourses)); - $r->print('
'."\n"); } $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); $r->print(''); $r->print(''); $r->print("
".&Apache::loncommon::end_page()); + return; } sub singleuser_breadcrumb { @@ -953,7 +865,7 @@ sub singleuser_breadcrumb { $breadcrumb_text{'userpicked'} = 'Select a user', $breadcrumb_text{'modify'} = 'Set section/dates', } else { - $breadcrumb_text{'search'} = 'Create/modify user'; + $breadcrumb_text{'search'} = 'Create/modify a user'; $breadcrumb_text{'userpicked'} = 'Select a user', $breadcrumb_text{'modify'} = 'Set user role', } @@ -983,26 +895,28 @@ sub validation_javascript { if ($context eq 'domain') { my $dcdom = $env{'request.role.domain'}; $loaditem->{'onload'} = "document.cu.coursedesc.value='';"; - $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser'); + $dc_setcourse_code = + &Apache::lonuserutils::dc_setcourse_js('cu','singleuser',$context); } else { - $nondc_setsection_code = - &Apache::lonuserutils::setsections_javascript($formname,$groupslist); + my $checkauth; + if (($newuser) || (&Apache::lonnet::allowed('mau',$ccdomain))) { + $checkauth = 1; + } + if ($context eq 'course') { + $nondc_setsection_code = + &Apache::lonuserutils::setsections_javascript($formname,$groupslist, + undef,$checkauth); + } + if ($checkauth) { + $nondc_setsection_code .= + &Apache::lonuserutils::verify_authen($formname,$context); + } } my $js = &user_modification_js($pjump_def,$dc_setcourse_code, $nondc_setsection_code,$groupslist); - my ($jsback,$elements) = &crumb_utilities(); - my $javascript_validations; - if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) { - my ($krbdef,$krbdefdom) = - &Apache::loncommon::get_kerberos_defaults($ccdomain); - $javascript_validations = - &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef, - undef,$ccdomain); - } $js .= "\n". - ''; + ''; return $js; } @@ -1208,23 +1122,128 @@ sub display_existing_roles { return; } +sub new_coauthor_roles { + my ($r,$ccuname,$ccdomain) = @_; + my $addrolesdisplay = 0; + # + # Co-Author + # + if (&Apache::lonuserutils::authorpriv($env{'user.name'}, + $env{'request.role.domain'}) && + ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { + # No sense in assigning co-author role to yourself + $addrolesdisplay = 1; + my $cuname=$env{'user.name'}; + my $cudom=$env{'request.role.domain'}; + my %lt=&Apache::lonlocal::texthash( + 'cs' => "Construction Space", + 'act' => "Activate", + 'rol' => "Role", + 'ext' => "Extent", + 'sta' => "Start", + 'end' => "End", + 'cau' => "Co-Author", + 'caa' => "Assistant Co-Author", + 'ssd' => "Set Start Date", + 'sed' => "Set End Date" + ); + $r->print('

'.$lt{'cs'}.'

'."\n". + &Apache::loncommon::start_data_table()."\n". + &Apache::loncommon::start_data_table_header_row()."\n". + ''.$lt{'act'}.''.$lt{'rol'}.''. + ''.$lt{'ext'}.''.$lt{'sta'}.''. + ''.$lt{'end'}.''."\n". + &Apache::loncommon::end_data_table_header_row()."\n". + &Apache::loncommon::start_data_table_row().' + + + + '.$lt{'cau'}.' + '.$cudom.'_'.$cuname.' + + '.$lt{'ssd'}.' + +'.$lt{'sed'}.''."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::start_data_table_row()."\n". +' +'.$lt{'caa'}.' +'.$cudom.'_'.$cuname.' + +'.$lt{'ssd'}.' + +'.$lt{'sed'}.''."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::end_data_table()); + } elsif ($env{'request.role'} =~ /^au\./) { + if (!(&Apache::lonuserutils::authorpriv($env{'user.name'}, + $env{'request.role.domain'}))) { + $r->print(''. + &mt('You do not have privileges to assign co-author roles.'). + ''); + } elsif (($env{'user.name'} eq $ccuname) && + ($env{'user.domain'} eq $ccdomain)) { + $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted')); + } + } + return $addrolesdisplay;; +} + +sub new_domain_roles { + my ($r) = @_; + my $addrolesdisplay = 0; + # + # Domain level + # + my $num_domain_level = 0; + my $domaintext = + '

'.&mt('Domain Level').'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ''.&mt('Activate').''.&mt('Role').''. + &mt('Extent').''. + ''.&mt('Start').''.&mt('End').''. + &Apache::loncommon::end_data_table_header_row(); + foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) { + foreach my $role ('dc','li','dg','au','sc') { + if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) { + my $plrole=&Apache::lonnet::plaintext($role); + my %lt=&Apache::lonlocal::texthash( + 'ssd' => "Set Start Date", + 'sed' => "Set End Date" + ); + $num_domain_level ++; + $domaintext .= +&Apache::loncommon::start_data_table_row(). +' +'.$plrole.' +'.$thisdomain.' + +'.$lt{'ssd'}.' + +'.$lt{'sed'}.''. +&Apache::loncommon::end_data_table_row(); + } + } + } + $domaintext.= &Apache::loncommon::end_data_table(); + if ($num_domain_level > 0) { + $r->print($domaintext); + $addrolesdisplay = 1; + } + return $addrolesdisplay; +} + sub user_authentication { - my ($ccuname,$ccdomain,$krbdefdom,$abv_auth) = @_; + my ($ccuname,$ccdomain,$formname) = @_; my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain); - my ($loginscript,$outcome); - if ($currentauth=~/^(krb)(4|5):(.*)/) { - my $long_auth = $1.$2; - my $curr_kerb_ver = $2; - my $krbdefdom=$3; - my $curr_authtype = $abv_auth->{$long_auth}; - my %param = ( formname => 'document.cu', - kerb_def_dom => $krbdefdom, - domain => $ccdomain, - curr_authtype => $curr_authtype, - curr_kerb_ver => $curr_kerb_ver, - ); - $loginscript = &Apache::loncommon::authform_header(%param); - } + my $outcome; # Check for a bad authentication type if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) { # bad authentication scheme @@ -1236,7 +1255,8 @@ sub user_authentication { 'ld' => "Login Data" ); if (&Apache::lonnet::allowed('mau',$ccdomain)) { - &initialize_authen_forms($ccdomain); + &initialize_authen_forms($ccdomain,$formname); + my $choices = &Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc); $outcome = < @@ -1257,7 +1277,7 @@ $lt{'uuas'} ($currentauth). $lt{'adcs'}. ENDBADAUTH } } else { # Authentication type is valid - &initialize_authen_forms($ccdomain,$currentauth,'modifyuser'); + &initialize_authen_forms($ccdomain,$formname,$currentauth,'modifyuser'); my ($authformcurrent,$can_modify,@authform_others) = &modify_login_block($ccdomain,$currentauth); if (&Apache::lonnet::allowed('mau',$ccdomain)) { @@ -1301,6 +1321,7 @@ ENDBADAUTH $outcome .= <$lt{'ccld'} $lt{'yodo'} $lt{'ifch'}: $ccdomain + ENDNOPRIV } } @@ -1376,15 +1397,17 @@ sub modify_login_block { sub personal_data_display { my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_; - my ($output,$showforceid,%userenv,%domconfig); + my ($output,$showforceid,%userenv,%canmodify); + my @userinfo = ('firstname','middlename','lastname','generation', + 'permanentemail','id'); if (!$newuser) { # Get the users information %userenv = &Apache::lonnet::get('environment', ['firstname','middlename','lastname','generation', 'permanentemail','id'],$ccdomain,$ccuname); - %domconfig = - &Apache::lonnet::get_dom('configuration',['usermodification'], - $ccdomain); + %canmodify = + &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain, + \@userinfo); } my %lt=&Apache::lonlocal::texthash( 'pd' => "Personal Data", @@ -1396,8 +1419,6 @@ sub personal_data_display { 'id' => "ID/Student Number", 'lg' => "Login Data" ); - my @userinfo = ('firstname','middlename','lastname','generation', - 'permanentemail','id'); my %textboxsize = ( firstname => '15', middlename => '15', @@ -1426,33 +1447,14 @@ sub personal_data_display { $output .= ''; } } else { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$ccdomain)) { - $canmodify = 1; - } else { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) { - if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$key}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } elsif ($context eq 'course') { - $canmodify = 1; - } - } - if ($canmodify) { + if ($canmodify{$item}) { $output .= ''; } else { $output .= $userenv{$item}; } if ($item eq 'id') { - $showforceid = $canmodify; - } + $showforceid = $canmodify{$item}; + } } $output .= &Apache::lonhtmlcommon::row_closure(1); } @@ -1474,7 +1476,9 @@ sub update_user_data { my $end = '

'; my $rtnlink = ''. - &mt('Return to previous page').''.&Apache::loncommon::end_page(); + &mt('Return to previous page').''. + &Apache::loncommon::end_page(); + my $now = time; my $title; if (exists($env{'form.makeuser'})) { $title='Set Privileges for New User'; @@ -1486,7 +1490,13 @@ sub update_user_data { my $jscript = ''."\n"; my %breadcrumb_text = &singleuser_breadcrumb(); - $r->print(&Apache::loncommon::start_page($title,$jscript)); + my $args; + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + } else { + $args = undef; + } + $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate)", text=>$breadcrumb_text{'search'}, @@ -1499,14 +1509,17 @@ sub update_user_data { } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", - text=>"Set user role", + text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}, {href=>"/adm/createuser", text=>"Result", faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - - my %disallowed; + my $helpitem = 'Course_Change_Privileges'; + if ($env{'form.action'} eq 'singlestudent') { + $helpitem = 'Course_Add_Student'; + } + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + $helpitem)); $r->print(&update_result_form($uhome)); # Check Inputs if (! $env{'form.ccuname'} ) { @@ -1531,6 +1544,9 @@ sub update_user_data { $end.$rtnlink); return; } + if ($uhome eq 'no_host') { + $newuser = 1; + } if (! exists($env{'form.makeuser'})) { # Modifying an existing user, so check the validity of the name if ($uhome eq 'no_host') { @@ -1568,7 +1584,6 @@ sub update_user_data { return; } - $r->print('

'.&mt('User [_1] in domain [_2]', $env{'form.ccuname'}, $env{'form.ccdomain'}).'

'); my (%alerts,%rulematch,%inst_results,%curr_rules); @@ -1595,7 +1610,7 @@ sub update_user_data { my %checkhash; my %checks = ('id' => 1); %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = ( - 'newuser' => 1, + 'newuser' => $newuser, 'id' => $env{'form.cid'}, ); if ($env{'form.cid'} ne '') { @@ -1629,10 +1644,31 @@ sub update_user_data { $env{'form.cgeneration'},undef,$desiredhost, $env{'form.cpermanentemail'}); $r->print(&mt('Generating user').': '.$result); - my $home = &Apache::lonnet::homeserver($env{'form.ccuname'}, + $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); - $r->print('
'.&mt('Home server').': '.$home.' '. - &Apache::lonnet::hostname($home)); + if (($uhome ne 'no_host') && ($env{'form.customquota'} == 1)) { + my (%changeHash,$newportfolioquota); + if ($env{'form.portfolioquota'} eq '') { + $newportfolioquota = 0; + } else { + $newportfolioquota = $env{'form.portfolioquota'}; + $newportfolioquota =~ s/[^\d\.]//g; + } + my $quotachanged = "a_admin($newportfolioquota,\%changeHash); + if ($quotachanged) { + $changeHash{'firstname'} = $env{'form.cfirstname'}; + $changeHash{'middlename'} = $env{'form.cmiddlename'}; + $changeHash{'lastname'} = $env{'form.clastname'}; + $changeHash{'generation'} = $env{'form.cgeneration'}; + $changeHash{'id'} = $env{'form.cid'}; + $changeHash{'permanentemail'} = $env{'form.cpermanentemail'}; + my $quotachgresult = + &Apache::lonnet::put('environment',\%changeHash, + $env{'form.ccdomain'},$env{'form.ccuname'}); + } + } + $r->print('
'.&mt('Home server').': '.$uhome.' '. + &Apache::lonnet::hostname($uhome)); } elsif (($env{'form.login'} ne 'nochange') && ($env{'form.login'} ne '' )) { # Modify user privileges @@ -1676,22 +1712,12 @@ sub update_user_data { my @statuses = ('active','future'); my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'}); my ($auname,$audom); - if ($context eq 'course') { - $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - if ($cnum eq '' || $cdom eq '') { - my $cid = $env{'request.course.id'}; - my %coursehash = - &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - $cdom = $coursehash{'domain'}; - $cnum = $coursehash{'num'}; - } - } elsif ($context eq 'author') { + if ($context eq 'author') { $auname = $env{'user.name'}; $audom = $env{'user.domain'}; } foreach my $item (keys(%roles)) { - my ($rolenum,$roledom,$role) = split(/:/,$item); + my ($rolenum,$roledom,$role) = split(/:/,$item,-1); if ($context eq 'course') { if ($cnum ne '' && $cdom ne '') { if ($rolenum eq $cnum && $roledom eq $cdom) { @@ -1708,27 +1734,33 @@ sub update_user_data { } } } - # Check for course or co-author roles being activated or re-enabled - if ($context eq 'author' || $context eq 'course') { - foreach my $key (keys(%env)) { - if ($context eq 'author') { - if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } - } elsif ($context eq 'course') { - if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); + if ($env{'form.action'} eq 'singlestudent') { + if (!grep(/^st$/,@userroles)) { + push(@userroles,'st'); + } + } else { + # Check for course or co-author roles being activated or re-enabled + if ($context eq 'author' || $context eq 'course') { + foreach my $key (keys(%env)) { + if ($context eq 'author') { + if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } + } elsif ($context eq 'course') { + if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } } } } @@ -1743,33 +1775,12 @@ sub update_user_data { push(@longroles,&Apache::lonnet::plaintext($role)); } } - foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) { - $canmodify = 1; - } else { - if ($context eq 'course' || $context eq 'author') { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $role (@userroles) { - if (ref($domconfig{'usermodification'}{$context}{$role}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$role}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } - } elsif ($context eq 'course') { - if (grep(/^st$/,@userroles)) { - $canmodify = 1; - } - } - } + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); + my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles); + foreach my $item (@userinfo) { # Strip leading and trailing whitespace $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g; - if (!$canmodify) { + if (!$canmodify{$item}) { if (defined($env{'form.c'.$item})) { if ($env{'form.c'.$item} ne $userenv{$item}) { push(@mod_disallowed,$item); @@ -1781,7 +1792,6 @@ sub update_user_data { # Check to see if we can change the ID/student number my $forceid = $env{'form.forceid'}; my $recurseid = $env{'form.recurseid'}; - my $newuser = 0; my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules); my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'}, $env{'form.ccuname'}); @@ -1813,6 +1823,10 @@ sub update_user_data { $newdefquotatext); my ($defquota,$settingstatus) = &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); + my $showquota; + if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { + $showquota = 1; + } my %changeHash; $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; if ($userenv{'portfolioquota'} ne '') { @@ -1883,6 +1897,13 @@ sub update_user_data { $changeHash{'firstname'},$changeHash{'middlename'}, $changeHash{'lastname'},$changeHash{'generation'}, $changeHash{'id'},undef,$changeHash{'permanentemail'}); + %userupdate = ( + lastname => $env{'form.clastname'}, + middlename => $env{'form.cmiddlename'}, + firstname => $env{'form.cfirstname'}, + generation => $env{'form.cgeneration'}, + id => $env{'form.cid'}, + ); } if (($namechanged && $namechgresult eq 'ok') || ($quotachanged && $quotachgresult eq 'ok')) { @@ -1910,8 +1931,11 @@ sub update_user_data { $lt{'gen'} $lt{'id'} $lt{'mail'} - $lt{'disk'} END + if ($showquota) { + $r->print(" + $lt{'disk'}\n"); + } $r->print(&Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1922,8 +1946,11 @@ END $userenv{'generation'} $userenv{'id'} $userenv{'permanentemail'} - $oldportfolioquota Mb $olddefquotatext END + if ($showquota) { + $r->print(" + $oldportfolioquota Mb $olddefquotatext \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1934,8 +1961,11 @@ END $env{'form.cgeneration'} $env{'form.cid'} $env{'form.cpermanentemail'} - $newportfolioquota Mb $newdefquotatext END + if ($showquota) { + $r->print(" + $newportfolioquota Mb $newdefquotatext \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'
'); if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1943,13 +1973,6 @@ END ($env{'form.ccuname'} => $env{'form.cid'})); if (($recurseid) && (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) { - %userupdate = ( - lastname => $env{'form.clasaname'}, - middlename => $env{'form.cmiddlename'}, - firstname => $env{'form.cfirstname'}, - generation => $env{'fora.cgeneration'}, - id => $env{'form.cid'}, - ); my $idresult = &Apache::lonuserutils::propagate_id_change( $env{'form.ccuname'},$env{'form.ccdomain'}, @@ -1963,7 +1986,7 @@ END foreach my $key (keys(%changeHash)) { $newenvhash{'environment.'.$key} = $changeHash{$key}; } - &Apache::lonnet::appenv(%newenvhash); + &Apache::lonnet::appenv(\%newenvhash); } } else { # error occurred $r->print(''.&mt('Unable to successfully change environment for').' '. @@ -1985,8 +2008,11 @@ END $r->print('
['.$lt{'mail'}.': '. $userenv{'permanentemail'}.']'); } - $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. - $olddefquotatext.']'); + if ($showquota) { + $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. + $olddefquotatext.']'); + } + $r->print(''); } if (@mod_disallowed) { my ($rolestr,$contextname); @@ -2017,9 +2043,42 @@ END $r->print($no_forceid_alert. &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules)); } - ## + if ($env{'form.action'} eq 'singlestudent') { + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser); + $r->print('

'. &mt('Enroll Another Student').'

'); + } else { + my @rolechanges = &update_roles($r); + if ($namechanged) { + if ($context eq 'course') { + if (@userroles > 0) { + if ((@rolechanges == 0) || + (!(grep(/^st$/,@rolechanges)))) { + if (grep(/^st$/,@userroles)) { + my $classlistupdated = + &Apache::lonuserutils::update_classlist($cdom, + $cnum,$env{'form.ccdomain'}, + $env{'form.ccuname'},\%userupdate); + } + } + } + } + } + my $userinfo = &Apache::loncommon::plainname($env{'form.ccuname'}, + $env{'form.ccdomain'}); + if ($env{'form.popup'}) { + $r->print('

'.&mt('Close window').'

'); + } else { + $r->print('

'.&mt('Modify this user: ([_1])',$userinfo).''.(' 'x5).''.&mt('Create/Modify Another User').'

'); + } + } + $r->print(&Apache::loncommon::end_page()); +} + +sub update_roles { + my ($r) = @_; my $now=time; - my $rolechanges = 0; + my @rolechanges; + my %disallowed; $r->print('

'.&mt('Modifying Roles').'

'); foreach my $key (keys (%env)) { next if (! $env{$key}); @@ -2042,6 +2101,9 @@ END $now); $r->print($result); } + if (!grep(/^\Q$role\E$/,@rolechanges)) { + push(@rolechanges,$role); + } } if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) { # Revoke custom role @@ -2050,8 +2112,10 @@ END &Apache::lonnet::revokecustomrole($env{'form.ccdomain'}, $env{'form.ccuname'},$1,$2,$3,$4). '
'); + if (!grep(/^cr$/,@rolechanges)) { + push(@rolechanges,'cr'); + } } - $rolechanges ++; } elsif ($key=~/^form\.del/) { if ($key=~/^form\.del\:([^\_]+)\_([^\_\.]+)$/) { # Delete standard role @@ -2069,6 +2133,9 @@ END $now); $r->print($result); } + if (!grep(/^\Q$role\E$/,@rolechanges)) { + push(@rolechanges,$role); + } } if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) { my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4); @@ -2078,8 +2145,10 @@ END &Apache::lonnet::assigncustomrole($env{'form.ccdomain'}, $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now, 0,1).'
'); + if (!grep(/^cr$/,@rolechanges)) { + push(@rolechanges,'cr'); + } } - $rolechanges ++; } elsif ($key=~/^form\.ren/) { my $udom = $env{'form.ccdomain'}; my $uname = $env{'form.ccuname'}; @@ -2092,8 +2161,12 @@ END if ($role eq 'st') { if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) { my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3); - if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { - $output = "Error: $result\n"; + if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) { + if ($result eq 'refused' && $logmsg) { + $output = $logmsg; + } else { + $output = "Error: $result\n"; + } } else { $output = &mt('Assigning').' '.$role.' in '.$url. &mt('starting').' '.localtime($now). @@ -2108,6 +2181,9 @@ END $role,$url,$result).'
'; } $r->print($output); + if (!grep(/^\Q$role\E$/,@rolechanges)) { + push(@rolechanges,$role); + } } # Re-enable custom role if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) { @@ -2117,8 +2193,10 @@ END $url,$rdom,$rnam,$rolename,0,$now); $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : [_5]', $rolename,$rnam,$rdom,$url,$result).'
'); + if (!grep(/^cr$/,@rolechanges)) { + push(@rolechanges,'cr'); + } } - $rolechanges ++; } elsif ($key=~/^form\.act/) { my $udom = $env{'form.ccdomain'}; my $uname = $env{'form.ccuname'}; @@ -2153,6 +2231,9 @@ END $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end)); } } + if (!grep(/^cr$/,@rolechanges)) { + push(@rolechanges,'cr'); + } } elsif ($key=~/^form\.act\_($match_domain)\_($match_name)\_([^\_]+)$/) { # Activate roles for sections with 3 id numbers # set start, end times, and the url for the class @@ -2191,7 +2272,10 @@ END if ($emptysec) { $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'')); } - } + } + if (!grep(/^\Q$three\E$/,@rolechanges)) { + push(@rolechanges,$three); + } } elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) { # Activate roles for sections with two id numbers # set start, end times, and the url for the class @@ -2201,26 +2285,31 @@ END my $end = ( $env{'form.end_'.$1.'_'.$2} ? $env{'form.end_'.$1.'_'.$2} : 0 ); - my $url='/'.$1.'/'; + my $one = $1; + my $two = $2; + my $url='/'.$one.'/'; # split multiple sections my %sections = (); - my $num_sections = &build_roles($env{'form.sec_'.$1.'_'.$2},\%sections,$2); + my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two); if ($num_sections == 0) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'')); } else { my $emptysec = 0; foreach my $sec (sort {$a cmp $b} keys %sections) { if ($sec ne '') { my $securl = $url.'/'.$sec; - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$2,$start,$end,$1,undef,$sec)); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec)); } else { $emptysec = 1; } } if ($emptysec) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$2,$start,$end,$1,undef,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'')); } } + if (!grep(/^\Q$two\E$/,@rolechanges)) { + push(@rolechanges,$two); + } } else { $r->print('

'.&mt('ERROR').': '.&mt('Unknown command').' '.$key.'


'); } @@ -2232,15 +2321,57 @@ END } $r->print(' '.&mt('Please go back and choose a different section name.').'


'); } - $rolechanges ++; } } # End of foreach (keys(%env)) # Flush the course logs so reverse user roles immediately updated &Apache::lonnet::flushcourselogs(); - if (!$rolechanges) { + if (@rolechanges == 0) { $r->print(&mt('No roles to modify')); } - $r->print(&Apache::loncommon::end_page()); + return @rolechanges; +} + +sub enroll_single_student { + my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_; + $r->print('

'.&mt('Enrolling Student').'

'); + + # Remove non alphanumeric values from section + $env{'form.sections'}=~s/\W//g; + + # Clean out any old student roles the user has in this class. + &Apache::lonuserutils::modifystudent($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome); + my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); + my $enroll_result = + &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'}, + $env{'form.cmiddlename'},$env{'form.clastname'}, + $env{'form.generation'},$env{'form.sections'},$enddate, + $startdate,'manual',undef,$env{'request.course.id'}); + if ($enroll_result =~ /^ok/) { + $r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'})); + if ($env{'form.sections'} ne '') { + $r->print(' '.&mt('in section [_1]',$env{'form.sections'})); + } + my ($showstart,$showend); + if ($startdate <= $now) { + $showstart = &mt('Access starts immediately'); + } else { + $showstart = &mt('Access starts: ').&Apache::lonlocal::locallocaltime($startdate); + } + if ($enddate == 0) { + $showend = &mt('ends: no ending date'); + } else { + $showend = &mt('ends: ').&Apache::lonlocal::locallocaltime($enddate); + } + $r->print('.
'.$showstart.'; '.$showend); + if ($startdate <= $now && !$newuser) { + $r->print("

".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."

"); + } + } else { + $r->print(&mt('unable to enroll').": ".$enroll_result); + } + return; } sub get_defaultquota_text { @@ -2280,7 +2411,7 @@ sub update_result_form { } $outcome .= ''."\n". ''."\n". - ''."\n". + ''."\n". ''; return $outcome; } @@ -2416,7 +2547,8 @@ sub custom_role_editor { {href=>"javascript:backPage(document.form1,'','')", text=>"Edit custom role", faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + 'Course_Editing_Custom_Roles')); $r->print($body_top); my %lt=&Apache::lonlocal::texthash( @@ -2424,7 +2556,7 @@ sub custom_role_editor { 'crl' => "Course Level", 'dml' => "Domain Level", 'ssl' => "System Level"); - $r->print('Select a Template
'); + $r->print(&mt('Select a Template').'
'); $r->print('
'); $r->print($button_code); $r->print('
'); @@ -2556,7 +2688,8 @@ sub set_custom_role { {href=>"javascript:backPage(document.customresult,'set_custom_roles','')", text=>"Result", faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + 'Course_Editing_Custom_Roles')); my ($rdummy,$roledef)= &Apache::lonnet::get('roles',["rolesdef_$rolename"]); @@ -2633,7 +2766,8 @@ sub handler { $context = 'domain'; } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','state','callingform','roletype','showrole','bulkaction']); + ['action','state','callingform','roletype','showrole','bulkaction','popup','phase', + 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']); &Apache::lonhtmlcommon::clear_breadcrumbs(); if ($env{'form.action'} ne 'dateselect') { &Apache::lonhtmlcommon::add_breadcrumb @@ -2664,17 +2798,18 @@ sub handler { ({href=>'/adm/createuser?action=upload&state=', text=>"Upload Users List"}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List', - 'User_Management_Upload')); + 'Course_Create_Class_List')); $r->print('
'."\n"); if (! exists($env{'form.state'})) { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } elsif ($env{'form.state'} eq 'got_file') { - &Apache::lonuserutils::print_upload_manager_form($r,$context); + &Apache::lonuserutils::print_upload_manager_form($r,$context, + $permission); } elsif ($env{'form.state'} eq 'enrolling') { if ($env{'form.datatoken'}) { - &Apache::lonuserutils::upfile_drop_add($r,$context); + &Apache::lonuserutils::upfile_drop_add($r,$context,$permission); } } else { &Apache::lonuserutils::print_first_users_upload_form($r,$context); @@ -2689,35 +2824,30 @@ sub handler { foreach my $item (@search) { $srch->{$item} = $env{'form.'.$item}; } - if (($phase eq 'get_user_info') || ($phase eq 'userpicked') || ($phase eq 'createnewuser')) { if ($env{'form.phase'} eq 'createnewuser') { my $response; if ($env{'form.srchterm'} !~ /^$match_username$/) { my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); + $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$response,$srch); } else { my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'}); my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'}); &print_user_modification_page($r,$ccuname,$ccdomain, - $srch,$response,$context); + $srch,$response,$context, + $permission); } } elsif ($env{'form.phase'} eq 'get_user_info') { my ($currstate,$response,$forcenewuser,$results) = - &user_search_result($srch); + &user_search_result($context,$srch); if ($env{'form.currstate'} eq 'modify') { $currstate = $env{'form.currstate'}; } if ($currstate eq 'select') { - my $operation; - if ($env{'form.action'} eq 'singleuser') { - $operation = 'createuser'; - } elsif ($env{'form.action'} eq 'singlestudent') { - $operation = 'enrollstudent'; - } &print_user_selection_page($r,$response,$srch,$results, - $operation,\@search,$context); + \@search,$context); } elsif ($currstate eq 'modify') { my ($ccuname,$ccdomain); if (($srch->{'srchby'} eq 'uname') && @@ -2734,10 +2864,12 @@ sub handler { $response = ''; } &print_user_modification_page($r,$ccuname,$ccdomain, - $srch,$response,$context); + $srch,$response,$context, + $permission); } elsif ($currstate eq 'query') { &print_user_query_page($r,'createuser'); } else { + $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$response,$srch, $forcenewuser); } @@ -2745,7 +2877,7 @@ sub handler { my $ccuname = &LONCAPA::clean_username($env{'form.seluname'}); my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'}); &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'', - $context); + $context,$permission); } } elsif ($env{'form.phase'} eq 'update_user_data') { &update_user_data($r,$context); @@ -2762,15 +2894,22 @@ sub handler { ($permission->{'view'} || $permission->{'cusr'})) { if ($env{'form.phase'} eq 'bulkchange') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'backPage(document.studentform)', - text=>"List Users"}); + ({href=>'/adm/createuser?action=listusers', + text=>"List Users"}, + {href=>"/adm/createuser", + text=>"Result"}); my $setting = $env{'form.roletype'}; my $choice = $env{'form.bulkaction'}; $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users", - 'User_Management_List')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users", + 'Course_View_Class_List')); if ($permission->{'cusr'}) { &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice); + $r->print(&Apache::loncommon::end_page()); + } else { + $r->print(&mt('You are not authorized to make bulk changes to user roles')); + $r->print('

'.&mt('Display User Lists').''); + $r->print(&Apache::loncommon::end_page()); } } else { &Apache::lonhtmlcommon::add_breadcrumb @@ -2795,7 +2934,7 @@ sub handler { $r->print(&header(&add_script(&verify_user_display()))); } $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users", - 'User_Management_List')); + 'Course_View_Class_List')); &Apache::lonuserutils::print_userlist($r,undef,$permission,$context, $formname,$totcodes,$codetitles,$idlist,$idlist_titles); $r->print(&Apache::loncommon::end_page()); @@ -2823,13 +2962,33 @@ sub handler { } elsif ($env{'form.action'} eq 'dateselect') { if ($permission->{'cusr'}) { $r->print(&header(undef,undef,{'no_nav_bar' => 1}). - &Apache::lonuserutils::date_section_selector($context). + &Apache::lonuserutils::date_section_selector($context, + $permission). &Apache::loncommon::end_page()); } else { $r->print(&header(). ''.&mt('You do not have permission to modify dates or sections for users').''. &Apache::loncommon::end_page()); } + } elsif ($env{'form.action'} eq 'selfenroll') { + $r->print(&header()); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=selfenroll', + text=>"Configure Self-enrollment"}); + if (!exists($env{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment', + 'Course_Self_Enrollment')); + + &print_selfenroll_menu($r,$context,$permission); + } elsif ($env{'form.state'} eq 'done') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=selfenroll', + text=>"Result"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result', + 'Course_Self_Enrollment')); + &update_selfenroll_config($r,$context); + } + $r->print(&Apache::loncommon::end_page()); } else { $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); @@ -2877,41 +3036,41 @@ sub print_main_menu { my %links = ( domain => { upload => 'Upload a File of Users', - singleuser => 'Add/Manage a Single User', + singleuser => 'Add/Modify a Single User', listusers => 'Manage Multiple Users', }, author => { upload => 'Upload a File of Co-authors', - singleuser => 'Add/Manage a Single Co-author', + singleuser => 'Add/Modify a Single Co-author', listusers => 'Display Co-authors and Manage Multiple Users', }, course => { upload => 'Upload a File of Course Users', - singleuser => 'Add/Manage a Single Course User', + singleuser => 'Add/Modify a Single Course User', listusers => 'Display Class Lists and Manage Multiple Users', }, ); my @menu = ( { text => $links{$context}{'upload'}, - help => 'User_Management_Upload', + help => 'Course_Create_Class_List', action => 'upload', permission => $permission->{'cusr'}, }, { text => $links{$context}{'singleuser'}, - help => 'User_Management_Single_User', + help => 'Course_Change_Privileges', action => 'singleuser', permission => $permission->{'cusr'}, }, { text => $links{$context}{'listusers'}, - help => 'User_Management_List', + help => 'Course_View_Class_List', action => 'listusers', permission => ($permission->{'view'} || $permission->{'cusr'}), }, ); if ($context eq 'domain' || $context eq 'course') { my $customlink = { text => 'Edit Custom Roles', - help => 'Custom_Role_Edit', + help => 'Course_Editing_Custom_Roles', action => 'custom', permission => $permission->{'custom'}, }; @@ -2922,7 +3081,7 @@ sub print_main_menu { my @courselinks = ( { text => 'Enroll a Single Student', - help => 'Course_Single_Student', + help => 'Course_Add_Student', action => 'singlestudent', permission => $permission->{'cusr'}, }, @@ -2934,10 +3093,16 @@ sub print_main_menu { if (!exists($permission->{'cusr_section'})) { push(@courselinks, { text => 'Automated Student Enrollment Manager', + help => 'Course_Automated_Enrollment', permission => (&Apache::lonnet::auto_run($cnum,$cdom) && $permission->{'cusr'}), url => '/adm/populate', - }); + }, + { text => 'Configure User Self-enrollment', + help => 'Course_Self_Enrollment', + action => 'selfenroll', + permission => $permission->{'cusr'}, + }); } push(@courselinks, { text => 'Manage Course Groups', @@ -2951,6 +3116,10 @@ sub print_main_menu { foreach my $menu_item (@menu) { next if (! $menu_item->{'permission'}); $menu_html.='

'; + if (exists($menu_item->{'help'})) { + $menu_html.= + &Apache::loncommon::help_open_topic($menu_item->{'help'}); + } $menu_html.=''; if (exists($menu_item->{'url'})) { $menu_html.=qq{}; @@ -2959,10 +3128,6 @@ sub print_main_menu { qq{}; } $menu_html.= &mt($menu_item->{'text'}).''; - if (exists($menu_item->{'help'})) { - $menu_html.= - &Apache::loncommon::help_open_topic($menu_item->{'help'}); - } $menu_html.='

'; } return $menu_html; @@ -2979,9 +3144,129 @@ sub restore_prev_selections { \%saveable_parameters); } +sub print_selfenroll_menu { + my ($r,$context,$permission) = @_; + my $formname = 'enrollstudent'; + my $nolink = 1; + my ($row,$lt) = &get_selfenroll_titles(); + my $groupslist = &Apache::lonuserutils::get_groupslist(); + my $setsec_js = + &Apache::lonuserutils::setsections_javascript($formname,$groupslist); + my $output = ''."\n". + '

'.$lt->{'selfenroll'}.'

'."\n". + ''."\n". + &Apache::lonhtmlcommon::start_pick_box(); + if (ref($row) eq 'ARRAY') { + foreach my $item (@{$row}) { + my $title = $item; + if (ref($lt) eq 'HASH') { + $title = $lt->{$item}; + } + $output .= + &Apache::lonhtmlcommon::row_title($title, + 'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n"; + if ($item eq 'types') { + my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'}; + $output .= ''; + } elsif ($item eq 'registered') { + my ($regon,$regoff); + if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_registered'}) { + $regon = ' checked="checked" '; + $regoff = ' '; + } else { + $regon = ' '; + $regoff = ' checked="checked" '; + } + $output .= '  '; + } elsif ($item eq 'enroll_dates') { + my $starttime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_start_date'}; + my $endtime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_end_date'}; + if ($starttime eq '') { + $starttime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'}; + } + if ($endtime eq '') { + $endtime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'}; + } + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_start_date',$starttime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_end_date',$endtime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + $output .= &selfenroll_date_forms($startform,$endform); + } elsif ($item eq 'access_dates') { + my $starttime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_start_access'}; + my $endtime = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_end_access'}; + if ($starttime eq '') { + $starttime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_start_date'}; + } + if ($endtime eq '') { + $endtime = $env{'course.'.$env{'request.course.id'}.'.default_enrollment_end_date'}; + } + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_start_access',$starttime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'selfenroll_end_access',$endtime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + $output .= &selfenroll_date_forms($startform,$endform); + } elsif ($item eq 'section') { + my $currsec = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_section'}; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'},'.num'}; + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); + my $newsecval; + if ($currsec ne 'none' && $currsec ne '') { + if (!defined($sections_count{$currsec})) { + $newsecval = $currsec; + } + } + my $sections_select = + &Apache::lonuserutils::course_sections(\%sections_count,'st',$currsec); + $output .= ''."\n". + ''."\n". + '
'.&mt('Existing sections')."\n". + '
'.$sections_select.'
'. + &mt('New section').'
'."\n". + ''."\n". + ''."\n". + ''."\n". + '
'."\n"; + } + $output .= &Apache::lonhtmlcommon::row_closure(1); + } + } + $output .= &Apache::lonhtmlcommon::end_pick_box(). + '
'; + $r->print($output); + return; +} + +sub selfenroll_date_forms { + my ($startform,$endform) = @_; + my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n". + &Apache::lonhtmlcommon::row_title(&mt('Starts'), + 'LC_oddrow_value')."\n". + $startform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title(&mt('Ends'), + 'LC_oddrow_value')."\n". + $endform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box(); + return $output; +} + #-------------------------------------------------- functions for &phase_two sub user_search_result { - my ($srch) = @_; + my ($context,$srch) = @_; my %allhomes; my %inst_matches; my %srch_results; @@ -3050,14 +3335,14 @@ sub user_search_result { my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'}); if ($uhome eq 'no_host') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { $currstate = 'modify'; } } else { %srch_results = &Apache::lonnet::usersearch($srch); ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } else { my $courseusers = &get_courseusers(); @@ -3066,7 +3351,7 @@ sub user_search_result { $currstate = 'modify'; } else { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } else { foreach my $user (keys(%$courseusers)) { @@ -3093,7 +3378,7 @@ sub user_search_result { } } ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } } @@ -3103,7 +3388,7 @@ sub user_search_result { ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); if ($dirsrchres eq 'ok') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''. @@ -3117,7 +3402,7 @@ sub user_search_result { if ($srch->{'srchin'} eq 'dom') { %srch_results = &Apache::lonnet::usersearch($srch); ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } elsif ($srch->{'srchin'} eq 'crs') { my $courseusers = &get_courseusers(); foreach my $user (keys(%$courseusers)) { @@ -3169,14 +3454,14 @@ sub user_search_result { } } ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } elsif ($srch->{'srchin'} eq 'alc') { $currstate = 'query'; } elsif ($srch->{'srchin'} eq 'instd') { ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); if ($dirsrchres eq 'ok') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''. &mt('Institutional directory search is not available in domain: [_1]',$showdom). @@ -3220,11 +3505,15 @@ sub directorysrch_check { my ($insttypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($srch->{'srchdomain'}); my @longtypes; foreach my $item (@usertypes) { - push (@longtypes,$insttypes->{$item}); + if (defined($insttypes->{$item})) { + push (@longtypes,$insttypes->{$item}); + } elsif ($item eq 'default') { + push (@longtypes,&mt('other')); + } } my $insttype_str = join(', ',@longtypes); return &mt('Institutional directory search in domain: [_1] is not available to your user type: ',$showdom).$insttype_str; - } + } } else { $can_search = 1; } @@ -3282,7 +3571,7 @@ sub get_courseusers { } sub build_search_response { - my ($srch,%srch_results) = @_; + my ($context,$srch,%srch_results) = @_; my ($currstate,$response,$forcenewuser); my %names = ( 'uname' => 'username', @@ -3341,8 +3630,15 @@ sub build_search_response { } } if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) { - my $showdom = &display_domain_info($env{'request.role.domain'}); - $response .= '

'.&mt("To add a new user (you can only create new users in your current role's domain - [_1]):",$env{'request.role.domain'}).'
  • '.&mt("Set 'Domain/institution to search' to: [_1]",$showdom).'
  • '.&mt("Set 'Search criteria' to: 'username is ...... in selected LON-CAPA domain'").'
  • '.&mt('Provide the proposed username').'
  • '.&mt('Search').'

'; + my $cancreate = + &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context); + if ($cancreate) { + my $showdom = &display_domain_info($env{'request.role.domain'}); + $response .= '

'.&mt("To add a new user (you can only create new users in your current role's domain - [_1]):",$env{'request.role.domain'}).'
  • '.&mt("Set 'Domain/institution to search' to: [_1]",$showdom).'
  • '.&mt("Set 'Search criteria' to: 'username is ...... in selected LON-CAPA domain'").'
  • '.&mt('Provide the proposed username').'
  • '.&mt('Search').'

'; + } else { + my $helplink = ' href="javascript:helpMenu('."'display'".')"'; + $response .= '

'.&mt("You are not authorized to create new users in your current role's domain - [_1].",$env{'request.role.domain'}).'
'.&mt('Contact the helpdesk if you need to create a new user.',$helplink).'

'; + } } } } @@ -3444,83 +3740,24 @@ sub course_level_table { } my @roles = &Apache::lonuserutils::roles_by_context('course'); foreach my $role (@roles) { + my $plrole=&Apache::lonnet::plaintext($role); if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) { - my $plrole=&Apache::lonnet::plaintext($role); - $table .= &Apache::loncommon::start_data_table_row(). -' -'.$plrole.' -'.$area.'
Domain: '.$domain.''."\n"; - if ($role ne 'cc') { - if (%sections_count) { - my $currsec = - &Apache::lonuserutils::course_sections(\%sections_count, - $protectedcourse.'_'.$role); - $table .= - ''. - ' - '. - ''. - ''. - '
'.$lt{'exs'}.'
'. - $currsec.'
   '.$lt{'new'}.'
'. - ''. - '
'; - } else { - $table .= ''; - } - } else { - $table .= ' '; + $table .= &course_level_row($protectedcourse,$role,$area,$domain, + $plrole,\%sections_count,\%lt); + } elsif ($env{'request.course.sec'} ne '') { + if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'. + $env{'request.course.sec'})) { + $table .= &course_level_row($protectedcourse,$role,$area,$domain, + $plrole,\%sections_count,\%lt); } - $table .= < -$lt{'ssd'} - -$lt{'sed'} -ENDTIMEENTRY - $table.= &Apache::loncommon::end_data_table_row(); } } - foreach my $cust (sort keys %customroles) { - if (&Apache::lonnet::allowed('ccr',$thiscourse)) { - my $plrole=$cust; - my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}. - '_'.$env{'user.name'}.'_'.$plrole; - $table .= &Apache::loncommon::start_data_table_row(). -' -'.$plrole.' -'.$area.''."\n"; - if (%sections_count) { - my $currsec = - &Apache::lonuserutils::course_sections(\%sections_count, - $customrole); - $table.= - ''. - ''. - ''. - ''. - ''. - '
'. - $lt{'exs'}.'
'.$currsec.'
   '.$lt{'new'}.'
'. - '
'; - } else { - $table .= ''; - } - $table .= < -$lt{'ssd'} - -$lt{'sed'} -ENDENTRY - $table .= &Apache::loncommon::end_data_table_row(); - } + if (&Apache::lonnet::allowed('ccr',$thiscourse)) { + foreach my $cust (sort keys %customroles) { + my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust; + $table .= &course_level_row($protectedcourse,$role,$area,$domain, + $cust,\%sections_count,\%lt); + } } } return '' if ($table eq ''); # return nothing if there is nothing @@ -3540,6 +3777,53 @@ $table. return $result; } +sub course_level_row { + my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_; + my $row = &Apache::loncommon::start_data_table_row(). + ' '."\n". + ' '.$plrole.''."\n". + ' '.$area.'
Domain: '.$domain.''."\n"; + if ($role eq 'cc') { + $row .= ' '; + } elsif ($env{'request.course.sec'} ne '') { + $row .= ' '. + $env{'request.course.sec'}.''; + } else { + if (ref($sections_count) eq 'HASH') { + my $currsec = + &Apache::lonuserutils::course_sections($sections_count, + $protectedcourse.'_'.$role); + $row .= ''."\n". + ''."\n". + ' '."\n". + ' '."\n". + ' '."\n". + '
'.$lt->{'exs'}.'
'. + $currsec.'
   '.$lt->{'new'}.'
'. + ''. + '
'."\n"; + } else { + $row .= ''."\n"; + } + } + $row .= < +$lt->{'ssd'} + +$lt->{'sed'} +ENDTIMEENTRY + $row .= &Apache::loncommon::end_data_table_row(); + return $row; +} + sub course_level_dc { my ($dcdom) = @_; my %customroles=&Apache::lonuserutils::my_custom_roles(); @@ -3586,6 +3870,7 @@ sub course_level_dc { '  '. ' '.$lt{'new'}.'
'. ''. + ''. ''. ''; $otheritems .= <print('

'.$lt->{'selfenroll'}.'

'."\n"); + if (ref($row) eq 'ARRAY') { + foreach my $item (@{$row}) { + if ($item eq 'enroll_dates') { + my (%currenrolldate,%newenrolldate); + foreach my $type ('start','end') { + $currenrolldate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_date'}; + $newenrolldate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_date'); + if ($newenrolldate{$type} ne $currenrolldate{$type}) { + $changes{'internal.selfenroll_'.$type.'_date'} = $newenrolldate{$type}; + } + } + } elsif ($item eq 'access_dates') { + my (%currdate,%newdate); + foreach my $type ('start','end') { + $currdate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_access'}; + $newdate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_access'); + if ($newdate{$type} ne $currdate{$type}) { + $changes{'internal.selfenroll_'.$type.'_access'} = $newdate{$type}; + } + } + } else { + my $curr_val = + $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item}; + my $newval = $env{'form.selfenroll_'.$item}; + if ($item eq 'section') { + $newval = $env{'form.sections'}; + if (grep(/^\Q$newval\E$/,keys(%{$groupslist}))) { + $newval = $curr_val; + $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').'
'.&mt('Group names and section names must be distinct'); + } elsif ($newval eq 'all') { + $newval = $curr_val; + $warning{$item} = &mt("Section for self-enrolled users unchanged, as 'all' is a reserved section name."); + } + if ($newval eq '') { + $newval = 'none'; + } + } + if ($newval ne $curr_val) { + $changes{'internal.selfenroll_'.$item} = $newval; + } + } + } + if (keys(%warning) > 0) { + foreach my $item (@{$row}) { + if (exists($warning{$item})) { + $r->print($warning{$item}.'
'); + } + } + } + if (keys(%changes) > 0) { + my $putresult = &Apache::lonnet::put('environment',\%changes,$cdom,$cnum); + if ($putresult eq 'ok') { + if ((exists($changes{'internal.selfenroll_types'})) || + (exists($changes{'internal.selfenroll_start_date'})) || + (exists($changes{'internal.selfenroll_end_date'}))) { + my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', + $cnum,undef,undef,'Course'); + my $chome = &Apache::lonnet::homeserver($cnum,$cdom); + if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') { + foreach my $item ('selfenroll_types','selfenroll_start_date','selfenroll_end_date') { + if (exists($changes{'internal.'.$item})) { + $crsinfo{$env{'request.course.id'}}{$item} = + $changes{'internal.'.$item}; + } + } + my $crsputresult = + &Apache::lonnet::courseidput($cdom,\%crsinfo, + $chome,'notime'); + } + } + $r->print(&mt('The following changes were made to self-enrollment settings:').'
    '); + foreach my $item (@{$row}) { + my $title = $item; + if (ref($lt) eq 'HASH') { + $title = $lt->{$item}; + } + if ($item eq 'enroll_dates') { + foreach my $type ('start','end') { + if (exists($changes{'internal.selfenroll_'.$type.'_date'})) { + my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_date'}); + $r->print('
  • '.&mt('[_1]: [_2] set to "[_3]".', + $title,$type,$newdate).'
  • '); + } + } + } elsif ($item eq 'access_dates') { + foreach my $type ('start','end') { + if (exists($changes{'internal.selfenroll_'.$type.'_access'})) { + my $newdate = &Apache::lonlocal::locallocaltime($changes{'internal.selfenroll_'.$type.'_access'}); + $r->print('
  • '.&mt('[_1]: [_2] set to "[_3]".', + $title,$type,$newdate).'
  • '); + } + } + } else { + if (exists($changes{'internal.selfenroll_'.$item})) { + $r->print('
  • '.&mt('[_1] set to "[_2]".',$title, + $changes{'internal.selfenroll_'.$item}).'
  • '."\n"); + } + } + } + $r->print('
'); + my %newenvhash; + foreach my $key (keys(%changes)) { + $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $changes{$key}; + } + &Apache::lonnet::appenv(\%newenvhash); + } else { + $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').'
'.&mt('The error was: [_1].',$putresult)); + } + } else { + $r->print(&mt('No changes were needed to the existing self-enrollment settings in this course.')); + } + } else { + $r->print(&mt('No changes were needed to the existing self-enrollment settings in this course.')); + } + return; +} + +sub get_selfenroll_titles { + my @row = ('types','registered','enroll_dates','access_dates','section'); + my %lt = &Apache::lonlocal::texthash ( + selfenroll => 'Self-enrollment with a student role', + types => 'Users allowed to self-enroll in this course', + registered => 'Restrict self-enrollment to registered students?', + enroll_dates => 'Dates self-enrollment available', + access_dates => 'Access dates for self-enrolled users', + section => 'Section', + ); + return (\@row,\%lt); +} + #---------------------------------------------- end functions for &phase_two #--------------------------------- functions for &phase_two and &phase_three