--- loncom/interface/loncreateuser.pm 2008/06/04 21:24:20 1.242 +++ loncom/interface/loncreateuser.pm 2008/12/15 00:54:54 1.268.2.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.242 2008/06/04 21:24:20 bisitz Exp $ +# $Id: loncreateuser.pm,v 1.268.2.2 2008/12/15 00:54:54 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,11 +33,13 @@ package Apache::loncreateuser; =head1 NAME -Apache::loncreateuser - handler to create users and custom roles +Apache::loncreateuser.pm =head1 SYNOPSIS -Apache::loncreateuser provides an Apache handler for creating users, + Handler to create users and custom roles + + Provides an Apache handler for creating users, editing their login parameters, roles, and removing roles, and also creating and assigning custom roles. @@ -120,11 +122,20 @@ sub auth_abbrev { sub portfolio_quota { my ($ccuname,$ccdomain) = @_; my %lt = &Apache::lonlocal::texthash( - 'disk' => "Disk space allocated to user's portfolio files", - 'cuqu' => "Current quota", - 'cust' => "Custom quota", - 'defa' => "Default", - 'chqu' => "Change quota", + 'usrt' => "User Tools", + 'blog' => "Personal User Blog", + 'aboutme' => "Personal Information Page", + 'portfolio' => "Personal User Portfolio", + 'avai' => "Available", + 'cusa' => "availability", + 'chse' => "Change setting", + 'disk' => "Disk space allocated to user's portfolio files", + 'cuqu' => "Current quota", + 'cust' => "Custom quota", + 'defa' => "Default", + 'usde' => "Use default", + 'uscu' => "Use custom", + 'chqu' => "Change quota", ); my ($currquota,$quotatype,$inststatus,$defquota) = &Apache::loncommon::get_user_quota($ccuname,$ccdomain); @@ -173,27 +184,82 @@ END_SCRIPT " affiliation ([_2]).",$defquota,$longinsttype); } } - my $output = $quota_javascript. - '

'.$lt{'disk'}.'

'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_row(). - ''.$lt{'cuqu'}.': '.$currquota.' Mb.  '. - $defaultinfo.''. - &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::start_data_table_row(). - ''.$lt{'chqu'}. - ':  '. - '  '. - ' Mb'. - &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table(); + + my $output = $quota_javascript."\n". + '

'.$lt{'usrt'}.'

