--- loncom/interface/loncreateuser.pm 2007/12/31 01:58:17 1.225 +++ loncom/interface/loncreateuser.pm 2008/07/17 20:05:14 1.257 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.225 2007/12/31 01:58:17 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.257 2008/07/17 20:05:14 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,7 +231,7 @@ 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 $helpitem = 'Course_Change_Privileges'; @@ -245,21 +246,14 @@ sub print_username_entry_form { 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 $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','/')) { @@ -274,12 +268,12 @@ $lt{'nr'}: $choice print(" -

$lt{'srch'} $sellink $actiontext

"); +

$actiontext

"); if ($env{'form.origform'} ne 'crtusername') { $r->print("\n".$response); } @@ -291,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') && @@ -301,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 = @@ -309,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";
@@ -317,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  
@@ -381,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'}; @@ -416,27 +440,22 @@ 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',}); + + 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',}); + } elsif ($env{'form.action'} eq 'singlestudent') { $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', 'Course_Add_Student')); $r->print($jscript."$lt{'stusrch'}
"); @@ -515,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; @@ -571,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 = ''; @@ -607,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)", @@ -654,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', @@ -775,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 @@ -840,7 +838,7 @@ ENDNOPORTPRIV if ($addrolesdisplay) { $r->print('
print(' onClick="verify_message(this.form)" \>'."\n"); + $r->print(' onClick="auth_check()" \>'."\n"); } else { $r->print('onClick="this.form.submit()" \>'."\n"); } @@ -867,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', } @@ -897,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; } @@ -1241,22 +1241,9 @@ sub new_domain_roles { } 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 @@ -1268,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 = < @@ -1289,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)) { @@ -1333,6 +1321,7 @@ ENDBADAUTH $outcome .= <$lt{'ccld'} $lt{'yodo'} $lt{'ifch'}: $ccdomain + ENDNOPRIV } } @@ -1407,18 +1396,25 @@ sub modify_login_block { } sub personal_data_display { - my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_; + my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray) = @_; my ($output,$showforceid,%userenv,%canmodify); my @userinfo = ('firstname','middlename','lastname','generation', 'permanentemail','id'); + my $rowcount = 0; + my $editable = 0; if (!$newuser) { # Get the users information %userenv = &Apache::lonnet::get('environment', ['firstname','middlename','lastname','generation', 'permanentemail','id'],$ccdomain,$ccuname); + } + if (!$newuser) { %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain, - \@userinfo); + \@userinfo,$rolesarray); + } elsif ($context eq 'selfcreate') { + %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo, + $inst_results,$rolesarray); } my %lt=&Apache::lonlocal::texthash( 'pd' => "Personal Data", @@ -1443,40 +1439,93 @@ sub personal_data_display { &Apache::lonhtmlcommon::start_pick_box(); foreach my $item (@userinfo) { my $rowtitle = $lt{$item}; + my $hiderow = 0; if ($item eq 'generation') { $rowtitle = $genhelp.$rowtitle; } - $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n"; + my $row = &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n"; if ($newuser) { if (ref($inst_results) eq 'HASH') { if ($inst_results->{$item} ne '') { - $output .= ''.$inst_results->{$item}; + $row .= ''.$inst_results->{$item}; } else { - $output .= ''; + if ($context eq 'selfcreate') { + if ($canmodify{$item}) { + $row .= ''; + $editable ++; + } else { + $hiderow = 1; + } + } else { + $row .= ''; + } } } else { - $output .= ''; + if ($context eq 'selfcreate') { + if ($canmodify{$item}) { + $row .= ''; + $editable ++; + } else { + $hiderow = 1; + } + } else { + $row .= ''; + } } } else { if ($canmodify{$item}) { - $output .= ''; + $row .= ''; } else { - $output .= $userenv{$item}; + $row .= $userenv{$item}; } if ($item eq 'id') { $showforceid = $canmodify{$item}; } } - $output .= &Apache::lonhtmlcommon::row_closure(1); + $row .= &Apache::lonhtmlcommon::row_closure(1); + if (!$hiderow) { + $output .= $row; + $rowcount ++; + } } $output .= &Apache::lonhtmlcommon::end_pick_box(); if (wantarray) { - return ($output,$showforceid); + if ($context eq 'selfcreate') { + return($output,$rowcount,$editable); + } else { + return ($output,$showforceid); + } } else { return $output; } } +sub selfcreate_canmodify { + my ($context,$dom,$userinfo,$inst_results,$rolesarray) = @_; + if (ref($inst_results) eq 'HASH') { + my @inststatuses = &get_inststatuses($inst_results); + if (@inststatuses == 0) { + @inststatuses = ('default'); + } + $rolesarray = \@inststatuses; + } + my %canmodify = + &Apache::lonuserutils::can_modify_userinfo($context,$dom,$userinfo, + $rolesarray); + return %canmodify; +} + +sub get_inststatuses { + my ($insthashref) = @_; + my @inststatuses = (); + if (ref($insthashref) eq 'HASH') { + if (ref($insthashref->{'inststatus'}) eq 'ARRAY') { + @inststatuses = @{$insthashref->{'inststatus'}}; + } + } + return @inststatuses; +} + # ================================================================= Phase Three sub update_user_data { my ($r,$context) = @_; @@ -1501,7 +1550,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'}, @@ -1651,6 +1706,27 @@ sub update_user_data { $r->print(&mt('Generating user').': '.$result); $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); + 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') && @@ -1970,7 +2046,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').' '. @@ -2025,12 +2101,14 @@ END &mt('Contact your helpdesk for more information.',"javascript:helpMenu('display')").'
'); } $r->print($no_forceid_alert. - &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules)); + &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); + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context); + $r->print('

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

