# The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # # $Id: domainprefs.pm,v 1.4 2007/03/01 18:24:09 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA# # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # ############################################################### ############################################################## package Apache::domainprefs; use strict; use Apache::Constants qw(:common :http); use Apache::lonnet; use Apache::loncommon(); use Apache::lonhtmlcommon(); use Apache::lonlocal; use LONCAPA(); sub handler { my $r=shift; if ($r->header_only) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } my $dom = $env{'request.role.domain'}; my $domdesc = $Apache::lonnet::domaindescription{$dom}; if (&Apache::lonnet::allowed('mau',$dom)) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; } else { $env{'user.error.msg'}= "/adm/domainprefs:mau:0:0:Cannot modify domain settings"; return HTTP_NOT_ACCEPTABLE; } &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['phase']); my $phase = "display"; if ( exists($env{'form.phase'}) ) { $phase = $env{'form.phase'}; } my %domconfig = &Apache::lonnet::get_dom('configuration',['login','quotas', 'autoenroll','autoupdate'],$dom); my @prefs = ( { text => 'Log-in page options', help => 'Domain_Log-in_Page', action => 'login', header => [{col1 => 'Item', col2 => 'Selection',}], }, { text => 'Default quotas for user portfolios', help => 'Default_User_Quota', action => 'quotas', header => [{col1 => 'User type', col2 => 'Default quota'}], }, { text => 'Auto-enrollment settings', help => 'Domain_Auto_Enrollment', action => 'autoenroll', header => [{col1 => 'Configuration setting', col2 => 'Value(s)'}], }, { text => 'Auto-update settings', help => 'Domain_Auto_Update', action => 'autoupdate', header => [{col1 => 'Setting', col2 => 'Value',}, {col1 => 'User Population', col2 => 'Updataeable user data'}], }, ); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'display')", text=>"Domain Configuration"}); if ($phase eq 'process') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Updated"}); &print_header($r,$phase); foreach my $item (@prefs) { $r->print('

'.&mt($item->{'text'}).'

'. &process_changes($dom,$item->{'action'},%domconfig)); } $r->print('

'); &print_footer($r,$phase,'display','Back to actions menu'); $r->print('

