# The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # # $Id: domainprefs.pm,v 1.2 2007/03/01 17:54:13 albertel 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 = $env{'form.phase'}; if ($phase eq '' || $phase eq 'start') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'start')", text=>"Choose an action"}); &print_main_menu($r,$dom,$domdesc); } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'start')", text=>"Choose an action"}); if ($phase eq 'login') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Configure Log-in page"}); &print_login($r,$phase,$dom) } elsif ($phase eq 'configlogin') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'login')", text=>"Configure Log-in page"}); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_login($r,$phase,$dom,$domdesc); } elsif ($phase eq 'quotas') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Default user quotas"}); &print_quotas($r,$phase,$dom); } elsif ($phase eq 'configquotas') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'quotas')", text=>"Default user quotas"}); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_quotas($r,$phase,$dom,$domdesc); } elsif ($phase eq 'autoenroll') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Configure Auto-enrollment"}); &print_autoenroll($r,$phase,$dom); } elsif ($phase eq 'configenroll') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'autoenroll')", text=>"Configure Auto-enrollment"}); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_autoenroll($r,$phase,$dom,$domdesc); } elsif ($phase eq 'autoupdate') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Configure Auto-update"}); &print_autoupdate($r,$phase,$dom); } elsif ($phase eq 'configupdate') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'quotas')", text=>"Change settings"}); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'$phase')", text=>"Result"}); &modify_autoupdate($r,$phase,$dom,$domdesc); } } &print_footer($r); } sub print_main_menu { my ($r,$dom,$domdesc) = @_; my @menu = ( { text => 'Log-in page options', help => 'Domain_Log-in_Page', phase => 'login', }, { text => 'Default quotas for user portfolios', help => 'Default_User_Quota', phase => 'quotas', }, { text => 'Auto-enrollment settings', help => 'Domain_Auto_Enrollment', phase => 'autoenroll', }, { text => 'Auto-update settings', help => 'Domain_Auto_Update', phase => 'autoupdate', }, ); my $menu_html = ''; foreach my $menu_item (@menu) { $menu_html.='

'; $menu_html.=''; if (exists($menu_item->{'url'})) { $menu_html.=qq{}; } else { $menu_html.= qq{}; } $menu_html.= &mt($menu_item->{'text'}).''; if (exists($menu_item->{'help'})) { $menu_html.= &Apache::loncommon::help_open_topic($menu_item->{'help'}); } $menu_html.='

'.$/; } &print_header($r); $r->print($menu_html); return; } sub print_header { my ($r,$javascript_validations) = @_; my $phase = "start"; if ( exists($env{'form.phase'}) ) { $phase = $env{'form.phase'}; } my $js = qq| |; $r->print(&Apache::loncommon::start_page('View/Modify Domain Settings', $js)); my $bread_text = "Domain Settings"; $r->print(&Apache::lonhtmlcommon::breadcrumbs($bread_text)); return; } sub print_footer { my ($r) = @_; $r->print('
'.&Apache::loncommon::end_page()); return; } sub print_login { my ($r,$phase,$dom) = @_; my %domconfig = &Apache::lonnet::get_dom('configuration', ['login'],$dom); my $catalogon = ' checked="checked" '; my $catalogoff; my $adminmailon = ' '; my $adminmailoff = ' checked="checked" '; if (ref($domconfig{'login'}) eq 'HASH') { if ($domconfig{'login'}{'coursecatalog'} eq '0') { $catalogoff = $catalogon; $catalogon = ' '; } if ($domconfig{'login'}{'adminmail'} eq '1') { $adminmailon = $adminmailoff; $adminmailoff = ' '; } } &print_header($r); my $datatable=&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('Item').''.&mt('Selection').''. &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row(). ''.&mt('Display Course Catalog link?').''. ''.&mt('Yes').' '. ''.&mt('No').''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row(). ''.&mt("Display Administrator's E-mail Address?").''. ''.&mt('Yes').' '. ''.&mt('No').''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table(); &print_form($r,$datatable,$phase,'configlogin','Change'); } sub modify_login { my ($r,$phase,$dom,$domdesc) = @_; my ($resulttext,%changes); my %domconfig = &Apache::lonnet::get_dom('configuration', ['login'],$dom); 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); } &print_header($r); &print_form($r,$resulttext,$phase,'start','Back to actions menu'); } sub print_quotas { my ($r,$phase,$dom) = @_; my %currquota; my %domconfig = &Apache::lonnet::get_dom('configuration', ['quotas'],$dom); if (ref($domconfig{'quotas'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'quotas'}})) { $currquota{$key} = $domconfig{'quotas'}{$key}; } } my $datatable=&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('User type').''.&mt('Default quota').''. &Apache::loncommon::end_data_table_header_row(); 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})); } } if (@types > 0) { foreach my $type (@types) { if (defined($usertypes->{$type})) { $datatable .= &Apache::loncommon::start_data_table_row(). ''.$usertypes->{$type}.''. ' Mb'; } } $othertitle = "Other users"; } my $defaultquota = '20'; if (defined($currquota{'default'})) { $defaultquota = $currquota{'default'}; } $datatable .= &Apache::loncommon::start_data_table_row(). ''.&mt($othertitle).''. ' Mb'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(); &print_header($r); &print_form($r,$datatable,$phase,'configquotas','Change'); } sub modify_quotas { my ($r,$phase,$dom,$domdesc) = @_; my ($resulttext,%changes); my %domconfig = &Apache::lonnet::get_dom('configuration', ['quotas'],$dom); 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{$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); } &print_header($r); &print_form($r,$resulttext,$phase,'start','Back to actions menu'); } sub print_autoenroll { my ($r,$phase,$dom) = @_; my %currautoenroll; my %domconfig = &Apache::lonnet::get_dom('configuration', ['autoenroll'],$dom); 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 ($runon,$runoff); if (exists($currautoenroll{'run'})) { if ($currautoenroll{'run'} eq '0') { $runoff = ' checked="checked" '; $runon = ' '; } else { $runon = ' checked="checked" '; $runoff = ' '; } } else { if ($autorun) { $runon = ' checked="checked" '; $runoff = ' '; } else { $runoff = ' checked="checked" '; $runon = ' '; } } my $defdom = $dom; if (exists($currautoenroll{'sender_domain'})) { $defdom = $currautoenroll{'sender_domain'}; } my $domform = &Apache::loncommon::select_dom_form($defdom,'sender_domain',1); my $datatable=&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('Configuration setting').''.&mt('Value(s)').''. &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row(). ''.&mt('Auto-enrollment active?').''. ''.&mt('Yes').' '. ''.&mt('No').''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row(). ''.&mt('Notification messages - sender').''. &mt('username').':   '.&mt('domain').': '.$domform.''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(); &print_header($r); &print_form($r,$datatable,$phase,'configenroll','Change'); } sub modify_autoenroll { my ($r,$phase,$dom,$domdesc) = @_; my ($resulttext,%changes); my %currautoenroll; my %domconfig = &Apache::lonnet::get_dom('configuration', ['autoenroll'],$dom); 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); } &print_header($r); &print_form($r,$resulttext,$phase,'start','Back to actions menu'); } sub print_autoupdate { my ($r,$phase,$dom) = @_; my (%currautoupdate,$datatable); my %domconfig = &Apache::lonnet::get_dom('configuration', ['autoupdate'],$dom); if (ref($domconfig{'autoupdate'}) eq 'HASH') { foreach my $key (keys(%{$domconfig{'autoupdate'}})) { $currautoupdate{$key} = $domconfig{'autoupdate'}{$key}; } } my $updateon = ' '; my $updateoff = ' checked="checked" '; if ($currautoupdate{'run'} eq '1') { $updateon = $updateoff; $updateoff = ' '; } my $classlistson = ' '; my $classlistsoff = ' checked="checked" '; if ($currautoupdate{'classlists'} eq '1') { $classlistson = $classlistsoff; $classlistsoff = ' '; } my %title = ( run => 'Auto-update enabled?', classlists => 'Update information in classlists?', ); $datatable = &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('Setting').''.&mt('Value').''. &Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row(). ''.&mt($title{'run'}).''. ''.&mt('Yes').' '. ''.&mt('No').''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row(). ''.&mt($title{'classlists'}).''. ''.&mt('Yes').' '. ''.&mt('No').''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'