'); } else { - my @rolechanges = &update_roles($r); + my @rolechanges = &update_roles($r,$context); if ($namechanged) { if ($context eq 'course') { if (@userroles > 0) { @@ -2046,12 +2124,22 @@ END } } } + 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]',''.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')').'' + .(' 'x5).'' + .&mt('Create/Modify Another User').'

'); + } } $r->print(&Apache::loncommon::end_page()); } sub update_roles { - my ($r) = @_; + my ($r,$context) = @_; my $now=time; my @rolechanges; my %disallowed; @@ -2067,7 +2155,7 @@ sub update_roles { my $result = &Apache::lonnet::revokerole($env{'form.ccdomain'}, $env{'form.ccuname'}, - $scope,$role); + $scope,$role,'','',$context); $r->print(&mt('Revoking [_1] in [_2]: [_3]', $role,$scope,''.$result.'').'
'); if ($role eq 'st') { @@ -2086,7 +2174,7 @@ sub update_roles { $r->print(&mt('Revoking custom role:'). ' '.$4.' by '.$3.':'.$2.' in '.$1.': '. &Apache::lonnet::revokecustomrole($env{'form.ccdomain'}, - $env{'form.ccuname'},$1,$2,$3,$4). + $env{'form.ccuname'},$1,$2,$3,$4,'','',$context). '
'); if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); @@ -2099,7 +2187,8 @@ sub update_roles { my $result = &Apache::lonnet::assignrole($env{'form.ccdomain'}, $env{'form.ccuname'}, - $scope,$role,$now,0,1); + $scope,$role,$now,0,1,'', + $context); $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope, ''.$result.'').'
'); if ($role eq 'st') { @@ -2120,7 +2209,7 @@ sub update_roles { $rolename,$rnam,$rdom,$url).': '. &Apache::lonnet::assigncustomrole($env{'form.ccdomain'}, $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now, - 0,1).'
'); + 0,1,$context).'
'); if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); } @@ -2152,7 +2241,8 @@ sub update_roles { } } else { my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'}, - $env{'form.ccuname'},$url,$role,0,$now); + $env{'form.ccuname'},$url,$role,0,$now,'','', + $context); $output = &mt('Re-enabling [_1] in [_2]: [_3]', $role,$url,$result).'
'; } @@ -2166,7 +2256,7 @@ sub update_roles { my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4); my $result = &Apache::lonnet::assigncustomrole( $env{'form.ccdomain'}, $env{'form.ccuname'}, - $url,$rdom,$rnam,$rolename,0,$now); + $url,$rdom,$rnam,$rolename,0,$now,undef,$context); $r->print(&mt('Re-enabling custom role [_1] by [_2]@[_3] in [_4] : [_5]', $rolename,$rnam,$rdom,$url,$result).'
'); if (!grep(/^cr$/,@rolechanges)) { @@ -2193,7 +2283,7 @@ sub update_roles { my %sections = (); my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5); if ($num_sections == 0) { - $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end)); + $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end,$context)); } else { my %curr_groups = &Apache::longroup::coursegroups($one,$two); @@ -2204,7 +2294,7 @@ sub update_roles { next; } my $securl = $url.'/'.$sec; - $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end)); + $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end,$context)); } } if (!grep(/^cr$/,@rolechanges)) { @@ -2226,7 +2316,7 @@ sub update_roles { my %sections = (); my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three); if ($num_sections == 0) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context)); } else { my %curr_groups = &Apache::longroup::coursegroups($one,$two); @@ -2240,13 +2330,13 @@ sub update_roles { next; } my $securl = $url.'/'.$sec; - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec)); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context)); } else { $emptysec = 1; } } if ($emptysec) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context)); } } if (!grep(/^\Q$three\E$/,@rolechanges)) { @@ -2268,19 +2358,19 @@ sub update_roles { my %sections = (); 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,$two,$start,$end,$one,undef,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context)); } 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,$two,$start,$end,$one,undef,$sec)); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context)); } else { $emptysec = 1; } } if ($emptysec) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'')); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context)); } } if (!grep(/^\Q$two\E$/,@rolechanges)) { @@ -2308,7 +2398,7 @@ sub update_roles { } sub enroll_single_student { - my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_; + my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_; $r->print('

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

