[LON-CAPA-cvs] cvs: loncom /interface domainprefs.pm

raeburn lon-capa-cvs-allow@mail.lon-capa.org
Sun, 16 Sep 2007 17:26:56 -0000


This is a MIME encoded message

--raeburn1189963616
Content-Type: text/plain

raeburn		Sun Sep 16 13:26:56 2007 EDT

  Modified files:              
    /loncom/interface	domainprefs.pm 
  Log:
  Add ability to set/modify e-mail addresse(es) used for:
   - support e-mail (target used for form data captured" by "Ask helpdesk"
   - package updates (target used by CHECKRPMS)
   - error report forms (form data captured when an ISE occurs and use submits error report).
   - additional e-mail addresses besides default Admin E-mail address and Support E-mail Address can be specified.
  
  Add ability to specify which authentication types are selectable when new users are added, in different contexts:
   - as an author adding co-author/assistant author
   - adding users to a course
   - as a Domain Coordinator adding users to a domain.
  
  Filesystem authentication not included in possible selections (phasing this out as an option for new users).
  
  
  
--raeburn1189963616
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20070916132656.txt"

Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.27 loncom/interface/domainprefs.pm:1.28
--- loncom/interface/domainprefs.pm:1.27	Wed Sep 12 08:01:04 2007
+++ loncom/interface/domainprefs.pm	Sun Sep 16 13:26:56 2007
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.27 2007/09/12 12:01:04 raeburn Exp $
+# $Id: domainprefs.pm,v 1.28 2007/09/16 17:26:56 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -68,7 +68,7 @@
     my %domconfig =
       &Apache::lonnet::get_dom('configuration',['login','rolecolors',
                 'quotas','autoenroll','autoupdate','directorysrch',
-                'usercreation'],$dom);
+                'usercreation','contacts'],$dom);
     my @prefs = (
       { text => 'Default color schemes',
         help => 'Default_Color_Schemes',
@@ -114,11 +114,20 @@
         header => [{col1 => 'Setting',
                     col2 => 'Value',}],
         },
+      { text => 'Contact Information',
+        help => 'Domain_Contact_Information',
+        action => 'contacts',
+        header => [{col1 => 'Setting',
+                    col2 => 'Value',}],
+        },
+
       { text => 'User creation',
         help => 'Domain_User_Creation',
         action => 'usercreation',
         header => [{col1 => 'Setting',
-                    col2 => 'Value',}],
+                    col2 => 'Value',},
+                   {col1 => 'Context',
+                    col2 => 'Assignable Authentication Types'}],
         },
     );
     my @roles = ('student','coordinator','author','admin');
@@ -166,7 +175,7 @@
                 }
                 if ($custom_img_count > 0) {
                     my $switch_server = &check_switchserver($dom,$confname);
-                    $r->print(&mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.&mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'<br /><br />'.&mt("Thereafter, you will be able to update settings from this screen when logged in to any server in the LON-CAPA network (with a DC role selected in the domain), although you will still need to switch to the domain's primary library server to upload new images or logos.").'<br /><br />'.$switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
+                    $r->print(&mt('Domain configuration settings have yet to be saved for this domain via the web-based domain preferences interface.').'<br />'.&mt("While this remains so, you must switch to the domain's primary library server in order to update settings.").'<br /><br />'.&mt("Thereafter, you will be able to update settings from this screen when logged in to any server in the LON-CAPA network (with a Domain Coordinator role selected in the domain), although you will still need to switch to the domain's primary library server to upload new images or logos.").'<br /><br />'.$switch_server.' '.&mt('to primary library server for domain: [_1]',$dom));
                     return OK;
                 }
             }
@@ -205,7 +214,9 @@
     } elsif ($action eq 'directorysrch') {
         $output = &modify_directorysrch($dom,%domconfig);
     } elsif ($action eq 'usercreation') {
-        $output = &modify_user_creation($dom,%domconfig);
+        $output = &modify_usercreation($dom,%domconfig);
+    } elsif ($action eq 'contacts') {
+        $output = &modify_contacts($dom,%domconfig);
     }
     return $output;
 }
@@ -221,7 +232,8 @@
 #           <th>'.&mt($item->{text}).'&nbsp;'.
 #           &Apache::loncommon::help_open_topic($item->{'help'}).'</th>
 #          </tr>');