'."\n". + &Apache::loncommon::start_data_table(); + + if (&Apache::lonnet::allowed('mut',$ccdomain)) { + my %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, + 'tools.aboutme','tools.portfolio','tools.blog'); + my @usertools = ('aboutme','blog','portfolio'); + foreach my $item (@usertools) { + my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off); + $cust_off = 'checked="checked" '; + $tool_on = 'checked="checked" '; + $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item); + if ($userenv{'tools.'.$item} eq '') { + $custom_access = 'default'; + if (!$curr_access) { + $tool_off = 'checked="checked" '; + $tool_on = ''; + } + } else { + $custom_access = 'custom'; + $cust_on = ' checked="checked" '; + $cust_off = ''; + if ($userenv{'tools.'.$item} == 0) { + $tool_off = 'checked="checked" '; + $tool_on = ''; + } + } + $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item); + $output .= ' '."\n". + ' '.$lt{$item}.''."\n". + ' '."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '.&mt('Availability determined currently from [_1] setting.',$custom_access). + '     '.$lt{'avai'}.': '. + ($curr_access?&mt('Yes'):&mt('No')).''."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '.$lt{'chse'}.':    '. + '  --  '. + $lt{'cusa'}.':  '."\n". + &Apache::loncommon::end_data_table_row()."\n"; + } + } + if (&Apache::lonnet::allowed('mpq',$ccdomain)) { + $output .= ''."\n". + ' '.$lt{'disk'}.''."\n". + ' '."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '.$lt{'cuqu'}.': '. + $currquota.' Mb.  '. + $defaultinfo.''."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '.$lt{'chqu'}. + ':  '. + '  '. + ' Mb'."\n". + &Apache::loncommon::end_data_table_row()."\n"; + } + $output .= &Apache::loncommon::end_data_table(); return $output; } @@ -649,8 +715,9 @@ ENDFORMINFO } if ($newuser) { my $portfolioform; - if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) { - # Current user has quota modification privileges + if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) || + (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) { + # Current user has quota or user tools modification privileges $portfolioform = '
'.&portfolio_quota($ccuname,$ccdomain); } &initialize_authen_forms($ccdomain,$formname); @@ -775,35 +842,62 @@ ENDCHANGEUSER } $r->print(''); my $user_auth_text = &user_authentication($ccuname,$ccdomain,$formname); - my $user_quota_text; - if (&Apache::lonnet::allowed('mpq',$ccdomain)) { + my ($user_quota_text,$user_tools_text); + if ((&Apache::lonnet::allowed('mpq',$ccdomain)) || + (&Apache::lonnet::allowed('mut',$ccdomain))) { # Current user has quota modification privileges $user_quota_text = &portfolio_quota($ccuname,$ccdomain); - } elsif (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) { - # Get the user's portfolio information - my %portq = &Apache::lonnet::get('environment',['portfolioquota'], - $ccdomain,$ccuname); - - my %lt=&Apache::lonlocal::texthash( - 'dska' => "Disk space allocated to user's portfolio files", - 'youd' => "You do not have privileges to modify the portfolio quota for this user.", - 'ichr' => "If a change is required, contact a domain coordinator for the domain", - ); - $user_quota_text = < "Disk space allocated to user's portfolio files", + 'youd' => "You do not have privileges to modify the portfolio quota for this user.", + 'ichr' => "If a change is required, contact a domain coordinator for the domain", + ); + $user_quota_text = <$lt{'dska'} $lt{'youd'} $lt{'ichr'}: $ccdomain ENDNOPORTPRIV + } + } + if (!&Apache::lonnet::allowed('mut',$ccdomain)) { + if (&Apache::lonnet::allowed('mut',$env{'request.role.domain'})) { + my %lt=&Apache::lonlocal::texthash( + 'utav' => "User Tools Availability", + 'yodo' => "You do not have privileges to modify Portfolio, Blog or Home Page settings for this user.", + 'ifch' => "If a change is required, contact a domain coordinator for the domain", + ); + $user_tools_text = <$lt{'utav'} +$lt{'yodo'} $lt{'ifch'}: $ccdomain +ENDNOTOOLSPRIV + } } if ($user_auth_text ne '') { $r->print('
'.$user_auth_text); if ($user_quota_text ne '') { $r->print($user_quota_text); } + if ($user_tools_text ne '') { + $r->print($user_tools_text); + } if ($env{'form.action'} eq 'singlestudent') { $r->print(&date_sections_select($context,$newuser,$formname)); } } elsif ($user_quota_text ne '') { $r->print('
'.$user_quota_text); + if ($user_tools_text ne '') { + $r->print($user_tools_text); + } + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname)); + } + } elsif ($user_tools_text ne '') { + $r->print('
'.$user_tools_text); if ($env{'form.action'} eq 'singlestudent') { $r->print(&date_sections_select($context,$newuser,$formname)); } @@ -833,10 +927,10 @@ ENDNOPORTPRIV $addrolesdisplay = $add_domainroles; } $r->print(&course_level_dc($env{'request.role.domain'},'Course')); - $r->print('
'."\n"); + $r->print('
'."\n"); } elsif ($context eq 'author') { if ($addrolesdisplay) { - $r->print('
print('
print(' onClick="auth_check()" \>'."\n"); } else { @@ -848,7 +942,7 @@ ENDNOPORTPRIV } } else { $r->print(&course_level_table(%inccourses)); - $r->print('
'."\n"); + $r->print('
'."\n"); } } $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); @@ -967,7 +1061,7 @@ sub display_existing_roles { if (defined($coursedata{'description'})) { $carea=$coursedata{'description'}. '
'.&mt('Domain').': '.$coursedom.(' 'x8). - &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom); + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); $sortkey.="\0".$coursedata{'description'}; $class=$coursedata{'type'}; } else { @@ -1396,10 +1490,12 @@ 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', @@ -1407,7 +1503,10 @@ sub personal_data_display { 'permanentemail','id'],$ccdomain,$ccuname); %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", @@ -1416,7 +1515,7 @@ sub personal_data_display { 'lastname' => "Last Name", 'generation' => "Generation", 'permanentemail' => "Permanent e-mail address", - 'id' => "ID/Student Number", + 'id' => "Student/Employee ID", 'lg' => "Login Data" ); my %textboxsize = ( @@ -1432,40 +1531,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) = @_; @@ -1587,6 +1739,7 @@ sub update_user_data { $r->print('

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

'); my (%alerts,%rulematch,%inst_results,%curr_rules); + my @usertools = ('aboutme','blog','portfolio'); if ($env{'form.makeuser'}) { $r->print('

'.&mt('Creating new account.').'

'); # Check for the authentication mode and password @@ -1646,26 +1799,34 @@ 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 (%changeHash,%newcustom,%changed); + if ($uhome ne 'no_host') { + if ($env{'form.customquota'} == 1) { + if ($env{'form.portfolioquota'} eq '') { + $newcustom{'quota'} = 0; + } else { + $newcustom{'quota'} = $env{'form.portfolioquota'}; + $newcustom{'quota'} =~ s/[^\d\.]//g; + } + $changed{'quota'} = "a_admin($newcustom{'quota'},\%changeHash); } - my $quotachanged = "a_admin($newportfolioquota,\%changeHash); - if ($quotachanged) { + foreach my $item (@usertools) { + if ($env{'form.custom'.$item} == 1) { + $newcustom{$item} = $env{'form.tools_'.$item}; + $changed{$item} = &tool_admin($item,$newcustom{$item},\%changeHash); + } + } + if (keys(%changed)) { $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'}); - } + my $chgresult = + &Apache::lonnet::put('environment',\%changeHash, + $env{'form.ccdomain'},$env{'form.ccuname'}); + } } $r->print('
'.&mt('Home server').': '.$uhome.' '. &Apache::lonnet::hostname($uhome)); @@ -1698,7 +1859,8 @@ sub update_user_data { # Check for need to change my %userenv = &Apache::lonnet::get ('environment',['firstname','middlename','lastname','generation', - 'id','permanentemail','portfolioquota','inststatus'], + 'id','permanentemail','portfolioquota','inststatus','tools.aboutme', + 'tools.blog','tools.portfolio'], $env{'form.ccdomain'},$env{'form.ccuname'}); my ($tmp) = keys(%userenv); if ($tmp =~ /^(con_lost|error)/i) { @@ -1789,7 +1951,7 @@ sub update_user_data { $env{'form.c'.$item} = $userenv{$item}; } } - # Check to see if we can change the ID/student number + # Check to see if we can change the Student/Employee ID my $forceid = $env{'form.forceid'}; my $recurseid = $env{'form.recurseid'}; my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules); @@ -1800,7 +1962,10 @@ sub update_user_data { (!$forceid)) { if ($env{'form.cid'} ne $uidhash{$env{'form.ccuname'}}) { $env{'form.cid'} = $userenv{'id'}; - $no_forceid_alert = &mt('New student/employeeID does not match existing ID for this user.').'
'.&mt('Change is not permitted without checking the \'Force ID change\' checkbox on the previous page.').'
'."\n"; + $no_forceid_alert = &mt('New Student/Employee ID does not match existing ID for this user.') + .'
' + .&mt("Change is not permitted without checking the 'Force ID change' checkbox on the previous page.") + .'
'."\n"; } } if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1820,14 +1985,17 @@ sub update_user_data { } my ($quotachanged,$oldportfolioquota,$newportfolioquota, $inststatus,$oldisdefault,$newisdefault,$olddefquotatext, - $newdefquotatext); + $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext); my ($defquota,$settingstatus) = &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); - my $showquota; + my ($showquota,$showtools); if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { $showquota = 1; } - my %changeHash; + if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) { + $showtools = 1; + } + my (%changeHash,%changed); $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; if ($userenv{'portfolioquota'} ne '') { $oldportfolioquota = $userenv{'portfolioquota'}; @@ -1839,10 +2007,10 @@ sub update_user_data { $newportfolioquota =~ s/[^\d\.]//g; } if ($newportfolioquota != $oldportfolioquota) { - $quotachanged = "a_admin($newportfolioquota,\%changeHash); + $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); } } else { - $quotachanged = "a_admin('',\%changeHash); + $changed{'quota'} = "a_admin('',\%changeHash); $newportfolioquota = $defquota; $newisdefault = 1; } @@ -1856,7 +2024,7 @@ sub update_user_data { $newportfolioquota = $env{'form.portfolioquota'}; $newportfolioquota =~ s/[^\d\.]//g; } - $quotachanged = "a_admin($newportfolioquota,\%changeHash); + $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); } else { $newportfolioquota = $defquota; $newisdefault = 1; @@ -1868,6 +2036,74 @@ sub update_user_data { if ($newisdefault) { $newdefquotatext = &get_defaultquota_text($settingstatus); } + + foreach my $tool (@usertools) { + if ($userenv{'tools.'.$tool} ne '') { + $oldaccess{$tool} = &mt('custom'); + if ($userenv{'tools_'.$tool}) { + $oldaccesstext{$tool} = &mt("availability set to 'on'"); + } else { + $oldaccesstext{$tool} = &mt("availability set to 'off'"); + } + $changeHash{'tools.'.$tool} = $userenv{'tools.'.$tool}; + if ($env{'form.custom'.$tool} == 1) { + if ($env{'form.tools_'.$tool} ne $userenv{'tools.'.$tool}) { + $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool}, + \%changeHash); + if ($changed{$tool}) { + $newaccess{$tool} = &mt('custom'); + if ($env{'form.tools_'.$tool}) { + $newaccesstext{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext{$tool} = &mt("availability set to 'off'"); + } + } else { + $newaccess{$tool} = $oldaccess{$tool}; + if ($userenv{'tools.'.$tool}) { + $newaccesstext{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext{$tool} = &mt("availability set to 'off'"); + } + } + } else { + $newaccess{$tool} = $oldaccess{$tool}; + $newaccesstext{$tool} = $oldaccesstext{$tool}; + } + } else { + $changed{$tool} = &tool_admin($tool,'',\%changeHash); + print STDERR "for $tool - changed is $changed{$tool}\n"; + if ($changed{$tool}) { + $newaccess{$tool} = &mt('default'); + } else { + $newaccess{$tool} = $oldaccess{$tool}; + if ($userenv{'tools.'.$tool}) { + $newaccesstext{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext{$tool} = &mt("availability set to 'off'"); + } + } + } + } else { + $oldaccess{$tool} = &mt('default'); + if ($env{'form.custom'.$tool} == 1) { + $changed{$tool} = &tool_admin($tool,$env{'form.tools_'.$tool}, + \%changeHash); + if ($changed{$tool}) { + $newaccess{$tool} = &mt('custom'); + if ($env{'form.tools_'.$tool}) { + $newaccesstext{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext{$tool} = &mt("availability set to 'off'"); + } + } else { + $newaccess{$tool} = $oldaccess{$tool}; + } + } else { + $newaccess{$tool} = $oldaccess{$tool}; + } + } + } + if ($env{'form.cfirstname'} ne $userenv{'firstname'} || $env{'form.cmiddlename'} ne $userenv{'middlename'} || $env{'form.clastname'} ne $userenv{'lastname'} || @@ -1876,18 +2112,33 @@ sub update_user_data { $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) { $namechanged = 1; } - if ($namechanged || $quotachanged) { + if (($namechanged) || (keys(%changed) > 0)) { $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,$namechgresult); - if ($quotachanged) { - $quotachgresult = + my ($chgresult,$namechgresult); + if (keys(%changed) > 0) { + $chgresult = &Apache::lonnet::put('environment',\%changeHash, $env{'form.ccdomain'},$env{'form.ccuname'}); + if ($chgresult eq 'ok') { + my %newenvhash; + my $hashid="$env{'form.ccuname'}:$env{'form.ccdomain'}"; + foreach my $key (keys(%changed)) { + if ($key ne 'quota') { + &Apache::lonnet::devalidate_cache_new('usertools.'.$key,$hashid); + $newenvhash{'environment.tools.'.$key} = + $changeHash{'tools.'.$key}; + } + } + if (($env{'user.name'} eq $env{'form.ccuname'}) && + ($env{'user.domain'} eq $env{'form.ccdomain'})) { + &Apache::lonnet::appenv(\%newenvhash); + } + } } if ($namechanged) { # Make the change @@ -1906,19 +2157,22 @@ sub update_user_data { ); } if (($namechanged && $namechgresult eq 'ok') || - ($quotachanged && $quotachgresult eq 'ok')) { + ((keys(%changed) > 0) && $chgresult eq 'ok')) { # Tell the user we changed the name my %lt=&Apache::lonlocal::texthash( - 'uic' => "User Information Changed", - 'frst' => "first", - 'mddl' => "middle", - 'lst' => "last", - 'gen' => "generation", - 'id' => "ID/Student number", - 'mail' => "permanent e-mail", - 'disk' => "disk space allocated to portfolio files", - 'prvs' => "Previous", - 'chto' => "Changed To" + 'uic' => "User Information Changed", + 'frst' => "First", + 'mddl' => "Middle", + 'lst' => "Last", + 'gen' => "Generation", + 'id' => "Student/Employee ID", + 'mail' => "Permanent E-mail", + 'disk' => "Disk space allocated to portfolio files", + 'blog' => "Blog Availability", + 'aboutme' => "Home Page Availability", + 'portfolio' => "Portfolio Availability", + 'prvs' => "Previous", + 'chto' => "Changed To" ); $r->print('

