--- loncom/interface/domainprefs.pm 2009/11/30 06:23:32 1.121 +++ loncom/interface/domainprefs.pm 2010/02/22 18:28:13 1.127 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.121 2009/11/30 06:23:32 raeburn Exp $ +# $Id: domainprefs.pm,v 1.127 2010/02/22 18:28:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -199,12 +199,13 @@ sub handler { } my %domconfig = &Apache::lonnet::get_dom('configuration',['login','rolecolors', - 'quotas','autoenroll','autoupdate','directorysrch', - 'usercreation','usermodification','contacts','defaults', - 'scantron','coursecategories','serverstatuses', - 'requestcourses','helpsettings','coursedefaults'],$dom); + 'quotas','autoenroll','autoupdate','autocreate', + 'directorysrch','usercreation','usermodification', + 'contacts','defaults','scantron','coursecategories', + 'serverstatuses','requestcourses','helpsettings', + 'coursedefaults'],$dom); my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', - 'autoupdate','directorysrch','contacts', + 'autoupdate','autocreate','directorysrch','contacts', 'usercreation','usermodification','scantron', 'requestcourses','coursecategories','serverstatuses','helpsettings', 'coursedefaults'); @@ -255,6 +256,12 @@ sub handler { {col1 => 'User population', col2 => 'Updataeable user data'}], }, + 'autocreate' => + { text => 'Auto-course creation settings', + help => 'Domain_Configuration_Auto_Creation', + header => [{col1 => 'Configuration Setting', + col2 => 'Value',}], + }, 'directorysrch' => { text => 'Institutional directory searches', help => 'Domain_Configuration_InstDirectory_Search', @@ -323,8 +330,10 @@ sub handler { 'helpsettings' => {text => 'Help page settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Setting', - col2 => 'Value',}], + header => [{col1 => 'Authenticated Help Settings', + col2 => ''}, + {col1 => 'Unauthenticated Help Settings', + col2 => ''}], }, 'coursedefaults' => {text => 'Course/Community defaults', @@ -416,6 +425,8 @@ sub process_changes { $output = &modify_autoenroll($dom,%domconfig); } elsif ($action eq 'autoupdate') { $output = &modify_autoupdate($dom,%domconfig); + } elsif ($action eq 'autocreate') { + $output = &modify_autocreate($dom,%domconfig); } elsif ($action eq 'directorysrch') { $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { @@ -435,7 +446,7 @@ sub process_changes { } elsif ($action eq 'requestcourses') { $output = &modify_quotas($dom,$action,%domconfig); } elsif ($action eq 'helpsettings') { - $output = &modify_helpsettings($dom,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { $output = &modify_coursedefaults($dom,%domconfig); } @@ -463,7 +474,7 @@ sub print_config_box { } if ($numheaders > 1) { my $colspan = ''; - if (($action eq 'rolecolors') || ($action eq 'coursecategories')) { + if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'helpsettings')) { $colspan = ' colspan="2"'; } $output .= ' @@ -489,8 +500,8 @@ sub print_config_box { } elsif ($action eq 'requestcourses') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); } elsif ($action eq 'helpsettings') { - $output .= &print_helpsettings($dom,$settings,\$rowtotal); - } else { + $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); } $output .= ' @@ -541,7 +552,9 @@ sub print_config_box { $output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal); } elsif ($action eq 'requestcourses') { $output .= &print_courserequestmail($dom,$settings,\$rowtotal); - } else { + } elsif ($action eq 'helpsettings') { + $output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).' @@ -615,6 +628,8 @@ sub print_config_box { $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') { @@ -626,7 +641,7 @@ sub print_config_box { } elsif ($action eq 'serverstatuses') { $output .= &print_serverstatuses($dom,$settings,\$rowtotal); } elsif ($action eq 'helpsettings') { - $output .= &print_helpsettings($dom,$settings,\$rowtotal); + $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal); } elsif ($action eq 'coursedefaults') { $output .= &print_coursedefaults($dom,$settings,\$rowtotal); } @@ -1312,15 +1327,15 @@ sub print_quotas { $cell{$item} .= ' '; + $titles{$option}.''; if ($option eq 'autolimit') { - $cell{$item} .= ''; } - $cell{$item} .= '  '; + $cell{$item} .= ' '; if ($option eq 'autolimit') { - $cell{$item} .= $titles{'unlimited'} + $cell{$item} .= $titles{'unlimited'}; } } } else { @@ -1420,13 +1435,13 @@ sub print_quotas { '_default" value="'.$val.'"'.$checked.' />'. $titles{$option}.''; if ($option eq 'autolimit') { - $defcell{$item} .= ''; } - $defcell{$item} .= '  '; + $defcell{$item} .= ' '; if ($option eq 'autolimit') { - $defcell{$item} .= $titles{'unlimited'} + $defcell{$item} .= $titles{'unlimited'}; } } } else { @@ -1523,13 +1538,13 @@ sub print_quotas { '__LC_adv" value="'.$val.'"'.$checked.' />'. $titles{$option}.''; if ($option eq 'autolimit') { - $advcell{$item} .= ''; } - $advcell{$item} .= '  '; + $advcell{$item} .= ' '; if ($option eq 'autolimit') { - $advcell{$item} .= $titles{'unlimited'} + $advcell{$item} .= $titles{'unlimited'}; } } } else { @@ -1757,6 +1772,57 @@ sub print_autoupdate { return $datatable; } +sub print_autocreate { + my ($dom,$settings,$rowtotal) = @_; + my (%createon,%createoff); + my $curr_dc; + my @types = ('xml','req'); + if (ref($settings) eq 'HASH') { + foreach my $item (@types) { + $createoff{$item} = ' checked="checked" '; + $createon{$item} = ' '; + if (exists($settings->{$item})) { + if ($settings->{$item}) { + $createon{$item} = ' checked="checked" '; + $createoff{$item} = ' '; + } + } + } + $curr_dc = $settings->{'xmldc'}; + } else { + foreach my $item (@types) { + $createoff{$item} = ' checked="checked" '; + $createon{$item} = ' '; + } + } + $$rowtotal += 2; + my $datatable=''. + ''.&mt('Create pending official courses from XML files').''. + ' '. + ''; + my ($numdc,$dctable) = &active_dc_picker($dom,$curr_dc); + if ($numdc > 1) { + $datatable .= ''. + &mt('XML files processed as: (choose Dom. Coord.)'). + ''.$dctable.''. + ''; + $$rowtotal ++ ; + } else { + $datatable .= ''; + } + $datatable .= ''.&mt('Create pending requests for official courses (if validated)').''. + ' '. + ''. + ''; + return $datatable; +} + sub print_directorysrch { my ($dom,$settings,$rowtotal) = @_; my $srchon = ' '; @@ -1946,22 +2012,99 @@ sub print_contacts { } sub print_helpsettings { - my ($dom,$settings,$rowtotal) = @_; - my ($css_class,$datatable); - my $itemcount = 1; - my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles); - %choices = - &Apache::lonlocal::texthash ( - submitbugs => 'Display "Submit a bug" link?', - ); - %defaultchecked = ('submitbugs' => 'on'); - @toggles = ('submitbugs',); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $$rowtotal += $itemcount; - return $datatable; + + my ($position,$dom,$confname,$settings,$rowtotal) = @_; + my ($css_class,$datatable); + + my $switchserver = &check_switchserver($dom,$confname); + + my $itemcount = 1; + + if ($position eq 'top') { + + my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles); + + %choices = + &Apache::lonlocal::texthash ( + submitbugs => 'Display "Submit a bug" link?', + ); + + %defaultchecked = ('submitbugs' => 'on'); + + @toggles = ('submitbugs',); + + foreach my $item (@toggles) { + if ($defaultchecked{$item} eq 'on') { + $checkedon{$item} = ' checked="checked" '; + $checkedoff{$item} = ' '; + } elsif ($defaultchecked{$item} eq 'off') { + $checkedoff{$item} = ' checked="checked" '; + $checkedon{$item} = ' '; + } + } + + if (ref($settings) eq 'HASH') { + foreach my $item (@toggles) { + if ($settings->{$item} eq '1') { + $checkedon{$item} = ' checked="checked" '; + $checkedoff{$item} = ' '; + } elsif ($settings->{$item} eq '0') { + $checkedoff{$item} = ' checked="checked" '; + $checkedon{$item} = ' '; + } + } + } + + foreach my $item (@toggles) { + $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; + $datatable .= + ' + '.$choices{$item}.' +   + +   + '. + ''. + ''; + $itemcount ++; + } + + } else { + + $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; + + $datatable .= ''; + + if (ref($settings) eq 'HASH') { + if ($settings->{'loginhelpurl'} ne '') { + my($directory, $filename) = $settings->{'loginhelpurl'} =~ m/(.*\/)(.*)$/; + $datatable .= ''; + $datatable .= '' + } else { + $datatable .= ''; + $datatable .= ' '; + } + } else { + $datatable .= ' '; + $datatable .= ' '; + } + + $datatable .= ''; + if ($switchserver) { + $datatable .= &mt('Upload to library server: [_1]',$switchserver); + } else { + $datatable .= &mt('Upload Custom Login Page Help File:'); + $datatable .=''; + } + $datatable .= ''; + + } + + return $datatable; + } + sub radiobutton_prefs { my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_; return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') && @@ -4552,6 +4695,78 @@ sub modify_autoupdate { return $resulttext; } +sub modify_autocreate { + my ($dom,%domconfig) = @_; + my ($resulttext,%changes,%currautocreate,%newvals,%autocreatehash); + if (ref($domconfig{'autocreate'}) eq 'HASH') { + foreach my $key (keys(%{$domconfig{'autocreate'}})) { + $currautocreate{$key} = $domconfig{'autocreate'}{$key}; + } + } + my %title= ( xml => 'Auto-creation of courses in XML course description files', + req => 'Auto-creation of validated requests for official courses', + xmldc => 'Identity of course creator of courses from XML files', + ); + my @types = ('xml','req'); + foreach my $item (@types) { + $newvals{$item} = $env{'form.autocreate_'.$item}; + $newvals{$item} =~ s/\D//g; + $newvals{$item} = 0 if ($newvals{$item} eq ''); + } + $newvals{'xmldc'} = $env{'form.autocreate_xmldc'}; + my %domcoords = &get_active_dcs($dom); + unless (exists($domcoords{$newvals{'xmldc'}})) { + $newvals{'xmldc'} = ''; + } + %autocreatehash = ( + autocreate => { xml => $newvals{'xml'}, + req => $newvals{'req'}, + } + ); + if ($newvals{'xmldc'} ne '') { + $autocreatehash{'autocreate'}{'xmldc'} = $newvals{'xmldc'}; + } + my $putresult = &Apache::lonnet::put_dom('configuration',\%autocreatehash, + $dom); + if ($putresult eq 'ok') { + my @items = @types; + if ($newvals{'xml'}) { + push(@items,'xmldc'); + } + foreach my $item (@items) { + if (exists($currautocreate{$item})) { + if ($currautocreate{$item} ne $newvals{$item}) { + $changes{$item} = 1; + } + } elsif ($newvals{$item}) { + $changes{$item} = 1; + } + } + if (keys(%changes) > 0) { + my @offon = ('off','on'); + $resulttext = &mt('Changes made:').''; + } else { + $resulttext = &mt('No changes made to auto-creation settings'); + } + } else { + $resulttext = ''. + &mt('An error occurred: [_1]',$putresult).''; + } + return $resulttext; +} + sub modify_directorysrch { my ($dom,%domconfig) = @_; my ($resulttext,%changes); @@ -5306,7 +5521,7 @@ sub modify_usermodification { } my @modifiable; if ($context eq 'selfcreate') { - $resulttext .= '
  • '.&mt('Self-creation of account by users with status: [_1] ',$rolename).' - '.&mt('modifiable fields (if institutional data blank): '); + $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: '); } @@ -5543,15 +5758,13 @@ sub modify_coursecategories { } else { $changes{'togglecats'} = 1; $changes{'categorize'} = 1; - $domconfig{'coursecategories'} = { - togglecats => $env{'form.togglecats'}, - categorize => $env{'form.categorize'}, - }; $changes{'togglecatscomm'} = 1; $changes{'categorizecomm'} = 1; $domconfig{'coursecategories'} = { - togglecats => $env{'form.togglecatscomm'}, - categorize => $env{'form.categorizecomm'}, + togglecats => $env{'form.togglecats'}, + categorize => $env{'form.categorize'}, + togglecatscomm => $env{'form.togglecatscomm'}, + categorizecomm => $env{'form.categorizecomm'}, }; } if (ref($cathash) eq 'HASH') { @@ -5869,12 +6082,20 @@ sub modify_serverstatuses { } sub modify_helpsettings { - my ($dom,%domconfig) = @_; + my ($r,$dom,$confname,%domconfig) = @_; my ($resulttext,$errors,%changes,%helphash); + my $customhelpfile = $env{'form.loginhelpurl.filename'}; + my $defaulthelpfile = 'defaulthelp.html'; + my $servadm = $r->dir_config('lonAdmEMail'); + my ($configuserok,$author_ok,$switchserver) = + &config_check($dom,$confname,$servadm); + my %defaultchecked = ('submitbugs' => 'on'); my @offon = ('off','on'); - my %title = ( submitbugs => 'Display link for users to submit a bug'); + my %title = ( submitbugs => 'Display link for users to submit a bug', + loginhelpurl => 'Unauthenticated login help page set to custom file'); + my @toggles = ('submitbugs'); $helphash{'helpsettings'} = {}; @@ -5905,11 +6126,53 @@ sub modify_helpsettings { } } $helphash{'helpsettings'}{$item} = $env{'form.'.$item}; - } + } + + if ($customhelpfile ne '') { + my $error; + if ($configuserok eq 'ok') { + if ($switchserver) { + $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver); + } else { + if ($author_ok eq 'ok') { + my ($result,$loginhelpurl) = + &publishlogo($r,'upload','loginhelpurl',$dom, + $confname,'help','','',$customhelpfile); + if ($result eq 'ok') { + $helphash{'helpsettings'}{'loginhelpurl'} = $loginhelpurl; + $changes{'loginhelpurl'} = 1; + } else { + $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customhelpfile,$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].",$customhelpfile,$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].",$customhelpfile,$confname,$dom,$configuserok); + } + if ($error) { + &Apache::lonnet::logthis($error); + $errors .= '
  • '.$error.'
  • '; + } + } + + if ($domconfig{'helpsettings'}{'loginhelpurl'} ne '') { + if ($env{'form.loginhelpurl_del'}) { + $helphash{'helpsettings'}{'loginhelpurl'} = ''; + $changes{'loginhelpurl'} = 1; + } + } } - my $putresult = &Apache::lonnet::put_dom('configuration',\%helphash, - $dom); + + my $putresult; + + if (keys(%changes) > 0) { + $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom); + } else { + $putresult = 'ok'; + } if ($putresult eq 'ok') { if (keys(%changes) > 0) { @@ -5918,6 +6181,13 @@ sub modify_helpsettings { if ($item eq 'submitbugs') { $resulttext .= '
  • '.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'
  • '; } + if ($item eq 'loginhelpurl') { + if ($helphash{'helpsettings'}{'loginhelpurl'} eq '') { + $resulttext .= '
  • '.&mt('[_1] help file removed; [_2] file will be used for the unathorized help page in this domain.',$customhelpfile,$defaulthelpfile).'
  • '; + } else { + $resulttext .= '
  • '.&mt("$title{$item} [_1]",$customhelpfile).'
  • '; + } + } } $resulttext .= ''; } else { @@ -6073,4 +6343,74 @@ sub dom_servers { return %uniqservers; } +sub get_active_dcs { + my ($dom) = @_; + my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc']); + my %domcoords; + my $numdcs = 0; + my $now = time; + foreach my $server (keys(%dompersonnel)) { + foreach my $user (sort(keys(%{$dompersonnel{$server}}))) { + my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user); + my ($end,$start) = split(':',$dompersonnel{$server}{$user}); + if (($end eq '') || ($end == 0) || ($end > $now)) { + if ($start <= $now) { + $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user}; + } + } + } + } + return %domcoords; +} + +sub active_dc_picker { + my ($dom,$curr_dc) = @_; + my %domcoords = &get_active_dcs($dom); + my @dcs = sort(keys(%domcoords)); + my $numdcs = scalar(@dcs); + my $datatable; + my $numinrow = 2; + if ($numdcs > 1) { + $datatable = ''; + for (my $i=0; $i<@dcs; $i++) { + my $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $datatable .= ''; + } + $datatable .= ''; + } + my $check = ' '; + if ($curr_dc eq '') { + if (!$i) { + $check = ' checked="checked" '; + } + } elsif ($dcs[$i] eq $curr_dc) { + $check = ' checked="checked" '; + } + if ($i == @dcs - 1) { + my $colsleft = $numinrow - $rem; + if ($colsleft > 1) { + $datatable .= ''; + } + $datatable .= '
    '; + } else { + $datatable .= ''; + } + } else { + $datatable .= ''; + } + my ($dcname,$dcdom) = split(':',$dcs[$i]); + $datatable .= '
    '; + } elsif (@dcs) { + $datatable .= ''; + } + return ($numdcs,$datatable); +} + 1;