Bug 42133
Excel import: guessing version, autohardware, guessing fields git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@393 6955db30-a419-402b-8a0d-67ecbb4d7f56master
parent
92698c0c2b
commit
a34d2920a1
|
@ -9,6 +9,8 @@ use lib qw(. lib);
|
|||
|
||||
use Bugzilla;
|
||||
use Bugzilla::Constants;
|
||||
use Bugzilla::Product;
|
||||
use Bugzilla::Component;
|
||||
use Bugzilla::Util;
|
||||
use Bugzilla::Error;
|
||||
use Bugzilla::Bug;
|
||||
|
@ -19,7 +21,7 @@ use Bugzilla::User;
|
|||
# константы
|
||||
use constant BUG_DAYS => 92;
|
||||
use constant XLS_LISTNAME => 'Bugz';
|
||||
use constant MANDATORY_FIELDS => [qw(short_desc version platform product component)];
|
||||
use constant MANDATORY_FIELDS => [qw(short_desc product component)];
|
||||
|
||||
# начинаем-с
|
||||
my $user = Bugzilla->login(LOGIN_REQUIRED);
|
||||
|
@ -33,7 +35,8 @@ for ($cgi->param)
|
|||
{
|
||||
my $v = $_;
|
||||
utf8::decode($v) unless Encode::is_utf8($v);
|
||||
$args->{$v} = $cgi->param($_);
|
||||
$args->{$v} = [ $cgi->param($_) ];
|
||||
$args->{$v} = $args->{$v}->[0] if @{$args->{$v}} <= 1;
|
||||
utf8::decode($args->{$v}) unless Encode::is_utf8($args->{$v});
|
||||
}
|
||||
|
||||
|
@ -58,6 +61,8 @@ my $upload;
|
|||
my $name_tr = {};
|
||||
my $bug_tpl = {};
|
||||
|
||||
$bug_tpl->{platform} = Bugzilla->params->{defaultplatform} if Bugzilla->params->{defaultplatform};
|
||||
|
||||
for (keys %$args)
|
||||
{
|
||||
if (/^f_/so && $args->{$_})
|
||||
|
@ -75,6 +80,28 @@ for (keys %$args)
|
|||
$vars->{bug_tpl} = $bug_tpl;
|
||||
$vars->{name_tr} = $name_tr;
|
||||
|
||||
# Функция угадывания поля
|
||||
my $fielddescs;
|
||||
$vars->{guess_field_name} = sub
|
||||
{
|
||||
my ($name) = @_;
|
||||
unless ($fielddescs)
|
||||
{
|
||||
$fielddescs = $_[1];
|
||||
$fielddescs = [
|
||||
map { $_ => $fielddescs->{$_} }
|
||||
sort { length($fielddescs->{$b}) <=> length($fielddescs->{$a}) }
|
||||
keys %$fielddescs
|
||||
];
|
||||
}
|
||||
for (my $i = 0; $i < @$fielddescs; $i+=2)
|
||||
{
|
||||
my ($k, $v) = ($fielddescs->[$i], $fielddescs->[$i+1]);
|
||||
return $k if $name =~ /\Q$v\E/is;
|
||||
}
|
||||
return undef;
|
||||
};
|
||||
|
||||
unless ($args->{commit})
|
||||
{
|
||||
unless ($upload = $cgi->upload('xls'))
|
||||
|
@ -89,6 +116,7 @@ unless ($args->{commit})
|
|||
# показываем результат импорта
|
||||
$vars->{show_result} = 1;
|
||||
$vars->{result} = $args->{result};
|
||||
$vars->{bug_id} = $args->{bug_id};
|
||||
my $newcgi = new Bugzilla::CGI({
|
||||
listname => $listname,
|
||||
bugdays => $bugdays,
|
||||
|
@ -179,6 +207,7 @@ else
|
|||
{
|
||||
my $newcgi = new Bugzilla::CGI({
|
||||
result => $r,
|
||||
bug_id => $ids,
|
||||
listname => $listname,
|
||||
bugdays => $bugdays,
|
||||
(map { ("f_$_" => $bug_tpl->{$_}) } keys %$bug_tpl),
|
||||
|
@ -239,15 +268,47 @@ sub get_row
|
|||
sub post_bug
|
||||
{
|
||||
my ($fields_in) = @_;
|
||||
my %fields = %$fields_in;
|
||||
my $cgi = Bugzilla->cgi;
|
||||
foreach my $field (keys %fields)
|
||||
{
|
||||
$cgi->param(-name => $field, -value => $fields{$field});
|
||||
}
|
||||
# имитируем почтовое использование с показом ошибок в браузер
|
||||
my $um = Bugzilla->usage_mode;
|
||||
Bugzilla->usage_mode(USAGE_MODE_EMAIL);
|
||||
Bugzilla->error_mode(ERROR_MODE_WEBPAGE);
|
||||
unless ($fields_in->{version})
|
||||
{
|
||||
# угадаем версию
|
||||
my ($product, $component);
|
||||
eval
|
||||
{
|
||||
$product = Bugzilla::Product->check({ name => $fields_in->{product} });
|
||||
$component = Bugzilla::Component->check({
|
||||
product => $product,
|
||||
name => $fields_in->{component},
|
||||
});
|
||||
};
|
||||
# если нет дефолтной версии в компоненте
|
||||
unless ($fields_in->{version} = $component->default_version)
|
||||
{
|
||||
my $vers = [ map ($_->name, @{$product->versions}) ];
|
||||
my $v;
|
||||
if (($v = $cgi->cookie("VERSION-" . $product->name)) &&
|
||||
(lsearch($vers, $v) != -1))
|
||||
{
|
||||
# возьмём из куки
|
||||
$fields_in->{version} = $v;
|
||||
}
|
||||
else
|
||||
{
|
||||
# или просто последнюю, как и в enter_bug.cgi
|
||||
$fields_in->{version} = $vers->[$#$vers];
|
||||
}
|
||||
}
|
||||
}
|
||||
# скармливаем параметры $cgi
|
||||
foreach my $field (keys %$fields_in)
|
||||
{
|
||||
$cgi->param(-name => $field, -value => $fields_in->{$field});
|
||||
}
|
||||
# и дёргаем post_bug.cgi
|
||||
my $bug_id = do 'post_bug.cgi';
|
||||
Bugzilla->usage_mode($um);
|
||||
return $bug_id;
|
||||
|
|
|
@ -76,7 +76,14 @@ function addfield()
|
|||
<span style="color:red">*</span> Empty sheet name means to process all sheets.
|
||||
[% ELSIF show_result %]
|
||||
[% IF result %]
|
||||
<p><b>Successfully imported [% result %] bugs.</b></p>
|
||||
<p><b>Successfully imported [% result %] bugs[% IF result > 0 %]:
|
||||
[% i = 0 %]
|
||||
[% FOR b = bug_id %]
|
||||
[% ", " IF i %]
|
||||
<a href="show_bug.cgi?id=[% b %]">[% b %]</a>
|
||||
[% i = i+1 %]
|
||||
[% END %]
|
||||
[% END %].</b></p>
|
||||
[% ELSE %]
|
||||
<p>An import error occurred, no bugs were imported.</p>
|
||||
[% END %]
|
||||
|
@ -129,6 +136,10 @@ function fieldrename(field)
|
|||
<td><input type="checkbox" onclick="toggleallbugz(this.checked)" /></td>
|
||||
[% FOR field = fields %]
|
||||
<td style="white-space: nowrap">
|
||||
[% IF NOT name_tr.${field} AND NOT field_descs.${field} %]
|
||||
[% SET g = guess_field_name(field, field_descs) %]
|
||||
[% SET name_tr.${field} = g IF g %]
|
||||
[% END %]
|
||||
[% IF NOT name_tr.${field} %]
|
||||
<p id="tp_[% field %]"><a href="javascript:void fieldrename('[% field.replace("['\"]", '\\$&') %]')">[% IF field_descs.${field} %][% field_descs.${field} %][% ELSE %]<span style="color: red">[% field %]</span>[% END %]</a></p>
|
||||
[% END %]
|
||||
|
|
Loading…
Reference in New Issue