'.$lt{'uic'}.'

'. &Apache::loncommon::start_data_table(). @@ -1936,6 +2190,12 @@ END $r->print(" $lt{'disk'}\n"); } + if ($showtools) { + foreach my $item (@usertools) { + $r->print(" + $lt{$item}\n"); + } + } $r->print(&Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1951,10 +2211,16 @@ END $r->print(" $oldportfolioquota Mb $olddefquotatext \n"); } + if ($showtools) { + foreach my $item (@usertools) { + $r->print(" + $oldaccess{$item} $oldaccesstext{$item} \n"); + } + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); - $lt{'chto'} + $lt{'chto'} $env{'form.cfirstname'} $env{'form.cmiddlename'} $env{'form.clastname'} @@ -1966,6 +2232,12 @@ END $r->print(" $newportfolioquota Mb $newdefquotatext \n"); } + if ($showtools) { + foreach my $item (@usertools) { + $r->print(" + $newaccess{$item} $newaccesstext{$item} \n"); + } + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'
'); if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1994,12 +2266,15 @@ END $env{'form.ccdomain'}.'
'); } } else { # End of if ($env ... ) logic - # They did not want to change the users name or quota but we can - # still tell them what the name and quota are + # They did not want to change the users name, quota or tool availability, + # but we can still tell them what the name and quota and availabilities are my %lt=&Apache::lonlocal::texthash( - 'id' => "ID/Student number", - 'mail' => "Permanent e-mail", - 'disk' => "Disk space allocated to user's portfolio files", + 'id' => "Student/Employee ID", + 'mail' => "Permanent e-mail", + 'disk' => "Disk space allocated to user's portfolio files", + 'blog' => "Blog Availability", + 'aboutme' => "Home Page Availability", + 'portfolio' => "Portfolio Availability", ); $r->print(<<"END");

