diff options
-rwxr-xr-x | sanitycheck.cgi | 54 | ||||
-rw-r--r-- | template/en/default/admin/sanitycheck/messages.html.tmpl | 19 |
2 files changed, 73 insertions, 0 deletions
diff --git a/sanitycheck.cgi b/sanitycheck.cgi index 171029b2e..93228fc67 100755 --- a/sanitycheck.cgi +++ b/sanitycheck.cgi @@ -341,6 +341,36 @@ if ($cgi->param('remove_invalid_attach_references')) { Status('attachment_reference_deletion_end'); } +########################################################################### +# Remove all references to deleted users or groups from whines +########################################################################### + +if ($cgi->param('remove_old_whine_targets')) { + Status('whines_obsolete_target_deletion_start'); + + $dbh->bz_start_transaction(); + + foreach my $target (['groups', 'id', MAILTO_GROUP], + ['profiles', 'userid', MAILTO_USER]) + { + my ($table, $col, $type) = @$target; + my $old_ids = + $dbh->selectcol_arrayref("SELECT DISTINCT mailto + FROM whine_schedules + LEFT JOIN $table + ON $table.$col = whine_schedules.mailto + WHERE mailto_type = $type AND $table.$col IS NULL"); + + if (scalar(@$old_ids)) { + $dbh->do("DELETE FROM whine_schedules + WHERE mailto_type = $type AND mailto IN (" . + join(',', @$old_ids) . ")"); + } + } + $dbh->bz_commit_transaction(); + Status('whines_obsolete_target_deletion_end'); +} + Status('checks_start'); ########################################################################### @@ -996,6 +1026,30 @@ if (scalar(@$badbugs > 0)) { } ########################################################################### +# Whines +########################################################################### + +Status('whines_obsolete_target_start'); + +my $display_repair_whines_link = 0; +foreach my $target (['groups', 'id', MAILTO_GROUP], + ['profiles', 'userid', MAILTO_USER]) +{ + my ($table, $col, $type) = @$target; + my $old = $dbh->selectall_arrayref("SELECT whine_schedules.id, mailto + FROM whine_schedules + LEFT JOIN $table + ON $table.$col = whine_schedules.mailto + WHERE mailto_type = $type AND $table.$col IS NULL"); + + if (scalar(@$old)) { + Status('whines_obsolete_target_alert', {schedules => $old, type => $type}, 'alert'); + $display_repair_whines_link = 1; + } +} +Status('whines_obsolete_target_fix') if $display_repair_whines_link; + +########################################################################### # End ########################################################################### diff --git a/template/en/default/admin/sanitycheck/messages.html.tmpl b/template/en/default/admin/sanitycheck/messages.html.tmpl index 4300f7815..14e425625 100644 --- a/template/en/default/admin/sanitycheck/messages.html.tmpl +++ b/template/en/default/admin/sanitycheck/messages.html.tmpl @@ -288,6 +288,25 @@ [% ELSIF san_tag == "vote_count_alert" %] Bad vote sum for [% terms.bug %] [%+ id FILTER html %]. + [% ELSIF san_tag == "whines_obsolete_target_deletion_start" %] + OK, now removing non-existent targets from whines. + + [% ELSIF san_tag == "whines_obsolete_target_deletion_end" %] + Non-existent targets have been removed from whines. + + [% ELSIF san_tag == "whines_obsolete_target_start" %] + Checking for whines with non-existent targets. + + [% ELSIF san_tag == "whines_obsolete_target_alert" %] + [% FOREACH schedule = schedules %] + Non-existent [% (type == constants.MAILTO_USER) ? "user" : "group" FILTER html %] + [%+ schedule.1 FILTER html %] for whine schedule [% schedule.0 FILTER html %]<br> + [% END %] + + [% ELSIF san_tag == "whines_obsolete_target_fix" %] + <a href="sanitycheck.cgi?remove_old_whine_targets=1">Click here to + remove old targets</a> + [% END %] [% END %] |