-    if (($action eq 'autoupdate') || ($action eq 'rolecolors')) {
+    if (($action eq 'autoupdate') || ($action eq 'rolecolors') || 
+        ($action eq 'usercreation')) {
         my $colspan = ($action eq 'rolecolors')?' colspan="2"':'';
         $r->print('
           <tr>
@@ -233,6 +245,8 @@
              </tr>');
         if ($action eq 'autoupdate') {
             $r->print(&print_autoupdate('top',$dom,$settings));
+        } elsif ($action eq 'usercreation') {
+            $r->print(&print_usercreation('top',$dom,$settings)); 
         } else {
             $r->print(&print_rolecolors($phase,'student',$dom,$confname,$settings));
         }
@@ -249,6 +263,8 @@
              </tr>');
         if ($action eq 'autoupdate') {
             $r->print(&print_autoupdate('bottom',$dom,$settings));
+        } elsif ($action eq 'usercreation') {
+            $r->print(&print_usercreation('bottom',$dom,$settings));
         } else {
             $r->print(&print_rolecolors($phase,'coordinator',$dom,$confname,$settings).'
            </table>
@@ -291,15 +307,15 @@
               <td class="LC_right_item">'.$item->{'header'}->[0]->{'col2'}.'</td>
              </tr>');
         if ($action eq 'login') {
-           $r->print(&print_login($dom,$confname,$phase,$settings));
+            $r->print(&print_login($dom,$confname,$phase,$settings));
         } elsif ($action eq 'quotas') {
-           $r->print(&print_quotas($dom,$settings));
+            $r->print(&print_quotas($dom,$settings));
         } elsif ($action eq 'autoenroll') {
-           $r->print(&print_autoenroll($dom,$settings));
+            $r->print(&print_autoenroll($dom,$settings));
         } elsif ($action eq 'directorysrch') {
-           $r->print(&print_directorysrch($dom,$settings));
-        } elsif ($action eq 'usercreation') {
-           $r->print(&print_usercreation($dom,$settings));
+            $r->print(&print_directorysrch($dom,$settings));
+        } elsif ($action eq 'contacts') {
+            $r->print(&print_contacts($dom,$settings));
         }
     }
     $r->print('
@@ -1011,35 +1027,175 @@
     return $datatable;
 }
 
-sub print_usercreation {
+sub print_contacts {
     my ($dom,$settings) = @_;
-    my $numinrow = 4;
-    my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
-    my %checked;
+    my $datatable;
+    my @contacts = ('adminemail','supportemail');
+    my (%checked,%to,%otheremails);
+    my @mailings = ('errormail','packagesmail','helpdeskmail');
+    foreach my $type (@mailings) {
+        $otheremails{$type} = '';
+    }
     if (ref($settings) eq 'HASH') {
-        if (ref($settings->{'cancreate'}) eq 'ARRAY') {
-            foreach my $item (@{$settings->{'cancreate'}}) { 
-                $checked{$item} = ' checked="checked" ';
+        foreach my $item (@contacts) {
+            if (exists($settings->{$item})) {
+                $to{$item} = $settings->{$item};
             }
         }
+        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'};
+                }
+            }
+        }
+    } else {
+        $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" '; 
     }
-    my $datatable = '<td>'.&mt('User creation other than by DC: ').'</td>'.
-                    '<td class="LC_left_item"><table><tr><td>'.
-                    '<span class="LC_nobreak"><label>'.
-                    '<input type="checkbox" name="can_createuser" '.
-                    $checked{'author'}.' value="author" />'.
-                    &mt('When adding a co-author/assistant author').
-	            '</label><span></td></tr>'.
-                    '<tr><td>'.
-                    '<span class="LC_nobreak"><label>'.
-                    '<input type="checkbox" name="can_createuser" '.
-                    $checked{'course'}.' value="course" />'.
-                    &mt('When adding users to a course').
-                    '</label><span></td></tr></table></td></tr>';
-    if (ref($rules) eq 'HASH') {
-        if (keys(%{$rules}) > 0) {
-            $datatable .= &username_formats_row($settings,$rules,$ruleorder,
-                                                $numinrow);
+    my ($titles,$short_titles) = &contact_titles();
+    my $rownum = 0;
+    my $css_class;
+    foreach my $item (@contacts) {
+        if ($rownum%2) {
+            $css_class = '';
+        } else {
+            $css_class = ' class="LC_odd_row" ';
+        }
+        $datatable .= '<tr'.$css_class.' ">'. 
+                  '<td>'.$titles->{$item}.'</td>'.
+                  '<td class="LC_right_item">'.
+                  '<input type="text" name="'.$item.'" value="'.
+                  $to{$item}.'" /></td></tr>';
+        $rownum ++;
+    }
+    foreach my $type (@mailings) {
+        if ($rownum%2) {
+            $css_class = '';
+        } else {
+            $css_class = ' class="LC_odd_row" ';
+        }
+        $datatable .= '<tr'.$css_class.'>'.
+                      '<td>'.$titles->{$type}.': </td>'.
+                      '<td class="LC_left_item">'.
+                      '<span class="LC_nobreak">';
+        foreach my $item (@contacts) {
+            $datatable .= '<label>'.
+                          '<input type="checkbox" name="'.$type.'"'.
+                          $checked{$type}{$item}.
+                          ' value="'.$item.'" />'.$short_titles->{$item}.
+                          '</label>&nbsp;';
+        }
+        $datatable .= '</span><br />'.&mt('Others').':&nbsp;&nbsp;'.
+                      '<input type="text" name="'.$type.'_others" '.
+                      'value="'.$otheremails{$type}.'"  />'.
+                      '</td></tr>'."\n";
+        $rownum ++;
+    }
+    return $datatable;
+}
+
+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 to be e-mailed to'
+                 );
+    my %short_titles = &Apache::lonlocal::texthash (
+                           adminemail   => 'Admin E-mail address',
+                           supportemail => 'Support E-mail',
+                       );   
+    return (\%titles,\%short_titles);
+}
+
+sub print_usercreation {
+    my ($position,$dom,$settings) = @_;
+    my $numinrow = 4;
+    my $rowcount = 0;
+    my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($dom);
+    my $datatable;
+    my %lt = &Apache::lonlocal::texthash (
+                        nondc => 'User creation other than by Domain Coordinator: ',
+                        author => 'When adding a co-author/assistant author',
+                        course => 'When adding users to a course',
+    );
+    if ($position eq 'top') {
+        my %checked;
+        if (ref($settings) eq 'HASH') {
+            if (ref($settings->{'cancreate'}) eq 'ARRAY') {
+                foreach my $item (@{$settings->{'cancreate'}}) {
+                    $checked{$item} = ' checked="checked" ';
+                }
+            }
+        }
+        $datatable = '<tr class="LC_odd_row">'.
+                     '<td>'.$lt{'nondc'}.'</td>'.
+                     '<td class="LC_left_item"><table>';
+        foreach my $item ('author','course') {
+            $datatable .= '<tr><td><span class="LC_nobreak"><label>'.
+                          '<input type="checkbox" name="can_createuser" '.
+                          $checked{$item}.' value="'.$item.'" />'.
+                          $lt{$item}.'</label><span></td></tr>';
+        }
+        $datatable .= '</table></td></tr>';
+        $rowcount ++;
+        if (ref($rules) eq 'HASH') {
+            if (keys(%{$rules}) > 0) {
+                $datatable .= &username_formats_row($settings,$rules,
+                                                    $ruleorder,$numinrow);
+                $rowcount ++;
+            }
+        }
+    } else {
+        my @contexts = ('author','course','domain');
+        my @authtypes = ('int','krb4','krb5','loc');
+        my %checked;
+        if (ref($settings) eq 'HASH') {
+            if (ref($settings->{'authtypes'}) eq 'HASH') {
+                foreach my $item (@contexts) {
+                    if (ref($settings->{'authtypes'}{$item}) eq 'HASH') {
+                        foreach my $auth (@authtypes) {
+                            if ($settings->{'authtypes'}{$item}{$auth}) {
+                                $checked{$item}{$auth} = ' checked="checked" ';
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        my @authtypes = ('int','krb4','krb5','loc');
+        my %title = &context_names();
+        my %authname = &authtype_names();
+        my $rownum = 0;
+        my $css_class; 
+        foreach my $item (@contexts) {
+            if ($rownum%2) {
+                $css_class = '';
+            } else {
+                $css_class = ' class="LC_odd_row" ';
+            }
+            $datatable .=   '<tr'.$css_class.'">'.
+                            '<td>'.$title{$item}.
+                            '</td><td class="LC_left_item">'.
+                            '<span class="LC_nobreak">';
+            foreach my $auth (@authtypes) {
+                $datatable .= '<label>'. 
+                              '<input type="checkbox" name="'.$item.'_auth" '.
+                              $checked{$item}{$auth}.' value="'.$auth.'" />'.
+                              $authname{$auth}.'</label>&nbsp;';
+            }
+            $datatable .= '</span></td></tr>';
+            $rownum ++;
         }
     }
     return $datatable;
@@ -1047,8 +1203,8 @@
 
 sub username_formats_row {
     my ($settings,$rules,$ruleorder,$numinrow) = @_;
-    my $output =  '<tr class="LC_odd_row">'.
-                  '<td>'.&mt('Format rules to check for new usernames').
+    my $output =  '<tr>'.
+                  '<td>'.&mt('Format rules to check for new usernames: ').
                   '</td><td class="LC_left_item" colspan="2"><table>';
     my $rem;
     if (ref($ruleorder) eq 'ARRAY') {
@@ -1087,6 +1243,26 @@
     return $output;
 }
 
+sub authtype_names {
+    my %lt = &Apache::lonlocal::texthash(
+                      int    => 'Internal',
+                      krb4   => 'Kerberos 4',
+                      krb5   => 'Kerberos 5',
+                      loc    => 'Local',
+                  );
+    return %lt;
+}
+
+sub context_names {
+    my %context_title = &Apache::lonlocal::texthash(
+       author => 'Creating users when an Author',
+       course => 'Creating users when in a course',
+       domain => 'Creating users when a Domain Coordinator',
+    );
+    return %context_title;
+}
+
+
 sub users_cansearch_row {
     my ($settings,$types,$usertypes,$dom,$numinrow,$othertitle) = @_;
     my $output =  '<tr class="LC_odd_row">'.
@@ -2248,9 +2424,118 @@
     return $resulttext;
 }
 
-sub modify_user_creation {
+sub modify_contacts {
+    my ($dom,%domconfig) = @_;
+    my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
+    if (ref($domconfig{'contacts'}) eq 'HASH') {
+        foreach my $key (keys(%{$domconfig{'contacts'}})) {
+            $currsetting{$key} = $domconfig{'contacts'}{$key};
+        }
+    }
+    my (%others,%to);
+    my @contacts = ('supportemail','adminemail');
+    my @mailings = ('errormail','packagesmail','helpdeskmail');
+    foreach my $type (@mailings) {
+        @{$newsetting{$type}} = 
+            &Apache::loncommon::get_env_multiple('form.'.$type);
+        foreach my $item (@contacts) {
+            if (grep(/^\Q$item\E$/,@{$newsetting{$type}})) {
+                $contacts_hash{contacts}{$type}{$item} = 1;
+            } else {
+                $contacts_hash{contacts}{$type}{$item} = 0;
+            }
+        }  
+        $others{$type} = $env{'form.'.$type.'_others'};
+        $contacts_hash{contacts}{$type}{'others'} = $others{$type};
+    }
+    foreach my $item (@contacts) {
+        $to{$item} = $env{'form.'.$item};
+        $contacts_hash{'contacts'}{$item} = $to{$item};
+    }
+    if (keys(%currsetting) > 0) {
+        foreach my $item (@contacts) {
+            if ($to{$item} ne $currsetting{$item}) {
+                $changes{$item} = 1;
+            }
+        }
+        foreach my $type (@mailings) {
+            foreach my $item (@contacts) {
+                if (ref($currsetting{$type}) eq 'HASH') {
+                    if ($currsetting{$type}{$item} ne $contacts_hash{contacts}{$type}{$item}) {
+                        push(@{$changes{$type}},$item);
+                    }
+                } else {
+                    push(@{$changes{$type}},@{$newsetting{$type}});
+                }
+            }
+            if ($others{$type} ne $currsetting{$type}{'others'}) {
+                push(@{$changes{$type}},'others');
+            }
+        }
+    } else {
+        my %default;
+        $default{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
+        $default{'adminemail'} = $Apache::lonnet::perlvar{'lonAdmEMail'};
+        $default{'errormail'} = 'adminemail';
+        $default{'packagesmail'} = 'adminemail';
+        $default{'helpdeskmail'} = 'supportemail';
+        foreach my $item (@contacts) {
+           if ($to{$item} ne $default{$item}) {
+              $changes{$item} = 1;
+           } 
+        }
+        foreach my $type (@mailings) {
+            if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
+               
+                push(@{$changes{$type}},@{$newsetting{$type}});
+            }
+            if ($others{$type} ne '') {
+                push(@{$changes{$type}},'others');
+            } 
+        }
+    }
+    my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
+                                             $dom);
+    if ($putresult eq 'ok') {
+        if (keys(%changes) > 0) {
+            my ($titles,$short_titles)  = &contact_titles();
+            $resulttext = &mt('Changes made:').'<ul>';
+            foreach my $item (@contacts) {
+                if ($changes{$item}) {
+                    $resulttext .= '<li>'.$titles->{$item}.
+                                    &mt(' set to: ').
+                                    '<span class="LC_cusr_emph">'.
+                                    $to{$item}.'</span></li>';
+                }
+            }
+            foreach my $type (@mailings) {
+                if (ref($changes{$type}) eq 'ARRAY') {
+                    $resulttext .= '<li>'.$titles->{$type}.': ';
+                    my @text;
+                    foreach my $item (@{$newsetting{$type}}) {
+                        push(@text,$short_titles->{$item});
+                    }
+                    if ($others{$type} ne '') {
+                        push(@text,$others{$type});
+                    }
+                    $resulttext .= '<span class="LC_cusr_emph">'.
+                                   join(', ',@text).'</span></li>';
+                }
+            }
+            $resulttext .= '</ul>';
+        } else {
+            $resulttext = &mt('No changes made to contact information.');
+        }
+    } else {
+        $resulttext = '<span class="LC_error">'.
+            &mt('An error occurred: [_1].',$putresult).'</span>';
+    }
+    return $resulttext;
+}
+
+sub modify_usercreation {
     my ($dom,%domconfig) = @_;
-    my ($resulttext,%curr_usercreation,%changes);
+    my ($resulttext,%curr_usercreation,%changes,%authallowed);
     if (ref($domconfig{'usercreation'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'usercreation'}})) {
             $curr_usercreation{$key} = $domconfig{'usercreation'}{$key};
@@ -2291,10 +2576,41 @@
         push(@{$changes{'username_rule'}},@username_rule);
     }
 
+    my @contexts = ('author','course','domain');
+    my @authtypes = ('int','krb4','krb5','loc');
+    my %authhash;
+    foreach my $item (@contexts) {
+        my @authallowed =  &Apache::loncommon::get_env_multiple('form.'.$item.'_auth');
+        foreach my $auth (@authtypes) {
+            if (grep(/^\Q$auth\E$/,@authallowed)) {
+                $authhash{$item}{$auth} = 1;
+            } else {
+                $authhash{$item}{$auth} = 0;
+            }
+        }
+    }
+    if (ref($curr_usercreation{'authtypes'}) eq 'HASH') {
+        foreach my $item (@contexts) {
+            if (ref($curr_usercreation{'authtypes'}{$item}) eq 'HASH') {
+                foreach my $auth (@authtypes) {
+                    if ($authhash{$item}{$auth} ne $curr_usercreation{'authtypes'}{$item}{$auth}) {
+                        push(@{$changes{'authtypes'}},$item);
+                        last;
+                    }
+                }
+            }
+        }
+    } else {
+        foreach my $item (@contexts) {
+            push(@{$changes{'authtypes'}},$item);
+        }
+    }
+
     my %usercreation_hash =  (
-            usercreation => { 
+            usercreation => {
                               cancreate     => \@cancreate,
                               username_rule => \@username_rule,
+                              authtypes      => \%authhash,
                             }
             );
 
@@ -2303,7 +2619,6 @@
     if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';
-            my $chgtext;
             if (ref($changes{'cancreate'}) eq 'ARRAY') {
                 my $chgtext = '<ul>';
                 foreach my $type (@cancreate) {
@@ -2328,12 +2643,31 @@
                 if (@username_rule > 0) {
                     $resulttext .= '<li>'.&mt('Usernames with the following formats are restricted to verified users in the institutional directory: ').$chgtext.'</li>';     
                 } else {
-                    $resulttext .= '<li>'.&mt('There are now no username formats currenty restricted to verified users in the institutional directory.').'</li>'; 
+                    $resulttext .= '<li>'.&mt('There are now no username formats restricted to verified users in the institutional directory.').'</li>'; 
                 }
             }
+            my %authname = &authtype_names();
+            my %context_title = &context_names();
+            if (ref($changes{'authtypes'}) eq 'ARRAY') {
+                my @unchanged;
+                my $chgtext = '<ul>';
+                foreach my $type (@{$changes{'authtypes'}}) {
+                    my @allowed;
+                    $chgtext .= '<li><span class="LC_cusr_emph">'.$context_title{$type}.'</span> - '.&mt('assignable authentication types: ');
+                    foreach my $auth (@authtypes) {
+                        if ($authhash{$type}{$auth}) {
+                            push(@allowed,$authname{$auth});
+                        }
+                    }
+                    $chgtext .= join(', ',@allowed).'</li>';
+                }
+                $chgtext .= '</ul>';
+                $resulttext .= '<li>'.&mt('Authentication types available for assignment to new users').'<br />'.$chgtext;
+                $resulttext .= '</li>';
+            }
             $resulttext .= '</ul>';
         } else {
-            $resulttext = &mt('No changes made to log-in page settings');
+            $resulttext = &mt('No changes made to user creation settings');
         }
     } else {
         $resulttext = '<span class="LC_error">'.

--raeburn1189963616--