$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'} @@ -2008,8 +2283,14 @@ END $r->print('
['.$lt{'mail'}.': '. $userenv{'permanentemail'}.']'); } + if ($showtools) { + foreach my $item (@usertools) { + $r->print('
['.$lt{$item}.': '.$newaccess{$item}.' '. + $newaccesstext{$item}.']'."\n"); + } + } if ($showquota) { - $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. + $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. $olddefquotatext.']'); } $r->print('

'); @@ -2040,8 +2321,10 @@ END $r->print(''.$rolestr.'
'. &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)); + $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,$context); @@ -2069,7 +2352,10 @@ END 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('

' + .&mt('Modify this user: [_1]',''.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')').'' + .(' 'x5).'' + .&mt('Create/Modify Another User').'

'); } } $r->print(&Apache::loncommon::end_page()); @@ -2180,8 +2466,8 @@ sub update_roles { my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'}, $env{'form.ccuname'},$url,$role,0,$now,'','', $context); - $output = &mt('Re-enabling [_1] in [_2]: [_3]', - $role,$url,$result).'
'; + $output = &mt('Re-enabling [_1] in [_2]: [_3]', + $role,$url,''.$result.'').'
'; } $r->print($output); if (!grep(/^\Q$role\E$/,@rolechanges)) { @@ -2194,8 +2480,8 @@ sub update_roles { my $result = &Apache::lonnet::assigncustomrole( $env{'form.ccdomain'}, $env{'form.ccuname'}, $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).'
'); + $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'); } @@ -2424,12 +2710,27 @@ sub quota_admin { my $quotachanged; if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { # Current user has quota modification privileges - $quotachanged = 1; - $changeHash->{'portfolioquota'} = $setquota; + if (ref($changeHash) eq 'HASH') { + $quotachanged = 1; + $changeHash->{'portfolioquota'} = $setquota; + } } return $quotachanged; } +sub tool_admin { + my ($tool,$settool,$changeHash) = @_; + my $toolchanged; + if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) { + # Current user has quota modification privileges + if (ref($changeHash) eq 'HASH') { + $toolchanged = 1; + $changeHash->{'tools.'.$tool} = $settool; + } + } + return $toolchanged; +} + sub build_roles { my ($sectionstr,$sections,$role) = @_; my $num_sections = 0; @@ -2539,7 +2840,7 @@ sub custom_role_editor { my @template_roles = ("cc","in","ta","ep","st"); foreach my $role (@template_roles) { $head_script .= &make_script_template($role); - $button_code .= &make_button_code($role); + $button_code .= &make_button_code($role).' '; } $head_script .= "\n".$jsback."\n".''."\n"; $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script)); @@ -2559,10 +2860,15 @@ sub custom_role_editor { 'crl' => "Course Level", 'dml' => "Domain Level", 'ssl' => "System Level"); - $r->print(&mt('Select a Template').'
'); - $r->print('
'); - $r->print($button_code); - $r->print('
'); + + $r->print('
' + .'
' + .''.&mt('Select a Template').'' + .$button_code + .'
' + .'
' + ); + $r->print(< @@ -2622,34 +2928,35 @@ sub make_script_template { my ($priv_item, $dummy) = split(/\&/,$priv); $role_c{$priv_item} = 1; } + my %role_d; + @temp = split(/:/,$Apache::lonnet::pr{$role.':d'}); + foreach my $priv(@temp) { + my ($priv_item, $dummy) = split(/\&/,$priv); + $role_d{$priv_item} = 1; + } + my %role_s; + @temp = split(/:/,$Apache::lonnet::pr{$role.':s'}); + foreach my $priv(@temp) { + my ($priv_item, $dummy) = split(/\&/,$priv); + $role_s{$priv_item} = 1; + } foreach my $priv_item (keys(%full_c)) { my ($priv, $dummy) = split(/\&/,$priv_item); - if (exists($role_c{$priv})) { + if ((exists($role_c{$priv})) || (exists($role_d{$priv})) || + (exists($role_s{$priv}))) { $return_script .= "document.form1.$priv"."_c.checked = true;\n"; } else { $return_script .= "document.form1.$priv"."_c.checked = false;\n"; } } - my %role_d; - @temp = split(/:/,$Apache::lonnet::pr{$role.':d'}); - foreach my $priv(@temp) { - my ($priv_item, $dummy) = split(/\&/,$priv); - $role_d{$priv_item} = 1; - } foreach my $priv_item (keys(%full_d)) { my ($priv, $dummy) = split(/\&/,$priv_item); - if (exists($role_d{$priv})) { + if ((exists($role_d{$priv})) || (exists($role_s{$priv}))) { $return_script .= "document.form1.$priv"."_d.checked = true;\n"; } else { $return_script .= "document.form1.$priv"."_d.checked = false;\n"; } } - my %role_s; - @temp = split(/:/,$Apache::lonnet::pr{$role.':s'}); - foreach my $priv(@temp) { - my ($priv_item, $dummy) = split(/\&/,$priv); - $role_s{$priv_item} = 1; - } foreach my $priv_item (keys(%full_s)) { my ($priv, $dummy) = split(/\&/,$priv_item); if (exists($role_s{$priv})) { @@ -2665,7 +2972,7 @@ sub make_script_template { sub make_button_code { my ($role) = @_; my $label = &Apache::lonnet::plaintext($role); - my $button_code = ''; + my $button_code = ''; return ($button_code); } # ---------------------------------------------------------- Call to definerole @@ -3070,7 +3377,7 @@ sub print_main_menu { action => 'upload', permission => $permission->{'cusr'}, }, - { text => $links{$context}{'singleuser'}, + { text => $links{$context}{'singleuser'}, help => 'Course_Change_Privileges', action => 'singleuser', permission => $permission->{'cusr'}, @@ -3114,7 +3421,7 @@ sub print_main_menu { { text => 'Configure User Self-enrollment', help => 'Course_Self_Enrollment', action => 'selfenroll', - permission => $permission->{'cusr'}, + permission => $permission->{'cusr'}, }); } push(@courselinks, @@ -3127,12 +3434,12 @@ sub print_main_menu { help => 'Course_User_Logs', action => 'changelogs', permission => $permission->{'cusr'}, - }, - { text => 'View Log-in History', - help => 'Course_User_Logins', - action => 'logins', - permission => $permission->{'cusr'}, - }); + },); +# { text => 'View Log-in History', +# help => 'Course_User_Logins', +# action => 'logins', +# permission => $permission->{'cusr'}, +# }); push(@menu,@courselinks); } my $menu_html = ''; @@ -3148,8 +3455,7 @@ sub print_main_menu { $menu_html.=qq{}; } else { $menu_html.= - qq{}; - } + qq{}; } $menu_html.= &mt($menu_item->{'text'}).''; $menu_html.='

'; } @@ -3175,14 +3481,203 @@ sub print_selfenroll_menu { 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". - '
'."\n". - &Apache::lonhtmlcommon::start_pick_box(); - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'},'.num'}; + '

