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

raeburn raeburn at source.lon-capa.org
Sat Jan 30 17:13:53 EST 2021


raeburn		Sat Jan 30 22:13:53 2021 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	domainprefs.pm 
  Log:
  - For 2.11
    Backport 1.340, 1.341, 1.377
  
  
-------------- next part --------------
Index: loncom/interface/domainprefs.pm
diff -u loncom/interface/domainprefs.pm:1.160.6.106 loncom/interface/domainprefs.pm:1.160.6.107
--- loncom/interface/domainprefs.pm:1.160.6.106	Fri Jan  1 15:33:55 2021
+++ loncom/interface/domainprefs.pm	Sat Jan 30 22:13:52 2021
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Handler to set domain-wide configuration settings
 #
-# $Id: domainprefs.pm,v 1.160.6.106 2021/01/01 15:33:55 raeburn Exp $
+# $Id: domainprefs.pm,v 1.160.6.107 2021/01/30 22:13:52 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -335,6 +335,8 @@
                                 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,
@@ -799,8 +801,13 @@
              </tr>'."\n";
             if ($action eq 'coursecategories') {
                 $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
-            } elsif ($action eq 'passwords') {
-                $output .= $item->{'print'}->('lower',$dom,$confname,$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 .= '
              </tr>
             </table>
            </td>
@@ -810,8 +817,13 @@
             <table class="LC_nested">
              <tr class="LC_info_row">
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col1'}).'</td>
-              <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col2'}).'</td></tr>'."\n".
-              $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal).'
+              <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[3]->{'col2'}).'</td></tr>'."\n";
+                 if ($action eq 'passwords') {
+                        $output .= $item->{'print'}->('bottom',$dom,$confname,$settings,\$rowtotal);
+                 } else {
+                        $output .= $item->{'print'}->('bottom',$dom,$settings,\$rowtotal);
+                 }
+                 $output .= '
             </table>
           </td>
          </tr>
@@ -2859,7 +2871,7 @@
     my $datatable;
     my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails,%bccemails,%includestr,%includeloc,%currfield,
