--- loncom/interface/domainprefs.pm 2022/02/27 02:42:30 1.160.6.122 +++ loncom/interface/domainprefs.pm 2012/05/30 16:29:20 1.161 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set domain-wide configuration settings # -# $Id: domainprefs.pm,v 1.160.6.122 2022/02/27 02:42:30 raeburn Exp $ +# $Id: domainprefs.pm,v 1.161 2012/05/30 16:29:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -19,8 +19,7 @@ # # 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 -# +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA# # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ @@ -46,7 +45,7 @@ described at http://www.lon-capa.org. =head1 OVERVIEW Each institution using LON-CAPA will typically have a single domain designated -for use by individuals affiliated with the institution. Accordingly, each domain +for use by individuals affliated with the institution. Accordingly, each domain may define a default set of logos and a color scheme which can be used to "brand" the LON-CAPA instance. In addition, an institution will typically have a language and timezone which are used for the majority of courses. @@ -87,16 +86,15 @@ $dom,$settings,$rowtotal,$action. $dom is the domain, $settings is a reference to a hash of current settings for the current context, $rowtotal is a reference to the scalar used to record the -number of rows displayed on the page, and $action is the context (quotas, -requestcourses or requestauthor). +number of rows displayed on the page, and $action is the context (either quotas +or requestcourses). The print_quotas routine was orginally created to display/store information about default quota sizes for portfolio spaces for the different types of institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), but is now also used to manage availability of user tools: i.e., blogs, aboutme page, and portfolios, and the course request tool, -used by course owners to request creation of a course, and to display/store -default quota sizes for Authoring Spaces. +used by course owners to request creation of a course. Outputs: 1 @@ -104,8 +102,8 @@ $datatable - HTML containing form eleme In the case of course requests, radio buttons are displayed for each institutional affiliate type (and also default, and _LC_adv) for each of the course types -(official, unofficial, community, and textbook). In each case the radio buttons -allow the selection of one of four values: +(official, unofficial and community). In each case the radio buttons allow the +selection of one of four values: 0, approval, validate, autolimit=N (where N is blank, or a positive integer). which have the following effects: @@ -165,8 +163,6 @@ 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(); @@ -174,7 +170,6 @@ use File::Copy; use Locale::Language; use DateTime::TimeZone; use DateTime::Locale; -use Net::CIDR; my $registered_cleanup; my $modified_urls; @@ -216,20 +211,13 @@ sub handler { 'directorysrch','usercreation','usermodification', 'contacts','defaults','scantron','coursecategories', 'serverstatuses','requestcourses','helpsettings', - 'coursedefaults','usersessions','loadbalancing', - 'requestauthor','selfenrollment','inststatus', - 'passwords','wafproxy','ipaccess'],$dom); - my @prefs_order = ('rolecolors','login','ipaccess','defaults','wafproxy','passwords', - 'quotas','autoenroll','autoupdate','autocreate','directorysrch', - 'contacts','usercreation','selfcreation','usermodification', - 'scantron','requestcourses','requestauthor','coursecategories', - 'serverstatuses','helpsettings','coursedefaults', - 'selfenrollment','usersessions'); - my %existing; - if (ref($domconfig{'loadbalancing'}) eq 'HASH') { - %existing = %{$domconfig{'loadbalancing'}}; - } - if ((keys(%servers) > 1) || (keys(%existing) > 0)) { + 'coursedefaults','usersessions','loadbalancing'],$dom); + my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll', + 'autoupdate','autocreate','directorysrch','contacts', + 'usercreation','usermodification','scantron', + 'requestcourses','coursecategories','serverstatuses','helpsettings', + 'coursedefaults','usersessions'); + if (keys(%servers) > 1) { push(@prefs_order,'loadbalancing'); } my %prefs = ( @@ -244,77 +232,32 @@ sub handler { col2 => '',}, {col1 => 'Administrator Settings', col2 => '',}], - print => \&print_rolecolors, - modify => \&modify_rolecolors, }, 'login' => { text => 'Log-in page options', help => 'Domain_Configuration_Login_Page', - header => [{col1 => 'Log-in Page Items', - col2 => '',}, - {col1 => 'Log-in Help', - col2 => 'Value'}, - {col1 => 'Custom HTML in document head', - col2 => 'Value'}, - {col1 => 'SSO', - col2 => 'Dual login: SSO and non-SSO options'}, - ], - print => \&print_login, - modify => \&modify_login, + header => [{col1 => 'Item', + col2 => '',}], }, + 'defaults' => - { text => 'Default authentication/language/timezone/portal/types', + { text => 'Default authentication/language/timezone/portal', help => 'Domain_Configuration_LangTZAuth', header => [{col1 => 'Setting', - col2 => 'Value'}, - {col1 => 'Institutional user types', - col2 => 'Name displayed'}, - {col1 => 'Mapping for missing usernames via standard log-in', - col2 => 'Rules in use'}], - print => \&print_defaults, - modify => \&modify_defaults, - }, - 'wafproxy' => - { text => 'Web Application Firewall/Reverse Proxy', - help => 'Domain_Configuration_WAF_Proxy', - header => [{col1 => 'Domain(s)', - col2 => 'Servers and WAF/Reverse Proxy alias(es)', - }, - {col1 => 'Domain(s)', - col2 => 'WAF Configuration',}], - print => \&print_wafproxy, - modify => \&modify_wafproxy, - }, - 'passwords' => - { text => 'Passwords (Internal authentication)', - help => 'Domain_Configuration_Passwords', - header => [{col1 => 'Resetting Forgotten Password', - col2 => 'Settings'}, - {col1 => 'Encryption of Stored Passwords (Internal Auth)', - col2 => 'Settings'}, - {col1 => 'Rules for LON-CAPA Passwords', - col2 => 'Settings'}, - {col1 => 'Course Owner Changing Student Passwords', - col2 => 'Settings'}], - print => \&print_passwords, - modify => \&modify_passwords, + col2 => 'Value'}], }, 'quotas' => - { text => 'Blogs, personal web pages, webDAV/quotas, portfolios', + { text => 'User blogs, personal information pages, portfolios', help => 'Domain_Configuration_Quotas', header => [{col1 => 'User affiliation', col2 => 'Available tools', - col3 => 'Quotas, MB; (Authoring requires role)',}], - print => \&print_quotas, - modify => \&modify_quotas, + col3 => 'Portfolio quota',}], }, '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', @@ -324,42 +267,27 @@ sub handler { {col1 => 'Setting', col2 => 'Affiliation'}, {col1 => 'User population', - col2 => 'Updatable user data'}], - print => \&print_autoupdate, - modify => \&modify_autoupdate, + col2 => 'Updateable user data'}], }, '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 => 'Directory searches', + { text => 'Institutional directory searches', help => 'Domain_Configuration_InstDirectory_Search', - header => [{col1 => 'Institutional Directory Setting', - col2 => 'Value',}, - {col1 => 'LON-CAPA Directory Setting', + header => [{col1 => 'Setting', col2 => 'Value',}], - print => \&print_directorysrch, - modify => \&modify_directorysrch, }, 'contacts' => - { text => 'E-mail addresses and helpform', + { text => 'Contact Information', help => 'Domain_Configuration_Contact_Info', - header => [{col1 => 'Default e-mail addresses', - col2 => 'Value',}, - {col1 => 'Recipient(s) for notifications', - col2 => 'Value',}, - {col1 => 'Nightly status check e-mail', - col2 => 'Settings',}, - {col1 => 'Ask helpdesk form settings', - col2 => 'Value',},], - print => \&print_contacts, - modify => \&modify_contacts, + header => [{col1 => 'Setting', + col2 => 'Value',}], }, + 'usercreation' => { text => 'User creation', help => 'Domain_Configuration_User_Creation', @@ -369,40 +297,23 @@ 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', - help => 'Domain_Configuration_Self_Creation', - header => [{col1 => 'Self-creation with institutional username', - col2 => 'Enabled?'}, - {col1 => 'Institutional user type (login/SSO self-creation)', - col2 => 'Information user can enter'}, - {col1 => 'Self-creation with e-mail verification', - 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 updatable in author context'}, + col2 => 'User information updateable in author context'}, {col1 => 'Target user has role', - col2 => 'User information updatable in course context'}], - print => \&print_usermodification, - modify => \&modify_usermodification, + col2 => 'User information updateable in course context'}, + {col1 => "Status of user", + col2 => 'Information settable when self-creating account (if directory data blank)'}], }, 'scantron' => - { text => 'Bubblesheet format', + { text => 'Bubblesheet format file', help => 'Domain_Configuration_Scantron_Format', - header => [ {col1 => 'Bubblesheet format file', - col2 => ''}, - {col1 => 'Bubblesheet data upload formats', - col2 => 'Settings'}], - print => \&print_scantron, - modify => \&modify_scantron, + header => [ {col1 => 'Item', + col2 => '', + }], }, 'requestcourses' => {text => 'Request creation of courses', @@ -410,38 +321,16 @@ sub handler { header => [{col1 => 'User affiliation', col2 => 'Availability/Processing of requests',}, {col1 => 'Setting', - col2 => 'Value'}, - {col1 => 'Available textbooks', - col2 => ''}, - {col1 => 'Available templates', - col2 => ''}, - {col1 => 'Validation (not official courses)', - col2 => 'Value'},], - print => \&print_quotas, - modify => \&modify_quotas, - }, - 'requestauthor' => - {text => 'Request Authoring Space', - help => 'Domain_Configuration_Request_Author', - header => [{col1 => 'User affiliation', - col2 => 'Availability/Processing of requests',}, - {col1 => 'Setting', col2 => 'Value'}], - print => \&print_quotas, - modify => \&modify_quotas, }, 'coursecategories' => { text => 'Cataloging of courses/communities', help => 'Domain_Configuration_Cataloging_Courses', - header => [{col1 => 'Catalog type/availability', - col2 => '',}, - {col1 => 'Category settings for standard catalog', + header => [{col1 => 'Category settings', col2 => '',}, {col1 => 'Categories', col2 => '', }], - print => \&print_coursecategories, - modify => \&modify_coursecategories, }, 'serverstatuses' => {text => 'Access to server status pages', @@ -450,18 +339,14 @@ sub handler { col2 => 'Other named users', col3 => 'Specific IPs', }], - print => \&print_serverstatuses, - modify => \&modify_serverstatuses, }, 'helpsettings' => - {text => 'Support settings', + {text => 'Help page settings', help => 'Domain_Configuration_Help_Settings', - header => [{col1 => 'Help Page Settings (logged-in users)', - col2 => 'Value'}, - {col1 => 'Helpdesk Roles', - col2 => 'Settings'},], - print => \&print_helpsettings, - modify => \&modify_helpsettings, + header => [{col1 => 'Authenticated Help Settings', + col2 => ''}, + {col1 => 'Unauthenticated Help Settings', + col2 => ''}], }, 'coursedefaults' => {text => 'Course/Community defaults', @@ -470,20 +355,12 @@ sub handler { 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, + 'privacy' => + {text => 'User Privacy', + help => 'Domain_Configuration_User_Privacy', + header => [{col1 => 'Setting', + col2 => 'Value',}], }, 'usersessions' => {text => 'User session hosting/offloading', @@ -494,28 +371,16 @@ 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)', + 'loadbalancing' => + {text => 'Dedicated Load Balancer', help => 'Domain_Configuration_Load_Balancing', - header => [{col1 => 'Balancers', + header => [{col1 => 'Server', col2 => 'Default destinations', - col3 => 'User affiliation', + col3 => 'User affliation', col4 => 'Overrides'}, ], - print => \&print_loadbalancing, - modify => \&modify_loadbalancing, }, - 'ipaccess' => - {text => 'IP-based access control', - help => 'Domain_Configuration_IP_Access', - header => [{col1 => 'Setting', - col2 => 'Value'},], - print => \&print_ipaccess, - modify => \&modify_ipaccess, - }, ); if (keys(%servers) > 1) { $prefs{'login'} = { text => 'Log-in page options', @@ -523,96 +388,29 @@ sub handler { header => [{col1 => 'Log-in Service', col2 => 'Server Setting',}, {col1 => 'Log-in Page Items', - col2 => ''}, - {col1 => 'Log-in Help', - col2 => 'Value'}, - {col1 => 'Custom HTML in document head', - col2 => 'Value'}, - {col1 => 'SSO', - col2 => 'Dual login: SSO and non-SSO options'}, - ], - print => \&print_login, - modify => \&modify_login, + col2 => ''}], }; } - my @roles = ('student','coordinator','author','admin'); my @actions = &Apache::loncommon::get_env_multiple('form.actions'); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:changePage(document.$phase,'pickactions')", text=>"Settings to display/modify"}); my $confname = $dom.'-domainconfig'; - if ($phase eq 'process') { - my $result = &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order, - \%prefs,\%domconfig,$confname,\@roles); - if ((ref($result) eq 'HASH') && (keys(%{$result}))) { - $r->rflush(); - &devalidate_remote_domconfs($dom,$result); - } + &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles); } elsif ($phase eq 'display') { - my $js = &recaptcha_js(). - &toggle_display_js(); - if ((keys(%servers) > 1) || (keys(%existing) > 0)) { + my $js; + if (keys(%servers) > 1) { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - $js .= &lonbalance_targets_js($dom,$types,\%servers, - $domconfig{'loadbalancing'}). - &new_spares_js(). - &common_domprefs_js(). - &Apache::loncommon::javascript_array_indexof(); - } - if (grep(/^requestcourses$/,@actions)) { - my $javascript_validations; - my $coursebrowserjs=&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); - $js .= < -$javascript_validations - -$coursebrowserjs -END - } elsif (grep(/^ipaccess$/,@actions)) { - $js .= &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); - } - if (grep(/^selfcreation$/,@actions)) { - $js .= &selfcreate_javascript(); - } - if (grep(/^contacts$/,@actions)) { - $js .= &contacts_javascript(); - } - if (grep(/^scantron$/,@actions)) { - $js .= &scantron_javascript(); + $js = &lonbalance_targets_js($dom,$types,\%servers). + &new_spares_js(). + &common_domprefs_js(). + &Apache::loncommon::javascript_array_indexof(); } &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js); } else { -# check if domconfig user exists for the domain. - my $servadm = $r->dir_config('lonAdmEMail'); - my ($configuserok,$author_ok,$switchserver) = - &config_check($dom,$confname,$servadm); - unless ($configuserok eq 'ok') { - &Apache::lonconfigsettings::print_header($r,$phase,$context); - $r->print(&mt('The domain configuration user "[_1]" has yet to be created.', - $confname). - '
' - ); - if ($switchserver) { - $r->print(&mt('Ordinarily, that domain configuration user is created when the ./UPDATE script is run to install LON-CAPA for the first time.'). - '
'. - &mt('However, that does not apply when new domains are added to a multi-domain server, and ./UPDATE has not been run recently.'). - '
'. - &mt('The "[_1]" user can be created automatically when a Domain Coordinator visits the web-based "Set domain configuration" screen, in a session hosted on the primary library server.',$confname). - '
'. - &mt('To do that now, use the following link: [_1]',$switchserver) - ); - } else { - $r->print(&mt('To create that user from the command line run the ./UPDATE script found in the top level directory of the extracted LON-CAPA tarball.'). - '
'. - &mt('Once that is done, you will be able to use the web-based "Set domain configuration" to configure the domain') - ); - } - $r->print(&Apache::loncommon::end_page()); - return OK; - } if (keys(%domconfig) == 0) { my $primarylibserv = &Apache::lonnet::domain($dom,'primary'); my @ids=&Apache::lonnet::current_machine_ids(); @@ -652,63 +450,51 @@ END } sub process_changes { - my ($r,$dom,$confname,$action,$roles,$values,$lastactref) = @_; + my ($r,$dom,$confname,$action,$roles,$values) = @_; my %domconfig; if (ref($values) eq 'HASH') { %domconfig = %{$values}; } my $output; if ($action eq 'login') { - $output = &modify_login($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_login($r,$dom,$confname,%domconfig); } elsif ($action eq 'rolecolors') { $output = &modify_rolecolors($r,$dom,$confname,$roles, - $lastactref,%domconfig); + %domconfig); } elsif ($action eq 'quotas') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); + $output = &modify_quotas($dom,$action,%domconfig); } elsif ($action eq 'autoenroll') { - $output = &modify_autoenroll($dom,$lastactref,%domconfig); + $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,$lastactref,%domconfig); + $output = &modify_directorysrch($dom,%domconfig); } elsif ($action eq 'usercreation') { $output = &modify_usercreation($dom,%domconfig); - } elsif ($action eq 'selfcreation') { - $output = &modify_selfcreation($dom,$lastactref,%domconfig); } elsif ($action eq 'usermodification') { $output = &modify_usermodification($dom,%domconfig); } elsif ($action eq 'contacts') { - $output = &modify_contacts($dom,$lastactref,%domconfig); + $output = &modify_contacts($dom,%domconfig); } elsif ($action eq 'defaults') { - $output = &modify_defaults($dom,$lastactref,%domconfig); + $output = &modify_defaults($dom,$r); } elsif ($action eq 'scantron') { - $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_scantron($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursecategories') { - $output = &modify_coursecategories($dom,$lastactref,%domconfig); + $output = &modify_coursecategories($dom,%domconfig); } elsif ($action eq 'serverstatuses') { $output = &modify_serverstatuses($dom,%domconfig); } elsif ($action eq 'requestcourses') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); - } elsif ($action eq 'requestauthor') { - $output = &modify_quotas($r,$dom,$action,$lastactref,%domconfig); + $output = &modify_quotas($dom,$action,%domconfig); } elsif ($action eq 'helpsettings') { - $output = &modify_helpsettings($r,$dom,$confname,$lastactref,%domconfig); + $output = &modify_helpsettings($r,$dom,$confname,%domconfig); } elsif ($action eq 'coursedefaults') { - $output = &modify_coursedefaults($dom,$lastactref,%domconfig); - } elsif ($action eq 'selfenrollment') { - $output = &modify_selfenrollment($dom,$lastactref,%domconfig) + $output = &modify_coursedefaults($dom,%domconfig); } elsif ($action eq 'usersessions') { - $output = &modify_usersessions($dom,$lastactref,%domconfig); + $output = &modify_usersessions($dom,%domconfig); } elsif ($action eq 'loadbalancing') { $output = &modify_loadbalancing($dom,%domconfig); - } elsif ($action eq 'passwords') { - $output = &modify_passwords($r,$dom,$confname,$lastactref,%domconfig); - } elsif ($action eq 'wafproxy') { - $output = &modify_wafproxy($dom,$action,$lastactref,%domconfig); - } elsif ($action eq 'ipaccess') { - $output = &modify_ipaccess($dom,$lastactref,%domconfig); } return $output; } @@ -719,41 +505,11 @@ sub print_config_box { my $output; if ($action eq 'coursecategories') { $output = &coursecategories_javascript($settings); - } elsif ($action eq 'defaults') { - $output = &defaults_javascript($settings); - } elsif ($action eq 'passwords') { - $output = &passwords_javascript(); - } elsif ($action eq 'helpsettings') { - my (%privs,%levelscurrent); - my %full=(); - my %levels=( - course => {}, - domain => {}, - system => {}, - ); - my $context = 'domain'; - my $crstype = 'Course'; - my $formname = 'display'; - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $output = - &Apache::lonuserutils::custom_roledefs_js($context,$crstype,$formname,\%full, - \@templateroles); - } elsif ($action eq 'wafproxy') { - $output .= &wafproxy_javascript($dom); - } elsif ($action eq 'autoupdate') { - $output .= &autoupdate_javascript(); - } elsif ($action eq 'autoenroll') { - $output .= &autoenroll_javascript(); - } elsif ($action eq 'login') { - $output .= &saml_javascript(); - } elsif ($action eq 'ipaccess') { - $output .= &ipaccess_javascript($settings); } - $output .= + $output .= ' - '."\n". ''; @@ -765,49 +521,42 @@ sub print_config_box { if ($numheaders > 1) { my $colspan = ''; my $rightcolspan = ''; - my $leftnobr = ''; - if (($action eq 'rolecolors') || ($action eq 'defaults') || - ($action eq 'directorysrch') || - (($action eq 'login') && ($numheaders < 5))) { + if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'helpsettings')) { $colspan = ' colspan="2"'; } if ($action eq 'usersessions') { $rightcolspan = ' colspan="3"'; } - if ($action eq 'passwords') { - $leftnobr = ' LC_nobreak'; - } $output .= ' @@ -842,50 +581,11 @@ sub print_config_box {
'. + '. &mt($item->{text}).' '. &Apache::loncommon::help_open_topic($item->{'help'}).'
- + '; $rowtotal ++; - if (($action eq 'autoupdate') || ($action eq 'usercreation') || ($action eq 'selfcreation') || - ($action eq 'usermodification') || ($action eq 'defaults') || ($action eq 'coursedefaults') || - ($action eq 'selfenrollment') || ($action eq 'usersessions') || ($action eq 'directorysrch') || - ($action eq 'helpsettings') || ($action eq 'contacts') || ($action eq 'wafproxy')) { - $output .= $item->{'print'}->('top',$dom,$settings,\$rowtotal); - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('top',$dom,$confname,$settings,\$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 'usermodification') { + $output .= &print_usermodification('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'coursecategories') { - $output .= $item->{'print'}->('top',$dom,$item,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'top',$dom,$confname,$settings,\$rowtotal); + $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal); } elsif ($action eq 'login') { - if ($numheaders == 5) { - $colspan = ' colspan="2"'; - $output .= &print_login('service',$dom,$confname,$phase,$settings,\$rowtotal); - } else { - $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal); - } - } elsif (($action eq 'requestcourses') || ($action eq 'requestauthor')) { + $output .= &print_login('top',$dom,$confname,$phase,$settings,\$rowtotal); + $colspan = ' colspan="2"'; + } elsif ($action eq 'requestcourses') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); + } elsif ($action eq 'helpsettings') { + $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'usersessions') { + $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'coursedefaults') { + $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal); } $output .= '
'.&mt($item->{'header'}->[0]->{'col1'}).''.&mt($item->{'header'}->[0]->{'col1'}).' '.&mt($item->{'header'}->[0]->{'col2'}).'
@@ -817,23 +566,13 @@ sub print_config_box {
- + '; + $output .= ' '; $rowtotal ++; - if (($action eq 'autoupdate') || ($action eq 'usercreation') || - ($action eq 'selfcreation') || ($action eq 'selfenrollment') || - ($action eq 'usersessions') || ($action eq 'coursecategories') || - ($action eq 'contacts') || ($action eq 'passwords') || ($action eq 'defaults')) { - if ($action eq 'coursecategories') { - $output .= &print_coursecategories('middle',$dom,$item,$settings,\$rowtotal); - $colspan = ' colspan="2"'; - } elsif ($action eq 'passwords') { - $output .= $item->{'print'}->('middle',$dom,$confname,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('middle',$dom,$settings,\$rowtotal); - } - $output .= ' + 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'}).'
- - '."\n"; - if ($action eq 'coursecategories') { - $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); - } elsif (($action eq 'contacts') || ($action eq 'passwords')) { - if ($action eq 'passwords') { - $output .= $item->{'print'}->('lower',$dom,$confname,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('lower',$dom,$settings,\$rowtotal); - } - $output .= ' - -
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - - - '."\n"; - if ($action eq 'passwords') { - $output .= $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal); - } else { - $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } - $output .= ' -
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
- - - '; - } else { - $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } + '.&mt($item->{'header'}->[2]->{'col2'}).' '. + &print_autoupdate('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - } elsif (($action eq 'usermodification') || ($action eq 'coursedefaults') || - ($action eq 'directorysrch') || ($action eq 'helpsettings') || - ($action eq 'wafproxy')) { - $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal); - } elsif ($action eq 'scantron') { - $output .= $item->{'print'}->($r,'bottom',$dom,$confname,$settings,\$rowtotal); - } elsif ($action eq 'login') { - if ($numheaders == 5) { - $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).' + } elsif ($action eq 'usercreation') { + $output .= &print_usercreation('middle',$dom,$settings,\$rowtotal).' @@ -894,57 +594,32 @@ sub print_config_box { - '. - &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal); - $rowtotal ++; - } else { - $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal); - } - $output .= ' -
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - '; - if ($numheaders == 5) { - $output .= ' - - - '; - } else { - $output .= ' - - - '; - } + '. + &print_usercreation('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - $output .= &print_login('headtag',$dom,$confname,$phase,$settings,\$rowtotal).' + } elsif ($action eq 'usermodification') { + $output .= &print_usermodification('middle',$dom,$settings,\$rowtotal).'
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
- '; - if ($numheaders == 5) { - $output .= ' - - - '; - } else { - $output .= ' - - - '; - } + + + '. + &print_usermodification('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; - $output .= &print_login('saml',$dom,$confname,$phase,$settings,\$rowtotal); + } elsif ($action eq 'coursecategories') { + $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal); + } elsif ($action eq 'login') { + $output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal); } elsif ($action eq 'requestcourses') { - $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); - $rowtotal ++; - $output .= &print_studentcode($settings,\$rowtotal).' + $output .= &print_courserequestmail($dom,$settings,\$rowtotal); + } elsif ($action eq 'helpsettings') { + $output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'usersessions') { + $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'
'.&mt($item->{'header'}->[4]->{'col1'}).''.&mt($item->{'header'}->[4]->{'col2'}).'
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -953,33 +628,11 @@ sub print_config_box { - '. - &textbookcourses_javascript($settings). - &print_textbookcourses($dom,'textbooks',$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[2]->{'col1'}).''.&mt($item->{'header'}->[2]->{'col2'}).'
- - - - - - - - '. - &print_textbookcourses($dom,'templates',$settings,\$rowtotal).' -
'.&mt($item->{'header'}->[3]->{'col1'}).''.&mt($item->{'header'}->[3]->{'col2'}).'
- - - - - - - - - '. - &print_validation_rows('requestcourses',$dom,$settings,\$rowtotal); - } elsif ($action eq 'requestauthor') { - $output .= &print_requestmail($dom,$action,$settings,\$rowtotal); + '. + &print_usersessions('bottom',$dom,$settings,\$rowtotal); $rowtotal ++; + } elsif ($action eq 'coursedefaults') { + $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal); } elsif ($action eq 'rolecolors') { $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
'.&mt($item->{'header'}->[4]->{'col1'}).''.&mt($item->{'header'}->[4]->{'col2'}).'
'.&mt($item->{'header'}->[2]->{'col2'}).'
@@ -1014,7 +667,7 @@ sub print_config_box { '; - if ($action eq 'login') { + if (($action eq 'login') || ($action eq 'directorysrch')) { $output .= ' '; } elsif ($action eq 'serverstatuses') { @@ -1056,12 +709,29 @@ sub print_config_box { } $output .= ''; $rowtotal ++; - if ($action eq 'quotas') { + if ($action eq 'login') { + $output .= &print_login('bottom',$dom,$confname,$phase,$settings, + \$rowtotal); + } elsif ($action eq 'quotas') { $output .= &print_quotas($dom,$settings,\$rowtotal,$action); - } elsif (($action eq 'autoenroll') || ($action eq 'autocreate') || - ($action eq 'serverstatuses') || ($action eq 'loadbalancing') || - ($action eq 'ipaccess')) { - $output .= $item->{'print'}->($dom,$settings,\$rowtotal); + } 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,\$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('top',$dom,$confname,$settings,\$rowtotal); + } elsif ($action eq 'loadbalancing') { + $output .= &print_loadbalancing($dom,$settings,\$rowtotal); } } $output .= ' @@ -1073,15 +743,11 @@ sub print_config_box { } sub print_login { - my ($caller,$dom,$confname,$phase,$settings,$rowtotal) = @_; - my ($css_class,$datatable,$switchserver,%lt); + my ($position,$dom,$confname,$phase,$settings,$rowtotal) = @_; + my ($css_class,$datatable); my %choices = &login_choices(); - if (($caller eq 'help') || ($caller eq 'headtag') || ($caller eq 'saml')) { - %lt = &login_file_options(); - $switchserver = &check_switchserver($dom,$confname); - } - if ($caller eq 'service') { + if ($position eq 'top') { my %servers = &Apache::lonnet::internet_dom_servers($dom); my $choice = $choices{'disallowlogin'}; $css_class = ' class="LC_odd_row"'; @@ -1108,7 +774,7 @@ sub print_login { '
'.&mt($item->{'header'}->[0]->{'col1'}).'
'; return $datatable; - } elsif ($caller eq 'page') { - my %defaultchecked = ( - 'coursecatalog' => 'on', - 'helpdesk' => 'on', - 'adminmail' => 'off', - 'newuser' => 'off', - ); - my @toggles = ('coursecatalog','adminmail','helpdesk','newuser'); - my (%checkedon,%checkedoff); + } + + my %defaultchecked = ( + 'coursecatalog' => 'on', + 'adminmail' => 'off', + 'newuser' => 'off', + ); + my @toggles = ('coursecatalog','adminmail','newuser'); + my (%checkedon,%checkedoff); + 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} = ' '; + } + } + my @images = ('img','logo','domlogo','login'); + my @logintext = ('textcol','bgcol'); + my @bgs = ('pgbg','mainbg','sidebg'); + my @links = ('link','alink','vlink'); + my %designhash = &Apache::loncommon::get_domainconf($dom); + my %defaultdesign = %Apache::loncommon::defaultdesign; + my (%is_custom,%designs); + my %defaults = ( + font => $defaultdesign{'login.font'}, + ); + foreach my $item (@images) { + $defaults{$item} = $defaultdesign{'login.'.$item}; + $defaults{'showlogo'}{$item} = 1; + } + foreach my $item (@bgs) { + $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item}; + } + foreach my $item (@logintext) { + $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item}; + } + foreach my $item (@links) { + $defaults{'links'}{$item} = $defaultdesign{'login.'.$item}; + } + if (ref($settings) eq 'HASH') { foreach my $item (@toggles) { - if ($defaultchecked{$item} eq 'on') { - $checkedon{$item} = ' checked="checked" '; + if ($settings->{$item} eq '1') { + $checkedon{$item} = ' checked="checked" '; $checkedoff{$item} = ' '; - } elsif ($defaultchecked{$item} eq 'off') { - $checkedoff{$item} = ' checked="checked" '; + } elsif ($settings->{$item} eq '0') { + $checkedoff{$item} = ' checked="checked" '; $checkedon{$item} = ' '; } } - my @images = ('img','logo','domlogo','login'); - my @alttext = ('img','logo','domlogo'); - my @logintext = ('textcol','bgcol'); - my @bgs = ('pgbg','mainbg','sidebg'); - my @links = ('link','alink','vlink'); - my %designhash = &Apache::loncommon::get_domainconf($dom); - my %defaultdesign = %Apache::loncommon::defaultdesign; - my (%is_custom,%designs); - my %defaults = ( - font => $defaultdesign{'login.font'}, - ); foreach my $item (@images) { - $defaults{$item} = $defaultdesign{'login.'.$item}; - $defaults{'showlogo'}{$item} = 1; - } - foreach my $item (@bgs) { - $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item}; - } - foreach my $item (@logintext) { - $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item}; - } - foreach my $item (@links) { - $defaults{'links'}{$item} = $defaultdesign{'login.'.$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 (@images) { - if (defined($settings->{$item})) { - $designs{$item} = $settings->{$item}; - $is_custom{$item} = 1; - } - if (defined($settings->{'showlogo'}{$item})) { - $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item}; - } - } - foreach my $item (@alttext) { - if (ref($settings->{'alttext'}) eq 'HASH') { - if ($settings->{'alttext'}->{$item} ne '') { - $designs{'alttext'}{$item} = $settings->{'alttext'}{$item}; - } - } - } - foreach my $item (@logintext) { - if ($settings->{$item} ne '') { - $designs{'logintext'}{$item} = $settings->{$item}; - $is_custom{$item} = 1; - } - } - if ($settings->{'font'} ne '') { - $designs{'font'} = $settings->{'font'}; - $is_custom{'font'} = 1; - } - foreach my $item (@bgs) { - if ($settings->{$item} ne '') { - $designs{'bgs'}{$item} = $settings->{$item}; - $is_custom{$item} = 1; - } - } - foreach my $item (@links) { - if ($settings->{$item} ne '') { - $designs{'links'}{$item} = $settings->{$item}; - $is_custom{$item} = 1; - } - } - } else { - if ($designhash{$dom.'.login.font'} ne '') { - $designs{'font'} = $designhash{$dom.'.login.font'}; - $is_custom{'font'} = 1; - } - foreach my $item (@images) { - if ($designhash{$dom.'.login.'.$item} ne '') { - $designs{$item} = $designhash{$dom.'.login.'.$item}; - $is_custom{$item} = 1; - } - } - foreach my $item (@bgs) { - if ($designhash{$dom.'.login.'.$item} ne '') { - $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item}; - $is_custom{$item} = 1; - } + if (defined($settings->{$item})) { + $designs{$item} = $settings->{$item}; + $is_custom{$item} = 1; } - foreach my $item (@links) { - if ($designhash{$dom.'.login.'.$item} ne '') { - $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item}; - $is_custom{$item} = 1; - } + if (defined($settings->{'showlogo'}{$item})) { + $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item}; } } - my %alt_text = &Apache::lonlocal::texthash ( img => 'Log-in banner', - logo => 'Institution Logo', - domlogo => 'Domain Logo', - login => 'Login box'); - my $itemcount = 1; - foreach my $item (@toggles) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= - ''.$choices{$item}. - ''. - ' '. - ''; - $itemcount ++; - } - $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext); - $datatable .= ''; - } elsif ($caller eq 'help') { - my ($defaulturl,$defaulttype,%url,%type,%langchoices); - my $itemcount = 1; - $defaulturl = '/adm/loginproblems.html'; - $defaulttype = 'default'; - %langchoices = &Apache::lonlocal::texthash(&get_languages_hash()); - my @currlangs; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'helpurl'}) eq 'HASH') { - foreach my $key (sort(keys(%{$settings->{'helpurl'}}))) { - next if ($settings->{'helpurl'}{$key} eq ''); - $url{$key} = $settings->{'helpurl'}{$key}.'?inhibitmenu=yes'; - $type{$key} = 'custom'; - unless ($key eq 'nolang') { - push(@currlangs,$key); - } - } - } elsif ($settings->{'helpurl'} ne '') { - $type{'nolang'} = 'custom'; - $url{'nolang'} = $settings->{'helpurl'}.'?inhibitmenu=yes'; + foreach my $item (@logintext) { + if ($settings->{$item} ne '') { + $designs{'logintext'}{$item} = $settings->{$item}; + $is_custom{$item} = 1; } } - foreach my $lang ('nolang',sort(@currlangs)) { - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''; - if ($url{$lang} eq '') { - $url{$lang} = $defaulturl; - } - if ($type{$lang} eq '') { - $type{$lang} = $defaulttype; - } - $datatable .= ''; - if ($lang eq 'nolang') { - $datatable .= &mt('Log-in help page if no specific language file: [_1]', - &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500)); - } else { - $datatable .= &mt('Log-in help page for language: [_1] is [_2]', - $langchoices{$lang}, - &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500)); - } - $datatable .= ''."\n". - ''; - if ($type{$lang} eq 'custom') { - $datatable .= ' '.$lt{'rep'}.''; - } else { - $datatable .= $lt{'upl'}; - } - $datatable .='
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= ''; - $itemcount ++; + if ($settings->{'font'} ne '') { + $designs{'font'} = $settings->{'font'}; + $is_custom{'font'} = 1; } - my @addlangs; - foreach my $lang (sort(keys(%langchoices))) { - next if ((grep(/^\Q$lang\E$/,@currlangs)) || ($lang eq 'x_chef')); - push(@addlangs,$lang); - } - if (@addlangs > 0) { - my %toadd; - map { $toadd{$_} = $langchoices{$_} ; } @addlangs; - $toadd{''} = &mt('Select'); - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - &mt('Add log-in help page for a specific language:').' '. - &Apache::loncommon::select_form('','loginhelpurl_add_lang',\%toadd). - ''.$lt{'upl'}.'
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; + foreach my $item (@bgs) { + if ($settings->{$item} ne '') { + $designs{'bgs'}{$item} = $settings->{$item}; + $is_custom{$item} = 1; } - $datatable .= ''; - $itemcount ++; } - $datatable .= &captcha_choice('login',$settings,$itemcount); - } elsif ($caller eq 'headtag') { - my %domservers = &Apache::lonnet::get_servers($dom); - my $choice = $choices{'headtag'}; - $css_class = ' class="LC_odd_row"'; - $datatable .= ''.$choice.''. - ''. - ''. - ''. - ''."\n"; - my (%currurls,%currexempt); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'headtag'}) eq 'HASH') { - foreach my $lonhost (keys(%{$settings->{'headtag'}})) { - if (ref($settings->{'headtag'}{$lonhost}) eq 'HASH') { - $currurls{$lonhost} = $settings->{'headtag'}{$lonhost}{'url'}; - $currexempt{$lonhost} = $settings->{'headtag'}{$lonhost}{'exempt'}; - } - } + foreach my $item (@links) { + if ($settings->{$item} ne '') { + $designs{'links'}{$item} = $settings->{$item}; + $is_custom{$item} = 1; } } - foreach my $lonhost (sort(keys(%domservers))) { - my $exempt = &check_exempt_addresses($currexempt{$lonhost}); - $datatable .= ''; - if ($currurls{$lonhost}) { - $datatable .= ''. - ''; + } else { + if ($designhash{$dom.'.login.font'} ne '') { + $designs{'font'} = $designhash{$dom.'.login.font'}; + $is_custom{'font'} = 1; } - $datatable .= '
'.$choices{'hostid'}.''.$choices{'current'}.''.$choices{'action'}.''.$choices{'exempt'}.'
'.$domservers{$lonhost}.''.$lt{'curr'}.' '.$lt{'rep'}.''; - } else { - $datatable .= ''.$lt{'none'}.''.$lt{'upl'}; - } - $datatable .='
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= '
'; - } elsif ($caller eq 'saml') { - my %domservers = &Apache::lonnet::get_servers($dom); - $datatable .= ''. - ''. - ''. - ''."\n"; - my (%saml,%samltext,%samlimg,%samlalt,%samlurl,%samltitle,%samlnotsso,%styleon,%styleoff); - foreach my $lonhost (keys(%domservers)) { - $samlurl{$lonhost} = '/adm/sso'; - $styleon{$lonhost} = 'display:none'; - $styleoff{$lonhost} = ''; - } - if (ref($settings->{'saml'}) eq 'HASH') { - foreach my $lonhost (keys(%{$settings->{'saml'}})) { - if (ref($settings->{'saml'}{$lonhost}) eq 'HASH') { - $saml{$lonhost} = 1; - $samltext{$lonhost} = $settings->{'saml'}{$lonhost}{'text'}; - $samlimg{$lonhost} = $settings->{'saml'}{$lonhost}{'img'}; - $samlalt{$lonhost} = $settings->{'saml'}{$lonhost}{'alt'}; - $samlurl{$lonhost} = $settings->{'saml'}{$lonhost}{'url'}; - $samltitle{$lonhost} = $settings->{'saml'}{$lonhost}{'title'}; - $samlnotsso{$lonhost} = $settings->{'saml'}{$lonhost}{'notsso'}; - $styleon{$lonhost} = ''; - $styleoff{$lonhost} = 'display:none'; - } else { - $styleon{$lonhost} = 'display:none'; - $styleoff{$lonhost} = ''; - } + foreach my $item (@images) { + if ($designhash{$dom.'.login.'.$item} ne '') { + $designs{$item} = $designhash{$dom.'.login.'.$item}; + $is_custom{$item} = 1; } } - my $itemcount = 1; - foreach my $lonhost (sort(keys(%domservers))) { - my $samlon = ' '; - my $samloff = ' checked="checked" '; - if ($saml{$lonhost}) { - $samlon = $samloff; - $samloff = ' '; - } - my $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - ''. - ''; - $itemcount ++; } - $datatable .= '
'.$choices{'hostid'}.''.$choices{'samllanding'}.''.$choices{'samloptions'}.'
'.$domservers{$lonhost}.''.(' 'x2). - ''. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - ''. - '
'.&mt('SSO').''. - ''.&mt('Non-SSO').'
'.&mt('Text').''.&mt('Image').''.&mt('Alt Text').''.&mt('URL').''.&mt('Tool Tip').''.&mt('Text').'
'; - if ($samlimg{$lonhost}) { - $datatable .= '
'. - ' '.$lt{'rep'}.''; - } else { - $datatable .= $lt{'upl'}; + foreach my $item (@bgs) { + if ($designhash{$dom.'.login.'.$item} ne '') { + $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item}; + $is_custom{$item} = 1; } - $datatable .='
'; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; + } + foreach my $item (@links) { + if ($designhash{$dom.'.login.'.$item} ne '') { + $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item}; + $is_custom{$item} = 1; } - $datatable .= '
 
'; } + my %alt_text = &Apache::lonlocal::texthash ( img => 'Log-in banner', + logo => 'Institution Logo', + domlogo => 'Domain Logo', + login => 'Login box'); + my $itemcount = 1; + foreach my $item (@toggles) { + $css_class = $itemcount%2?' class="LC_odd_row"':''; + $datatable .= + ''.$choices{$item}. + ''. + ' '. + ''; + $itemcount ++; + } + $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext); + $datatable .= ''; return $datatable; } @@ -1496,7 +947,6 @@ sub login_choices { &Apache::lonlocal::texthash ( coursecatalog => 'Display Course/Community Catalog link?', adminmail => "Display Administrator's E-mail Address?", - helpdesk => 'Display "Contact Helpdesk" link', disallowlogin => "Login page requests redirected", hostid => "Server", server => "Redirect to:", @@ -1520,208 +970,10 @@ sub login_choices { link => "Link", alink => "Active link", vlink => "Visited link", - headtag => "Custom markup", - action => "Action", - current => "Current", - samllanding => "Dual login?", - samloptions => "Options", - alttext => "Alt text", ); return %choices; } -sub login_file_options { - return &Apache::lonlocal::texthash( - del => 'Delete?', - rep => 'Replace:', - upl => 'Upload:', - curr => 'View contents', - default => 'Default', - custom => 'Custom', - none => 'None', - ); -} - -sub print_ipaccess { - my ($dom,$settings,$rowtotal) = @_; - my $css_class; - my $itemcount = 0; - my $datatable; - my %ordered; - if (ref($settings) eq 'HASH') { - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - if ($num eq '') { - $num = scalar(keys(%{$settings})); - } - $ordered{$num} = $item; - } - } - } - my $maxnum = scalar(keys(%ordered)); - if (keys(%ordered)) { - my @items = sort { $a <=> $b } keys(%ordered); - for (my $i=0; $i<@items; $i++) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $item = $ordered{$items[$i]}; - my ($name,$ipranges,%commblocks,%courses); - if (ref($settings->{$item}) eq 'HASH') { - $name = $settings->{$item}->{'name'}; - $ipranges = $settings->{$item}->{'ip'}; - if (ref($settings->{$item}->{'commblocks'}) eq 'HASH') { - %commblocks = %{$settings->{$item}->{'commblocks'}}; - } - if (ref($settings->{$item}->{'courses'}) eq 'HASH') { - %courses = %{$settings->{$item}->{'courses'}}; - } - } - my $chgstr = ' onchange="javascript:reorderIPaccess(this.form,'."'ipaccess_pos_".$item."'".');"'; - $datatable .= '' - .''.(' 'x2). - ''. - ''. - &ipaccess_options($i,$itemcount,$dom,$name,$ipranges,\%commblocks,\%courses). - ''; - $itemcount ++; - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderIPaccess(this.form,'."'ipaccess_pos_add'".');"'; - $datatable .= ''."\n". - ''."\n". - ' '."\n". - ''.&mt('Add').''."\n". - ''. - &ipaccess_options('add',$itemcount,$dom). - ''."\n". - ''."\n"; - $$rowtotal ++; - return $datatable; -} - -sub ipaccess_options { - my ($num,$itemcount,$dom,$name,$ipranges,$blocksref,$coursesref) = @_; - my (%currblocks,%currcourses,$output); - if (ref($blocksref) eq 'HASH') { - %currblocks = %{$blocksref}; - } - if (ref($coursesref) eq 'HASH') { - %currcourses = %{$coursesref}; - } - $output = '
'.&mt('Location(s)').''. - ''.&mt('Name').': '. - ''. - '
'. - '
'.&mt('IP Range(s)').''. - &mt('Format for each IP range').': '.&mt('A.B.C.D/N or A.B.C.D-E.F.G.H').'
'. - &mt('Range(s) will be stored as IP netblock(s) in CIDR notation (comma separated)').'
'. - '
'. - '
'.&mt('Functionality Blocked?').''. - &blocker_checkboxes($num,$blocksref).'
'. - '
'.&mt('Courses/Communities allowed').''. - ''; - foreach my $cid (sort(keys(%currcourses))) { - my %courseinfo = &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - $output .= ''; - } - $output .= '
'. - ''. - ' ('.$cid.')
'.&mt('Add').': '. - ''. - &Apache::loncommon::selectcourse_link('display','ipaccess_cnum_'.$num,'ipaccess_cdom_'.$num,'ipaccess_cdesc_'.$num,$dom,undef,'Course/Community'). - ''. - ''. - '
'."\n". - '
'; - return $output; -} - -sub blocker_checkboxes { - my ($num,$blocks) = @_; - my ($typeorder,$types) = &commblocktype_text(); - my $numinrow = 6; - my $output = ''; - for (my $i=0; $i<@{$typeorder}; $i++) { - my $block = $typeorder->[$i]; - my $blockstatus; - if (ref($blocks) eq 'HASH') { - if ($blocks->{$block} eq 'on') { - $blockstatus = 'checked="checked"'; - } - } - my $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $output .= ''; - } - $output .= ''; - } - if ($i == scalar(@{$typeorder})-1) { - my $colsleft = $numinrow-$rem; - if ($colsleft > 1) { - $output .= ''; - } - $output .= '
'; - } else { - $output .= ''; - } - } else { - $output .= ''; - } - my $item = 'ipaccess_block_'.$num; - if ($blockstatus) { - $blockstatus = ' '.$blockstatus; - } - $output .= ''."\n". - '
'; - return $output; -} - -sub commblocktype_text { - my %types = &Apache::lonlocal::texthash( - 'com' => 'Messaging', - 'chat' => 'Chat Room', - 'boards' => 'Discussion', - 'port' => 'Portfolio', - 'groups' => 'Groups', - 'blogs' => 'Blogs', - 'about' => 'User Information', - 'printout' => 'Printouts', - 'passwd' => 'Change Password', - 'grades' => 'Gradebook', - 'search' => 'Course search', - 'wishlist' => 'Stored links', - 'annotate' => 'Annotations', - ); - my $typeorder = ['com','chat','boards','port','groups','blogs','about','wishlist','printout','grades','search','annotate','passwd']; - return ($typeorder,\%types); -} - sub print_rolecolors { my ($phase,$role,$dom,$confname,$settings,$rowtotal) = @_; my %choices = &color_font_choices(); @@ -1732,7 +984,17 @@ sub print_rolecolors { my %designhash = &Apache::loncommon::get_domainconf($dom); my %defaultdesign = %Apache::loncommon::defaultdesign; my (%is_custom,%designs); - my %defaults = &role_defaults($role,\@bgs,\@links,\@images); + my %defaults = ( + img => $defaultdesign{$role.'.img'}, + font => $defaultdesign{$role.'.font'}, + fontmenu => $defaultdesign{$role.'.fontmenu'}, + ); + foreach my $item (@bgs) { + $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item}; + } + foreach my $item (@links) { + $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item}; + } if (ref($settings) eq 'HASH') { if (ref($settings->{$role}) eq 'HASH') { if ($settings->{$role}->{'img'} ne '') { @@ -1793,44 +1055,6 @@ sub print_rolecolors { return $datatable; } -sub role_defaults { - my ($role,$bgs,$links,$images,$logintext) = @_; - my %defaults; - unless ((ref($bgs) eq 'ARRAY') && (ref($links) eq 'ARRAY') && (ref($images) eq 'ARRAY')) { - return %defaults; - } - my %defaultdesign = %Apache::loncommon::defaultdesign; - if ($role eq 'login') { - %defaults = ( - font => $defaultdesign{$role.'.font'}, - ); - if (ref($logintext) eq 'ARRAY') { - foreach my $item (@{$logintext}) { - $defaults{'logintext'}{$item} = $defaultdesign{$role.'.'.$item}; - } - } - foreach my $item (@{$images}) { - $defaults{'showlogo'}{$item} = 1; - } - } else { - %defaults = ( - img => $defaultdesign{$role.'.img'}, - font => $defaultdesign{$role.'.font'}, - fontmenu => $defaultdesign{$role.'.fontmenu'}, - ); - } - foreach my $item (@{$bgs}) { - $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item}; - } - foreach my $item (@{$links}) { - $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item}; - } - foreach my $item (@{$images}) { - $defaults{$item} = $defaultdesign{$role.'.'.$item}; - } - return %defaults; -} - sub display_color_options { my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs, $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_; @@ -1839,31 +1063,32 @@ sub display_color_options { my $datatable = ''. ''.$choices->{'font'}.''; if (!$is_custom->{'font'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'font'}.''; } else { $datatable .= ' '; } - my $current_color = $designs->{'font'} ? $designs->{'font'} : $defaults->{'font'}; - + my $fontlink = &color_pick($phase,$role,'font',$choices->{'font'},$designs->{'font'}); $datatable .= ''. - ' '. - ' '; + ' '.$fontlink. + '    '. + ''; unless ($role eq 'login') { $datatable .= ''. ''.$choices->{'fontmenu'}.''; if (!$is_custom->{'fontmenu'}) { - $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; + $datatable .= ''.&mt('Default in use:').' '.$defaults->{'fontmenu'}.''; } else { $datatable .= ' '; } - $current_color = $designs->{'fontmenu'} ? - $designs->{'fontmenu'} : $defaults->{'fontmenu'}; + $fontlink = &color_pick($phase,$role,'fontmenu',$choices->{'fontmenu'},$designs->{'fontmenu'}); $datatable .= ''. - ' '. - ' '; + ' '.$fontlink. + '    '. + ''; } my $switchserver = &check_switchserver($dom,$confname); foreach my $img (@{$images}) { @@ -1871,21 +1096,16 @@ sub display_color_options { $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= ''. ''.$choices->{$img}; - my ($imgfile,$img_import,$login_hdr_pick,$logincolors,$alttext); + my ($imgfile,$img_import,$login_hdr_pick,$logincolors); if ($role eq 'login') { if ($img eq 'login') { $login_hdr_pick = &login_header_options($img,$role,$defaults,$is_custom,$choices); $logincolors = &login_text_colors($img,$role,$logintext,$phase,$choices, - $designs,$defaults); - } else { - if ($img ne 'domlogo') { - $datatable.= &logo_display_options($img,$defaults,$designs); - } - if (ref($designs->{'alttext'}) eq 'HASH') { - $alttext = $designs->{'alttext'}{$img}; - } + $designs); + } elsif ($img ne 'domlogo') { + $datatable.= &logo_display_options($img,$defaults,$designs); } } $datatable .= ''; @@ -1927,8 +1147,7 @@ sub display_color_options { if ($fullwidth ne '' && $fullheight ne '') { if ($fullwidth > $width && $fullheight > $height) { my $size = $width.'x'.$height; - my @args = ('convert','-sample',$size,$input,$output); - system({$args[0]} @args); + system("convert -sample $size $input $output"); $showfile = "/$imgdir/tn-".$filename; } } @@ -1963,12 +1182,12 @@ sub display_color_options { $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import, $showfile,$fullsize,$role,$img,$imgfile,$logincolors); } else { - $datatable .= ' '. - &mt('Upload:').'
'; + $datatable .= '
'. + &mt('Upload:'); } } else { - $datatable .= ' '. - &mt('Upload:').'
'; + $datatable .= '
'. + &mt('Upload:'); } if ($switchserver) { $datatable .= &mt('Upload to library server: [_1]',$switchserver); @@ -1977,11 +1196,6 @@ sub display_color_options { $datatable .=' '; } } - if (($role eq 'login') && ($img ne 'login')) { - $datatable .= (' ' x2).' '; - } $datatable .= ''; } $itemcount ++; @@ -1991,7 +1205,7 @@ sub display_color_options { my $bgs_def; foreach my $item (@{$bgs}) { if (!$is_custom->{$item}) { - $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; + $bgs_def .= ''.$choices->{$item}.'    
'.$defaults->{'bgs'}{$item}.''; } } if ($bgs_def) { @@ -2001,14 +1215,13 @@ sub display_color_options { } $datatable .= ''. ''; - foreach my $item (@{$bgs}) { - $datatable .= ''; } $datatable .= '
'.$choices->{$item}; - my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item}; + my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item}); + $datatable .= ''.$link; if ($designs->{'bgs'}{$item}) { - $datatable .= ' '; + $datatable .= '    '; } - $datatable .= '
'; @@ -2019,7 +1232,7 @@ sub display_color_options { my $links_def; foreach my $item (@{$links}) { if (!$is_custom->{$item}) { - $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; + $links_def .= ''.$choices->{$item}.'
'.$defaults->{'links'}{$item}.''; } } if ($links_def) { @@ -2030,12 +1243,13 @@ sub display_color_options { $datatable .= ''. ''; foreach my $item (@{$links}) { - my $color = $designs->{'links'}{$item} ? $designs->{'links'}{$item} : $defaults->{'links'}{$item}; - $datatable .= ''; } $$rowtotal += $itemcount; @@ -2089,13 +1303,17 @@ sub login_header_options { } sub login_text_colors { - my ($img,$role,$logintext,$phase,$choices,$designs,$defaults) = @_; + my ($img,$role,$logintext,$phase,$choices,$designs) = @_; my $color_menu = '
'.$choices->{$item}."\n"; + $datatable .= ''."\n". + &color_pick($phase,$role,$item,$choices->{$item}, + $designs->{'links'}{$item}); if ($designs->{'links'}{$item}) { - $datatable.=' '; + $datatable.='    '; } - $datatable .= '
'; foreach my $item (@{$logintext}) { - $color_menu .= ''; + my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item}); + $color_menu .= ''. + ''; } $color_menu .= '
'.$choices->{$item}; - my $color = $designs->{'logintext'}{$item} ? $designs->{'logintext'}{$item} : $defaults->{'logintext'}{$item}; - $color_menu .= '
'.$link; + if ($designs->{'logintext'}{$item}) { + $color_menu .= '    '; + } + $color_menu .= '
 

'; return $color_menu; @@ -2105,15 +1323,17 @@ sub image_changes { my ($is_custom,$alt_text,$img_import,$showfile,$fullsize,$role,$img,$imgfile,$logincolors) = @_; my $output; if ($img eq 'login') { - $output = ''.$logincolors; # suppress image for Log-in header + # suppress image for Log-in header } elsif (!$is_custom) { if ($img ne 'domlogo') { - $output = &mt('Default image:').'
'; + $output .= &mt('Default image:').'
'; } else { - $output = &mt('Default in use:').'
'; + $output .= &mt('Default in use:').'
'; } } - if ($img ne 'login') { + if ($img eq 'login') { # suppress image for Log-in header + $output .= ''.$logincolors; + } else { if ($img_import) { $output .= ''; } @@ -2125,12 +1345,20 @@ sub image_changes { $role.'_del_'.$img.'" value="1" />'.&mt('Delete?'). ' '.&mt('Replace:').'
'; } else { - $output .= ''.$logincolors.&mt('Upload:').'
'; + $output .= ''.$logincolors.&mt('Upload:').'
'; } } return $output; } +sub color_pick { + my ($phase,$role,$item,$desc,$curcol) = @_; + my $link = ''.$desc.''; + return $link; +} + sub print_quotas { my ($dom,$settings,$rowtotal,$action) = @_; my $context; @@ -2139,37 +1367,29 @@ sub print_quotas { } else { $context = $action; } - my ($datatable,$defaultquota,$authorquota,@usertools,@options,%validations); + my ($datatable,$defaultquota,@usertools,@options,%validations); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); my $typecount = 0; my ($css_class,%titles); if ($context eq 'requestcourses') { - @usertools = ('official','unofficial','community','textbook'); + @usertools = ('official','unofficial','community'); @options =('norequest','approval','validate','autolimit'); %validations = &Apache::lonnet::auto_courserequest_checks($dom); %titles = &courserequest_titles(); - } elsif ($context eq 'requestauthor') { - @usertools = ('author'); - @options = ('norequest','approval','automatic'); - %titles = &authorrequest_titles(); } else { - @usertools = ('aboutme','blog','webdav','portfolio'); + @usertools = ('aboutme','blog','portfolio'); %titles = &tool_titles(); } if (ref($types) eq 'ARRAY') { foreach my $type (@{$types}) { - my ($currdefquota,$currauthorquota); - unless (($context eq 'requestcourses') || - ($context eq 'requestauthor')) { + my $currdefquota; + unless ($context eq 'requestcourses') { if (ref($settings) eq 'HASH') { if (ref($settings->{defaultquota}) eq 'HASH') { - $currdefquota = $settings->{defaultquota}->{$type}; + $currdefquota = $settings->{defaultquota}->{$type}; } else { $currdefquota = $settings->{$type}; } - if (ref($settings->{authorquota}) eq 'HASH') { - $currauthorquota = $settings->{authorquota}->{$type}; - } } } if (defined($usertypes->{$type})) { @@ -2233,28 +1453,6 @@ sub print_quotas { $cell{$item} .= $titles{'unlimited'}; } } - } elsif ($context eq 'requestauthor') { - my $curroption; - if (ref($settings) eq 'HASH') { - $curroption = $settings->{$type}; - } - if (!$curroption) { - $curroption = 'norequest'; - } - foreach my $option (@options) { - my $val = $option; - if ($option eq 'norequest') { - $val = 0; - } - my $checked = ''; - if ($option eq $curroption) { - $checked = ' checked="checked"'; - } - $datatable .= '  '; - } } else { my $checked = 'checked="checked" '; if (ref($settings) eq 'HASH') { @@ -2280,35 +1478,25 @@ sub print_quotas { $datatable .= ''; } $datatable .= ''; - unless (($context eq 'requestcourses') || - ($context eq 'requestauthor')) { + unless ($context eq 'requestcourses') { $datatable .= - ''. - ''.&mt('Portfolio').': '. + ''. ''.(' ' x 2). - ''.&mt('Authoring').': '. - ''; + '" size="5" /> Mb'; } $datatable .= ''; } } } - unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { + unless ($context eq 'requestcourses') { $defaultquota = '20'; - $authorquota = '500'; if (ref($settings) eq 'HASH') { if (ref($settings->{'defaultquota'}) eq 'HASH') { $defaultquota = $settings->{'defaultquota'}->{'default'}; } elsif (defined($settings->{'default'})) { $defaultquota = $settings->{'default'}; } - if (ref($settings->{'authorquota'}) eq 'HASH') { - $authorquota = $settings->{'authorquota'}->{'default'}; - } } } $typecount ++; @@ -2371,28 +1559,6 @@ sub print_quotas { $defcell{$item} .= $titles{'unlimited'}; } } - } elsif ($context eq 'requestauthor') { - my $curroption; - if (ref($settings) eq 'HASH') { - $curroption = $settings->{'default'}; - } - if (!$curroption) { - $curroption = 'norequest'; - } - foreach my $option (@options) { - my $val = $option; - if ($option eq 'norequest') { - $val = 0; - } - my $checked = ''; - if ($option eq $curroption) { - $checked = ' checked="checked"'; - } - $datatable .= '  '; - } } else { my $checked = 'checked="checked" '; if (ref($settings) eq 'HASH') { @@ -2418,20 +1584,16 @@ sub print_quotas { $datatable .= ''; } $datatable .= ''; - unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) { - $datatable .= ''. - ''.&mt('Portfolio').': '. + unless ($context eq 'requestcourses') { + $datatable .= ''. ''.(' ' x2). - ''.&mt('Authoring').': '. - ''; + $defaultquota.'" size="5" /> Mb'; } $datatable .= ''; $typecount ++; $css_class = $typecount%2?' class="LC_odd_row"':''; $datatable .= ''. - ''.&mt('LON-CAPA Advanced Users').'
'; + ''.&mt('LON-CAPA Advanced Users').' '; if ($context eq 'requestcourses') { $datatable .= &mt('(overrides affiliation, if set)'). ''. @@ -2500,33 +1662,6 @@ sub print_quotas { $advcell{$item} .= $titles{'unlimited'}; } } - } elsif ($context eq 'requestauthor') { - my $curroption; - if (ref($settings) eq 'HASH') { - $curroption = $settings->{'_LC_adv'}; - } - my $checked = ''; - if ($curroption eq '') { - $checked = ' checked="checked"'; - } - $datatable .= '  '; - foreach my $option (@options) { - my $val = $option; - if ($option eq 'norequest') { - $val = 0; - } - my $checked = ''; - if ($val eq $curroption) { - $checked = ' checked="checked"'; - } - $datatable .= '  '; - } } else { my $checked = 'checked="checked" '; if (ref($settings) eq 'HASH') { @@ -2556,612 +1691,88 @@ sub print_quotas { return $datatable; } -sub print_requestmail { - my ($dom,$action,$settings,$rowtotal,$customcss,$rowstyle) = @_; - my ($now,$datatable,%currapp); +sub print_courserequestmail { + my ($dom,$settings,$rowtotal) = @_; + my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows); $now = time; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'notify'}) eq 'HASH') { - if ($settings->{'notify'}{'approval'} ne '') { - map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'}); + $rows = 0; + %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now); + foreach my $server (keys(%dompersonnel)) { + foreach my $user (sort(keys(%{$dompersonnel{$server}}))) { + my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user); + if (!grep(/^$uname:$udom$/,@domcoord)) { + push(@domcoord,$uname.':'.$udom); } } } - my $numinrow = 2; - my $css_class; - if ($$rowtotal%2) { - $css_class = 'LC_odd_row'; - } - if ($customcss) { - $css_class .= " $customcss"; - } - $css_class =~ s/^\s+//; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowstyle) { - $css_class .= ' style="'.$rowstyle.'"'; - } - my $text; - if ($action eq 'requestcourses') { - $text = &mt('Receive notification of course requests requiring approval'); - } elsif ($action eq 'requestauthor') { - $text = &mt('Receive notification of Authoring Space requests requiring approval'); - } else { - $text = &mt('Receive notification of queued requests for self-created user accounts requiring approval'); - } - $datatable = ''. - ' '.$text.''. - ' '; - my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox', - $action.'notifyapproval',%currapp); - if ($numdc > 0) { - $datatable .= $table; - } else { - $datatable .= &mt('There are no active Domain Coordinators'); - } - $datatable .=''; - return $datatable; -} - -sub print_studentcode { - my ($settings,$rowtotal) = @_; - my $rownum = 0; - my ($output,%current); - my @crstypes = ('official','unofficial','community','textbook'); if (ref($settings) eq 'HASH') { - if (ref($settings->{'uniquecode'}) eq 'HASH') { - foreach my $type (@crstypes) { - $current{$type} = $settings->{'uniquecode'}{$type}; - } - } - } - $output .= ''. - ''.&mt('Generate unique six character code as course identifier?').''. - ''; - foreach my $type (@crstypes) { - my $check = ' '; - if ($current{$type}) { - $check = ' checked="checked" '; - } - $output .= ''.(' 'x2).' '; - } - $output .= ''; - $$rowtotal ++; - return $output; -} - -sub print_textbookcourses { - my ($dom,$type,$settings,$rowtotal) = @_; - my $rownum = 0; - my $css_class; - my $itemcount = 1; - my $maxnum = 0; - my $bookshash; - if (ref($settings) eq 'HASH') { - $bookshash = $settings->{$type}; - } - my %ordered; - if (ref($bookshash) eq 'HASH') { - foreach my $item (keys(%{$bookshash})) { - if (ref($bookshash->{$item}) eq 'HASH') { - my $num = $bookshash->{$item}{'order'}; - $ordered{$num} = $item; + if (ref($settings->{'notify'}) eq 'HASH') { + if ($settings->{'notify'}{'approval'} ne '') { + @currapproval = split(',',$settings->{'notify'}{'approval'}); } } } - my $confname = $dom.'-domainconfig'; - my $switchserver = &check_switchserver($dom,$confname); - my $maxnum = scalar(keys(%ordered)); - my $datatable; - if (keys(%ordered)) { - my @items = sort { $a <=> $b } keys(%ordered); - for (my $i=0; $i<@items; $i++) { - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $key = $ordered{$items[$i]}; - my %coursehash=&Apache::lonnet::coursedescription($key); - my $coursetitle = $coursehash{'description'}; - my ($subject,$title,$author,$publisher,$image,$imgsrc,$cdom,$cnum); - if (ref($bookshash->{$key}) eq 'HASH') { - $subject = $bookshash->{$key}->{'subject'}; - $title = $bookshash->{$key}->{'title'}; - if ($type eq 'textbooks') { - $publisher = $bookshash->{$key}->{'publisher'}; - $author = $bookshash->{$key}->{'author'}; - $image = $bookshash->{$key}->{'image'}; - if ($image ne '') { - my ($path,$imagefile) = ($image =~ m{^(.+)/([^/]+)$}); - my $imagethumb = "$path/tn-".$imagefile; - $imgsrc = ''.&mt('Textbook image').''; - } - } - } - my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$type".'_'."$key','$type'".');"'; - $datatable .= '' - .''.(' 'x2). - ''. - ''. - ''.&mt('Subject:').' '. - (' 'x2). - ''.&mt('Title:').' '; - if ($type eq 'textbooks') { - $datatable .= (' 'x2). - ''.&mt('Publisher:').' '. - (' 'x2). - ''.&mt('Author(s):').' '. - (' 'x2). - ''.&mt('Thumbnail:'); - if ($image) { - $datatable .= $imgsrc. - ' '. - ' '.&mt('Replace:').' '; - } - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } + if (@currapproval) { + foreach my $dc (@currapproval) { + unless (grep(/^\Q$dc\E$/,@domcoord)) { + push(@domcoord,$dc); } - $datatable .= ' '. - ''.&mt('LON-CAPA course:').' '. - $coursetitle.''."\n"; - $itemcount ++; - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderBooks(this.form,'."'$type"."_addbook_pos','$type'".');"'; - $datatable .= ''."\n". - ''."\n". - ' '."\n". - ''.&mt('Add').''."\n". - ''. - ''.&mt('Subject:').' '."\n". - (' 'x2). - ''.&mt('Title:').' '."\n". - (' 'x2); - if ($type eq 'textbooks') { - $datatable .= ''.&mt('Publisher:').' '."\n". - (' 'x2). - ''.&mt('Author(s):').' '."\n". - (' 'x2). - ''.&mt('Image:').' '; - if ($switchserver) { - $datatable .= &mt('Upload to library server: [_1]',$switchserver); - } else { - $datatable .= ''; - } - $datatable .= ''."\n"; - } - $datatable .= ''.&mt('LON-CAPA course:').' '. - &Apache::loncommon::select_dom_form($env{'request.role.domain'},$type.'_addbook_cdom'). - ''. - &Apache::loncommon::selectcourse_link - ('display',$type.'_addbook_cnum',$type.'_addbook_cdom',undef,undef,undef,'Course'). - ''."\n". - ''."\n"; - $itemcount ++; - return $datatable; -} - -sub textbookcourses_javascript { - my ($settings) = @_; - return unless(ref($settings) eq 'HASH'); - my (%ordered,%total,%jstext); - foreach my $type ('textbooks','templates') { - $total{$type} = 0; - if (ref($settings->{$type}) eq 'HASH') { - foreach my $item (keys(%{$settings->{$type}})) { - if (ref($settings->{$type}->{$item}) eq 'HASH') { - my $num = $settings->{$type}->{$item}{'order'}; - $ordered{$type}{$num} = $item; - } - } - $total{$type} = scalar(keys(%{$settings->{$type}})); - } - my @jsarray = (); - foreach my $item (sort {$a <=> $b } (keys(%{$ordered{$type}}))) { - push(@jsarray,$ordered{$type}{$item}); } - $jstext{$type} = ' var '.$type.' = Array('."'".join("','",@jsarray)."'".');'."\n"; } - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub wafproxy_javascript { - my ($dom) = @_; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub autoupdate_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub autoenroll_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub saml_javascript { - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub ipaccess_javascript { - my ($settings) = @_; - my (%ordered,$total,%jstext); - $total = 0; - if (ref($settings) eq 'HASH') { - foreach my $item (keys(%{$settings})) { - if (ref($settings->{$item}) eq 'HASH') { - my $num = $settings->{$item}{'order'}; - $ordered{$num} = $item; - } - } - $total = scalar(keys(%{$settings})); - } - my @jsarray = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@jsarray,$ordered{$item}); - } - my $jstext = ' var ipaccess = Array('."'".join("','",@jsarray)."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT + $datatable .=''; + $$rowtotal += $rows; + return $datatable; } sub print_autoenroll { my ($dom,$settings,$rowtotal) = @_; my $autorun = &Apache::lonnet::auto_run(undef,$dom), - my ($defdom,$runon,$runoff,$coownerson,$coownersoff, - $failsafe,$autofailsafe,$failsafesty,%failsafechecked); - $failsafesty = 'none'; - %failsafechecked = ( - off => ' checked="checked"', - ); + my ($defdom,$runon,$runoff,$coownerson,$coownersoff); if (ref($settings) eq 'HASH') { if (exists($settings->{'run'})) { if ($settings->{'run'} eq '0') { @@ -3195,25 +1806,6 @@ sub print_autoenroll { if (exists($settings->{'sender_domain'})) { $defdom = $settings->{'sender_domain'}; } - if (exists($settings->{'failsafe'})) { - $failsafe = $settings->{'failsafe'}; - if ($failsafe eq 'zero') { - $failsafechecked{'zero'} = ' checked="checked"'; - $failsafechecked{'off'} = ''; - $failsafesty = 'inline-block'; - } elsif ($failsafe eq 'any') { - $failsafechecked{'any'} = ' checked="checked"'; - $failsafechecked{'off'} = ''; - } - $autofailsafe = $settings->{'autofailsafe'}; - } elsif (exists($settings->{'autofailsafe'})) { - $autofailsafe = $settings->{'autofailsafe'}; - if ($autofailsafe ne '') { - $failsafechecked{'zero'} = ' checked="checked"'; - $failsafe = 'zero'; - $failsafechecked{'off'} = ''; - } - } } else { if ($autorun) { $runon = ' checked="checked" '; @@ -3249,93 +1841,56 @@ sub print_autoenroll { $coownerson.' value="1" />'.&mt('Yes').' '. ''. - ''. - ''.&mt('Failsafe for no drops when institutional data missing').''. - ''. - '    '. - '
'. - ''. - '
'. - ''. - &mt('Threshold for number of students in section to drop: [_1]', - ''). - '
'; - $$rowtotal += 4; + ''; + $$rowtotal += 3; return $datatable; } sub print_autoupdate { my ($position,$dom,$settings,$rowtotal) = @_; - my ($enable,$datatable); + my $datatable; if ($position eq 'top') { - my %choices = &Apache::lonlocal::texthash ( - run => 'Auto-update active?', - classlists => 'Update information in classlists?', - unexpired => 'Skip updates for users without active or future roles?', - lastactive => 'Skip updates for inactive users?', - ); - my $itemcount = 0; 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 = ' '; + } } - $enable = ''. - ''.&mt($choices{'run'}).''. - ' '. ''. + $updateoff.'value="0" />'.&mt('No').'
'. + ''. + ''.&mt($title{'classlists'}).''. + ''. + ' '. + ''. ''; - my @toggles = ('classlists','unexpired'); - my %defaultchecked = ('classlists' => 'off', - 'unexpired' => 'off' - ); - $$rowtotal ++; - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount,'','','left','no'); - $datatable = $enable.$datatable; - $$rowtotal += $itemcount; - my $lastactiveon = ' '; - my $lastactiveoff = ' checked="checked" '; - my $lastactivestyle = 'none'; - my $lastactivedays; - my $onclick = ' onclick="javascript:toggleLastActiveDays(this.form);"'; - if (ref($settings) eq 'HASH') { - if ($settings->{'lastactive'} =~ /^\d+$/) { - $lastactiveon = $lastactiveoff; - $lastactiveoff = ' '; - $lastactivestyle = 'inline-block'; - $lastactivedays = $settings->{'lastactive'}; - } - } - my $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$choices{'lastactive'}.''. - ''. - ' '. - '
'. - ': '.&mt('inactive = no activity in last [_1] days', - ''). - ''. - ''; - $$rowtotal ++; + $$rowtotal += 2; } elsif ($position eq 'middle') { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); my $numinrow = 3; my $locknamesettings; $datatable .= &insttypes_row($settings,$types,$usertypes, $dom,$numinrow,$othertitle, - 'lockablenames',$rowtotal); + 'lockablenames'); $$rowtotal ++; } else { my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); @@ -3362,7 +1917,8 @@ sub print_autoupdate { sub print_autocreate { my ($dom,$settings,$rowtotal) = @_; - my (%createon,%createoff,%currhash); + my (%createon,%createoff); + my $curr_dc; my @types = ('xml','req'); if (ref($settings) eq 'HASH') { foreach my $item (@types) { @@ -3375,9 +1931,7 @@ sub print_autocreate { } } } - if ($settings->{'xmldc'} ne '') { - $currhash{$settings->{'xmldc'}} = 1; - } + $curr_dc = $settings->{'xmldc'}; } else { foreach my $item (@types) { $createoff{$item} = ' checked="checked" '; @@ -3385,7 +1939,6 @@ sub print_autocreate { } } $$rowtotal += 2; - my $numinrow = 2; my $datatable=''. ''.&mt('Create pending official courses from XML files').''. ' '. ''; - my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio', - 'autocreate_xmldc',%currhash); - $datatable .= ''; + my ($numdc,$dctable) = &active_dc_picker($dom,$curr_dc); if ($numdc > 1) { - $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)'). - ''; + $datatable .= ''. + &mt('Course creation processed as: (choose Dom. Coord.)'). + ''.$dctable.''; + $$rowtotal ++ ; } else { - $datatable .= &mt('Course creation processed as:'). - ''; + $datatable .= $dctable.''; } - $datatable .= $dctable.''; - $$rowtotal += $rows; return $datatable; } sub print_directorysrch { - my ($position,$dom,$settings,$rowtotal) = @_; - my $datatable; - if ($position eq 'top') { - my $instsrchon = ' '; - my $instsrchoff = ' checked="checked" '; - my ($exacton,$containson,$beginson); - my $instlocalon = ' '; - my $instlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'available'} eq '1') { - $instsrchon = $instsrchoff; - $instsrchoff = ' '; - } - if ($settings->{'localonly'} eq '1') { - $instlocalon = $instlocaloff; - $instlocaloff = ' '; - } - if (ref($settings->{'searchtypes'}) eq 'ARRAY') { - foreach my $type (@{$settings->{'searchtypes'}}) { - if ($type eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($type eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($type eq 'begins') { - $beginson = ' checked="checked" '; - } - } - } else { - if ($settings->{'searchtypes'} eq 'exact') { - $exacton = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'contains') { - $containson = ' checked="checked" '; - } elsif ($settings->{'searchtypes'} eq 'specify') { + my ($dom,$settings,$rowtotal) = @_; + my $srchon = ' '; + my $srchoff = ' checked="checked" '; + my ($exacton,$containson,$beginson); + my $localon = ' '; + my $localoff = ' checked="checked" '; + if (ref($settings) eq 'HASH') { + if ($settings->{'available'} eq '1') { + $srchon = $srchoff; + $srchoff = ' '; + } + if ($settings->{'localonly'} eq '1') { + $localon = $localoff; + $localoff = ' '; + } + if (ref($settings->{'searchtypes'}) eq 'ARRAY') { + foreach my $type (@{$settings->{'searchtypes'}}) { + if ($type eq 'exact') { $exacton = ' checked="checked" '; + } elsif ($type eq 'contains') { $containson = ' checked="checked" '; + } elsif ($type eq 'begins') { + $beginson = ' checked="checked" '; } } - } - my ($searchtitles,$titleorder) = &sorted_searchtitles(); - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - - my $numinrow = 4; - my $cansrchrow = 0; - $datatable=''. - ''.&mt('Institutional directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search institution?').''. - ' '. - ''. - ''; - $$rowtotal += 2; - if (ref($usertypes) eq 'HASH') { - if (keys(%{$usertypes}) > 0) { - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'cansearch', - $rowtotal); - $cansrchrow = 1; + } else { + if ($settings->{'searchtypes'} eq 'exact') { + $exacton = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'contains') { + $containson = ' checked="checked" '; + } elsif ($settings->{'searchtypes'} eq 'specify') { + $exacton = ' checked="checked" '; + $containson = ' checked="checked" '; } } - if ($cansrchrow) { - $$rowtotal ++; - $datatable .= ''; - } else { - $datatable .= ''; + } + my ($searchtitles,$titleorder) = &sorted_searchtitles(); + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); + + my $numinrow = 4; + my $cansrchrow = 0; + my $datatable=''. + ''.&mt('Directory search available?').''. + ' '. + ''. + ''. + ''.&mt('Other domains can search?').''. + ' '. + ''. + ''; + $$rowtotal += 2; + if (ref($usertypes) eq 'HASH') { + if (keys(%{$usertypes}) > 0) { + $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, + $numinrow,$othertitle,'cansearch'); + $cansrchrow = 1; } - $datatable .= ''.&mt('Supported search methods'). - ''; - foreach my $title (@{$titleorder}) { - if (defined($searchtitles->{$title})) { - my $check = ' '; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'searchby'}) eq 'ARRAY') { - if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { - $check = ' checked="checked" '; - } + } + if ($cansrchrow) { + $$rowtotal ++; + $datatable .= ''; + } else { + $datatable .= ''; + } + $datatable .= ''; - $$rowtotal ++; - if ($cansrchrow) { - $datatable .= ''; - } else { - $datatable .= ''; - } - $datatable .= ''. - ''; - $$rowtotal ++; + } + $datatable .= '
'.&mt('Supported search methods'). + ''; + foreach my $title (@{$titleorder}) { + if (defined($searchtitles->{$title})) { + my $check = ' '; + if (ref($settings) eq 'HASH') { + if (ref($settings->{'searchby'}) eq 'ARRAY') { + if (grep(/^\Q$title\E$/,@{$settings->{'searchby'}})) { + $check = ' checked="checked" '; } } - $datatable .= ''; } + $datatable .= ''; } - $datatable .= '
'. - ''. + '
'.&mt('Search latitude').''. - ' '. - ' '. - '
'; + $$rowtotal ++; + if ($cansrchrow) { + $datatable .= ''; } else { - my $domsrchon = ' checked="checked" '; - my $domsrchoff = ' '; - my $domlocalon = ' '; - my $domlocaloff = ' checked="checked" '; - if (ref($settings) eq 'HASH') { - if ($settings->{'lclocalonly'} eq '1') { - $domlocalon = $domlocaloff; - $domlocaloff = ' '; - } - if ($settings->{'lcavailable'} eq '0') { - $domsrchoff = $domsrchon; - $domsrchon = ' '; - } - } - $datatable=''. - ''.&mt('LON-CAPA directory search available?').''. - ' '. - ''. - ''. - ''.&mt('Other domains can search LON-CAPA domain?').''. - ' '. - ''. - ''; - $$rowtotal += 2; + $datatable .= ''; } + $datatable .= ''.&mt('Search latitude').''. + ''. + ' '. + ' '. + ''; + $$rowtotal ++; return $datatable; } sub print_contacts { - my ($position,$dom,$settings,$rowtotal) = @_; + my ($dom,$settings,$rowtotal) = @_; my $datatable; my @contacts = ('adminemail','supportemail'); - my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield, - $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions,@mailings,%lonstatus); - if ($position eq 'top') { - if (ref($settings) eq 'HASH') { - foreach my $item (@contacts) { - if (exists($settings->{$item})) { - $to{$item} = $settings->{$item}; - } - } - } - } elsif ($position eq 'middle') { - @mailings = ('errormail','packagesmail','lonstatusmail','requestsmail', - 'updatesmail','idconflictsmail','hostipmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - } elsif ($position eq 'lower') { - if (ref($settings) eq 'HASH') { - if (ref($settings->{'lonstatus'}) eq 'HASH') { - %lonstatus = %{$settings->{'lonstatus'}}; - } - } - } else { - @mailings = ('helpdeskmail','otherdomsmail'); - foreach my $type (@mailings) { - $otheremails{$type} = ''; - } - $bccemails{'helpdeskmail'} = ''; - $bccemails{'otherdomsmail'} = ''; - $includestr{'helpdeskmail'} = ''; - $includestr{'otherdomsmail'} = ''; - ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields(); + my (%checked,%to,%otheremails,%bccemails); + my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail', + 'requestsmail'); + foreach my $type (@mailings) { + $otheremails{$type} = ''; } + $bccemails{'helpdeskmail'} = ''; if (ref($settings) eq 'HASH') { - unless (($position eq 'top') || ($position eq 'lower')) { - foreach my $type (@mailings) { - if (exists($settings->{$type})) { - if (ref($settings->{$type}) eq 'HASH') { - foreach my $item (@contacts) { - if ($settings->{$type}{$item}) { - $checked{$type}{$item} = ' checked="checked" '; - } - } - $otheremails{$type} = $settings->{$type}{'others'}; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - } - } elsif ($type eq 'lonstatusmail') { - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - } + foreach my $item (@contacts) { + if (exists($settings->{$item})) { + $to{$item} = $settings->{$item}; } } - if ($position eq 'bottom') { - foreach my $type (@mailings) { - $bccemails{$type} = $settings->{$type}{'bcc'}; - if ($settings->{$type}{'include'} ne '') { - ($includeloc{$type},$includestr{$type}) = split(/:/,$settings->{$type}{'include'},2); - $includestr{$type} = &unescape($includestr{$type}); - } - } - if (ref($settings->{'helpform'}) eq 'HASH') { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = $settings->{'helpform'}{$field}; + foreach my $type (@mailings) { + if (exists($settings->{$type})) { + if (ref($settings->{$type}) eq 'HASH') { + foreach my $item (@contacts) { + if ($settings->{$type}{$item}) { + $checked{$type}{$item} = ' checked="checked" '; + } } - } - if (exists($settings->{'helpform'}{'maxsize'})) { - $maxsize = $settings->{'helpform'}{'maxsize'}; - } else { - $maxsize = '1.0'; - } - } else { - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; + $otheremails{$type} = $settings->{$type}{'others'}; + if ($type eq 'helpdeskmail') { + $bccemails{$type} = $settings->{$type}{'bcc'}; } } - $maxsize = '1.0'; + } elsif ($type eq 'lonstatusmail') { + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; } } } else { - if ($position eq 'top') { - $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; - $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; - $checked{'errormail'}{'adminemail'} = ' checked="checked" '; - $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; - $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'updatesmail'}{'adminemail'} = ' checked="checked" '; - $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" '; - $checked{'hostipmail'}{'adminemail'} = ' checked="checked" '; - } elsif ($position eq 'bottom') { - $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; - $checked{'otherdomsmail'}{'supportemail'} = ' checked="checked" '; - if (ref($fields) eq 'ARRAY') { - foreach my $field (@{$fields}) { - $currfield{$field} = 'yes'; - } - } - $maxsize = '1.0'; - } + $to{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'}; + $to{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'}; + $checked{'errormail'}{'adminemail'} = ' checked="checked" '; + $checked{'packagesmail'}{'adminemail'} = ' checked="checked" '; + $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" '; + $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; + $checked{'requestsmail'}{'adminemail'} = ' checked="checked" '; } my ($titles,$short_titles) = &contact_titles(); my $rownum = 0; my $css_class; - if ($position eq 'top') { - foreach my $item (@contacts) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.$titles->{$item}. - ''. - ''; - $rownum ++; - } - } elsif ($position eq 'bottom') { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''.&mt('Extra helpdesk form fields:').'
'. - &mt('(e-mail, subject, and description always shown)'). - ''; - if ((ref($fields) eq 'ARRAY') && (ref($fieldtitles) eq 'HASH') && - (ref($fieldoptions) eq 'HASH') && (ref($possoptions) eq 'HASH')) { - $datatable .= ''; - foreach my $field (@{$fields}) { - $datatable .= ''. - ''; - } - $datatable .= '
'.&mt('Field').''.&mt('Status').'
'.$fieldtitles->{$field}; - if (($field eq 'screenshot') || ($field eq 'cc')) { - $datatable .= ' '.&mt('(logged-in users)'); - } - $datatable .=''; - my $clickaction; - if ($field eq 'screenshot') { - $clickaction = ' onclick="screenshotSize(this);"'; - } - if (ref($possoptions->{$field}) eq 'ARRAY') { - foreach my $option (@{$possoptions->{$field}}) { - my $checked; - if ($currfield{$field} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''.(' 'x2); - } - } - if ($field eq 'screenshot') { - my $display; - if ($currfield{$field} eq 'no') { - $display = ' style="display:none"'; - } - $datatable .= '
'.&mt('Maximum size for upload (MB)').''. - ''; - } - $datatable .= '
'; - } - $datatable .= ''."\n"; + foreach my $item (@contacts) { $rownum ++; + $css_class = $rownum%2?' class="LC_odd_row"':''; + $datatable .= ''. + ''.$titles->{$item}. + ''. + ''; } - unless (($position eq 'top') || ($position eq 'lower')) { - foreach my $type (@mailings) { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$type}.': '. - ''; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - $datatable .= '
'.&mt('E-mail recipient(s)').''; - } - $datatable .= ''; - foreach my $item (@contacts) { - $datatable .= ' '; - } - $datatable .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - if (($type eq 'helpdeskmail') || ($type eq 'otherdomsmail')) { - foreach my $loc ('s','b') { - if ($includeloc{$type} eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $datatable .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'; - } - $datatable .= ''."\n"; - $rownum ++; - } - } - if ($position eq 'middle') { - my %choices; - my $corelink = &core_link_msu(); - $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',$corelink); - $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]', - $corelink); - $choices{'reportstatus'} = &mt('E-mail status if errors above threshold to [_1]',$corelink); - my @toggles = ('reporterrors','reportupdates','reportstatus'); - my %defaultchecked = ('reporterrors' => 'on', - 'reportupdates' => 'on', - 'reportstatus' => 'on'); - (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$rownum); - $datatable .= $reports; - } elsif ($position eq 'lower') { - my (%current,%excluded,%weights); - my ($defaults,$names) = &Apache::loncommon::lon_status_items(); - if ($lonstatus{'threshold'} =~ /^\d+$/) { - $current{'errorthreshold'} = $lonstatus{'threshold'}; - } else { - $current{'errorthreshold'} = $defaults->{'threshold'}; - } - if ($lonstatus{'sysmail'} =~ /^\d+$/) { - $current{'errorsysmail'} = $lonstatus{'sysmail'}; - } else { - $current{'errorsysmail'} = $defaults->{'sysmail'}; - } - if (ref($lonstatus{'weights'}) eq 'HASH') { - foreach my $type ('E','W','N','U') { - if ($lonstatus{'weights'}{$type} =~ /^\d+$/) { - $weights{$type} = $lonstatus{'weights'}{$type}; - } else { - $weights{$type} = $defaults->{$type}; - } - } - } else { - foreach my $type ('E','W','N','U') { - $weights{$type} = $defaults->{$type}; - } - } - if (ref($lonstatus{'excluded'}) eq 'ARRAY') { - if (@{$lonstatus{'excluded'}} > 0) { - map {$excluded{$_} = 1; } @{$lonstatus{'excluded'}}; - } - } - foreach my $item ('errorthreshold','errorsysmail') { - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - $titles->{$item}. - ''. - ''; - $rownum ++; - } + foreach my $type (@mailings) { + $rownum ++; $css_class = $rownum%2?' class="LC_odd_row"':''; $datatable .= ''. + ''. + $titles->{$type}.': '. ''. - ''.$titles->{'errorweights'}. - ''; - foreach my $type ('E','W','N','U') { - $datatable .= ''; - } - $datatable .= '
'.$names->{$type}.'
'. - '
'; - $rownum ++; - $css_class = $rownum%2?' class="LC_odd_row"':''; - $datatable .= ''. - $titles->{'errorexcluded'}.''. - ''; - my $numinrow = 4; - my @ids = sort(values(%Apache::lonnet::serverhomeIDs)); - for (my $i=0; $i<@ids; $i++) { - my $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - my $check; - if ($excluded{$ids[$i]}) { - $check = ' checked="checked" '; - } - $datatable .= ''; - } - my $colsleft = $numinrow - @ids%($numinrow); - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; - } - $datatable .= '
'. - ''. - '  
'; - $rownum ++; - } elsif ($position eq 'bottom') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my (@posstypes,%usertypeshash); - if (ref($types) eq 'ARRAY') { - @posstypes = @{$types}; - } - if (@posstypes) { - if (ref($usertypes) eq 'HASH') { - %usertypeshash = %{$usertypes}; - } - my @overridden; - my $numinrow = 4; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'overrides'}) eq 'HASH') { - foreach my $key (sort(keys(%{$settings->{'overrides'}}))) { - if (ref($settings->{'overrides'}{$key}) eq 'HASH') { - push(@overridden,$key); - foreach my $item (@contacts) { - if ($settings->{'overrides'}{$key}{$item}) { - $checked{'override_'.$key}{$item} = ' checked="checked" '; - } - } - $otheremails{'override_'.$key} = $settings->{'overrides'}{$key}{'others'}; - $bccemails{'override_'.$key} = $settings->{'overrides'}{$key}{'bcc'}; - $includeloc{'override_'.$key} = ''; - $includestr{'override_'.$key} = ''; - if ($settings->{'overrides'}{$key}{'include'} ne '') { - ($includeloc{'override_'.$key},$includestr{'override_'.$key}) = - split(/:/,$settings->{'overrides'}{$key}{'include'},2); - $includestr{'override_'.$key} = &unescape($includestr{'override_'.$key}); - } - } - } - } - } - my $customclass = 'LC_helpdesk_override'; - my $optionsprefix = 'LC_options_helpdesk_'; - - my $onclicktypes = "toggleHelpdeskRow(this.form,'overrides','$customclass','$optionsprefix');"; - - $datatable .= &insttypes_row($settings,$types,$usertypes,$dom, - $numinrow,$othertitle,'overrides', - \$rownum,$onclicktypes,$customclass); - $rownum ++; - $usertypeshash{'default'} = $othertitle; - foreach my $status (@posstypes) { - my $css_class; - if ($rownum%2) { - $css_class = 'LC_odd_row '; - } - $css_class .= $customclass; - my $rowid = $optionsprefix.$status; - my $hidden = 1; - my $currstyle = 'display:none'; - if (grep(/^\Q$status\E$/,@overridden)) { - $currstyle = 'display:table-row'; - $hidden = 0; - } - my $key = 'override_'.$status; - $datatable .= &overridden_helpdesk($checked{$key},$otheremails{$key},$bccemails{$key}, - $includeloc{$key},$includestr{$key},$status,$rowid, - $usertypeshash{$status},$css_class,$currstyle, - \@contacts,$short_titles); - unless ($hidden) { - $rownum ++; - } - } + ''; + foreach my $item (@contacts) { + $datatable .= ' '; + } + $datatable .= '
'.&mt('Others').':  '. + ''; + if ($type eq 'helpdeskmail') { + $datatable .= '
'.&mt('Bcc:').(' 'x6). + ''; } + $datatable .= ''."\n"; } $$rowtotal += $rownum; return $datatable; } -sub core_link_msu { - return &Apache::loncommon::modal_link('http://loncapa.org/core.html', - &mt('LON-CAPA core group - MSU'),600,500); -} - -sub overridden_helpdesk { - my ($checked,$otheremails,$bccemails,$includeloc,$includestr,$type,$rowid, - $typetitle,$css_class,$rowstyle,$contacts,$short_titles) = @_; - my $class = 'LC_left_item'; - if ($css_class) { - $css_class = ' class="'.$css_class.'"'; - } - if ($rowid) { - $rowid = ' id="'.$rowid.'"'; - } - if ($rowstyle) { - $rowstyle = ' style="'.$rowstyle.'"'; - } - my ($output,$description); - $description = &mt('Helpdesk requests from: [_1] in this domain (overrides default)',"$typetitle"); - $output = ''. - "$description\n". - ''. - '
'.&mt('E-mail recipient(s)').''. - ''; - if (ref($contacts) eq 'ARRAY') { - foreach my $item (@{$contacts}) { - my $check; - if (ref($checked) eq 'HASH') { - $check = $checked->{$item}; - } - my $title; - if (ref($short_titles) eq 'HASH') { - $title = $short_titles->{$item}; - } - $output .= ' '; - } - } - $output .= '
'.&mt('Others').':  '. - ''; - my %locchecked; - foreach my $loc ('s','b') { - if ($includeloc eq $loc) { - $locchecked{$loc} = ' checked="checked"'; - last; - } - } - $output .= '
'.&mt('Bcc:').(' 'x6). - '
'. - '
'.&mt('Optional added text').''. - &mt('Text automatically added to e-mail:').' '. - '
'. - ''.&mt('Location:').' '. - ''. - (' 'x2). - ''. - '
'. - ''."\n"; - return $output; -} - -sub contacts_javascript { - return <<"ENDSCRIPT"; - - - -ENDSCRIPT -} - sub print_helpsettings { - my ($position,$dom,$settings,$rowtotal) = @_; - my $confname = $dom.'-domainconfig'; - my $formname = 'display'; - my ($datatable,$itemcount); - if ($position eq 'top') { - $itemcount = 1; - my (%choices,%defaultchecked,@toggles); - $choices{'submitbugs'} = &mt('Display link to: [_1]?', - &Apache::loncommon::modal_link('http://bugs.loncapa.org', - &mt('LON-CAPA bug tracker'),600,500)); - %defaultchecked = ('submitbugs' => 'on'); - @toggles = ('submitbugs'); - ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $$rowtotal ++; - } else { - my $css_class; - my %existing=&Apache::lonnet::dump('roles',$dom,$confname,'rolesdef_'); - my (%customroles,%ordered,%current); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'adhoc'}) eq 'HASH') { - %current = %{$settings->{'adhoc'}}; - } - } - my $count = 0; - foreach my $key (sort(keys(%existing))) { - if ($key=~/^rolesdef\_(\w+)$/) { - my $rolename = $1; - my (%privs,$order); - ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key}); - $customroles{$rolename} = \%privs; - if (ref($current{$rolename}) eq 'HASH') { - $order = $current{$rolename}{'order'}; - } - if ($order eq '') { - $order = $count; - } - $ordered{$order} = $rolename; - $count++; - } - } - my $maxnum = scalar(keys(%ordered)); - my @roles_by_num = (); - foreach my $item (sort {$a <=> $b } (keys(%ordered))) { - push(@roles_by_num,$item); - } - my $context = 'domprefs'; - my $crstype = 'Course'; - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my @accesstypes = ('all','dh','da','none'); - my ($numstatustypes,@jsarray); - if (ref($types) eq 'ARRAY') { - if (@{$types} > 0) { - $numstatustypes = scalar(@{$types}); - push(@accesstypes,'status'); - @jsarray = ('bystatus'); - } - } - my %domhelpdesk = &Apache::lonnet::get_active_domroles($dom,['dh','da']); - if (keys(%domhelpdesk)) { - push(@accesstypes,('inc','exc')); - push(@jsarray,('notinc','notexc')); - } - my $hiddenstr = join("','",@jsarray); - $datatable .= &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname); - my $context = 'domprefs'; - my $crstype = 'Course'; - my $prefix = 'helproles_'; - my $add_class = 'LC_hidden'; - foreach my $num (@roles_by_num) { - my $role = $ordered{$num}; - my ($desc,$access,@statuses); - if (ref($current{$role}) eq 'HASH') { - $desc = $current{$role}{'desc'}; - $access = $current{$role}{'access'}; - if (ref($current{$role}{'insttypes'}) eq 'ARRAY') { - @statuses = @{$current{$role}{'insttypes'}}; - } - } - if ($desc eq '') { - $desc = $role; - } - my $identifier = 'custhelp'.$num; - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - my %levelscurrent=( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$num."_pos'".');"'; - $datatable .= ''.$role.'
'. - ''.(' 'x2). - ''. - ''. - '
'.&mt('Role name').''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$num,$add_class,$current{$role},\@accesstypes, - $othertitle,$usertypes,$types,\%domhelpdesk). - '
'. - ''.&mt('Role privileges').&adhocbutton($prefix,$num,'privs','show').''. - &Apache::lonuserutils::custom_role_table($crstype,\%full,\%levels, - \%levelscurrent,$identifier, - 'LC_hidden',$prefix.$num.'_privs'). - '
'; - $itemcount ++; - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $newcust = 'custhelp'.$count; - my (%privs,%levelscurrent); - my %full=(); - my %levels= ( - course => {}, - domain => {}, - system => {}, - ); - &Apache::lonuserutils::custom_role_privs(\%privs,\%full,\%levels,\%levelscurrent); - my @templateroles = &Apache::lonuserutils::custom_template_roles($context,$crstype); - my $chgstr = ' onchange="javascript:reorderHelpRoles(this.form,'."'helproles_".$count."_pos'".');"'; - $datatable .= ''. - '
'.&mt('Role name').''. - ''. - &mt('Internal name:'). - ''. - ''.(' 'x4). - ''. - &mt('Name shown to users:'). - ''. - '
'. - &helpdeskroles_access($dom,$prefix,$count,'',undef,\@accesstypes,$othertitle, - $usertypes,$types,\%domhelpdesk). - '
'.&mt('Role privileges').''. - &Apache::lonuserutils::custom_role_header($context,$crstype, - \@templateroles,$newcust). - &Apache::lonuserutils::custom_role_table('Course',\%full,\%levels, - \%levelscurrent,$newcust). - '
'. - &helpsettings_javascript(\@roles_by_num,$maxnum,$hiddenstr,$formname). - ''; - $count ++; - $$rowtotal += $count; - } - return $datatable; -} -sub adhocbutton { - my ($prefix,$num,$field,$visibility) = @_; - my %lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - return ''.(' 'x10). - ''.(' 'x2).''.(' 'x2); -} - -sub helpsettings_javascript { - my ($roles_by_num,$total,$hiddenstr,$formname) = @_; - return unless(ref($roles_by_num) eq 'ARRAY'); - my %html_js_lt = &Apache::lonlocal::texthash( - show => 'Show details', - hide => 'Hide details', - ); - &html_escape(\%html_js_lt); - my $jstext = ' var helproles = Array('."'".join("','",@{$roles_by_num})."'".');'."\n"; - return <<"ENDSCRIPT"; - - -ENDSCRIPT -} - -sub helpdeskroles_access { - my ($dom,$prefix,$num,$add_class,$current,$accesstypes,$othertitle, - $usertypes,$types,$domhelpdesk) = @_; - return unless ((ref($accesstypes) eq 'ARRAY') && (ref($domhelpdesk) eq 'HASH')); - my %lt = &Apache::lonlocal::texthash( - 'rou' => 'Role usage', - 'whi' => 'Which helpdesk personnel may use this role?', - 'all' => 'All with domain helpdesk or helpdesk assistant role', - 'dh' => 'All with domain helpdesk role', - 'da' => 'All with domain helpdesk assistant role', - 'none' => 'None', - 'status' => 'Determined based on institutional status', - 'inc' => 'Include all, but exclude specific personnel', - 'exc' => 'Exclude all, but include specific personnel', - ); - my %usecheck = ( - all => ' checked="checked"', - ); - my %displaydiv = ( - status => 'none', - inc => 'none', - exc => 'none', - priv => 'block', - ); - my $output; - if (ref($current) eq 'HASH') { - if (($current->{'access'} ne '') && ($current->{'access'} ne 'all')) { - if (grep(/^\Q$current->{access}\E$/,@{$accesstypes})) { - $usecheck{$current->{access}} = $usecheck{'all'}; - delete($usecheck{'all'}); - if ($current->{access} =~ /^(status|inc|exc)$/) { - my $access = $1; - $displaydiv{$access} = 'inline'; - } elsif ($current->{access} eq 'none') { - $displaydiv{'priv'} = 'none'; - } - } - } - } - $output = '
'.$lt{'rou'}.''. - '

'.$lt{'whi'}.'

'; - foreach my $access (@{$accesstypes}) { - $output .= '

'; - if ($access eq 'status') { - $output .= '

'. - &Apache::lonuserutils::adhoc_status_types($dom,$prefix,$num,$current->{$access}, - $othertitle,$usertypes,$types). - '
'; - } elsif (($access eq 'inc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } elsif (($access eq 'exc') && (keys(%{$domhelpdesk}) > 0)) { - $output .= '
'. - &Apache::lonuserutils::adhoc_staff($access,$prefix,$num,$current->{$access},$domhelpdesk). - '
'; - } - $output .= '

'; - } - $output .= '
'; - return $output; -} sub radiobutton_prefs { - my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick, - $additional,$align,$firstval) = @_; + my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_; return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') && (ref($choices) eq 'HASH')); @@ -4483,35 +2283,18 @@ sub radiobutton_prefs { } } } - if ($onclick) { - $onclick = ' onclick="'.$onclick.'"'; - } foreach my $item (@{$toggles}) { $css_class = $itemcount%2?' class="LC_odd_row"':''; $datatable .= - ''. - ''.$choices->{$item}. - ''; - if ($align eq 'left') { - $datatable .= ''; - } else { - $datatable .= ''; - } - $datatable .= ''; - if ($firstval eq 'no') { - $datatable .= - ' '; - } else { - $datatable .= + ''.$choices->{$item}. + ''. + ''. ' '; - } - $datatable .= ''.$additional.''; + $checkedoff{$item}.' value="0" />'.&mt('No').''. + ''. + ''; $itemcount ++; } return ($datatable,$itemcount); @@ -4519,1247 +2302,45 @@ sub radiobutton_prefs { sub print_coursedefaults { my ($position,$dom,$settings,$rowtotal) = @_; - my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles); + my ($css_class,$datatable); my $itemcount = 1; - my %choices = &Apache::lonlocal::texthash ( - uploadquota => 'Default quota for files uploaded directly to course/community using Course Editor (MB)', - anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys', - coursecredits => 'Credits can be specified for courses', - uselcmath => 'Math preview uses LON-CAPA previewer (javascript) in place of DragMath (Java)', - usejsme => 'Molecule editor uses JSME (HTML5) in place of JME (Java)', - inline_chem => 'Use inline previewer for chemical reaction response in place of pop-up', - texengine => 'Default method to display mathematics', - postsubmit => 'Disable submit button/keypress following student submission', - canclone => "People who may clone a course (besides course's owner and coordinators)", - mysqltables => 'Lifetime (s) of "Temporary" MySQL tables (student performance data) on homeserver', - ); - my %staticdefaults = ( - anonsurvey_threshold => 10, - uploadquota => 500, - postsubmit => 60, - mysqltables => 172800, - ); if ($position eq 'top') { - %defaultchecked = ( - 'uselcmath' => 'on', - 'usejsme' => 'on', - 'inline_chem' => 'on', - 'canclone' => 'none', - ); - @toggles = ('uselcmath','usejsme','inline_chem'); - my $deftex = $Apache::lonnet::deftex; - if (ref($settings) eq 'HASH') { - if ($settings->{'texengine'}) { - if ($settings->{'texengine'} =~ /^(MathJax|mimetex|tth)$/) { - $deftex = $settings->{'texengine'}; - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $mathdisp = ''. - ''.$choices{'texengine'}. - ''. - ''."\n"; - $itemcount ++; + my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles); + %choices = + &Apache::lonlocal::texthash ( + canuse_pdfforms => 'Course/Community users can create/upload PDF forms', + ); + %defaultchecked = ('canuse_pdfforms' => 'off'); + @toggles = ('canuse_pdfforms',); ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked, - \%choices,$itemcount); - $datatable = $mathdisp.$datatable; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= - ''. - ''.$choices{'canclone'}. - ''; - my $currcanclone = 'none'; - my $onclick; - my @cloneoptions = ('none','domain'); - my %clonetitles = &Apache::lonlocal::texthash ( - none => 'No additional course requesters', - domain => "Any course requester in course's domain", - instcode => 'Course requests for official courses ...', - ); - my (%codedefaults,@code_order,@posscodes); - if (&Apache::lonnet::auto_instcode_defaults($dom,\%codedefaults, - \@code_order) eq 'ok') { - if (@code_order > 0) { - push(@cloneoptions,'instcode'); - $onclick = ' onclick="toggleDisplay(this.form,'."'cloneinstcode'".');"'; - } - } - if (ref($settings) eq 'HASH') { - if ($settings->{'canclone'}) { - if (ref($settings->{'canclone'}) eq 'HASH') { - if (ref($settings->{'canclone'}{'instcode'}) eq 'ARRAY') { - if (@code_order > 0) { - $currcanclone = 'instcode'; - @posscodes = @{$settings->{'canclone'}{'instcode'}}; - } - } - } elsif ($settings->{'canclone'} eq 'domain') { - $currcanclone = $settings->{'canclone'}; - } - } - } - foreach my $option (@cloneoptions) { - my ($checked,$additional); - if ($currcanclone eq $option) { - $checked = ' checked="checked"'; - } - if ($option eq 'instcode') { - if (@code_order) { - my $show = 'none'; - if ($checked) { - $show = 'block'; - } - $additional = '
'. - &mt('Institutional codes for new and cloned course have identical:'). - '
'; - foreach my $item (@code_order) { - my $codechk; - if ($checked) { - if (grep(/^\Q$item\E$/,@posscodes)) { - $codechk = ' checked="checked"'; - } - } - $additional .= ''; - } - $additional .= (' 'x2).'('.&mt('check as many as needed').')
'; - } - } - $datatable .= - ' '.$additional.'
'; - } - $datatable .= ''. - ''; - $itemcount ++; + \%choices,$itemcount); + $$rowtotal += $itemcount; } else { $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($currdefresponder,%defcredits,%curruploadquota,%deftimeout,%currmysql); - my $currusecredits = 0; - my $postsubmitclient = 1; - my @types = ('official','unofficial','community','textbook'); + my %choices = + &Apache::lonlocal::texthash ( + anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys', + ); + my $currdefresponder; if (ref($settings) eq 'HASH') { $currdefresponder = $settings->{'anonsurvey_threshold'}; - if (ref($settings->{'uploadquota'}) eq 'HASH') { - foreach my $type (keys(%{$settings->{'uploadquota'}})) { - $curruploadquota{$type} = $settings->{'uploadquota'}{$type}; - } - } - if (ref($settings->{'coursecredits'}) eq 'HASH') { - foreach my $type (@types) { - next if ($type eq 'community'); - $defcredits{$type} = $settings->{'coursecredits'}->{$type}; - if ($defcredits{$type} ne '') { - $currusecredits = 1; - } - } - } - if (ref($settings->{'postsubmit'}) eq 'HASH') { - if ($settings->{'postsubmit'}->{'client'} eq 'off') { - $postsubmitclient = 0; - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } else { - foreach my $type (@types) { - if (ref($settings->{'postsubmit'}->{'timeout'}) eq 'HASH') { - if ($settings->{'postsubmit'}->{'timeout'}->{$type} =~ /^\d+$/) { - $deftimeout{$type} = $settings->{'postsubmit'}->{'timeout'}->{$type}; - } else { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } else { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } - } - } else { - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } - } - if (ref($settings->{'mysqltables'}) eq 'HASH') { - foreach my $type (keys(%{$settings->{'mysqltables'}})) { - $currmysql{$type} = $settings->{'mysqltables'}{$type}; - } - } else { - foreach my $type (@types) { - $currmysql{$type} = $staticdefaults{'mysqltables'}; - } - } - } else { - foreach my $type (@types) { - $deftimeout{$type} = $staticdefaults{'postsubmit'}; - } } if (!$currdefresponder) { - $currdefresponder = $staticdefaults{'anonsurvey_threshold'}; + $currdefresponder = 10; } elsif ($currdefresponder < 1) { $currdefresponder = 1; } - foreach my $type (@types) { - if ($curruploadquota{$type} eq '') { - $curruploadquota{$type} = $staticdefaults{'uploadquota'}; - } - } $datatable .= - ''. - $choices{'anonsurvey_threshold'}. + ''.$choices{'anonsurvey_threshold'}. ''. ''. ''. - ''."\n"; - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'uploadquota'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''; - } - $datatable .= '
'.&mt($type).'
'. - '
'."\n"; - $itemcount ++; - my $onclick = "toggleDisplay(this.form,'credits');"; - my $display = 'none'; - if ($currusecredits) { - $display = 'block'; - } - my $additional = '
'. - ''.&mt('Default credits').'
'; - foreach my $type (@types) { - next if ($type eq 'community'); - $additional .= ''; - } - $additional .= '
'.&mt($type).'
'. - '
'."\n"; - %defaultchecked = ('coursecredits' => 'off'); - @toggles = ('coursecredits'); - my $current = { - 'coursecredits' => $currusecredits, - }; - (my $table,$itemcount) = - &radiobutton_prefs($current,\@toggles,\%defaultchecked, - \%choices,$itemcount,$onclick,$additional,'left'); - $datatable .= $table; - $onclick = "toggleDisplay(this.form,'studentsubmission');"; - my $display = 'none'; - if ($postsubmitclient) { - $display = 'block'; - } - $additional = '
'. - &mt('Number of seconds submit is disabled').'
'. - ''.&mt('Enter 0 to remain disabled until page reload.').'
'. - ''; - foreach my $type (@types) { - $additional .= ''; - } - $additional .= '
'.&mt($type).'
'. - '
'."\n"; - %defaultchecked = ('postsubmit' => 'on'); - @toggles = ('postsubmit'); - $current = { - 'postsubmit' => $postsubmitclient, - }; - ($table,$itemcount) = - &radiobutton_prefs($current,\@toggles,\%defaultchecked, - \%choices,$itemcount,$onclick,$additional,'left'); - $datatable .= $table; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - $choices{'mysqltables'}. - ''. - ''. - ''; - foreach my $type (@types) { - $datatable .= ''; - } - $datatable .= '
'.&mt($type).'
'. - '
'."\n"; - $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 .= ''. - ''.$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 .= '
'; - } - } 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 .= ''. - $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 .= ''."\n"; - if (ref($rowtotal)) { - $itemcount ++; - } - } - if ($caller eq 'requestcourses') { - my %currhash; - if (ref($settings) eq 'HASH') { - 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); - my $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''; - if ($numdc > 1) { - $datatable .= &mt('Course creation processed as: (choose Dom. Coord.)'); - } else { - $datatable .= &mt('Course creation processed as: '); - } - $datatable .= ''.$dctable.''; - $itemcount ++; - } - if (ref($rowtotal)) { - $$rowtotal += $itemcount; - } - return $datatable; -} - -sub print_passwords { - my ($position,$dom,$confname,$settings,$rowtotal) = @_; - my ($datatable,$css_class); - my $itemcount = 0; - my %titles = &Apache::lonlocal::texthash ( - captcha => '"Forgot Password" CAPTCHA validation', - link => 'Reset link expiration (hours)', - case => 'Case-sensitive usernames/e-mail', - prelink => 'Information required (form 1)', - postlink => 'Information required (form 2)', - emailsrc => 'LON-CAPA e-mail address type(s)', - customtext => 'Domain specific text (HTML)', - intauth_cost => 'Encryption cost for bcrypt (positive integer)', - intauth_check => 'Check bcrypt cost if authenticated', - intauth_switch => 'Existing crypt-based switched to bcrypt on authentication', - permanent => 'Permanent e-mail address', - critical => 'Critical notification address', - notify => 'Notification address', - min => 'Minimum password length', - max => 'Maximum password length', - chars => 'Required characters', - numsaved => 'Number of previous passwords to save and disallow reuse', - ); - if ($position eq 'top') { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my $shownlinklife = 2; - my $prelink = 'both'; - my (%casesens,%postlink,%emailsrc,$nostdtext,$customurl); - if (ref($settings) eq 'HASH') { - if ($settings->{resetlink} =~ /^\d+(|\.\d*)$/) { - $shownlinklife = $settings->{resetlink}; - } - if (ref($settings->{resetcase}) eq 'ARRAY') { - map { $casesens{$_} = 1; } (@{$settings->{resetcase}}); - } - if ($settings->{resetprelink} =~ /^(both|either)$/) { - $prelink = $settings->{resetprelink}; - } - if (ref($settings->{resetpostlink}) eq 'HASH') { - %postlink = %{$settings->{resetpostlink}}; - } - if (ref($settings->{resetemail}) eq 'ARRAY') { - map { $emailsrc{$_} = 1; } (@{$settings->{resetemail}}); - } - if ($settings->{resetremove}) { - $nostdtext = 1; - } - if ($settings->{resetcustom}) { - $customurl = $settings->{resetcustom}; - } - } else { - if (ref($types) eq 'ARRAY') { - foreach my $item (@{$types}) { - $casesens{$item} = 1; - $postlink{$item} = ['username','email']; - } - } - $casesens{'default'} = 1; - $postlink{'default'} = ['username','email']; - $prelink = 'both'; - %emailsrc = ( - permanent => 1, - critical => 1, - notify => 1, - ); - } - $datatable = &captcha_choice('passwords',$settings,$$rowtotal); - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'link'}.''. - ''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'case'}.''. - ''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - my $checkedcase; - if ($casesens{$item}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checkedcase; - if ($casesens{'default'}) { - $checkedcase = ' checked="checked"'; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my %checkedpre = ( - both => ' checked="checked"', - either => '', - ); - if ($prelink eq 'either') { - $checkedpre{either} = ' checked="checked"'; - $checkedpre{both} = ''; - } - $datatable .= ''.$titles{'prelink'}.''. - ''. - '   '. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'postlink'}.''. - ''; - my %postlinked; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $item (@{$types}) { - undef(%postlinked); - $datatable .= '
'. - ''.$usertypes->{$item}.''; - if (ref($postlink{$item}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{$item}}); - } - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - } - } - if (ref($postlink{'default'}) eq 'ARRAY') { - map { $postlinked{$_} = 1; } (@{$postlink{'default'}}); - } - $datatable .= '
'. - ''.$othertitle.''; - foreach my $field ('email','username') { - my $checked; - if ($postlinked{$field}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= '
'; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'emailsrc'}.''. - ''; - foreach my $type ('permanent','critical','notify') { - my $checkedemail; - if ($emailsrc{$type}) { - $checkedemail = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - $datatable .= ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - my $switchserver = &check_switchserver($dom,$confname); - my ($showstd,$noshowstd); - if ($nostdtext) { - $noshowstd = ' checked="checked"'; - } else { - $showstd = ' checked="checked"'; - } - $datatable .= ''.$titles{'customtext'}.''. - ''. - &mt('Retain standard text:'). - ''.' '. - '
'. - ''. - &mt('(If you use the same account ... reset a password from this page.)').'