'); # Remove non alphanumeric values from section @@ -2323,7 +2413,7 @@ sub enroll_single_student { $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'}); + $startdate,'manual',undef,$env{'request.course.id'},'',$context); if ($enroll_result =~ /^ok/) { $r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'})); if ($env{'form.sections'} ne '') { @@ -2532,7 +2622,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('
'); @@ -2643,7 +2733,7 @@ sub make_button_code { } # ---------------------------------------------------------- Call to definerole sub set_custom_role { - my ($r) = @_; + my ($r,$context) = @_; my $rolename=$env{'form.rolename'}; $rolename=~s/[^A-Za-z0-9]//gs; if (!$rolename) { @@ -2718,7 +2808,7 @@ sub set_custom_role { $url, $env{'user.domain'}, $env{'user.name'}, - $rolename)); + $rolename,undef,undef,undef,$context)); } $r->print('

'.&mt('Create or edit another custom role').'

'); $r->print(&Apache::lonhtmlcommon::echo_form_input([]).'
'); @@ -2742,7 +2832,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 @@ -2799,7 +2890,6 @@ 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') { @@ -2822,14 +2912,8 @@ sub handler { $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') && @@ -2851,6 +2935,7 @@ sub handler { } elsif ($currstate eq 'query') { &print_user_query_page($r,'createuser'); } else { + $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$response,$srch, $forcenewuser); } @@ -2867,7 +2952,7 @@ sub handler { } } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) { if ($env{'form.phase'} eq 'set_custom_roles') { - &set_custom_role($r); + &set_custom_role($r,$context); } else { &custom_role_editor($r); } @@ -2951,6 +3036,35 @@ sub handler { ''.&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')); + $r->print('

'.&mt('Self-enrollment with a student role').'

'."\n"); + &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')); + $r->print('

'.&mt('Self-enrollment with a student role').'

'."\n"); + &update_selfenroll_config($r,$context,$permission); + } + $r->print(&Apache::loncommon::end_page()); + } elsif ($env{'form.action'} eq 'changelogs') { + $r->print(&header()); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=changelogs', + text=>"User Management Logs"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes', + 'Course_User_Logs')); + &print_userchangelogs_display($r,$context,$permission); + $r->print(&Apache::loncommon::end_page()); } else { $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); @@ -3054,24 +3168,44 @@ sub print_main_menu { }); if (!exists($permission->{'cusr_section'})) { push(@courselinks, - { text => 'Automated Student Enrollment Manager', + { text => 'Automated 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', help => 'Course_Manage_Group', permission => $permission->{'grp_manage'}, url => '/adm/coursegroups?refpage=cusr', - }); + }, + { text => 'View Change Logs', + help => 'Course_User_Logs', + action => 'changelogs', + permission => $permission->{'cusr'}, + },); +# { text => 'View Log-in History', +# help => 'Course_User_Logins', +# action => 'logins', +# permission => $permission->{'cusr'}, +# }); push(@menu,@courselinks); } my $menu_html = ''; 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{}; @@ -3080,10 +3214,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; @@ -3100,6 +3230,815 @@ 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 %alerts = &Apache::lonlocal::texthash( + acto => 'Activation of self-enrollment was selected for the following domain(s)', + butn => 'but no user types have been checked.', + wilf => "Please uncheck 'activate' or check at least one type.", + ); + my $selfenroll_js = <<"ENDSCRIPT"; +function update_types(caller,num) { + var delidx = getIndexByName('selfenroll_delete'); + var actidx = getIndexByName('selfenroll_activate'); + if (caller == 'selfenroll_all') { + var selall; + for (var i=0; i 0) { + var msg = "$alerts{'acto'}\\n"; + var loopend = needaction.length -1; + if (loopend > 0) { + for (var m=0; m'."\n". + '

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

'."\n"; + my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum); + if (ref($visactions) eq 'HASH') { + if ($visible) { + $output .= '

'.$visactions->{'vis'}.'

'; + } else { + $output .= $visactions->{'miss'}.'
'.$visactions->{'yous'}. + '

'.$visactions->{'gen'}.'
'.$visactions->{'coca'}; + if (ref($vismsgs) eq 'ARRAY') { + $output .= '
'.$visactions->{'make'}.'

    '; + foreach my $item (@{$vismsgs}) { + $output .= '
  • '.$visactions->{$item}.'
  • '; + } + $output .= '
'; + } + $output .= '

'; + } + } + $output .= '
'."\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'}; + my $showdomdesc = 1; + my $includeempty = 1; + my $num = 0; + $output .= &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_row() + .''. + '  '.&mt('No').''. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(). + &mt('Or').'
'. + &Apache::loncommon::start_data_table(); + my %currdoms; + if ($curr_types eq '') { + $output .= &new_selfenroll_dom_row($cdom,'0'); + } elsif ($curr_types ne '*') { + my @entries = split(/;/,$curr_types); + if (@entries > 0) { + foreach my $entry (@entries) { + my ($currdom,$typestr) = split(/:/,$entry); + $currdoms{$currdom} = 1; + my $domdesc = &Apache::lonnet::domain($currdom); + my @currinsttypes = split(',',$typestr); + $output .= &Apache::loncommon::start_data_table_row() + .''.&mt('Domain:').'' + .' '.$domdesc.' ('.$currdom.')' + .'
' + .''; + $output .= '  '.&mt('User types:').'
' + .&selfenroll_inst_types($num,$currdom,\@currinsttypes).'' + .&Apache::loncommon::end_data_table_row(); + $num ++; + } + } + } + my $add_domtitle = &mt('Users in additional domain:'); + if ($curr_types eq '*') { + $add_domtitle = &mt('Users in specific domain:'); + } elsif ($curr_types eq '') { + $add_domtitle = &mt('Users in other domain:'); + } + $output .= &Apache::loncommon::start_data_table_row() + .''.$add_domtitle.'
' + .&Apache::loncommon::select_dom_form('','selfenroll_newdom', + $includeempty,$showdomdesc) + .'' + .''.&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table(); + } 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 %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 visible_in_cat { + my ($cdom,$cnum) = @_; + my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); + my ($cathash,%settable,@vismsgs,$cansetvis); + my %visactions = &Apache::lonlocal::texthash( + vis => 'Your course currently appears in the Course Catalog for this domain.', + gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.', + miss => 'Your course does not currently appear in the Course Catalog for this domain.', + yous => 'You should remedy this if you plan to allow self-enrollment, otherwise students will have difficulty finding your course.', + coca => 'Courses can be absent from the Catalog, because they do not have an institutional code, have no assigned category, or have been specifically excluded.', + make => 'Make any changes to self-enrollment settings below, click "Save changes", then take action to include the course in the Catalog:', + take => 'Take the following action to ensure the course appears in the Catalog:', + dc_unhide => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.', + dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".', + dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).', + dc_catalog => 'Ask a domain coordinator to enable or create at least one course category in the domain.', + dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.', + dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain', + dc_addcat => 'Ask a domain coordinator to assign a category to the course.', + ); + $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','',''); + $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','',''); + $visactions{'addcat'} = &mt('Use [_1]Set course environment[_2] to assign a category to the course.','',''); + if (ref($domconf{'coursecategories'}) eq 'HASH') { + if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') { + $settable{'togglecats'} = 1; + } + if ($domconf{'coursecategories'}{'categorize'} eq 'crs') { + $settable{'categorize'} = 1; + } + $cathash = $domconf{'coursecategories'}{'cats'}; + } + if ($settable{'togglecats'} && $settable{'categories'}) { + $cansetvis = &mt('You are able to both assign a course category and choose to exclude this course from the catalog.'); + } elsif ($settable{'togglecats'}) { + $cansetvis = &mt('You are able to choose to exclude this course from the catalog, but only a Domain Coordinator may assign a course category.'); + } elsif ($settable{'categories'}) { + $cansetvis = &mt('You may assign a course category, but only a Domain Coordinator may choose to exclude this course from the catalog.'); + } else { + $cansetvis = &mt('Only a Domain Coordinator may assign a course category or choose to exclude this course from the catalog.'); + } + + my %currsettings = + &Apache::lonnet::get('environment',['hidefromcat','categories','internal.coursecode'], + $cdom,$cnum); + my $visible = 0; + if ($currsettings{'internal.coursecode'} ne '') { + if (ref($domconf{'coursecategories'}) eq 'HASH') { + $cathash = $domconf{'coursecategories'}{'cats'}; + if (ref($cathash) eq 'HASH') { + if ($cathash->{'instcode::0'} eq '') { + push(@vismsgs,'dc_addinst'); + } else { + $visible = 1; + } + } else { + $visible = 1; + } + } else { + $visible = 1; + } + } else { + if (ref($cathash) eq 'HASH') { + if ($cathash->{'instcode::0'} ne '') { + push(@vismsgs,'dc_instcode'); + } + } else { + push(@vismsgs,'dc_instcode'); + } + } + if ($currsettings{'categories'} ne '') { + my $cathash; + if (ref($domconf{'coursecategories'}) eq 'HASH') { + $cathash = $domconf{'coursecategories'}{'cats'}; + if (ref($cathash) eq 'HASH') { + if (keys(%{$cathash}) == 0) { + push(@vismsgs,'dc_catalog'); + } elsif ((keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} ne '')) { + push(@vismsgs,'dc_categories'); + } else { + my @currcategories = split('&',$currsettings{'categories'}); + my $matched = 0; + foreach my $cat (@currcategories) { + if ($cathash->{$cat} ne '') { + $visible = 1; + $matched = 1; + last; + } + } + if (!$matched) { + if ($settable{'categories'}) { + push(@vismsgs,'chgcat'); + } else { + push(@vismsgs,'dc_chgcat'); + } + } + } + } + } + } else { + if (ref($cathash) eq 'HASH') { + if ((keys(%{$cathash}) > 1) || + (keys(%{$cathash}) == 1) && ($cathash->{'instcode::0'} eq '')) { + if ($settable{'categories'}) { + push(@vismsgs,'addcat'); + } else { + push(@vismsgs,'dc_addcat'); + } + } + } + } + if ($currsettings{'hidefromcat'} eq 'yes') { + $visible = 0; + if ($settable{'togglecats'}) { + unshift(@vismsgs,'unhide'); + } else { + unshift(@vismsgs,'dc_unhide') + } + } + return ($visible,$cansetvis,\@vismsgs,\%visactions); +} + +sub new_selfenroll_dom_row { + my ($newdom,$num) = @_; + my $domdesc = &Apache::lonnet::domain($newdom); + my $output; + if ($domdesc ne '') { + $output .= &Apache::loncommon::start_data_table_row() + .''.&mt('Domain:').' '.$domdesc + .' ('.$newdom.')
' + .''; + my @currinsttypes; + $output .= ''.&mt('User types:').'
' + .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'' + .&Apache::loncommon::end_data_table_row(); + } + return $output; +} + +sub selfenroll_inst_types { + my ($num,$currdom,$currinsttypes) = @_; + my $output; + my $numinrow = 4; + my $count = 0; + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($currdom); + my $othervalue = 'any'; + if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { + if (keys(%{$usertypes}) > 0) { + $othervalue = 'other'; + } + $output .= ''; + foreach my $type (@{$types}) { + if (($count > 0) && ($count%$numinrow == 0)) { + $output .= ''; + } + if (defined($usertypes->{$type})) { + my $esc_type = &escape($type); + $output .= ''; + } + $count ++; + } + if (($count > 0) && ($count%$numinrow == 0)) { + $output .= ''; + } + $output .= '
'; + } + return $output; +} + +sub selfenroll_date_forms { + my ($startform,$endform) = @_; + my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n". + &Apache::lonhtmlcommon::row_title(&mt('Start date'), + 'LC_oddrow_value')."\n". + $startform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::row_title(&mt('End date'), + 'LC_oddrow_value')."\n". + $endform."\n". + &Apache::lonhtmlcommon::row_closure(1). + &Apache::lonhtmlcommon::end_pick_box(); + return $output; +} + +sub print_userchangelogs_display { + my ($r,$context,$permission) = @_; + my $formname = 'roleslog'; + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum); + if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); } + + $r->print('
'); + my %saveable_parameters = ('show' => 'scalar',); + &Apache::loncommon::store_course_settings('roles_log', + \%saveable_parameters); + &Apache::loncommon::restore_course_settings('roles_log', + \%saveable_parameters); + # set defaults + my $now = time(); + my $defstart = $now - (7*24*3600); #7 days ago + my %defaults = ( + page => '1', + show => '10', + role => 'any', + chgcontext => 'any', + rolelog_start_date => $defstart, + rolelog_end_date => $now, + ); + my $more_records = 0; + + # set current + my %curr; + foreach my $item ('show','page','role','chgcontext') { + $curr{$item} = $env{'form.'.$item}; + } + my ($startdate,$enddate) = + &Apache::lonuserutils::get_dates_from_form('rolelog_start_date','rolelog_end_date'); + $curr{'rolelog_start_date'} = $startdate; + $curr{'rolelog_end_date'} = $enddate; + foreach my $key (keys(%defaults)) { + if ($curr{$key} eq '') { + $curr{$key} = $defaults{$key}; + } + } + my (%whodunit,%changed,$version); + ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/); + $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version)); + my $showntablehdr = 0; + my $tablehdr = &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + ' '.&mt('When').''.&mt('Who made the change'). + ''.&mt('Changed User').''.&mt('Role').''.&mt('Section').''. + &mt('Context').''.&mt('Start').''.&mt('End').''. + &Apache::loncommon::end_data_table_header_row(); + my ($minshown,$maxshown); + $minshown = 1; + my $count = 0; + if ($curr{'show'} ne &mt('all')) { + $maxshown = $curr{'page'} * $curr{'show'}; + if ($curr{'page'} > 1) { + $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; + } + } + foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) { + next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) || + ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'})); + if ($curr{'show'} ne &mt('all')) { + if ($count >= $curr{'page'} * $curr{'show'}) { + $more_records = 1; + last; + } + } + if ($curr{'role'} ne 'any') { + next if ($roleslog{$id}{'logentry'}{'role'} ne $curr{'role'}); + } + if ($curr{'chgcontext'} ne 'any') { + if ($curr{'chgcontext'} eq 'selfenroll') { + next if (!$roleslog{$id}{'logentry'}{'selfenroll'}); + } else { + next if ($roleslog{$id}{'logentry'}{'context'} ne $curr{'chgcontext'}); + } + } + $count ++; + next if ($count < $minshown); + if (!$showntablehdr) { + $r->print($tablehdr); + $showntablehdr = 1; + } + if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') { + $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} = + &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'}); + } + if ($changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}} eq '') { + $changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}} = + &Apache::loncommon::plainname($roleslog{$id}{'uname'},$roleslog{$id}{'udom'}); + } + my $sec = $roleslog{$id}{'logentry'}{'section'}; + if ($sec eq '') { + $sec = &mt('None'); + } + my ($rolestart,$roleend); + if ($roleslog{$id}{'delflag'}) { + $rolestart = &mt('deleted'); + $roleend = &mt('deleted'); + } else { + $rolestart = $roleslog{$id}{'logentry'}{'start'}; + $roleend = $roleslog{$id}{'logentry'}{'end'}; + if ($rolestart eq '' || $rolestart == 0) { + $rolestart = &mt('No start date'); + } else { + $rolestart = &Apache::lonlocal::locallocaltime($rolestart); + } + if ($roleend eq '' || $roleend == 0) { + $roleend = &mt('No end date'); + } else { + $roleend = &Apache::lonlocal::locallocaltime($roleend); + } + } + my $chgcontext = $roleslog{$id}{'logentry'}{'context'}; + if ($roleslog{$id}{'logentry'}{'selfenroll'}) { + $chgcontext = 'selfenroll'; + } + my %lt = &rolechg_contexts(); + if ($chgcontext ne '' && $lt{$chgcontext} ne '') { + $chgcontext = $lt{$chgcontext}; + } + $r->print(&Apache::loncommon::start_data_table_row().''.$count.''.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).''.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.''.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.''.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'}).''.$sec.''.$chgcontext.''.$rolestart.''.$roleend.''.&Apache::loncommon::end_data_table_row()."\n"); + } + if ($showntablehdr) { + $r->print(&Apache::loncommon::end_data_table().'
'); + if (($curr{'page'} > 1) || ($more_records)) { + $r->print(''); + if ($curr{'page'} > 1) { + $r->print(''); + } + if ($more_records) { + $r->print(''); + } + $r->print('
'.&mt('Previous [_1] changes',$curr{'show'}).''.&mt('Next [_1] changes',$curr{'show'}).'
'); + $r->print(<<"ENDSCRIPT"); + +ENDSCRIPT + } + } else { + $r->print(&mt('There are no records to display')); + } + $r->print(''. + '
'); + return; +} + +sub role_display_filter { + my ($formname,$cdom,$cnum,$curr,$version) = @_; + my $context = 'course'; + my $nolink = 1; + my $output = ''; + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'rolelog_start_date', + $curr->{'rolelog_start_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date', + $curr->{'rolelog_end_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my %lt = &rolechg_contexts(); + $output .= ''. + '
'. + ''.&mt('Changes/page:').'
'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '
  '.&mt('Window during which changes occurred:').'
