--- loncom/interface/domainprefs.pm 2014/02/15 17:07:19 1.160.6.34 +++ loncom/interface/domainprefs.pm 2013/09/10 01:51:32 1.206 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.34 2014/02/15 17:07:19 raeburn Exp $ +# $Id: domainprefs.pm,v 1.206 2013/09/10 01:51:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -86,7 +86,7 @@ $dom,$settings,$rowtotal,$action. $dom is the domain, $settings is a reference to a hash of current settings for the current context, $rowtotal is a reference to the scalar used to record the -number of rows displayed on the page, and $action is the context (quotas, +number of rows displayed on the page, and $action is the context (quotas, requestcourses or requestauthor). The print_quotas routine was orginally created to display/store information @@ -95,7 +95,7 @@ institutional affiliation in the domain but is now also used to manage availability of user tools: i.e., blogs, aboutme page, and portfolios, and the course request tool, used by course owners to request creation of a course, and to display/store -default quota sizes for Authoring Spaces. +default quota sizes for authoring spaces. Outputs: 1 @@ -103,8 +103,8 @@ $datatable - HTML containing form eleme In the case of course requests, radio buttons are displayed for each institutional affiliate type (and also default, and _LC_adv) for each of the course types -(official, unofficial, community, and textbook). In each case the radio buttons -allow the selection of one of four values: +(official, unofficial and community). In each case the radio buttons allow the +selection of one of four values: 0, approval, validate, autolimit=N (where N is blank, or a positive integer). which have the following effects: @@ -211,13 +211,15 @@ sub handler { 'quotas','autoenroll','autoupdate','autocreate', 'directorysrch','usercreation','usermodification', 'contacts','defaults','scantron','coursecategories', - 'serverstatuses','requestcourses','coursedefaults', - 'usersessions','loadbalancing','requestauthor'],$dom); + 'serverstatuses','requestcourses','helpsettings', + 'coursedefaults','usersessions','loadbalancing', + 'requestauthor'],$dom); my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', 'autoupdate','autocreate','directorysrch','contacts', - 'usercreation','selfcreation','usermodification','scantron', + 'usercreation','usermodification','scantron', 'requestcourses','requestauthor','coursecategories', - 'serverstatuses','coursedefaults','usersessions'); + 'serverstatuses','helpsettings', + 'coursedefaults','usersessions'); my %existing; if (ref($domconfig{'loadbalancing'}) eq 'HASH') { %existing = %{$domconfig{'loadbalancing'}}; @@ -257,7 +259,7 @@ sub handler { help => 'Domain_Configuration_Quotas', header => [{col1 => 'User affiliation', col2 => 'Available tools', - col3 => 'Quotas, MB; (Authoring requires role)',}], + col3 => 'Quotas, Mb; (Authoring requires role)',}], }, 'autoenroll' => { text => 'Auto-enrollment settings', @@ -293,6 +295,7 @@ sub handler { header => [{col1 => 'Setting', col2 => 'Value',}], }, + 'usercreation' => { text => 'User creation', help => 'Domain_Configuration_User_Creation', @@ -303,23 +306,15 @@ sub handler { {col1 => 'Context', col2 => 'Assignable authentication types'}], }, - 'selfcreation' => - { text => 'Users self-creating accounts', - help => 'Domain_Configuration_Self_Creation', - header => [{col1 => 'Self-creation with institutional username', - col2 => 'Enabled?'}, - {col1 => 'Institutional user type (login/SSO self-creation)', - col2 => 'Information user can enter'}, - {col1 => 'Self-creation with e-mail as username', - col2 => 'Settings'}], - }, 'usermodification' => { text => 'User modification', help => 'Domain_Configuration_User_Modification', header => [{col1 => 'Target user has role', col2 => 'User information updateable in author context'}, {col1 => 'Target user has role', - col2 => 'User information updateable in course context'}], + col2 => 'User information updateable in course context'}, + {col1 => "Status of user", + col2 => 'Information settable when self-creating account (if directory data blank)'}], }, 'scantron' => { text => 'Bubblesheet format file', @@ -334,12 +329,10 @@ sub handler { header => [{col1 => 'User affiliation', col2 => 'Availability/Processing of requests',}, {col1 => 'Setting', - col2 => 'Value'}, - {col1 => 'Available textbooks', - col2 => ''}], + col2 => 'Value'}], }, 'requestauthor' => - {text => 'Request Authoring Space', + {text => 'Request authoring space', help => 'Domain_Configuration_Request_Author', header => [{col1 => 'User affiliation', col2 => 'Availability/Processing of requests',}, @@ -363,12 +356,26 @@ sub handler { col3 => 'Specific IPs', }], }, - 'coursedefaults' => + 'helpsettings' => + {text => 'Help page settings', + help => 'Domain_Configuration_Help_Settings', + header => [{col1 => 'Help Settings (logged-in users)', + col2 => 'Value'}], + }, + 'coursedefaults' => {text => 'Course/Community defaults', help => 'Domain_Configuration_Course_Defaults', - header => [{col1 => 'Defaults which can be overridden for each course by a DC', + header => [{col1 => 'Defaults which can be overridden in each course by a CC', + col2 => 'Value',}, + {col1 => 'Defaults which can be overridden for each course by a DC', col2 => 'Value',},], }, + 'privacy' => + {text => 'User Privacy', + help => 'Domain_Configuration_User_Privacy', + header => [{col1 => 'Setting', + col2 => 'Value',}], + }, 'usersessions' => {text => 'User session hosting/offloading', help => 'Domain_Configuration_User_Sessions', @@ -409,11 +416,10 @@ sub handler { my $confname = $dom.'-domainconfig'; if ($phase eq 'process') { - my $result = &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order, - \%prefs,\%domconfig,$confname,\@roles); - if ((ref($result) eq 'HASH') && (keys(%{$result}))) { + if (&Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order, + \%prefs,\%domconfig,$confname,\@roles) eq 'update') { $r->rflush(); - &devalidate_remote_domconfs($dom,$result); + &devalidate_remote_domconfs($dom); } } elsif ($phase eq 'display') { my $js = &recaptcha_js(). @@ -427,16 +433,6 @@ sub handler { &common_domprefs_js(). &Apache::loncommon::javascript_array_indexof(); } - if (grep(/^requestcourses$/,@actions)) { - my $javascript_validations; - my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); - $js .= < -$javascript_validations - -$coursebrowserjs -END - } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { # check if domconfig user exists for the domain. @@ -446,7 +442,7 @@ END unless ($configuserok eq 'ok') { &Apache::lonconfigsettings::print_header($r,$phase,$context); $r->print(&mt('The domain configuration user "[_1]" has yet to be created.', - $confname). + $confname). '
' ); if ($switchserver) { @@ -518,7 +514,7 @@ sub process_changes { $output = &modify_rolecolors($r,$dom,$confname,$roles, $lastactref,%domconfig); } elsif ($action eq 'quotas') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); + $output = &modify_quotas($dom,$action,%domconfig); } elsif ($action eq 'autoenroll') { $output = &modify_autoenroll($dom,$lastactref,%domconfig); } elsif ($action eq 'autoupdate') { @@ -529,14 +525,12 @@ sub process_changes { $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); - } elsif ($action eq 'selfcreation') { - $output = &modify_selfcreation($dom,%domconfig); } elsif ($action eq 'usermodification') { $output = &modify_usermodification($dom,%domconfig); } elsif ($action eq 'contacts') { $output = &modify_contacts($dom,$lastactref,%domconfig); } elsif ($action eq 'defaults') { - $output = &modify_defaults($dom,$lastactref,%domconfig); + $output = &modify_defaults($dom,$r,%domconfig); } elsif ($action eq 'scantron') { $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig); } elsif ($action eq 'coursecategories') { @@ -544,13 +538,15 @@ sub process_changes { } elsif ($action eq 'serverstatuses') { $output = &modify_serverstatuses($dom,%domconfig); } elsif ($action eq 'requestcourses') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); + $output = &modify_quotas($dom,$action,%domconfig); } elsif ($action eq 'requestauthor') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); + $output = &modify_quotas($dom,$action,%domconfig); + } elsif ($action eq 'helpsettings') { + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { - $output = &modify_coursedefaults($dom,$lastactref,%domconfig); + $output = &modify_coursedefaults($dom,%domconfig); } elsif ($action eq 'usersessions') { - $output = &modify_usersessions($dom,$lastactref,%domconfig); + $output = &modify_usersessions($dom,%domconfig); } elsif ($action eq 'loadbalancing') { $output = &modify_loadbalancing($dom,%domconfig); } @@ -579,7 +575,7 @@ sub print_config_box { if ($numheaders > 1) { my $colspan = ''; my $rightcolspan = ''; - if (($action eq 'rolecolors') || ($action eq 'coursecategories') || + if (($action eq 'rolecolors') || ($action eq 'coursecategories') || (($action eq 'login') && ($numheaders < 3))) { $colspan = ' colspan="2"'; } @@ -599,8 +595,6 @@ sub print_config_box { $output .= &print_autoupdate('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'usercreation') { $output .= &print_usercreation('top',$dom,$settings,\$rowtotal); - } elsif ($action eq 'selfcreation') { - $output .= &print_selfcreation('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'usermodification') { $output .= &print_usermodification('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { @@ -620,6 +614,8 @@ sub print_config_box { $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'coursedefaults') { + $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal); } $output .= ' @@ -660,8 +656,8 @@ sub print_config_box { '.&mt($item->{'header'}->[2]->{'col2'}).' '. &print_usercreation('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - } elsif ($action eq 'selfcreation') { - $output .= &print_selfcreation('middle',$dom,$settings,\$rowtotal).' + } elsif ($action eq 'usermodification') { + $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal).' @@ -670,12 +666,9 @@ sub print_config_box { - - '. - &print_selfcreation('bottom',$dom,$settings,\$rowtotal); + '. + &print_usermodification('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - } elsif ($action eq 'usermodification') { - $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); } elsif ($action eq 'login') { @@ -689,25 +682,14 @@ sub print_config_box {
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
- '. + '. &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal); $rowtotal ++; } else { $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal); } } elsif ($action eq 'requestcourses') { - $output .= &print_requestmail($dom,$action,$settings,\$rowtotal). - &print_studentcode($settings,\$rowtotal).' -
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - - - '. - &print_textbookcourses($dom,$settings,\$rowtotal); + $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); } elsif ($action eq 'requestauthor') { $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); } elsif ($action eq 'usersessions') { @@ -723,6 +705,8 @@ sub print_config_box { '. &print_usersessions('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; + } elsif ($action eq 'coursedefaults') { + $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -810,7 +794,7 @@ sub print_config_box { } elsif ($action eq 'contacts') { $output .= &print_contacts($dom,$settings,\$rowtotal); } elsif ($action eq 'defaults') { - $output .= &print_defaults($dom,$settings,\$rowtotal); + $output .= &print_defaults($dom,\$rowtotal); } elsif ($action eq 'scantron') { $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'serverstatuses') { @@ -819,8 +803,6 @@ sub print_config_box { $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'loadbalancing') { $output .= &print_loadbalancing($dom,$settings,\$rowtotal); - } elsif ($action eq 'coursedefaults') { - $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal); } } $output .= ' @@ -1567,14 +1549,14 @@ sub print_quotas { my $typecount = 0; my ($css_class,%titles); if ($context eq 'requestcourses') { - @usertools = ('official','unofficial','community','textbook'); + @usertools = ('official','unofficial','community'); @options =('norequest','approval','validate','autolimit'); %validations = &Apache::lonnet::auto_courserequest_checks($dom); %titles = &courserequest_titles(); } elsif ($context eq 'requestauthor') { @usertools = ('author'); @options = ('norequest','approval','automatic'); - %titles = &authorrequest_titles(); + %titles = &authorrequest_titles(); } else { @usertools = ('aboutme','blog','webdav','portfolio'); %titles = &tool_titles(); @@ -1981,31 +1963,28 @@ sub print_quotas { sub print_requestmail { my ($dom,$action,$settings,$rowtotal) = @_; - my ($now,$datatable,%currapp); + my ($now,$datatable,%currapp,$rows); $now = time; if (ref($settings) eq 'HASH') { if (ref($settings->{'notify'}) eq 'HASH') { if ($settings->{'notify'}{'approval'} ne '') { - map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'}); + map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'}); } } } my $numinrow = 2; - my $css_class; - $css_class = ($$rowtotal%2? ' class="LC_odd_row"':''); + my $css_class = 'class="LC_odd_row"'; my $text; if ($action eq 'requestcourses') { $text = &mt('Receive notification of course requests requiring approval'); - } elsif ($action eq 'requestauthor') { - $text = &mt('Receive notification of Authoring Space requests requiring approval'); } else { - $text = &mt('Receive notification of queued requests for self-created user accounts requiring approval'); + $text = &mt('Receive notification of authoring space requests requiring approval') } - $datatable = ''. + $datatable = ''. ' '.$text.''. ' '; my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox', - $action.'notifyapproval',%currapp); + 'reqapprovalnotify',%currapp); if ($numdc > 0) { $datatable .= $table; } else { @@ -2016,216 +1995,6 @@ sub print_requestmail { return $datatable; } -sub print_studentcode { - my ($settings,$rowtotal) = @_; - my $rownum = 0; - my ($output,%current); - my @crstypes = ('official','unofficial','community','textbook'); - if (ref($settings->{'uniquecode'}) eq 'HASH') { - foreach my $type (@crstypes) { - $current{$type} = $settings->{'uniquecode'}{$type}; - } - } - $output .= ''. - ''.&mt('Generate unique six character code as course identifier?').''. - ''; - foreach my $type (@crstypes) { - my $check = ' '; - if ($current{$type}) { - $check = ' checked="checked" '; - } - $output .= ''.(' 'x2).' '; - } - $output .= ''; - $$rowtotal ++; - return $output; -} - -sub print_textbookcourses { - my ($dom,$settings,$rowtotal) = @_; - my $rownum = 0; - my $css_class; - my $itemcount = 1; - my $maxnum = 0; - my $bookshash; - if (ref($settings) eq 'HASH') { - $bookshash = $settings->{'textbooks'}; - } - my %ordered; - if (ref($bookshash) eq 'HASH') { - foreach my $item (keys(%{$bookshash})) { - if (ref($bookshash->{$item}) eq 'HASH') { - my $num = $bookshash->{$item}{'order'}; - $ordered{$num} = $item; - } - } - } - my $confname = $dom.'-domainconfig'; - my $switchserver = &check_switchserver($dom,$confname); - my $maxnum = scalar(keys(%ordered)); - my $datatable = &textbookcourses_javascript(\%ordered); - if (keys(%ordered)) { - my @items = sort { $a <=> $b } keys(%ordered); - for (my $i=0; $i<@items; $i++) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $key = $ordered{$items[$i]}; - my %coursehash=&Apache::lonnet::coursedescription($key); - my $coursetitle = $coursehash{'description'}; - my ($subject,$title,$author,$image,$imgsrc,$cdom,$cnum); - if (ref($bookshash->{$key}) eq 'HASH') { - $subject = $bookshash->{$key}->{'subject'}; - $title = $bookshash->{$key}->{'title'}; - $author = $bookshash->{$key}->{'author'}; - $image = $bookshash->{$key}->{'image'}; - if ($image ne '') { - my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$}); - my $imagethumb = "$path/tn-".$imagefile; - $imgsrc = ''.&mt('Textbook image').''; - } - } - my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$key'".');"'; - $datatable .= '' - .''.(' 'x2). - ''. - ''. - ''.&mt('Subject:').' '. - (' 'x2). - ''.&mt('Title:').' '. - (' 'x2). - ''.&mt('Author(s):').' '. - (' 'x2). - ''.&mt('Thumbnail:'); - if ($image) { - $datatable .= ''. - $imgsrc. - ' '. - ' '.&mt('Replace:').' '; - } - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= ' '. - ''.&mt('LON-CAPA course:').' '. - $coursetitle.''."\n"; - $itemcount ++; - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'addbook_pos'".');"'; - $datatable .= ''."\n". - ''."\n". - ' '."\n". - ''.&mt('Add').''."\n". - ''. - ''.&mt('Subject:').' '."\n". - (' 'x2). - ''.&mt('Title:').' '."\n". - (' 'x2). - ''.&mt('Author(s):').' '."\n". - (' 'x2). - ''.&mt('Image:').' '; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= ''."\n". - ''.&mt('LON-CAPA course:').' '. - &Apache::loncommon::select_dom_form($env{'request.role.domain'},'addbook_cdom'). - ''. - &Apache::loncommon::selectcourse_link - ('display','addbook_cnum','addbook_cdom',undef,undef,undef,'Course'); - ''."\n". - ''."\n"; - $itemcount ++; - return $datatable; -} - -sub textbookcourses_javascript { - my ($textbooks) = @_; - return unless(ref($textbooks) eq 'HASH'); - my $num = scalar(keys(%{$textbooks})); - my @jsarray; - foreach my $item (sort {$a <=> $b } (keys(%{$textbooks}))) { - push(@jsarray,$textbooks->{$item}); - } - my $jstext = ' var textbooks = Array('."'".join("','",@jsarray)."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - sub print_autoenroll { my ($dom,$settings,$rowtotal) = @_; my $autorun = &Apache::lonnet::auto_run(undef,$dom), @@ -2387,7 +2156,7 @@ sub print_autocreate { } } } - if ($settings->{'xmldc'} ne '') { + if ($settings->{'xmldc'} ne '') { $currhash{$settings->{'xmldc'}} = 1; } } else { @@ -2724,10 +2493,9 @@ sub print_coursedefaults { \%choices,$itemcount); } else { $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($currdefresponder,$def_official_credits,$def_unofficial_credits,$def_textbook_credits, - %curruploadquota); + my ($currdefresponder,$def_official_credits,$def_unofficial_credits,%curruploadquota); my $currusecredits = 0; - my @types = ('official','unofficial','community','textbook'); + my @types = ('official','unofficial','community'); if (ref($settings) eq 'HASH') { $currdefresponder = $settings->{'anonsurvey_threshold'}; if (ref($settings->{'uploadquota'}) eq 'HASH') { @@ -2738,9 +2506,7 @@ sub print_coursedefaults { if (ref($settings->{'coursecredits'}) eq 'HASH') { $def_official_credits = $settings->{'coursecredits'}->{'official'}; $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'}; - $def_textbook_credits = $settings->{'coursecredits'}->{'textbook'}; - if (($def_official_credits ne '') || ($def_unofficial_credits ne '') || - ($def_textbook_credits ne '')) { + if (($def_official_credits ne '') || ($def_unofficial_credits ne '')) { $currusecredits = 1; } } @@ -2776,7 +2542,7 @@ sub print_coursedefaults { $datatable .= ''."\n"; $itemcount += 2; my $onclick = 'toggleCredits(this.form);'; - my $display = 'none'; + my $display = 'none'; if ($currusecredits) { $display = 'block'; } @@ -2790,11 +2556,6 @@ sub print_coursedefaults { &mt('Default credits for unofficial courses [_1]', ''). - '
'. - ''. - &mt('Default credits for textbook courses [_1]', - ''). ''."\n"; %defaultchecked = ('coursecredits' => 'off'); @toggles = ('coursecredits'); @@ -3236,7 +2997,7 @@ sub print_loadbalancing { } my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my $rownum = 8; + my $rownum = 6; if (ref($types) eq 'ARRAY') { $rownum += scalar(@{$types}); } @@ -3267,7 +3028,7 @@ sub print_loadbalancing { ''. '

'; if ($lonhost eq '') { - $datatable .= ''; + $datatable .= ''; if (keys(%currbalancer) > 0) { $datatable .= &mt('Add balancer:'); } else { @@ -3283,7 +3044,7 @@ sub print_loadbalancing { next if ($currbalancer{$server}); $datatable .= ''."\n"; } - $datatable .= + $datatable .= ''."\n". ' '."\n"; } else { @@ -3322,7 +3083,7 @@ sub print_loadbalancing { if (exists($currbalancer{$spares[$i]})) { $disabled = ' disabled="disabled"'; } - $targettable .= + $targettable .= ''; @@ -3406,7 +3167,7 @@ sub loadbalancing_rules { $css_class,$balnum,$islast) = @_; my $output; my $num = 0; - my ($alltypes,$othertypes,$titles) = + my ($alltypes,$othertypes,$titles) = &loadbalancing_titles($dom,$intdom,$usertypes,$types); if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) { foreach my $type (@{$alltypes}) { @@ -3415,7 +3176,7 @@ sub loadbalancing_rules { if (ref($currrules) eq 'HASH') { $current = $currrules->{$type}; } - if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) { + if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { if ($dom ne &Apache::lonnet::host_domain($lonhost)) { $current = ''; } @@ -3436,10 +3197,8 @@ sub loadbalancing_titles { '_LC_author' => &mt('Users from [_1] with author role',$dom), '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom), '_LC_external' => &mt('Users not from [_1]',$intdom), - '_LC_ipchangesso' => &mt('SSO users from [_1], with IP mismatch',$dom), - '_LC_ipchange' => &mt('Non-SSO users with IP mismatch'), ); - my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange'); + my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external'); if (ref($types) eq 'ARRAY') { unshift(@alltypes,@{$types},'default'); } @@ -3464,28 +3223,23 @@ sub loadbalancing_titles { sub loadbalance_rule_row { my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom, $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_; - my @rulenames; + my @rulenames = ('default','homeserver'); my %ruletitles = &offloadtype_text(); - if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) { - @rulenames = ('balancer','offloadedto'); + if ($type eq '_LC_external') { + push(@rulenames,'externalbalancer'); } else { - @rulenames = ('default','homeserver'); - if ($type eq '_LC_external') { - push(@rulenames,'externalbalancer'); - } else { - push(@rulenames,'specific'); - } - push(@rulenames,'none'); + push(@rulenames,'specific'); } + push(@rulenames,'none'); my $style = $targets_div_style; - if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) { + if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { $style = $homedom_div_style; } my $space; if ($islast && $num == 1) { $space = '

 
'; } - my $output = + my $output = ''.$space. '
'.$title.'
'."\n". ''.$space. @@ -3505,7 +3259,7 @@ sub loadbalance_rule_row { unless ($checked) { $default = ' selected="selected"'; } - $extra = + $extra = ':  'Approved automatically', - emailapproval => 'Queued for approval by DC', - off => 'Not enabled', - ); - $datatable .= ''. - ''.&mt('E-mail address as username'). - ''. - ''; - foreach my $option ('email','emailapproval','off') { - my $checked; - if ($option eq 'email') { - if ($radiohash{'cancreate_email'}) { - $checked = 'checked="checked"'; - } - } elsif ($option eq 'emailapproval') { - if ($radiohash{'cancreate_emailapproval'}) { - $checked = 'checked="checked"'; - } - } else { - if ((!$radiohash{'cancreate_email'}) && (!$radiohash{'cancreate_emailapproval'})) { - $checked = 'checked="checked"'; - } - } - $datatable .= ' '; - } - $$rowtotal ++; - $rownum ++; - $datatable .= ''. - &print_requestmail($dom,'selfcreation',$createsettings,$rowtotal); - $rownum ++; - my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info(); - $numinrow = 2; - $datatable .= &modifiable_userdata_row('cancreate','emailusername',$settings, - $numinrow,$rownum,undef,$infofields,$infotitles); - $$rowtotal ++; - $rownum ++; - my ($emailrules,$emailruleorder) = - &Apache::lonnet::inst_userrules($dom,'email'); - if (ref($emailrules) eq 'HASH') { - if (keys(%{$emailrules}) > 0) { - $datatable .= &user_formats_row('email',$settings,$emailrules, - $emailruleorder,$numinrow,$rownum); - $rownum ++; - $$rowtotal ++; - } - } - $datatable .= &captcha_choice('cancreate',$createsettings,$rownum); - } - return $datatable; -} - sub captcha_choice { my ($context,$settings,$itemcount) = @_; my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext); my %lt = &captcha_phrases(); $keyentry = 'hidden'; if ($context eq 'cancreate') { - $rowname = &mt('CAPTCHA validation'); + $rowname = &mt('CAPTCHA validation (e-mail as username)'); } elsif ($context eq 'login') { $rowname = &mt('"Contact helpdesk" CAPTCHA validation'); } @@ -3919,9 +3601,9 @@ sub captcha_choice { # # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit: # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple -# servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu) +# servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu) # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain. -# +# $output .= ''."\n". ''."\n". ''.$pubtext.' '."\n". @@ -3996,26 +3678,18 @@ sub usercreation_types { author => 'When adding a co-author', course => 'When adding a user to a course', requestcrs => 'When requesting a course', + selfcreate => 'User creates own account', any => 'Any', official => 'Institutional only ', unofficial => 'Non-institutional only', + email => 'E-mail address', + login => 'Institutional Login', + sso => 'SSO', none => 'None', ); return %lt; } -sub selfcreation_types { - my %lt = &Apache::lonlocal::texthash ( - selfcreate => 'User creates own account', - any => 'Any', - official => 'Institutional only ', - unofficial => 'Non-institutional only', - email => 'E-mail address', - login => 'Institutional Login', - sso => 'SSO', - ); -} - sub authtype_names { my %lt = &Apache::lonlocal::texthash( int => 'Internal', @@ -4057,23 +3731,29 @@ sub print_usermodification { $$rowtotal ++; $rowcount ++; } + } elsif ($position eq 'bottom') { + $context = 'selfcreate'; + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + $usertypes->{'default'} = $othertitle; + if (ref($types) eq 'ARRAY') { + push(@{$types},'default'); + $usertypes->{'default'} = $othertitle; + foreach my $status (@{$types}) { + $datatable .= &modifiable_userdata_row($context,$status,$settings, + $numinrow,$rowcount,$usertypes); + $$rowtotal ++; + $rowcount ++; + } + } } return $datatable; } sub print_defaults { - my ($dom,$settings,$rowtotal) = @_; + my ($dom,$rowtotal) = @_; my @items = ('auth_def','auth_arg_def','lang_def','timezone_def', 'datelocale_def','portal_def'); - my %defaults; - if (ref($settings) eq 'HASH') { - %defaults = %{$settings}; - } else { - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); - foreach my $item (@items) { - $defaults{$item} = $domdefaults{$item}; - } - } + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my $titles = &defaults_titles($dom); my $rownum = 0; my ($datatable,$css_class); @@ -4097,7 +3777,7 @@ sub print_defaults { my %authnames = &authtype_names(); foreach my $auth (@authtypes) { my $checked = ' '; - if ($defaults{$item} eq $auth) { + if ($domdefaults{$item} eq $auth) { $checked = ' checked="checked" '; } $datatable .= ''; + $datatable .= ''; if ($parent eq 'instcode' || $parent eq 'communities') { $datatable .= '' .$default_names{$parent}.''; @@ -4489,8 +4169,7 @@ sub print_coursecategories { $datatable .= ''; } else { $datatable .= $parent - .' '; } my $depth = 1; @@ -4605,8 +4284,7 @@ sub print_serverstatuses { sub serverstatus_pages { return ('userstatus','lonstatus','loncron','server-status','codeversions', 'checksums','clusterstatus','metadata_keywords','metadata_harvest', - 'takeoffline','takeonline','showenv','toggledebug','ping','domconf', - 'uniquecodes'); + 'takeoffline','takeonline','showenv','toggledebug','ping','domconf'); } sub coursecategories_javascript { @@ -4837,13 +4515,9 @@ sub build_category_rows { } sub modifiable_userdata_row { - my ($context,$role,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_; + my ($context,$role,$settings,$numinrow,$rowcount,$usertypes) = @_; my $rolename; - if ($context eq 'cancreate') { - if ($role eq 'emailusername') { - $rolename = &mt('Data user provides'); - } - } elsif ($context eq 'selfcreate') { + if ($context eq 'selfcreate') { if (ref($usertypes) eq 'HASH') { $rolename = $usertypes->{$role}; } else { @@ -4856,18 +4530,9 @@ sub modifiable_userdata_row { $rolename = &Apache::lonnet::plaintext($role); } } - my (@fields,%fieldtitles); - if (ref($fieldsref) eq 'ARRAY') { - @fields = @{$fieldsref}; - } else { - @fields = ('lastname','firstname','middlename','generation', - 'permanentemail','id'); - } - if ((ref($titlesref) eq 'HASH')) { - %fieldtitles = %{$titlesref}; - } else { - %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); - } + my @fields = ('lastname','firstname','middlename','generation', + 'permanentemail','id'); + my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); my $output; my $css_class = $rowcount%2?' class="LC_odd_row"':''; $output = ''. @@ -4923,7 +4588,7 @@ sub modifiable_userdata_row { } sub insttypes_row { - my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context,$rownum) = @_; + my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle,$context) = @_; my %lt = &Apache::lonlocal::texthash ( cansearch => 'Users allowed to search', statustocreate => 'Institutional affiliation(s) able to create own account (login/SSO)', @@ -4937,13 +4602,9 @@ sub insttypes_row { if ($context eq 'statustocreate') { $class = 'LC_right_item'; } - my $css_class = ' class="LC_odd_row"'; - if ($rownum ne '') { - $css_class = ($rownum%2? ' class="LC_odd_row"':''); - } - my $output = ''. - ''.$lt{$context}.$showdom. - ''; + my $output = ''. + '
'.$lt{$context}.$showdom. + ''; my $rem; if (ref($types) eq 'ARRAY') { for (my $i=0; $i<@{$types}; $i++) { @@ -5252,7 +4913,7 @@ sub modify_login { } else { my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result); $errors .= '
  • '.$puberror.'
  • '; - if ((grep(/^\Q$lang\E$/,@currlangs)) && + if ((grep(/^\Q$lang\E$/,@currlangs)) && (!grep(/^\Q$lang\E$/,@delurls))) { $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang}; @@ -5310,9 +4971,7 @@ sub modify_login { } if (keys(%changes) > 0 || $colchgtext) { &Apache::loncommon::devalidate_domconfig_cache($dom); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domainconfig'} = 1; - } + $$lastactref = 'update'; $resulttext = &mt('Changes made:').'
      '; foreach my $item (sort(keys(%changes))) { if ($item eq 'loginvia') { @@ -5372,7 +5031,7 @@ sub modify_login { } } elsif ($item eq 'captcha') { if (ref($loginhash{'login'}) eq 'HASH') { - my $chgtxt; + my $chgtxt; if ($loginhash{'login'}{$item} eq 'notused') { $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.'); } else { @@ -5460,9 +5119,7 @@ sub modify_rolecolors { if ($putresult eq 'ok') { if (keys(%changes) > 0) { &Apache::loncommon::devalidate_domconfig_cache($dom); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domainconfig'} = 1; - } + $$lastactref = 'update'; $resulttext = &display_colorchgs($dom,\%changes,$roles, $rolehash{'rolecolors'}); } else { @@ -5874,7 +5531,7 @@ sub publishlogo { # See if there is anything left unless ($fname) { return ('error: no uploaded file'); } $fname="$subdir/$fname"; - my $docroot=$r->dir_config('lonDocRoot'); + my $docroot=$r->dir_config('lonDocRoot'); my $filepath="$docroot/priv"; my $relpath = "$dom/$confname"; my ($fnamepath,$file,$fetchthumb); @@ -5894,7 +5551,7 @@ sub publishlogo { if ($file=~/\.(\w+)$/ && (&Apache::loncommon::fileembstyle($1) eq 'hdn')) { $output = - &mt('Invalid file extension ([_1]) - reserved for internal use.',$1); + &mt('Invalid file extension ([_1]) - reserved for LONCAPA use.',$1); } elsif ($file=~/\.(\w+)$/ && !defined(&Apache::loncommon::fileembstyle($1))) { $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1); @@ -6143,25 +5800,21 @@ sub check_switchserver { } sub modify_quotas { - my ($r,$dom,$action,$lastactref,%domconfig) = @_; + my ($dom,$action,%domconfig) = @_; my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash, - %limithash,$toolregexp,%conditions,$resulttext,%changes,$confname,$configuserok, - $author_ok,$switchserver,$errors); + %limithash,$toolregexp,%conditions,$resulttext,%changes); if ($action eq 'quotas') { $context = 'tools'; } else { $context = $action; } if ($context eq 'requestcourses') { - @usertools = ('official','unofficial','community','textbook'); + @usertools = ('official','unofficial','community'); @options =('norequest','approval','validate','autolimit'); %validations = &Apache::lonnet::auto_courserequest_checks($dom); %titles = &courserequest_titles(); $toolregexp = join('|',@usertools); %conditions = &courserequest_conditions(); - $confname = $dom.'-domainconfig'; - my $servadm = $r->dir_config('lonAdmEMail'); - ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm); } elsif ($context eq 'requestauthor') { @usertools = ('author'); %titles = &authorrequest_titles(); @@ -6169,7 +5822,7 @@ sub modify_quotas { @usertools = ('aboutme','blog','webdav','portfolio'); %titles = &tool_titles(); } - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); foreach my $key (keys(%env)) { if ($context eq 'requestcourses') { @@ -6197,39 +5850,9 @@ sub modify_quotas { } } if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { - my @approvalnotify = &Apache::loncommon::get_env_multiple('form.'.$context.'notifyapproval'); + my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify'); @approvalnotify = sort(@approvalnotify); $confhash{'notify'}{'approval'} = join(',',@approvalnotify); - my @crstypes = ('official','unofficial','community','textbook'); - my @hasuniquecode = &Apache::loncommon::get_env_multiple('form.uniquecode'); - foreach my $type (@hasuniquecode) { - if (grep(/^\Q$type\E$/,@crstypes)) { - $confhash{'uniquecode'}{$type} = 1; - } - } - my ($newbook,@allpos); - if ($context eq 'requestcourses') { - if ($env{'form.addbook'}) { - if (($env{'form.addbook_cnum'} =~ /^$match_courseid$/) && - ($env{'form.addbook_cdom'} =~ /^$match_domain$/)) { - if (&Apache::lonnet::homeserver($env{'form.addbook_cnum'}, - $env{'form.addbook_cdom'}) eq 'no_host') { - $errors .= '
    • '.&mt('Invalid LON-CAPA course for textbook'). - '
    • '; - } else { - $newbook = $env{'form.addbook_cdom'}.'_'.$env{'form.addbook_cnum'}; - my $position = $env{'form.addbook_pos'}; - $position =~ s/\D+//g; - if ($position ne '') { - $allpos[$position] = $newbook; - } - } - } else { - $errors .= '
    • '.&mt('Invalid LON-CAPA course for textbook'). - '
    • '; - } - } - } if (ref($domconfig{$action}) eq 'HASH') { if (ref($domconfig{$action}{'notify'}) eq 'HASH') { if ($domconfig{$action}{'notify'}{'approval'} ne $confhash{'notify'}{'approval'}) { @@ -6240,131 +5863,10 @@ sub modify_quotas { $changes{'notify'}{'approval'} = 1; } } - if (ref($domconfig{$action}{'uniquecode'}) eq 'HASH') { - if (ref($confhash{'uniquecode'}) eq 'HASH') { - foreach my $crstype (keys(%{$domconfig{$action}{'uniquecode'}})) { - unless ($confhash{'uniquecode'}{$crstype}) { - $changes{'uniquecode'} = 1; - } - } - unless ($changes{'uniquecode'}) { - foreach my $crstype (keys(%{$confhash{'uniquecode'}})) { - unless ($domconfig{$action}{'uniquecode'}{$crstype}) { - $changes{'uniquecode'} = 1; - } - } - } - } else { - $changes{'uniquecode'} = 1; - } - } elsif (ref($confhash{'uniquecode'}) eq 'HASH') { - $changes{'uniquecode'} = 1; - } - if ($context eq 'requestcourses') { - if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') { - my %deletions; - my @todelete = &Apache::loncommon::get_env_multiple('form.book_del'); - if (@todelete) { - map { $deletions{$_} = 1; } @todelete; - } - my %imgdeletions; - my @todeleteimages = &Apache::loncommon::get_env_multiple('form.book_image_del'); - if (@todeleteimages) { - map { $imgdeletions{$_} = 1; } @todeleteimages; - } - my $maxnum = $env{'form.book_maxnum'}; - for (my $i=0; $i<=$maxnum; $i++) { - my $key = $env{'form.book_id_'.$i}; - if (ref($domconfig{$action}{'textbooks'}{$key}) eq 'HASH') { - if ($deletions{$key}) { - if ($domconfig{$action}{'textbooks'}{$key}{'image'}) { - #FIXME need to obsolete item in RES space - } - next; - } else { - my $newpos = $env{'form.'.$key}; - $newpos =~ s/\D+//g; - foreach my $item ('subject','title','author') { - $confhash{'textbooks'}{$key}{$item} = $env{'form.book_'.$item.'_'.$i}; - if ($domconfig{$action}{'textbooks'}{$key}{$item} ne $confhash{'textbooks'}{$key}{$item}) { - $changes{'textbooks'}{$key} = 1; - } - } - $allpos[$newpos] = $key; - } - if ($imgdeletions{$key}) { - $changes{'textbooks'}{$key} = 1; - #FIXME need to obsolete item in RES space - } elsif ($env{'form.book_image_'.$i.'.filename'}) { - my ($cdom,$cnum) = split(/_/,$key); - my ($imgurl,$error) = &process_textbook_image($r,$dom,$confname,'book_image_'.$i, - $cdom,$cnum,$configuserok, - $switchserver,$author_ok); - if ($imgurl) { - $confhash{'textbooks'}{$key}{'image'} = $imgurl; - $changes{'textbooks'}{$key} = 1; - } - if ($error) { - &Apache::lonnet::logthis($error); - $errors .= '
    • '.$error.'
    • '; - } - } elsif ($domconfig{$action}{'textbooks'}{$key}{'image'}) { - $confhash{'textbooks'}{$key}{'image'} = - $domconfig{$action}{'textbooks'}{$key}{'image'}; - } - } - } - } - } } else { if ($confhash{'notify'}{'approval'}) { $changes{'notify'}{'approval'} = 1; } - if (ref($confhash{'uniquecode'} eq 'HASH')) { - $changes{'uniquecode'} = 1; - } - } - if ($context eq 'requestcourses') { - if ($newbook) { - $changes{'textbooks'}{$newbook} = 1; - foreach my $item ('subject','title','author') { - $env{'form.addbook_'.$item} =~ s/(`)/'/g; - if ($env{'form.addbook_'.$item}) { - $confhash{'textbooks'}{$newbook}{$item} = $env{'form.addbook_'.$item}; - } - } - if ($env{'form.addbook_image.filename'} ne '') { - my ($cdom,$cnum) = split(/_/,$newbook); - my ($imageurl,$error) = - &process_textbook_image($r,$dom,$confname,'addbook_image',$cdom,$cnum,$configuserok, - $switchserver,$author_ok); - if ($imageurl) { - $confhash{'textbooks'}{$newbook}{'image'} = $imageurl; - } - if ($error) { - &Apache::lonnet::logthis($error); - $errors .= '
    • '.$error.'
    • '; - } - } - } - if (@allpos > 0) { - my $idx = 0; - foreach my $item (@allpos) { - if ($item ne '') { - $confhash{'textbooks'}{$item}{'order'} = $idx; - if (ref($domconfig{$action}) eq 'HASH') { - if (ref($domconfig{$action}{'textbooks'}) eq 'HASH') { - if (ref($domconfig{$action}{'textbooks'}{$item}) eq 'HASH') { - if ($domconfig{$action}{'textbooks'}{$item}{'order'} ne $idx) { - $changes{'textbooks'}{$item} = 1; - } - } - } - } - $idx ++; - } - } - } } } else { $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'}; @@ -6506,9 +6008,7 @@ sub modify_quotas { $domdefaults{'requestauthor'} = \%confhash; } else { foreach my $key (keys(%confhash)) { - unless (($context eq 'requestcourses') && ($key eq 'textbooks')) { - $domdefaults{$key} = $confhash{$key}; - } + $domdefaults{$key} = $confhash{$key}; } } @@ -6521,11 +6021,9 @@ sub modify_quotas { if (keys(%changes) > 0) { my $cachetime = 24*60*60; &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domdefaults'} = 1; - } + $resulttext = &mt('Changes made:').'
        '; - unless (($context eq 'requestcourses') || + unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { if (ref($changes{'defaultquota'}) eq 'HASH') { $resulttext .= '
      • '.&mt('Portfolio default quotas').'
          '; @@ -6535,20 +6033,20 @@ sub modify_quotas { if ($type eq 'default') { $typetitle = $othertitle; } - $resulttext .= '
        • '.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'defaultquota'}{$type}).'
        • '; + $resulttext .= '
        • '.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'defaultquota'}{$type}).'
        • '; } } $resulttext .= '
      • '; } if (ref($changes{'authorquota'}) eq 'HASH') { - $resulttext .= '
      • '.&mt('Authoring Space default quotas').'
          '; + $resulttext .= '
        • '.&mt('Authoring space default quotas').'
            '; foreach my $type (@{$types},'default') { if (defined($changes{'authorquota'}{$type})) { my $typetitle = $usertypes->{$type}; if ($type eq 'default') { $typetitle = $othertitle; } - $resulttext .= '
          • '.&mt('[_1] set to [_2] MB',$typetitle,$confhash{'authorquota'}{$type}).'
          • '; + $resulttext .= '
          • '.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'authorquota'}{$type}).'
          • '; } } $resulttext .= '
        • '; @@ -6559,7 +6057,7 @@ sub modify_quotas { my (%haschgs,%inconf); if ($context eq 'requestauthor') { %haschgs = %changes; - %inconf = %confhash; + %inconf = %confhash; } else { if (ref($changes{$item}) eq 'HASH') { %haschgs = %{$changes{$item}}; @@ -6573,7 +6071,7 @@ sub modify_quotas { &Apache::lonnet::usertools_access($env{'user.name'}, $env{'user.domain'}, $item,'reload',$context); - if (($context eq 'requestcourses') || + if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { if ($env{'environment.canrequest.'.$item} ne $newacc) { $newenv{'environment.canrequest.'.$item} = $newacc; @@ -6645,42 +6143,6 @@ sub modify_quotas { } } } - if ($action eq 'requestcourses') { - my @offon = ('off','on'); - if ($changes{'uniquecode'}) { - if (ref($confhash{'uniquecode'}) eq 'HASH') { - my $codestr = join(' ',map{ &mt($_); } sort(keys(%{$confhash{'uniquecode'}}))); - $resulttext .= '
        • '. - &mt('Generation of six character code as course identifier for distribution to students set to on for: [_1].',''.$codestr.''). - '
        • '; - } else { - $resulttext .= '
        • '.&mt('Generation of six character code as course identifier for distribution to students set to off.'). - '
        • '; - } - } - if (ref($changes{'textbooks'}) eq 'HASH') { - $resulttext .= '
        • '.&mt('Available textbooks updated').'
            '; - foreach my $key (sort(keys(%{$changes{'textbooks'}}))) { - my %coursehash = &Apache::lonnet::coursedescription($key); - my $coursetitle = $coursehash{'description'}; - my $position = $confhash{'textbooks'}{$key}{'order'} + 1; - $resulttext .= '
          • '; - foreach my $item ('subject','title','author') { - my $name = $item.':'; - $name =~ s/^(\w)/\U$1/; - $resulttext .= &mt($name).' '.$confhash{'textbooks'}{$key}{$item}.'
            '; - } - $resulttext .= ' '.&mt('Order: [_1]',$position).'
            '; - if ($confhash{'textbooks'}{$key}{'image'}) { - $resulttext .= ' '.&mt('Image: [_1]', - 'Textbook cover').'
            '; - } - $resulttext .= ' '.&mt('LON-CAPA Course: [_1]',$coursetitle).'
          • '; - } - $resulttext .= '
        • '; - } - } $resulttext .= '
        '; if (keys(%newenv)) { &Apache::lonnet::appenv(\%newenv); @@ -6698,40 +6160,9 @@ sub modify_quotas { $resulttext = ''. &mt('An error occurred: [_1]',$putresult).''; } - if ($errors) { - $resulttext .= '

        '.&mt('The following errors occurred when modifying Textbook settings.'). - '

          '.$errors.'

        '; - } return $resulttext; } -sub process_textbook_image { - my ($r,$dom,$confname,$caller,$cdom,$cnum,$configuserok,$switchserver,$author_ok) = @_; - my $filename = $env{'form.'.$caller.'.filename'}; - my ($error,$url); - my ($width,$height) = (50,50); - if ($configuserok eq 'ok') { - if ($switchserver) { - $error = &mt('Upload of textbook image is not permitted to this server: [_1]', - $switchserver); - } elsif ($author_ok eq 'ok') { - my ($result,$imageurl) = - &publishlogo($r,'upload',$caller,$dom,$confname, - "textbooks/$dom/$cnum/cover",$width,$height); - if ($result eq 'ok') { - $url = $imageurl; - } else { - $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$filename,$result); - } - } else { - $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$author_ok); - } - } else { - $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3]. Error was: [_4].",$filename,$confname,$dom,$configuserok); - } - return ($url,$error); -} - sub modify_autoenroll { my ($dom,$lastactref,%domconfig) = @_; my ($resulttext,%changes); @@ -6801,9 +6232,7 @@ sub modify_autoenroll { if ($changes{'coowners'}) { $resulttext .= '
      • '.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'
      • '; &Apache::loncommon::devalidate_domconfig_cache($dom); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domainconfig'} = 1; - } + $$lastactref = 'update'; } $resulttext .= '
      '; } else { @@ -7209,7 +6638,7 @@ sub modify_directorysrch { } else { $chgtext =~ s/\; $//; } - $resulttext .= + $resulttext .= '
    • '. &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]", ''.$dom.'',$chgtext). @@ -7361,9 +6790,7 @@ sub modify_contacts { if ($putresult eq 'ok') { if (keys(%changes) > 0) { &Apache::loncommon::devalidate_domconfig_cache($dom); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domainconfig'} = 1; - } + $$lastactref = 'update'; my ($titles,$short_titles) = &contact_titles(); $resulttext = &mt('Changes made:').'
        '; foreach my $item (@contacts) { @@ -7424,38 +6851,106 @@ sub modify_contacts { sub modify_usercreation { my ($dom,%domconfig) = @_; - my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate,%save_usercreate); + my ($resulttext,%curr_usercreation,%changes,%authallowed,%cancreate); my $warningmsg; if (ref($domconfig{'usercreation'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'usercreation'}})) { - if ($key eq 'cancreate') { - if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') { - foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) { - if (($item eq 'selfcreate') || ($item eq 'statustocreate') || - ($item eq 'captcha') || ($item eq 'recaptchakeys')) { - $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; - } else { - $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; - } - } - } - } elsif ($key eq 'email_rule') { - $save_usercreate{$key} = $domconfig{'usercreation'}{$key}; - } else { - $curr_usercreation{$key} = $domconfig{'usercreation'}{$key}; - } + $curr_usercreation{$key} = $domconfig{'usercreation'}{$key}; } } my @username_rule = &Apache::loncommon::get_env_multiple('form.username_rule'); my @id_rule = &Apache::loncommon::get_env_multiple('form.id_rule'); - my @contexts = ('author','course','requestcrs'); + my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule'); + my @contexts = ('author','course','requestcrs','selfcreate'); foreach my $item(@contexts) { - $cancreate{$item} = $env{'form.can_createuser_'.$item}; + if ($item eq 'selfcreate') { + @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item); + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); + if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) { + if (ref($cancreate{$item}) eq 'ARRAY') { + if (grep(/^login$/,@{$cancreate{$item}})) { + $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.'); + } + } + } + } else { + $cancreate{$item} = $env{'form.can_createuser_'.$item}; + } + } + my ($othertitle,$usertypes,$types) = + &Apache::loncommon::sorted_inst_types($dom); + if (ref($types) eq 'ARRAY') { + if (@{$types} > 0) { + @{$cancreate{'statustocreate'}} = + &Apache::loncommon::get_env_multiple('form.statustocreate'); + } else { + @{$cancreate{'statustocreate'}} = (); + } + push(@contexts,'statustocreate'); } + &process_captcha('cancreate',\%changes,\%cancreate,\%curr_usercreation); if (ref($curr_usercreation{'cancreate'}) eq 'HASH') { foreach my $item (@contexts) { - if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) { - push(@{$changes{'cancreate'}},$item); + if (($item eq 'selfcreate') || ($item eq 'statustocreate')) { + if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') { + foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) { + if (ref($cancreate{$item}) eq 'ARRAY') { + if (!grep(/^$curr$/,@{$cancreate{$item}})) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } + } + } else { + if ($curr_usercreation{'cancreate'}{$item} eq '') { + if (@{$cancreate{$item}} > 0) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } else { + if ($curr_usercreation{'cancreate'}{$item} eq 'any') { + if (@{$cancreate{$item}} < 3) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } elsif ($curr_usercreation{'cancreate'}{$item} eq 'none') { + if (@{$cancreate{$item}} > 0) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } elsif (!grep(/^$curr_usercreation{'cancreate'}{$item}$/,@{$cancreate{$item}})) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } + } + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + foreach my $type (@{$cancreate{$item}}) { + if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') { + if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } elsif (($curr_usercreation{'cancreate'}{$item} ne 'any') && + ($curr_usercreation{'cancreate'}{$item} ne 'none')) { + if ($curr_usercreation{'cancreate'}{$item} ne $type) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } + } + } + } else { + if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) { + push(@{$changes{'cancreate'}},$item); + } } } } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') { @@ -7506,6 +7001,21 @@ sub modify_usercreation { push(@{$changes{'id_rule'}},@id_rule); } + if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') { + foreach my $type (@{$curr_usercreation{'email_rule'}}) { + if (!grep(/^\Q$type\E$/,@email_rule)) { + push(@{$changes{'email_rule'}},$type); + } + } + foreach my $type (@email_rule) { + if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) { + push(@{$changes{'email_rule'}},$type); + } + } + } else { + push(@{$changes{'email_rule'}},@email_rule); + } + my @authen_contexts = ('author','course','domain'); my @authtypes = ('int','krb4','krb5','loc'); my %authhash; @@ -7536,394 +7046,39 @@ sub modify_usercreation { } } - $save_usercreate{'cancreate'}{'course'} = $cancreate{'course'}; - $save_usercreate{'cancreate'}{'author'} = $cancreate{'author'}; - $save_usercreate{'cancreate'}{'requestcrs'} = $cancreate{'requestcrs'}; - $save_usercreate{'id_rule'} = \@id_rule; - $save_usercreate{'username_rule'} = \@username_rule, - $save_usercreate{'authtypes'} = \%authhash; - my %usercreation_hash = ( - usercreation => \%save_usercreate, - ); + usercreation => { + cancreate => \%cancreate, + username_rule => \@username_rule, + id_rule => \@id_rule, + email_rule => \@email_rule, + authtypes => \%authhash, + } + ); my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash, $dom); - if ($putresult eq 'ok') { - if (keys(%changes) > 0) { - $resulttext = &mt('Changes made:').'
          '; - if (ref($changes{'cancreate'}) eq 'ARRAY') { - my %lt = &usercreation_types(); - foreach my $type (@{$changes{'cancreate'}}) { - my $chgtext = $lt{$type}.', '; - if ($cancreate{$type} eq 'none') { - $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.'); - } elsif ($cancreate{$type} eq 'any') { - $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.'); - } elsif ($cancreate{$type} eq 'official') { - $chgtext .= &mt('creation of new users is only permitted for institutional usernames.'); - } elsif ($cancreate{$type} eq 'unofficial') { - $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.'); - } - $resulttext .= '
        • '.$chgtext.'
        • '; - } - } - if (ref($changes{'username_rule'}) eq 'ARRAY') { - my ($rules,$ruleorder) = - &Apache::lonnet::inst_userrules($dom,'username'); - my $chgtext = '
            '; - foreach my $type (@username_rule) { - if (ref($rules->{$type}) eq 'HASH') { - $chgtext .= '
          • '.$rules->{$type}{'name'}.'
          • '; - } - } - $chgtext .= '
          '; - if (@username_rule > 0) { - $resulttext .= '
        • '.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'
        • '; - } else { - $resulttext .= '
        • '.&mt('There are now no username formats restricted to verified users in the institutional directory.').'
        • '; - } - } - if (ref($changes{'id_rule'}) eq 'ARRAY') { - my ($idrules,$idruleorder) = - &Apache::lonnet::inst_userrules($dom,'id'); - my $chgtext = '
            '; - foreach my $type (@id_rule) { - if (ref($idrules->{$type}) eq 'HASH') { - $chgtext .= '
          • '.$idrules->{$type}{'name'}.'
          • '; - } - } - $chgtext .= '
          '; - if (@id_rule > 0) { - $resulttext .= '
        • '.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'
        • '; - } else { - $resulttext .= '
        • '.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'
        • '; - } - } - my %authname = &authtype_names(); - my %context_title = &context_names(); - if (ref($changes{'authtypes'}) eq 'ARRAY') { - my $chgtext = '
            '; - foreach my $type (@{$changes{'authtypes'}}) { - my @allowed; - $chgtext .= '
          • '.$context_title{$type}.' - '.&mt('assignable authentication types: '); - foreach my $auth (@authtypes) { - if ($authhash{$type}{$auth}) { - push(@allowed,$authname{$auth}); - } - } - if (@allowed > 0) { - $chgtext .= join(', ',@allowed).'
          • '; - } else { - $chgtext .= &mt('none').''; - } - } - $chgtext .= '
          '; - $resulttext .= '
        • '.&mt('Authentication types available for assignment to new users').'
          '.$chgtext; - $resulttext .= '
        • '; - } - $resulttext .= '
        '; - } else { - $resulttext = &mt('No changes made to user creation settings'); - } - } else { - $resulttext = ''. - &mt('An error occurred: [_1]',$putresult).''; - } - if ($warningmsg ne '') { - $resulttext .= '
        '.$warningmsg.'
        '; - } - return $resulttext; -} - -sub modify_selfcreation { - my ($dom,%domconfig) = @_; - my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate); - my (%save_usercreate,%save_usermodify); -# -# Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}. -# - if (ref($domconfig{'usercreation'}) eq 'HASH') { - foreach my $key (keys(%{$domconfig{'usercreation'}})) { - if ($key eq 'cancreate') { - if (ref($domconfig{'usercreation'}{$key}) eq 'HASH') { - foreach my $item (keys(%{$domconfig{'usercreation'}{$key}})) { - if (($item eq 'selfcreate') || ($item eq 'statustocreate') || - ($item eq 'captcha') || ($item eq 'recaptchakeys') || - ($item eq 'emailusername') || ($item eq 'notify')) { - $curr_usercreation{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; - } else { - $save_usercreate{$key}{$item} = $domconfig{'usercreation'}{$key}{$item}; - } - } - } - } elsif ($key eq 'email_rule') { - $curr_usercreation{$key} = $domconfig{'usercreation'}{$key}; - } else { - $save_usercreate{$key} = $domconfig{'usercreation'}{$key}; - } - } - } -# -# Retrieve current domain configuration for self-creation of usernames from $domconfig{'usermodification'}. -# - if (ref($domconfig{'usermodification'}) eq 'HASH') { - foreach my $key (keys(%{$domconfig{'usermodification'}})) { - if ($key eq 'selfcreate') { - $curr_usermodify{$key} = $domconfig{'usermodification'}{$key}; - } else { - $save_usermodify{$key} = $domconfig{'usermodification'}{$key}; - } - } - } - - my @contexts = ('selfcreate'); - @{$cancreate{'selfcreate'}} = (); - %{$cancreate{'emailusername'}} = (); - @{$cancreate{'statustocreate'}} = (); my %selfcreatetypes = ( sso => 'users authenticated by institutional single sign on', login => 'users authenticated by institutional log-in', - email => 'users who provide a valid e-mail address for use as username (automatic creation)', - emailapproval => 'users who provide a valid e-mail address for use as username (queued for Domain Coordinator review)', + email => 'users who provide a valid e-mail address for use as the username', ); -# -# Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts -# is permitted. -# - foreach my $item ('login','sso','email') { - if ($item eq 'email') { - if ($env{'form.cancreate_email'} eq 'email') { - push(@{$cancreate{'selfcreate'}},'email'); - } elsif ($env{'form.cancreate_email'} eq 'emailapproval') { - push(@{$cancreate{'selfcreate'}},'emailapproval'); - } - } else { - if ($env{'form.cancreate_'.$item}) { - push(@{$cancreate{'selfcreate'}},$item); - } - } - } - my (@email_rule,%userinfo,%savecaptcha); - my ($infofields,$infotitles) = &Apache::loncommon::emailusername_info(); -# -# Populate $cancreate{'emailusername'} hash ref with information types (if new user will provide data -# value set to one), if self-creation with e-mail address permitted. -# - if (($env{'form.cancreate_email'} eq 'email') || ($env{'form.cancreate_email'} eq 'emailapproval')) { - push(@contexts,'emailusername'); - map { $userinfo{$_} = 1; } &Apache::loncommon::get_env_multiple('form.canmodify_emailusername'); - if (ref($infofields) eq 'ARRAY') { - foreach my $field (@{$infofields}) { - if ($userinfo{$field}) { - $cancreate{'emailusername'}{$field} = 1; - } - } - } - -# -# Populate $cancreate{'notify'} hash ref with names of Domain Coordinators who are to be notified of -# queued requests for self-creation of account using e-mail address as username -# - - my @approvalnotify = &Apache::loncommon::get_env_multiple('form.selfcreationnotifyapproval'); - @approvalnotify = sort(@approvalnotify); - $cancreate{'notify'}{'approval'} = join(',',@approvalnotify); - if (ref($curr_usercreation{'cancreate'}) eq 'HASH') { - if (ref($curr_usercreation{'cancreate'}{'notify'}) eq 'HASH') { - if ($curr_usercreation{'cancreate'}{'notify'}{'approval'} ne $cancreate{'notify'}{'approval'}) { - push(@{$changes{'cancreate'}},'notify'); - } - } else { - if ($cancreate{'notify'}{'approval'}) { - push(@{$changes{'cancreate'}},'notify'); - } - } - } elsif ($cancreate{'notify'}{'approval'}) { - push(@{$changes{'cancreate'}},'notify'); - } - -# -# Retrieve rules (if any) governing types of e-mail address which may be used as a username -# - @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule'); - &process_captcha('cancreate',\%changes,\%savecaptcha,$curr_usercreation{'cancreate'}); - if (ref($curr_usercreation{'email_rule'}) eq 'ARRAY') { - if (@{$curr_usercreation{'email_rule'}} > 0) { - foreach my $type (@{$curr_usercreation{'email_rule'}}) { - if (!grep(/^\Q$type\E$/,@email_rule)) { - push(@{$changes{'email_rule'}},$type); - } - } - } - if (@email_rule > 0) { - foreach my $type (@email_rule) { - if (!grep(/^\Q$type\E$/,@{$curr_usercreation{'email_rule'}})) { - push(@{$changes{'email_rule'}},$type); - } - } - } - } elsif (@email_rule > 0) { - push(@{$changes{'email_rule'}},@email_rule); - } - } -# -# Check if domain default is set appropriately, if selef-creation of accounts is to be available for -# institutional log-in. -# - if (grep(/^login$/,@{$cancreate{'selfcreate'}})) { - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); - if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || - ($domdefaults{'auth_def'} eq 'localauth'))) { - $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '. - &mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.'); - } - } - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @fields = ('lastname','firstname','middlename','generation', - 'permanentemail','id'); - my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); -# -# Where usernames may created for institutional log-in and/or institutional single sign on: -# (a) populate $cancreate{'statustocreate'} array reference with institutional status types who -# may self-create accounts -# (b) populate $save_usermodify{'selfcreate'} hash reference with status types, and information fields -# which the user may supply, if institutional data is unavailable. -# - if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) { - if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { - @{$cancreate{'statustocreate'}} = &Apache::loncommon::get_env_multiple('form.statustocreate'); - push(@contexts,'statustocreate'); - } else { - undef($cancreate{'statustocreate'}); - } - push(@{$types},'default'); - $usertypes->{'default'} = $othertitle; - foreach my $type (@{$types}) { - my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$type); - foreach my $field (@fields) { - if (grep(/^\Q$field\E$/,@modifiable)) { - $save_usermodify{'selfcreate'}{$type}{$field} = 1; - } else { - $save_usermodify{'selfcreate'}{$type}{$field} = 0; - } - } - } - if (ref($curr_usermodify{'selfcreate'}) eq 'HASH') { - foreach my $type (@{$types}) { - if (ref($curr_usermodify{'selfcreate'}{$type}) eq 'HASH') { - foreach my $field (@fields) { - if ($save_usermodify{'selfcreate'}{$type}{$field} ne - $curr_usermodify{'selfcreate'}{$type}{$field}) { - push(@{$changes{'selfcreate'}},$type); - last; - } - } - } - } - } else { - foreach my $type (@{$types}) { - push(@{$changes{'selfcreate'}},$type); - } - } - } - } - foreach my $item (@contexts) { - if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') { - foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) { - if (ref($cancreate{$item}) eq 'ARRAY') { - if (!grep(/^$curr$/,@{$cancreate{$item}})) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } - } - if (ref($cancreate{$item}) eq 'ARRAY') { - foreach my $type (@{$cancreate{$item}}) { - if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } - } - } elsif (ref($curr_usercreation{'cancreate'}{$item}) eq 'HASH') { - if (ref($cancreate{$item}) eq 'HASH') { - foreach my $curr (keys(%{$curr_usercreation{'cancreate'}{$item}})) { - if (!$cancreate{$item}{$curr}) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } - foreach my $field (keys(%{$cancreate{$item}})) { - if (!$curr_usercreation{'cancreate'}{$item}{$field}) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } - } - } elsif ($curr_usercreation{'cancreate'}{$item}) { - if (ref($cancreate{$item}) eq 'ARRAY') { - if (!grep(/^\Q$curr_usercreation{'cancreate'}{$item}\E$/,@{$cancreate{$item}})) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } elsif (ref($cancreate{$item}) eq 'HASH') { - if (!$cancreate{$item}{$curr_usercreation{'cancreate'}{$item}}) { - if (!grep(/^$item$/,@{$changes{'cancreate'}})) { - push(@{$changes{'cancreate'}},$item); - } - } - } - } elsif ($item eq 'emailusername') { - if (keys(%userinfo) > 0) { - push(@{$changes{'cancreate'}},$item); - } - } - } -# -# Populate %save_usercreate hash with updates to self-creation configuration. -# - $save_usercreate{'cancreate'}{'captcha'} = $savecaptcha{'captcha'}; - $save_usercreate{'cancreate'}{'recaptchakeys'} = $savecaptcha{'recaptchakeys'}; - $save_usercreate{'cancreate'}{'selfcreate'} = $cancreate{'selfcreate'}; - if (ref($cancreate{'notify'}) eq 'HASH') { - $save_usercreate{'cancreate'}{'notify'} = $cancreate{'notify'}; - } - if (ref($cancreate{'statustocreate'}) eq 'ARRAY') { - $save_usercreate{'cancreate'}{'statustocreate'} = $cancreate{'statustocreate'}; - } - $save_usercreate{'cancreate'}{'emailusername'} = $cancreate{'emailusername'}; - $save_usercreate{'emailrule'} = \@email_rule; - - my %userconfig_hash = ( - usercreation => \%save_usercreate, - usermodification => \%save_usermodify, - ); - my $putresult = &Apache::lonnet::put_dom('configuration',\%userconfig_hash, - $dom); -# -# Accumulate details of changes to domain cofiguration for self-creation of usernames in $resulttext -# if ($putresult eq 'ok') { if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').'
          '; if (ref($changes{'cancreate'}) eq 'ARRAY') { - my %lt = &selfcreation_types(); + my %lt = &usercreation_types(); foreach my $type (@{$changes{'cancreate'}}) { my $chgtext; + unless (($type eq 'statustocreate') || ($type eq 'captcha') || ($type eq 'recaptchakeys')) { + $chgtext = $lt{$type}.', '; + } if ($type eq 'selfcreate') { if (@{$cancreate{$type}} == 0) { - $chgtext .= &mt('Self creation of a new user account is not permitted.'); + $chgtext .= &mt('creation of a new user account is not permitted.'); } else { - $chgtext .= &mt('Self-creation of a new account is permitted for:'). - '
            '; + $chgtext .= &mt('creation of a new account is permitted for:').'
              '; foreach my $case (@{$cancreate{$type}}) { $chgtext .= '
            • '.$selfcreatetypes{$case}.'
            • '; } @@ -7932,10 +7087,7 @@ sub modify_selfcreation { if (grep(/^(login|sso)$/,@{$cancreate{$type}})) { if (ref($cancreate{'statustocreate'}) eq 'ARRAY') { if (@{$cancreate{'statustocreate'}} == 0) { - $chgtext .= '
              '. - ''. - &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts."). - ''; + $chgtext .= '
              '.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").''; } } } @@ -7946,13 +7098,11 @@ sub modify_selfcreation { (ref($cancreate{'statustocreate'}) eq 'ARRAY')) { if (@{$cancreate{'selfcreate'}} > 0) { if (@{$cancreate{'statustocreate'}} == 0) { + $chgtext .= &mt("Institutional affiliations permitted to create accounts set to 'None'."); if (!grep(/^email$/,@{$cancreate{'selfcreate'}})) { - $chgtext .= '
              '. - ''. - &mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts."). - ''; - } + $chgtext .= '
              '.&mt("However, no institutional affiliations (including 'other') are currently permitted to create accounts.").''; + } } elsif (ref($usertypes) eq 'HASH') { if (grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) { $chgtext .= &mt('Creation of a new account for an institutional user is restricted to the following institutional affiliation(s):'); @@ -7969,9 +7119,7 @@ sub modify_selfcreation { } $chgtext .= '
            '; if (!grep(/^(login|sso)$/,@{$cancreate{'selfcreate'}})) { - $chgtext .= '
            '. - &mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.'). - ''; + $chgtext .= '
            '.&mt('However, users authenticated by institutional login/single sign on are not currently permitted to create accounts.').''; } } } else { @@ -7983,21 +7131,21 @@ sub modify_selfcreation { } } } elsif ($type eq 'captcha') { - if ($savecaptcha{$type} eq 'notused') { + if ($cancreate{$type} eq 'notused') { $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.'); } else { my %captchas = &captcha_phrases(); - if ($captchas{$savecaptcha{$type}}) { - $chgtext .= &mt("Validation for self-creation screen set to $captchas{$savecaptcha{$type}}."); + if ($captchas{$cancreate{$type}}) { + $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}."); } else { - $chgtext .= &mt('Validation for self-creation screen set to unknown type.'); + $chgtext .= &mt('Validation for self-creation screen set to unknown type.'); } } } elsif ($type eq 'recaptchakeys') { my ($privkey,$pubkey); - if (ref($savecaptcha{$type}) eq 'HASH') { - $pubkey = $savecaptcha{$type}{'public'}; - $privkey = $savecaptcha{$type}{'private'}; + if (ref($cancreate{$type}) eq 'HASH') { + $pubkey = $cancreate{$type}{'public'}; + $privkey = $cancreate{$type}{'private'}; } $chgtext .= &mt('ReCAPTCHA keys changes').'
              '; if (!$pubkey) { @@ -8011,35 +7159,51 @@ sub modify_selfcreation { $chgtext .= '
            • '.&mt('Private key set to [_1]',$pubkey).'
            • '; } $chgtext .= '
            '; - } elsif ($type eq 'emailusername') { - if (ref($cancreate{'emailusername'}) eq 'HASH') { - if (keys(%{$cancreate{'emailusername'}}) > 0) { - $chgtext .= &mt('When self-creating account with e-mail as username, user will provide the following information:'). - '
              '; - foreach my $field (@{$infofields}) { - if ($cancreate{'emailusername'}{$field}) { - $chgtext .= '
            • '.$infotitles->{$field}.'
            • '; - } - } - $chgtext .= '
            '; - } else { - $chgtext .= &mt('When self creating account with e-mail as username, user will not provide any information besides e-mail address'); - } - } - } elsif ($type eq 'notify') { - $chgtext = &mt('No Domain Coordinators will receive notification of username requests requiring approval.'); - if (ref($changes{'cancreate'}) eq 'ARRAY') { - if ((grep(/^notify$/,@{$changes{'cancreate'}})) && (ref($cancreate{'notify'}) eq 'HASH')) { - if ($cancreate{'notify'}{'approval'}) { - $chgtext = &mt('Notification of username requests requiring approval will be sent to: ').$cancreate{'notify'}{'approval'}; - } - } + } else { + if ($cancreate{$type} eq 'none') { + $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.'); + } elsif ($cancreate{$type} eq 'any') { + $chgtext .= &mt('creation of new users is permitted for both institutional and non-institutional usernames.'); + } elsif ($cancreate{$type} eq 'official') { + $chgtext .= &mt('creation of new users is only permitted for institutional usernames.'); + } elsif ($cancreate{$type} eq 'unofficial') { + $chgtext .= &mt('creation of new users is only permitted for non-institutional usernames.'); } } - if ($chgtext) { - $resulttext .= '
          • '.$chgtext.'
          • '; + $resulttext .= '
          • '.$chgtext.'
          • '; + } + } + if (ref($changes{'username_rule'}) eq 'ARRAY') { + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($dom,'username'); + my $chgtext = '
              '; + foreach my $type (@username_rule) { + if (ref($rules->{$type}) eq 'HASH') { + $chgtext .= '
            • '.$rules->{$type}{'name'}.'
            • '; } } + $chgtext .= '
            '; + if (@username_rule > 0) { + $resulttext .= '
          • '.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'
          • '; + } else { + $resulttext .= '
          • '.&mt('There are now no username formats restricted to verified users in the institutional directory.').'
          • '; + } + } + if (ref($changes{'id_rule'}) eq 'ARRAY') { + my ($idrules,$idruleorder) = + &Apache::lonnet::inst_userrules($dom,'id'); + my $chgtext = '
              '; + foreach my $type (@id_rule) { + if (ref($idrules->{$type}) eq 'HASH') { + $chgtext .= '
            • '.$idrules->{$type}{'name'}.'
            • '; + } + } + $chgtext .= '
            '; + if (@id_rule > 0) { + $resulttext .= '
          • '.&mt('IDs with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'
          • '; + } else { + $resulttext .= '
          • '.&mt('There are now no ID formats restricted to verified users in the institutional directory.').'
          • '; + } } if (ref($changes{'email_rule'}) eq 'ARRAY') { my ($emailrules,$emailruleorder) = @@ -8052,48 +7216,37 @@ sub modify_selfcreation { } $chgtext .= '
          '; if (@email_rule > 0) { - $resulttext .= '
        • '. - &mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: '). - $chgtext. - '
        • '; + $resulttext .= '
        • '.&mt('Accounts may not be created by users self-enrolling with e-mail addresses of the following types: ').$chgtext.'
        • '; } else { - $resulttext .= '
        • '. - &mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.'). - '
        • '; + $resulttext .= '
        • '.&mt('There are now no restrictions on e-mail addresses which may be used as a username when self-enrolling.').'
        • '; } } - if (ref($changes{'selfcreate'}) eq 'ARRAY') { - $resulttext .= '
        • '.&mt('When self-creating institutional account:').'
            '; - my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); - foreach my $type (@{$changes{'selfcreate'}}) { - my $typename = $type; - if (ref($usertypes) eq 'HASH') { - if ($usertypes->{$type} ne '') { - $typename = $usertypes->{$type}; - } - } - my @modifiable; - $resulttext .= '
          • '. - &mt('Self-creation of account by users with status: [_1]', - ''.$typename.''). - ' - '.&mt('modifiable fields (if institutional data blank): '); - foreach my $field (@fields) { - if ($save_usermodify{'selfcreate'}{$type}{$field}) { - push(@modifiable,''.$fieldtitles{$field}.''); + + my %authname = &authtype_names(); + my %context_title = &context_names(); + if (ref($changes{'authtypes'}) eq 'ARRAY') { + my $chgtext = '
              '; + foreach my $type (@{$changes{'authtypes'}}) { + my @allowed; + $chgtext .= '
            • '.$context_title{$type}.' - '.&mt('assignable authentication types: '); + foreach my $auth (@authtypes) { + if ($authhash{$type}{$auth}) { + push(@allowed,$authname{$auth}); } } - if (@modifiable > 0) { - $resulttext .= join(', ',@modifiable); + if (@allowed > 0) { + $chgtext .= join(', ',@allowed).'
            • '; } else { - $resulttext .= &mt('none'); + $chgtext .= &mt('none').''; } - $resulttext .= ''; } - $resulttext .= '
          • '; + $chgtext .= '
          '; + $resulttext .= '
        • '.&mt('Authentication types available for assignment to new users').'
          '.$chgtext; + $resulttext .= '
        • '; } $resulttext .= '
        '; } else { - $resulttext = &mt('No changes made to self-creation settings'); + $resulttext = &mt('No changes made to user creation settings'); } } else { $resulttext = ''. @@ -8113,7 +7266,7 @@ sub process_captcha { $newsettings->{'captcha'} = 'original'; } if ($current->{'captcha'} ne $newsettings->{'captcha'}) { - if ($container eq 'cancreate') { + if ($container eq 'cancreate') { if (ref($changes->{'cancreate'}) eq 'ARRAY') { push(@{$changes->{'cancreate'}},'captcha'); } elsif (!defined($changes->{'cancreate'})) { @@ -8152,7 +7305,7 @@ sub process_captcha { $changes->{'cancreate'} = ['recaptchakeys']; } } else { - $changes->{'recaptchakeys'} = 1; + $changes->{'recaptchakeys'} = 1; } } return; @@ -8160,20 +7313,17 @@ sub process_captcha { sub modify_usermodification { my ($dom,%domconfig) = @_; - my ($resulttext,%curr_usermodification,%changes,%modifyhash); + my ($resulttext,%curr_usermodification,%changes); if (ref($domconfig{'usermodification'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'usermodification'}})) { - if ($key eq 'selfcreate') { - $modifyhash{$key} = $domconfig{'usermodification'}{$key}; - } else { - $curr_usermodification{$key} = $domconfig{'usermodification'}{$key}; - } + $curr_usermodification{$key} = $domconfig{'usermodification'}{$key}; } } - my @contexts = ('author','course'); + my @contexts = ('author','course','selfcreate'); my %context_title = ( author => 'In author context', course => 'In course context', + selfcreate => 'When self creating account', ); my @fields = ('lastname','firstname','middlename','generation', 'permanentemail','id'); @@ -8181,7 +7331,14 @@ sub modify_usermodification { author => ['ca','aa'], course => ['st','ep','ta','in','cr'], ); + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + if (ref($types) eq 'ARRAY') { + push(@{$types},'default'); + $usertypes->{'default'} = $othertitle; + } + $roles{'selfcreate'} = $types; my %fieldtitles = &Apache::loncommon::personal_data_fieldtitles(); + my %modifyhash; foreach my $context (@contexts) { foreach my $role (@{$roles{$context}}) { my @modifiable = &Apache::loncommon::get_env_multiple('form.canmodify_'.$role); @@ -8227,13 +7384,26 @@ sub modify_usermodification { if (ref($changes{$context}) eq 'ARRAY') { foreach my $role (@{$changes{$context}}) { my $rolename; - if ($role eq 'cr') { - $rolename = &mt('Custom'); + if ($context eq 'selfcreate') { + $rolename = $role; + if (ref($usertypes) eq 'HASH') { + if ($usertypes->{$role} ne '') { + $rolename = $usertypes->{$role}; + } + } } else { - $rolename = &Apache::lonnet::plaintext($role); + if ($role eq 'cr') { + $rolename = &mt('Custom'); + } else { + $rolename = &Apache::lonnet::plaintext($role); + } } my @modifiable; - $resulttext .= '
      • '.&mt('Target user with [_1] role',$rolename).' - '.&mt('modifiable fields: '); + if ($context eq 'selfcreate') { + $resulttext .= '
      • '.&mt('Self-creation of account by users with status: [_1]',$rolename).' - '.&mt('modifiable fields (if institutional data blank): '); + } else { + $resulttext .= '
      • '.&mt('Target user with [_1] role',$rolename).' - '.&mt('modifiable fields: '); + } foreach my $field (@fields) { if ($modifyhash{$context}{$role}{$field}) { push(@modifiable,$fieldtitles{$field}); @@ -8262,9 +7432,9 @@ sub modify_usermodification { } sub modify_defaults { - my ($dom,$lastactref,%domconfig) = @_; + my ($dom,$r,%domconfig) = @_; my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors); - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def'); my @authtypes = ('internal','krb4','krb5','localauth'); foreach my $item (@items) { @@ -8324,7 +7494,7 @@ sub modify_defaults { if ($putresult eq 'ok') { if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').'
          '; - my $version = &Apache::lonnet::get_server_loncaparev($dom); + my $version = $r->dir_config('lonVersion'); my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n"; foreach my $item (sort(keys(%changes))) { my $value = $env{'form.'.$item}; @@ -8347,9 +7517,6 @@ sub modify_defaults { $mailmsgtext .= "\n"; my $cachetime = 24*60*60; &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domdefaults'} = 1; - } if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) { my $notify = 1; if (ref($domconfig{'contacts'}) eq 'HASH') { @@ -8442,9 +7609,7 @@ sub modify_scantron { } $resulttext .= '
        '; &Apache::loncommon::devalidate_domconfig_cache($dom); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domainconfig'} = 1; - } + $$lastactref = 'update'; } else { $resulttext = &mt('No changes made to bubblesheet format file'); } @@ -8835,7 +8000,7 @@ sub modify_helpsettings { $changes{$item} = 1; } } - if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) { + if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) { $helphash{'helpsettings'}{$item} = $env{'form.'.$item}; } } @@ -8868,13 +8033,13 @@ sub modify_helpsettings { } sub modify_coursedefaults { - my ($dom,$lastactref,%domconfig) = @_; + my ($dom,%domconfig) = @_; my ($resulttext,$errors,%changes,%defaultshash); my %defaultchecked = ('canuse_pdfforms' => 'off'); my @toggles = ('canuse_pdfforms'); my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial', - 'uploadquota_community','uploadquota_textbook'); - my @types = ('official','unofficial','community','textbook'); + 'uploadquota_community'); + my @types = ('official','unofficial','community'); my %staticdefaults = ( anonsurvey_threshold => 10, uploadquota => 500, @@ -8909,7 +8074,7 @@ sub modify_coursedefaults { } foreach my $item (@numbers) { my ($currdef,$newdef); - $newdef = $env{'form.'.$item}; + my $newdef = $env{'form.'.$item}; if ($item eq 'anonsurvey_threshold') { $currdef = $domconfig{'coursedefaults'}{$item}; $newdef =~ s/\D//g; @@ -8939,33 +8104,30 @@ sub modify_coursedefaults { } } my $officialcreds = $env{'form.official_credits'}; - $officialcreds =~ s/[^\d.]+//g; + $officialcreds =~ s/^[^\d\.]//g; my $unofficialcreds = $env{'form.unofficial_credits'}; - $unofficialcreds =~ s/[^\d.]+//g; - my $textbookcreds = $env{'form.textbook_credits'}; - $textbookcreds =~ s/[^\d.]+//g; + $unofficialcreds =~ s/^[^\d\.]//g; if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') && ($env{'form.coursecredits'} eq '1')) { $changes{'coursecredits'} = 1; } else { if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds) || - ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds) || - ($domconfig{'coursedefaults'}{'coursecredits'}{'textbook'} ne $textbookcreds)) { + ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds)) { $changes{'coursecredits'} = 1; } } $defaultshash{'coursedefaults'}{'coursecredits'} = { official => $officialcreds, unofficial => $unofficialcreds, - textbook => $textbookcreds, } } my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash, $dom); if ($putresult eq 'ok') { + my %domdefaults; if (keys(%changes) > 0) { - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) { + %domdefaults = &Apache::lonnet::get_domain_defaults($dom); if ($changes{'canuse_pdfforms'}) { $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'}; } @@ -8975,8 +8137,6 @@ sub modify_coursedefaults { $defaultshash{'coursedefaults'}{'coursecredits'}{'official'}; $domdefaults{'unofficialcredits'} = $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}; - $domdefaults{'textbookcredits'} = - $domdefaults{'coursedefaults'}{'coursecredits'}{'textbook'}; } } if ($changes{'uploadquota'}) { @@ -8988,9 +8148,6 @@ sub modify_coursedefaults { } my $cachetime = 24*60*60; &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domdefaults'} = 1; - } } $resulttext = &mt('Changes made:').'
          '; foreach my $item (sort(keys(%changes))) { @@ -9007,8 +8164,6 @@ sub modify_coursedefaults { $resulttext .= '
        • '.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'
            '. '
          • '.&mt('Official courses: [_1] MB',''.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'').'
          • '. '
          • '.&mt('Unofficial courses: [_1] MB',''.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'').'
          • '. - '
          • '.&mt('Textbook courses: [_1] MB',''.$defaultshash{'coursedefaults'}{'uploadquota'}{'textbook'}.'').'
          • '. - '
          • '.&mt('Communities: [_1] MB',''.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'').'
          • '. '
          '. '
        • '; @@ -9018,14 +8173,12 @@ sub modify_coursedefaults { } elsif ($item eq 'coursecredits') { if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') { if (($domdefaults{'officialcredits'} eq '') && - ($domdefaults{'unofficialcredits'} eq '') && - ($domdefaults{'textbookcredits'} eq '')) { + ($domdefaults{'unofficialcredits'} eq '')) { $resulttext .= '
        • '.&mt('Student credits not in use for courses in this domain').'
        • '; } else { $resulttext .= '
        • '.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'
            '. '
          • '.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'
          • '. '
          • '.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'
          • '. - '
          • '.&mt('Textbook courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'textbook'}).'
          • '. '
          '. '
        • '; } @@ -9046,7 +8199,7 @@ sub modify_coursedefaults { } sub modify_usersessions { - my ($dom,$lastactref,%domconfig) = @_; + my ($dom,%domconfig) = @_; my @hostingtypes = ('version','excludedomain','includedomain'); my @offloadtypes = ('primary','default'); my %types = ( @@ -9063,7 +8216,7 @@ sub modify_usersessions { foreach my $prefix (@prefixes) { $defaultshash{'usersessions'}{$prefix} = {}; } - my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom); my $resulttext; my %iphost = &Apache::lonnet::get_iphost(); foreach my $prefix (@prefixes) { @@ -9239,9 +8392,6 @@ sub modify_usersessions { } my $cachetime = 24*60*60; &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); - if (ref($lastactref) eq 'HASH') { - $lastactref->{'domdefaults'} = 1; - } if (keys(%changes) > 0) { my %lt = &usersession_titles(); $resulttext = &mt('Changes made:').'
            '; @@ -9253,8 +8403,7 @@ sub modify_usersessions { foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) { $resulttext .= '
          • '.$lonhost.' '; my $lonhostdom = &Apache::lonnet::host_domain($lonhost); - my $cachekey = &escape('spares').':'.&escape($lonhostdom); - &Apache::lonnet::remote_devalidate_cache($lonhost,[$cachekey]); + &Apache::lonnet::remote_devalidate_cache($lonhost,'spares',$lonhostdom); if (ref($changes{$prefix}{$lonhost}) eq 'HASH') { foreach my $type (@{$types{$prefix}}) { if ($changes{$prefix}{$lonhost}{$type}) { @@ -9344,7 +8493,7 @@ sub modify_loadbalancing { if ($balancer eq '') { next; } - if (!exists($servers{$balancer})) { + if (!exists($servers{$balancer})) { if (exists($currbalancer{$balancer})) { push(@{$changes{'delete'}},$balancer); } @@ -9395,14 +8544,14 @@ sub modify_loadbalancing { } } else { if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') { - foreach my $sparetype (@sparestypes) { + foreach my $sparetype (@sparestypes) { if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') { if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) { $changes{'curr'}{$balancer}{'targets'} = 1; } } } - } + } } my $ishomedom; if (&Apache::lonnet::host_domain($balancer) eq $dom) { @@ -9411,7 +8560,7 @@ sub modify_loadbalancing { if (ref($alltypes) eq 'ARRAY') { foreach my $type (@{$alltypes}) { my $rule; - unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) && + unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) && (!$ishomedom)) { $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type}; } @@ -9436,17 +8585,17 @@ sub modify_loadbalancing { } my $putresult = &Apache::lonnet::put_dom('configuration', \%defaultshash,$dom); + if ($putresult eq 'ok') { if (keys(%changes) > 0) { if (ref($changes{'delete'}) eq 'ARRAY') { foreach my $balancer (sort(@{$changes{'delete'}})) { $resulttext .= '
          • '.&mt('Load Balancing discontinued for: [_1]',$balancer).'
          • '; - my $cachekey = &escape('loadbalancing').':'.&escape($dom); - &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]); + &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom); } } if (ref($changes{'add'}) eq 'ARRAY') { - foreach my $balancer (sort(@{$changes{'add'}})) { + foreach my $balancer (sort(@{$changes{'add'}})) { $resulttext .= '
          • '.&mt('Load Balancing enabled for: [_1]',$balancer); } } @@ -9487,19 +8636,17 @@ sub modify_loadbalancing { my $balancetext; if ($rule eq '') { $balancetext = $ruletitles{'default'}; - } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') || - ($rule eq 'balancer') || ($rule eq 'offloadedto')) { + } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) { $balancetext = $ruletitles{$rule}; } else { $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type}); } - $resulttext .= '
          • '.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'
          • '; + $resulttext .= '
          • '.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'
          • '; } } } } - my $cachekey = &escape('loadbalancing').':'.&escape($dom); - &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]); + &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom); } } if ($resulttext ne '') { @@ -9587,7 +8734,7 @@ sub active_dc_picker { } } @domcoord = sort(@domcoord); - my $numdcs = scalar(@domcoord); + my $numdcs = scalar(@domcoord); my $rows = 0; my $table; if ($numdcs > 1) { @@ -9631,31 +8778,21 @@ sub active_dc_picker { ''.$user; if ($user ne $dcname.':'.$dcdom) { - $table .= ' ('.$dcname.':'.$dcdom.')'; + $table .= ' ('.$dcname.':'.$dcdom.')'. + ''; } - $table .= ''; } $table .= '
    '; } elsif ($numdcs == 1) { - my ($dcname,$dcdom) = split(':',$domcoord[0]); - my $user = &Apache::loncommon::plainname($dcname,$dcdom); if ($inputtype eq 'radio') { - $table .= ''.$user; - if ($user ne $dcname.':'.$dcdom) { - $table .= ' ('.$dcname.':'.$dcdom.')'; - } + $table .= ''; } else { my $check; if (exists($currhash{$domcoord[0]})) { $check = ' checked="checked"'; } - $table .= ''; + $table .= ''; $rows ++; } } @@ -9731,7 +8868,7 @@ sub lonbalance_targets_js { } &get_loadbalancers_config($servers,\%existing,\%currbalancer, \%currtargets,\%currrules); - my $balancers = join("','",sort(keys(%currbalancer))); + my $balancers = join("','",sort(keys(%currbalancer))); return <<"END";