'. - &mt('Include custom text:'); - if ($customurl) { - my $link = &Apache::loncommon::modal_link($customurl,&mt('custom text'),600,500, - undef,undef,undef,undef,'background-color:#ffffff'); - $datatable .= ' '.$link. - ''. - '  '.&mt('Replace:').''; - } - if ($switchserver) { - $datatable .= ' '.&mt('Upload to library server: [_1]',$switchserver).''; - } else { - $datatable .=' '. - ''; - } - $datatable .= ''; - } elsif ($position eq 'middle') { - my %domconf = &Apache::lonnet::get_dom('configuration',['defaults'],$dom); - my @items = ('intauth_cost','intauth_check','intauth_switch'); - my %defaults; - if (ref($domconf{'defaults'}) eq 'HASH') { - %defaults = %{$domconf{'defaults'}}; - if ($defaults{'intauth_cost'} !~ /^\d+$/) { - $defaults{'intauth_cost'} = 10; - } - if ($defaults{'intauth_check'} !~ /^(0|1|2)$/) { - $defaults{'intauth_check'} = 0; - } - if ($defaults{'intauth_switch'} !~ /^(0|1|2)$/) { - $defaults{'intauth_switch'} = 0; - } - } else { - %defaults = ( - 'intauth_cost' => 10, - 'intauth_check' => 0, - 'intauth_switch' => 0, - ); - } - foreach my $item (@items) { - if ($itemcount%2) { - $css_class = ''; - } else { - $css_class = ' class="LC_odd_row" '; - } - $datatable .= ''. - ''.$titles{$item}. - ''; - if ($item eq 'intauth_switch') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes', - 2 => 'Yes, and copy existing passwd file to passwd.bak file', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } elsif ($item eq 'intauth_check') { - my @options = (0,1,2); - my %optiondesc = &Apache::lonlocal::texthash ( - 0 => 'No', - 1 => 'Yes, allow login then update passwd file using default cost (if higher)', - 2 => 'Yes, disallow login if stored cost is less than domain default', - ); - $datatable .= ''; - foreach my $option (@options) { - my $checked = ' '; - my $onclick; - if ($defaults{$item} eq $option) { - $checked = ' checked="checked"'; - } - if ($option == 2) { - $onclick = ' onclick="javascript:warnIntAuth(this);"'; - } - $datatable .= ''; - } - $datatable .= '
'. - '
'; - } else { - $datatable .= ''; - } - $datatable .= ''; - $itemcount ++; - } - } elsif ($position eq 'lower') { - my ($min,$max,%chars,$numsaved); - $min = $Apache::lonnet::passwdmin; - if (ref($settings) eq 'HASH') { - if ($settings->{min}) { - $min = $settings->{min}; - } - if ($settings->{max}) { - $max = $settings->{max}; - } - if (ref($settings->{chars}) eq 'ARRAY') { - map { $chars{$_} = 1; } (@{$settings->{chars}}); - } - if ($settings->{numsaved}) { - $numsaved = $settings->{numsaved}; - } - } - my %rulenames = &Apache::lonlocal::texthash( - uc => 'At least one upper case letter', - lc => 'At least one lower case letter', - num => 'At least one number', - spec => 'At least one non-alphanumeric', - ); - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'min'}.''. - ''. - ''. - ' '.&mt('(Enter an integer: 7 or larger)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'max'}.''. - ''. - ''. - ' '.&mt('(Leave blank for no maximum)').''. - ''; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'chars'}.'
'. - ''.&mt('(Leave unchecked if not required)'). - ''; - my $numinrow = 2; - my @possrules = ('uc','lc','num','spec'); - $datatable .= ''; - for (my $i=0; $i<@possrules; $i++) { - my ($rem,$checked); - if ($chars{$possrules[$i]}) { - $checked = ' checked="checked"'; - } - $rem = $i%($numinrow); - if ($rem == 0) { - if ($i > 0) { - $datatable .= ''; - } - $datatable .= ''; - } - $datatable .= ''; - } - my $rem = @possrules%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $datatable .= ''; - } elsif ($colsleft == 1) { - $datatable .= ''; - } - $datatable .='
'. - '  
'; - $itemcount ++; - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''.$titles{'numsaved'}.''. - ''. - ''. - ' '.&mt('(Leave blank to not save previous passwords)').''. - ''; - } else { - my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my %ownerchg = ( - by => {}, - for => {}, - ); - my %ownertitles = &Apache::lonlocal::texthash ( - by => 'Course owner status(es) allowed', - for => 'Student status(es) allowed', - ); - if (ref($settings) eq 'HASH') { - if (ref($settings->{crsownerchg}) eq 'HASH') { - if (ref($settings->{crsownerchg}{'by'}) eq 'ARRAY') { - map { $ownerchg{by}{$_} = 1; } (@{$settings->{crsownerchg}{'by'}}); - } - if (ref($settings->{crsownerchg}{'for'}) eq 'ARRAY') { - map { $ownerchg{for}{$_} = 1; } (@{$settings->{crsownerchg}{'for'}}); - } - } - } - $css_class = $itemcount%2?' class="LC_odd_row"':''; - $datatable .= ''. - ''. - &mt('Requirements').'
    '. - '
  • '.&mt("Course 'type' is not a Community").'
  • '. - '
  • '.&mt('User is Course Coordinator and also course owner').'
  • '. - '
  • '.&mt("Student's only active roles are student role(s) in course(s) owned by this user").'
  • '. - '
  • '.&mt('User, course, and student share same domain').'
  • '. - '