'.$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; @@ -3205,14 +3700,20 @@ sub print_selfenroll_menu { if ($curr_types eq '*') { $output .= ' checked="checked" '; } - $output .= '/>'.&mt('Yes').'  '.&mt('Yes').''. + '  ' - .&Apache::loncommon::end_data_table_row(); + $output .= ' onchange="javascript:update_types('. + "'selfenroll_all'".');"/>'.&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 '') && ($env{'form.selfenroll_newdom'} eq '')) { + if ($curr_types eq '') { $output .= &new_selfenroll_dom_row($cdom,'0'); } elsif ($curr_types ne '*') { my @entries = split(/;/,$curr_types); @@ -3221,33 +3722,27 @@ sub print_selfenroll_menu { my ($currdom,$typestr) = split(/:/,$entry); $currdoms{$currdom} = 1; my $domdesc = &Apache::lonnet::domain($currdom); - my @currinsttypes = split(/,/,$typestr); + my @currinsttypes = split(',',$typestr); $output .= &Apache::loncommon::start_data_table_row() .''.&mt('Domain:').'' .' '.$domdesc.' ('.$currdom.')' .'
' .''; - $output .= ''.&mt('User types:').'
' + $output .= '  '.&mt('User types:').'
' .&selfenroll_inst_types($num,$currdom,\@currinsttypes).'' .&Apache::loncommon::end_data_table_row(); $num ++; } } } - if ($env{'form.selfenroll_newdom'} ne '') { - if (!defined($currdoms{$env{'form.selfenroll_newdom'}})) { - $output .= &new_selfenroll_dom_row($env{'form.selfenroll_newdom'},$num); - $num ++; - } - } - my $add_domtitle = &mt('Additional domain:'); + my $add_domtitle = &mt('Users in additional domain:'); if ($curr_types eq '*') { - $add_domtitle = &mt('Specific Domain:'); + $add_domtitle = &mt('Users in specific domain:'); } elsif ($curr_types eq '') { - $add_domtitle = &mt('Other domain:'); + $add_domtitle = &mt('Users in other domain:'); } $output .= &Apache::loncommon::start_data_table_row() .''.$add_domtitle.'
' @@ -3266,10 +3761,10 @@ sub print_selfenroll_menu { $regoff = ' checked="checked" '; } $output .= '  '; + ''. + &mt('Yes').'  '; } 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'}; @@ -3328,12 +3823,134 @@ sub print_selfenroll_menu { } $output .= &Apache::lonhtmlcommon::end_pick_box(). '
' + .&mt('Save changes').'" onclick="validate_types(this.form);" />' .'
'; $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{'categorize'}) { + $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{'categorize'}) { + $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{'categorize'}) { + 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{'categorize'}) { + 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); @@ -3342,7 +3959,12 @@ sub new_selfenroll_dom_row { $output .= &Apache::loncommon::start_data_table_row() .''.&mt('Domain:').' '.$domdesc .' ('.$newdom.')'; + .'" value="'.$newdom.'" />
' + .''; my @currinsttypes; $output .= ''.&mt('User types:').'
' .&selfenroll_inst_types($num,$newdom,\@currinsttypes).'' @@ -3357,20 +3979,29 @@ sub selfenroll_inst_types { 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 .= ''; @@ -3380,13 +4011,21 @@ sub selfenroll_inst_types { if (($count > 0) && ($count%$numinrow == 0)) { $output .= ''; } - $output .= '
'; } @@ -3396,11 +4035,11 @@ sub selfenroll_inst_types { sub selfenroll_date_forms { my ($startform,$endform) = @_; my $output .= &Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::row_title(&mt('Starts'), + &Apache::lonhtmlcommon::row_title(&mt('Start date'), 'LC_oddrow_value')."\n". $startform."\n". &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::row_title(&mt('Ends'), + &Apache::lonhtmlcommon::row_title(&mt('End date'), 'LC_oddrow_value')."\n". $endform."\n". &Apache::lonhtmlcommon::row_closure(1). @@ -3449,8 +4088,9 @@ sub print_userchangelogs_display { $curr{$key} = $defaults{$key}; } } - my (%whodunit,%changed); - $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr)); + 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(). @@ -3459,7 +4099,7 @@ sub print_userchangelogs_display { &mt('Context').''.&mt('Start').''.&mt('End').''. &Apache::loncommon::end_data_table_header_row(); my ($minshown,$maxshown); - my $minshown = 1; + $minshown = 1; my $count = 0; if ($curr{'show'} ne &mt('all')) { $maxshown = $curr{'page'} * $curr{'show'}; @@ -3567,7 +4207,7 @@ ENDSCRIPT } sub role_display_filter { - my ($formname,$cdom,$cnum,$curr) = @_; + my ($formname,$cdom,$cnum,$curr,$version) = @_; my $context = 'course'; my $nolink = 1; my $output = '
'. @@ -3618,9 +4258,14 @@ sub role_display_filter { next if (!&Apache::lonnet::auto_run($cnum,$cdom)); } $output .= ''."\n"; - } + } $output .= '  


