2010-10-22 20:57:14 +04:00
|
|
|
#!/usr/bin/perl -wT
|
|
|
|
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
|
|
|
# Редактор предикатов корректности изменений
|
|
|
|
# (c) Vitaliy Filippov 2010 <vitalif@mail.ru>
|
|
|
|
|
|
|
|
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);
|
|
|
|
my $cgi = Bugzilla->cgi;
|
|
|
|
my $params = $cgi->Vars;
|
|
|
|
my $vars = {};
|
|
|
|
|
|
|
|
$user->in_group('bz_editcheckers')
|
|
|
|
|| ThrowUserError('auth_failure', {group => 'bz_editcheckers',
|
|
|
|
action => 'modify',
|
|
|
|
object => 'checkers'});
|
|
|
|
|
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
|
|
|
{
|
|
|
|
$except->{$params->{$_}} =
|
|
|
|
$params->{"except_field_$1_value"} || undef;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$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;
|
|
|
|
# Создаём/обновляем
|
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,
|
2010-10-22 20:57:14 +04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$ch = Bugzilla::Checker->check({ id => $id });
|
2010-10-29 20:03:48 +04:00
|
|
|
$ch->set_query_id($params->{query_id});
|
2010-10-25 17:37:16 +04:00
|
|
|
$ch->set_message($params->{message});
|
|
|
|
$ch->set_flags($flags);
|
|
|
|
$ch->set_except_fields($except);
|
|
|
|
$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
|
|
|
}
|
|
|
|
print $cgi->redirect(-location => 'editcheckers.cgi');
|
|
|
|
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;
|
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 !~ /
|
|
|
|
\. | ^owner_idle_time$ | ^commenter$ | ^content$ | ^assignee_accessible$ |
|
|
|
|
^creation_ts$ | ^days_elapsed$ | ^qacontact_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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$template->process('edit-checkers.html.tmpl', $vars)
|
|
|
|
|| ThrowTemplateError($template->error());
|
|
|
|
|
|
|
|
__END__
|