bugzilla-4intranet/editcheckers.cgi

114 lines
3.5 KiB
Plaintext
Raw Normal View History

#!/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 = {};
my @REAL_UPDATE_COLUMNS = qw(is_freeze is_fatal message);
$user->in_group('bz_editcheckers')
|| ThrowUserError('auth_failure', {group => 'bz_editcheckers',
action => 'modify',
object => 'checkers'});
my $id = $params->{query_id};
defined($id) && detaint_natural($id);
if ($params->{save})
{
if ($params->{edit})
{
check_token_data($params->{token}, 'editcheckers');
my $ch;
if ($params->{create})
{
$ch = Bugzilla::Checker->create({
(map { ($_ => $params->{$_}) } 'query_id', @REAL_UPDATE_COLUMNS),
user_id => $user->id,
});
}
else
{
$ch = Bugzilla::Checker->check({ id => $id });
my $f;
for (@REAL_UPDATE_COLUMNS)
{
$f = "set_$_";
$ch->$f($params->{$_});
}
}
# поля-исключения: если deny_all=1, то разрешить только их,
# если deny_all=0, то запретить только их,
# если deny_all=0 и их нет, то deny_all=1
my $except = { deny_all => $params->{deny_all}, except_fields => {} };
for (keys %$params)
{
if (/^except_field_(\d+)$/so)
{
$except->{except_fields}->{$params->{$_}} =
$params->{"except_field_$1_value"} || undef;
}
}
if (!%{$except->{except_fields}})
{
$except = undef;
}
$ch->set_except_fields($except);
$ch->update;
delete_token($params->{token});
}
elsif ($params->{delete})
{
Bugzilla->dbh->do('DELETE FROM checkers WHERE query_id=?', undef, $id);
}
print $cgi->redirect(-location => 'editcheckers.cgi');
exit;
}
my $modes = { list => 'list', edit => 'edit' };
$vars->{mode} = $modes->{$params->{mode}} || 'list';
if ($vars->{mode} eq 'list')
{
$vars->{checkers} = Bugzilla->dbh->selectall_arrayref('SELECT * FROM checkers WHERE user_id=?', {Slice=>{}}, $user->id);
bless $_, 'Bugzilla::Checker' for @{$vars->{checkers}};
}
else
{
$vars->{token} = issue_session_token('editcheckers');
$vars->{create} = $params->{create} ? 1 : 0;
# Есть специальное поле "longdesc", означающее добавление комментариев
my $f = [ Bugzilla->get_fields ];
@$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;
$vars->{my_fielddefs} = $f;
if (!$vars->{create})
{
$vars->{checker} = Bugzilla::Checker->new({ id => $id });
}
else
{
$vars->{checker} = { deny_all => 1 };
}
}
$template->process('edit-checkers.html.tmpl', $vars)
|| ThrowTemplateError($template->error());
__END__