'.&mt('After:'). + ''.$startform.'
'.&mt('Before:').''. + $endform.'
  '.&mt('Role:').'
'. + '
  '. + &mt('Context:').'
  
'. + ''. + &mt('[_1]Note:[_2] Only changes made from servers running LON-CAPA 2.6.99.0 or later are displayed.'); + if ($version) { + $output .= ' '.&mt('This server is version [_3].','','',$version); } + $output .= '

'; + return $output; +} + +sub rolechg_contexts { + my %lt = &Apache::lonlocal::texthash ( + any => 'Any', + auto => 'Automated enrollment', + updatenow => 'Roster Update', + createcourse => 'Course Creation', + course => 'User Management in course', + domain => 'User Management in domain', + selfenroll => 'Self-enrolled', + ); + return %lt; +} + #-------------------------------------------------- functions for &phase_two sub user_search_result { my ($context,$srch) = @_; @@ -3132,7 +4071,13 @@ sub user_search_result { if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') || ($srch->{'srchin'} eq 'alc')) { if ($srch->{'srchby'} eq 'uname') { - if ($srch->{'srchterm'} !~ /^$match_username$/) { + my $unamecheck = $srch->{'srchterm'}; + if ($srch->{'srchtype'} eq 'contains') { + if ($unamecheck !~ /^\w/) { + $unamecheck = 'a'.$unamecheck; + } + } + if ($unamecheck !~ /^$match_username$/) { $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); } } @@ -3341,11 +4286,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; } @@ -3466,7 +4415,7 @@ sub build_search_response { &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').'

'; + $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).'

'; @@ -3702,7 +4651,7 @@ sub course_level_dc { '  '. ' '.$lt{'new'}.'
'. ''. - ''. + ''. ''. ''; $otheritems .= < 0) { + @types = sort(@types); + my $typestr = join(',',@types); + my $typedom = $env{'form.selfenroll_dom_'.$num}; + $latesttypes[$newnum] = $typedom.':'.$typestr; + $currdoms{$typedom} = 1; + $newnum ++; + } + } + for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) { if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) { + my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j); + if (@types > 0) { + @types = sort(@types); + my $typestr = join(',',@types); + my $typedom = $env{'form.selfenroll_dom_'.$j}; + $latesttypes[$newnum] = $typedom.':'.$typestr; + $currdoms{$typedom} = 1; + $newnum ++; + } + } + } + if ($env{'form.selfenroll_newdom'} ne '') { + my $typedom = $env{'form.selfenroll_newdom'}; + if ((!defined($currdoms{$typedom})) && + (&Apache::lonnet::domain($typedom) ne '')) { + my $typestr; + my ($othertitle,$usertypes,$types) = + &Apache::loncommon::sorted_inst_types($typedom); + my $othervalue = 'any'; + if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { + if (@{$types} > 0) { + my @esc_types = map { &escape($_); } @{$types}; + $othervalue = 'other'; + $typestr = join(',',($othervalue,@esc_types)); + } + $typestr = $othervalue; + } else { + $typestr = $othervalue; + } + $latesttypes[$newnum] = $typedom.':'.$typestr; + $newnum ++ ; + } + } + my $selfenroll_types = join(';',@latesttypes); + if ($selfenroll_types ne $curr_types) { + $changes{'internal.selfenroll_types'} = $selfenroll_types; + } + } + } 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 (defined($curr_groups{$newval})) { + $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})) { + my $newval = $changes{'internal.selfenroll_'.$item}; + if ($item eq 'types') { + if ($newval eq '') { + $newval = &mt('None'); + } elsif ($newval eq '*') { + $newval = &mt('Any user in any domain'); + } + } elsif ($item eq 'registered') { + if ($newval eq '1') { + $newval = &mt('Yes'); + } elsif ($newval eq '0') { + $newval = &mt('No'); + } + } + $r->print('
  • '.&mt('"[_1]" set to "[_2]".',$title,$newval).'
  • '."\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 made to the existing self-enrollment settings in this course.')); + } + } else { + $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.')); + } + my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum); + if (ref($visactions) eq 'HASH') { + if (!$visible) { + $r->print('
'.$visactions->{'miss'}.'
'.$visactions->{'yous'}. + '
'); + if (ref($vismsgs) eq 'ARRAY') { + $r->print('
'.$visactions->{'take'}.'
    '); + foreach my $item (@{$vismsgs}) { + $r->print('
  • '.$visactions->{$item}.'
  • '); + } + $r->print('
'); + } + $r->print($cansetvis); + } + } + return; +} + +sub get_selfenroll_titles { + my @row = ('types','registered','enroll_dates','access_dates','section'); + my %lt = &Apache::lonlocal::texthash ( + types => 'Users allowed to self-enroll in this course', + registered => 'Restrict self-enrollment to students officially registered for the course', + enroll_dates => 'Dates self-enrollment available', + access_dates => 'Course access dates assigned to self-enrolling users', + section => 'Section assigned to self-enrolling users', + ); + return (\@row,\%lt); +} + #---------------------------------------------- end functions for &phase_two #--------------------------------- functions for &phase_two and &phase_three 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.