-        $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions, at mailings);
+        $maxsize,$fields,$fieldtitles,$fieldoptions,$possoptions, at mailings,%lonstatus);
     if ($position eq 'top') {
         if (ref($settings) eq 'HASH') {
             foreach my $item (@contacts) {
@@ -2874,6 +2886,12 @@
         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) {
@@ -2886,7 +2904,7 @@
         ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
     }
     if (ref($settings) eq 'HASH') {
-        unless ($position eq 'top') {
+        unless (($position eq 'top') || ($position eq 'lower')) {
             foreach my $type (@mailings) {
                 if (exists($settings->{$type})) {
                     if (ref($settings->{$type}) eq 'HASH') {
@@ -3019,7 +3037,7 @@
         $datatable .= '</td></tr>'."\n";
         $rownum ++;
     }
-    unless ($position eq 'top') {
+    unless (($position eq 'top') || ($position eq 'lower')) {
         foreach my $type (@mailings) {
             $css_class = $rownum%2?' class="LC_odd_row"':'';
             $datatable .= '<tr'.$css_class.'>'.
@@ -3066,18 +3084,110 @@
     }
     if ($position eq 'middle') {
         my %choices;
-        $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',
-                                       &Apache::loncommon::modal_link('http://loncapa.org/core.html',
-                                       &mt('LON-CAPA core group - MSU'),600,500));
+        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]',
-                                        &Apache::loncommon::modal_link('http://loncapa.org/core.html',
-                                        &mt('LON-CAPA core group - MSU'),600,500));
-        my @toggles = ('reporterrors','reportupdates');
+                                        $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');
+                              'reportupdates' => 'on',
+                              'reportstatus'  => 'on');
         (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                    \%choices,$rownum);
         $datatable .= $reports;
+    } elsif ($position eq 'lower') {
+        $css_class = $rownum%2?' class="LC_odd_row"':'';
+        my ($threshold,$sysmail,%excluded,%weights);
+        my ($defaults,$names) = &Apache::loncommon::lon_status_items();
+        if ($lonstatus{'threshold'} =~ /^\d+$/) {
+            $threshold = $lonstatus{'threshold'};
+        } else {
+            $threshold = $defaults->{'threshold'};
+        }
+        if ($lonstatus{'sysmail'} =~ /^\d+$/) {
+            $sysmail = $lonstatus{'sysmail'};
+        } else {
+            $sysmail = $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'}};
+            }
+        }
+        $datatable .= '<tr'.$css_class.'>'.
+                      '<td class="LC_left_item"><span class="LC_nobreak">'.
+                      $titles->{'errorthreshold'}.
+                      '</span></td><td class="LC_left_item">'.
+                      '<input type="text" name="errorthreshold" value="'.
+                      $threshold.'" size="5" /></td></tr>';
+        $rownum ++;
+        $css_class = $rownum%2?' class="LC_odd_row"':'';
+        $datatable .= '<tr'.$css_class.'>'.
+                      '<td class="LC_left_item">'.
+                      '<span class="LC_nobreak">'.$titles->{'errorweights'}.
+                      '</span></td><td class="LC_left_item"><table><tr>';
+        foreach my $type ('E','W','N','U') {
+            $datatable .= '<td>'.$names->{$type}.'<br />'.
+                          '<input type="text" name="errorweights_'.$type.'" value="'.
+                          $weights{$type}.'" size="5" /></td>';
+        }
+        $datatable .= '</tr></table></tr>';
+        $rownum ++;
+        $css_class = $rownum%2?' class="LC_odd_row"':'';
+        $datatable .= '<tr'.$css_class.'><td class="LC_left_item">'.
+                      $titles->{'errorexcluded'}.'</td>'.
+                      '<td class="LC_left_item"><table>';
+        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 .= '</tr>';
+                }
+                $datatable .= '<tr>';
+            }
+            my $check;
+            if ($excluded{$ids[$i]}) {
+                $check = ' checked="checked" ';
+            }
+            $datatable .= '<td class="LC_left_item">'.
+                          '<span class="LC_nobreak"><label>'.
+                          '<input type="checkbox" name="errorexcluded" '.
+                          'value="'.$ids[$i].'"'.$check.' />'.
+                          $ids[$i].'</label></span></td>';
+        }
+        my $colsleft = $numinrow - @ids%($numinrow);
+        if ($colsleft > 1 ) {
+            $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
+                          ' </td>';
+        } elsif ($colsleft == 1) {
+            $datatable .= '<td class="LC_left_item"> </td>';
+        }
+        $datatable .= '</tr></table></td></tr>';
+        $rownum ++;
+        $css_class = $rownum%2?' class="LC_odd_row"':'';
+        $datatable .= '<tr'.$css_class.'>'.
+                      '<td class="LC_left_item"><span class="LC_nobreak">'.
+                      $titles->{'errorsysmail'}.
+                      '</span></td><td class="LC_left_item">'.
+                      '<input type="text" name="errorsysmail" value="'.
+                      $sysmail.'" size="5" /></td></tr>';
+        $rownum ++;
     } elsif ($position eq 'bottom') {
         my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
         my (@posstypes,%usertypeshash);
@@ -3151,6 +3261,11 @@
     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) = @_;
@@ -5481,6 +5596,10 @@
                    '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/warning threshold for status e-mail',
+                   'errorsysmail'    => 'Error threshold for e-mail to core group',
+                   'errorweights'    => 'Weights used to compute error count',
+                   'errorexcluded'   => 'Servers with unsent updates excluded from count',
                  );
     my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',
@@ -10487,7 +10606,8 @@
     my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail','otherdomsmail',
                     'lonstatusmail','requestsmail','updatesmail','idconflictsmail','hostipmail');
-    my @toggles = ('reporterrors','reportupdates');
+    my @toggles = ('reporterrors','reportupdates','reportstatus');
+    my @lonstatus = ('threshold','sysmail','weights','excluded');
     my ($fields,$fieldtitles,$fieldoptions,$possoptions) = &helpform_fields();
     foreach my $type (@mailings) {
         @{$newsetting{$type}} = 
@@ -10520,6 +10640,41 @@
             $contacts_hash{'contacts'}{$item} = $env{'form.'.$item};
         }
     }
+    my ($lonstatus_defs,$lonstatus_names) = &Apache::loncommon::lon_status_items();
+    foreach my $item (@lonstatus) {
+        if ($item eq 'excluded') {
+            my (%serverhomes, at excluded);
+            map { $serverhomes{$_} = 1; } values(%Apache::lonnet::serverhomeIDs);
+            my @possexcluded = &Apache::loncommon::get_env_multiple('form.errorexcluded');
+            if (@possexcluded) {
+                foreach my $id (sort(@possexcluded)) {
+                    if ($serverhomes{$id}) {
+                        push(@excluded,$id);
+                    }
+                }
+            }
+            if (@excluded) {
+                $contacts_hash{'contacts'}{'lonstatus'}{$item} = \@excluded;
+            }
+        } elsif ($item eq 'weights') {
+            foreach my $type ('E','W','N','U') {
+                $env{'form.error'.$item.'_'.$type} =~ s/^\s+|\s+$//g;
+                if ($env{'form.error'.$item.'_'.$type} =~ /^\d+$/) {
+                    unless ($env{'form.error'.$item.'_'.$type} == $lonstatus_defs->{$type}) {
+                        $contacts_hash{'contacts'}{'lonstatus'}{$item}{$type} =
+                            $env{'form.error'.$item.'_'.$type};
+                    }
+                }
+            }
+        } elsif (($item eq 'threshold') || ($item eq 'sysmail')) {
+            $env{'form.error'.$item} =~ s/^\s+|\s+$//g;
+            if ($env{'form.error'.$item} =~ /^\d+$/) {
+                unless ($env{'form.error'.$item} == $lonstatus_defs->{$item}) {
+                    $contacts_hash{'contacts'}{'lonstatus'}{$item} = $env{'form.error'.$item};
+                }
+            }
+        }
+    }
     if ((ref($fields) eq 'ARRAY') && (ref($possoptions) eq 'HASH')) {
         foreach my $field (@{$fields}) {
             if (ref($possoptions->{$field}) eq 'ARRAY') {
@@ -10658,6 +10813,76 @@
                 }
             }
         }