'; 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 $numinrow = 4; my %fieldtitles = &Apache::lonlocal::texthash ( id => 'Student/Employee ID', email => 'E-mail address', lastname => 'Last Name', firstname => 'First Name', middlename => 'Middle Name', gen => 'Generation', ); $datatable .= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). ''.&mt('User Population').''.&mt('Updateable user data').''. &Apache::loncommon::end_data_table_header_row(); if (@types > 0) { foreach my $type (@types) { if (defined($usertypes->{$type})) { $datatable .= &Apache::loncommon::start_data_table_row(). ''.$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($currautoupdate{'fields'}) eq 'HASH') { if (ref($currautoupdate{'fields'}{$type}) eq 'ARRAY') { if (grep(/^\Q$fields[$i]\E$/,@{$currautoupdate{'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]}.'
'.&Apache::loncommon::end_data_table_row(); } } } $datatable .= &Apache::loncommon::start_data_table_row(). ''.&mt($othertitle).''; for (my $i=0; $i<@fields; $i++) { my $rem = $i%($numinrow); if ($rem == 0) { if ($i > 0) { $datatable .= ''; } $datatable .= ''; } my $check = ' '; if (ref($currautoupdate{'fields'}) eq 'HASH') { if (ref($currautoupdate{'fields'}{'default'}) eq 'ARRAY') { if (grep(/^\Q$fields[$i]\E$/,@{$currautoupdate{'fields'}{'default'}})) { $check = ' checked="checked" '; } } } if ($i == @fields-1) { my $colsleft = $numinrow - $rem; if ($colsleft > 1) { $datatable .= ''; } $datatable .= '
'; } else { $datatable .= ''; } } else { $datatable .= ''; } $datatable .= ''. $fieldtitles{$fields[$i]}.'
'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(); &print_header($r); &print_form($r,$datatable,$phase,'configupdate','Change'); } sub modify_autoupdate { my ($r,$phase,$dom,$domdesc) = @_; my ($resulttext,%currautoupdate,%fields,%changes); my %domconfig = &Apache::lonnet::get_dom('configuration', ['autoupdate'],$dom); 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 default quotas'); } } else { $resulttext = &mt('An error occurred: [_1]',$putresult); } &print_header($r); &print_form($r,$resulttext,$phase,'start','Back to actions menu'); } sub print_form { my ($r,$datatable,$phase,$newphase,$button_text) = @_; my $button_text = &mt($button_text); $r->print(<
$datatable
ENDDOCUMENT return; } 1;