Bug 68430 - automatically clear flags when closing bug (optional parameter), move this and Bug 17481 to a hook

git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@922 6955db30-a419-402b-8a0d-67ecbb4d7f56
master
vfilippov 2010-09-06 15:18:55 +00:00
parent e7949fbe39
commit 2cf1058781
6 changed files with 104 additions and 39 deletions

View File

@ -138,6 +138,12 @@ sub get_param_list {
default => '',
checker => \&check_opsys
},
{
name => 'clear_requests_on_close',
type => 'b',
default => 1,
},
);
return @param_list;
}

View File

@ -1649,6 +1649,15 @@ sub wants_worktime_reminder {
? 1 : 0;
}
sub wants_request_reminder {
my $self = shift;
return $self &&
$self->settings->{remind_me_about_flags} &&
$self->settings->{remind_me_about_flags}->{value} &&
lc $self->settings->{remind_me_about_flags}->{value} ne 'off'
? 1 : 0;
}
sub get_userlist {
my $self = shift;

View File

@ -0,0 +1,77 @@
#!/usr/bin/perl
use strict;
use Bugzilla::Constants;
use Bugzilla::Util qw(trim);
use Bugzilla::User;
use Bugzilla::Error;
my $cgi = Bugzilla->cgi;
my $bug_objects = Bugzilla->hook_args->{bug_objects};
my $vars = Bugzilla->hook_args->{vars};
my $single = @$bug_objects == 1;
my $clear_on_close = $cgi->param('bug_status') eq 'CLOSED' && Bugzilla->params->{clear_requests_on_close};
my $verify_flags = $single && Bugzilla->usage_mode != USAGE_MODE_EMAIL && Bugzilla->user->wants_request_reminder;
my $reset_own_flags = $verify_flags && $cgi->param('comment') !~ /^\s*$/so;
if (($clear_on_close || $reset_own_flags) && !$cgi->param('force_flags'))
{
my $flags;
my @requery_flags;
my $flag;
# 1) Check flag requests and remind user about resetting his own incoming requests.
# 2) When closing bugs, clear all flag requests (CustIS Bug 68430).
# Not used in mass update and email modes.
for my $bug (@$bug_objects)
{
if ($single)
{
for ($cgi->param())
{
if (/^(flag-(\d+))$/)
{
$flag = Bugzilla::Flag->new({ id => $2 });
$flag->{status} = $cgi->param($1);
$flag->{requestee_id} = login_to_id(trim($cgi->param("requestee-$2")));
push @$flags, $flag;
}
}
}
else
{
$flags = Bugzilla::Flag->match({ bug_id => $bug->id });
}
foreach $flag (@$flags)
{
if ($flag->{status} eq '?' &&
($clear_on_close || $flag->{requestee_id} eq Bugzilla->user->userid))
{
if ($clear_on_close)
{
$flag->{status} = 'X';
}
if ($verify_flags)
{
push @requery_flags, $flag;
}
elsif ($single)
{
$cgi->param('flag-'.$flag->{id} => 'X');
}
else
{
Bugzilla::Flag->set_flag($bug, $flag);
}
}
}
if ($verify_flags && @requery_flags)
{
push @{$vars->{verify_flags}}, @requery_flags;
$vars->{field_filter} = '^('.join('|', map { "flag-".$_->id } @{$vars->{verify_flags}}).')$';
Bugzilla->template->process("bug/process/verify-flags.html.tmpl", $vars)
|| ThrowTemplateError(Bugzilla->template->error());
exit;
}
}
}

View File

@ -107,9 +107,9 @@ sub should_set {
# Create a list of objects for all bugs being modified in this request.
my @bug_objects;
if (defined $cgi->param('id')) {
my $bug = Bugzilla::Bug->check(scalar $cgi->param('id'));
$cgi->param('id', $bug->id);
push(@bug_objects, $bug);
my $bug = Bugzilla::Bug->check(scalar $cgi->param('id'));
$cgi->param('id', $bug->id);
push(@bug_objects, $bug);
} else {
foreach my $i ($cgi->param()) {
if ($i =~ /^id_([1-9][0-9]*)/) {
@ -280,6 +280,8 @@ foreach my $b (@bug_objects) {
}
}
Bugzilla::Hook::process('process_bug-after_move', { bug_objects => \@bug_objects, vars => $vars });
# Flags should be set AFTER the bug has been moved into another product/component.
if ($cgi->param('id')) {
my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi($first_bug, undef, $vars);
@ -342,37 +344,6 @@ my %methods = (
foreach my $b (@bug_objects)
{
# Validate flag requests and remind user about resetting them
if (should_set('comment') && @bug_objects == 1 &&
Bugzilla->usage_mode != USAGE_MODE_EMAIL &&
!$cgi->param('force_flags') &&
$user->settings->{remind_me_about_flags} &&
$user->settings->{remind_me_about_flags}->{value} &&
(lc $user->settings->{remind_me_about_flags}->{value} ne "off"))
{
my @ids = map /^flag-(\d+)$/ ? $1 : (), $cgi->param();
my @requery_flags;
my @filter;
foreach my $id (@ids)
{
my $status = $cgi->param("flag-$id");
if (($status eq '?') &&
trim($cgi->param("requestee-$id")) eq $user->login)
{
my $flag = (Bugzilla::Flag->match({ id => $id }) || [])->[0];
push @filter, "flag-$id";
push @requery_flags, $flag;
}
}
if (@requery_flags)
{
$vars->{verify_flags} = \@requery_flags;
$vars->{field_filter} = '^('.join('|',@filter).')$';
$template->process("bug/process/verify-flags.html.tmpl", $vars)
|| ThrowTemplateError($template->error());
exit;
}
}
if (should_set('comment') || $cgi->param('work_time'))
{
# Add a comment as needed to each bug. This is done early because

View File

@ -33,11 +33,11 @@
[% cgi.param("requestee-$flag.id" ) %]
</td>
<td style="border-width: 0 0 1px 0; border-style: solid; border-color: gray">
<select id="flag-[% flag.id %]" name="flag-[% flag.id %]"
<option value="X"></option>
<select id="flag-[% flag.id %]" name="flag-[% flag.id %]">
<option value="X" [% 'selected="selected"' IF flag.status == 'X' %]>X</option>
<option value="+">+</option>
<option value="-">-</option>
<option value="?" selected="selected">?</option>
<option value="?" [% 'selected="selected"' IF flag.status == '?' %]>?</option>
</select>
</td>
</tr>

View File

@ -70,5 +70,7 @@
"entry form.<br> " _
"You can leave this empty: " _
"$terms.Bugzilla will then use the operating system that the browser " _
"reports to be running on as the default." }
%]
"reports to be running on as the default.",
clear_requests_on_close => "Clear all unanswered flag requests when changing bug status to CLOSED",
} %]