+        if (ref($currsetting{'lonstatus'}) eq 'HASH') {
+            foreach my $key ('excluded','weights','threshold','sysmail') {
+                if ($key eq 'excluded') {
+                    if ((ref($contacts_hash{contacts}{lonstatus}) eq 'HASH') &&
+                        (ref($contacts_hash{contacts}{lonstatus}{excluded}) eq 'ARRAY')) {
+                        if ((ref($currsetting{'lonstatus'}{$key}) eq 'ARRAY') &&
+                            (@{$currsetting{'lonstatus'}{$key}})) {
+                            my @diffs =
+                                &Apache::loncommon::compare_arrays($contacts_hash{contacts}{lonstatus}{excluded},
+                                                                   $currsetting{'lonstatus'}{$key});
+                            if (@diffs) {
+                                push(@{$changes{'lonstatus'}},$key);
+                            }
+                        } elsif (@{$contacts_hash{contacts}{lonstatus}{excluded}}) {
+                            push(@{$changes{'lonstatus'}},$key);
+                        }
+                    } elsif ((ref($currsetting{'lonstatus'}{$key}) eq 'ARRAY') &&
+                             (@{$currsetting{'lonstatus'}{$key}})) {
+                        push(@{$changes{'lonstatus'}},$key);
+                    }
+                } elsif ($key eq 'weights') {
+                    if ((ref($contacts_hash{contacts}{lonstatus}) eq 'HASH') &&
+                        (ref($contacts_hash{contacts}{lonstatus}{$key}) eq 'HASH')) {
+                        if (ref($currsetting{'lonstatus'}{$key}) eq 'HASH') {
+                            foreach my $type ('E','W','N','U') {
+                                unless ($contacts_hash{contacts}{lonstatus}{$key}{$type} eq
+                                        $currsetting{'lonstatus'}{$key}{$type}) {
+                                    push(@{$changes{'lonstatus'}},$key);
+                                    last;
+                                }
+                            }
+                        } else {
+                            foreach my $type ('E','W','N','U') {
+                                if ($contacts_hash{contacts}{lonstatus}{$key}{$type} ne '') {
+                                    push(@{$changes{'lonstatus'}},$key);
+                                    last;
+                                }
+                            }
+                        }
+                    } elsif (ref($currsetting{'lonstatus'}{$key}) eq 'HASH') {
+                        foreach my $type ('E','W','N','U') {
+                            if ($currsetting{'lonstatus'}{$key}{$type} ne '') {
+                                push(@{$changes{'lonstatus'}},$key);
+                                last;
+                            }
+                        }
+                    }
+                } elsif (($key eq 'threshold') || ($key eq 'sysmail')) {
+                    if (ref($contacts_hash{contacts}{lonstatus}) eq 'HASH') {
+                        if ($currsetting{'lonstatus'}{$key} =~ /^\d+$/) {
+                            if ($currsetting{'lonstatus'}{$key} != $contacts_hash{contacts}{lonstatus}{$key}) {
+                                push(@{$changes{'lonstatus'}},$key);
+                            }
+                        } elsif ($contacts_hash{contacts}{lonstatus}{$key} =~ /^\d+$/) {
+                            push(@{$changes{'lonstatus'}},$key);
+                        }
+                    } elsif ($currsetting{'lonstatus'}{$key} =~ /^\d+$/) {
+                        push(@{$changes{'lonstatus'}},$key);
+                    }
+                }
+            }
+        } else {
+            if (ref($contacts_hash{contacts}{lonstatus}) eq 'HASH') {
+                foreach my $key ('excluded','weights','threshold','sysmail') {
+                    if (exists($contacts_hash{contacts}{lonstatus}{$key})) {
+                        push(@{$changes{'lonstatus'}},$key);
+                    }
+                }
+            }
+        }
     } else {
         my %default;
         $default{'supportemail'} = $Apache::lonnet::perlvar{'lonSupportEMail'};
@@ -10703,6 +10928,13 @@
                 }
             }
         }
