Всем доброго времени суток.
Прошу помощи у сообщества, т.к. нужны глубокие познания в Perl-е и в исходном коде Багзиллы.
В общем, есть задача: в письмах, присылаемых скриптом whine.pl, потребовалось вставить дополнительное поле - Продукт, заодно переставить местами уже существующие.
Начал с правки шаблона: bugzilla/template/ru/default/whine/mail.html.tmpl
<table width="100%"> <tr> <th align="left">Номер</th> <th align="left">Серьезность</th> <th align="left">Приоритет</th> <th align="left">Продукт</th> #--------------------------- ДОБАВЛЕНО <th align="left">Состояние</th> <th align="left">Аннотация</th> <th align="left">Исполнитель</th> </tr> [% FOREACH bug=query.bugs %] <tr> <td align="left"><a href="[%+ urlbase FILTER html %]show_bug.cgi?id= [%- bug.bug_id %]">[% bug.bug_id %]</a></td> <td align="left">[% get_severity(bug.bug_severity) FILTER html %]</td> <td align="left">[% bug.priority FILTER html %]</td> <td align="left">[% get_product_name(bug.product_id) FILTER html %]</td> #-------------------- ДОБАВЛЕНО <td align="left">[% get_status(bug.bug_status) FILTER html %]</td> <td align="left">[% bug.short_desc FILTER html %]</td> <td align="left">[% bug.$assignee_login_string FILTER html %]</td> </tr> [% END %]
Попутно выяснилось, что в таблице bugs есть только поле product_id, поэтому пришлось дописать макрос get_product_name в подключаемый шаблон bugzilla/template/ru/default/global/field-descs.none.tmpl (благо, что продуктов не так много, и этот обходной путь показался гораздо проще, чем внедрять полноценные sql-запросы:
[% product_descs = { "1" => "Product-1", "2" => "GoodProduct-1", "3" => "BadProduct-1", "4" => "GoodProduct-2" } %] [% MACRO get_product_name(id) GET product_descs.$id || id %]
Затем оказалось, что шаблон bugzilla/template/ru/default/whine/mail.html.tmpl теперь оперирует полем product_id, которое ему вообще не передаётся. Пришлось править сам скрипт bugzilla/whine.pl:
# Execute the saved query my @searchfields = ( 'bugs.bug_id', 'bugs.bug_severity', 'bugs.priority', 'bugs.rep_platform', 'bugs.assigned_to', 'bugs.bug_status', 'bugs.resolution', 'bugs.short_desc', 'map_assigned_to.login_name', 'bugs.product_id', #---------------------- ДОБАВЛЕНО );
Вуаля, всё работает! Но только в версии 3.2.4 (ru: 3.2.3-20090405).
С переходом на версию 3.4.4 (ru: 3.4.3) скрипт bugzilla/whine.pl "слегка" поменялся:
$diff whine.pl.old whine.pl.new
> use Bugzilla::Group; 253c254 < @{Bugzilla::User->flatten_group_membership( --- > @{Bugzilla::Group->flatten_group_membership( 427,436c428,437 < my @searchfields = ( < 'bugs.bug_id', < 'bugs.bug_severity', < 'bugs.priority', < 'bugs.rep_platform', < 'bugs.assigned_to', < 'bugs.bug_status', < 'bugs.resolution', < 'bugs.short_desc', < 'map_assigned_to.login_name', --- > my @searchfields = qw( > bug_id > bug_severity > priority > rep_platform > assigned_to > bug_status > resolution > short_desc > assigned_to
И теперь после вставки строки product_id в объявление массива @searchfields при попытке выполниться скрипт вываливается с ошибкой:
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS product_id, SUBSTRING(map_assigned_to.login_name FROM 1 FOR INSTR(CAST(map_as' at line 1 [for Statement "SELECT bugs.bug_id AS bug_id, bugs.bug_severity AS bug_severity, bugs.priority AS priority, AS product_id, SUBSTRING(map_assigned_to.login_name FROM 1 FOR INSTR(CAST(map_assigned_to.login_name AS BINARY), CAST('@' AS BINARY)) - 1) AS assigned_to, bugs.bug_status AS bug_status, bugs.resolution AS resolution, bugs.short_desc AS short_desc FROM bugs INNER JOIN profiles AS map_assigned_to ON (bugs.assigned_to = map_assigned_to.userid) LEFT JOIN bug_group_map ON bug_group_map.bug_id = bugs.bug_id AND bug_group_map.group_id NOT IN (1,12,10,11,13,9,4,8,5,6,7,3,2,14) LEFT JOIN cc ON cc.bug_id = bugs.bug_id AND cc.who = 1 WHERE (( bugs.bug_status IN ('NEW','ASSIGNED','REOPENED') ) AND ( bugs.product_id IN (7,5,4,6,2,3) )) AND ((bugs.cf_otpravlen = 'обсуждение')) AND bugs.creation_ts IS NOT NULL AND ((bug_group_map.group_id IS NULL) OR (bugs.reporter_accessible = 1 AND bugs.reporter = 1) OR (bugs.cclist_accessible = 1 AND cc.who IS NOT NULL) OR (bugs.assigned_to = 1) ) GROUP BY bugs.bug_id"] at ./whine.pl.new line 449
main::run_queries('HASH(0x988b610)') called at ./whine.pl.new line 317
Подозреваю, что нужно править еще и подключаемые Bugzilla::Search, Bugzilla::User, Bugzilla::Group и т.д. Но не понимаю, что именно.
Прошу помощи в освоение Перла на практике и заодно пояснения, для чего в списке полей 2 раза используется assigned_to.
Спасибо.
Отредактировано _SlaSh_ (11-02-2010 12:26:44)
Отсутствует
И теперь после вставки строки product_id в объявление массива @searchfields при попытке выполниться скрипт вываливается с ошибкой:
У Bugzilla/Search.pm можно просить 'product'. Это автоматически приведет к добавлению подзапроса для выборки названия продукта и т.п. Увидеть это можно здесь:
http://mxr.mozilla.org/mozilla/source/w … rch.pm#146
А прочесть об этом... м-дя... только здесь: https://bugzilla.mozilla.org/show_bug.cgi?id=545795
Отсутствует
SnowyOwl
Хм. Действительно. Как неочевидно Дописал Product в 'my @searchfields = qw(' и убрал использование своего макроса. Всё сразу встало на свои места.
Спасибо!
Отсутствует
Как неочевидно
Нельзя в числе достоинств конструкции приводить ее простоту, ибо техника развивается по пути усложнения конструкции и упрощения эксплуатации
Отсутствует