2010-10-22 20:57:14 +04:00
|
|
|
#!/usr/bin/perl -wT
|
2014-07-24 17:26:04 +04:00
|
|
|
# Bug data correctness checker editor
|
2014-05-26 15:53:02 +04:00
|
|
|
# License: Dual-license GPL 3.0+ or MPL 1.1+
|
|
|
|
# Author(s): Vitaliy Filippov <vitalif@mail.ru>
|
2010-10-22 20:57:14 +04:00
|
|
|
|
|
|
|
use strict;
|
|
|
|
use lib qw(. lib);
|
|
|
|
|
|
|
|
use Bugzilla;
|
|
|
|
use Bugzilla::Checker;
|
|
|
|
use Bugzilla::Constants;
|
|
|
|
use Bugzilla::Util;
|
|
|
|
use Bugzilla::Error;
|
|
|
|
use Bugzilla::Token;
|
|
|
|
|
|
|
|
my $template = Bugzilla->template;
|
|
|
|
my $user = Bugzilla->login(LOGIN_REQUIRED);
|
2014-07-30 16:02:24 +04:00
|
|
|
my $params = Bugzilla->input_params;
|
2010-10-22 20:57:14 +04:00
|
|
|
my $vars = {};
|
|
|
|
|
2014-05-26 15:53:02 +04:00
|
|
|
$user->in_group('bz_editcheckers') || ThrowUserError('auth_failure', {
|
|
|
|
group => 'bz_editcheckers',
|
|
|
|
action => 'modify',
|
|
|
|
object => 'checkers',
|
|
|
|
});
|
2010-10-22 20:57:14 +04:00
|
|
|
|
2010-10-29 20:03:48 +04:00
|
|
|
my $id = $params->{id};
|
2010-10-22 20:57:14 +04:00
|
|
|
defined($id) && detaint_natural($id);
|
|
|
|
if ($params->{save})
|
|
|
|
{
|
|
|
|
if ($params->{edit})
|
|
|
|
{
|
|
|
|
check_token_data($params->{token}, 'editcheckers');
|
2010-10-25 17:37:16 +04:00
|
|
|
# Заполняем поля-исключения
|
|
|
|
my $except = {};
|
|
|
|
for (keys %$params)
|
|
|
|
{
|
2010-10-25 19:28:41 +04:00
|
|
|
if (/^except_field_(\d+)$/so && $params->{$_})
|
2010-10-25 17:37:16 +04:00
|
|
|
{
|
2016-01-29 15:19:02 +03:00
|
|
|
my ($f, $v) = ($params->{$_}, $params->{"except_field_$1_value"});
|
|
|
|
if (!$v)
|
|
|
|
{
|
|
|
|
$except->{$f} = undef;
|
|
|
|
}
|
|
|
|
elsif (!exists $except->{$f})
|
|
|
|
{
|
|
|
|
$except->{$f} = $v;
|
|
|
|
}
|
|
|
|
elsif (defined $except->{$f})
|
|
|
|
{
|
|
|
|
$except->{$f} = [ $except->{$f} ] if !ref $except->{$f};
|
|
|
|
push @{$except->{$f}}, $v;
|
|
|
|
}
|
2010-10-25 17:37:16 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
$except = undef if !%$except;
|
|
|
|
if (!$params->{deny_all} && !$except)
|
|
|
|
{
|
|
|
|
$params->{deny_all} = 1;
|
|
|
|
}
|
|
|
|
my $flags =
|
|
|
|
($params->{is_freeze} ? 1 : 0) * CF_FREEZE |
|
|
|
|
($params->{is_fatal} ? 1 : 0) * CF_FATAL |
|
|
|
|
($params->{on_update} ? 1 : 0) * CF_UPDATE |
|
|
|
|
($params->{on_create} ? 1 : 0) * CF_CREATE |
|
|
|
|
($params->{deny_all} ? 1 : 0) * CF_DENY;
|
2012-11-14 15:13:39 +04:00
|
|
|
# Триггеры
|
|
|
|
my $triggers;
|
|
|
|
for (keys %$params)
|
|
|
|
{
|
|
|
|
if ($params->{$_} !~ /^\s*$/so && /^triggers_(.*)$/so)
|
|
|
|
{
|
|
|
|
$triggers->{$1} = $params->{$_};
|
|
|
|
}
|
|
|
|
}
|
2010-10-25 17:37:16 +04:00
|
|
|
# Создаём/обновляем
|
2010-10-22 20:57:14 +04:00
|
|
|
my $ch;
|
|
|
|
if ($params->{create})
|
|
|
|
{
|
|
|
|
$ch = Bugzilla::Checker->create({
|
2010-10-25 17:37:16 +04:00
|
|
|
query_id => $params->{query_id},
|
|
|
|
user_id => $user->id,
|
2010-10-29 17:52:57 +04:00
|
|
|
message => $params->{message},
|
2010-10-25 17:37:16 +04:00
|
|
|
flags => $flags,
|
|
|
|
except_fields => $except,
|
2012-11-14 15:13:39 +04:00
|
|
|
triggers => $triggers,
|
2016-01-25 18:19:14 +03:00
|
|
|
bypass_group_id => $params->{bypass_group_id},
|
2010-10-22 20:57:14 +04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$ch = Bugzilla::Checker->check({ id => $id });
|
2016-01-25 18:19:14 +03:00
|
|
|
$ch->set('query_id', $params->{query_id});
|
|
|
|
$ch->set('bypass_group_id', $params->{bypass_group_id});
|
2010-10-25 17:37:16 +04:00
|
|
|
$ch->set_message($params->{message});
|
|
|
|
$ch->set_flags($flags);
|
|
|
|
$ch->set_except_fields($except);
|
2012-11-14 15:13:39 +04:00
|
|
|
$ch->set_triggers($triggers);
|
2010-10-25 17:37:16 +04:00
|
|
|
$ch->update;
|
2010-10-22 20:57:14 +04:00
|
|
|
}
|
|
|
|
delete_token($params->{token});
|
|
|
|
}
|
|
|
|
elsif ($params->{delete})
|
|
|
|
{
|
2010-10-29 20:03:48 +04:00
|
|
|
Bugzilla->dbh->do('DELETE FROM checkers WHERE id=?', undef, $id);
|
2010-10-22 20:57:14 +04:00
|
|
|
}
|
2014-07-30 16:02:24 +04:00
|
|
|
print Bugzilla->cgi->redirect(-location => 'editcheckers.cgi');
|
2010-10-22 20:57:14 +04:00
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $modes = { list => 'list', edit => 'edit' };
|
|
|
|
$vars->{mode} = $modes->{$params->{mode}} || 'list';
|
|
|
|
|
|
|
|
if ($vars->{mode} eq 'list')
|
|
|
|
{
|
2010-11-03 21:16:24 +03:00
|
|
|
$vars->{checkers} = Bugzilla->dbh->selectall_arrayref('SELECT * FROM checkers', {Slice=>{}});
|
2010-10-22 20:57:14 +04:00
|
|
|
bless $_, 'Bugzilla::Checker' for @{$vars->{checkers}};
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$vars->{token} = issue_session_token('editcheckers');
|
|
|
|
$vars->{create} = $params->{create} ? 1 : 0;
|
2016-01-25 18:19:14 +03:00
|
|
|
$vars->{all_groups} = [ Bugzilla::Group->get_all ];
|
2010-10-25 16:10:53 +04:00
|
|
|
# Есть специальное поле "longdesc", означающее добавление комментариев
|
2010-10-22 20:57:14 +04:00
|
|
|
my $f = [ Bugzilla->get_fields ];
|
2010-10-25 16:10:53 +04:00
|
|
|
@$f = sort { lc $a->description cmp lc $b->description } grep { $_->name !~ /
|
2014-08-01 16:19:04 +04:00
|
|
|
\. | ^cclist_accessible$ | ^creation_ts$ | ^reporter_accessible$ /xs } @$f;
|
2010-12-06 16:46:08 +03:00
|
|
|
# Ещё есть специальное поле "work_time_date", означающее списание времени задним числом
|
|
|
|
push @$f, { description => 'Backdated worktime', name => 'work_time_date' };
|
2010-10-22 20:57:14 +04:00
|
|
|
$vars->{my_fielddefs} = $f;
|
|
|
|
if (!$vars->{create})
|
|
|
|
{
|
|
|
|
$vars->{checker} = Bugzilla::Checker->new({ id => $id });
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-10-25 17:37:16 +04:00
|
|
|
$vars->{checker} = { is_fatal => 1, deny_all => 1, on_update => 1 };
|
2010-10-22 20:57:14 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-18 16:13:01 +04:00
|
|
|
$template->process('admin/edit-checkers.html.tmpl', $vars)
|
2010-10-22 20:57:14 +04:00
|
|
|
|| ThrowTemplateError($template->error());
|
2014-08-18 16:13:01 +04:00
|
|
|
exit;
|
2010-10-22 20:57:14 +04:00
|
|
|
|
|
|
|
__END__
|