+        if (ref($contacts_hash{contacts}{lonstatus}) eq 'HASH') {
+            foreach my $key ('excluded','weights','threshold','sysmail') {
+                if (exists($contacts_hash{contacts}{lonstatus}{$key})) {
+                    push(@{$changes{'lonstatus'}},$key);
+                }
+            }
+        }
     }
     foreach my $item (@toggles) {
         if (($env{'form.'.$item} == 1) && ($currsetting{$item} == 0)) {
@@ -10828,22 +11060,79 @@
                 }
             }
             my @offon = ('off','on');
+            my $corelink = &core_link_msu();
             if ($changes{'reporterrors'}) {
                 $resulttext .= '<li>'.
                                &mt('E-mail error reports to [_1] set to "'.
                                    $offon[$env{'form.reporterrors'}].'".',
-                                   &Apache::loncommon::modal_link('http://loncapa.org/core.html',
-                                       &mt('LON-CAPA core group - MSU'),600,500)).
+                                   $corelink).
                                '</li>';
             }
             if ($changes{'reportupdates'}) {
                 $resulttext .= '<li>'.
                                 &mt('E-mail record of completed LON-CAPA updates to [_1] set to "'.
                                     $offon[$env{'form.reportupdates'}].'".',
-                                    &Apache::loncommon::modal_link('http://loncapa.org/core.html',
-                                        &mt('LON-CAPA core group - MSU'),600,500)).
+                                    $corelink).
                                 '</li>';
             }
+            if ($changes{'reportstatus'}) {
+                $resulttext .= '<li>'.
+                                &mt('E-mail status if errors above threshold to [_1] set to "'.
+                                    $offon[$env{'form.reportstatus'}].'".',
+                                    $corelink).
+                                '</li>';
+            }
+            if (ref($changes{'lonstatus'}) eq 'ARRAY') {
+                $resulttext .= '<li>'.
+                               &mt('Nightly status check e-mail settings').':<ul>';
+                my (%defval,%use_def,%shown);
+                $defval{'threshold'} = $lonstatus_defs->{'threshold'};
+                $defval{'sysmail'} = $lonstatus_defs->{'sysmail'};
+                $defval{'weights'} =
+                    join(', ',map { $lonstatus_names->{$_}.'='.$lonstatus_defs->{$_}; } ('E','W','N','U'));
+                $defval{'excluded'} = &mt('None');
+                if (ref($contacts_hash{'contacts'}{'lonstatus'}) eq 'HASH') {
+                    foreach my $item ('threshold','sysmail','weights','excluded') {
+                        if (exists($contacts_hash{'contacts'}{'lonstatus'}{$item})) {
+                            if (($item eq 'threshold') || ($item eq 'sysmail')) {
+                                $shown{$item} = $contacts_hash{'contacts'}{'lonstatus'}{$item};
+                            } elsif ($item eq 'weights') {
+                                if (ref($contacts_hash{'contacts'}{'lonstatus'}{$item}) eq 'HASH') {
+                                    foreach my $type ('E','W','N','U') {
+                                        $shown{$item} .= $lonstatus_names->{$type}.'=';
+                                        if (exists($contacts_hash{'contacts'}{'lonstatus'}{$item}{$type})) {
+                                            $shown{$item} .= $contacts_hash{'contacts'}{'lonstatus'}{$item}{$type};
+                                        } else {
+                                            $shown{$item} .= $lonstatus_defs->{$type};
+                                        }
+                                        $shown{$item} .= ', ';
+                                    }
+                                    $shown{$item} =~ s/, $//;
+                                } else {
+                                    $shown{$item} = $defval{$item};
+                                }
+                            } elsif ($item eq 'excluded') {
+                                if (ref($contacts_hash{'contacts'}{'lonstatus'}{$item}) eq 'ARRAY') {
+                                    $shown{$item} = join(', ',@{$contacts_hash{'contacts'}{'lonstatus'}{$item}});
+                                } else {
+                                    $shown{$item} = $defval{$item};
+                                }
+                            }
+                        } else {
+                            $shown{$item} = $defval{$item};
+                        }
+                    }
+                } else {
+                    foreach my $item ('threshold','weights','excluded','sysmail') {
+                        $shown{$item} = $defval{$item};
+                    }
+                }
+                foreach my $item ('threshold','weights','excluded','sysmail') {
+                    $resulttext .= '<li>'.&mt($titles->{'error'.$item}.' -- [_1]',
+                                          $shown{$item}).'</li>';
+                }
+                $resulttext .= '</ul></li>';
+            }
             if ((ref($changes{'helpform'}) eq 'ARRAY') && (ref($fields) eq 'ARRAY')) {
                 my (@optional, at required, at unused,$maxsizechg);
                 foreach my $field (@{$changes{'helpform'}}) {


More information about the LON-CAPA-cvs mailing list