--- loncom/interface/domainprefs.pm 2014/02/15 17:07:19 1.160.6.34 +++ loncom/interface/domainprefs.pm 2014/04/16 13:33:14 1.160.6.39 @@ -1,8 +1,8 @@ # 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.160.6.39 2014/04/16 13:33:14 raeburn Exp $ +## # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). @@ -164,6 +164,8 @@ use Apache::lonhtmlcommon(); use Apache::lonlocal; use Apache::lonmsg(); use Apache::lonconfigsettings; +use Apache::lonuserutils(); +use Apache::loncoursequeueadmin(); use LONCAPA qw(:DEFAULT :match); use LONCAPA::Enrollment; use LONCAPA::lonauthcgi(); @@ -212,12 +214,14 @@ sub handler { 'directorysrch','usercreation','usermodification', 'contacts','defaults','scantron','coursecategories', 'serverstatuses','requestcourses','coursedefaults', - 'usersessions','loadbalancing','requestauthor'],$dom); + 'usersessions','loadbalancing','requestauthor', + 'selfenrollment'],$dom); my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', 'autoupdate','autocreate','directorysrch','contacts', 'usercreation','selfcreation','usermodification','scantron', 'requestcourses','requestauthor','coursecategories', - 'serverstatuses','coursedefaults','usersessions'); + 'serverstatuses','coursedefaults','selfenrollment', + 'usersessions'); my %existing; if (ref($domconfig{'loadbalancing'}) eq 'HASH') { %existing = %{$domconfig{'loadbalancing'}}; @@ -237,6 +241,8 @@ sub handler { col2 => '',}, {col1 => 'Administrator Settings', col2 => '',}], + print => \&print_rolecolors, + modify => \&modify_rolecolors, }, 'login' => { text => 'Log-in page options', @@ -245,12 +251,16 @@ sub handler { col2 => '',}, {col1 => 'Log-in Help', col2 => 'Value'}], + print => \&print_login, + modify => \&modify_login, }, 'defaults' => { text => 'Default authentication/language/timezone/portal', help => 'Domain_Configuration_LangTZAuth', header => [{col1 => 'Setting', col2 => 'Value'}], + print => \&print_defaults, + modify => \&modify_defaults, }, 'quotas' => { text => 'Blogs, personal web pages, webDAV/quotas, portfolios', @@ -258,12 +268,16 @@ sub handler { header => [{col1 => 'User affiliation', col2 => 'Available tools', col3 => 'Quotas, MB; (Authoring requires role)',}], + print => \&print_quotas, + modify => \&modify_quotas, }, 'autoenroll' => { text => 'Auto-enrollment settings', help => 'Domain_Configuration_Auto_Enrollment', header => [{col1 => 'Configuration setting', col2 => 'Value(s)'}], + print => \&print_autoenroll, + modify => \&modify_autoenroll, }, 'autoupdate' => { text => 'Auto-update settings', @@ -273,25 +287,33 @@ sub handler { {col1 => 'Setting', col2 => 'Affiliation'}, {col1 => 'User population', - col2 => 'Updateable user data'}], + col2 => 'Updatable user data'}], + print => \&print_autoupdate, + modify => \&modify_autoupdate, }, 'autocreate' => { text => 'Auto-course creation settings', help => 'Domain_Configuration_Auto_Creation', header => [{col1 => 'Configuration Setting', col2 => 'Value',}], + print => \&print_autocreate, + modify => \&modify_autocreate, }, 'directorysrch' => { text => 'Institutional directory searches', help => 'Domain_Configuration_InstDirectory_Search', header => [{col1 => 'Setting', col2 => 'Value',}], + print => \&print_directorysrch, + modify => \&modify_directorysrch, }, 'contacts' => { text => 'Contact Information', help => 'Domain_Configuration_Contact_Info', header => [{col1 => 'Setting', col2 => 'Value',}], + print => \&print_contacts, + modify => \&modify_contacts, }, 'usercreation' => { text => 'User creation', @@ -302,6 +324,8 @@ sub handler { col2 => 'Usernames which may be created',}, {col1 => 'Context', col2 => 'Assignable authentication types'}], + print => \&print_usercreation, + modify => \&modify_usercreation, }, 'selfcreation' => { text => 'Users self-creating accounts', @@ -312,14 +336,18 @@ sub handler { col2 => 'Information user can enter'}, {col1 => 'Self-creation with e-mail as username', col2 => 'Settings'}], + print => \&print_selfcreation, + modify => \&modify_selfcreation, }, 'usermodification' => { text => 'User modification', help => 'Domain_Configuration_User_Modification', header => [{col1 => 'Target user has role', - col2 => 'User information updateable in author context'}, + col2 => 'User information updatable in author context'}, {col1 => 'Target user has role', - col2 => 'User information updateable in course context'}], + col2 => 'User information updatable in course context'}], + print => \&print_usermodification, + modify => \&modify_usermodification, }, 'scantron' => { text => 'Bubblesheet format file', @@ -327,6 +355,8 @@ sub handler { header => [ {col1 => 'Item', col2 => '', }], + print => \&print_scantron, + modify => \&modify_scantron, }, 'requestcourses' => {text => 'Request creation of courses', @@ -336,7 +366,11 @@ sub handler { {col1 => 'Setting', col2 => 'Value'}, {col1 => 'Available textbooks', - col2 => ''}], + col2 => ''}, + {col1 => 'Validation (not official courses)', + col2 => 'Value'},], + print => \&print_quotas, + modify => \&modify_quotas, }, 'requestauthor' => {text => 'Request Authoring Space', @@ -345,6 +379,8 @@ sub handler { col2 => 'Availability/Processing of requests',}, {col1 => 'Setting', col2 => 'Value'}], + print => \&print_quotas, + modify => \&modify_quotas, }, 'coursecategories' => { text => 'Cataloging of courses/communities', @@ -354,6 +390,8 @@ sub handler { {col1 => 'Categories', col2 => '', }], + print => \&print_coursecategories, + modify => \&modify_coursecategories, }, 'serverstatuses' => {text => 'Access to server status pages', @@ -362,12 +400,30 @@ sub handler { col2 => 'Other named users', col3 => 'Specific IPs', }], + print => \&print_serverstatuses, + modify => \&modify_serverstatuses, }, - 'coursedefaults' => + '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',},], + print => \&print_coursedefaults, + modify => \&modify_coursedefaults, + }, + 'selfenrollment' => + {text => 'Self-enrollment in Course/Community', + help => 'Domain_Configuration_Selfenrollment', + header => [{col1 => 'Configuration Rights', + col2 => 'Configured by Course Personnel or Domain Coordinator?'}, + {col1 => 'Defaults', + col2 => 'Value'}, + {col1 => 'Self-enrollment validation (optional)', + col2 => 'Value'},], + print => \&print_selfenrollment, + modify => \&modify_selfenrollment, }, 'usersessions' => {text => 'User session hosting/offloading', @@ -378,6 +434,8 @@ sub handler { col2 => 'Rules'}, {col1 => "Hosting domain's own users elsewhere", col2 => 'Rules'}], + print => \&print_usersessions, + modify => \&modify_usersessions, }, 'loadbalancing' => {text => 'Dedicated Load Balancer(s)', @@ -387,6 +445,8 @@ sub handler { col3 => 'User affiliation', col4 => 'Overrides'}, ], + print => \&print_loadbalancing, + modify => \&modify_loadbalancing, }, ); if (keys(%servers) > 1) { @@ -398,6 +458,8 @@ sub handler { col2 => ''}, {col1 => 'Log-in Help', col2 => 'Value'}], + print => \&print_login, + modify => \&modify_login, }; } @@ -549,6 +611,8 @@ sub process_changes { $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,$lastactref,%domconfig); + } elsif ($action eq 'selfenrollment') { + $output = &modify_selfenrollment($dom,$lastactref,%domconfig) } elsif ($action eq 'usersessions') { $output = &modify_usersessions($dom,$lastactref,%domconfig); } elsif ($action eq 'loadbalancing') { @@ -595,16 +659,12 @@ sub print_config_box { '.&mt($item->{'header'}->[0]->{'col2'}).' '; $rowtotal ++; - if ($action eq 'autoupdate') { - $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); + if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || + ($action eq 'usermodification') || ($action eq 'selfenrollment') || + ($action eq 'usersessions')) { + $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { - $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal); + $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); } elsif ($action eq 'login') { if ($numheaders == 3) { $colspan = ' colspan="2"'; @@ -612,12 +672,8 @@ sub print_config_box { } else { $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal); } - } elsif ($action eq 'requestcourses') { - $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif ($action eq 'requestauthor') { + } elsif (($action eq 'requestcourses') || ($action eq 'requestauthor')) { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif ($action eq 'usersessions') { - $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); } @@ -629,39 +685,14 @@ sub print_config_box { - '; - $output .= ' + '; $rowtotal ++; - if ($action eq 'autoupdate') { - $output .= &print_autoupdate('middle',$dom,$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[1]->{'col1'}).''.&mt($item->{'header'}->[1]->{'col1'}).' '.&mt($item->{'header'}->[1]->{'col2'}).'
- - - - - - - - '. - &print_autoupdate('bottom',$dom,$settings,\$rowtotal); - $rowtotal ++; - } elsif ($action eq 'usercreation') { - $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - - - '. - &print_usercreation('bottom',$dom,$settings,\$rowtotal); - $rowtotal ++; - } elsif ($action eq 'selfcreation') { - $output .= &print_selfcreation('middle',$dom,$settings,\$rowtotal).' + if (($action eq 'autoupdate') || ($action eq 'usercreation') || + ($action eq 'selfcreation') || ($action eq 'selfenrollment') || + ($action eq 'usersessions')) { + $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal).'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -671,11 +702,11 @@ sub print_config_box { '.&mt($item->{'header'}->[2]->{'col1'}).' '.&mt($item->{'header'}->[2]->{'col2'}).' - '. - &print_selfcreation('bottom',$dom,$settings,\$rowtotal); + '."\n". + $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - } elsif ($action eq 'usermodification') { - $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal); + } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults')) { + $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); } elsif ($action eq 'login') { @@ -707,22 +738,20 @@ sub print_config_box { '.&mt($item->{'header'}->[2]->{'col1'}).' '.&mt($item->{'header'}->[2]->{'col2'}).' '. - &print_textbookcourses($dom,$settings,\$rowtotal); - } elsif ($action eq 'requestauthor') { - $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); - } elsif ($action eq 'usersessions') { - $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).' - - - - + &print_textbookcourses($dom,$settings,\$rowtotal).' + + + + - - '. - &print_usersessions('bottom',$dom,$settings,\$rowtotal); - $rowtotal ++; + + + '. + &print_validation_rows('requestcourses',$dom,$settings,\$rowtotal); + } elsif ($action eq 'requestauthor') { + $output .= &print_requestmail($dom,$action,$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'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
@@ -801,26 +830,14 @@ sub print_config_box { $rowtotal ++; if ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif ($action eq 'autoenroll') { - $output .= &print_autoenroll($dom,$settings,\$rowtotal); - } elsif ($action eq 'autocreate') { - $output .= &print_autocreate($dom,$settings,\$rowtotal); - } elsif ($action eq 'directorysrch') { - $output .= &print_directorysrch($dom,$settings,\$rowtotal); - } elsif ($action eq 'contacts') { - $output .= &print_contacts($dom,$settings,\$rowtotal); - } elsif ($action eq 'defaults') { - $output .= &print_defaults($dom,$settings,\$rowtotal); + } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || ($action eq 'directorysrch') || + ($action eq 'contacts') || ($action eq 'defaults') || ($action eq 'serverstatuses') || + ($action eq 'loadbalancing')) { + $output .= $item->{'print'}->($dom,$settings,\$rowtotal); } elsif ($action eq 'scantron') { $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal); - } elsif ($action eq 'serverstatuses') { - $output .= &print_serverstatuses($dom,$settings,\$rowtotal); } elsif ($action eq 'helpsettings') { $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 .= ' @@ -1451,7 +1468,7 @@ sub display_color_options { $datatable .= ''. ''; foreach my $item (@{$links}) { - my $color = $designs->{'link'}{$item} ? $designs->{'link'}{$item} : $defaults->{'links'}{$item}; + my $color = $designs->{'links'}{$item} ? $designs->{'links'}{$item} : $defaults->{'links'}{$item}; $datatable .= ''."\n". - ''. - '
'.$choices->{$item}."\n"; if ($designs->{'links'}{$item}) { $datatable.=' '; @@ -2762,19 +2779,21 @@ sub print_coursedefaults { ''. ''. - '
'. - $choices{'uploadquota'}. - ''. - ''; + ''."\n"; + $itemcount ++; + $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; + $datatable .= ''. + ''."\n"; - $itemcount += 2; + $itemcount ++; my $onclick = 'toggleCredits(this.form);'; my $display = 'none'; if ($currusecredits) { @@ -2805,11 +2824,234 @@ sub print_coursedefaults { &radiobutton_prefs($current,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick,$additional); $datatable .= $table; + $itemcount ++; } $$rowtotal += $itemcount; return $datatable; } +sub print_selfenrollment { + my ($position,$dom,$settings,$rowtotal) = @_; + my ($css_class,$datatable); + my $itemcount = 1; + my @types = ('official','unofficial','community','textbook'); + if (($position eq 'top') || ($position eq 'middle')) { + my ($rowsref,$titlesref) = &Apache::lonuserutils::get_selfenroll_titles(); + my %descs = &Apache::lonuserutils::selfenroll_default_descs(); + my @rows; + my $key; + if ($position eq 'top') { + $key = 'admin'; + if (ref($rowsref) eq 'ARRAY') { + @rows = @{$rowsref}; + } + } elsif ($position eq 'middle') { + $key = 'default'; + @rows = ('types','registered','approval','limit'); + } + foreach my $row (@rows) { + if (defined($titlesref->{$row})) { + $itemcount ++; + $css_class = $itemcount%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''. + ''; + } + } elsif ($position eq 'bottom') { + $datatable .= &print_validation_rows('selfenroll',$dom,$settings,\$itemcount); + } + $$rowtotal += $itemcount; + return $datatable; +} + +sub print_validation_rows { + my ($caller,$dom,$settings,$rowtotal) = @_; + my ($itemsref,$namesref,$fieldsref); + if ($caller eq 'selfenroll') { + ($itemsref,$namesref,$fieldsref) = &Apache::lonuserutils::selfenroll_validation_types(); + } elsif ($caller eq 'requestcourses') { + ($itemsref,$namesref,$fieldsref) = &Apache::loncoursequeueadmin::requestcourses_validation_types(); + } + my %currvalidation; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'validation'}) eq 'HASH') { + %currvalidation = %{$settings->{'validation'}}; + } + } + my $datatable; + my $itemcount = 0; + foreach my $item (@{$itemsref}) { + my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; + $datatable .= ''. + ''."\n"; + if (ref($rowtotal)) { + $itemcount ++; + } + } + if ($caller eq 'requestcourses') { + my %currhash; + if (ref($settings->{'validation'}) eq 'HASH') { + if ($settings->{'validation'}{'dc'} ne '') { + $currhash{$settings->{'validation'}{'dc'}} = 1; + } + } + my $numinrow = 2; + my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio', + 'validationdc',%currhash); + if ($numdc > 1) { + $datatable .= ''; + } else { + $datatable .= $dctable.''; + } + $itemcount ++; + } + if (ref($rowtotal)) { + $$rowtotal += $itemcount; + } + return $datatable; +} + sub print_usersessions { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checked,%choices); @@ -3776,7 +4018,6 @@ sub print_selfcreation { } } my %radiohash; - my $rownum = 0; my $numinrow = 4; map { $radiohash{'cancreate_'.$_} = 1; } @selfcreate; if ($position eq 'top') { @@ -3789,18 +4030,18 @@ sub print_selfcreation { 'cancreate_login' => 'off', 'cancreate_sso' => 'off', ); - my $itemcount = 1; - my $onclick; + my ($onclick,$itemcount); ($datatable,$itemcount) = &radiobutton_prefs(\%radiohash,\@toggles,\%defaultchecked, \%choices,$itemcount,$onclick); + $$rowtotal += $itemcount; + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); if (ref($usertypes) eq 'HASH') { if (keys(%{$usertypes}) > 0) { $datatable .= &insttypes_row($createsettings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'statustocreate',$rownum); - $rownum ++; + 'statustocreate',$$rowtotal); $$rowtotal ++; } } @@ -3812,14 +4053,13 @@ sub print_selfcreation { push(@{$types},'default'); $usertypes->{'default'} = $othertitle; foreach my $status (@{$types}) { - $rownum ++; $datatable .= &modifiable_userdata_row('selfcreate',$status,$domconf{'usermodification'}, - $numinrow,$rownum,$usertypes); + $numinrow,$$rowtotal,$usertypes); $$rowtotal ++; } } } else { - my $css_class = $rownum%2?' class="LC_odd_row"':''; + my $css_class = $$rowtotal%2?' class="LC_odd_row"':''; my %choices = &Apache::lonlocal::texthash( email => 'Approved automatically', @@ -3851,27 +4091,32 @@ sub print_selfcreation { $choices{$option}.' '; } $$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 ($infofields,$infotitles) = &Apache::loncommon::emailusername_info(); + $numinrow = 1; + 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('cancreate','emailusername_'.$status,$settings, + $numinrow,$$rowtotal,$usertypes,$infofields,$infotitles); + $$rowtotal ++; + } + } 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 ++; + $emailruleorder,$numinrow,$$rowtotal); $$rowtotal ++; } } - $datatable .= &captcha_choice('cancreate',$createsettings,$rownum); + $datatable .= &captcha_choice('cancreate',$createsettings,$$rowtotal); } return $datatable; } @@ -4048,7 +4293,7 @@ sub print_usermodification { $$rowtotal ++; $rowcount ++; } - } elsif ($position eq 'middle') { + } elsif ($position eq 'bottom') { $context = 'course'; $rowcount = 0; foreach my $role ('st','ep','ta','in','cr') { @@ -4606,7 +4851,7 @@ sub serverstatus_pages { return ('userstatus','lonstatus','loncron','server-status','codeversions', 'checksums','clusterstatus','metadata_keywords','metadata_harvest', 'takeoffline','takeonline','showenv','toggledebug','ping','domconf', - 'uniquecodes'); + 'uniquecodes','diskusage'); } sub coursecategories_javascript { @@ -4837,11 +5082,20 @@ sub build_category_rows { } sub modifiable_userdata_row { - my ($context,$role,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_; - my $rolename; + my ($context,$item,$settings,$numinrow,$rowcount,$usertypes,$fieldsref,$titlesref) = @_; + my ($role,$rolename,$statustype); + $role = $item; if ($context eq 'cancreate') { - if ($role eq 'emailusername') { - $rolename = &mt('Data user provides'); + if ($item =~ /^emailusername_(.+)$/) { + $statustype = $1; + $role = 'emailusername'; + if (ref($usertypes) eq 'HASH') { + if ($usertypes->{$statustype}) { + $rolename = &mt('Data provided by [_1]',$usertypes->{$statustype}); + } else { + $rolename = &mt('Data provided by user'); + } + } } } elsif ($context eq 'selfcreate') { if (ref($usertypes) eq 'HASH') { @@ -4878,14 +5132,33 @@ sub modifiable_userdata_row { if (ref($settings) eq 'HASH') { if (ref($settings->{$context}) eq 'HASH') { if (ref($settings->{$context}->{$role}) eq 'HASH') { - foreach my $field (@fields) { - if ($settings->{$context}->{$role}->{$field}) { - $checks{$field} = ' checked="checked" '; + my $hashref = $settings->{$context}->{$role}; + if ($role eq 'emailusername') { + if ($statustype) { + if (ref($settings->{$context}->{$role}->{$statustype}) eq 'HASH') { + $hashref = $settings->{$context}->{$role}->{$statustype}; + if (ref($hashref) eq 'HASH') { + foreach my $field (@fields) { + if ($hashref->{$field}) { + $checks{$field} = $hashref->{$field}; + } + } + } + } + } + } else { + if (ref($hashref) eq 'HASH') { + foreach my $field (@fields) { + if ($hashref->{$field}) { + $checks{$field} = ' checked="checked" '; + } + } } } } } } + for (my $i=0; $i<@fields; $i++) { my $rem = $i%($numinrow); if ($rem == 0) { @@ -4895,20 +5168,40 @@ sub modifiable_userdata_row { $output .= ''; } my $check = ' '; - if (exists($checks{$fields[$i]})) { - $check = $checks{$fields[$i]} - } else { - if ($role eq 'st') { - if (ref($settings) ne 'HASH') { - $check = ' checked="checked" '; + unless ($role eq 'emailusername') { + if (exists($checks{$fields[$i]})) { + $check = $checks{$fields[$i]} + } else { + if ($role eq 'st') { + if (ref($settings) ne 'HASH') { + $check = ' checked="checked" '; + } } } } $output .= ''; + ''; + if ($role eq 'emailusername') { + unless ($checks{$fields[$i]} =~ /^(required|optional)$/) { + $checks{$fields[$i]} = 'omit'; + } + foreach my $option ('required','optional','omit') { + my $checked=''; + if ($checks{$fields[$i]} eq $option) { + $checked='checked="checked" '; + } + $output .= ''.(' ' x2); + } + $output .= ''.$fieldtitles{$fields[$i]}.''; + } else { + $output .= ''; + } + $output .= ''; $rem = @fields%($numinrow); } my $colsleft = $numinrow - $rem; @@ -5509,22 +5802,38 @@ sub modify_colors { } if ($role eq 'login') { foreach my $item (@logintext) { - unless ($env{'form.'.$role.'_'.$item} eq $defaults{'logintext'}{$item}) { + $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item}); + if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) { + $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item}; + } + unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'logintext'}{$item})) { $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item}; } } } else { - unless($env{'form.'.$role.'_fontmenu'} eq $defaults{'fontmenu'}) { + $env{'form.'.$role.'_fontmenu'} = lc($env{'form.'.$role.'_fontmenu'}); + if ($env{'form.'.$role.'_fontmenu'} =~ /^\w+/) { + $env{'form.'.$role.'_fontmenu'} = '#'.$env{'form.'.$role.'_fontmenu'}; + } + unless($env{'form.'.$role.'_fontmenu'} eq lc($defaults{'fontmenu'})) { $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'}; } } foreach my $item (@bgs) { - unless ($env{'form.'.$role.'_'.$item} eq $defaults{'bgs'}{$item} ) { + $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item}); + if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) { + $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item}; + } + unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'bgs'}{$item})) { $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item}; } } foreach my $item (@links) { - unless ($env{'form.'.$role.'_'.$item} eq $defaults{'links'}{$item}) { + $env{'form.'.$role.'_'.$item} = lc($env{'form.'.$role.'_'.$item}); + if ($env{'form.'.$role.'_'.$item} =~ /^\w+/) { + $env{'form.'.$role.'_'.$item} = '#'.$env{'form.'.$role.'_'.$item}; + } + unless ($env{'form.'.$role.'_'.$item} eq lc($defaults{'links'}{$item})) { $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item}; } } @@ -6146,7 +6455,8 @@ sub modify_quotas { my ($r,$dom,$action,$lastactref,%domconfig) = @_; my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash, %limithash,$toolregexp,%conditions,$resulttext,%changes,$confname,$configuserok, - $author_ok,$switchserver,$errors); + $author_ok,$switchserver,$errors,$validationitemsref,$validationnamesref, + $validationfieldsref); if ($action eq 'quotas') { $context = 'tools'; } else { @@ -6162,6 +6472,8 @@ sub modify_quotas { $confname = $dom.'-domainconfig'; my $servadm = $r->dir_config('lonAdmEMail'); ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm); + ($validationitemsref,$validationnamesref,$validationfieldsref) = + &Apache::loncoursequeueadmin::requestcourses_validation_types(); } elsif ($context eq 'requestauthor') { @usertools = ('author'); %titles = &authorrequest_titles(); @@ -6229,6 +6541,7 @@ sub modify_quotas { ''; } } + } if (ref($domconfig{$action}) eq 'HASH') { if (ref($domconfig{$action}{'notify'}) eq 'HASH') { @@ -6335,7 +6648,7 @@ sub modify_quotas { } if ($env{'form.addbook_image.filename'} ne '') { my ($cdom,$cnum) = split(/_/,$newbook); - my ($imageurl,$error) = + my ($imageurl,$error) = &process_textbook_image($r,$dom,$confname,'addbook_image',$cdom,$cnum,$configuserok, $switchserver,$author_ok); if ($imageurl) { @@ -6365,6 +6678,78 @@ sub modify_quotas { } } } + if (ref($validationitemsref) eq 'ARRAY') { + foreach my $item (@{$validationitemsref}) { + if ($item eq 'fields') { + my @changed; + @{$confhash{'validation'}{$item}} = &Apache::loncommon::get_env_multiple('form.requestcourses_validation_'.$item); + if (@{$confhash{'validation'}{$item}} > 0) { + @{$confhash{'validation'}{$item}} = sort(@{$confhash{'validation'}{$item}}); + } + if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') { + if (ref($domconfig{'requestcourses'}{'validation'}{$item}) eq 'ARRAY') { + @changed = &Apache::loncommon::compare_arrays($confhash{'validation'}{$item}, + $domconfig{'requestcourses'}{'validation'}{$item}); + } else { + @changed = @{$confhash{'validation'}{$item}}; + } + } else { + @changed = @{$confhash{'validation'}{$item}}; + } + if (@changed) { + if ($confhash{'validation'}{$item}) { + $changes{'validation'}{$item} = join(', ',@{$confhash{'validation'}{$item}}); + } else { + $changes{'validation'}{$item} = &mt('None'); + } + } + } else { + $confhash{'validation'}{$item} = $env{'form.requestcourses_validation_'.$item}; + if ($item eq 'markup') { + if ($env{'form.requestcourses_validation_'.$item}) { + $env{'form.requestcourses_validation_'.$item} =~ s/[\n\r\f]+/\s/gs; + } + } + if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') { + if ($domconfig{'requestcourses'}{'validation'}{$item} ne $confhash{'validation'}{$item}) { + $changes{'validation'}{$item} = $confhash{'validation'}{$item}; + } + } else { + if ($confhash{'validation'}{$item} ne '') { + $changes{'validation'}{$item} = $confhash{'validation'}{$item}; + } + } + } + } + } + if ($env{'form.validationdc'}) { + my $newval = $env{'form.validationdc'}; + my %domcoords = &get_active_dcs($dom); + if (exists($domcoords{$newval})) { + $confhash{'validation'}{'dc'} = $newval; + } + } + if (ref($confhash{'validation'}) eq 'HASH') { + if (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') { + if ($domconfig{'requestcourses'}{'validation'}{'dc'}) { + unless ($confhash{'validation'}{'dc'} eq $domconfig{'requestcourses'}{'validation'}{'dc'}) { + if ($confhash{'validation'}{'dc'} eq '') { + $changes{'validation'}{'dc'} = &mt('None'); + } else { + $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'}; + } + } + } elsif ($confhash{'validation'}{'dc'} ne '') { + $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'}; + } + } elsif ($confhash{'validation'}{'dc'} ne '') { + $changes{'validation'}{'dc'} = $confhash{'validation'}{'dc'}; + } + } elsif (ref($domconfig{'requestcourses'}{'validation'}) eq 'HASH') { + if ($domconfig{'requestcourses'}{'validation'}{'dc'}) { + $changes{'validation'}{'dc'} = &mt('None'); + } + } } } else { $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'}; @@ -6680,6 +7065,26 @@ sub modify_quotas { } $resulttext .= ''; } + if (ref($changes{'validation'}) eq 'HASH') { + if ((ref($validationitemsref) eq 'ARRAY') && (ref($validationnamesref) eq 'HASH')) { + $resulttext .= '
  • '.&mt('Validation of courses/communities updated').'
      '; + foreach my $item (@{$validationitemsref}) { + if (exists($changes{'validation'}{$item})) { + if ($item eq 'markup') { + $resulttext .= '
    • '.&mt('[_1] set to: [_2]',$validationnamesref->{$item}, + '
      '.$changes{'validation'}{$item}.'
      ').'
    • '; + } else { + $resulttext .= '
    • '.&mt('[_1] set to: [_2]',$validationnamesref->{$item}, + ''.$changes{'validation'}{$item}.'').'
    • '; + } + } + } + if (exists($changes{'validation'}{'dc'})) { + $resulttext .= '
    • '.&mt('Validated course requests identified as processed by: [_1]', + ''.$changes{'validation'}{'dc'}.'').'
    • '; + } + } + } } $resulttext .= '
    '; if (keys(%newenv)) { @@ -7641,6 +8046,11 @@ sub modify_selfcreation { my ($dom,%domconfig) = @_; my ($resulttext,$warningmsg,%curr_usercreation,%curr_usermodify,%changes,%cancreate); my (%save_usercreate,%save_usermodify); + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + if (ref($types) eq 'ARRAY') { + $usertypes->{'default'} = $othertitle; + push(@{$types},'default'); + } # # Retrieve current domain configuration for self-creation of usernames from $domconfig{'usercreation'}. # @@ -7692,7 +8102,7 @@ sub modify_selfcreation { # Populate $cancreate{'selfcreate'} array reference with types of user, for which self-creation of user accounts # is permitted. # - foreach my $item ('login','sso','email') { + foreach my $item ('login','sso','email') { if ($item eq 'email') { if ($env{'form.cancreate_email'} eq 'email') { push(@{$cancreate{'selfcreate'}},'email'); @@ -7708,20 +8118,22 @@ sub modify_selfcreation { 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. +# Populate $cancreate{'emailusername'}{$type} hash ref with information fields (if new user will provide data +# value set to one), if self-creation with e-mail address permitted, where $type is user type: faculty, staff, student etc. # 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; + push(@contexts,'emailusername'); + if (ref($types) eq 'ARRAY') { + foreach my $type (@{$types}) { + if (ref($infofields) eq 'ARRAY') { + foreach my $field (@{$infofields}) { + if ($env{'form.canmodify_emailusername_'.$type.'_'.$field} =~ /^(required|optional)$/) { + $cancreate{'emailusername'}{$type}{$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 @@ -7780,7 +8192,6 @@ sub modify_selfcreation { &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(); @@ -7793,14 +8204,12 @@ sub modify_selfcreation { # if (($env{'form.cancreate_login'}) || ($env{'form.cancreate_sso'})) { if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { + if (@{$types} > 1) { @{$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) { @@ -7853,16 +8262,42 @@ sub modify_selfcreation { } 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); + if (ref($curr_usercreation{'cancreate'}{$item}{$curr}) eq 'HASH') { + foreach my $field (keys(%{$curr_usercreation{'cancreate'}{$item}{$curr}})) { + unless ($curr_usercreation{'cancreate'}{$item}{$curr}{$field} eq $cancreate{$item}{$curr}{$field}) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } + } else { + 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); + if (ref($cancreate{$item}{$field}) eq 'HASH') { + foreach my $inner (keys(%{$cancreate{$item}{$field}})) { + if (ref($curr_usercreation{'cancreate'}{$item}{$field}) eq 'HASH') { + unless ($curr_usercreation{'cancreate'}{$item}{$field}{$inner} eq $cancreate{$item}{$field}{$inner}) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } else { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + } + } + } else { + if (!$curr_usercreation{'cancreate'}{$item}{$field}) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } } } } @@ -7882,8 +8317,19 @@ sub modify_selfcreation { } } } elsif ($item eq 'emailusername') { - if (keys(%userinfo) > 0) { - push(@{$changes{'cancreate'}},$item); + if (ref($cancreate{$item}) eq 'HASH') { + foreach my $type (keys(%{$cancreate{$item}})) { + if (ref($cancreate{$item}{$type}) eq 'HASH') { + foreach my $field (keys(%{$cancreate{$item}{$type}})) { + if ($cancreate{$item}{$type}{$field}) { + if (!grep(/^$item$/,@{$changes{'cancreate'}})) { + push(@{$changes{'cancreate'}},$item); + } + last; + } + } + } + } } } } @@ -8013,17 +8459,23 @@ sub modify_selfcreation { $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}.'
    • '; + if (ref($types) eq 'ARRAY') { + foreach my $type (@{$types}) { + if (ref($cancreate{'emailusername'}{$type}) eq 'HASH') { + if (keys(%{$cancreate{'emailusername'}{$type}}) > 0) { + $chgtext .= &mt('When self-creating account with e-mail as username, the following information will be provided by [_1]:',$usertypes->{$type}). + '
        '; + foreach my $field (@{$infofields}) { + if ($cancreate{'emailusername'}{$type}{$field}) { + $chgtext .= '
      • '.$infotitles->{$field}.'
      • '; + } + } + } + $chgtext .= '
      '; + } else { + $chgtext .= &mt('When self creating account with e-mail as username, no information besides e-mail address will be provided by [_1].',$usertypes->{$type}).'
      '; } } - $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') { @@ -8938,6 +9390,7 @@ sub modify_coursedefaults { } } } + my $officialcreds = $env{'form.official_credits'}; $officialcreds =~ s/[^\d.]+//g; my $unofficialcreds = $env{'form.unofficial_credits'}; @@ -8965,7 +9418,8 @@ sub modify_coursedefaults { if ($putresult eq 'ok') { if (keys(%changes) > 0) { my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); - if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) { + if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || + ($changes{'uploadquota'})) { if ($changes{'canuse_pdfforms'}) { $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'}; } @@ -9045,6 +9499,245 @@ sub modify_coursedefaults { return $resulttext; } +sub modify_selfenrollment { + my ($dom,$lastactref,%domconfig) = @_; + my ($resulttext,$errors,%changes,%selfenrollhash,%ordered); + my @types = ('official','unofficial','community','textbook'); + my %titles = &tool_titles(); + my %descs = &Apache::lonuserutils::selfenroll_default_descs(); + ($ordered{'admin'},my $titlesref) = &Apache::lonuserutils::get_selfenroll_titles(); + $ordered{'default'} = ['types','registered','approval','limit']; + + my (%roles,%shown,%toplevel); + $roles{'0'} = &Apache::lonnet::plaintext('dc'); + + if (ref($domconfig{'selfenrollment'}) ne 'HASH') { + if ($domconfig{'selfenrollment'} eq '') { + $domconfig{'selfenrollment'} = {}; + } + } + %toplevel = ( + admin => 'Configuration Rights', + default => 'Default settings', + validation => 'Validation of self-enrollment requests', + ); + my ($itemsref,$namesref,$fieldsref) = &Apache::lonuserutils::selfenroll_validation_types(); + + if (ref($ordered{'admin'}) eq 'ARRAY') { + foreach my $item (@{$ordered{'admin'}}) { + foreach my $type (@types) { + if ($env{'form.selfenrolladmin_'.$item.'_'.$type}) { + $selfenrollhash{'admin'}{$type}{$item} = 1; + } else { + $selfenrollhash{'admin'}{$type}{$item} = 0; + } + if (ref($domconfig{'selfenrollment'}{'admin'}) eq 'HASH') { + if (ref($domconfig{'selfenrollment'}{'admin'}{$type}) eq 'HASH') { + if ($selfenrollhash{'admin'}{$type}{$item} ne + $domconfig{'selfenrollment'}{'admin'}{$type}{$item}) { + push(@{$changes{'admin'}{$type}},$item); + } + } else { + if (!$selfenrollhash{'admin'}{$type}{$item}) { + push(@{$changes{'admin'}{$type}},$item); + } + } + } elsif (!$selfenrollhash{'admin'}{$type}{$item}) { + push(@{$changes{'admin'}{$type}},$item); + } + } + } + } + + foreach my $item (@{$ordered{'default'}}) { + foreach my $type (@types) { + my $value = $env{'form.selfenrolldefault_'.$item.'_'.$type}; + if ($item eq 'types') { + unless (($value eq 'all') || ($value eq 'dom')) { + $value = ''; + } + } elsif ($item eq 'registered') { + unless ($value eq '1') { + $value = 0; + } + } elsif ($item eq 'approval') { + unless ($value =~ /^[012]$/) { + $value = 0; + } + } else { + unless (($value eq 'allstudents') || ($value eq 'selfenrolled')) { + $value = 'none'; + } + } + $selfenrollhash{'default'}{$type}{$item} = $value; + if (ref($domconfig{'selfenrollment'}{'default'}) eq 'HASH') { + if (ref($domconfig{'selfenrollment'}{'default'}{$type}) eq 'HASH') { + if ($selfenrollhash{'default'}{$type}{$item} ne + $domconfig{'selfenrollment'}{'default'}{$type}{$item}) { + push(@{$changes{'default'}{$type}},$item); + } + } else { + push(@{$changes{'default'}{$type}},$item); + } + } else { + push(@{$changes{'default'}{$type}},$item); + } + if ($item eq 'limit') { + if (($value eq 'allstudents') || ($value eq 'selfenrolled')) { + $env{'form.selfenrolldefault_cap_'.$type} =~ s/\D//g; + if ($env{'form.selfenrolldefault_cap_'.$type} ne '') { + $selfenrollhash{'default'}{$type}{'cap'} = $env{'form.selfenrolldefault_cap_'.$type}; + } + } else { + $selfenrollhash{'default'}{$type}{'cap'} = ''; + } + if (ref($domconfig{'selfenrollment'}{'default'}{$type}) eq 'HASH') { + if ($selfenrollhash{'default'}{$type}{'cap'} ne + $domconfig{'selfenrollment'}{'admin'}{$type}{'cap'}) { + push(@{$changes{'default'}{$type}},'cap'); + } + } elsif ($selfenrollhash{'default'}{$type}{'cap'} ne '') { + push(@{$changes{'default'}{$type}},'cap'); + } + } + } + } + + foreach my $item (@{$itemsref}) { + if ($item eq 'fields') { + my @changed; + @{$selfenrollhash{'validation'}{$item}} = &Apache::loncommon::get_env_multiple('form.selfenroll_validation_'.$item); + if (@{$selfenrollhash{'validation'}{$item}} > 0) { + @{$selfenrollhash{'validation'}{$item}} = sort(@{$selfenrollhash{'validation'}{$item}}); + } + if (ref($domconfig{'selfenrollment'}{'validation'}) eq 'HASH') { + if (ref($domconfig{'selfenrollment'}{'validation'}{$item}) eq 'ARRAY') { + @changed = &Apache::loncommon::compare_arrays($selfenrollhash{'validation'}{$item}, + $domconfig{'selfenrollment'}{'validation'}{$item}); + } else { + @changed = @{$selfenrollhash{'validation'}{$item}}; + } + } else { + @changed = @{$selfenrollhash{'validation'}{$item}}; + } + if (@changed) { + if ($selfenrollhash{'validation'}{$item}) { + $changes{'validation'}{$item} = join(', ',@{$selfenrollhash{'validation'}{$item}}); + } else { + $changes{'validation'}{$item} = &mt('None'); + } + } + } else { + $selfenrollhash{'validation'}{$item} = $env{'form.selfenroll_validation_'.$item}; + if ($item eq 'markup') { + if ($env{'form.selfenroll_validation_'.$item}) { + $env{'form.selfenroll_validation_'.$item} =~ s/[\n\r\f]+/\s/gs; + } + } + if (ref($domconfig{'selfenrollment'}{'validation'}) eq 'HASH') { + if ($domconfig{'selfenrollment'}{'validation'}{$item} ne $selfenrollhash{'validation'}{$item}) { + $changes{'validation'}{$item} = $selfenrollhash{'validation'}{$item}; + } + } + } + } + + my $putresult = &Apache::lonnet::put_dom('configuration',{'selfenrollment' => \%selfenrollhash}, + $dom); + if ($putresult eq 'ok') { + if (keys(%changes) > 0) { + my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1); + $resulttext = &mt('Changes made:').'
      '; + foreach my $key ('admin','default','validation') { + if (ref($changes{$key}) eq 'HASH') { + $resulttext .= '
    • '.$toplevel{$key}.'
        '; + if ($key eq 'validation') { + foreach my $item (@{$itemsref}) { + if (exists($changes{$key}{$item})) { + if ($item eq 'markup') { + $resulttext .= '
      • '.&mt('[_1] set to: [_2]',$namesref->{$item}, + '
        '.$changes{$key}{$item}.'
        ').'
      • '; + } else { + $resulttext .= '
      • '.&mt('[_1] set to: [_2]',$namesref->{$item}, + ''.$changes{$key}{$item}.'').'
      • '; + } + } + } + } else { + foreach my $type (@types) { + if ($type eq 'community') { + $roles{'1'} = &mt('Community personnel'); + } else { + $roles{'1'} = &mt('Course personnel'); + } + if (ref($changes{$key}{$type}) eq 'ARRAY') { + if (ref($selfenrollhash{$key}{$type}) eq 'HASH') { + if ($key eq 'admin') { + my @mgrdc = (); + if (ref($ordered{$key}) eq 'ARRAY') { + foreach my $item (@{$ordered{'admin'}}) { + if (ref($selfenrollhash{$key}{$type}) eq 'HASH') { + if ($selfenrollhash{$key}{$type}{$item} eq '0') { + push(@mgrdc,$item); + } + } + } + if (@mgrdc) { + $domdefaults{$type.'selfenrolladmdc'} = join(',',@mgrdc); + } else { + delete($domdefaults{$type.'selfenrolladmdc'}); + } + } + } else { + if (ref($ordered{$key}) eq 'ARRAY') { + foreach my $item (@{$ordered{$key}}) { + if (grep(/^\Q$item\E$/,@{$changes{$key}{$type}})) { + $domdefaults{$type.'selfenroll'.$item} = + $selfenrollhash{$key}{$type}{$item}; + } + } + } + } + } + $resulttext .= '
      • '.$titles{$type}.'
          '; + foreach my $item (@{$ordered{$key}}) { + if (grep(/^\Q$item\E$/,@{$changes{$key}{$type}})) { + $resulttext .= '
        • '; + if ($key eq 'admin') { + $resulttext .= &mt('[_1] -- management by: [_2]',$titlesref->{$item}, + ''.$roles{$selfenrollhash{'admin'}{$type}{$item}}.''); + } else { + $resulttext .= &mt('[_1] set to: [_2]',$titlesref->{$item}, + ''.$descs{$item}{$selfenrollhash{'default'}{$type}{$item}}.''); + } + $resulttext .= '
        • '; + } + } + $resulttext .= '
      • '; + } + } + $resulttext .= '
    • '; + } + } + if ((exists($changes{'admin'})) || (exists($changes{'default'}))) { + my $cachetime = 24*60*60; + &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime); + if (ref($lastactref) eq 'HASH') { + $lastactref->{'domdefaults'} = 1; + } + } + } + $resulttext .= '
    '; + } else { + $resulttext = &mt('No changes made to self-enrollment settings'); + } + } else { + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; + } + return $resulttext; +} + sub modify_usersessions { my ($dom,$lastactref,%domconfig) = @_; my @hostingtypes = ('version','excludedomain','includedomain'); @@ -9577,7 +10270,7 @@ sub get_active_dcs { sub active_dc_picker { my ($dom,$numinrow,$inputtype,$name,%currhash) = @_; - my %domcoords = &get_active_dcs($dom); + my %domcoords = &get_active_dcs($dom); my @domcoord = keys(%domcoords); if (keys(%currhash)) { foreach my $dc (keys(%currhash)) {
  • '. + $choices{'uploadquota'}. + ''. + ''; foreach my $type (@types) { $datatable .= ''; } $datatable .= '
    '.&mt($type).'
    '. '
    '.$titlesref->{$row}.''. + ''; + my (%current,%currentcap); + if (ref($settings) eq 'HASH') { + if (ref($settings->{$key}) eq 'HASH') { + foreach my $type (@types) { + if (ref($settings->{$key}->{$type}) eq 'HASH') { + $current{$type} = $settings->{$key}->{$type}->{$row}; + } + if (($row eq 'limit') && ($key eq 'default')) { + if (ref($settings->{$key}->{$type}) eq 'HASH') { + $currentcap{$type} = $settings->{$key}->{$type}->{'cap'}; + } + } + } + } + } + my %roles = ( + '0' => &Apache::lonnet::plaintext('dc'), + ); + + foreach my $type (@types) { + unless (($row eq 'registered') && ($key eq 'default')) { + $datatable .= ''; + } + } + unless (($row eq 'registered') && ($key eq 'default')) { + $datatable .= ''; + } + foreach my $type (@types) { + if ($type eq 'community') { + $roles{'1'} = &mt('Community personnel'); + } else { + $roles{'1'} = &mt('Course personnel'); + } + $datatable .= ''; + } + $datatable .= ''; + } + $datatable .= '
    '.&mt($type).'
    '; + if ($position eq 'top') { + my %checked; + if ($current{$type} eq '0') { + $checked{'0'} = ' checked="checked"'; + } else { + $checked{'1'} = ' checked="checked"'; + } + foreach my $role ('1','0') { + $datatable .= ' '; + } + } else { + if ($row eq 'types') { + my %checked; + if ($current{$type} =~ /^(all|dom)$/) { + $checked{$1} = ' checked="checked"'; + } else { + $checked{''} = ' checked="checked"'; + } + foreach my $val ('','dom','all') { + $datatable .= ' '; + } + } elsif ($row eq 'registered') { + my %checked; + if ($current{$type} eq '1') { + $checked{'1'} = ' checked="checked"'; + } else { + $checked{'0'} = ' checked="checked"'; + } + foreach my $val ('0','1') { + $datatable .= ' '; + } + } elsif ($row eq 'approval') { + my %checked; + if ($current{$type} =~ /^([12])$/) { + $checked{$1} = ' checked="checked"'; + } else { + $checked{'0'} = ' checked="checked"'; + } + for my $val (0..2) { + $datatable .= ' '; + } + } elsif ($row eq 'limit') { + my %checked; + if ($current{$type} =~ /^(allstudents|selfenrolled)$/) { + $checked{$1} = ' checked="checked"'; + } else { + $checked{'none'} = ' checked="checked"'; + } + my $cap; + if ($currentcap{$type} =~ /^\d+$/) { + $cap = $currentcap{$type}; + } + foreach my $val ('none','allstudents','selfenrolled') { + $datatable .= ' '; + } + $datatable .= '
    '. + ''.&mt('Maximum allowed: '). + ''. + ''; + } + } + $datatable .= '
    '. + $namesref->{$item}. + ''; + if (($item eq 'url') || ($item eq 'button')) { + $datatable .= ''. + ''; + } elsif ($item eq 'fields') { + my @currfields; + if (ref($currvalidation{$item}) eq 'ARRAY') { + @currfields = @{$currvalidation{$item}}; + } + foreach my $field (@{$fieldsref}) { + my $check = ''; + if (grep(/^\Q$field\E$/,@currfields)) { + $check = ' checked="checked"'; + } + $datatable .= ' '; + } + } elsif ($item eq 'markup') { + $datatable .= ''; + } + $datatable .= '
    '. + &mt('Course creation processed as: (choose Dom. Coord.)'). + ''.$dctable.'
    '. - '