'. - ''. - ''; - foreach my $item ('by','for') { - $datatable .= '
'. - ''.$ownertitles{$item}.''; - if ((ref($types) eq 'ARRAY') && (ref($usertypes) eq 'HASH')) { - foreach my $type (@{$types}) { - my $checked; - if ($ownerchg{$item}{$type}) { - $checked = ' checked="checked"'; - } - $datatable .= ''. - '   '; - } - } - my $checked; - if ($ownerchg{$item}{'default'}) { - $checked = ' checked="checked"'; - } - $datatable .= '
'; - } - $datatable .= ''; - } - return $datatable; -} - -sub print_wafproxy { - my ($position,$dom,$settings,$rowtotal) = @_; - my $css_class; - my $itemcount = 0; - my $datatable; - my %servers = &Apache::lonnet::internet_dom_servers($dom); - my (%othercontrol,%otherdoms,%aliases,%saml,%values,$setdom,$showdom); - my %lt = &wafproxy_titles(); - foreach my $server (sort(keys(%servers))) { - my $serverhome = &Apache::lonnet::get_server_homeID($servers{$server}); - next if ($serverhome eq ''); - my $serverdom; - if ($serverhome ne $server) { - $serverdom = &Apache::lonnet::host_domain($serverhome); - if (($serverdom ne '') && (&Apache::lonnet::domain($serverdom) ne '')) { - $othercontrol{$server} = $serverdom; - } - } else { - $serverdom = &Apache::lonnet::host_domain($server); - next if (($serverdom eq '') || (&Apache::lonnet::domain($serverdom) eq '')); - if ($serverdom ne $dom) { - $othercontrol{$server} = $serverdom; - } else { - $setdom = 1; - if (ref($settings) eq 'HASH') { - if (ref($settings->{'alias'}) eq 'HASH') { - $aliases{$dom} = $settings->{'alias'}; - if ($aliases{$dom} ne '') { - $showdom = 1; - } - } - if (ref($settings->{'saml'}) eq 'HASH') { - $saml{$dom} = $settings->{'saml'}; - } - } - } - } - } - if ($setdom) { - %{$values{$dom}} = (); - if (ref($settings) eq 'HASH') { - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') { - $values{$dom}{$item} = $settings->{$item}; - } - } - } - if (keys(%othercontrol)) { - %otherdoms = reverse(%othercontrol); - foreach my $domain (keys(%otherdoms)) { - %{$values{$domain}} = (); - my %config = &Apache::lonnet::get_dom('configuration',['wafproxy'],$domain); - if (ref($config{'wafproxy'}) eq 'HASH') { - $aliases{$domain} = $config{'wafproxy'}{'alias'}; - if (exists($config{'wafproxy'}{'saml'})) { - $saml{$domain} = $config{'wafproxy'}{'saml'}; - } - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext') { - $values{$domain}{$item} = $config{'wafproxy'}{$item}; - } - } - } - } - if ($position eq 'top') { - my %servers = &Apache::lonnet::internet_dom_servers($dom); - my %aliasinfo; - foreach my $server (sort(keys(%servers))) { - $itemcount ++; - my $dom_in_effect; - my $aliasrows = ''. - ''. - &mt('Hostname').': '. - ''.&Apache::lonnet::hostname($server).' '; - if ($othercontrol{$server}) { - $dom_in_effect = $othercontrol{$server}; - my ($current,$forsaml); - if (ref($aliases{$dom_in_effect}) eq 'HASH') { - $current = $aliases{$dom_in_effect}{$server}; - } - if (ref($saml{$dom_in_effect}) eq 'HASH') { - if ($saml{$dom_in_effect}{$server}) { - $forsaml = 1; - } - } - $aliasrows .= ''. - &mt('Alias').': '; - if ($current) { - $aliasrows .= $current; - if ($forsaml) { - $aliasrows .= ' ('.&mt('also for SSO Auth').')'; - } - } else { - $aliasrows .= &mt('None'); - } - $aliasrows .= ' ('. - &mt('controlled by domain: [_1]', - ''.$dom_in_effect.'').')'; - } else { - $dom_in_effect = $dom; - my ($current,$samlon,$samloff); - $samloff = ' checked="checked"'; - if (ref($aliases{$dom}) eq 'HASH') { - if ($aliases{$dom}{$server}) { - $current = $aliases{$dom}{$server}; - } - } - if (ref($saml{$dom}) eq 'HASH') { - if ($saml{$dom}{$server}) { - $samlon = $samloff; - undef($samloff); - } - } - $aliasrows .= ''. - &mt('Alias').': '. - ''. - (' 'x2).''. - &mt('Alias used for SSO Auth').':  '. - ''; - } - $aliasrows .= ''; - $aliasinfo{$dom_in_effect} .= $aliasrows; - } - if ($aliasinfo{$dom}) { - my ($onclick,$wafon,$wafoff,$showtable); - $onclick = ' onclick="javascript:toggleWAF();"'; - $wafoff = ' checked="checked"'; - $showtable = ' style="display:none";'; - if ($showdom) { - $wafon = $wafoff; - $wafoff = ''; - $showtable = ' style="display:inline;"'; - } - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable = ''. - ''.&mt('Domain: [_1]',''.$dom.'').'
'. - ''.&mt('WAF in use?').' '.(' 'x2).''. - ''. - ''.$aliasinfo{$dom}. - '
'; - $itemcount++; - } - if (keys(%otherdoms)) { - foreach my $key (sort(keys(%otherdoms))) { - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$key.'').''. - ''.$aliasinfo{$key}. - '
'; - $itemcount++; - } - } - } else { - my %ip_methods = &remoteip_methods(); - if ($setdom) { - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - my ($nowafstyle,$wafstyle,$curr_remotip,$currwafdisplay,$vpndircheck,$vpnaliascheck, - $currwafvpn,$wafrangestyle,$alltossl,$ssltossl); - $wafstyle = ' style="display:none;"'; - $nowafstyle = ' style="display:table-row;"'; - $currwafdisplay = ' style="display: none"'; - $wafrangestyle = ' style="display: none"'; - $curr_remotip = 'n'; - $ssltossl = ' checked="checked"'; - if ($showdom) { - $wafstyle = ' style="display:table-row;"'; - $nowafstyle = ' style="display:none;"'; - if (keys(%{$values{$dom}})) { - if ($values{$dom}{remoteip} =~ /^[nmh]$/) { - $curr_remotip = $values{$dom}{remoteip}; - } - if ($curr_remotip eq 'h') { - $currwafdisplay = ' style="display:table-row"'; - $wafrangestyle = ' style="display:inline-block;"'; - } - if ($values{$dom}{'sslopt'}) { - $alltossl = ' checked="checked"'; - $ssltossl = ''; - } - } - if (($values{$dom}{'vpnint'} ne '') || ($values{$dom}{'vpnext'} ne '')) { - $vpndircheck = ' checked="checked"'; - $currwafvpn = ' style="display:table-row;"'; - $wafrangestyle = ' style="display:inline-block;"'; - } else { - $vpnaliascheck = ' checked="checked"'; - $currwafvpn = ' style="display:none;"'; - } - } - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$dom.'').''. - ''.&mt('WAF not in use, nothing to set').''. - ''. - ''. - ''.&mt('Domain: [_1]',''.$dom.'').'

'. - '
'.&mt('Format for comma separated IP ranges').':
'. - &mt('A.B.C.D/N or A.B.C.D-E.F.G.H').'
'. - &mt('Range(s) stored in CIDR notation').'
'. - ''. - ''. - ''."\n". - ''."\n". - ''."\n". - ''."\n". - ''. - ''; - foreach my $item ('vpnint','vpnext') { - $datatable .= ''. - ''."\n"; - } - $datatable .= ''."\n". - ''. - ''."\n". - '
'.$lt{'remoteip'}.': '. - '
'. - $lt{'ipheader'}.': '. - ''. - '
'. - $lt{'trusted'}.':
'. - ''. - '

'.$lt{'vpnaccess'}.':
'. - ''.(' 'x2). - '
'.$lt{$item}.':
'. - ''. - '

'.$lt{'sslopt'}.':
'. - ''.(' 'x2). - '
'; - } - if (keys(%otherdoms)) { - foreach my $domain (sort(keys(%otherdoms))) { - $itemcount ++; - $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; - $datatable .= ''. - ''.&mt('Domain: [_1]',''.$domain.'').''. - ''; - foreach my $item ('remoteip','ipheader','trusted','vpnint','vpnext','sslopt') { - my $showval = &mt('None'); - if ($item eq 'ssl') { - $showval = $lt{'ssltossl'}; - } - if ($values{$domain}{$item}) { - $showval = $values{$domain}{$item}; - if ($item eq 'ssl') { - $showval = $lt{'alltossl'}; - } elsif ($item eq 'remoteip') { - $showval = $ip_methods{$values{$domain}{$item}}; - } - } - $datatable .= ''. - ''; - } - $datatable .= '
'.$lt{$item}.': '.$showval.'
'; - } - } + ''; } - $$rowtotal += $itemcount; return $datatable; } -sub wafproxy_titles { - return &Apache::lonlocal::texthash( - remoteip => "Method for determining user's IP", - ipheader => 'Request header containing remote IP', - trusted => 'Trusted IP range(s)', - vpnaccess => 'Access from institutional VPN', - vpndirect => 'via regular hostname (no WAF)', - vpnaliased => 'via aliased hostname (WAF)', - vpnint => 'Internal IP Range(s) for VPN sessions', - vpnext => 'IP Range(s) for backend WAF connections', - sslopt => 'Forwarding http/https', - alltossl => 'WAF forwards both http and https requests to https', - ssltossl => 'WAF forwards http requests to http and https to https', - ); -} - -sub remoteip_methods { - return &Apache::lonlocal::texthash( - m => 'Use Apache mod_remoteip', - h => 'Use headers parsed by LON-CAPA', - n => 'Not in use', - ); -} - sub print_usersessions { my ($position,$dom,$settings,$rowtotal) = @_; my ($css_class,$datatable,%checked,%choices); @@ -5774,18 +2355,7 @@ sub print_usersessions { if ($position eq 'top') { if (keys(%serverhomes) > 1) { my %spareid = ¤t_offloads_to($dom,$settings,\%servers); - my ($curroffloadnow,$curroffloadoth); - if (ref($settings) eq 'HASH') { - if (ref($settings->{'offloadnow'}) eq 'HASH') { - $curroffloadnow = $settings->{'offloadnow'}; - } - if (ref($settings->{'offloadoth'}) eq 'HASH') { - $curroffloadoth = $settings->{'offloadoth'}; - } - } - my $other_insts = scalar(keys(%by_location)); - $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids, - $other_insts,$curroffloadnow,$curroffloadoth,$rowtotal); + $datatable .= &spares_row($dom,\%servers,\%spareid,\%serverhomes,\%altids,$rowtotal); } else { $datatable .= ''. &mt('Nothing to set here, as the cluster to which this domain belongs only contains one server.'); @@ -6035,8 +2605,7 @@ sub current_offloads_to { } sub spares_row { - my ($dom,$servers,$spareid,$serverhomes,$altids,$other_insts, - $curroffloadnow,$curroffloadoth,$rowtotal) = @_; + my ($dom,$servers,$spareid,$serverhomes,$altids,$rowtotal) = @_; my $css_class; my $numinrow = 4; my $itemcount = 1; @@ -6056,34 +2625,10 @@ sub spares_row { } } next unless (ref($spareid->{$server}) eq 'HASH'); - my ($checkednow,$checkedoth); - if (ref($curroffloadnow) eq 'HASH') { - if ($curroffloadnow->{$server}) { - $checkednow = ' checked="checked"'; - } - } - if (ref($curroffloadoth) eq 'HASH') { - if ($curroffloadoth->{$server}) { - $checkedoth = ' checked="checked"'; - } - } $css_class = $itemcount%2 ? ' class="LC_odd_row"' : ''; $datatable .= ' - '. - &mt('[_1] when busy, offloads to:' - ,''.$server.'').'
'. - ''."\n". - ''. - "\n"; - if ($other_insts) { - $datatable .= '
'. - ''."\n". - ''. - "\n"; - } + '.$server.' when busy, offloads to:'."\n"; my (%current,%canselect); my @choices = &possible_newspares($server,$spareid->{$server},$serverhomes,$altids); @@ -6207,244 +2752,123 @@ sub print_loadbalancing { my $numinrow = 1; my $datatable; my %servers = &Apache::lonnet::internet_dom_servers($dom); - my (%currbalancer,%currtargets,%currrules,%existing,%currcookies); - if (ref($settings) eq 'HASH') { - %existing = %{$settings}; - } - if ((keys(%servers) > 1) || (keys(%existing) > 0)) { - &get_loadbalancers_config(\%servers,\%existing,\%currbalancer, - \%currtargets,\%currrules,\%currcookies); + my ($currbalancer,$currtargets,$currrules); + if (keys(%servers) > 1) { + if (ref($settings) eq 'HASH') { + $currbalancer = $settings->{'lonhost'}; + $currtargets = $settings->{'targets'}; + $currrules = $settings->{'rules'}; + } else { + ($currbalancer,$currtargets) = + &Apache::lonnet::get_lonbalancer_config(\%servers); + } } else { return; } my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom); - my $rownum = 8; + my $rownum = 6; if (ref($types) eq 'ARRAY') { $rownum += scalar(@{$types}); } - my @css_class = ('LC_odd_row','LC_even_row'); - my $balnum = 0; - my $islast; - my (@toshow,$disabledtext); - if (keys(%currbalancer) > 0) { - @toshow = sort(keys(%currbalancer)); - if (scalar(@toshow) < scalar(keys(%servers)) + 1) { - push(@toshow,''); + my $css_class = ' class="LC_odd_row"'; + my $targets_div_style = 'display: none'; + my $disabled_div_style = 'display: block'; + my $homedom_div_style = 'display: none'; + $datatable = ''. + ''. + '

'."\n". - ''."\n"; - foreach my $server (sort(keys(%servers))) { - next if ($currbalancer{$server}); - $datatable .= ''."\n"; - } - $datatable .= - ''."\n". - ' '."\n"; - } else { - $datatable .= ''.$lonhost.'
'. - ''. - ''; - $targets_div_style = 'display: block'; - $disabled_div_style = 'display: none'; - if ($dom eq &Apache::lonnet::host_domain($lonhost)) { - $homedom_div_style = 'display: block'; - } - } - $datatable .= '

'. - '
'.$disabledtext.'
'."\n". - '
'.&mt('Offloads to:').'
'; - my ($numspares,@spares) = &count_servers($lonhost,%servers); - my @sparestypes = ('primary','default'); - my %typetitles = &sparestype_titles(); - my %hostherechecked = ( - no => ' checked="checked"', - ); - my %balcookiechecked = ( - no => ' checked="checked"', - ); - foreach my $sparetype (@sparestypes) { - my $targettable; - for (my $i=0; $i<$numspares; $i++) { - my $checked; - if (ref($currtargets{$lonhost}) eq 'HASH') { - if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') { - if (grep(/^\Q$spares[$i]\E$/,@{$currtargets{$lonhost}{$sparetype}})) { - $checked = ' checked="checked"'; - } - } - } - my ($chkboxval,$disabled); - if (($lonhost ne '') && (exists($servers{$lonhost}))) { - $chkboxval = $spares[$i]; - } - if (exists($currbalancer{$spares[$i]})) { - $disabled = ' disabled="disabled"'; - } - $targettable .= - ''; - my $rem = $i%($numinrow); - if ($rem == 0) { - if (($i > 0) && ($i < $numspares-1)) { - $targettable .= ''; - } - if ($i < $numspares-1) { - $targettable .= ''; - } - } - } - if ($targettable ne '') { - my $rem = $numspares%($numinrow); - my $colsleft = $numinrow - $rem; - if ($colsleft > 1 ) { - $targettable .= ''. - ' '; - } elsif ($colsleft == 1) { - $targettable .= ' '; - } - $datatable .= ''.$typetitles{$sparetype}.'
'. - ''.$targettable.'

'; - } - $hostherechecked{$sparetype} = ''; - if (ref($currtargets{$lonhost}) eq 'HASH') { - if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') { - if (grep(/^\Q$lonhost\E$/,@{$currtargets{$lonhost}{$sparetype}})) { - $hostherechecked{$sparetype} = ' checked="checked"'; - $hostherechecked{'no'} = ''; + $datatable .= '>'.&mt('None').''."\n"; + foreach my $lonhost (sort(keys(%servers))) { + my $selected; + if ($lonhost eq $currbalancer) { + $selected .= ' selected="selected"'; + } + $datatable .= ''."\n"; + } + $datatable .= '

'. + '
'.&mt('No dedicated Load Balancer').'
'."\n". + '
'.&mt('Offloads to:').'
'; + my ($numspares,@spares) = &count_servers($currbalancer,%servers); + my @sparestypes = ('primary','default'); + my %typetitles = &sparestype_titles(); + foreach my $sparetype (@sparestypes) { + my $targettable; + for (my $i=0; $i<$numspares; $i++) { + my $checked; + if (ref($currtargets) eq 'HASH') { + if (ref($currtargets->{$sparetype}) eq 'ARRAY') { + if (grep(/^\Q$spares[$i]\E$/,@{$currtargets->{$sparetype}})) { + $checked = ' checked="checked"'; } } } - } - if ($currcookies{$lonhost}) { - %balcookiechecked = ( - yes => ' checked="checked"', - ); - } - $datatable .= &mt('Hosting on balancer itself').'
'. - '
'; - foreach my $sparetype (@sparestypes) { - $datatable .= '
'; - } - $datatable .= &mt('Use balancer cookie').'
'. - '
'. - '
'. - '
'. - &loadbalancing_rules($dom,$intdom,$currrules{$lonhost}, - $othertitle,$usertypes,$types,\%servers, - \%currbalancer,$lonhost, - $targets_div_style,$homedom_div_style, - $css_class[$cssidx],$balnum,$islast); - $$rowtotal += $rownum; - $balnum ++; - } - $datatable .= ''; - return $datatable; -} - -sub get_loadbalancers_config { - my ($servers,$existing,$currbalancer,$currtargets,$currrules,$currcookies) = @_; - return unless ((ref($servers) eq 'HASH') && - (ref($existing) eq 'HASH') && (ref($currbalancer) eq 'HASH') && - (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH') && - (ref($currcookies) eq 'HASH')); - if (keys(%{$existing}) > 0) { - my $oldlonhost; - foreach my $key (sort(keys(%{$existing}))) { - if ($key eq 'lonhost') { - $oldlonhost = $existing->{'lonhost'}; - $currbalancer->{$oldlonhost} = 1; - } elsif ($key eq 'targets') { - if ($oldlonhost) { - $currtargets->{$oldlonhost} = $existing->{'targets'}; - } - } elsif ($key eq 'rules') { - if ($oldlonhost) { - $currrules->{$oldlonhost} = $existing->{'rules'}; - } - } elsif (ref($existing->{$key}) eq 'HASH') { - $currbalancer->{$key} = 1; - $currtargets->{$key} = $existing->{$key}{'targets'}; - $currrules->{$key} = $existing->{$key}{'rules'}; - if ($existing->{$key}{'cookie'}) { - $currcookies->{$key} = 1; + my $chkboxval; + if (($currbalancer ne '') && (grep((/^\Q$currbalancer\E$/,keys(%servers))))) { + $chkboxval = $spares[$i]; + } + $targettable .= ''; + my $rem = $i%($numinrow); + if ($rem == 0) { + if ($i > 0) { + $targettable .= ''; } + $targettable .= ''; } } - } else { - my ($balancerref,$targetsref) = - &Apache::lonnet::get_lonbalancer_config($servers); - if ((ref($balancerref) eq 'HASH') && (ref($targetsref) eq 'HASH')) { - foreach my $server (sort(keys(%{$balancerref}))) { - $currbalancer->{$server} = 1; - $currtargets->{$server} = $targetsref->{$server}; + if ($targettable ne '') { + my $rem = $numspares%($numinrow); + my $colsleft = $numinrow - $rem; + if ($colsleft > 1 ) { + $targettable .= ''. + ' '; + } elsif ($colsleft == 1) { + $targettable .= ' '; } + $datatable .= ''.$typetitles{$sparetype}.'
'. + ''.$targettable.'

'; } } - return; + $datatable .= '
'. + &loadbalancing_rules($dom,$intdom,$currrules,$othertitle, + $usertypes,$types,\%servers,$currbalancer, + $targets_div_style,$homedom_div_style,$css_class); + $$rowtotal += $rownum; + return $datatable; } sub loadbalancing_rules { my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers, - $currbalancer,$lonhost,$targets_div_style,$homedom_div_style, - $css_class,$balnum,$islast) = @_; + $currbalancer,$targets_div_style,$homedom_div_style,$css_class) = @_; my $output; - my $num = 0; - my ($alltypes,$othertypes,$titles) = + my ($alltypes,$othertypes,$titles) = &loadbalancing_titles($dom,$intdom,$usertypes,$types); if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) { foreach my $type (@{$alltypes}) { - $num ++; my $current; if (ref($currrules) eq 'HASH') { $current = $currrules->{$type}; } if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { - if ($dom ne &Apache::lonnet::host_domain($lonhost)) { + if ($dom ne &Apache::lonnet::host_domain($currbalancer)) { $current = ''; } } $output .= &loadbalance_rule_row($type,$titles->{$type},$current, - $servers,$currbalancer,$lonhost,$dom, - $targets_div_style,$homedom_div_style, - $css_class,$balnum,$num,$islast); + $servers,$currbalancer,$dom, + $targets_div_style,$homedom_div_style,$css_class); } } return $output; @@ -6457,18 +2881,11 @@ sub loadbalancing_titles { '_LC_author' => &mt('Users from [_1] with author role',$dom), '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom), '_LC_external' => &mt('Users not from [_1]',$intdom), - '_LC_ipchangesso' => &mt('SSO users from [_1], with IP mismatch',$dom), - '_LC_ipchange' => &mt('Non-SSO users with IP mismatch'), ); - my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange'); - my @available; + my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external'); if (ref($types) eq 'ARRAY') { - @available = @{$types}; - } - unless (grep(/^default$/,@available)) { - push(@available,'default'); + unshift(@alltypes,@{$types},'default'); } - unshift(@alltypes,@available); my %titles; foreach my $type (@alltypes) { if ($type =~ /^_LC_/) { @@ -6488,34 +2905,23 @@ sub loadbalancing_titles { } sub loadbalance_rule_row { - my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom, - $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_; - my @rulenames; + my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style, + $homedom_div_style,$css_class) = @_; + my @rulenames = ('default','homeserver'); my %ruletitles = &offloadtype_text(); - if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) { - @rulenames = ('balancer','offloadedto','specific'); + if ($type eq '_LC_external') { + push(@rulenames,'externalbalancer'); } else { - @rulenames = ('default','homeserver'); - if ($type eq '_LC_external') { - push(@rulenames,'externalbalancer'); - } else { - push(@rulenames,'specific'); - } - push(@rulenames,'none'); + push(@rulenames,'specific'); } + push(@rulenames,'none'); my $style = $targets_div_style; if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) { $style = $homedom_div_style; } - my $space; - if ($islast && $num == 1) { - $space = '
 
'; - } - my $output = - ''.$space. - '
'.$title.'
'."\n". - ''.$space. - '
'."\n"; + my $output = + '
'.$title.'
'."\n". + '
'."\n"; for (my $i=0; $i<@rulenames; $i++) { my $rule = $rulenames[$i]; my ($checked,$extra); @@ -6531,20 +2937,17 @@ sub loadbalance_rule_row { unless ($checked) { $default = ' selected="selected"'; } - $extra = - ': '."\n". + ''."\n"; + foreach my $lonhost (sort(keys(%{$servers}))) { + next if ($lonhost eq $currbalancer); my $selected; - if ($server eq $current) { + if ($lonhost eq $current) { $selected = ' selected="selected"'; } - $extra .= ''; + $extra .= ''; } $extra .= ''; } @@ -6552,16 +2955,11 @@ sub loadbalance_rule_row { $checked = ' checked="checked"'; } $output .= ''.$extra.'
'."\n"; + ' '.$ruletitles{$rulenames[$i]}. + ''.$extra.'
'."\n"; } $output .= '
'."\n"; return $output; @@ -6574,9 +2972,6 @@ sub offloadtype_text { 'externalbalancer' => "Offloads to Load Balancer in user's domain", 'specific' => 'Offloads to specific server', 'none' => 'No offload', - 'balancer' => 'Session hosted on Load Balancer, after re-authentication', - 'offloadedto' => 'Session hosted on offload server, after re-authentication', - 'particular' => 'Session hosted (after re-auth) on server:', ); return %ruletitles; } @@ -6591,21 +2986,13 @@ sub sparestype_titles { sub contact_titles { my %titles = &Apache::lonlocal::texthash ( - 'supportemail' => 'Support E-mail address', - 'adminemail' => 'Default Server Admin E-mail address', - 'errormail' => 'Error reports to be e-mailed to', - 'packagesmail' => 'Package update alerts to be e-mailed to', - 'helpdeskmail' => "Helpdesk requests from all users in this domain", - 'otherdomsmail' => 'Helpdesk requests from users in other (unconfigured) domains', - 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', - 'requestsmail' => 'E-mail from course requests requiring approval', - 'updatesmail' => 'E-mail from nightly check of LON-CAPA module integrity/updates', - 'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID', - 'hostipmail' => 'E-mail from nightly check of hostname/IP network changes', - 'errorthreshold' => 'Error count threshold for status e-mail to admin(s)', - 'errorsysmail' => 'Error count threshold for e-mail to developer group', - 'errorweights' => 'Weights used to compute error count', - 'errorexcluded' => 'Servers with unsent updates excluded from count', + 'supportemail' => 'Support E-mail address', + 'adminemail' => 'Default Server Admin E-mail address', + 'errormail' => 'Error reports to be e-mailed to', + 'packagesmail' => 'Package update alerts to be e-mailed to', + 'helpdeskmail' => 'Helpdesk requests to be e-mailed to', + 'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)', + 'requestsmail' => 'E-mail from course requests requiring approval', ); my %short_titles = &Apache::lonlocal::texthash ( adminemail => 'Admin E-mail address', @@ -6614,44 +3001,14 @@ sub contact_titles { return (\%titles,\%short_titles); } -sub helpform_fields { - my %titles = &Apache::lonlocal::texthash ( - 'username' => 'Name', - 'user' => 'Username/domain', - 'phone' => 'Phone', - 'cc' => 'Cc e-mail', - 'course' => 'Course Details', - 'section' => 'Sections', - 'screenshot' => 'File upload', - ); - my @fields = ('username','phone','user','course','section','cc','screenshot'); - my %possoptions = ( - username => ['yes','no','req'], - phone => ['yes','no','req'], - user => ['yes','no'], - cc => ['yes','no'], - course => ['yes','no'], - section => ['yes','no'], - screenshot => ['yes','no'], - ); - my %fieldoptions = &Apache::lonlocal::texthash ( - 'yes' => 'Optional', - 'req' => 'Required', - 'no' => "Not shown", - ); - return (\@fields,\%titles,\%fieldoptions,\%possoptions); -} - sub tool_titles { my %titles = &Apache::lonlocal::texthash ( - aboutme => 'Personal web page', + aboutme => 'Personal Information Page', blog => 'Blog', - webdav => 'WebDAV', portfolio => 'Portfolio', official => 'Official courses (with institutional codes)', unofficial => 'Unofficial courses', community => 'Communities', - textbook => 'Textbook courses', ); return %titles; } @@ -6661,7 +3018,6 @@ sub courserequest_titles { official => 'Official', unofficial => 'Unofficial', community => 'Communities', - textbook => 'Textbook', norequest => 'Not allowed', approval => 'Approval by Dom. Coord.', validate => 'With validation', @@ -6671,19 +3027,10 @@ sub courserequest_titles { return %titles; } -sub authorrequest_titles { - my %titles = &Apache::lonlocal::texthash ( - norequest => 'Not allowed', - approval => 'Approval by Dom. Coord.', - automatic => 'Automatic approval', - ); - return %titles; -} - sub courserequest_conditions { my %conditions = &Apache::lonlocal::texthash ( approval => '(Processing of request subject to approval by Domain Coordinator).', - validate => '(Processing of request subject to institutional validation).', + validate => '(Processing of request subject to instittutional validation).', ); return %conditions; } @@ -6714,22 +3061,42 @@ sub print_usercreation { $rowcount ++; } } + 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,$rowcount); + $$rowtotal ++; + $rowcount ++; + } + } if ($rowcount == 0) { $datatable .= ''.&mt('No format rules have been defined for usernames or IDs in this domain.').''; $$rowtotal ++; $rowcount ++; } } elsif ($position eq 'middle') { - my @creators = ('author','course','requestcrs'); + my @creators = ('author','course','requestcrs','selfcreate'); my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom,'username'); my %lt = &usercreation_types(); my %checked; + my @selfcreate; if (ref($settings) eq 'HASH') { if (ref($settings->{'cancreate'}) eq 'HASH') { foreach my $item (@creators) { $checked{$item} = $settings->{'cancreate'}{$item}; } + if (ref($settings->{'cancreate'}{'selfcreate'}) eq 'ARRAY') { + @selfcreate = @{$settings->{'cancreate'}{'selfcreate'}}; + } elsif ($settings->{'cancreate'}{'selfcreate'} ne '') { + if ($settings->{'cancreate'}{'selfcreate'} eq 'any') { + @selfcreate = ('email','login','sso'); + } elsif ($settings->{'cancreate'}{'selfcreate'} ne 'none') { + @selfcreate = ($settings->{'cancreate'}{'selfcreate'}); + } + } } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') { foreach my $item (@creators) { if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) { @@ -6741,8 +3108,10 @@ sub print_usercreation { my $rownum = 0; foreach my $item (@creators) { $rownum ++; - if ($checked{$item} eq '') { - $checked{$item} = 'any'; + if ($item ne 'selfcreate') { + if ($checked{$item} eq '') { + $checked{$item} = 'any'; + } } my $css_class; if ($rownum%2) { @@ -6753,18 +3122,30 @@ sub print_usercreation { $datatable .= ''. ''.$lt{$item}. ''; - my @options = ('any'); - if (ref($rules) eq 'HASH') { - if (keys(%{$rules}) > 0) { - push(@options,('official','unofficial')); + my @options; + if ($item eq 'selfcreate') { + push(@options,('email','login','sso')); + } else { + @options = ('any'); + if (ref($rules) eq 'HASH') { + if (keys(%{$rules}) > 0) { + push(@options,('official','unofficial')); + } } + push(@options,'none'); } - push(@options,'none'); foreach my $option (@options) { my $type = 'radio'; my $check = ' '; - if ($checked{$item} eq $option) { - $check = ' checked="checked" '; + if ($item eq 'selfcreate') { + $type = 'checkbox'; + if (grep(/^\Q$option\E$/,@selfcreate)) { + $check = ' checked="checked" '; + } + } else { + if ($checked{$item} eq $option) { + $check = ' checked="checked" '; + } } $datatable .= '