'); } else { if ($phase eq '') { $phase = 'display'; } my %helphash; my $numprefs = @prefs; &print_header($r,$phase); $r->print('
'); foreach my $item (@prefs) { if ($item->{'action'} eq 'autoupdate') { $r->print(' '); } &print_config_box($r,$dom,$item->{'action'},$item, $domconfig{$item->{'action'}}); } $r->print('
'); &print_footer($r,$phase,'process','Store changes'); } return OK; } sub process_changes { my ($dom,$action,%domconfig) = @_; my $output; if ($action eq 'login') { $output = &modify_login($dom,%domconfig); } elsif ($action eq 'quotas') { $output = &modify_quotas($dom,%domconfig); } elsif ($action eq 'autoenroll') { $output = &modify_autoenroll($dom,%domconfig); } elsif ($action eq 'autoupdate') { $output = &modify_autoupdate($dom,%domconfig); } return $output; } sub print_config_box { my ($r,$dom,$action,$item,$settings) = @_; $r->print(' '); if ($action eq 'autoupdate') { $r->print(' '. ''. ''. ''. ''; return $datatable; } sub print_quotas { my ($dom,$settings) = @_; my $datatable; my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); my $othertitle = "All users"; my @types; if (ref($order) eq 'ARRAY') { @types = @{$order}; } if (@types == 0) { if (ref($usertypes) eq 'HASH') { @types = sort(keys(%{$usertypes})); } } my $typecount = 0; my $css_class; if (@types > 0) { foreach my $type (@types) { if (defined($usertypes->{$type})) { $typecount ++; $css_class = $typecount%2?' class="LC_odd_row"':''; $datatable .= ''. ''. ''; } } $othertitle = "Other users"; } my $defaultquota = '20'; if (ref($settings) eq 'HASH') { if (defined($settings->{'default'})) { $defaultquota = $settings->{'default'}; } } $typecount ++; $css_class = $typecount%2?' class="LC_odd_row"':''; $datatable .= ''. ''. ''; return $datatable; } sub print_autoenroll { my ($dom,$settings) = @_; my $defdom = $dom; my $autorun = &Apache::lonnet::auto_run(undef,$dom), my ($runon,$runoff); if (ref($settings) eq 'HASH') { if (exists($settings->{'run'})) { if ($settings->{'run'} eq '0') { $runoff = ' checked="checked" '; $runon = ' '; } else { $runon = ' checked="checked" '; $runoff = ' '; } } else { if ($autorun) { $runon = ' checked="checked" '; $runoff = ' '; } else { $runoff = ' checked="checked" '; $runon = ' '; } } if (exists($settings->{'sender_domain'})) { $defdom = $settings->{'sender_domain'}; } } my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1); my $datatable=''. ''. ''. ''. ''; return $datatable; } sub print_autoupdate { my ($position,$dom,$settings) = @_; my $datatable; if ($position eq 'top') { my $updateon = ' '; my $updateoff = ' checked="checked" '; my $classlistson = ' '; my $classlistsoff = ' checked="checked" '; if (ref($settings) eq 'HASH') { if ($settings->{'run'} eq '1') { $updateon = $updateoff; $updateoff = ' '; } if ($settings->{'classlists'} eq '1') { $classlistson = $classlistsoff; $classlistsoff = ' '; } } my %title = ( run => 'Auto-update active?', classlists => 'Update information in classlists?', ); $datatable = ''. ''. ''. ''. ''. ''. ''; } else { my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); my @types; if (ref($order) eq 'ARRAY') { @types = @{$order}; } if (@types == 0) { if (ref($usertypes) eq 'HASH') { @types = sort(keys(%{$usertypes})); } } my $othertitle = &mt('All users'); if (keys(%{$usertypes}) > 0) { $othertitle = &mt('Other users'); } my @fields = ('lastname','firstname','middlename','gen','email','id'); my %fieldtitles = &Apache::lonlocal::texthash ( id => 'Student/Employee ID', email => 'E-mail address', lastname => 'Last Name', firstname => 'First Name', middlename => 'Middle Name', gen => 'Generation', ); my $numrows = 0; if (@types > 0) { $datatable = &usertype_update_row($settings,$usertypes,\%fieldtitles, \@fields,\@types,\$numrows); } $datatable .= &usertype_update_row($settings,{'default' => $othertitle}, \%fieldtitles,\@fields,['default'], \$numrows); } return $datatable; } sub usertype_update_row { my ($settings,$usertypes,$fieldtitles,$fields,$types,$rownums) = @_; my $datatable; my $numinrow = 4; foreach my $type (@{$types}) { if (defined($usertypes->{$type})) { $$rownums ++; my $css_class = $$rownums%2?' class="LC_odd_row"':''; $datatable .= ''; } } return $datatable; } sub modify_login { my ($dom,%domconfig) = @_; my ($resulttext,%changes); my %title = ( coursecatalog => 'Display course catalog', adminmail => 'Display administrator E-mail address'); my @offon = ('off','on'); my %loginhash = ( login => { coursecatalog => $env{'form.coursecatalog'}, adminmail => $env{'form.adminmail'}, } ); my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash, $dom); if ($putresult eq 'ok') { if (($domconfig{'login'}{'coursecatalog'} eq '0') && ($env{'form.coursecatalog'} eq '1')) { $changes{'coursecatalog'} = 1; } elsif (($domconfig{'login'}{'coursecatalog'} eq '' || $domconfig{'login'}{'coursecatalog'} eq '1') && ($env{'form.coursecatalog'} eq '0')) { $changes{'coursecatalog'} = 1; } if (($domconfig{'login'}{'adminmail'} eq '1') && ($env{'form.adminmail'} eq '0')) { $changes{'adminmail'} = 1; } elsif (($domconfig{'login'}{'adminmail'} eq '' || $domconfig{'login'}{'adminmail'} eq '0') && ($env{'form.adminmail'} eq '1')) { $changes{'adminmail'} = 1; } if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').''; } else { $resulttext = &mt('No changes made to log-in page settings'); } } else { $resulttext = &mt('An error occurred: [_1]',$putresult); } return $resulttext; } sub modify_quotas { my ($dom,%domconfig) = @_; my ($resulttext,%changes); my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); my %formhash; foreach my $key (keys(%env)) { if ($key =~ /^form\.quota_(.+)$/) { $formhash{$1} = $env{$key}; } } if (ref($domconfig{'quotas'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'quotas'}})) { if (exists($formhash{$key})) { if ($formhash{$key} ne $domconfig{'quotas'}{$key}) { $changes{$key} = 1; } } else { $formhash{$key} = $domconfig{'quotas'}{$key}; } } } foreach my $key (keys(%formhash)) { if ($formhash{$key} ne '') { if (!exists($domconfig{'quotas'}{$key})) { $changes{$key} = 1; } } } my %quotahash = ( quotas => {%formhash}, ); my $putresult = &Apache::lonnet::put_dom('configuration',\%quotahash, $dom); if ($putresult eq 'ok') { if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').''; } else { $resulttext = &mt('No changes made to default quotas'); } } else { $resulttext = &mt('An error occurred: [_1]',$putresult); } return $resulttext; } sub modify_autoenroll { my ($dom,%domconfig) = @_; my ($resulttext,%changes); my %currautoenroll; if (ref($domconfig{'autoenroll'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'autoenroll'}})) { $currautoenroll{$key} = $domconfig{'autoenroll'}{$key}; } } my $autorun = &Apache::lonnet::auto_run(undef,$dom), my %title = ( run => 'Auto-enrollment active', sender => 'Sender for notification messages'); my @offon = ('off','on'); my %autoenrollhash = ( autoenroll => { run => $env{'form.autoenroll_run'}, sender_uname => $env{'form.sender_uname'}, sender_domain => $env{'form.sender_domain'}, } ); my $putresult = &Apache::lonnet::put_dom('configuration',\%autoenrollhash, $dom); if ($putresult eq 'ok') { if (exists($currautoenroll{'run'})) { if ($currautoenroll{'run'} ne $env{'form.autoenroll_run'}) { $changes{'run'} = 1; } } elsif ($autorun) { if ($env{'form.autoenroll_run'} ne '1') { $changes{'run'} = 1; } } if (exists($currautoenroll{sender_uname})) { if ($currautoenroll{'sender_uname'} ne $env{'form.sender_uname'}) { $changes{'sender'} = 1; } } else { $changes{'sender'} = 1; } if (exists($currautoenroll{sender_domain})) { if ($currautoenroll{'sender_domain'} ne $env{'form.sender_domain'}) { $changes{'sender'} = 1; } } else { $changes{'sender'} = 1; } if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').''; } else { $resulttext = &mt('No changes made to auto-enrollment settings'); } } else { $resulttext = &mt('An error occurred: [_1]',$putresult); } return $resulttext; } sub modify_autoupdate { my ($dom,%domconfig) = @_; my ($resulttext,%currautoupdate,%fields,%changes); if (ref($domconfig{'autoupdate'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'autoupdate'}})) { $currautoupdate{$key} = $domconfig{'autoupdate'}{$key}; } } my @offon = ('off','on'); my %title = &Apache::lonlocal::texthash ( run => 'Auto-update:', classlists => 'Updates to user information in classlists?' ); my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($dom); my %fieldtitles = &Apache::lonlocal::texthash ( id => 'Student/Employee ID', email => 'E-mail address', lastname => 'Last Name', firstname => 'First Name', middlename => 'Middle Name', gen => 'Generation', ); my $othertitle = &mt('All users'); if (keys(%{$usertypes}) > 0) { $othertitle = "Other users"; } foreach my $key (keys(%env)) { if ($key =~ /^form\.updateable_(.+)_([^_]+)$/) { push(@{$fields{$1}},$2); } } my %updatehash = ( autoupdate => { run => $env{'form.autoupdate_run'}, classlists => $env{'form.classlists'}, fields => {%fields}, } ); foreach my $key (keys(%currautoupdate)) { if (($key eq 'run') || ($key eq 'classlists')) { if (exists($updatehash{autoupdate}{$key})) { if ($currautoupdate{$key} ne $updatehash{autoupdate}{$key}) { $changes{$key} = 1; } } } elsif ($key eq 'fields') { if (ref($currautoupdate{$key}) eq 'HASH') { foreach my $item (keys(%{$currautoupdate{$key}})) { if (ref($currautoupdate{$key}{$item}) eq 'ARRAY') { my $change = 0; foreach my $type (@{$currautoupdate{$key}{$item}}) { if (!exists($fields{$item})) { $change = 1; } elsif (ref($fields{$item}) eq 'ARRAY') { if (!grep/^\Q$type\E$/,@{$fields{$item}}) { $change = 1; } } } if ($change) { push(@{$changes{$key}},$item); } } } } } } foreach my $key (keys(%fields)) { if (ref($currautoupdate{'fields'}) eq 'HASH') { if (!exists($currautoupdate{'fields'}{$key})) { push(@{$changes{'fields'}},$key); } } else { push(@{$changes{'fields'}},$key); } } my $putresult = &Apache::lonnet::put_dom('configuration',\%updatehash, $dom); if ($putresult eq 'ok') { if (keys(%changes) > 0) { $resulttext = &mt('Changes made:').''; } else { $resulttext = &mt('No changes made to autoupdates'); } } else { $resulttext = &mt('An error occurred: [_1]',$putresult); } return $resulttext; } 1;
'.&mt($item->{text}).' '. &Apache::loncommon::help_open_topic($item->{'help'}).'
'. &print_autoupdate('top',$dom,$settings).'
'.$item->{'header'}->[0]->{'col1'}.' '.$item->{'header'}->[0]->{'col2'}.'
'. &print_autoupdate('bottom',$dom,$settings)); } else { $r->print('
'.$item->{'header'}->[1]->{'col1'}.' '.$item->{'header'}->[1]->{'col2'}.'
'); if ($action eq 'login') { $r->print(&print_login($settings)); } elsif ($action eq 'quotas') { $r->print(&print_quotas($dom,$settings)); } elsif ($action eq 'autoenroll') { $r->print(&print_autoenroll($dom,$settings)); } } $r->print('
'.$item->{'header'}->[0]->{'col1'}.' '.$item->{'header'}->[0]->{'col2'}.'