'; + &mt('Update Display').'" />'. + ''. + &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; } @@ -3669,7 +4314,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 - . @'); } } @@ -4007,10 +4658,30 @@ 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:').'' + .'
' + .&mt("(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: [_1]username is ..... in selected LON-CAPA domain[_2]",'','') + .'
  • ' + .&mt('Provide the proposed username') + .'
  • ' + .&mt("Click '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).'

'; + $response .= '

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

'; } } } @@ -4296,26 +4967,58 @@ sub update_selfenroll_config { } else { next; } - } elsif ($curr_types eq '') { - my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_0'); - if (@types > 0) { - $changes{'internal.selfenroll_types'} = $env{'form.selfenroll_dom_0'}.':'.join(',',@types); - } } else { + my %currdoms; my @entries = split(/;/,$curr_types); - my $num = 0; - my @latesttypes; my @deletedoms = &Apache::loncommon::get_env_multiple('form.selfenroll_delete'); + my @activations = &Apache::loncommon::get_env_multiple('form.selfenroll_activate'); my $newnum = 0; - for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) { - if (!grep(/^$j$/,@deletedoms)) { - my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j); + my @latesttypes; + foreach my $num (@activations) { + my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$num); + if (@types > 0) { @types = sort(@types); my $typestr = join(',',@types); - $latesttypes[$newnum] = $env{'form.selfenroll_dom_'.$j}.':'.$typestr; + 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(',',(@esc_types,$othervalue)); + } + $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; @@ -4381,7 +5084,7 @@ sub update_selfenroll_config { 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]".', + $r->print('
  • '.&mt('[_1]: "[_2]" set to "[_3]".', $title,$type,$newdate).'
  • '); } } @@ -4389,7 +5092,7 @@ sub update_selfenroll_config { 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]".', + $r->print('
  • '.&mt('[_1]: "[_2]" set to "[_3]".', $title,$type,$newdate).'
  • '); } } @@ -4402,8 +5105,14 @@ sub update_selfenroll_config { } 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('
  • '.&mt('"[_1]" set to "[_2]".',$title,$newval).'
  • '."\n"); } } } @@ -4417,14 +5126,26 @@ sub update_selfenroll_config { $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.')); + $r->print(&mt('No changes were made 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.')); - } - if ($env{'form.selfenroll_newdom'} ne '') { - &print_selfenroll_menu($r,$context,$permission); + $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; } @@ -4432,10 +5153,10 @@ 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 registered students?', + registered => 'Restrict self-enrollment to students officially registered for the course', enroll_dates => 'Dates self-enrollment available', - access_dates => 'Access dates for self-enrolled users', - section => 'Section assigned to self-enrolled users', + access_dates => 'Course access dates assigned to self-enrolling users', + section => 'Section assigned to self-enrolling users', ); return (\@row,\%lt); }