'); return; } sub print_header { my ($r,$phase) = @_; my $js = qq| |; $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings', $js)); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Domain Settings')); $r->print('
'); return; } sub print_footer { my ($r,$phase,$newphase,$button_text) = @_; $button_text = &mt($button_text); $r->print(''); my $dest='"javascript:changePage(document.'.$phase.','."'$newphase'".')"'; if ($phase eq 'process') { $r->print(''.$button_text.''); } else { $r->print(''); } $r->print('
'); $r->print('
'.&Apache::loncommon::end_page()); return; } sub print_login { my ($settings) = @_; my $catalogon = ' checked="checked" '; my $catalogoff; my $adminmailon = ' '; my $adminmailoff = ' checked="checked" '; if (ref($settings) eq 'HASH') { if ($settings->{'coursecatalog'} eq '0') { $catalogoff = $catalogon; $catalogon = ' '; } if ($settings->{'adminmail'} eq '1') { $adminmailon = $adminmailoff; $adminmailoff = ' '; } } my %choices = &Apache::lonlocal::texthash( coursecatalog => 'Display Course Catalog link?', adminmail => "Display Administrator's E-mail Address?" ); my $datatable = '
'.$choices{'coursecatalog'}. ''. ''.&mt('Yes').' '. ''.&mt('No').'
'.$choices{'adminmail'}.''. ''.&mt('Yes').' '. ''.&mt('No').'
'.$usertypes->{$type}.''. ' Mb
'.&mt($othertitle).''. ' Mb
'.&mt('Auto-enrollment active?').''. ''.&mt('Yes').' '. ''.&mt('No').'
'.&mt('Notification messages - sender'). ''. &mt('username').': '. '  '.&mt('domain'). ': '.$domform.'
'.&mt($title{'run'}).''. ''.&mt('Yes').' '. ''.&mt('No').'
'.&mt($title{'classlists'}).''. ''.&mt('Yes').' '. ''.&mt('No').'
'.$usertypes->{$type}. ''; for (my $i=0; $i<@{$fields}; $i++) { my $rem = $i%($numinrow); if ($rem == 0) { if ($i > 0) { $datatable .= ''; } $datatable .= ''; } my $check = ' '; if (ref($settings->{'fields'}) eq 'HASH') { if (ref($settings->{'fields'}{$type}) eq 'ARRAY') { if (grep(/^\Q$fields->[$i]\E$/,@{$settings->{'fields'}{$type}})) { $check = ' checked="checked" '; } } } if ($i == @{$fields}-1) { my $colsleft = $numinrow - $rem; if ($colsleft > 1) { $datatable .= ''; } $datatable .= '
'; } else { $datatable .= ''; } } else { $datatable .= ''; } $datatable .= ''. $fieldtitles->{$fields->[$i]}.'