Commit 9e6daeb0 authored by System Administrator's avatar System Administrator Committed by Vitaly Lipatov

barbass: Делаем русские шаблоны не сабмодулем (eterbug #6952)

parent 36140dab
[submodule "template/ru"]
path = template/ru
url = git://git.code.sf.net/p/bugzilla-ru/code
ru @ b5f4861a
Subproject commit b5f4861a820b6b8ceb35e8521143f251ef681263
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[%# Use the current script name. If an empty name is returned,
# then we are accessing the home page. %]
[% login_target = cgi.url("-relative" => 1, "-query" => 1) %]
[% IF !login_target OR login_target.match("^token.cgi") %]
[% login_target = "index.cgi" %]
[% END %]
<li id="mini_login_container[% qs_suffix %]">
<span class="separator">| </span>
[% connector = "?" %]
[% IF cgi.request_method == "GET" AND cgi.query_string %]
[% connector = "&" %]
[% END %]
[% script_url = login_target _ connector _ "GoAheadAndLogIn=1" %]
<a id="login_link[% qs_suffix %]" href="[% script_url FILTER html %]"
onclick="return show_mini_login_form('[% qs_suffix %]')">Войти</a>
[% Hook.process('additional_methods') %]
<form action="[% login_target FILTER html %]" method="POST"
class="mini_login bz_default_hidden"
id="mini_login[% qs_suffix FILTER html %]"
onsubmit="return check_mini_login_fields( '[% qs_suffix FILTER html %]' );"
>
<input id="Bugzilla_login[% qs_suffix FILTER html %]"
class="bz_login"
name="Bugzilla_login"
title="Login"
onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')"
>
<input class="bz_password"
id="Bugzilla_password[% qs_suffix FILTER html %]"
name="Bugzilla_password"
type="password"
title="Password"
>
<input class="bz_password bz_default_hidden bz_mini_login_help" type="text"
id="Bugzilla_password_dummy[% qs_suffix %]" value="password"
title="Password"
onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')"
>
[% IF Param('rememberlogin') == 'defaulton' ||
Param('rememberlogin') == 'defaultoff'
%]
<input type="checkbox" id="Bugzilla_remember[% qs_suffix %]"
name="Bugzilla_remember" value="on" class="bz_remember"
[%+ "checked" IF Param('rememberlogin') == "defaulton" %]>
<label for="Bugzilla_remember[% qs_suffix %]">Запомнить</label>
[% END %]
<input type="hidden" name="Bugzilla_login_token"
value="[% get_login_request_token() FILTER html %]">
<input type="submit" name="GoAheadAndLogIn" value="Войти"
id="log_in[% qs_suffix %]">
<script type="text/javascript">
mini_login_constants = {
"login" : "Пользователь",
"warning" : "Для входа укажите имя пользователя и пароль."
};
[%# We need this event to fire after autocomplete, because it does
# something different depending on whether or not there's already
# data in the login and password box.
# However, autocomplete happens at all sorts of different times in
# different browsers (before or after onDOMReady, before or after
# window.onload, in almost all combinations you can imagine).
# The only good solution I found is to time the event 200
# milliseconds after window.onload for WebKit (doing it immediately
# at onload works in Chrome but not in Safari, but I can't detect
# them separately using YUI), and right after onDOMReady in Gecko.
# The WebKit solution is also fairly guaranteed to work on any
# browser (it's just strange, since the fields only populate 200 ms
# after the page loads), so it's the default. IE doesn't even
# recognize our forms as login forms, so I made it use the Gecko
# method also (since it's nicer visually). Opera never autocompletes
# forms without user interaction, so it also uses the Gecko method.
#%]
if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
YAHOO.util.Event.onDOMReady(function() {
init_mini_login_form('[% qs_suffix FILTER html %]');
});
}
else {
YAHOO.util.Event.on(window, 'load', function () {
window.setTimeout(function() {
init_mini_login_form('[% qs_suffix FILTER html %]');
}, 200);
});
}
</script>
<a href="#" onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a>
</form>
</li>
<li id="forgot_container[% qs_suffix %]">
<span class="separator">| </span>
<a id="forgot_link[% qs_suffix %]" href="[% script_url FILTER html %]#forgot"
onclick="return show_forgot_form('[% qs_suffix %]')">Забытый пароль</a>
<form action="token.cgi" method="post" id="forgot_form[% qs_suffix %]"
class="mini_forgot bz_default_hidden">
<label for="login[% qs_suffix FILTER html %]">Пользователь:</label>
<input type="text" name="loginname" size="20" id="login[% qs_suffix FILTER html %]">
<input id="forgot_button[% qs_suffix %]" value="Сбросить пароль"
type="submit">
<input type="hidden" name="a" value="reqpw">
<input type="hidden" id="token[% qs_suffix FILTER html %]" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]">
<a href="#" onclick="return hide_forgot_form('[% qs_suffix %]')">[x]</a>
</form>
</li>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# target: string. URL to go to after login.
#%]
[% IF !target %]
[% target = "index.cgi" %]
[% END %]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Вход в систему $terms.Bugzilla",
onload = "document.forms['login'].Bugzilla_login.focus()"
%]
[% USE Bugzilla %]
<p>
Для продолжения работы в [% terms.Bugzilla %] введите свои регистрационные данные.
</p>
<form name="login" action="[% target FILTER html %]" method="POST"
[%- IF Bugzilla.cgi.param("data") %] enctype="multipart/form-data"[% END %]>
<table>
<tr>
<th align="right"><label for="Bugzilla_login">Пользователь:</label></th>
<td>
<input size="35" id="Bugzilla_login" name="Bugzilla_login">
[% Param('emailsuffix') FILTER html %]
</td>
</tr>
<tr>
<th align="right"><label for="Bugzilla_password">Пароль:</label></th>
<td>
<input type="password" size="35" id="Bugzilla_password" name="Bugzilla_password">
</td>
</tr>
[% IF Param('rememberlogin') == 'defaulton' ||
Param('rememberlogin') == 'defaultoff' %]
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="Bugzilla_remember" name="Bugzilla_remember" value="on"
[%+ "checked" IF Param('rememberlogin') == "defaulton" %]>
<label for="Bugzilla_remember">Запомнить мои данные на этом компьютере</label>
</td>
</tr>
[% END %]
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="Bugzilla_restrictlogin" name="Bugzilla_restrictlogin"
checked="checked">
<label for="Bugzilla_restrictlogin">На время этого сеанса разрешить работу
только с текущего адреса IP (Используется для большей безопасности)</label>
</td>
</tr>
</table>
[% PROCESS "global/hidden-fields.html.tmpl"
exclude="^Bugzilla_(login|password|restrictlogin)$" %]
<input type="hidden" name="Bugzilla_login_token"
value="[% get_login_request_token() FILTER html %]">
<input type="submit" name="GoAheadAndLogIn" value="Войти" id="log_in">
<p>
(Примечание: использование этой возможности требует разрешения
устанавливать cookies для данного сайта.
Иначе Вам придется часто повторять ввод имени и пароля.)
</p>
</form>
[% Hook.process('additional_methods') %]
[%# Allow the user to create a new account, or request a token to change
# their password, assuming that our auth method allows that.
#%]
[% IF Param("createemailregexp") && user.authorizer.user_can_create_account %]
<hr>
<p>
Если вы ещё не зарегистрированы в [% terms.Bugzilla %], вы можете
<a href="createaccount.cgi">создать новую учётную запись</a>.
[% IF Param("requirelogin") %]
Необходимо иметь учётную запись, так как эта [% terms.Bugzilla %]
доступна только для аутентифицированных пользователей.
[% ELSIF target.match("_bug\.cgi$") %]
Для регистрации новой [% terms.bug_gen %] или добавления комментариев в
существующие ошибки необходимо иметь учётную запись, чтобы с вами могли связаться,
если потребуется дополнительная информация.
[% END %]
</p>
[% END %]
[% IF user.authorizer.can_change_password %]
<hr>
<form id="forgot" method="get" action="token.cgi">
<input type="hidden" name="a" value="reqpw">
Если у вас уже есть учётная запись, но вы забыли свой пароль,
введите в поле ниже свой адрес электронной почты, чтобы сменить пароль.<br>
<input size="35" name="loginname">
<input type="hidden" id="token" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]">
<input type="submit" id="request" value="Сменить пароль">
</form>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% emailaddress %]
Subject: [% PROCESS subject %]
X-Bugzilla-Type: admin
Запрос был аннулирован с адреса [% remoteaddress %].
Если вы этого не делали, это может быть чья-либо ошибка
либо намеренная попытка взлома вашей учетной записи.
Ознакомьтесь с параметрами жетона и перешлите это сообщение
по адресу [% Param('maintainer') %], если у вас есть подозрения.
Жетон: [% token %]
Тип жетона: [% tokentype %]
Пользователь: [% emailaddress %]
Дата выдачи: [% issuedate FILTER time("%Y-%m-%d %H:%M:%S %Z", timezone)%]
Данные: [% eventdata %]
Причина отказа: [% PROCESS cancelactionmessage %]
[% BLOCK subject %]
[% IF tokentype == 'new_account' %]
Отменен запрос на регистрацию пользователя
[% ELSIF tokentype == 'password' %]
Отменен запрос на изменение пароля
[% ELSIF tokentype == 'emailnew' OR tokentype == 'emailold' %]
Отменен запрос на изменение адреса электронной почты
[% ELSE %]
Отменен жетон типа [% tokentype %]
[% END %]
[% END %]
[% BLOCK cancelactionmessage %]
[% IF cancelaction == 'account_exists' %]
Пользователь [% email %] уже существует.
[% ELSIF cancelaction == 'email_change_canceled' %]
Отменен запрос на изменение адреса электронной почты с
[% old_email %] на [% new_email %].
[% ELSIF cancelaction == 'email_change_canceled_reinstated' %]
Отменен запрос на изменение адреса электронной почты
на [% new_email %]. Восстановлены прежние значения.
[% ELSIF cancelaction == 'emailold_change_canceled' %]
Отменен запрос на изменение адреса электронной почты
на [% new_email %].
[% ELSIF cancelaction == 'password_change_canceled' %]
Запрос на изменение пароля отменен пользователем.
[% ELSIF cancelaction == 'account_creation_canceled' %]
Создание учетной записи пользователя [% emailaddress %]
отменено.
[% ELSIF cancelaction == 'user_logged_in' %]
Запрос на изменение пароля отменен входом в систему.
[% ELSIF cancelaction == 'wrong_token_for_changing_passwd' %]
Попытка использовать жетон для смены пароля.
[% ELSIF cancelaction == 'wrong_token_for_cancelling_email_change' %]
Попытка использовать жетон для отмены изменения адреса.
[% ELSIF cancelaction == 'wrong_token_for_confirming_email_change' %]
Попытка использовать жетон для подтверждения изменения адреса.
[% ELSIF cancelaction == 'wrong_token_for_creating_account' %]
Попытка использовать жетон для создания учетной записи.
[% ELSE %]
[%# Give sensible error if the cancel-token function is used incorrectly.
#%]
Неправильное использование жетонов [% terms.Bugzilla %]. Передан
параметр '[% cancelaction %]'. Правильный метод: передать код
события и описать его в файле <kbd>cancel-token.txt.tmpl</kbd>.
Если вы не разработчик [% terms.Bugzilla %], пожалуйста, перешлите
это сообщение администратору: [% Param('maintainer') %].
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE
# none
#
# Param("maintainer") is used to display the maintainer's email.
# Param("emailsuffix") is used to pre-fill the email field.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Регистрация пользователя [% terms.Bugzilla %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
onload = "document.forms['account_creation_form'].login.focus();" %]
<p>
Чтобы зарегистрироваться, достаточно указать
[% IF Param('emailsuffix') == '' %]
адрес электронной почты.
[% ELSE %]
имя почтового ящика, которое в комбинации с [% Param('emailsuffix') %]
соответствует Вашему адресу электронной почты.
[% END %]
По этому адресу будет отправлено сообщение с подтверждением.
<b>Вы не сможете войти в систему до того как получите сообщение.</b>
Если сообщение не будет получено, свяжитесь с администратором
[% terms.Bugzilla %]
<a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>.
</p>
<p>
Для регистрации новых [% terms.bugs_gen %] или добавления комментариев в
существующие ошибки необходимо иметь учётную запись, чтобы с вами могли
связаться, если потребуется дополнительная информация.
Это также позволит другим пользователям чётко определить, кто является
автором комментариев или изменений, произведённых в [% terms.bugs_dat %].
<b>Обратите внимание, что ваш адрес электронной почты <u>никогда</u> не будет
показан незарегистрированным пользователям. Его смогут увидеть только
зарегистрированные пользователи.</b>
</p>
[% IF Param('createemailregexp') == '.*' && Param('emailsuffix') == '' %]
<p>
<b>ОБРАТИТЕ ВНИМАНИЕ:</b> [% terms.Bugzilla %] — общедоступная система
отслеживания [% terms.bugs_gen %]. Данные о многих [% terms.bugs_obj %],
включая адреса электронной почты, доступны зарегистрированным пользователям.
<!--
<b>Рекомендуется</b> использовать неосновной почтовый ящик или
бесплатную почтовую службу (например, Gmail, Яндекс.Почта, Mail.ru и т.п.)
во избежание получения нежелательной почты (спама) в основной почтовый ящик.
-->
</p>
[% END %]
<form id="account_creation_form" method="get" action="createaccount.cgi">
<table>
<tr>
<td align="right">
<b>Адрес электронной почты:</b>
</td>
<td>
<input size="35" id="login" name="login">
[% Param('emailsuffix') FILTER html %]
</td>
</tr>
</table>
<br>
<input type="hidden" id="token" name="token" value="[% issue_hash_token(['create_account']) FILTER html %]">
<input type="submit" id="send" value="Зарегистрироваться">
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# login: string. The user's Bugzilla login email address.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Запрос на создание учетной записи '[% login FILTER html %]' зарегистрирован
[% END %]
[% PROCESS global/header.html.tmpl title = title %]
<p>
Вам направлено по электронной почте сообщение со ссылкой для подтверждения
создания учетной записи. Ссылка будет аннулирована, если Вы не подтвердите
создание в течение [% constants.MAX_TOKEN_AGE FILTER html %] дней.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% emailaddress %]
Subject: Запрос на изменение адреса email пользователя [% terms.Bugzilla %]
X-Bugzilla-Type: admin
Получен запрос на изменение адреса электронной почты пользователя
[% terms.Bugzilla %] [% oldemailaddress %] на ваш адрес.
Для подтверждения изменения выберите ссылку:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cfmem
Если вы не запрашивали этого изменения либо хотите его аннулировать,
выберите ссылку:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cxlem
Если вы не ответите, запрос будет автоматически аннулирован через [% constants.MAX_TOKEN_AGE %]
дней ([% expiration_ts FILTER time("%d.%m.%Y %H:%M %Z") %]).
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
From: [% Param('mailfrom') %]
To: [% emailaddress %]
Subject: Запрос на изменение адреса email пользователя [% terms.Bugzilla %]
Importance: High
X-MSMail-Priority: High
X-Priority: 1
X-Bugzilla-Type: admin
Получен запрос на изменение Вашего адреса электронной почты в
[%+ terms.Bugzilla %] на [% newemailaddress %].
Если Вы не запрашивали этого изменения либо хотите его аннулировать,
выберите ссылку:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cxlem
Если Вы не ответите и [% newemailaddress %] подтвердит изменение,
новый адрес вступит в силу через [%- constants.MAX_TOKEN_AGE %] дней
([% expiration_ts FILTER time("%d.%m.%Y %H:%M %Z") %]).
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# token: string. The token to be used in the user account creation.
# email: email address of the user account.
# expiration_ts: expiration date of the token.
#%]
[% title = BLOCK %]Создание учетной записи для '[% email FILTER html %]'[% END %]
[% PROCESS "global/header.html.tmpl"
title = title
onload = "document.forms['confirm_account_form'].realname.focus();" %]
<p>
Для создания учетной записи установите пароль. Кроме того, можно
указать полное имя и откорректировать адрес электронной почты.
</p>
<form id="confirm_account_form" method="post" action="token.cgi">
<input type="hidden" name="t" value="[% token FILTER html %]">
<input type="hidden" name="a" value="confirm_new_account">
<table>
<tr>
<th align="right">Адрес электронной почты:</th>
<td>[% email FILTER html %]</td>
</tr>
<tr>
<th align="right"><small><i>(НЕ ОБЯЗАТЕЛЬНО)</i></small> <label for="realname">Полное имя</label>:</th>
<td><input type="text" id="realname" name="realname" value=""></td>
</tr>
<tr>
<th align="right"><label for="passwd1">Введите пароль</label>:</th>
<td>
<input type="password" id="passwd1" name="passwd1" value="">
(минимум [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] символов)
</td>
</tr>
<tr>
<th align="right"><label for="passwd2">Повторите ввод пароля</label>:</th>
<td><input type="password" id="passwd2" name="passwd2" value=""></td>
</tr>
<tr>
<th align="right">&nbsp;</th>
<td><input type="submit" id="confirm" value="Создать"></td>
</tr>
</table>
</form>
<p>
Если форма не будет заполнена до
<u>[%+ expiration_ts FILTER time("%d.%m.%Y %H:%M %Z") %]</u>,
учетная запись не будет создана.
</p>
<p>
Если Вы не хотите создавать учетную запись с этим адресом электронной
почты, нажмите кнопку "Отказ от регистрации" и данные о Вас будут удалены.
</p>
<form id="cancel_account_form" method="post" action="token.cgi">
<input type="hidden" name="t" value="[% token FILTER html %]">
<input type="hidden" name="a" value="cancel_new_account">
<input type="submit" id="confirm" value="Отказ от регистрации">
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# token: string. The token to be used in this address change.
#%]
[% title = " Подтверждение изменения адреса электронной почты" %]
[% PROCESS global/header.html.tmpl %]
<p>
Для изменения адреса электронной почты введите ваш текущий пароль:
</p>
<form method="post" action="token.cgi">
<input type="hidden" name="t" value="[% token FILTER html %]">
<input type="hidden" name="a" value="chgem">
<table>
<tr>
<th align="right">Пароль:</th>
<td><input type="password" name="password" size="36"></td>
</tr>
<tr>
<th align="right">&nbsp;</th>
<td><input type="submit" id="confirm" value="Продолжить"></td>
</tr>
</table>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# token: random string used to authenticate the transaction.
# expiration_ts: expiration date of the token.
# email: email address of the new account.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% email %]
Subject: [% terms.Bugzilla %]: подтверждение создания учетной записи
X-Bugzilla-Type: admin
Системой [%+ terms.Bugzilla %] получена заявка на создание учетной записи
с адресом электронной почты ([% email %]).
Для подтверждения создания учетной записи с этим адресом электронной
почты перейдите по ссылке не позднее [%+ expiration_ts FILTER time("%H:%M %Z %d.%m.%Y") %]:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=request_new_account
Если Вы не получили этого сообщения до [%+ expiration_ts FILTER time("%H:%M %Z %d.%m.%Y") %] или
хотите создать учетную запись с другим адресом электронной почты, Вы можете
начать регистрацию заново:
[%+ urlbase %]createaccount.cgi
[% IF Param('createemailregexp') == '.*' && Param('emailsuffix') == '' %]
ОБРАТИТЕ ВНИМАНИЕ: [% terms.Bugzilla %] — общедоступная система отслеживания [% terms.bugs_gen %].
Данные о многих [% terms.bugs_obj %], включая адреса электронной почты, находятся в
открытом доступе. Рекомендуется использовать неосновной почтовый ящик или
бесплатную почтовую службу (например, Gmail, mail.ru, Яндекс.Почта и т.п.)
во избежание получения нежелательной почты (спама) в основной почтовый ящик.
[% END %]
Если вы не делали такой заявки или хотите её аннулировать, перейдите
по ссылке:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cancel_new_account
Если упомянутые ссылки не работают или у Вас есть другие вопросы, связанные
с Вашей учетной записью, обратитесь к администратору: [% Param('maintainer') %].
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% emailaddress %]
Subject: Запрос на изменение пароля [% terms.Bugzilla %]
X-Bugzilla-Type: admin
Вами (или кем-то от Вашего имени) была запрошена смена пароля
[%+ terms.Bugzilla %]. Для смены пароля выберите ссылку:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cfmpw
Если Вы не запрашивали этого изменения либо хотите его аннулировать,
выберите ссылку:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cxlpw
Если Вы не ответите, запрос будет автоматически аннулирован через
[% constants.MAX_TOKEN_AGE %] дней ([% expiration_ts FILTER time("%d.%m.%Y %H:%M %Z", timezone) -%])
или при следующем входе в систему.
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% title = "Изменение пароля" %]
[% PROCESS global/header.html.tmpl %]
[% password_complexity = Param('password_complexity') %]
<p>
Для изменения пароля введите новый пароль дважды:<br>
</p>
<ul>
<li>Длина пароля должна быть не менее [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] символов.</li>
[% IF password_complexity == "mixed_letters" %]
<li>Пароль должен содержать по меньшей мере одну букву в ВЕРХНЕМ и одну букву в нижнем регистре.</li>
[% ELSIF password_complexity == "letters_numbers" %]
<li>Пароль должен содержать по меньшей мере одну букву в ВЕРХНЕМ регистре, одну букву в нижнем регистре и одну цифру.</li>
[% ELSIF password_complexity == "letters_numbers_specialchars" %]
<li>Пароль должен содержать по меньшей мере одну букву, одну цифру и один специальный символ.</li>
[% END %]
</ul>
<form method="post" action="token.cgi">
<input type="hidden" name="t" value="[% token FILTER html %]">
<input type="hidden" name="a" value="chgpw">
<table>
<tr>
<th align="right">Новый пароль:</th>
<td>
<input type="password" name="password">
</td>
</tr>
<tr>
<th align="right">Подтверждение пароля:</th>
<td>
<input type="password" name="matchpassword">
</td>
</tr>
<tr>
<th align="right">&nbsp;</th>
<td>
<input type="submit" id="update" value="Изменить">
</td>
</tr>
</table>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# realname: string. The user's real name, if any.
# login_change_date: string. The date the email change will be complete. (optional)
# new_login_name: string. The user's new Bugzilla login whilst not confirmed. (optional)
#%]
<table>
[% IF user.authorizer.can_change_password
|| (user.authorizer.can_change_email && Param('allowemailchange')) %]
<tr>
<td colspan="3">
Для подтверждения изменений учетной записи введите ваш пароль.
</td>
</tr>
<tr>
<th align="right">Пароль:</th>
<td>
<input type="hidden" name="old_login" value="[% user.login FILTER html %]">
<input type="password" name="old_password">
</td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
[% END %]
[% IF user.authorizer.can_change_password %]
<tr>
<th align="right">Новый пароль:</th>
<td>
<input type="password" name="new_password1">
</td>
</tr>
<tr>
<th align="right">Подтверждение пароля:</th>
<td>
<input type="password" name="new_password2">
</td>
</tr>
[% END %]
<tr>
<th align="right">Полное имя (необязательно, но желательно):</th>
<td>
<input size="35" name="realname" value="[% realname FILTER html %]">
</td>
</tr>
[% IF user.authorizer.can_change_email && Param('allowemailchange') %]
[% IF login_change_date %]
[% IF new_login_name %]
<tr>
<th align="right">Новый адрес электронной почты:</th>
<td>[% new_login_name FILTER html %]</td>
</tr>
<tr>
<th align="right">Срок подтверждения:</th>
<td>[% login_change_date FILTER time %]</td>
</tr>
[% ELSE %]
<tr>
<th align="right">Текущий адрес электронной почты:</th>
<td>[% user.login FILTER html %]</td>
</tr>
<tr>
<th align="right">Срок подтверждения:</th>
<td>[% login_change_date FILTER time %]</td>
</tr>
[% END %]
[% ELSE %]
<tr>
<th align="right">Новый адрес электронной почты:</th>
<td>
<input size="35" name="new_login_name">
</td>
</tr>
[% END %]
[% END %]
[% Hook.process('field') %]
</table>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# watchedusers: string.
# Comma-separated list of email addresses this user watches.
# watchers: array.
# Array of users watching this user's account.
# excludeself: boolean.
# True if user is not receiving self-generated mail.
# <rolename>: Multiple hashes, one for each rolename (e.g. assignee; see
# below), keyed by reasonname (e.g. comments; again, see
# below). The value is a boolean - true if the user is
# receiving mail for that reason when in that role.
#%]
[% PROCESS global/variables.none.tmpl %]
[%# If the user's bugmail has been disabled by admins, show a warning. %]
[% IF user.email_disabled %]
<div class="warningmessages">
Ваши оповещения об изменениях в [% terms.bugs_obj %] были отключены
администратором [% terms.Bugzilla %]. Пожалуйста, свяжитесь с
[% Param('maintainer') %], чтобы включить оповещения об изменениях
в [% terms.bugs_obj %].
</div>
[% END %]
[% IF user.authorizer.can_change_email && Param('allowemailchange') %]
<p>
Если вы хотите изменить свой адрес электронной почты
<b>[% user.email FILTER html %]</b> на которой приходят уведомления от
[% terms.Bugzilla %], щёлкните по расположенной выше вкладке
"Учетная запись".
</p>
[% END %]
<p>
Если вы не хотите получать оповещение о незначительных изменениях
состояния [% terms.bugs_gen %], измените настройки фильтрации
некоторых (или всех) сообщений:
</p>
<script type="text/javascript">
<!--
function SetCheckboxes(setting) {
for (var count = 0; count < document.userprefsform.elements.length; count++) {
var theinput = document.userprefsform.elements[count];
if (theinput.type == "checkbox" && !theinput.disabled) {
if (theinput.name.match("neg")) {
theinput.checked = !setting;
}
else {
theinput.checked = setting;
}
}
}
}
document.write('<input type="button" value="Разрешить все письма" onclick="SetCheckboxes(true); return false;">\n');
document.write('<input type="button" value="Запретить все письма" onclick="SetCheckboxes(false); return false;">\n');
// -->
</script>
<hr>
<table>
<tr>
<td colspan="2">
<b>Глобальные параметры:</b>
</td>
</tr>
<tr>
<td width="150"></td>
<td>
[% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %]
<input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1"
[% " checked"
IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]>
<label for="[% prefname %]">Сообщать мне, когда кто-то запрашивает моего согласования</label>
<br>
</td>
</tr>
<tr>
<td width="150"></td>
<td>
[% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %]
<input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1"
[% " checked"
IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]>
<label for="[% prefname %]">Сообщать мне, когда кто-то дает запрошенное мной согласование</label>
<br>
</td>
</tr>
[% IF user.is_global_watcher %]
<tr>
<td width="150"></td>
<td>
Вы получаете оповещения о всех [% terms.bugs_acc %]. Для отключения глобального оповещения
обратитесь к администратору:
<a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>.
</td>
</tr>
[% END %]
</table>
<hr>
<b>Параметры отдельных изменений/ролей:</b>
<br>
<br>
[% events = [
{ id = constants.EVT_ADDED_REMOVED,
description = "изменении моей роли в этой ошибке" },
{ id = constants.EVT_BUG_CREATED,
description = "регистрации новой $terms.bug_gen" },
{ id = constants.EVT_OPENED_CLOSED,
description = "принятии или отмене решения" },
{ id = constants.EVT_COMPONENT,
description = "изменении продукта или компонента" },
{ id = constants.EVT_PROJ_MANAGEMENT,
description = "изменении приоритета, состояния, серьезности и/или сроков" },
{ id = constants.EVT_COMMENT,
description = "добавлении комментариев" },
{ id = constants.EVT_ATTACHMENT,
description = "добавлении приложений" },
{ id = constants.EVT_ATTACHMENT_DATA,
description = "изменении приложений" },
{ id = constants.EVT_KEYWORD,
description = "изменении ключевых слов" },
{ id = constants.EVT_CC,
description = "изменении подписчиков" },
{ id = constants.EVT_DEPEND_BLOCK,
description = "изменении зависимостей" },
{ id = constants.EVT_OTHER,
description = "прочих изменениях" },
] %]
[% neg_events = [
{ id = constants.EVT_UNCONFIRMED,
description = "неподтвержденных $terms.bugs_gen" },
{ id = constants.EVT_CHANGED_BY_ME,
description = "моих собственных изменений" },
] %]
[% relationships = [
{ id = constants.REL_ASSIGNEE,
description = "Исполнитель" },
{ id = constants.REL_REPORTER,
description = "Инициатор" },
{ id = constants.REL_CC,
description = "Подписчик" },
] %]
[% IF Param('useqacontact') %]
[% relationships.push({ id = constants.REL_QA,
description = "Приёмка" }) %]
[% END %]
[%# This is up here so that the "relationships" hook can modify it. %]
[% no_added_removed = [constants.REL_REPORTER] %]
[% Hook.process('relationships') %]
[% num_columns = relationships.size %]
<table class="bz_emailprefs" border="1">
<tr>
<td colspan="[% num_columns FILTER html %]" align="center" width="50%">
<b>Когда я:</b>
</td>
<td rowspan="2" width="40%">
<b>Я должен получать оповещения о:</b>
</td>
</tr>
<tr>
[% FOREACH relationship = relationships %]
<th align="center" width="9%">
[% relationship.description FILTER html %]
</th>
[% END %]
</tr>
[% FOREACH event = events %]
[% count = loop.count() %]
<tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
[% FOREACH relationship = relationships %]
<td align="center">
<input type="checkbox"
name="email-[% relationship.id %]-[% event.id %]"
value="1"
[%# The combinations don't always make sense; disable a couple %]
[% IF event.id == constants.EVT_ADDED_REMOVED AND
no_added_removed.contains(relationship.id)
%]
disabled
[% ELSIF user.mail_settings.${relationship.id}.${event.id} %]
checked
[% END %]>
</td>
[% END %]
<td>
[% event.description FILTER html %]
</td>
</tr>
[% END %]
<tr>
<td colspan="[% num_columns FILTER html %]"
align="center" width="50%">
&nbsp;
</td>
<td width="40%">
<b>кроме (имеет приоритет):</b>
</td>
</tr>
[% FOREACH event = neg_events %]
[% count = loop.count() %]
<tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
[% FOREACH relationship = relationships %]
<td align="center">
<input type="checkbox"
name="neg-email-[% relationship.id %]-[% event.id %]"
value="1"
[% " checked" IF NOT user.mail_settings.${relationship.id}.${event.id} %]>
</td>
[% END %]
<td>
[% event.description FILTER html %]
</td>
</tr>
[% END %]
</table>
<hr>
<b>Дублирование оповещений</b>
<p>
Дублирование оповещений полезно, когда вы замещаете других
пользователей. Сообщения отправляются в соответствии с <u>вашими</u>
настройками но с учетом <u>их</u> ролей по отношению к [% terms.bug_dat %]
(например, Исполнитель).
</p>
<p>
[% IF watchedusers.size %]
Вы замещаете пользователей:
</p>
<p>
<select id="watched_by_you" name="watched_by_you" multiple="multiple" size="5">
[% FOREACH w = watchedusers %]
<option value="[% w FILTER html %]">[% w FILTER html %]</option>
[% END %]
</select> <br />
<input type="checkbox" id="remove_watched_users" name="remove_watched_users">
<label for="remove_watched_users">Отключить замещение выбранных пользователей</label>
[% ELSE %]
Нет замещаемых пользователей.
[% END %]
</p>
<p id="new_watched_by_you">Включить замещение (список пользователей через запятую):
[% INCLUDE global/userselect.html.tmpl
id => "new_watchedusers"
name => "new_watchedusers"
value => ""
size => 60
multiple => 5
%]
</p>
<p id="watching_you">Вас замещают пользователи:<br>
[% IF watchers.size %]
[% FOREACH watcher = watchers %]
[% watcher FILTER html %] <br>
[% END %]
[% ELSE %]
<i>Нет заместителей</i>
[% END %]
</p>
<hr>
<br>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# has_bits: array of hashes. May be empty.
# name => Names of the permissions the user has.
# desc => Descriptions of the permissions the user has.
# set_bits: array of hashes. May be empty.
# name => Names of the permissions the user can set for
# other people.
# desc => Descriptions of the permissions the user can set for
# other people.
#%]
[% PROCESS global/variables.none.tmpl %]
<table align="center">
<tr>
<td>
[% IF has_bits.size %]
Для вашей учетной записи установлены права:
<table align="center">
[% FOREACH bit_description = has_bits %]
<tr>
<td>[% bit_description.name FILTER html %]</td>
<td>[% bit_description.desc FILTER html_light %]</td>
</tr>
[% END %]
</table>
[% FOREACH privs = ["editcomponents", "canconfirm", "editbugs"] %]
[% SET products = ${"local_$privs"} %]
[% IF products && products.size %]
<br>
<p>
Также установлены права '[% privs FILTER html %]'
для следующих продуктов:
</p>
<p>
[% FOREACH product = products %]
[% product.name FILTER html %]<br>
[% END %]
</p>
[% END %]
[% END %]
[% ELSE %]
Для вашей учетной записи прав не установлено.
[% END %]
[% IF user.in_group('editusers') %]
<br>
У вас есть право редактировать пользователей. Вы можете
включать и выключать все разрешения всем пользователям.
[% ELSIF set_bits.size %]
<br>
А также Вы можете управлять следующими правами
<a href="editusers.cgi">других пользователей</a>:
<table align="center">
[% FOREACH bit_description = set_bits %]
<tr>
<td>[% bit_description.name FILTER html %]</td>
<td>[% bit_description.desc FILTER html_light %]</td>
</tr>
[% END %]
</table>
[% END %]
[% IF user.in_group('bz_sudoers') %]
<br>
Вы включены в группу <b>bz_sudoers</b> и можете
<a href="relogin.cgi?action=prepare-sudo">работать от имени другого пользователя</a>.
[% END %]
</td>
</tr>
</table>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# tabs: List of hashes. May not be empty. Each hash has three members:
# name: string. Name of the tab (used internally.)
# description: string. Description of the tab (used in tab title).
# saveable: boolean. True if tab has a form which can be submitted.
# True if user is not receiving self-generated mail.
# Note: For each tab name, a template "prefs/${tab.name}.tmpl" must exist,
# and its interface must be fulfilled.
# current_tab: A direct reference to one of the hashes in the tabs list.
# This tab will be displayed.
# changes_saved: boolean/string. True if the CGI processed form data before
# displaying anything, and can contain an optional custom
# message if required (which Perl still evaluates as True).
# dont_show_button: boolean. Prevent the display of the "Submit Changes" button.
#%]
[% filtered_login = user.login FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Параметры пользователя"
subheader = filtered_login
style_urls = ['skins/standard/admin.css']
javascript_urls = ['js/util.js', 'js/field.js']
doc_section = "userpreferences.html"
yui = ['autocomplete']
%]
[% tabs = [ { name => "settings", label => "Общие параметры",
link => "userprefs.cgi?tab=settings", saveable => "1" },
{ name => "email", label => "Электронная почта",
link => "userprefs.cgi?tab=email", saveable => "1" },
{ name => "saved-searches", label => "Условия отбора",
link => "userprefs.cgi?tab=saved-searches", saveable => "1" },
{ name => "account", label => "Учетная запись",
link => "userprefs.cgi?tab=account", saveable => "1" },
{ name => "permissions", label => "Разрешения",
link => "userprefs.cgi?tab=permissions", saveable => "0" } ] %]
[% Hook.process('tabs') %]
[% FOREACH tab IN tabs %]
[% IF tab.name == current_tab_name %]
[% current_tab = tab %]
[% LAST %]
[% END %]
[% END %]
[% WRAPPER global/tabs.html.tmpl
tabs = tabs
current_tab = current_tab
%]
[% IF changes_saved %]
<div id="message">
[% current_tab.label FILTER lower %]: изменения сохранены.
[% IF email_changes_saved %]
<p>
По старому и по новому адресу отправлены сообщения
для подтверждения изменения адреса электронной почты.
</p>
[% END %]
</div>
[% END %]
<h3>[% current_tab.label %]</h3>
[% IF current_tab.saveable %]
<form name="userprefsform" method="post" action="userprefs.cgi">
<input type="hidden" name="tab" value="[% current_tab.name %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
[% END %]
[% PROCESS "account/prefs/${current_tab.name}.html.tmpl"
IF current_tab.name.defined %]
[% IF current_tab.saveable %]
<input type="hidden" name="dosave" value="1">
[% UNLESS dont_show_button %]
<table>
<tr>
<td width="150">&nbsp;</td>
<td>
<input type="submit" id="update" value="Сохранить">
</td>
</tr>
</table>
[% END %]
</form>
[% END %]
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# queryshare_groups: list of groups the user may share queries with
# (id, name).
# bless_group_ids: list of group ids the user may bless.
#%]
[% IF user.can_bless %]
<script type="text/javascript"><!--
function update_checkbox(group) {
var bless_groups = [[% bless_group_ids.join(",") FILTER js %]];
var checkbox = document.getElementById(group.name.replace(/share_(\d+)/, "force_$1"));
if (bz_isValueInArray(bless_groups, group.value)) {
YAHOO.util.Dom.removeClass(checkbox.parentNode, "bz_default_hidden");
} else {
YAHOO.util.Dom.addClass(checkbox.parentNode, "bz_default_hidden");
checkbox.checked = false;
}
} //-->
</script>
[% END %]
<p>Сохраненные условия отбора:</p>
<blockquote>
<table border="1" cellpadding="3">
<tr>
<th>
Условие
</th>
<th>
Отобрать
</th>
<th>
Изменить
</th>
<th>
Удалить
</th>
<th>
Показывать внизу страницы
</th>
[% may_share = user.in_group(Param('querysharegroup')) && queryshare_groups.size %]
[% IF may_share %]
<th>
Опубликовать для группы
</th>
[% END %]
</tr>
<tr>
<td>Мои [% terms.bugs %]</td>
<td>
[% filtered_username = user.login FILTER uri %]
<a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">Отобрать</a>
</td>
<td>
&nbsp;
</td>
<td>
&nbsp;
</td>
<td align="center">
<input type="checkbox"
name="showmybugslink"
value="1"
[% " checked" IF user.showmybugslink %]>
</td>
[% IF may_share %]
<td>
&mdash;
</td>
[% END %]
</tr>
[% FOREACH q = user.queries %]
<tr>
<td>[% q.name FILTER html %]</td>
<td>
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=[% q.name FILTER uri %]
[% IF q.shared_with_group.id %]&amp;sharer_id=[% user.id FILTER uri %][% END %]">Отобрать</a>
</td>
<td>
<a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
[% q.name FILTER uri %]">Изменить</a>
</td>
<td>
[% IF q.used_in_whine %]
Используется в <a href="editwhines.cgi">предупреждениях</a>
[% ELSE %]
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
[% q.name FILTER uri %]&amp;token=
[% issue_hash_token([q.id, q.name]) FILTER uri %]">Удалить</a>
[% END %]
</td>
<td align="center">
<input type="checkbox"
name="link_in_footer_[% q.id FILTER html %]"
value="1"
alt="[% q.name FILTER html %]"
[% " checked" IF q.link_in_footer %]>
</td>
[% IF may_share %]
<td>
<select name="share_[% q.id FILTER html %]"
[% IF user.can_bless %] onchange="update_checkbox(this);"[% END %]>
<option value="">Не публиковать</option>
[% FOREACH group = queryshare_groups %]
<option value="[% group.id %]"
[% ' selected="selected"'
IF q.shared_with_group.id == group.id %]
>[% group.name FILTER html %]</option>
[% END %]
</select>
[% IF user.can_bless %]
<span [% IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0
%]class="bz_default_hidden"[% END %]>
<input type="checkbox" id="force_[% q.id FILTER html %]"
name="force_[% q.id FILTER html %]" value="1">
<label for="force_[% q.id FILTER html %]">Показывать внизу страницы</label>
</span>
[% END %]
[% IF q.shared_with_users %]
(опубликовано для [% q.shared_with_users FILTER html %]
[%+ numeral(q.shared_with_users, "пользователя", "пользователей", "пользователей") FILTER html %])
[% END %]
</td>
[% END %]
</tr>
[% END %]
</table>
[% IF user.can_bless %]
<p>Обратите внимание: для каждого условия, отмеченного "Показывать внизу страницы",
ссылка будет добавлена в набор условий каждого пользователя, входящего в группу
на момент сохранения этих изменений.</p>
[% END %]
</blockquote>
[% IF user.queries_available.size %]
<p>Условия отбора, опубликованные другими пользователями:</p>
<table border="1" cellpadding="3">
<tr>
<th>
Условие
</th>
<th>
Автор
</th>
<th>
Опубликовано для
</th>
<th>
Отобрать
</th>
<th>
Изменить
</th>
<th>
Показывать
внизу страницы
</th>
</tr>
[% FOREACH q = user.queries_available %]
<tr>
<td>[% q.name FILTER html %]</td>
<td>[% q.user.identity FILTER html %]</td>
<td>[% q.shared_with_group.name FILTER html %]</td>
<td>
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
[% q.name FILTER uri %]&amp;sharer_id=
[% q.user.id FILTER uri %]">Отобрать</a>
</td>
<td>
<a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
[% q.name FILTER uri %]">Изменить</a>
</td>
<td align="center">
<input type="checkbox"
name="link_in_footer_[% q.id FILTER html %]"
value="1"
alt="[% q.name FILTER html %]"
[% " checked" IF q.link_in_footer %]>
</td>
</tr>
[% END %]
</table>
[% ELSE %]
<p>Нет условий отбора, опубликованных для Вас другими пользователями.</p>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# setting_names: an array of strings
# settings: a hash of hashes, keyed by setting_name.
# Each hash contains:
# is_enabled - boolean
# default_value - string (global default for this setting)
# value - string (user-defined preference)
# is_default - boolean (true if user has no preference)
# has_settings_enabled : boolean; is true if there is at least one user pref
# enabled by the maintainer.
#%]
[% PROCESS "global/setting-descs.none.tmpl" %]
[% IF settings.size %]
[% UNLESS has_settings_enabled %]
<p class="criticalmessages">
Изменение параметров пользователя запрещено
<a href="mailto:[% Param("maintainer") %]">администратором</a>
сервера. Исправления невозможны.
</p>
[% END %]
<table border="0" cellpadding="8">
[% FOREACH name = setting_names %]
[% default_name = name _ '-isdefault' %]
[% default_val = settings.${name}.default_value %]
<tr>
<td align="right">
[% setting_descs.$name OR name FILTER html %]
</td>
<td>
[% IF settings.${name}.is_enabled %]
<select name="[% name FILTER html %]" id="[% name FILTER html %]">
<option value="[% default_name FILTER html %]"
[% ' selected="selected"' IF settings.${name}.is_default %]>
По умолчанию ([% setting_descs.${default_val} OR default_val FILTER html %])
</option>
[% FOREACH x = settings.${name}.legal_values %]
<option value="[% x FILTER html %]"
[% ' selected="selected"'
IF x == settings.${name}.value
AND NOT settings.${name}.is_default %]>
[% setting_descs.${x} OR x FILTER html %]
</option>
[% END %]
</select>
[% ELSE %]
<select name="[% name FILTER html %]" id="[% name FILTER html %]" disabled="disabled">
<option value="[% default_name FILTER html %]">
По умолчанию ([% setting_descs.${default_val} OR default_val FILTER html %])
</option>
</select>
[% END %]
</td>
</tr>
[% END %]
</table>
[% END %]
<br>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# otheruser: Bugzilla User Object; The user whose profile activity
# we are viewing.
#
# listselectionvalues: selection values to recreate the current user list.
#
# profile_changes: An array of hashes containing the following fields:
#
# who: string; login name of who made the change
# activity_when: string; when the change was made
# what: string; the description of the field which was changed
# removed: string; the removed value (maybe empty string)
# added: string; the added value (maybe empty string)
#%]
[% title = BLOCK %]
Журнал изменений учетной записи '[% otheruser.login FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
[% columns =
[{name => 'who'
heading => 'Кто'
}
{name => 'activity_when'
heading => 'Когда'
}
{name => 'what'
heading => 'Что'
content_use_field => 1
}
{name => 'removed'
heading => 'Удалено'
}
{name => 'added'
heading => 'Добавлено'
}
]
%]
[% PROCESS admin/table.html.tmpl
columns = columns
data = profile_changes
%]
<p><a href="editusers.cgi?action=edit&amp;userid=
[%- otheruser.id FILTER uri %]"
title="Изменить данные пользователя '[% otheruser.login FILTER html %]'">Изменить пользователя</a> или
<a title="Поиск пользователей" href="editusers.cgi">Искать другие учетные записи</a>
[% IF listselectionvalues.matchtype != 'exact' %]
или <a title="Вернуться к списку пользователей"
href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">вернуться
к списку пользователей</a>
[% END %]
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Администрирование экземпляра ([% terms.Bugzilla %]
[%+ constants.BUGZILLA_VERSION FILTER html %])
[% END %]
[% PROCESS global/header.html.tmpl title = title
style_urls = ['skins/standard/admin.css']
doc_section = "administration.html"
%]
<div>
Данная страница доступна только пользователям с административными правами.
Отсюда можно перейти к страницам для настройки различных аспектов этого экземпляра
[% terms.Bugzilla %]. Обратите внимание: некоторые страницы могут быть недоступны Вам,
они отмечены более светлым цветом.
</div>
<table>
<tr>
<td class="admin_links">
<dl>
[% class = user.in_group('tweakparams') ? "" : "forbidden" %]
<dt id="parameters" class="[% class %]"><a href="editparams.cgi">Настройки системы</a></dt>
<dd class="[% class %]">Установка основных параметров системы. Здесь устанавливается
адрес (URL) для доступа к системе, правила аутентификации пользователей,
выбор полей для отображения, настройка почтовых оповещений, выбор групп
пользователей для определенных задач и многое другое.</dd>
<dt id="preferences" class="[% class %]"><a href="editsettings.cgi">Настройки пользователей</a></dt>
<dd class="[% class %]">Установка настроек по умолчанию для пользователей. Эти значения
будут использованы для всех пользователей системы. Пользователи смогут изменить их
на странице <a href="userprefs.cgi?tab=settings">параметров пользователя</a>.</dd>
[% class = user.in_group('editcomponents') ? "" : "forbidden" %]
<dt id="sanitycheck" class="[% class %]"><a href="sanitycheck.cgi">Проверка целостности</a></dt>
<dd class="[% class %]">Запуск проверки целостности для поиска проблем в базе данных.
Это может занять несколько десятков минут, в зависимости от размера базы данных.
Проверку можно автоматизировать, настроив запуск <tt>sanitycheck.pl</tt> по расписанию.
В случае обнаружения ошибок оповещение будет отправлено указанному пользователю по
электронной почте.</dd>
[% class = (user.in_group('editusers') || user.can_bless) ? "" : "forbidden" %]
<dt id="users" class="[% class %]"><a href="editusers.cgi">Пользователи</a></dt>
<dd class="[% class %]">Создание новых учетных записей и изменение существующих.
Управление членством пользователей в группах.</dd>
[% class = (Param('useclassification') && user.in_group('editclassifications')) ? "" : "forbidden" %]
<dt id="classifications" class="[% class %]"><a href="editclassifications.cgi">Разделы</a></dt>
<dd class="[% class %]">Если [% terms.Bugzilla %] используется для поддержки многих продуктов
одновременно, их можно разбить на разделы. Это поможет пользователям лучше ориентироваться
как при поиске, так и при регистрации [% terms.bugs_gen %].</dd>
[% class = (user.in_group('editcomponents')
|| user.get_products_by_permission("editcomponents").size) ? "" : "forbidden" %]
<dt id="products" class="[% class %]"><a href="editproducts.cgi">Продукты</a></dt>
<dd class="[% class %]">Изменение параметров продуктов, включая настройку групп,
которое позволяет управлять доступом к [% terms.bugs_dat %] этих продуктов. Также
можно непосредственно изменить такие параметры продуктов как
<a href="editcomponents.cgi">компоненты</a>, <a href="editversions.cgi">версии</a>
и <a href="editmilestones.cgi">планы</a>.</dd>
[% class = (user.in_group('editcomponents')
|| user.get_products_by_permission('editcomponents').size) ? "" : "forbidden" %]
<dt id="flags" class="[% class %]"><a href="editflagtypes.cgi">Согласования</a></dt>
<dd class="[% class %]">Согласование — специальный атрибут [% terms.bugs_gen %]
и/или приложений, который может принимать четыре состояния: запрошено, одобрено, отклонено и не определено.
Количество согласований для [% terms.bug_gen %] не ограничено, также определяется какие
пользователи могут выполнять их.</dd>
[% Hook.process('end_links_left') %]
</dl>
</td>
<td class="admin_links">
<dl>
[% class = user.in_group('admin') ? "" : "forbidden" %]
<dt id="custom_fields" class="[% class %]"><a href="editfields.cgi">Атрибуты</a></dt>
<dd class="[% class %]">[% terms.Bugzilla %] позволяет определить новые поля,
не реализованные изначально, для учета специфических требований.
Эти поля могут использоваться наряду со стандартными: принимать некоторые значения для
[%+ terms.bugs_gen %] и участвовать в поиске.<br>
Перед созданием новых атрибутов следует изучить штатные возможности, поскольку
множество дополнительных атрибутов сделают интерфейс громоздким и сложным
для использования.</dd>
<dt id="field_values" class="[% class %]"><a href="editvalues.cgi">Значения атрибутов</a></dt>
<dd class="[% class %]">Определение допустимых значений для атрибутов, выбор в
которых ограничен некоторым списком. Здесь же определяются значения настраиваемых
атрибутов некоторых типов.</dd>
<dt id="status_workflow" class="[% class %]"><a href="editworkflow.cgi">Состояния [%terms.bugs_gen %]</a></dt>
<dd class="[% class %]">Настройка состояний: выбор начальных состояний [% terms.bugs_gen %],
выбираемых при их создании, и допустимых переходов
между состояниями при изменениях существующих [% terms.bugs_gen %].</dd>
[% class = user.in_group('creategroups') ? "" : "forbidden" %]
<dt id="groups" class="[% class %]"><a href="editgroups.cgi">Группы</a></dt>
<dd class="[% class %]">Определение групп пользователей данного экземпляра [% terms.Bugzilla %].
Группы используются для определения привилегий в системе и для ограничения доступа
к некоторым [% terms.bugs_dat %].</dd>
[% class = user.in_group('editkeywords') ? "" : "forbidden" %]
<dt id="keywords" class="[% class %]"><a href="editkeywords.cgi">Ключевые слова</a></dt>
<dd class="[% class %]">Настройка ключевых слов для присвоения [% terms.bugs_dat %]. Ключевые слова&nbsp;—
удобный инструмент пометки [% terms.bugs_gen %] для облегчения их поиска в дальнейшем.</dd>
[% class = user.in_group('bz_canusewhines') ? "" : "forbidden" %]
<dt id="whining" class="[% class %]"><a href="editwhines.cgi">Оповещения</a></dt>
<dd class="[% class %]">Настройка запросов, запускаемых по расписанию и
рассылающих результаты по электронной почте. Это удобный способ напоминаний
о назначениях и отслеживания изменений [% terms.bugs_gen %].</dd>
[% Hook.process('end_links_right') %]
</dl>
</td>
</tr>
</table>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/header.html.tmpl
title = "Создание раздела"
%]
<form method=post action="editclassifications.cgi">
<table border=0 cellpadding=4 cellspacing=0>
[% PROCESS "admin/classifications/edit-common.html.tmpl" %]
</table>
<hr>
<input type=submit value="Создать">
<input type=hidden name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]">
</FORM>
[% PROCESS admin/classifications/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/header.html.tmpl
title = "Удаление раздела"
%]
<table border=1 cellpadding=4 cellspacing=0>
<tr bgcolor="#6666ff">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr><tr>
<td valign="top">Раздел:</td>
<td valign="top">[% classification.name FILTER html %]</td>
</tr><tr>
<td valign="top">Описание:</td>
<td valign="top">
[% IF classification.description %]
[% classification.description FILTER html_light %]
[% ELSE %]
<font color="red">не указано</font>
[% END %]
</td>
</tr><tr>
<td valign="top">Порядок сортировки:</td>
<td valign="top">[% classification.sortkey FILTER html %]</td>
</tr>
</table>
<h2>Подтверждение</h2>
<p>Удалить этот раздел?<p>
<form method=post action="editclassifications.cgi">
<input type=submit value="Да, удалить">
<input type=hidden name="action" value="delete">
<input type=hidden name="classification" value="[% classification.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/classifications/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# classification: Bugzilla::Classifiation object.
#%]
<tr>
<th align="right">Раздел:</th>
<td><input size=64 maxlength=64 name="classification"
value="[% classification.name FILTER html %]"></td>
</tr>
<tr>
<th align="right">Описание:</th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'description'
minrows = 4
cols = 64
defaultcontent = classification.description
%]
</td>
</tr>
<tr>
<th align="right"><label for="sortkey">Порядок сортировки:</label></th>
<td><input id="sortkey" size="20" maxlength="20" name="sortkey"
value="[%- classification.sortkey FILTER html %]"></td>
</tr>
[% Hook.process('rows') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/header.html.tmpl
title = "Изменение раздела"
%]
<form method=post action="editclassifications.cgi">
<table border=0 cellpadding=4 cellspacing=0>
[% PROCESS "admin/classifications/edit-common.html.tmpl" %]
<tr valign=top>
<th align="right">
<a href="editproducts.cgi?classification=[% classification.name FILTER uri %]">
Продукты</a>:
</th>
<td>
[% IF classification.products.size > 0 %]
<table>
[% FOREACH product = classification.products %]
<tr>
<th align=right valign=top>[% product.name FILTER html %]</th>
<td valign=top>
[% IF product.description %]
[% product.description FILTER html_light %]
[% ELSE %]
<font color="red">нет описания</font>
[% END %]
</td>
</tr>
[% END %]
</table>
[% ELSE %]
<font color="red">нет продуктов</font>
[% END %]
</td>
</tr>
</table>
<input type=hidden name="classificationold"
value="[% classification.name FILTER html %]">
<input type=hidden name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type=submit value="Сохранить">
</form>
[% PROCESS admin/classifications/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
<p>Вернуться <a href="./">в начало</a>
или <a href="editclassifications.cgi"> изменить</a> другие разделы.
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/header.html.tmpl
title = "Переместить продукты"
%]
<form method=post action="editclassifications.cgi">
<table border=0 cellpadding=4 cellspacing=0>
<tr>
<th align="right">Раздел:</th>
<td valign="top" colspan=3>[% classification.name FILTER html %]</td>
</tr><tr>
<th align="right">Описание:</th>
<td valign="top" colspan=3>
[% IF classification.description %]
[% classification.description FILTER html_light %]
[% ELSE %]
<font color="red">не указано</font>
[% END %]
</td>
</tr><tr>
<th align="right">Порядок сортировки:</th>
<td valign="top" colspan=3>[% classification.sortkey FILTER html %]</td>
</tr><tr>
<th align="right">Продукты:</th>
<td valign="top">Другие разделы</td>
<td></td>
<td valign="top">Этот раздел</td>
</tr><tr>
<td></td>
<td valign="top">
<select name="prodlist" id="prodlist" multiple="multiple" size="20">
[% FOREACH class = classifications %]
[% IF class.id != classification.id %]
[% FOREACH product = class.products %]
<option value="[% product.name FILTER html %]">
[[% class.name FILTER html %]]&nbsp;[% product.name FILTER html %]
</option>
[% END %]
[% END %]
[% END %]
</select></td>
<td align="center">
<input type=submit value="Добавить &gt;&gt;" name="add_products"><br><br>
<input type=submit value="&lt;&lt; Исключить" name="remove_products">
</td>
<td valign="middle" rowspan=2>
<select name="myprodlist" id="myprodlist" multiple="multiple" size="20">
[% FOREACH product = classification.products %]
<option value="[% product.name FILTER html %]">
[% product.name FILTER html %]
</option>
[% END %]
</select></td>
</tr>
</table>
<input type=hidden name="action" value="reclassify">
<input type=hidden name="classification" value="[% classification.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/classifications/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/header.html.tmpl
title = "Выберите раздел"
%]
<table border=1 cellpadding=4 cellspacing=0>
<tr bgcolor="#6666ff">
<th align="left">Изменить...</th>
<th align="left">Описание</th>
<th align="left">Порядок сортировки</th>
<th align="left">Продукты</th>
<th align="left">Действие</th>
</tr>
[% FOREACH cl = classifications %]
<tr>
<td valign="top"><a href="editclassifications.cgi?action=edit&amp;classification=[% cl.name FILTER uri %]"><b>[% cl.name FILTER html %]</b></a></td>
<td valign="top">
[% IF cl.description %]
[% cl.description FILTER html_light %]
[% ELSE %]
<font color="red">нет</font>
[% END %]
</td>
<td valign="top">[% cl.sortkey FILTER html %]</td>
[% IF (cl.id == 1) %]
<td valign="top">[% cl.product_count FILTER html %]</td>
[% ELSE %]
<td valign="top"><a href="editclassifications.cgi?action=reclassify&amp;classification=[% cl.name FILTER uri %]">переклассифицировать ([% cl.product_count FILTER html %])</a></td>
[% END %]
[%# don't allow user to delete the default id. %]
[% IF (cl.id == 1) %]
<td valign="top">&nbsp;</td>
[% ELSE %]
<td valign="top"><a href="editclassifications.cgi?action=del&amp;classification=[% cl.name FILTER uri %]">удалить</a></td>
[% END %]
</tr>
[% END %]
</table>
<p>
<a href="editclassifications.cgi?action=add">Создать новый раздел</a>.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# comp: object; Bugzilla::Component object representing the component the
# user wants to delete.
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% title = BLOCK %]Удаление компонента '[% comp.name FILTER html %]'
продукта '[% product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">Компонент:</td>
<td valign="top">[% comp.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">Описание компонента:</td>
<td valign="top">[% comp.description FILTER html_light %]</td>
</tr>
<tr>
<td valign="top">Ответственный исполнитель:</td>
<td valign="top">[% comp.default_assignee.login FILTER html %]</td>
[% IF Param('useqacontact') %]
</tr>
<tr>
<td valign="top">Ответственный за приемку:</td>
<td valign="top">[% comp.default_qa_contact.login FILTER html %]</td>
[% END %]
</tr>
<tr>
<td valign="top">Компонент продукта:</td>
<td valign="top">[% product.name FILTER html %]</td>
[% IF product.description %]
</tr>
<tr>
<td valign="top">Описание продукта:</td>
<td valign="top">[% product.description FILTER html_light %]</td>
[% END %]
[% IF Param('usetargetmilestone') %]
</tr>
<tr>
<td valign="top">Планы продукта:</td>
<td valign="top">
<a href="[% product.milestone_url FILTER html %]">
[% product.milestone_url FILTER html %]
</a>
</td>
[% END %]
</tr>
<tr>
<TD VALIGN="top">Открыт для регистрации [% terms.bugs_gen %]:</TD>
<TD VALIGN="top">[% IF product.is_active && comp.isactive %]Да[% ELSE %]Нет[% END %]</td>
</tr>
<tr>
<td valign="top">[% terms.Bugs_gen %]:</td>
<td valign="top">
[% IF comp.bug_count %]
<a title="Список [% terms.bugs_gen %] компонента '[% comp.name FILTER html %]'"
href="buglist.cgi?component=[% comp.name FILTER uri %]&amp;product=
[%- product.name FILTER uri %]">[% comp.bug_count %]</a>
[% ELSE %]
Не зарегистрировано
[% END %]
</td>
</tr>
</table>
<h2>Подтверждение</h2>
[% IF comp.bug_count %]
[% IF !Param("allowbugdeletion") %]
<p class="confirmation">
Для компонента
[% numeral(comp.bug_count,
"зарегистрирована ${comp.bug_count} ${terms.bug}",
"зарегистрировано ${comp.bug_count} ${terms.bug_gen}",
"зарегистрировано ${comp.bug_count} ${terms.bugs_gen}")
FILTER html %].
Без переноса их в другие компоненты удаление невозможно.
</p>
[% ELSE %]
<table border="0" cellpadding="20" width="70%" bgcolor="red"><tr><td>
Для компонента
[% numeral(comp.bug_count,
"зарегистрирована ${comp.bug_count} ${terms.bug}",
"зарегистрировано ${comp.bug_count} ${terms.bugs}",
"зарегистрировано ${comp.bug_count} ${terms.bugs_gen}")
FILTER html %]! Удаление
компонента приведет к удалению <b>ВСЕХ</b> его
[% terms.bugs_gen %] и переписки по ним.
</td></tr></table>
[% END %]
[% END %]
[% IF comp.bug_count == 0 || Param('allowbugdeletion') %]
<p>Удалить компонент?</p>
<form method="post" action="editcomponents.cgi">
<input type="submit" id="delete" value="Да, удалить">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="component" value="[% comp.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% END %]
[% PROCESS admin/components/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% title = BLOCK %]Создание компонента продукта '[% product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
yui = [ 'autocomplete' ]
javascript_urls = [ "js/field.js" ]
title = title
%]
<form method="post" action="editcomponents.cgi">
<table border="0" cellpadding="4" cellspacing="0">
[% PROCESS "admin/components/edit-common.html.tmpl" %]
</table>
<hr>
<input type="submit" id="create" value="Создать">
<input type="hidden" name="action" value="new">
<input type="hidden" name='product' value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/components/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# comp: object; Bugzilla::Component object.
#%]
[%# When called from the "New Product" page, the component description field
# must have a name different from the product description field. %]
[% DEFAULT desc_name = "description" %]
<tr>
<th class="field_label"><label for="component">Компонент:</label></th>
<td><input size="64" maxlength="64" name="component" id="component"
value="[%- comp.name FILTER html %]"></td>
</tr>
<tr>
<th class="field_label"><label for="[% desc_name FILTER html %]">Описание:</label></th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = desc_name
id = desc_name
minrows = 4
cols = 64
wrap = 'virtual'
defaultcontent = comp.description
%]
</td>
</tr>
<tr>
<th class="field_label"><label for="initialowner">Ответственный исполнитель:</label></th>
<td>
[% INCLUDE global/userselect.html.tmpl
name => "initialowner"
id => "initialowner"
value => comp.default_assignee.login
size => 64
%]
</td>
</tr>
[% IF Param('useqacontact') %]
<tr>
<th class="field_label"><label for="initialqacontact">Ответственный за приемку:</label></th>
<td>
[% INCLUDE global/userselect.html.tmpl
name => "initialqacontact"
id => "initialqacontact"
value => comp.default_qa_contact.login
size => 64
emptyok => 1
%]
</td>
</tr>
[% END %]
<tr>
<th class="field_label"><label for="initialcc">Подписать пользователей:</label></th>
<td>
[% INCLUDE global/userselect.html.tmpl
name => "initialcc"
id => "initialcc"
value => initial_cc_names
size => 64
multiple => 5
%]
<br>
[% IF !Param("usemenuforusers") %]
<em>Введите имена пользователей через запятую.</em>
[% END %]
</td>
</tr>
[% Hook.process('rows') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# comp: object; Bugzilla::Component object representing the component the
# user wants to edit.
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Изменение компонента '[% comp.name FILTER html %]' продукта '[% product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
yui = [ 'autocomplete' ]
javascript_urls = [ "js/field.js" ]
%]
<form method="post" action="editcomponents.cgi">
<table border="0" cellpadding="4" cellspacing="0">
[% PROCESS "admin/components/edit-common.html.tmpl" %]
<tr>
<th class="field_label"><label for="isactive">Доступен для [% terms.Bugs_gen %]:</label></th>
<td><input id="isactive" name="isactive" type="checkbox" value="1"
[% 'checked="checked"' IF comp.isactive %]></td>
</tr>
<tr>
<th class="field_label">[% terms.Bugs %]:</th>
<td>
[% IF comp.bug_count > 0 %]
<a title="[% terms.Bugs %] компонента '[% comp.name FILTER html %]'"
href="buglist.cgi?component=
[%- comp.name FILTER uri %]&amp;product=
[%- product.name FILTER uri %]">[% comp.bug_count %]</a>
[% ELSE %]
Нет
[% END %]
</td>
</tr>
</table>
<input type="hidden" name="action" value="update">
<input type="hidden" name="componentold" value="[% comp.name FILTER html %]">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" value="Сохранить изменения" id="update"> или <a
href="editcomponents.cgi?action=del&amp;product=
[%- product.name FILTER uri %]&amp;component=
[%- comp.name FILTER uri %]">удалить</a> компонент.
</form>
[% PROCESS admin/components/footer.html.tmpl
no_edit_component_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# comp: object; Bugzilla::Component object representing the component
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
<hr>
<p>
Изменить
[% IF comp && !no_edit_component_link %]
компонент <a
title="Изменить компонент '[% comp.name FILTER html %]'"
href="editcomponents.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;component=[% comp.name FILTER uri %]">
'[% comp.name FILTER html %]'</a>
или
[% END %]
[% IF !no_edit_other_components_link %]
другие компоненты продукта <a
title="Выберите компонент продукта '[% product.name FILTER html %]' to edit"
href="editcomponents.cgi?product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>,
или
[% END %]
продукт <a
title="Изменить продукт '[% product.name FILTER html %]'"
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
</p>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# showbugcounts: if defined, then bug counts should be included in the table
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Выберите компонент продукта
'[% product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% edit_contentlink = BLOCK %]editcomponents.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;component=%%name%%[% END %]
[% delete_contentlink = BLOCK %]editcomponents.cgi?action=del&amp;product=
[%- product.name FILTER uri %]&amp;component=%%name%%[% END %]
[% bug_count_contentlink = BLOCK %]buglist.cgi?component=%%name%%&amp;product=
[%- product.name FILTER uri %][% END %]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => edit_contentlink
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
},
{
name => "initialowner"
heading => "Ответственный исполнитель"
},
]
%]
[% IF Param('useqacontact') %]
[% columns.push({
name => 'initialqacontact'
heading => 'Ответственный за приемку'
}) %]
[% END %]
[% columns.push({
name => "initial_cc_names"
heading => "Список подписанных пользователей"
},
{
name => "isactive"
heading => "Активен"
yesno_field => 1
}) %]
[% IF showbugcounts %]
[% columns.push({
name => 'bug_count'
heading => "$terms.Bugs_gen"
align => "right"
contentlink => bug_count_contentlink
}) %]
[% END %]
[% columns.push({
heading => "Действие"
content => "Удалить"
contentlink => delete_contentlink
}) %]
[%# Overrides the initialowner, the initialqacontact, and the initial_cc_names with right values %]
[% overrides.initialowner = {} %]
[% overrides.initialqacontact = {} %]
[% overrides.initial_cc_names = {} %]
[%# "component" is a reserved word in Template Toolkit. %]
[% FOREACH my_component = product.components %]
[% overrides.initialowner.name.${my_component.name} = {
override_content => 1
content => my_component.default_assignee.login
}
%]
[% overrides.initialqacontact.name.${my_component.name} = {
override_content => 1
content => my_component.default_qa_contact.login
}
%]
[% SET initial_cc_list = [] %]
[% FOREACH cc_user = my_component.initial_cc %]
[% initial_cc_list.push(cc_user.login) %]
[% END %]
[% overrides.initial_cc_names.name.${my_component.name} = {
override_content => 1
content => initial_cc_list.join(', ')
}
%]
[% END %]
[% Hook.process('before_table') %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = product.components
overrides = overrides
%]
<p><a href="editcomponents.cgi?action=add&amp;product=[% product.name FILTER uri %]">Создать</a>
новый компонент продукта '[% product.name FILTER html %]'</p>
[% IF ! showbugcounts %]
<p><a href="editcomponents.cgi?product=[% product.name FILTER uri %]&amp;showbugcounts=1">
Обновить счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS admin/components/footer.html.tmpl
no_edit_other_components_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# products: array of product objects
# showbugcounts: if defined, then bug counts should be included in the table
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите продукт"
%]
[% columns = [
{
name => "name"
heading => "Изменить компоненты..."
contentlink => "editcomponents.cgi?product=%%name%%"
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
}
]
%]
[% IF showbugcounts %]
[% columns.push({
name => 'bug_count'
heading => "$terms.Bugs_gen"
align => "right"
contentlink => "buglist.cgi?product=%%name%%"
})
%]
[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = products
%]
[% IF !showbugcounts %]
<p><a href="editcomponents.cgi?showbugcounts=1">
Обновить счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# abuser: identity of the user who created the (invalid?) token.
# token_action: the action the token was supposed to serve.
# expected_action: the action the user was going to do.
# script_name: the script generating this warning.
# alternate_script: the suggested script to redirect the user to
# if he declines submission.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS global/header.html.tmpl title = "Подозрительные действия"
style_urls = ['skins/standard/global.css'] %]
[% IF abuser %]
<div class="throw_error">
<p>При использовании административного интерфейса [% terms.Bugzilla %] генерируется
случайный идентификатор, который хранится в экранной форме и базе данных.
Он используется для контроля того, что запрашиваемые изменения подготовлены при
помощи штатных форм [% terms.Bugzilla %]. В данный момент идентификатор некорректен,
это означает что форма данных заполнена на неверной странице.
Используемый идентификатор:</p>
<table border="0" cellpadding="5" cellspacing="0">
[% IF token_action != expected_action %]
<tr>
<th>Запрошенное&nbsp;действие:</th>
<td>[% token_action FILTER html %]</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
Это действие не совпадает с ожидаемым ([% expected_action FILTER html %]).
</td>
</tr>
[% END %]
[% IF abuser != user.identity %]
<tr>
<th>Создан&nbsp;пользователем:</th>
<td>[% abuser FILTER html %]</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
Идентификатор создан не Вами. Это может указывать на попытку несанкционированного
доступа от Вашего имени!
</td>
</tr>
[% END %]
</table>
<p>Обратитесь к администратору: [%+ Param("maintainer") FILTER html %].</p>
</div>
[% ELSE %]
<div class="throw_error">
Изменение запрошено без использования штатных форм (отсутствует контрольный
идентификатор действия <em>[% expected_action FILTER html %]</em> при вызове
скрипта '[% script_name FILTER html%]' ). Возможные причины:<br>
<ul>
<li>После успешных изменений нажата кнопка "Назад", как правило это
нехорошая идея, но безобидная.</li>
<li>Адрес страницы введен непосредственно в строке,
это также должно быть безопасно.</li>
<li>Вы выбрали ссылку, которая <b>неожиданно для Вас</b> направила сюда,
в этом случае действие может являться опасным.</li>
</ul>
Подтвердите сохранение предлагаемых изменений. Помните, это может привести
к неожиданным и нежелательным результатам.
</div>
<form name="check" id="check" method="post" action="[% script_name FILTER html %]">
[% PROCESS "global/hidden-fields.html.tmpl"
exclude="^(Bugzilla_login|Bugzilla_password)$" %]
<input type="submit" id="confirm" value="Подтвердить изменения">
</form>
<p>или отказаться от изменений и перейти обратно к <a href="[% alternate_script FILTER html %]">
[%- alternate_script FILTER html %]</a>.</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# field: object; the field object that you are trying to delete.
# token: string; the delete_field token required to complete deletion.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]
Удаление настраиваемого атрибута '[% field.name FILTER html %]' ([% field.description FILTER html %])
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
doc_section = "custom-fields.html#delete-custom-fields"
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">Настраиваемый атрибут:</td>
<td valign="top">[% field.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">Описание:</td>
<td valign="top">[% field.description FILTER html %]</td>
</tr>
<tr>
<td valign="top">Тип:</td>
<td valign="top">[% field_types.${field.type} FILTER html %]</td>
</tr>
</table>
<h2>Подтверждение</h2>
<p class="confirmation">
Подтвердите удаление настраиваемого атрибута из базы данных.<br>
<em>Удаление возможно только для неактивного атрибута, который
никогда не использовался при регистрации [% terms.bugs_gen FILTER html %].</em>
</p>
<a href="editfields.cgi?action=delete&amp;name=[% field.name FILTER html %]&amp;token=[% token FILTER html %]">
Удалить атрибут '[% field.description FILTER html %]'</a>
<p>
<a href="editfields.cgi">Вернуться к списку атрибутов</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# none
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% javascript = BLOCK %]
[% INCLUDE "admin/custom_fields/cf-js.js.tmpl" %]
[% END %]
[% PROCESS global/header.html.tmpl
title = "Создание атрибута"
onload = "document.getElementById('new_bugmail').disabled = true;"
javascript_urls = [ 'js/util.js' ]
doc_section = "custom-fields.html#add-custom-fields"
style_urls = ['skins/standard/admin.css']
%]
[%# set initial editability of fields such as Reverse Relationship Description %]
<script type="text/javascript">
YAHOO.util.Event.onDOMReady(function() {onChangeType(document.getElementById('type'))});
</script>
<p>
Добавление новых атрибутов может сделать интерфейс [% terms.Bugzilla %]
очень сложным. Многие неопытные администраторы начинают с настройки
большого количества атрибутов и впоследствии получают от пользователей
жалобы о сложности регистрации [% terms.bugs %]. Рекомендуется
хорошо обдумать создание каждого дополнительного поля. Может оказаться,
что требуемый функционал уже реализован в [% terms.Bugzilla %] и
надо лишь включить нужный параметр настройки.
</p>
<ul>
<li>Имена пользовательских атрибутов должны начинаться с "cf_", чтобы не
допустить совпадения с именами стандартных полей. Если не указать, "cf_"
будет автоматически добавлено в начало имени.</li>
<li>Описание — короткий текст, объясняющий смысл атрибута, и используемый
в качестве обозначения атрибута в элементах интерфейса.</li>
</ul>
<form id="add_field" action="editfields.cgi" method="GET">
<table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field">
<tr>
<th class="narrow_label"><label for="name">Имя:</label></th>
<td>
<input type="text" id="name" name="name" value="cf_" size="40" maxlength="64">
</td>
<th>
<label for="enter_bug">Может быть установлен при регистрации [% terms.bug_gen %]:</label>
</th>
<td>
<input type="checkbox" id="enter_bug" name="enter_bug" value="1"
onchange="toggleCheckbox(this, 'new_bugmail');">
</td>
</tr>
<tr>
<th class="narrow_label"><label for="desc">Описание:</label></th>
<td><input type="text" id="desc" name="desc" value="" size="40"></td>
[%# FIXME-ru: show localized value here %]
<th>
<label for="new_bugmail">Включать в почтовые оповещения для новых [% terms.bugs_gen %]:</label>
</th>
<td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1"></td>
</tr>
<tr>
<th class="narrow_label"><label for="type">Тип:</label></th>
<td>
<select id="type" name="type" onchange="onChangeType(this)">
[% FOREACH type = field_types.keys %]
[% NEXT IF type == constants.FIELD_TYPE_UNKNOWN %]
<option value="[% type FILTER html %]">[% field_types.$type FILTER html %]</option>
[% END %]
</select>
</td>
<th><label for="obsolete">Неактивен:</label></th>
<td><input type="checkbox" id="obsolete" name="obsolete" value="1"></td>
</tr>
<tr>
<th class="narrow_label"><label for="sortkey">Порядок сортировки:</label></th>
<td>
<input type="text" id="sortkey" name="sortkey" size="6" maxlength="6">
</td>
<th align="right"><label for="is_mandatory">Обязателен:</label></th>
<td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1"></td>
</tr>
<tr>
<th class="narrow_label">Длинное описание:</th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'long_desc'
id = 'long_desc'
minrows = 3
maxrows = 5
cols = 46
defaultcontent = defaultcontent
%]
</td>
<th>
<label for="visibility_field_id">Условия отображения:</label>
</th>
<td>
<select name="visibility_field_id" id="visibility_field_id"
onchange="onChangeVisibilityField()">
<option></option>
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
<option value="[% sel_field.id FILTER html %]">
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
</option>
[% END %]
</select>
<label for="visibility_values">
<strong>принимает любое из значений:</strong>
</label>
<select multiple="multiple" size="5" name="visibility_values"
id="visibility_values" class="field_value">
<option value=""></option>
</select>
</td>
</tr>
<tr>
<th class="narrow_label">
<label for="reverse_desc">Описание обратного отношения:</label>
</th>
<td>
<input type="text" id="reverse_desc" name="reverse_desc" value="" size="40" disabled="disabled">
<br/>
Используйте эту метку для списка [% terms.bugs_gen %], который ссылается на
[%+ terms.abug %] с этим полем
[%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %].
Например, если описанием является "Дубликат", то
обратным описанием будет "Дубликаты этой [% terms.bugs %]".
Для отключения списка для этого поля оставьте его пустым.
</td>
<th>
<label for="value_field_id">
Атрибут, от которого зависит <br>
отображение значений этого атрибута:
</label>
</th>
<td>
<select disabled="disabled" name="value_field_id" id="value_field_id">
<option></option>
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
<option value="[% sel_field.id FILTER html %]">
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
</option>
[% END %]
</select>
</td>
</tr>
</table>
<p>
<input type="hidden" name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="create" value="Создать">
</p>
</form>
<p>
<a href="editfields.cgi">Вернуться к списку атрибутов</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# field: Bugzila::Field; the current field being edited
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]
Изменение атрибута '[% field.name FILTER html %]' ([% field_descs.${field.name} FILTER html %])
[% END %]
[% javascript = BLOCK %]
[% INCLUDE "admin/custom_fields/cf-js.js.tmpl" %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
onload = "toggleCheckbox(document.getElementById('enter_bug'), 'new_bugmail');"
javascript_urls = [ 'js/util.js' ]
doc_section = "custom-fields.html#edit-custom-fields"
style_urls = ['skins/standard/admin.css']
%]
<p>
Описание — короткий текст, объясняющий смысл атрибута, и используемый
в качестве обозначения атрибута в элементах интерфейса.
</p>
<form id="edit_field" action="editfields.cgi" method="GET">
<table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field">
<tr>
<th class="narrow_label">Имя:</th>
<td>[% field.name FILTER html %]</td>
<th>
<label for="enter_bug">Может быть установлен при регистрации [% terms.bug_gen %]:</label>
</th>
<td><input type="checkbox" id="enter_bug" name="enter_bug" value="1"
[%- " checked" IF field.enter_bug %]
onchange="toggleCheckbox(this, 'new_bugmail');"></td>
</tr>
<tr>
<th class="narrow_label"><label for="desc">Описание:</label></th>
<td><input type="text" id="desc" name="desc" size="40"
value="[% field.description FILTER html %]"></td>
[%# FIXME-ru: show localized value here %]
<th>
<label for="new_bugmail">Включать в почтовые оповещения для новых [% terms.bugs_gen %]:</label>
</th>
<td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1"
[%- " checked" IF field.mailhead %]></td>
</tr>
<tr>
<th class="narrow_label">Тип:</th>
<td>[% field_types.${field.type} FILTER html %]</td>
<th><label for="obsolete">Неактивен:</label></th>
<td><input type="checkbox" id="obsolete" name="obsolete" value="1"
[%- " checked" IF field.obsolete %]></td>
</tr>
<tr>
<th class="narrow_label"><label for="sortkey">Порядок сортировки:</label></th>
<td>
<input type="text" id="sortkey" name="sortkey" size="6" maxlength="6"
value="[% field.sortkey FILTER html %]">
</td>
<th align="right"><label for="is_mandatory">Обязателен:</label></th>
<td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1"
[%- ' checked="checked"' IF field.is_mandatory %]></td>
</tr>
<tr>
<th class="narrow_label">Длинное описание:</th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'long_desc'
id = 'long_desc'
minrows = 3
maxrows = 5
cols = 46
defaultcontent = field.long_desc
%]
</td>
<th>
<label for="visibility_field_id">Условия отображения:</label>
</th>
<td>
<select name="visibility_field_id" id="visibility_field_id"
onchange="onChangeVisibilityField()">
<option></option>
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
[% NEXT IF sel_field.id == field.id %]
<option value="[% sel_field.id FILTER html %]"
[% ' selected="selected"'
IF sel_field.id == field.visibility_field.id %]>
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
</option>
[% END %]
</select>
<label for="visibility_values">
<strong>принимает любое из значений:</strong>
</label>
<select multiple="multiple" size="5" name="visibility_values"
id="visibility_values" class="field_value">
[% FOREACH value = field.visibility_field.legal_values %]
<option value="[% value.id FILTER html %]"
[% " selected" IF field.visibility_values.contains(value) %]>
[% IF field.visibility_field.name == 'component' %]
[% display_value('product', value.product.name) FILTER html %]:
[% END %]
[%+ display_value(field.visibility_field.name, value.name) FILTER html %]
</option>
[% END %]
</select>
</td>
</tr>
[% IF field.type == constants.FIELD_TYPE_BUG_ID %]
<tr>
<th class="narrow_label">
<label for="reverse_desc">Описание обратного отношения:</label>
</th>
<td>
<input type="text" id="reverse_desc" name="reverse_desc" size="40"
value="[% field.reverse_desc FILTER html %]">
<br/>
Используйте эту метку для списка [% terms.bugs_gen %], который ссылается на
[%+ terms.abug %] с этим полем
[%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %].
Например, если описанием является "Дубликат", то
обратным описанием будет "Дубликаты этой [% terms.bugs %]".
Для отключения списка для этого поля оставьте его пустым.
</td>
<td colspan="2">&nbsp;</td>
</tr>
[% END %]
[% IF field.is_select %]
<tr>
<th>&nbsp;</th>
<td>
<a href="editvalues.cgi?field=[% field.name FILTER uri %]">Допустимые
значения атрибута</a>.
</td>
<th>
<label for="value_field_id">
Атрибут, от которого зависит <br>
отображение значений этого атрибута:
</label>
</th>
<td>
<select name="value_field_id" id="value_field_id">
<option></option>
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
[% NEXT IF sel_field.id == field.id %]
<option value="[% sel_field.id FILTER html %]"
[% ' selected="selected"'
IF sel_field.id == field.value_field.id %]>
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
</option>
[% END %]
</select>
</td>
</tr>
[% END %]
</table>
<br>
<input type="hidden" name="action" value="update">
<input type="hidden" name="name" value="[% field.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="edit" value="Сохранить">
</form>
[% IF field.obsolete %]
<p>
<a href="editfields.cgi?action=del&amp;name=[% field.name FILTER html %]">Удалить
атрибут из базы данных.</a><br>
Удаление возможно только в случае если атрибут никогда не использовался
при регистрации [% terms.bugs_gen %].<br>
</p>
[% END %]
<p>
<a href="editfields.cgi">Вернуться к списку атрибутов</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# custom_fields: a list of Bugzilla::Field objects, representing custom fields.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Атрибуты"
doc_section = "custom-fields.html"
%]
[% delete_contentlink = BLOCK %]editfields.cgi?action=del&amp;name=%%name%%[% END %]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => "editfields.cgi?action=edit&amp;name=%%name%%"
},
{
name => "description"
heading => "Описание"
},
{
name => "sortkey"
heading => "Порядок сортировки"
},
{
name => "type"
heading => "Тип"
},
{
name => "enter_bug"
heading => "Установка при создании $terms.bug_gen"
},
{
name => "mailhead"
heading => "Включать в оповещения при создании $terms.bug_gen"
},
{
name => "obsolete"
heading => "Неактивный"
},
{
name => "is_mandatory"
heading => "Обязателен"
},
{
name => "action"
heading => "Действие"
content => ""
}
]
%]
[% USE Bugzilla %]
[% custom_fields = Bugzilla.fields({ custom => 1 }) %]
[%# We want to display the type name of fields, not their type ID. %]
[% overrides.type = {} %]
[% FOREACH field_type = field_types.keys %]
[% overrides.type.type.$field_type = {
override_content => 1
content => field_types.$field_type
}
%]
[% END %]
[% overrides.action.obsolete = {
"1" => {
override_content => 1
content => "Удалить"
override_contentlink => 1
contentlink => delete_contentlink
}
}
%]
[% PROCESS admin/table.html.tmpl
columns = columns
overrides = overrides
data = custom_fields
%]
<p>
<a href="editfields.cgi?action=add">Создать атрибут</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# value: Bugzilla::Field::Choice; The field value being deleted.
# value_count: number; The number of values available for this field.
# field: object; the field the value is being deleted from.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]
Удаление значения '[% value.name FILTER html %]' атрибута
'[% field_descs.${field.name} FILTER html %]' ([% field.name FILTER html %])
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">Атрибут:</td>
<td valign="top">[% field_descs.${field.name} FILTER html %]</td>
</tr>
<tr>
<td valign="top">Значение атрибута:</td>
<td valign="top">[% value.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">[% terms.Bugs_gen %]:</td>
<td valign="top">
[% IF value.bug_count %]
<a title="Список [% terms.bugs_gen %], использующих значение
'[% value.name FILTER html %]'
атрибута '[% field_descs.${field.name} FILTER html %]'"
href="buglist.cgi?[% field.name FILTER uri %]=
[%- value.name FILTER uri %]">
[%- value.bug_count FILTER html %]</a>
[% ELSE %]
Нет
[% END %]
</td>
</tr>
</table>
<h2>Подтверждение</h2>
[% IF value.is_default || value.bug_count || (value_count == 1)
|| value.controls_visibility_of_fields.size
|| value.controlled_values_array.size
%]
<p>Значение '[% value FILTER html %]' атрибута
'[% field_descs.${field.name} FILTER html %]' не может быть удалено:</p>
<ul class="warningmessages">
[% IF value.is_default %]
<li>Значение '[% value.name FILTER html %]' используется по умолчанию
для атрибута '[% field_descs.${field.name} FILTER html %]'.
[% IF user.in_group('tweakparams') %]
Перед удалением следует <a href="editparams.cgi?section=bugfields">изменить
умолчание</a>.
[% END %]
</li>
[% END %]
[% IF value.bug_count %]
<li>
Значение атрибута используется в [% value.bug_count FILTER html %]
[% numeral(value.bug_count,
"${terms.bug_obj}", "${terms.bugs_obj}", "${terms.bugs_obj}")
FILTER html -%].
Перед удалением следует выбрать другое значение атрибута для
<a title="Список [% terms.bugs_gen %], использующих значение '[% value FILTER html %]'
атрибута '[% field_descs.${field.name} FILTER html %]'"
href="buglist.cgi?[% field.name FILTER uri %]=
[%- value.name FILTER uri %]">
этих [%+ terms.bugs_gen %]</a>
</li>
[% END %]
[% IF value_count == 1 %]
<li>Значение '[% value.name FILTER html %]' является единственным допустимым для атрибута
'[%- field_descs.${field.name} FILTER html %]' и не может быть удалено.
</li>
[% END %]
[% IF value.controls_visibility_of_fields.size %]
<li>От этого значения зависит видимость следующих атрибутов:<br>
[% FOREACH field = value.controls_visibility_of_fields %]
<a href="editfields.cgi?action=edit&name=
[%- field.name FILTER uri %]">
[%- field.description FILTER html %]
([% field.name FILTER html %])</a><br>
[% END %]
</li>
[% END %]
[% IF value.controlled_values_array.size %]
<li>От этого значения зависит видимость следующих значений
других атрибутов:<br>
[% FOREACH field_name = value.controlled_values.keys %]
[% FOREACH controlled = value.controlled_values.${field_name} %]
<a href="editvalues.cgi?action=edit&field=
[%- controlled.field.name FILTER uri %]&value=
[%- controlled.name FILTER uri %]">
[% field_descs.${controlled.field.name} FILTER html %]
([% controlled.field.name FILTER html %]):
[%+ controlled.name FILTER html %]</a><br>
[% END %]
[% END %]
</li>
[% END %]
</ul>
[% ELSE %]
<p>Удалить значение?<p>
<form method="post" action="editvalues.cgi">
<input type="submit" value="Да, удалить" id="delete">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="field" value="[% field.name FILTER html %]">
<input type="hidden" name="value" value="[% value.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% END %]
[% PROCESS admin/fieldvalues/footer.html.tmpl
no_edit_link = 1
+%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# field: object; the field the value is being created for
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]
Создание значения атрибута '[% field_descs.${field.name} FILTER html %]' ([% field.name FILTER html %])
[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
<p>
Добавление нового значения для атрибута
'[% field_descs.${field.name} FILTER html %]'.
</p>
<form method="post" action="editvalues.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th align="right"><label for="value">Значение:</label></th>
<td>
<input id="value" name="value" size="30"
maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]">
</td>
</tr>
<tr>
<th align="right"><label for="sortkey">Порядок сортировки:</label></th>
<td><input id="sortkey" name="sortkey" size="6" maxlength="6"></td>
</tr>
[% IF field.name == "bug_status" %]
<tr>
<th align="right"><label for="is_open">Тип состояния:</label></th>
<td>
<input type="radio" id="open_status" name="is_open" value="1"
checked="checked">
<label for="open_status">В работе</label><br>
<input type="radio" id="closed_status" name="is_open" value="0">
<label for="closed_status">Закрыта (требует указания решения)</label>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
Обратите внимание: Тип состояния может быть указан только при создании,
изменение впоследствии запрещено.
</td>
</tr>
[% END %]
[% IF field.value_field %]
<tr>
<th align="right">
<label for="visibility_value_id">Условие отображения: атрибут
'[% field_descs.${field.value_field.name} FILTER html %]' принимает значения
</label>
</th>
<td>
<select name="visibility_value_id" id="visibility_value_id">
<option></option>
[% FOREACH field_value = field.value_field.legal_values %]
[% NEXT IF field_value.name == '' %]
<option value="[% field_value.id FILTER none %]">
[% IF field.value_field.name == 'component' %]
[% field_value.product.name FILTER html %]:
[% END %]
[%- field_value.name FILTER html -%]
</option>
[% END %]
</select>
<small>(Чтобы значение отображалось непрерывно, оставьте без выбора.)</small>
</td>
</tr>
[% END %]
</table>
<input type="submit" id="create" value="Создать">
<input type="hidden" name="action" value="new">
<input type="hidden" name='field' value="[% field.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/fieldvalues/footer.html.tmpl
no_add_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# value: Bugzilla::Field::Choice; The field value we are editing.
# field: Bugzilla::Field; The field this value belongs to.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]
Изменение значения '[% value.name FILTER html %]' атрибута
'[% field_descs.${field.name} FILTER html %]' ([% field.name FILTER html %])
[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
<form method="post" action="editvalues.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th valign="top" align="right">
<label for="value_new">Значение атрибута:</label>
</th>
<td>
[% IF value.is_static %]
<input type="hidden" name="value_new" id="value_new"
value="[% value.name FILTER html %]">
[%- value.name FILTER html %]
[% ELSE %]
<input id="value_new" name="value_new" size="20"
maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]"
value="[% value.name FILTER html %]">
[% END %]
</td>
</tr>
<tr>
<th align="right"><label for="sortkey">Порядок сортировки:</label></th>
<td><input id="sortkey" size="6" maxlength="6" name="sortkey"
value="[%- value.sortkey FILTER html %]"></td>
</tr>
[% IF field.name == "bug_status" %]
<tr>
<th align="right"><label for="is_open">Тип состояния:</label></th>
<td>[% IF value.is_open %]В работе[% ELSE %]Закрыта[% END %]</td>
</tr>
[% END %]
[% IF field.value_field %]
<tr>
<th align="right">
<label for="visibility_value_id">Условие отображения: атрибут
'[% field_descs.${field.value_field.name} FILTER html %]' принимает значения
</label>
</th>
<td>
<select name="visibility_value_id" id="visibility_value_id">
<option></option>
[% FOREACH field_value = field.value_field.legal_values %]
[% NEXT IF field_value.name == '' %]
<option value="[% field_value.id FILTER none %]"
[% ' selected="selected"'
IF field_value.id == value.visibility_value.id %]>
[% IF field.value_field.name == 'component' %]
[% field_value.product.name FILTER html %]:
[% END %]
[% field_value.name FILTER html -%]
</option>
[% END %]
</select>
<small>(Чтобы значение отображалось непрерывно, оставьте без выбора.)</small>
</td>
</tr>
[% END %]
<tr>
<th align="right"><label for="is_active">Разрешено для использования:</label></th>
<td><input id="is_active" name="is_active" type="checkbox" value="1"
[%+ 'checked="checked"' IF value.is_active %]
[%+ 'disabled="disabled"' IF value.is_default OR value.is_static %]>
[% IF value.is_default %]
Значение задано в качестве умолчания в параметрах данного атрибута и не может быть заблокировано.
[% ELSIF value.is_static %]
Значение не может быть удалено или заблокировано.
[% END %]
[% IF !(value.is_default OR value.is_static) %]
<input id="defined_is_active" name="defined_is_active"
type="hidden" value="1">
[% END %]
</td>
</tr>
</table>
<input type="hidden" name="value" value="[% value.name FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="field" value="[% field.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update" value="Сохранить">
</form>
[% PROCESS admin/fieldvalues/footer.html.tmpl
no_edit_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# value: string; the value being inserted/edited.
# field: object; the field which the value belongs/belonged to.
#
# no_XXX_link: boolean; if defined, then don't show the corresponding
# link. Supported parameters are:
#
# no_edit_link
# no_edit_other_link
# no_add_link
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
<hr>
<p>
[% UNLESS no_add_link %]
<a title="Создать значение атрибута '[% field_descs.${field.description} FILTER html %]'."
href="editvalues.cgi?action=add&amp;field=
[%- field.name FILTER uri %]">Создать</a> новое значение.
[% END %]
[% IF value.defined && !no_edit_link %]
Изменить значение <a
title="Изменить значение '[% value.name FILTER html %]' атрибута '
[%- field_descs.${field.name} FILTER html %]'"
href="editvalues.cgi?action=edit&amp;field=
[%- field.name FILTER uri %]&amp;value=
[%- value.name FILTER uri %]">
'[% value.name FILTER html %]'</a>.
[% END %]
[% UNLESS no_edit_other_link %]
Изменить другие значения атрибута <a
href="editvalues.cgi?field=
[%- field.name FILTER uri %]">'[% field_descs.${field.name} FILTER html %]'</a>.
[% END %]
</p>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# values: array of hashes having the following properties:
# - name: string; The value.
# - sortkey: number; The sortkey used to order the value when
# displayed to the user in a list.
#
# field: object; the field we are editing values for.
# static: array; list of values which cannot be renamed nor deleted.
#%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]Выберите значение атрибута '[% field_descs.${field.name} FILTER html %]'
([% field.name FILTER html %])[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% edit_contentlink = BLOCK %]editvalues.cgi?action=edit&amp;field=
[%- field.name FILTER uri %]&amp;value=%%name%%[% END %]
[% delete_contentlink = BLOCK %]editvalues.cgi?action=del&amp;field=
[%- field.name FILTER uri %]&amp;value=%%name%%[% END %]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => edit_contentlink
},
{
name => "sortkey"
heading => "Порядок сортировки"
},
{
name => "isactive"
heading => "Разрешено"
yesno_field => 1
},
{
name => "action"
heading => "Действие"
content => "Удалить"
contentlink => delete_contentlink
} ]
%]
[% SET overrides.action = {} %]
[% FOREACH check_value = values %]
[% IF check_value.is_static %]
[% overrides.action.name.${check_value.name} = {
override_content => 1
content => "(Удаление запрещено)"
override_contentlink => 1
contentlink => undef
}
%]
[% ELSIF check_value.is_default %]
[% overrides.action.name.${check_value.name} = {
override_content => 1
content => "(по умолчанию)"
override_contentlink => 1
contentlink => undef
}
%]
[% END %]
[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = values
overrides = overrides
%]
[% PROCESS admin/fieldvalues/footer.html.tmpl
no_edit_other_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# fields: Array of hashes. Each hash contains only one key, "name."
# The names are the same as the keys from field_descs
# (see global/field-descs.html.tmpl).
#%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите атрибут"
%]
[% columns = [
{
name => "name"
heading => "Изменить значения атрибута..."
content_use_field = 1
contentlink => "editvalues.cgi?field=%%name%%"
}
]
%]
[% PROCESS admin/table.html.tmpl
columns = columns
data = fields
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Подтвердите удаление вида согласования '[% flag_type.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
doc_section = "flags-overview.html#flags-delete"
%]
<p>
[% IF flag_type.flag_count %]
Найдено
[%+ numeral(flag_type.flag_count,
"${flag_type.flag_count} согласование",
"${flag_type.flag_count} согласования",
"${flag_type.flag_count} согласований")
FILTER html %]
вида [% flag_type.name FILTER html %].
Если вы удалите этот вид, соответствующие запросы тоже будут удалены.
[% END %]
Вместо удаления вида вы можете
<a href="editflagtypes.cgi?action=deactivate&amp;id=[% flag_type.id %]&amp;token=
[%- token FILTER html %]">запретить его</a>.
В этом случае согласования этого типа останутся в базе данных, но не будут
отображаться на экране.
</p>
<table>
<tr>
<td colspan="2">
Вы в самом деле хотите удалить этот вид согласования?
</td>
</tr>
<tr>
<td>
<a href="editflagtypes.cgi?action=delete&amp;id=[% flag_type.id %]&amp;token=
[%- token FILTER html %]">Да, удалить
</a>
</td>
<td align="right">
<a href="editflagtypes.cgi">
Нет, не удалять
</a>
</td>
</tr>
</table>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/js-products.html.tmpl" %]
[% IF action == "insert" %]
[% title = BLOCK %]
Создать вид согласования для [% type.target_type == "bug" ? terms.Bugs_gen : "Приложений" %]
[% IF type.id %]
На основе [% type.name FILTER html %]
[% END %]
[% END %]
[% doc_section = "flags-overview.html#flags-create" %]
[% ELSE %]
[% title = BLOCK %]Изменение вида согласования [% type.name FILTER html %][% END %]
[% doc_section = "flags-overview.html#flags-edit" %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style = "
table#form th { text-align: right; vertical-align: baseline; white-space: nowrap; }
table#form td { text-align: left; vertical-align: baseline; }
"
onload="var f = document.forms['flagtype_properties'];
selectProduct(f.product, f.component, null, null, '__Все__');"
javascript_urls=["js/productform.js"]
doc_section = doc_section
%]
<form id="flagtype_properties" method="post" action="editflagtypes.cgi">
<input type="hidden" name="action" value="[% action FILTER html %]">
<input type="hidden" name="can_fully_edit" value="[% can_fully_edit FILTER html %]">
<input type="hidden" name="id" value="[% type.id FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="hidden" name="target_type" value="[% type.target_type FILTER html %]">
<input type="hidden" name="check_clusions" value="[% check_clusions FILTER none %]">
[% FOREACH category = inclusions.values %]
<input type="hidden" name="inclusions" value="[% category FILTER html %]">
[% END %]
[% FOREACH category = exclusions.values %]
<input type="hidden" name="exclusions" value="[% category FILTER html %]">
[% END %]
[%# Add a hidden button at the top of the form so that the user pressing "return"
# really submit the form, as expected. %]
<input type="submit" id="commit" value="Отправить" style="display: none;">
<table id="form" cellspacing="0" cellpadding="4" border="0">
<tr>
<th>Название:</th>
<td>
краткое название, описывающее тему согласования.<br>
<input type="text" name="name" value="[% type.name FILTER html %]" size="50"
maxlength="50" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
</td>
</tr>
<tr>
<th>Описание:</th>
<td>
подробное описание согласования.<br>
[% INCLUDE global/textarea.html.tmpl
name = 'description'
minrows = 4
cols = 80
defaultcontent = type.description
disabled = !can_fully_edit
%]
</td>
</tr>
<tr>
<th>Категория:</th>
<td>
продукты/компоненты, к которым должны принадлежать (включение) или
не принадлежать (исключение) [% type.target_type == "bug" ? terms.bugs_acc : "приложения" %],
чтобы пользователи могли использовать согласования этого вида.
[% UNLESS can_fully_edit %]
<p class="warning">Этот тип согласования также применяется к некоторым продуктам, которые
вам не разрешено изменять (и которые поэтому не отображаются в расположенных ниже списках).
Ваши ограниченные права означают, что вы можете только добавлять или удалять этот тип
согласования из продуктов или в продукты, которые вы можете изменять, но вы не можете
изменять другие свойства этого типа согласования.</p>
[% END %]
<table>
<tr>
<td style="vertical-align: top;">
<b>Продукт/Компонент:</b><br>
<select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Все__');">
<option value="">__Все__</option>
[% FOREACH prod = products %]
<option value="[% prod.name FILTER html %]">[% prod.name FILTER html %]</option>
[% END %]
</select><br>
<select name="component">
<option value="">__Все__</option>
[% FOREACH comp = components %]
<option value="[% comp FILTER html %]">[% comp FILTER html %]</option>
[% END %]
</select><br>
<input type="submit" id="categoryAction-include"
name="categoryAction-include" value="Включить">
<input type="submit" id="categoryAction-exclude"
name="categoryAction-exclude" value="Исключить">
</td>
<td style="vertical-align: top;">
<b>Включая:</b><br>
[% PROCESS category_select name="inclusion_to_remove" categories = inclusions %]<br>
<input type="submit" id="categoryAction-removeInclusion"
name="categoryAction-removeInclusion" value="Удалить включение">
</td>
<td style="vertical-align: top;">
<b>Исключая:</b><br>
[% PROCESS category_select name="exclusion_to_remove" categories = exclusions %]<br>
<input type="submit" id="categoryAction-removeExclusion"
name="categoryAction-removeExclusion" value="Удалить исключение">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<th>Порядок сортировки:</th>
<td>
число в интервале между 1 и [% constants.MAX_SMALLINT FILTER none %] для управления
порядком отображения согласований; по умолчанию они отображаются в алфавитном порядке.<br>
<input type="text" name="sortkey" value="[% type.sortkey || 1 FILTER html %]" size="5"
maxlength="5" [% ' disabled="disabled"' UNLESS can_fully_edit %]>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="is_active" name="is_active"
[%- ' disabled="disabled"' UNLESS can_fully_edit %]
[% " checked" IF type.is_active || !type.is_active.defined %]>
<label for="is_active">разрешить (согласования видны пользователю и могут быть изменены)</label>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="is_requestable" name="is_requestable"
[%- ' disabled="disabled"' UNLESS can_fully_edit %]
[% " checked" IF type.is_requestable || !type.is_requestable.defined %]>
<label for="is_requestable">разрешить запрашивать потребность в согласовании</label>
</td>
</tr>
<tr>
<th>Список подписчиков:</th>
<td>
список пользователей, которые должны получать оповещения, когда
кто-либо запрашивает согласование этого вида. Адреса разделяются
запятыми и не обязательно соответствуют пользователям [% terms.Bugzilla %].
[% IF Param('emailsuffix') %]
Обратите внимание на то, что параметр 'emailsuffix'
<kbd>[% Param('emailsuffix') %]</kbd> здесь <em>не используется</em>.
Адреса следует указать полностью.
[% END %]<br>
<input type="text" name="cc_list" value="[% type.cc_list FILTER html %]" size="80"
maxlength="200" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="is_requesteeble" name="is_requesteeble"
[%- ' disabled="disabled"' UNLESS can_fully_edit %]
[% " checked" IF type.is_requesteeble || !type.is_requesteeble.defined %]>
<label for="is_requesteeble">разрешить запрашивать согласование конкретным пользователем
(в отличие от запроса "кому-нибудь")</label>
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input type="checkbox" id="is_multiplicable" name="is_multiplicable"
[%- ' disabled="disabled"' UNLESS can_fully_edit %]
[% " checked" IF type.is_multiplicable || !type.is_multiplicable.defined %]>
<label for="is_multiplicable">многократное (допускает несколько согласований этого
вида [% type.target_type == "bug" ? terms.bug : "attachment" %])</label>
</td>
</tr>
<tr>
<th>Ответственные:</th>
<td>
Группа пользователей, имеющих право одобрять и отклонять согласования этого вида
(если поле не заполнено, все пользователи имеют такое право).<br>
[% PROCESS group_select selname = "grant_group" %]
</td>
</tr>
<tr>
<th>Инициаторы:</th>
<td>
Группа пользователей, имеющих право запрашивать согласования
(если поле не заполнено, все пользователи имеют такое право).<br>
Не имеет эффекта если не определена группа ответственных!<br>
[% PROCESS group_select selname = "request_group" %]
</td>
</tr>
<tr>
<th>&nbsp;</th>
<td>
<input type="submit" id="save" value="[% action == "insert" ? "Создать" : "Сохранить" %]">
</td>
</tr>
</table>
</form>
[% PROCESS global/footer.html.tmpl %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK group_select %]
<select name="[% selname %]" id="[% selname %]" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
<option value="">(не определена)</option>
[% group_found = 0 %]
[% FOREACH group = groups %]
<option value="[% group.name FILTER html %]"
[% IF type.${selname} && type.${selname}.name == group.name %]
[% ' selected="selected"' %]
[% group_found = 1 %]
[% END %]>
[%- group.name FILTER html ~%]
</option>
[% END %]
[% IF !group_found && type.${selname}.name %]
<option value="[% type.${selname}.name FILTER html %]" selected="selected">
[%- type.${selname}.name FILTER html ~%]
</option>
[% END %]
</select>
[% END %]
[% BLOCK category_select %]
<select name="[% name FILTER html %]" multiple="multiple" size="7">
[% FOREACH option = categories.keys.sort %]
<option value="[% categories.$option FILTER html %]">
[% option FILTER html %]
</option>
[% END %]
</select>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/js-products.html.tmpl" %]
[% PROCESS global/header.html.tmpl
title = 'Настройка видов согласования'
style = "
table#flag_types_bugs tr th,
table#flag_types_attachments tr th { text-align: left; }
.inactive { color: #787878; }
.multiplicable { display: block; }
"
onload="var f = document.flagtype_form; selectProduct(f.product, f.component, null, null, '__All__');"
javascript_urls=["js/productform.js"]
doc_section = "flags-overview.html#flag-types"
%]
<p>
Согласования — это пометки, определяющие одобрено или отклонено некоторое
состояние для [% terms.bug_gen %] или приложения. Согласования видны
как пометки ("+" для одобренных, "-" для отклоненных, и "?" для запрошенных)
против названия вида.
</p>
<p>
Например, вы можете описать согласование "review" для пользователей, которые
запрашивают инспекцию предлагаемых изменений. Когда автор запросит инспекцию,
приложение будет помечено "review?". Когда рецензент изучит изменения,
пометка изменится на "review+" либо "review-" в зависимости от принятого решения.
</p>
<p>
Можно выбрать виды согласований, допустимые для конкретного продукта
и компонента. Если продукт выбран без указания компонента, отображаются
виды согласований, допустимые хотя бы для одного из компонентов.
</p>
<form id="flagtype_form" name="flagtype_form" action="editflagtypes.cgi" method="get">
<table>
<tr>
<th><label for="product">Продукт:</label></th>
<td>
<select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Все__');">
<option value="">__Все__</option>
[% FOREACH prod = products %]
<option value="[% prod.name FILTER html %]"
[% " selected" IF selected_product == prod.name %]>
[% prod.name FILTER html %]</option>
[% END %]
</select>
</td>
<th><label for="component">Компонент:</label></th>
<td>
<select name="component">
<option value="">__Все__</option>
[% FOREACH comp = components %]
<option value="[% comp FILTER html %]"
[% " selected" IF selected_component == comp %]>
[% comp FILTER html %]</option>
[% END %]
</select>
</td>
<td>
<input type="checkbox" id="show_flag_counts" name="show_flag_counts" value="1"
[%+ 'checked="checked"' IF show_flag_counts %]>
<label for="show_flag_counts">Показать статистику согласований</label>
</td>
<td><input type="submit" id="submit" value="Выбрать"></td>
</tr>
</table>
</form>
<h3>Виды согласований для [% terms.bugs_gen %]</h3>
[% PROCESS display_flag_types types=bug_types types_id='bugs' %]
<p>
<a href="editflagtypes.cgi?action=enter&amp;target_type=bug">Создать вид согласования для [% terms.bugs_gen %]</a>
</p>
<h3>Виды согласований для приложений</h3>
[% PROCESS display_flag_types types=attachment_types types_id='attachments' %]
<p>
<a href="editflagtypes.cgi?action=enter&amp;target_type=attachment">Создать вид согласования для приложений</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[% BLOCK display_flag_types %]
<table id="flag_types_[% types_id FILTER html %]" cellspacing="0" cellpadding="4" border="1">
<tr>
<th>Изменить имя ...</th>
<th>Описание</th>
<th>Порядок сортировки</th>
<th>Параметры</th>
<th>Ответственные</th>
<th>Инициаторы</th>
[% IF show_flag_counts %]
<th>Статистика</th>
[%# Note to translators: translate the strings in quotes only. %]
[% state_desc = {granted = 'одобрено' denied = 'отклонено' pending = 'в процессе'} %]
[% END %]
<th>Действия</th>
</tr>
[% FOREACH type = types %]
<tr class="[% IF type.is_active %]разрешено[% ELSE %]запрещено[% END %]">
<td><a href="editflagtypes.cgi?action=edit&amp;id=[% type.id %]">[% type.name FILTER html FILTER no_break %]</a></td>
<td>[% type.description FILTER html %]</td>
<td align="right">[% type.sortkey FILTER html %]</td>
<td>
[% IF type.is_requestable %]
<span class="requestable">по запросу</span>
[% END %]
[% IF type.is_requestable && type.is_requesteeble %]
<span class="requesteeble">(адресное)</span>
[% END %]
[% IF type.is_multiplicable %]
<span class="multiplicable">многократное</span>
[% END %]
</td>
<td>[% IF type.grant_group %][% type.grant_group.name FILTER html %][% END %]</td>
<td>[% IF type.request_group %][% type.request_group.name FILTER html %][% END %]</td>
[% IF show_flag_counts %]
<td>
[% FOREACH state = ['granted', 'pending', 'denied'] %]
[% bug_list = bug_lists.${type.id}.$state || [] %]
[% IF bug_list.size %]
<a href="buglist.cgi?bug_id=[% bug_list.unique.nsort.join(",") FILTER html %]">
[% bug_list.size FILTER html %] [%+ state_desc.$state FILTER html %]
</a>
<br>
[% ELSE %]
0 [% state_desc.$state FILTER html %]<br>
[% END %]
[% END %]
</td>
[% END %]
<td>
<a href="editflagtypes.cgi?action=copy&amp;id=[% type.id %]">Размножить</a>
| <a href="editflagtypes.cgi?action=confirmdelete&amp;id=[% type.id %]">Удалить</a>
</td>
</tr>
[% END %]
</table>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# group: The Bugzilla::Group being changed.
# regexp: the regexp according to which the update is performed.
#%]
[% IF regexp %]
[% title = "Подтверждение: исключение пользователей из группы по шаблону?" %]
[% ELSE %]
[% title = "Подтверждение: исключение всех явно заданных пользователей из группы?" %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
doc_section = "groups.html"
%]
[% IF regexp %]
<p>Подтвердите удаление из группы '[% group.name FILTER html %]' всех пользователей,
чьи учетные записи соответствуют шаблону:
'[% regexp FILTER html %]'</p>
[% ELSE %]
<p>Подтвердите удаление из группы '[% group.name FILTER html %]
всех явно заданных пользователей.'</p>
[% END %]
<p>Обычно эти функции требуются только при настройке групп, созданных
в [% terms.Bugzilla %] версии 2.16 и ранее. Используйте их
<b>очень осторожно</b>, только после изучения документации.
</p>
<form method="post" action="editgroups.cgi">
<input type="hidden" name="group_id" value="[% group.id FILTER html %]">
<input type="hidden" name="regexp" value="[% regexp FILTER html %]">
<input type="hidden" name="action" value="remove_regexp">
<input name="token" type="hidden" value="[% token FILTER html %]">
<input id="confirm" name="confirm" type="submit" value="Исключить">
<p>или <a href="editgroups.cgi">вернуться к списку групп</a>.</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# none
#%]
[% PROCESS global/header.html.tmpl
title = "Добавление группы"
subheader = "Эта страница позволит вам определить новую группу пользователей."
doc_section = "groups.html#create-groups"
%]
<form method="post" action="editgroups.cgi">
<table border="1" cellpadding="4" cellspacing="0"><tr>
<th>Новое имя</th>
<th>Новое описание</th>
<th>Новый шаблон пользователя</th>
<th>Использовать для [% terms.bugs_gen %]</th>
</tr><tr>
<td><input size="20" name="name"></td>
<td><input size="40" name="desc"></td>
<td><input size="30" name="regexp"></td>
<td><input type="checkbox" name="isactive" value="1" checked></td>
</tr>
<tr>
<th>Значок (URL):</th>
<td colspan="3"><input type="text" size="70" maxlength="255" id="icon_url" name="icon_url"></td>
</tr>
[% Hook.process('field') %]
</table>
<hr>
<input type="checkbox" id="insertnew" name="insertnew" value="1"
[% IF Param("makeproductgroups") %] checked[% END %]>
<label for="insertnew">Добавить новую группу во все имеющиеся продукты.</label>
<p>
<input type="submit" id="create" value="Добавить">
<input type="hidden" name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
<p><b>Имя</b> это то, что использует функция B<!-- blah -->ugzilla->user->in_group() в специальных
файлах cgi, которые вы пишете для использования данной группой. Оно также может
использоваться людьми, регистрирующими [% terms.bugs_acc %]
по электронной почте, чтобы ограничить доступ к [% terms.bug_obj %]
некоторым набором групп.</p>
<p><b>Описание</b> это то, что будет показано при редактировании [% terms.bugs_gen %]
членам группы. Они должны определить, будет ли [% terms.bug %]
доступна всем или только членам этой группы.</p>
<p>Флажок <b>Использовать для [% terms.bugs_gen %]</b> определяет,
может ли группа использоваться для управления доступом к [% terms.bugs_dat %].
Если его снять, пользователи впредь не смогут добавить [% terms.bugs_acc %]
к этой группе, хотя уже имеющиеся в группе [% terms.bugs %], будут принадлежать
ей. Это менее радикальный способ остановить рост группы, нежели
удаление группы. <b>Обратите внимание: Если вы создаете группу, вы, вероятно,
хотите, чтобы она могла быть использована для работы с [% terms.bugs_abl %].
В этом случае вы должны оставить флажок включенным.</b></p>
<p><b>Шаблон пользователя</b> необязателен, если он указан,
членство в этой группе автоматически предоставлено любому, чей адрес
электронной почты соответствует указанному шаблону.</p>
<p>
<b>Значок</b> — необязательный параметр, адрес URL изображения, используемого
для символического представления группы. Адрес URL может быть относительным
(от базового URL этого экземпляра) или абсолютным. Значок отображается
в комментариях к [% terms.bugs_dat %] рядом с именем автора.
</p>
[% IF Param("makeproductgroups") %]
<p>По умолчанию новая группа ассоциируется с имеющимися продуктами.
Отмена опции "Добавлять новую группу во все имеющиеся продукты" предотвратит
это, и приведет к тому, что группа станет видимой только тогда, когда будет
добавлена к продукту.</p>
[% ELSE %]
<p>Установка опции "Добавлять новую группу во все имеющиеся продукты"
приведёт к ассоциации новой группы с имеющимися продуктами. Оставление этой
опции не установленной приведёт к тому, что группа станет видимой только
тогда, когда будет добавлена к продукту.</p>
[% END %]
<p>Вернуться к <a href="./">в начало</a>
или к <a href="editgroups.cgi">списку групп</a>.
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# group: A Bugzilla::Group object representing the group that is
# about to be deleted.
# shared_queries: int; The number of queries being shared with this
# group.
#%]
[% PROCESS global/header.html.tmpl
title = "Удаление группы"
doc_section = "groups.html"
%]
<table border="1">
<tr>
<th>ID</th>
<th>Имя</th>
<th>Описание</th>
</tr>
<tr>
<td>[% group.id FILTER html %]</td>
<td>[% group.name FILTER html %]</td>
<td>[% group.description FILTER html_light %]</td>
</tr>
</table>
<form method="post" action="editgroups.cgi">
[% IF group.members_non_inherited.size %]
<p><b>В состав этой группы напрямую включены
[% group.members_non_inherited.size FILTER html %] пользователей.
Непустая группа не подлежит удалению.</b>
<br><a href="editusers.cgi?action=list&amp;groupid=
[%- group.id FILTER uri %]&amp;grouprestrict=1">Показать
список членов группы</a> - <label><input type="checkbox" name="removeusers">Исключить
всех автоматически.</label></p>
[% END %]
[% IF group.granted_by_direct(constants.GROUP_MEMBERSHIP).size %]
<p><b>Члены этой группы унаследовали членство в следующих группах:</b></p>
<ul>
[% FOREACH grantor = group.granted_by_direct(constants.GROUP_MEMBERSHIP) %]
<li>[% grantor.name FILTER html %]</li>
[% END %]
</ul>
[% END %]
[% IF group.bugs.size %]
<p><b>Зарегистрированы [% group.bugs.size FILTER html %] [%+ terms.bug %], доступ
к которым дан только членам этой группы reports. Группа, используемая для разграничения
доступа к [% terms.bugs_dat %] не подлежит удалению.</b>
<br><a href="buglist.cgi?field0-0-0=bug_group&amp;type0-0-0=equals&amp;value0-0-0=
[%- group.name FILTER uri %]">Показать
список [% terms.bugs_gen %]</a> -
<label><input type="checkbox" name="removebugs">Удалить
все связи с этой группой автоматически.</label></p>
<p><b>Внимание:</b> Использование этой функции может сделать некоторые [% terms.bugs %]
общедоступными. <b>Настоятельно рекомендуется</b> изучить все принадлежащие
группе [% terms.bugs %] и проверить права доступа.</p>
[% END %]
[% IF group.products.size %]
<p><b>Эта группа сопоставлена со следующими продуктами:</b></p>
[% SET any_hidden = 0 %]
<ul>
[% FOREACH data = group.products %]
[% SET active = [] %]
[% FOREACH control = data.controls.keys.sort %]
[% NEXT IF !data.controls.$control %]
[% IF control == 'othercontrol' OR control == 'membercontrol' %]
[% SWITCH data.controls.$control %]
[% CASE constants.CONTROLMAPMANDATORY %]
[% SET type = "Mandatory" %]
[% CASE constants.CONTROLMAPSHOWN %]
[% SET type = "Shown" %]
[% CASE constants.CONTROLMAPDEFAULT %]
[% SET type = "Default" %]
[% END %]
[% active.push("$control: $type") %]
[% ELSE %]
[% active.push(control) %]
[% END %]
[% END %]
[% SET hidden = 0 %]
[% IF data.controls.othercontrol == constants.CONTROLMAPMANDATORY
AND data.controls.membercontrol == constants.CONTROLMAPMANDATORY
AND data.controls.entry
%]
[% SET hidden = 1 %]
[% END %]
<li><a href="editproducts.cgi?action=editgroupcontrols&amp;product=
[%- data.product.name FILTER uri %]">
[%- data.product.name FILTER html %]</a>
([% active.join(', ') FILTER html %])
[% IF hidden %]
<strong>ПРЕДУПРЕЖДЕНИЕ: Этот продукт в данное время скрыт.
Удаление этой группы сделает этот продукт общедоступным,
если он не подпадает под другую группу.
</strong>
[% END %]</li>
[% END %]
</ul>
<p><label><input type="checkbox" name="unbind">Удалить группу и удалить
эти права доступа.</label></p>
[% END %]
[% IF group.flag_types.size %]
<p><b>Эта группа используется при определении прав на согласование.
Группа, используемая для контроля согласований, не подлежит удалению.</b>
<br><a href="editflagtypes.cgi?action=list&amp;group=
[%- group.id FILTER uri %]">Показать
список видов согласований</a> -
<label><input type="checkbox" name="removeflags">Удалить
соответствующие ограничения для согласований.</label></p>
[% END %]
[% IF shared_queries %]
<p>
<b>Для этой группы опубликовано условий отбора: [% shared_queries %]</b>
Удаление группы приведет к тому, что эти условия будут доступны
только их владельцам.
</p>
[% END %]
<h2>Подтверждение</h2>
<p>Вы действительно хотите удалить группу.?</p>
[% IF group.users.size || group.bugs.size || group.products.size
|| group.flags.size
%]
<p><b>Вы должны отметить все флаги на этой странице или исправить описанные
проблемы вручную до начала удаления.</b></p>
[% END %]
<p>
<input type="submit" id="delete" value="Да, удалить">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="group" value="[% group.id FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</p>
</form>
Вернуться к <a href="editgroups.cgi">списку групп</a>.
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# group - A Bugzilla::Group representing the group being edited.
# *_current - Arrays of Bugzilla::Group objects that show the current
# values for this group, as far as grants.
# *_available - Arrays of Bugzilla::Group objects that show the current
# available values for each grant.
#%]
[% title = BLOCK %]Изменение группы: [% group.name FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
doc_section = "groups.html#edit-groups"
style = "
.grant_table { border-collapse: collapse; }
.grant_table td, .grant_table th {
padding-left: .5em;
}
.grant_table td.one, .grant_table th.one {
border-right: 1px solid black;
padding-right: .5em;
}
"
%]
<form method="post" action="editgroups.cgi">
<input type="hidden" name="action" value="postchanges">
<input type="hidden" name="group_id" value="[% group.id FILTER html %]">
<table border="1" cellpadding="4">
<tr>
<th>Группа:</th>
<td>
[% IF group.is_bug_group %]
<input type="text" name="name" size="60"
value="[% group.name FILTER html %]">
[% ELSE %]
[% group.name FILTER html %]
[% END %]
</td>
</tr>
<tr>
<th>Описание:</th>
<td>
[% IF group.is_bug_group %]
<input type="text" name="desc" size="70"
value="[% group.description FILTER html %]">
[% ELSE %]
[% group.description FILTER html %]
[% END %]
</td>
</tr>
<tr>
<th>Шаблон пользователей:</th>
<td>
<input type="text" name="regexp" size="40"
value="[% group.user_regexp FILTER html %]">
</td>
</tr>
<tr>
<th>
Значок (URL):
[% IF group.icon_url %]
<img src="[% group.icon_url FILTER html %]" alt="[% group.name FILTER html %]">
[% END %]
</th>
<td>
<input type="text" name="icon_url" size="70" maxlength="255"
value="[% group.icon_url FILTER html %]">
</td>
</tr>
[% IF group.is_bug_group %]
<tr>
<th>Использовать для [% terms.bugs_gen %]:</th>
<td>
<input type="checkbox" name="isactive"
value="1" [% 'checked="checked"' IF group.is_active %]>
</td>
</tr>
[% END %]
[% Hook.process('field') %]
</table>
<h4>Групповой доступ</h4>
<table class="grant_table">
<tr>
<th class="one">Группы, входящие в данную группу<br>
(&quot;Члены группы <var>X</var> автоматически включены в
[%+ group.name FILTER html %]&quot;)</th>
<th>Группы, включающие данную группу<br>
(&quot;Члены группы [% group.name FILTER html %] автоматически
включаются в ...&quot;)</th>
</tr>
<tr>
<td class="one">
[% PROCESS select_pair name = "members" size = 10
items_available = members_available
items_current = members_current %]
</td>
<td>[% PROCESS select_pair name = "member_of" size = 10
items_available = member_of_available
items_current = member_of_current %]</td>
</tr>
</table>
<table class="grant_table">
<tr>
<th class="one">
Группы, управляющие этой группой<br>
(&quot;Члены группы <var>X</var> имеют право добавлять пользователей в
[%+ group.name FILTER html %]&quot;)
</th>
<th>Группы, управляемые этой группой<br>
(&quot;Члены группы [% group.name FILTER html %] имеют право добавлять пользователей в ...&quot;)
</th>
</tr>
<tr>
<td class="one">
[% PROCESS select_pair name = "bless_from" size = 10
items_available = bless_from_available
items_current = bless_from_current %]
</td>
<td>[% PROCESS select_pair name = "bless_to" size = 10
items_available = bless_to_available
items_current = bless_to_current %]
</td>
</tr>
</table>
[% IF Param('usevisibilitygroups') %]
<table class="grant_table">
<tr>
<th class="one">
Группы, которым видна эта группа<br>
(&quot;Члены группы <var>X</var> видят пользователей, входящих в
[%+ group.name FILTER html %]&quot;)
</th>
<th>Группы, видимые этой группе<br>
(&quot;Члены группы [% group.name FILTER html %] видят пользователей из ...&quot;)
</th>
</tr>
<tr>
<td class="one">
[% PROCESS select_pair name = "visible_from" size = 10
items_available = visible_from_available
items_current = visible_from_current %]
</td>
<td>[% PROCESS select_pair name = "visible_to_me" size = 10
items_available = visible_to_me_available
items_current = visible_to_me_current %]
</td>
</tr>
</table>
[% END %]
<input type="submit" id="update-group" value="Сохранить">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
<h4>Массовое удаление</h4>
<p>Форма для массового удаления пользователей из групп.
Эта функция очень важна после перехода с версии [% terms.Bugzilla %]
2.16.</p>
<table><tr><td>
<form method="post" action="editgroups.cgi">
<fieldset>
<legend>Исключить из группы пользователей, учетные записи которых
сответствуют шаблону:</legend>
<input type="text" size="20" name="regexp">
<input type="submit" id="remove-membership" value="Исключить пользователей">
<p>Если шаблон не указан, из группы будут исключены все явно включенные
в нее пользователи.</p>
<input type="hidden" name="action" value="confirm_remove">
<input type="hidden" name="group_id" value="[% group.id FILTER html %]">
</fieldset>
</form>
</td></tr></table>
<p>Вернуться к <a href="editgroups.cgi">списку групп</a>.</p>
[% PROCESS global/footer.html.tmpl %]
[% BLOCK select_pair %]
<table class="select_pair">
<tr>
<th><label for="[% "${name}_add" FILTER html %]">Добавить<br>
(выберите для добавления)</label></th>
<th><label for="[% "${name}_remove" FILTER html %]">Входит<br>
(выберите для исключения)</label></th>
</tr>
<tr>
<td>
<select multiple="multiple" size="[% size FILTER html %]"
name="[% "${name}_add" FILTER html %]"
id="[% "${name}_add" FILTER html %]">
[% FOREACH item = items_available %]
<option value="[% item.id FILTER html %]">
[% item.name FILTER html %]</option>
[% END %]
</select>
</td>
<td>
<select multiple="multiple" size="[% size FILTER html %]"
name="[% "${name}_remove" FILTER html %]"
id="[% "${name}_remove" FILTER html %]">
[% FOREACH item = items_current %]
<option value="[% item.id FILTER html %]">
[% item.name FILTER html %]</option>
[% END %]
</select>
</td>
</tr>
</table>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# groups: array with group objects having the properties:
# - id: number. The ID of the group.
# - name: string. The name of the group.
# - description: string. The description of the group.
# - userregexp: string. The user regexp for the given group.
# - isactive: boolean int. Specifies if the group is active or not.
# - isbuggroup: boolean int. Specifies if it can be used for bugs.
#%]
[% PROCESS global/header.html.tmpl
title = "Группы пользователей"
subheader = "Позволяет настраивать группы для включения пользователей."
doc_section = "groups.html"
%]
[% edit_contentlink = "editgroups.cgi?action=changeform&amp;group=%%id%%" %]
[% del_contentlink = "editgroups.cgi?action=del&amp;group=%%id%%" %]
[% columns =
[{name => 'name'
heading => 'Имя'
contentlink => edit_contentlink
}
{name => 'description'
heading => 'Описание'
allow_html_content => 1
}
{name => 'userregexp'
heading => 'Шаблон пользователя'
}
{name => 'is_active_bug_group'
heading => "Использовать для $terms.bugs_gen"
align => 'center'
}
{name => 'type'
heading => 'Тип'
align => 'center'
}
{name => 'action'
heading => 'Действие'
}
]
%]
[%# FIXME-ru: переводы описаний стандартных групп %]
[% overrides.is_active_bug_group = {
'is_active_bug_group' => {
"0" => {
override_content => 1
content => "&nbsp;"
}
"1" => {
override_content => 1
content => "X"
}
}
}
overrides.userregexp = {
'userregexp' => {
"" => {
override_content => 1
content => "&nbsp;"
}
}
}
%]
[% FOREACH group IN ["chartgroup", "insidergroup", "timetrackinggroup", "querysharegroup"] %]
[% special_group = Param(group) %]
[% IF special_group %]
[% overrides.action.name.$special_group = {
override_content => 1
content => "(используется в параметре '$group')"
}
%]
[% END %]
[% END %]
[% overrides.action.isbuggroup = {
"1" => {
override_content => 1
content => "Удалить"
override_contentlink => 1
contentlink => del_contentlink
}
}
overrides.type.isbuggroup = {
"0" => {
override_content => 1
content => "системная"
}
"1" => {
override_content => 1
content => "пользовательская"
}
}
%]
[% PROCESS admin/table.html.tmpl
columns = columns
data = groups
overrides = overrides
%]
<p><a href="editgroups.cgi?action=add">Создать группу</a></p>
<p>
<b>Имя</b> — это то, что использует функция B<!-- blah -->ugzilla->user->in_group() в
специальных файлах cgi, которые вы пишете для использования данной
группой. Оно также может использоваться пользователями, регистрирующими
[% terms.bugs_acc %] по электронной почте, чтобы ограничить доступ к
[% terms.bug_obj %] некоторым набором групп. Имя не может содержать
пробелов.
</p>
<p>
<b>Описание</b> отображается в форме редактирования
[% terms.bugs_gen %] членам группы. Они должны определить, будет ли
[% terms.bug %] доступна всем или только членам этой группы.
</p>
<p>
<b>Шаблон пользователя</b> необязателен, если он указан, членство в
этой группе автоматически предоставлено любому, чей адрес электронной
почты соответствует указанному шаблону. Синтаксис шаблона соответствует
регулярному выражению Perl. Пример: '@mycompany\.com$'
</p>
<p>
Флажок <b>Использовать для [% terms.bugs_gen %]</b> определяет,
может ли группа использоваться для управления доступом к
[% terms.bugs_dat %]. Если его снять, пользователи впредь не смогут
добавить [% terms.bugs_acc %] к этой группе, хотя уже имеющиеся в
группе [% terms.bugs %] будут принадлежать ей. Это менее радикальный
способ остановить рост группы, нежели ее удаление. Кроме того,
ненужные группы не загромождают форму редактирования [% terms.bugs_gen %].
</p>
<p>
Поле <b>Тип</b> указывает на системные группы, их нельзя удалить.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# keyword: A Bugzilla::Keyword object.
#%]
[% PROCESS global/header.html.tmpl
title = "Удаление ключевого слова"
%]
<p>
[% IF keyword.bug_count > 0 %]
[% numeral(keyword.bug_count,
"Найдена ${keyword.bug_count} ${terms.bug}",
"Найдены ${keyword.bug_count} ${terms.bug_gen}",
"Найдено ${keyword.bug_count} ${terms.bugs_gen}")
FILTER html %] со ссылкой на это ключевое слово.
[% END %]
Вы <b>уверены</b>, что хотите удалить ключевое слово
<code>[% keyword.name FILTER html %]</code>?
</p>
<form method="post" action="editkeywords.cgi">
<input type="hidden" name="id" value="[% keyword.id FILTER html %]">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="delete"
value="Да, удалить это ключевое слово">
</form>
<p><a href="editkeywords.cgi">Редактировать другие ключевые слова</a>.</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# none
#%]
[% PROCESS global/header.html.tmpl
title = "Добавьте ключевое слово"
subheader = "Эта страница позволит вам добавить новое ключевое слово."
%]
<form method="post" action="editkeywords.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th align="right">Имя:</th>
<td><input size="64" maxlength="64" name="name" value=""></td>
</tr>
<tr>
<th align="right">Описание:</th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'description'
minrows = 4
cols = 64
wrap = 'virtual'
%]
</td>
</tr>
</table>
<hr>
<input type="hidden" name="id" value="-1">
<input type="submit" id="create" value="Добавить">
<input type="hidden" name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
<p><a href="editkeywords.cgi">Редактировать другие ключевые слова</a>.</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# keyword: A Bugzilla::Keyword object.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Изменение ключевого слова"
%]
<form method="post" action="editkeywords.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th align="right">Имя:</th>
<td><input size="64" maxlength="64" name="name"
value="[% keyword.name FILTER html %]"></td>
</tr>
<tr>
<th align="right">Описание:</th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'description'
minrows = 4
cols = 64
wrap = 'virtual'
defaultcontent = keyword.description
%]
</td>
</tr>
<tr>
<th align="right">[% terms.Bugs %]:</th>
<td>
[% IF keyword.bug_count > 0 %]
<a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]">
[% keyword.bug_count FILTER html %]</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
</table>
<input type="submit" id="update" value="Сохранить изменения">
<input type="hidden" name="action" value="update">
<input type="hidden" name="id" value="[% keyword.id FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
<p><a href="editkeywords.cgi">Редактировать другие ключевые слова</a>.</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# keywords: array keyword objects having the properties:
# - id: number. The ID of the keyword.
# - name: string. The name of the keyword.
# - description: string. The description of the keyword.
# - bug_count: number. The number of bugs with the keyword.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите ключевое слово"
%]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => "editkeywords.cgi?action=edit&amp;id=%%id%%"
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
},
{
name => "bug_count"
heading => "$terms.Bugs_gen"
align => "right"
contentlink => "buglist.cgi?keywords=%%name%%"
},
{
heading => "Действие"
content => "Удалить"
contentlink => "editkeywords.cgi?action=del&amp;id=%%id%%"
}
]
%]
[% PROCESS admin/table.html.tmpl
columns = columns
data = keywords
footer = footer_row
%]
<p><a href="editkeywords.cgi?action=add">Создать ключевое слово</a></p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the milestone belongs.
# milestone: object; Bugzilla::Milestone object representing the
# milestone the user wants to delete.
#%]
[% title = BLOCK %]Удаление плана продукта '[% product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">Название плана:</td>
<td valign="top">[% milestone.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">Продукт:</td>
<td valign="top">[% product.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">[% terms.Bugs %]:</td>
<td valign="top">
[% IF milestone.bug_count %]
<a title="Список [% terms.bugs_gen %] запланированных в '
[% milestone.name FILTER html %]'"
href="buglist.cgi?target_milestone=[% milestone.name FILTER uri %]&amp;product=
[%- product.name FILTER uri %]">
[% milestone.bug_count FILTER none %]</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
</table>
<h2>Подтверждение</h2>
[% IF milestone.bug_count %]
<p class="confirmation">
Данное значение используется в [% milestone.bug_count FILTER none %]
[% numeral(milestone.bug_count,
"${terms.bug_obj}", "${terms.bugs_obj}", "${terms.bugs_obj}")
FILTER html -%]!
Удаление значения плана приведет к переносу <b>ВСЕХ</b>
[% terms.bugs_obj %] на
[% product.default_milestone FILTER html %], план по умолчанию
для продукта [% product.name FILTER html %].
</p>
[% END %]
<p>Удалить план?<p>
<form method="post" action="editmilestones.cgi">
<input type="submit" id="delete" value="Да, удалить">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="milestone" value="[% milestone.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/milestones/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the milestone belongs.
#%]
[% title = BLOCK %]Создание плана продукта '[% product.name FILTER html %]'[% END %]
[% subheader = BLOCK %]Страница добавления нового плана для продукта
'[% product.name FILTER html %]'.[% END %]
[% PROCESS global/header.html.tmpl
title = title
subheader = subheader
onload = "document.forms['f'].milestone.focus()"
%]
<form name="f" method="post" action="editmilestones.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th align="right"><label for="milestone">Название плана:</label></th>
<td><input id="milestone" size="64" maxlength="64" name="milestone"
value=""></td>
</tr>
<tr>
<th align="right"><label for="sortkey">Порядок сортировки:</label></th>
<td><input id="sortkey" size="20" maxlength="20" name="sortkey"
value=""></td>
</tr>
</table>
<input type="submit" id="create" value="Создать">
<input type="hidden" name="action" value="new">
<input type="hidden" name='product' value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/milestones/footer.html.tmpl
no_add_milestone_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the milestone belongs.
# milestone: object; Bugzilla::Milestone object representing the
# milestone the user wants to edit.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Изменение плана '[% milestone.name FILTER html %]' продукта '
[%- product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
onload = "document.forms['f'].milestone.select()"
%]
<form name="f" method="post" action="editmilestones.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th class="field_label"><label for="milestone">Название плана:</label></th>
<td><input id="milestone" size="64" maxlength="64" name="milestone" value="
[%- milestone.name FILTER html %]"></td>
</tr>
<tr>
<th class="field_label"><label for="sortkey">Порядок сортировки:</label></th>
<td><input id="sortkey" size="20" maxlength="20" name="sortkey" value="
[%- milestone.sortkey FILTER html %]"></td>
</tr>
<tr>
<th class="field_label"><label for="isactive">Доступен для [% terms.Bugs_gen %]:</label></th>
<td><input id="isactive" name="isactive" type="checkbox" value="1"
[% 'checked="checked"' IF milestone.isactive %]></td>
</tr>
</table>
<input type="hidden" name="milestoneold" value="[% milestone.name FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="submit" id="update" value="Сохранить изменения">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/milestones/footer.html.tmpl
no_edit_milestone_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the milestone belongs.
#
# milestone: object; Bugzilla::Milestone object representing the
# milestone.
#
# no_XXX_link: boolean; if defined, then don't show the corresponding
# link. Supported parameters are:
#
# no_edit_milestone_link
# no_edit_other_milestones_link
# no_add_milestone_link
#%]
<hr>
<p>
[% UNLESS no_add_milestone_link %]
<a title="Создать план для продукта '[% product.name FILTER html %]'"
href="editmilestones.cgi?action=add&amp;product=
[%- product.name FILTER uri %]">Создать</a> новый план.
[% END %]
[% IF milestone.name && !no_edit_milestone_link %]
Изменить план <a
title="Изменить план '[% milestone.name FILTER html %]' продукта '
[%- product.name FILTER html %]'"
href="editmilestones.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;milestone=
[%- milestone.name FILTER uri %]">
'[% milestone.name FILTER html %]'</a>.
[% END %]
[% UNLESS no_edit_other_milestones_link %]
Изменить другие планы продукта <a
href="editmilestones.cgi?product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
[% END %]
Изменить продукт <a
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
</p>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the milestones belongs.
# showbugcounts: if defined, then bug counts should be included in the table
#%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Выберите план для продукта
'[% product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% edit_contentlink = BLOCK %]editmilestones.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;milestone=%%name%%[% END %]
[% delete_contentlink = BLOCK %]editmilestones.cgi?action=del&amp;product=
[%- product.name FILTER uri %]&amp;milestone=%%name%%[% END %]
[% bug_count_contentlink = BLOCK %]buglist.cgi?target_milestone=%%name%%&amp;product=
[%- product.name FILTER uri %][% END %]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => edit_contentlink
},
{
name => "sortkey"
heading => "Порядок сортировки"
},
{
name => "isactive"
heading => "Активен"
yesno_field => 1
}
]
%]
[% IF showbugcounts %]
[% columns.push({
name => "bug_count"
heading => "$terms.Bugs_gen"
align => "right"
contentlink => bug_count_contentlink
})
%]
[% END %]
[% columns.push({
name => "action"
heading => "Действие"
content => "Удалить"
contentlink => delete_contentlink
})
%]
[%# We want to override the usual 'Delete' link for the default milestone %]
[% overrides.action.name.${product.default_milestone} = {
override_content => 1
content => "(Значение по умолчанию)"
override_contentlink => 1
contentlink => undef
}
%]
[% Hook.process('before_table') %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = product.milestones
overrides = overrides
%]
[% IF ! showbugcounts %]
<p><a href="editmilestones.cgi?product=[% product.name FILTER uri %]&amp;showbugcounts=1">
Показать счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS admin/milestones/footer.html.tmpl
no_edit_other_milestones_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# products: array of product objects
# showbugcounts: if defined, then bug counts should be included in the table
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите продукт"
%]
[% columns = [
{
name => "name"
heading => "Изменить планы..."
contentlink => "editmilestones.cgi?product=%%name%%"
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
}
]
%]
[% IF showbugcounts %]
[% columns.push({
name => 'bug_count'
heading => "$terms.Bugs_gen"
align => "right"
contentlink => "buglist.cgi?product=%%name%%"
})
%]
[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = products
%]
[% IF !showbugcounts %]
<p><a href="editmilestones.cgi?showbugcounts=1">
Показать счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Административные вопросы"
desc = "Настройка учетных записей"
%]
[% param_descs = {
allowbugdeletion => "При редактировании продуктов и компонентов разрешить удаление " _
"связанных $terms.bugs_gen при удалении продукта (компонента). " _
"Поскольку функция весьма опасная, ее необходимо включить " _
"явным образом перед попыткой удаления .",
allowemailchange => "Разрешить изменение адреса электронной почты через страницу настроек. " _
"Изменение адреса сопровождается проверкой обоих адресов, поэтому " _
"включение функции не дает пользователю возможности ввести неверный адрес.",
allowuserdeletion => "Разрешить удаление учетных записей пользователей. " _
"$terms.Bugzilla выдает предупреждения о потенциальных нарушениях " _
"целостности базы данных, но в любом случае функция является опасной. " _
"Поэтому ее требуется включать явным образом." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Дополнительные"
desc = "Настройки для дополнительной конфигурации."
%]
[% sts_desc = BLOCK %]
Включает отправку заголовка
<a href="http://en.wikipedia.org/wiki/Strict_Transport_Security">Strict-Transport-Security</a>
при отправке HTTP запросов по SSL-соединениям. Это повышает защищённость
ваших SSL-соединений заставляя браузер всегда соединяться с вашим доменом с использованием
SSL и никогда не принимать некорректный сертификат.
Однако, его следует использовать только если вы включили параметр <code>ssl_redirect</code>,
[% terms.Bugzilla %] является единственной службой работающей в этом домене
(т.е., ваш <code>urlbase</code> это что-то вроде
<code>http://bugzilla.example.com/</code>) и вы планируете никогда не отключать
параметр <code>ssl_redirect</code>.
<ul>
<li>
off - Не отправлять с запросами заголовок Strict-Transport-Security.
</li>
<li>
this_domain_only - Отправлять со всеми запросами заголовок Strict-Transport-Security,
но поддерживать его только для текущего домена.
</li>
<li>
include_subdomains - Отправлять заголовок Strict-Transport-Security вместе с
флагом <code>includeSubDomains</code>, что применяет политику безопасности к
всем субдоменам. Это особенно полезно в комбинации с <code>attachment_base</code>
который существует как субдомен в главном домене [% terms.Bugzilla %].
</li>
</ul>
[% END %]
[% param_descs = {
cookiedomain =>
"Для сайта с адресом 'www.foo.com' установка значения"
_ " '.foo.com' даёт доступ к cookies $terms.Bugzilla"
_ " также сайту 'bar.foo.com'. Используется в случаях когда доступ"
_ " к серверу возможен под разными именами и требуется сохранить"
_ " значения $terms.Bugzilla cookie.",
inbound_proxies =>
"Когда трафик, входящий в $terms.Bugzilla проходит через прокси,"
_ " $terms.Bugzilla думает, что IP-адрес каждого пользователя"
_ " равен IP-адресу прокси. Если вы введете в это поле список IP-адресов,"
_ " разделённых запятыми, то $terms.Bugzilla будет доверять любому"
_ " заголовку <code>X-Forwarded-For</code> отправленному с этих IP, и"
_ " использовать значение этого заголовка в качестве IP-адрес конечного пользователя.",
proxy_url =>
"$terms.Bugzilla использует доступ в Интернет для оповещения о новых"
_ " релизах, согласно значению параметра <tt>upgrade_notification</tt>. Если для"
_ " доступа обязательно использование прокси, может потребоваться указание его адреса здесь,"
_ " если для сервера Web не установлена переменная окружения HTTP_PROXY. Если для доступа"
_ " требуются имя и пароль, укажите их в виде <code>http://имя:пароль@proxy_url/</code>.",
strict_transport_security => sts_desc,
} %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Приложения"
desc = "Настройка параметров приложений"
%]
[% param_descs = {
allow_attachment_display =>
"Позволяет пользователям просматривать приложения через веб-обозреватель,"
_ " если он поддерживает соответствующий тип данных MIME."
_ " При отключенном параметре пользователи должны загружать приложения, "
_ " даже если веб-обозреватель может их отобразить."
_ "<p>Эта мера безопасности предназначена для систем, в которых пользователь"
_ " может создать приложение, способное нанести вред при просмотре напрямую "
_ " через веб-обозреватель.</p>"
_ "<p>При включении этого параметра рекомендуется также настроить параметр "
_ " <tt>attachment_base</tt>.",
attachment_base =>
"При включенном параметре <tt>allow_attachment_display</tt>, приложение,"
_ " написанное злоумышленно, может получить доступ к cookie или"
_ " атаковать $terms.Bugzilla с использованием учетных данных пользователя."
_ "<p>Во избежание этого в качестве дополнительной меры безопасности"
_ " установите в этом параметре альтернативный адрес URL экземпляра ${terms.Bugzilla},"
_ " не совпадающий ни с <tt>urlbase</tt> ни с <tt>sslbase</tt>."
_ " Это должно быть другое доменное имя, указывающее на этот же"
_ " экземпляр ${terms.Bugzilla}.</p>"
_ "<p>Если установлен"
_ " <a href=\"editparams.cgi?section=advanced#cookiedomain_desc\">параметр <tt>cookiedomain</tt></a>,"
_" параметр <tt>attachment_base</tt> должен использовать"
_ " домен, который <em>не совпадает</em> с"
_ " <tt>cookiedomain</tt>.</p>"
_ "<p>Для большей безопасности разрешается использовать в URL конструкцию <tt>%bugid%</tt>,"
_ " которая заменяется номером текущей ${terms.bug_gen}, к которой"
_ " относится приложение. Это ограничит возможности приложения"
_ " доступом только к приложениям той же "
_ " ${terms.bug_gen}. Помните, что все эти доменные имена "
_ " (такие как <tt>1234.your.domain.com</tt>) должны указывать на"
_ " этот экземпляр ${terms.Bugzilla}.",
allow_attachment_deletion => "Разрешает администраторам удалять " _
"содержимое приложений.",
maxattachmentsize => "Максимальный размер приложений в килобайтах, хранимых " _
"в базе данных. Если к ${terms.bug_obj} прикладывается " _
"файл большего размера, $terms.Bugzilla проверяет " _
"значение <a href=\"#maxlocalattachment\">параметра <tt>maxlocalattachment</tt></a>, " _
"чтобы определить, можно ли сохранить файл локально на веб-сервере. " _
"Если размер файла превышает оба лимита, то запрос на " _
"сохранение приложения отклоняется. Установка обоих " _
"параметров в 0 сделает добавление приложений к ${terms.bugs} невозможным.",
maxlocalattachment => "Максимальный размер приложений в мегабайтах, хранимых " _
"локально на веб-сервере. Если этот параметр установлен в " _
"значение меньшее чем <a href=\"#maxattachmentsize\">параметр <tt>maxattachmentsize</tt></a>, " _
"приложения никогда не будут сохраняться на локальной файловой системе." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Аутентификация пользователей"
desc = "Настройка параметров аутентификации пользователей"
%]
[% param_descs = {
auth_env_id => "Переменная среды, используемая внешней системой " _
"аутентификации для хранения уникального идентификатора пользователя. " _
"Оставьте значение пустым если внешняя система аутентификации " _
"не используется или такая возможность не поддерживается.",
auth_env_email => "Переменная среды, используемая внешней системой " _
"аутентификации для хранения адреса электронной почты. " _
"Обязательно для внешней аутентификации. Оставьте значение " _
"пустым если внешняя система аутентификации не используется.",
auth_env_realname => "Переменная среды, используемая внешней системой " _
"аутентификации для хранения полного имени пользователя. " _
"Оставьте значение пустым если внешняя система аутентификации " _
"не используется или такая возможность не поддерживается.",
user_info_class => "Механизмы получения информации о пользователе.
Допускается выбор нескольких вариантов. Они применяются в
указанном порядке до получения непустого результата.<br>
Допустимые типы:
<dl>
<dt>" _ get_choice("CGI") _ "</dt>
<dd>
Интерактивный запрос имени пользователя и пароля через интерфейс CGI.
</dd>
<dt>" _ get_choice("Env") _ "</dt>
<dd>
Данные уже аутентифицированного пользователя переданы через переменные
среды.
</dd>
</dl>",
user_verify_class => "Механизмы аутентификации (проверки) данных пользователя,
полученных через user_info_class.
Допускается выбор нескольких вариантов. Они применяются в
указанном порядке до обнаружения пользователя.<br>
Допустимые типы:
<dl>
<dt>" _ get_choice("DB") _ "</dt>
<dd>
Встроенная аутентификация ${terms.Bugzilla}. Это наиболее частый
вариант.
</dd>
<dt>" _ get_choice("RADIUS") _ "</dt>
<dd>
Аутентификация через сервер RADIUS.
Перед использованием прочтите документацию ${terms.Bugzilla}.
Использование этого метода требует настройки
<a href=\"?section=radius\">дополнительных
параметров</a>.
</dd>
<dt>" _ get_choice("LDAP") _ "</dt>
<dd>
Аутентификация через сервер LDAP.
Перед использованием прочтите документацию ${terms.Bugzilla}.
Использование этого метода требует настройки
<a href=\"?section=ldap\">дополнительных
параметров</a>.
</dd>
</dl>",
rememberlogin => "Управление временем жизни сессионных \"cookie\"
<ul>
<li>"
_ get_choice("on") _ " - время жизни \"cookie\" не ограничено (достаточно войти
через каждый веб-обозреватель лишь однажды).
</li>
<li>"
_ get_choice("off") _ " - время жизни \"cookie\" только в течение сессии (входить в систему
придется каждый раз).
</li>
<li>"
_ get_choice("defaulton") _ "/" _ get_choice("defaultoff") _
" - поведение по умолчанию как описано выше,
но каждый пользователь может выбрать поведение индивидуально.
</li>
</ul>",
requirelogin => "Любой доступ к системе помимо главной страницы требует " _
"указания имени и пароля. " _
"Анонимный доступ запрещен. ",
emailregexp =>
"Регулярное выражение для проверки синтаксиса допустимого адреса электронной " _
"почты. Значение по умолчанию требует указания полного доменного имени. " _
"Используйте <tt>.*</tt>, чтобы принимать любые адреса электронной почты следующие " _
"спецификации <a href=\"http://tools.ietf.org/html/rfc2822#section-3.4.1\">RFC 2822</a> " _
"Другой популярный вариант: <tt>^[^@]+$</tt>, что означает " _
"использование только локальных имен, без '@'.",
emailregexpdesc => "Текстовое описание правила определения допустимых адресов " _
"электронной почты, указанного в <tt>emailregexp</tt>.",
emailsuffix => "Строка, добавляемая к адресу электронной почты перед отправкой сообщения " _
"на этот адрес. Используется в случае изменения параметра " _
"<tt>emailregexp</tt> и разрешения только локальных имен пользователей, " _
"если почта при этом должна отправляться на username@my.local.hostname.",
createemailregexp => "Регулярное выражение (нечувствительное к регистру), описывающее адреса " _
"электронной почты, разрешенные для самостоятельной регистрации. " _
"Значение по умолчанию (.*) разрешает создание учетных записей с любым " _
"значением, соответствующим <tt>emailregexp</tt>. Пустое " _
"значение параметра запрещает самостоятельную регистрацию: " _
"все учетные записи должны быть созданы администратором.",
password_complexity =>
"Устанавливает требования к сложности паролей. Во всех случаях длина паролей " _
"должна быть не менее ${constants.USER_PASSWORD_MIN_LENGTH} символов." _
"<ul><li>no_constraints - Требования к сложности отсутствуют.</li>" _
"<li>mixed_letters - Пароли должны содержать по меньшей мере одну букву в " _
"ВЕРХНЕМ регистре и одну букву в нижнем регистре.</li>" _
"<li>letters_numbers - Пароли должны содержать по меньшей мере одну букву в " _
"ВЕРХНЕМ регистре, одну букву в нижнем регистре и цифру.</li>" _
"<li>letters_numbers_specialchars - Пароли должны содержать по меньшей мере одну " _
"букву, цифру и специальный символ.</li></ul>"
}
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Редактирование ${terms.bugs_gen}"
desc = "Настройка параметров редактирования ${terms.bugs_gen}"
%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% accept_status = display_value('bug_status', 'IN_PROGRESS') FILTER html %]
[% param_descs = {
duplicate_or_move_bug_status => "Использовать это состояние при принятии решения о дублировании " _
"${terms.bug_gen} или при перемещении в другую базу данных.",
letsubmitterchoosepriority => "Разрешить при регистрации $terms.bugs_gen выбирать " _
"приоритет по своему усмотрению. " _
"Если параметр не включен, все $terms.bugs изначально имеют " _
"приоритет, установленный по умолчанию.",
letsubmitterchoosemilestone => "Разрешить при регистрации $terms.bugs_gen выбирать " _
"значение плана. " _
"Если параметр не включен, все $terms.bugs изначально имеют " _
"значение, установленное по умолчанию для продукта.",
musthavemilestoneonaccept => "При использовании ${field_descs.target_milestone} требовать указания"
_ " значения плана для перевода ${terms.bug_gen} в состояние ${accept_status}.",
commentonchange_resolution => "Обязателен комментарий при изменении " _
"решения по ${terms.bug_dat}.",
commentonduplicate => "Обязателен комментарий при принятии решения " _
"о дублировании ${terms.bug_gen}.",
noresolveonopenblockers => "Запретить принятие решений по ${terms.bug_dat}, " _
"имеющей нерешенные зависимости." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Поля ${terms.bugs_gen}"
desc = "Настройка используемых системой полей"
%]
[% param_descs = {
useclassification => "Использовать разделение продуктов по разделам. " _
"Для настройки принадлежности продуктов разделам " _
"требуется принадлежность к группе 'editclassification' .",
usetargetmilestone => "Использовать поле 'Запланировано'",
useqacontact => "Использовать поле 'Приемка'",
usestatuswhiteboard => "Использовать поле 'Заметки'",
use_see_also =>
"Хотите использовать поле Ссылки? Оно позволяет ссылаться на"
_ " $terms.bugs в других экземплярах ${terms.Bugzilla}. Если поле будет отключено,"
_ " уже установленные связи $terms.bugs_gen по прежнему будут отображаться в виде гиперссылок"
_ " без возможности их удалить.",
defaultpriority => "Значение приоритета по умолчанию для регистрируемых ${terms.bugs_gen}.",
defaultseverity => "Значение серьезности по умолчанию для регистрируемых ${terms.bugs_gen}.",
defaultplatform => "Платформа, выбранная по умолчанию на странице " _
"регистрации ${terms.bug_gen}.<br> " _
"Значение можно оставить пустым: " _
"при этом $terms.Bugzilla определит значение автоматически " _
"по данным, сообщаемым веб-обозревателем.",
defaultopsys => "Операционная система, выбранная по умолчанию на странице " _
"регистрации ${terms.bug_gen}.<br> " _
"Значение можно оставить пустым: " _
"при этом $terms.Bugzilla определит значение автоматически " _
"по данным, сообщаемым веб-обозревателем." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% sortlist_separator = '---' %]
<dl>
[% FOREACH param = panel.param_list %]
<dt id="[% param.name FILTER html %]_desc">[% param.name FILTER html %]</dt>
<dd>[% panel.param_descs.${param.name} FILTER none %]
<p>
[% IF param.type == "t" %]
<input type="text" size="80" name="[% param.name FILTER html %]"
id="[% param.name FILTER html %]" value="[% Param(param.name) FILTER html %]">
[% ELSIF param.type == "p" %]
<input type="password" size="80" name="[% param.name FILTER html %]"
id="[% param.name FILTER html %]" value="[% Param(param.name) FILTER html %]"
autocomplete="off">
[% ELSIF param.type == "l" %]
<textarea name="[% param.name FILTER html %]" id="[% param.name FILTER html %]"
rows="10" cols="80">[% Param(param.name) FILTER html %]</textarea>
[% ELSIF param.type == "b" %]
<input type="radio" name="[% param.name FILTER html %]" id="[% param.name FILTER html %]-on"
value=1 [% "checked=\"checked\"" IF Param(param.name) %]>
<label for="[% param.name FILTER html %]-on">Вкл.</label>
<input type="radio" name="[% param.name FILTER html %]" id="[% param.name FILTER html %]-off"
value=0 [% "checked=\"checked\"" IF !Param(param.name) %]>
<label for="[% param.name FILTER html %]-off">Откл.</label>
[% ELSIF param.type == "m" %]
[% boxSize = 5 %]
[% boxSize = param.choices.size IF param.choices.size < 5 %]
<select multiple="multiple" size="[% boxSize FILTER html %]"
name="[% param.name FILTER html %]" id="[% param.name FILTER html %]">
[% FOREACH item = param.choices %]
<option value="[% item FILTER html %]"
[% " selected=\"selected\"" IF lsearch(Param(param.name), item) != -1 %]>
[% item FILTER html %]
</option>
[% END %]
</select>
[% ELSIF param.type == "o" %]
<input id="input_[% param.name FILTER html %]" size="80"
name="[% param.name FILTER html %]"
value="[% Param(param.name) FILTER html %]"><br>
[% boxSize = 7 %]
[% boxSize = 3 + param.choices.size IF param.choices.size < 7 %]
[% plist = Param(param.name).split(',') %]
<table id="table_[% param.name FILTER html %]" class="bz_default_hidden">
<tr>
<td rowspan="2">
<select id="select_[% param.name FILTER html %]"
name="select_[% param.name FILTER html %]"
size="[% boxSize FILTER html %]">
[% FOREACH item = plist %]
<option value="[% item FILTER html %]">[% item FILTER html %]</option>
[% END %]
<option class="sortlist_separator" disabled="disabled"
value="[% sortlist_separator %]">включено&uarr;&nbsp;&darr;отключено</option>
[% FOREACH item = param.choices %]
[% IF lsearch(plist, item) == -1 %]
<option value="[% item FILTER html %]">[% item FILTER html %]</option>
[% END %]
[% END %]
</select>
</td>
<td style="vertical-align: bottom">
<button type="button"
onClick="sortedList_moveItem('[% param.name FILTER html %]', -1, '[% sortlist_separator %]');">&uarr;</button>
</td>
</tr>
<tr>
<td style="vertical-align: top">
<button type="button"
onClick="sortedList_moveItem('[% param.name FILTER html %]', +1, '[% sortlist_separator %]');">&darr;</button>
</td>
</tr>
</table>
<script type="text/javascript">
bz_toggleClass("input_[% param.name FILTER html %]", "bz_default_hidden");
bz_toggleClass("table_[% param.name FILTER html %]", "bz_default_hidden");
</script>
[% ELSIF param.type == "s" %]
<select name="[% param.name FILTER html %]" id="[% param.name FILTER html %]">
[% FOREACH item = param.choices %]
<option value="[% item FILTER html %]"
[% " selected=\"selected\"" IF item == Param(param.name) %]>
[% IF param.name == "defaultseverity" %]
[% display_value("bug_severity", item) FILTER html %]
[% ELSIF param.name == "defaultplatform" %]
[% display_value("rep_platform", item) FILTER html %]
[% ELSIF param.name == "defaultopsys" %]
[% display_value("op_sys", item) FILTER html %]
[% ELSIF param.name == "duplicate_or_move_bug_status" %]
[% display_value("bug_status", item) FILTER html %]
[% ELSE %]
[% item FILTER html %]
[% END %]
</option>
[% END %]
</select>
[% ELSE %]
<font color="red">
Неизвестный тип параметра [% param.type FILTER html %]!!!
</font>
[% END %]
</p>
[% UNLESS param.no_reset %]
<p>
<input type="checkbox" name="reset-[% param.name FILTER html %]"
id="reset-[% param.name FILTER html %]">
<label for="reset-[% param.name FILTER html %]">По умолчанию</label>
</p>
[% END %]
<hr>
</dd>
[% END %]
</dl>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Обязательные настройки"
desc = "Параметры, требуемые для работоспособности ${terms.Bugzilla}"
%]
[% param_descs = {
urlbase => "Адрес URL — общая часть всех адресов HTTP этого " _
"экземпляра ${terms.Bugzilla}.",
sslbase => "Адрес URL — общая часть всех адресов HTTPS этого " _
"экземпляра ${terms.Bugzilla} для доступа через SSL.",
ssl_redirect =>
"При включенном параметре весь доступ к $terms.Bugzilla возможен только"
_ " через SSL, любые запросы по HTTP будут перенаправлены на HTTPS"
_ " с использованием параметра <tt>sslbase</tt>. Кроме того, ссылки в"
_ " сообщениях электронной почты будут использовать <tt>sslbase</tt> "
_ " вместо <tt>urlbase</tt>.",
cookiepath => "Путь относительно корня сервера web, которым ограничена " _
"видимость cookie ${terms.Bugzilla}. Как правило это часть URI адреса URL " _
"системы. Должен начинаться с / (прямой наклонной черты). Например, если " _
"адрес сервера ${terms.Bugzilla} — 'http://www.somedomain.com/bugzilla/', установите " _
"значение этого параметра /bugzilla/. Установка значения / разрешает " _
"всем ресурсам этого сервера или виртуального хоста чтение " _
"cookie ${terms.Bugzilla}.",
} %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Диаграммы зависимостей"
desc = "Настройки построителя диаграмм зависимостей"
%]
[% param_descs = {
webdotbase => "Возможно построение ориентированных графов зависимостей ${terms.bugs_gen}.
Возможные значения параметра:
<ul>
<li>
Полный путь до утилиты 'dot' (из пакета
<a href=\"http://www.graphviz.org\">GraphViz</a>) для локального
построения диаграмм.
</li>
<li>
Ссылка URL существующей установки
<a href=\"http://www.research.att.com/~north/cgi-bin/webdot.cgi\">пакета
webdot</a> для удаленного построения.
</li>
<li>
Пустое значение отключает возможности построения диаграмм.
</li>
</ul>
Значение по умолчанию: сервер webdot в открытом доступе. Если вы измените
это значение, убедитесь, что сервер имеет доступ по чтению к файлам в каталоге
webdot. В Apache это достигается редактированием файла .htaccess,
для других реализаций сервера HTTP механизмы другие. Для перегенерации
удалённого файла .htaccess запустите <kbd>checksetup.pl</kbd>."}
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% curpanel = -1 %]
[% panels = panels.nsort('sortkey') %]
[% FOREACH panel = panels %]
[% PROCESS "admin/params/${panel.name}.html.tmpl"
params = panel.param_list %]
[% panel.title = title %]
[% panel.desc = desc %]
[% panel.param_descs = param_descs %]
[% IF panel.current %][% curpanel = loop.index %][% END %]
[% END %]
[% current_panel = panels.$curpanel %]
[%# We cannot call header.html.tmpl earlier as we have to know
which panel is active first, in order to get its title %]
[% title = BLOCK %]
[% IF curpanel == -1 %]
Настройки: Выбор раздела
[% ELSE %]
Настройки:
[%+ current_panel.title FILTER html %]
[% END %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
message = message
style_urls = ['skins/standard/params.css']
javascript_urls = ['js/params.js', 'js/util.js']
doc_section = "parameters.html"
%]
<table border="0" width="100%">
<tr>
<td>
[%# NAVIGATION BAR %]
<table id="menu">
<tr>
<td class="index">
<a href="editparams.cgi?section=index" title="Все параметры">Выбор раздела</a>
</td>
</tr>
[% FOREACH panel = panels %]
<tr>
[% IF panel.current %]
[% Hook.process("current_panel") %]
<td class="selected_section">
<span title="[% panel.desc FILTER html %]">[% panel.title FILTER html %]</span>
</td>
[% ELSE %]
<td>
<a href="editparams.cgi?section=[% panel.name FILTER uri %]"
title="[% panel.desc FILTER html %]">[% panel.title FILTER html %]</a>
</td>
[% END %]
</tr>
[% END %]
</table>
</td>
<td>
[% IF curpanel == -1 %]
[% PROCESS admin/params/index.html.tmpl panels = panels %]
[% ELSE %]
<div class="contribute"><strong>Обратите внимание:</strong>
B[% %]ugzilla разработана добровольцами.
Лучший способ отблагодарить создателей B[% %]ugzilla --
<a href="http://www.bugzilla.org/contribute/">помочь проекту</a>
лично!
Для этого не обязательно быть программистом,
пригодятся самые разные умения и навыки.
</div>
<p>
Изменение параметров настройки [% terms.Bugzilla %].<br>
Внимание!
Установка "По умолчанию" на любом параметре приведет к потере его значения.
</p>
[%# CONTENT PANEL %]
<form method="post" action="editparams.cgi">
[% PROCESS admin/params/common.html.tmpl panel = current_panel %]
<input type="hidden" name="section" value="[% current_panel.name FILTER html %]">
<input type="hidden" name="action" value="save">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="save-params" value="Сохранить">
</form>
[% END %]
</td>
</tr>
</table>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Общие"
desc = "Разнообразные общие настройки, не требуемые для работы."
%]
[% param_descs = {
maintainer =>
"Адрес электронной почты администратора этого экземпляра "
_ " ${terms.Bugzilla}.",
docs_urlbase =>
"Адрес URL — общая часть всех адресов HTTP документации"
_ " этого экземпляра ${terms.Bugzilla}. Допустим абсолютный URL,"
_ " или относительно параметра <tt>urlbase</tt>. Если параметр"
_ " не указан, ссылки на документацию отключены."
_ " Строка '%lang%' заменяется на выбранный пользователем язык"
_ " (если документация на нем существует).",
utf8 =>
"Использовать кодировку UTF-8 (Unicode) для всех данных ${terms.Bugzilla}."
_ " Обязательно должен быть включен для вновь устанавливаемых баз данных"
_ " во избежание проблем. <strong>Для существующих БД устанавливать только"
_ " после конвертации данных из унаследованных кодировок"
_ " в UTF-8 при помощи скрипта <kbd>contrib/recode.pl</kbd></strong>."
_ " <p>При включении параметра обязателен запуск <kbd>checksetup.pl</kbd>"
_ " сразу после изменения значения.</p>"
_ " <strong>Включение параметра обязательно при использовании Bugzilla-ru.</strong>",
shutdownhtml =>
"Если это поле не пусто, доступ к $terms.Bugzilla полностью"
_ " запрещен и данный текст отображается при обращении к любой"
_ " странице ${terms.Bugzilla}.",
announcehtml =>
"Если это поле непусто, его содержимое отображается"
_ " вверху каждой страницы ${terms.Bugzilla}."
_ " HTML в этом поле не форматируется дополнительно,"
_ " для выделения рекомендуется использовать"
_ "<tt>&lt;div&gt;</tt>. Используйте <em>id=\"message\"</em> для получения"
_ " зеленого текста в красной рамке или <em>class=\"bz_private\"</em> для"
_ " темно-красного на красном фоне. Допускается использование любых стилей,"
_ " определенных в <tt>skins/standard/global.css</tt> или"
_ " <tt>skins/custom/global.css</tt>. Для размещения текста по центру используйте"
_ " <em>style=\"text-align: center;\"</em>.",
upgrade_notification =>
"Оповещения о доступности обновлений ${terms.Bugzilla}."
_ " Оповещение отображается на главной странице ${terms.Bugzilla},"
_ " только для администраторов."
_ " <ul><li>'development_snapshot' оповещает о выходе новых"
_ " нестабильных релизов для разработчиков.</li>"
_ " <li>'latest_stable_release' оповещает о выходе последних стабильных"
_ " версий самой свежей из стабильных ветвей. Эта ветвь может"
_ " не совпадать с используемой данным экземпляром ${terms.Bugzilla}.</li>"
_ " <li>'stable_branch_release' оповещает о выходе стабильных"
_ " версий, соответствующих ветви, используемой данным экземпляром ${terms.Bugzilla}."
_ " Если используется предварительный релиз, будут оповещения"
_ " о выходе новых предварительных релизов.</li>"
_ " <li>'disabled' не использовать оповещения и не устанавливать"
_ " связь с сервером обновлений.</li></ul>"
_ " <p>Обратите внимание, что если ваш сервер $terms.Bugzilla использует прокси"
_ " для доступа в Интернет, то вам может понадобиться установить параметр"
_ " <tt>proxy_url</tt> в разделе Дополнительно.</p>",
} %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Групповые права доступа"
desc = "Настройки разграничения доступа при помощи групп"
%]
[% param_descs = {
makeproductgroups => "Связать отдельную пользовательскую группу, с каждым продуктом " _
"${terms.Bugzilla} для управления видимостью ${terms.bugs_gen}.",
chartgroup => "Группа, пользователи которой имеют доступ к отчетам и диаграммам. " _
"Прежде чем разрешить доступ внешним пользователям, администратор " _
"должен убедиться, что общедоступные серии данных не дают возможности " _
"анализировать конфиденциальную информацию. При пустом значении " _
"параметра статистические диаграммы недоступны никому.",
insidergroup => "Группа, члены которой имеют доступ к конфиденциальным комментариям " _
"и приложениям.",
timetrackinggroup => "Группа, члены которой имеют доступ к данным " _
"учета рабочего времени.",
querysharegroup => "Группа, члены которой могут публиковать хранимые " _
"условия отбора для остальных.",
debug_group => "Группа, члены которой могут увидеть реальный SQL-запрос, " _
"сгенерированный при просмотре списков и отчетов ${terms.bug_gen}.",
usevisibilitygroups => "Ограничить доступ к списку пользователей определенными " _
"группами?",
strict_isolation => "Не разрешать назначение пользователя исполнителем, " _
"ответственным за приемку, " _
"подписку на изменение, " _
"создание и удаление зависимостей " _
"по любым ${terms.bugs_dat}, изменение которых " _
"данному пользователю недоступно.",
}
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
<p>
Ниже перечислены все настройки по группам.
Если настройки нет в списке, её не существует.
</p>
<div align="center">
<table>
<tr>
<th>Настройка</th>
<th>Группа</th>
</tr>
[% FOREACH panel = panels %]
[% FOREACH param = panel.param_list.sort('name') %]
<tr>
<td>
<a href="editparams.cgi?section=
[%- panel.name FILTER uri %]#[% param.name FILTER uri %]_desc">
[% param.name FILTER html %]</a>
</td>
<td>
[% panel.title FILTER html %]
</td>
</tr>
[% END %]
<tr>
<td>&nbsp;</td><td>&nbsp;</td>
</tr>
[% END %]
</table>
</div>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "LDAP"
desc = "Настройки, необходимые для использования аутентификации LDAP"
%]
[% param_descs = {
LDAPserver => "Имя (и, возможно, порт) сервера LDAP " _
"(например, ldap.company.com или ldap.company.com:portnum). " _
"Допускается использование синтаксиса URI, например "_
"ldaps://ldap.company.com (для безопасного соединения) или " _
"ldapi://%2fvar%2flib%2fldap_sock (для локального " _
"сокета). Несколько серверов или URI можно указать через " _
"запятую; они будут запрошены последовательно до получения " _
"успешного соединения.",
LDAPstarttls => "Использовать защищенный канал для связи с сервером " _
"LDAP.",
LDAPbinddn => "Если сервер LDAP требует иерархическое имя (binddn) и пароль " _
"и не поддерживает анонимный доступ, укажите их " _
"(например, cn=default,cn=user:password). " _
"Как правило анонимный доступ разрешен и поле можно оставить пустым.",
LDAPBaseDN => "База иерархического имени для поиска пользователей " _
"(например, ou=People,o=Company).",
LDAPuidattribute => "Имя атрибута, содержащего регистрационное имя пользователя.",
LDAPmailattribute => "Имя атрибута LDAP, содержащего адрес " _
"электронной почты пользователя. Если параметр " _
"не установлен, ${terms.Bugzilla} использует имя пользователя LDAP "_
" в качестве учетной записи ${terms.Bugzilla}. В этом случае " _
" потребуется настроить параметр \"emailsuffix\".",
LDAPfilter => "Фильтр LDAP, используемый через логическое И с атрибутом <tt>LDAPuidattribute</tt> " _
"для сужения списка разрешенных пользователей." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Электронная почта"
desc = "Настройки отправки электронной почты"
%]
[% param_descs = {
mail_delivery_method => "Определяет возможность и способ отправки электронной почты.<br>
<ul>
<li>
'Sendmail', 'SMTP' и 'Qmail': стандартные почтовые MTA.
Для использования sendmail под Windows потребуется установить отдельно
продукт, поддерживающий данный функционал.
</li>
<li>
'" _ get_choice("Test") _ "' используется для отладки: вся исходящая почта
вместо отправки сохраняется в 'data/mailer.testfile'.
</li>
<li>
'" _ get_choice("None") _ "': запретить использование электронной почты полностью. $terms.Bugzilla
продолжает работать и выдавать сообщения об отправке, но фактически ничего
не отправляется и не сохраняется.
</li>
</ul>",
mailfrom => "Адрес электронной почты экземпляра ${terms.Bugzilla}. Некоторые почтовые " _
"системы требуют, чтобы этот адрес был исправен.",
use_mailer_queue => "В больших базах данных $terms.Bugzilla сохранение"
_ " изменений ${terms.bugs_gen} замедляется отправкой большого количества"
_ " сообщений. Этот параметр включает функцию постановки сообщений"
_ " в очередь для рассылки в фоновом режиме. Это требует"
_ " установки дополнительных модулей Perl (список приведен"
_ " в соответствующем разделе <kbd>checksetup.pl</kbd>), и запуска"
_ " по расписанию демона <code>jobqueue.pl</code> (в противном случае"
_ " сообщения не будут отправлены). Очередь действует для всех сообщений $terms.Bugzilla,"
_ " не только изменений ${terms.bugs_gen}.",
smtpserver => "Адрес сервера SMTP (при использовании метода 'SMTP' для отправки).",
smtp_username => "Имя пользователя для аутентификации на сервере SMTP. " _
"Не заполняйте это поле если сервер SMTP не требует аутентификации.",
smtp_password => "Пароль для аутентификации на сервере SMTP. " _
"Значение поля игнорируется если не установлен параметр smtp_username.",
smtp_ssl => "Включить поддержку SSL для SMTP.",
smtp_debug => "Печать детальной информации об обмене terms.Bugzilla с " _
"сервером SMTP в журнал ошибок веб-сервера. " _
"Используется для диагностики проблем отправки сообщений.",
whinedays => "Количество дней, которые $terms.bug может находиться без движения в " _
"состоянии 'Подтверждённая' до начала автоматического оповещения владельцу.<br> " _
"Для отключения функции установите значение 0.",
globalwatchers => "Список пользователей через запятую. Члены списка получат " _
"копии всех сообщений, отправляемых системой." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Просмотр патчей"
desc = "Настройки внешних приложений для работы с патчами"
%]
[% param_descs = {
cvsroot => "Корень сервера <a href=\"http://www.cvshome.org\">CVS</a> " _
"для вызова 'cvs diff'. Используется при просмотре патча " _
"(функция 'Сравнить') для определения абсолютных путей " _
"даже если пользователи использовали относительные при " _
"генерации патча. (Примечание: если репозиторий CVS находится " _
"в сети и требует пароля для доступа, следует убедиться что " _
"с сервера $terms.Bugzilla выполнен'cvs login' или " _
"явно указать пароль " _
"<a href=\"http://www.cvshome.org/docs/manual/cvs_2.html#SEC26\">как " _
"часть пути к репозиторию CVS</a>.) Оставьте поле пустым если " _
"CVS не используется.",
cvsroot_get => "Корень сервера CVS, который $terms.Bugzilla использует для " _
"получения патчей. Для некоторых площадок создаются отдельные " _
"копии репозитория CVS, иногда локально на сервере $terms.Bugzilla " _
"для ускорения его работы. " _
"Если копирование репозитория не используется, установите значение, " _
"совпадающее с cvsroot (и оставьте пустым, если cvsroot пусто).",
bonsai_url => "Адрес URL сервера <a href=\"http://www.mozilla.org/bonsai.html\">Bonsai</a> " _
"с информацией о данном репозитории CVS. " _
"Адрес используется при просмотре патча для генерации ссылок " _
"на авторство разделов патча (добавлением " _
"'/cvsblame.cgi?...' к данному URL). Оставьте поле пустым если " _
"Bonsai не используется.",
lxr_url => "Адрес URL сервера <a href=\"http://sourceforge.net/projects/lxr\">LXR</a> " _
"для данного репозитория CVS. Адрес используется для генерации ссылок " _
"на LXR для каждого файла, упомянутого в патче. " _
"Оставьте поле пустым если LXR не используется.",
lxr_root => "Некоторые серверы LXR индексируют репозитории CVS не от корня — " _
"например, для <a href=\"http://lxr.mozilla.org/mozilla\">Mozilla</a> " _
"сервер просматривает только путь <code>mozilla/</code>. Это указывает " _
"что адреса URL строятся относительно этого пути. " _
"Оставьте поле пустым если сервер LXR индексирует от корня CVS " _
"или LXR не используется." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Настройки поиска"
desc = "Настройки по умолчанию для поиска и списка ${terms.bugs_gen}"
%]
[% param_descs = {
quip_list_entry_control => "Управление доступом к списку цитат.
<ul>
<li>
open - Пользователи могут добавлять цитаты в список, и эти
записи немедленно могут быть показаны.
</li>
<li>
moderated - Добавление цитат разрешено, но требуется
утверждение модератора для показа.
</li>
<li>
closed - Добавление цитат не допускается.
</li>
</ul>",
mostfreqthreshold => "Минимальное количество дублей ${terms.bug_gen} для включения ее в список " _
"<a href=\"duplicates.cgi\">наиболее часто регистрируемых ${terms.bugs_gen}</a>. " _
"В большой базе данных при долгой загрузке этой страницы рекомендуется " _
"увеличить это значение.",
mybugstemplate => "Адрес URL для получения списка 'всех ${terms.bugs_gen} пользователя'. " _
"%userid% будет заменен на учетную запись пользователя.",
defaultquery => "Запрос по умолчанию, составляющий страницу расширенного поиска. " _
"Увы, он в формате URL и не вполне " _
"удобен для чтения.",
search_allow_no_criteria =>
"За исключением случая, когда код явно разрешает показ всех $terms.bugs_gen, этот " _
"параметр разрешает блокировать выполнение запросов, не имеющих критериев. " _
"Когда он отключен, для запроса должен быть указан какой-либо критерий, ограничивающий " _
"количество $terms.bugs_gen, показываемых пользователю. Когда он включен, пользователь " _
"может выполнять запрос, не указывая критериев, и видеть список всех $terms.bugs_gen, к " _
"которым он допущен. Включение этого параметра не рекомендуется на больших " _
"инсталляциях.",
default_search_limit =>
"По умолчанию, $terms.Bugzilla ограничивает кол-во результатов поиска, "
_ " произведённого через веб-интерфейс, этим числом, по причинам"
_ " производительности. (Это влияет только на HTML-формат результатов поиска -- на "
_ " CSV, XML и другие форматы это не влияет). Пользователи могут щёлкнуть "
_ " по ссылке на странице результатов поиска, чтобы увидеть все результаты."
_ "<p>Обычно вам не надо это менять - значение по умолчанию"
_ " должно быть приемлемо для большинства инсталляций.</p>",
max_search_results =>
"Максимальное число $terms.bugs_gen, которые <strong>в принципе</strong>"
_ " можно отобразить на странице результатов поиска. Это ограничение не влияет на"
_ " графические и табличные отчеты.",
} %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "RADIUS"
desc = "Настройки, необходимые для использования аутентификации RADIUS"
%]
[% param_descs = {
RADIUS_server => "Имя (и, возможно, порт) сервера RADIUS " _
"(например, <code>radius.company.com</code>, или " _
"<code>radius.company.com:portnum</code>).<br>" _
"Обязателен, если " _
"<a href=\"?section=auth#user_verify_class_desc\">параметр " _
"<code>user_verify_class</code></a> включает в себя " _
"<code>RADIUS</code>.",
RADIUS_secret => "Пароль на сервере RADIUS.<br>" _
"Обязателен, если " _
"<a href=\"?section=auth#user_verify_class_desc\">параметр " _
"<code>user_verify_class</code></a> включает в себя " _
"<code>RADIUS</code>.",
RADIUS_NAS_IP => "Атрибут NAS-IP-Address, используемый в обмене данными " _
"с сервером RADIUS. " _
"По умолчанию используется <code>127.0.0.1</code>.<br>" _
"Параметр имеет смысл, если " _
"<a href=\"?section=auth#user_verify_class_desc\">параметр " _
"<code>user_verify_class</code></a> включает в себя " _
"<code>RADIUS</code>.",
RADIUS_email_suffix => "Суффикс, добавляемый к имени пользователя RADIUS для " _
"формирования адреса электронной почты.<br>" _
"Параметр имеет смысл, если " _
"<a href=\"?section=auth#user_verify_class_desc\">параметр " _
"<code>user_verify_class</code></a> включает в себя " _
"<code>RADIUS</code>.",
}
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Теневая база данных"
desc = "Необязательная функция для повышения производительности базы данных"
%]
[% param_descs = {
shadowdbhost => "Хост, на котором расположена теневая база данных.",
shadowdbport => "Порт теневой базы данных. Игнорируется, если не настроен " _
"<tt>shadowdbhost</tt>. Примечание: при локальном размещении " _
"теневой БД, MySQL игнорирует значение настройки, поэтому следует " _
"явно указывать <tt>shadowdbsock</tt>.",
shadowdbsock => "Имя сокета для подключения к теневой базе данных на " _
"локальной системе. Настройка является обязательной, поскольку " _
"MySQL игнорирует указанный клиентом порт и использует заданный " _
"при компиляции путь до сокета (в системах Unix) для соединения " _
"с локальным сервером. Если значение не указано и база данных " _
"расположена локально, значение <tt>shadowdbport</tt> " _
"игнорируется.",
shadowdb => "Имя теневой базы данных, которая используется $terms.Bugzilla " _
"как копия фактической базы, только для чтения. " _
"Используется для переноса нагрузки медленных и сложных запросов " _
"на чтение и повышения скорости работы основной БД. Данная БД " _
"находится на <tt>shadowdbhost</tt>, и должна существовать. " _
"$terms.Bugzilla не обновляет ее, при использовании этих параметров " _
"требуется настройка репликации MySQL." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%
title = "Выбор пользователей"
desc = "Настройка функций выбора пользователей"
%]
[% param_descs = {
usemenuforusers => "Использование списков выбора везде где требуется " _
"указание пользователя (вместо текстовых полей). " _
"Не включайте эту возможность в базах данных с большим " _
"количеством пользователей.",
ajax_user_autocompletion => "При наборе текста в определенных пользовательских " _
"полях будет отображаться список совпадений, из " _
"которого можно сделать выбор.",
maxusermatches => "Лимит количества пользователей, соответствующих выражению поиска.<br> " _
"Если установлено значение '1', для выражений поиска с неоднозначным " _
"результатом не отображается ничего. Используется для сохранения " _
"в секрете адресов.<br> Нулевое значение отключает лимит.",
confirmuniqueusermatch => "Запрашивать ли подтверждение, если введенное выражение " _
"соответствует ровно одному пользователю." }
%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: Bugzilla::Product object; The product
#
# (classification fields available if Param('useclassification') is enabled:)
#
# classification: Bugzilla::Classification object; The classification
# the product is in
#
#%]
[% title = BLOCK %]Удаление продукта '[% product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
[% IF Param('useclassification') %]
<tr>
<td>Раздел:</td>
<td>[% classification.name FILTER html %]</td>
</tr>
<tr>
<td>Описание раздела:</td>
[%# descriptions are intentionally not filtered to allow html content %]
<td>
[% IF classification.description %]
[% classification.description FILTER html_light %]
[% ELSE %]
<span style="color: red">отсутствует</span>
[% END %]
</td>
</tr>
[% END %]
<tr>
<td valign="top">Продукт:</td>
<td valign="top">
<a href="editproducts.cgi?product=[% product.name FILTER uri %]">
[% product.name FILTER html %]
</a>
</td>
</tr>
<tr>
<td valign="top">Описание:</td>
[%# descriptions are intentionally not filtered to allow html content %]
<td valign="top">
[% IF product.description %]
[% product.description FILTER html_light %]
[% ELSE %]
<span style="color: red">отсутствует</span>
[% END %]
</td>
</tr>
[% IF Param('usetargetmilestone') %]
<tr>
<td>Ссылка на план:</td>
<td>
[% IF product.milestone_url %]
<a href="[% product.milestone_url FILTER html %]">
[%- product.milestone_url FILTER html %]
</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
[% END %]
<tr>
<td>Закрыт для регистрации [% terms.bugs_gen %]:</td>
<td>
[% IF product.is_active %]
открыт
[% ELSE %]
закрыт
[% END %]
</td>
</tr>
<tr>
<td>
[% IF product.components.size > 0 %]
<a href="editcomponents.cgi?product=[% product.name FILTER uri %]"
title="Компоненты продукта '[% product.name FILTER html %]'">
Компоненты:
</a>
[% ELSE %]
Компоненты:
[% END %]
</td>
<td>
[% IF product.components.size > 0 %]
<table>
[% FOREACH c = product.components %]
<tr>
<th align="right">[% c.name FILTER html %]:</th>
[%# descriptions are intentionally not filtered to allow html content %]
<td>
[% IF c.description %]
[% c.description FILTER html_light %]
[% ELSE %]
<span style="color: red">отсутствует</span>
[% END %]
</td>
</tr>
[% END %]
</table>
[% ELSE %]
нет
[% END %]
</td>
</tr>
<tr>
<td>
[% IF product.versions.size > 0 %]
<a href="editversions.cgi?product=[%- product.name FILTER uri %]">
Версии:
</a>
[% ELSE %]
Версии:
[% END %]
</td>
<td>
[% IF product.versions.size > 0 %]
[% FOREACH v = product.versions %]
[% v.name FILTER html %]<br>
[% END %]
[% ELSE %]
нет
[% END %]
</td>
</tr>
[% IF Param('usetargetmilestone') %]
<tr>
<td valign="top">
[% IF product.milestones.size > 0 %]
<a href="editmilestones.cgi?product=[%- product.name FILTER uri %]">
Планы:
</a>
[% ELSE %]
Планы:
[% END %]
</td>
<td>
[% IF product.milestones.size > 0 %]
[% FOREACH m = product.milestones %]
[% m.name FILTER html %]<br>
[% END %]
[% ELSE %]
нет
[% END %]
</td>
</tr>
[% END %]
<tr>
<td>[% terms.Bugs %]:</td>
<td>
[% IF product.bug_count %]
<a href="buglist.cgi?product=[% product.name FILTER uri %]"
title="Список [% terms.bugs_gen %] продукта '[% product.name FILTER html %]'">
[% product.bug_count FILTER html %]
</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
</table>
<h2>Подтверждение</h2>
[% IF product.bug_count %]
[% IF !Param("allowbugdeletion") %]
<p class="confirmation">Для данного продукта в базе данных
[% numeral(product.bug_count,
"зарегистрирована ${product.bug_count} ${terms.bug}",
"зарегистрировано ${product.bug_count} ${terms.bug_gen}",
"зарегистрировано ${product.bug_count} ${terms.bugs_gen}")
FILTER html -%].
Без переноса [%+ terms.bugs_gen %]
в другой продукт удаление этого продукта невозможно.</p>
[% ELSE %]
<table border="0" cellpadding="20" width="70%" bgcolor="red">
<tr>
<td>
Для данного продукта в базе данных
[% numeral(product.bug_count,
"зарегистрирована ${product.bug_count} ${terms.bug}",
"зарегистрировано ${product.bug_count} ${terms.bug_gen}",
"зарегистрировано ${product.bug_count} ${terms.bugs_gen}")
FILTER html -%]! Удаление продукта
<b>ПРИВЕДЕТ К ПОТЕРЕ</b> всей информации об этих
[%+ terms.bugs_obj %].
</td>
</tr>
</table>
[% END %]
[% END %]
[% Hook.process("confirmation") %]
[% IF product.bug_count == 0 || Param('allowbugdeletion') %]
<p>Вы действительно хотите удалить продукт?</p>
<form method="post" action="editproducts.cgi">
<input type="checkbox" id="delete_series" name="delete_series" value=1>
<label for="delete_series">
Удалить все связанные серии (вы также можете удалить их позже, посетив
<a href="chart.cgi?category=[% product.name FILTER html %]">страницу Новых графиков</a>.)
</label><p>
<input type="submit" id="delete" value="Да, удалить">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% END %]
[% PROCESS admin/products/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# classification: Bugzilla::Classification object; If classifications
# are enabled, then this is
# the currently selected classification
#
#%]
[% title = BLOCK %]Создание продукта[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
javascript_urls = ['js/util.js', 'js/field.js']
yui = [ 'autocomplete' ]
%]
[% DEFAULT
product.is_active = 1,
version = "не указана",
product.defaultmilestone = constants.DEFAULT_MILESTONE
product.allows_unconfirmed = 1
%]
<form method="post" action="editproducts.cgi">
<table border="0" cellpadding="4" cellspacing="0">
[% PROCESS "admin/products/edit-common.html.tmpl" %]
<tr>
<th align="right">Версия:</th>
<td><input size="20" maxlength="64" name="version"
value="[% version FILTER html %]">
</td>
</tr>
<tr>
<th align="right">Создать наборы данных для диаграмм:</th>
<td>
<input type="checkbox" name="createseries" value="1" checked="checked">
</td>
</tr>
<tr>
<td colspan="2">&nbsp;</td>
</tr>
<tr>
<td colspan="2">
Этот продукт должен иметь по меньшей мере один компонент.
Вы сможете создать дополнительные компоненты позже:
</td>
</tr>
[% PROCESS "admin/components/edit-common.html.tmpl" desc_name = "comp_desc" %]
</table>
<input type="submit" id="add-product" value="Создать">
<input type="hidden" name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="hidden" name="classification"
value="[% classification.name FILTER html %]">
</form>
[% PROCESS "admin/products/footer.html.tmpl"
no_add_product_link = 1
no_edit_product_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: Bugzilla::Product object; The product
#
# classification: Bugzilla::Classifiation object; classification product is in.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% IF Param('useclassification') %]
<tr>
<th align="right">Раздел:</th>
<td><b>[% classification.name FILTER html %]</b></td>
</tr>
[% END %]
<tr>
<th align="right">Продукт:</th>
<td><input size="64" maxlength="64" name="product"
value="[% product.name FILTER html %]">
</td>
</tr>
<tr>
<th align="right">Описание:</th>
<td><textarea rows="4" cols="64" wrap="virtual" name="description">
[% product.description FILTER html %]</textarea>
</td>
</tr>
<tr>
<th align="right">Открыт для регистрации [% terms.bugs_gen %]:</th>
<td><input type="checkbox" name="is_active" value="1"
[% ' checked="checked"' IF product.is_active %]>
</td>
</tr>
<tr>
<th align="right">
<label for="allows_unconfirmed">Включить статус
[%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %]
в этом продукте:</label>
</th>
<td><input type="checkbox" id="allows_unconfirmed" name="allows_unconfirmed"
[% ' checked="checked"' IF product.allows_unconfirmed %]>
</td>
</tr>
[% IF Param('usetargetmilestone') -%]
<tr>
<th align="right">План по умолчанию:</th>
<td>
[% IF product.milestones.size %]
<select name="defaultmilestone">
[% FOREACH m = product.milestones %]
<option value="[% m.name FILTER html %]"
[% " selected=\"selected\"" IF m.name == product.defaultmilestone %]>
[%- m.name FILTER html -%]</option>
[% END %]
</select>
[% ELSE %]
<input type="text" size="64" maxlength="64" name="defaultmilestone"
value="[% product.defaultmilestone FILTER html %]">
[% END %]
</td>
</tr>
[% END %]
[% Hook.process('rows') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: Bugzilla::Product object; The product
#
# (classification fields available if Param('useclassification') is enabled:)
#
# classification: Bugzilla::Classification object; The classification
# the product is in
#%]
[% title = BLOCK %]Изменение продукта '[% product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
javascript_urls = ['js/util.js']
%]
[% group_control = {${constants.CONTROLMAPNA} => 'Запрещено',
${constants.CONTROLMAPSHOWN} => 'Разрешено',
${constants.CONTROLMAPDEFAULT} => 'Включено',
${constants.CONTROLMAPMANDATORY} => 'Обязательно'}
%]
<form method="post" action="editproducts.cgi">
<table border="0" cellpadding="4" cellspacing="0">
[% PROCESS "admin/products/edit-common.html.tmpl" %]
<tr>
<th align="right" valign="top">
<a href="editcomponents.cgi?product=[% product.name FILTER uri %]">
Изменить компоненты:
</a>
</th>
<td>
[% IF product.components.size -%]
[% FOREACH component = product.components %]
<a href="editcomponents.cgi?action=edit&product=
[%- product.name FILTER uri %]&component=
[%- component.name FILTER uri %]">[% component.name FILTER html %]</a>:&nbsp;
[% IF component.description %]
[% component.description FILTER html_light %]
[% ELSE %]
<font color="red">описание отсутствует</font>
[% END %]
<br>
[% END %]
[% ELSE %]
<font color="red">отсутствуют</font>
[% END %]
</td>
</tr>
<tr>
<th align="right" valign="top">
<a href="editversions.cgi?product=[% product.name FILTER uri %]">Изменить
версии:</a>
</th>
<td>
[%- IF product.versions.size -%]
[% FOREACH v = product.versions %]
[% v.name FILTER html %]
<br>
[% END %]
[% ELSE %]
<font color="red">отсутствуют</font>
[% END %]
</td>
</tr>
[% IF Param('usetargetmilestone') %]
<tr>
<th align="right" valign="top">
<a href="editmilestones.cgi?product=[% product.name FILTER uri %]">
Изменить планы:</a>
</th>
<td>
[%- IF product.milestones.size -%]
[%- FOREACH m = product.milestones -%]
[% m.name FILTER html %]
<br>
[% END %]
[% ELSE %]
<font color="red">отсутствуют</font>
[% END %]
</td>
</tr>
[% END %]
<tr>
<th align="right" valign="top">
<a href="editproducts.cgi?action=editgroupcontrols&product=
[%- product.name FILTER uri %]">
Права доступа по группам:
</a>
</th>
<td>
[% IF product.group_controls.size %]
[% FOREACH g = product.group_controls.values.sort("name") %]
<b>[% g.group.name FILTER html %]:</b>&nbsp;
[% IF g.group.isactive %]
[% group_control.${g.membercontrol} FILTER html %]/
[% group_control.${g.othercontrol} FILTER html %]
[% IF g.entry %], Создание[% END %]
[% IF g.canedit %], Редакторы[% END %]
[% IF g.editcomponents %], Компоненты[% END %]
[% IF g.canconfirm %], Подтверждение[% END %]
[% IF g.editbugs %], Редактировать любые ошибки[% END %]
[% ELSE %]
НЕАКТИВНА
[% END %]
<br>
[% END %]
[% ELSE %]
отсутствуют
[% END %]
</td>
</tr>
<tr>
<th align="right">[% terms.Bugs_gen %]:</th>
<td><a href="buglist.cgi?product=[% product.name FILTER uri %]">
[% product.bug_count FILTER html %]</a></td>
</tr>
</table>
<input type="hidden" name="product_old_name"
value="[% product.name FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update-product" value="Сохранить изменения">
</form>
[% PROCESS "admin/products/footer.html.tmpl"
no_add_product_link = 1
no_edit_product_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: Bugzilla::Product Object; the product
#
# classification: Bugzilla::Classification object ; If classifications
# are enabled, then this is the currently
# selected classification
#
# no_XXX_link: boolean; if defined, then don't show the corresponding
# link. Supported parameters are:
#
# no_edit_product_link
# no_edit_other_products_link
# no_add_product_link
#%]
[% IF Param('useclassification') && classification %]
[% classification_url_part = BLOCK %]&amp;classification=
[%- classification.name FILTER uri %]
[% END %]
[% classification_url_part_start = BLOCK %]classification=
[%- classification.name FILTER uri %]
[% END %]
[% classification_text = BLOCK %]
раздела '[% classification.name FILTER html %]'
[% END %]
[% END %]
<hr>
<p>
[% UNLESS no_add_product_link || !user.in_group("editcomponents") %]
<a title="Создать продукт"
href="editproducts.cgi?action=add">Создать</a> продукт[% -%]
[%# Strictly speaking, we should not have to check for a
classification if they are enabled, but I'm just being paranoid %]
[% IF Param('useclassification') && classification %]
(<a title="Создать продукт в разделе '
[%- classification.name FILTER html %]'"
href="editproducts.cgi?action=add
[%- classification_url_part %]">в
разделе '[% classification.name FILTER html %]'</a>)
[% END %].
[% END %]
[% IF product && !no_edit_product_link %]
Изменить продукт <a
title="Изменить продукт '[% product.name FILTER html %]'
[%- classification_text %]"
href="editproducts.cgi?action=edit&amp;product=[% product.name FILTER uri %]">
'[% product.name FILTER html %]'</a>.
[% END %]
[%# Edit other products (in a classification if specified): %]
[% UNLESS no_edit_other_products_link %]
Изменить <a
href="editproducts.cgi?
[%- classification_url_part_start FILTER none %]">другие продукты
[% classification_text %]</a>.
[% END %]
[% IF Param('useclassification') && classification
&& user.in_group('editclassifications') %]
Изменить раздел <a href="editclassifications.cgi?action=edit
[%- classification_url_part %]">'
[%- classification.name FILTER html %]'</a>.
[% END %]
</p>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Подтвердите смену группы, сопоставленной продукту '[%- product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl title = title %]
[% FOREACH group = mandatory_groups %]
<P>
Для [% group.count %]&nbsp;[% terms.bugs_gen %] группа '[% group.name FILTER html %]'
с этого момента является обязательной и будет добавлена к списку групп каждой [% terms.bug_gen %].
[% END %]
[% FOREACH group = na_groups %]
<P>
Для [% group.count %]&nbsp;[% terms.bugs_gen %] группа '[% group.name FILTER html %]'
с этого момента неприменима и будет удалена из списка групп каждой [% terms.bug_gen %].
[% END %]
<form action="editproducts.cgi" method="post" >
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
<br>
Нажмите "Сохранить", чтобы произвести действия, указанные выше.
Если вы не хотите этого, нажмите "Назад", чтобы вернуться на предыдущую
страницу.
<p>
<input type="hidden" name="confirmed" value="confirmed">
<input type="submit" id="update" value="Сохранить">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Управление доступом к продукту [% product.name FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% display_headers = 1 %]
[% FOREACH group = product.group_controls(1).values.sort("name") %]
[% NEXT UNLESS group.group.isactive OR group.bug_count %]
[% IF display_headers %]
[% display_headers = 0 %]
<form method="post" action="editproducts.cgi">
<input type="hidden" name="action" value="updategroupcontrols">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<table id="form" cellspacing="0" cellpadding="4" border="1">
<tr bgcolor="#6666ff">
<th>Группа</th>
<th>Создание</th>
<th>Для группы</th>
<th>Для остальных</th>
<th>Редакторы</th>
<th>Компоненты</th>
<th>Подтверждение</th>
<th>Редактировать любые [% terms.bugs %]</th>
</tr>
[% END %]
[% IF !group.group.isactive %]
<tr bgcolor="#bbbbbb">
<td>[% group.group.name FILTER html %]</td>
<td align="center" colspan="7">Закрыта</td>
<td>[% group.bug_count FILTER html %]</td>
</tr>
[% ELSE %]
<tr>
<td>[% group.group.name FILTER html %]</td>
<td>
<input type=checkbox value=1 name=entry_[% group.id %]
[% " checked='checked'" IF group.entry %]>
</td>
<td>
<select name="membercontrol_[% group.id %]">
<option value=[% constants.CONTROLMAPNA %]
[% " selected='selected'" IF group.membercontrol == constants.CONTROLMAPNA %]
>Запрещено
</option>
<option value=[% constants.CONTROLMAPSHOWN %]
[% " selected='selected'" IF group.membercontrol == constants.CONTROLMAPSHOWN %]
>Разрешено
</option>
<option value=[% constants.CONTROLMAPDEFAULT %]
[% " selected='selected'" IF group.membercontrol == constants.CONTROLMAPDEFAULT %]
>Включено
</option>
<option value=[% constants.CONTROLMAPMANDATORY %]
[% " selected='selected'" IF group.membercontrol == constants.CONTROLMAPMANDATORY %]
>Обязательно
</option>
</select>
</td>
<td>
<select name="othercontrol_[% group.id %]">
<option value=[% constants.CONTROLMAPNA %]
[% " selected='selected'" IF group.othercontrol == constants.CONTROLMAPNA %]
>Запрещено
</option>
<option value=[% constants.CONTROLMAPSHOWN %]
[% " selected='selected'" IF group.othercontrol == constants.CONTROLMAPSHOWN %]
>Разрешено
</option>
<option value=[% constants.CONTROLMAPDEFAULT %]
[% " selected='selected'" IF group.othercontrol == constants.CONTROLMAPDEFAULT %]
>Включено
</option>
<option value=[% constants.CONTROLMAPMANDATORY %]
[% " selected='selected'" IF group.othercontrol == constants.CONTROLMAPMANDATORY %]
>Обязательно
</option>
</select>
</td>
<td>
<input type=checkbox value=1 name=canedit_[% group.id %]
[% " checked='checked'" IF group.canedit %]>
</td>
<td>
<input type=checkbox value=1 name=editcomponents_[% group.id %]
[% " checked='checked'" IF group.editcomponents %]>
</td>
<td>
<input type=checkbox value=1 name=canconfirm_[% group.id %]
[% " checked='checked'" IF group.canconfirm %]>
</td>
<td>
<input type=checkbox value=1 name=editbugs_[% group.id %]
[% " checked='checked'" IF group.editbugs %]>
</td>
<td>[% group.bug_count || 0 FILTER html %]</td>
</tr>
[% END %]
[% END %]
[% IF display_headers %]
<p>Для продуктов не доступно ни одной группы.
[% IF user.in_group('creategroups') %]
<a href="editgroups.cgi?action=add">Создать новую группу</a>
[% END %]
</p>
[% ELSE %]
</table>
<br>
<input type=submit name="submit" value="Сохранить">
</form>
[% END %]
<p>
Эти параметры регулируют отношение различных групп пользователей к данному
продукту.
</p>
<p>
Если для некоторых групп отмечен флажок <b>Создание</b>, регистрация
[% terms.bugs_gen %] для этого продукта разрешена только участникам
всех отмеченных групп.
</p>
<p>
Если для некоторых групп отмечен флажок <b>Редакторы</b>, изменение
[% terms.bugs_gen %] для этого продукта разрешено только участникам
всех отмеченных групп. Остальным [% terms.bugs %] будут доступны
только для чтения.
</p>
<p>
Следующие настройки позволяют регулировать доступ <b>на уровне продукта</b>.
Это удобный способ предоставления пользователю привилегий на отдельные
продукты, без использования глобальных привилегий, действующих на все
продукты:
</p>
<p>
Установка флажка <b>Компоненты</b> позволит членам группы
изменять все атрибуты продукта, включая компоненты,
планы и версии.
</p>
<p>
Установка флажка <b>Подтверждение</b> позволит членам группы
подтверждать [% terms.bugs %] в этом продукте.
</p>
<p>
Установка флажка <b>Редактировать любые [% terms.bugs %]</b> позволит членам группы
изменять любые поля в [% terms.bugs_obj %] этого продукта.
</p>
<p>
Поля <b>Для группы</b> и <b>Для остальных</b> управляют
связью [% terms.bugs_gen %] и группы по следующим правилам.
</p>
<table border=1>
<tr>
<th>
Для группы
</th>
<th>
Для остальных
</th>
<th>
Результат
</th>
</tr>
<tr>
<td>
Запрещено
</td>
<td>
Запрещено
</td>
<td>
[% terms.Bugs %] этого продукта не могут быть связаны с этой группой.
</td>
</tr>
<tr>
<td>
Разрешено
</td>
<td>
Запрещено
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой.
Только участникам группы разрешено связывать [% terms.bugs %] с ней.
</td>
</tr>
<tr>
<td>
Разрешено
</td>
<td>
Разрешено
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой
любым пользователем, имеющим доступ к изменению [% terms.bug_gen %].
</td>
</tr>
<tr>
<td>
Разрешено
</td>
<td>
Включено
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой
любым пользователем, имеющим доступ к изменению [% terms.bug_gen %].
Для остальных [% terms.bug %] связана с группой при создании.
</td>
</tr>
<tr>
<td>
Разрешено
</td>
<td>
Обязательно
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой.
Участникам группы разрешено связывать [% terms.bugs %] с ней.
Для остальных [% terms.bug %] принудительно связана с группой при создании.
</td>
</tr>
<tr>
<td>
Включено
</td>
<td>
Запрещено
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой и
связаны по умолчанию при создании.
Только участникам группы разрешено связывать [% terms.bugs %] с ней.
</td>
</tr>
<tr>
<td>
Включено
</td>
<td>
Включено
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой и
связаны по умолчанию при создании.
Участникам группы разрешено связывать [% terms.bugs %] с ней.
Всем пользователям разрешено ограничивать видимость [% terms.bugs_gen %] этой группой.
</td>
</tr>
<tr>
<td>
Включено
</td>
<td>
Обязательно
</td>
<td>
[% terms.Bugs %] этого продукта могут быть связаны с этой группой и
связаны по умолчанию при создании.
Участникам группы разрешено связывать [% terms.bugs %] с ней.
Для остальных [% terms.bug %] принудительно связана с группой при создании.
</td>
</tr>
<tr>
<td>
Обязательно
</td>
<td>
Обязательно
</td>
<td>
[% terms.Bugs %] этого продукта всегда связаны с этой группой.
Пользователи не могут это изменить.
</td>
</tr>
</table>
<p>
Обратите внимание на допустимые комбинации значений полей
<b>Для группы</b> и <b>Для остальных</b>. Попытка использовать другие
варианты (например, Обязательно/Запрещено, Включено/Разрешено, etc.)
приведет к ошибке.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: Bugzilla::Product object; the product.
# changes: Hashref with changes made to the product group controls.
#%]
[% title = BLOCK %]
Изменения доступа к продукту [% product.name FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
<p>
[% IF changes._group_controls.now_na.size %]
[% FOREACH g = changes._group_controls.now_na %]
Исключение [% terms.bugs_gen %] из группы '[% g.name FILTER html %]',
более не сопоставленной продукту<p>
[% g.bug_count FILTER html %]
[%+ numeral(g.bug_count,
"${terms.bug} исключена",
"${terms.bug_gen} исключено",
"${terms.bugs_gen} исключено")
FILTER html %]<p>
[% END %]
[% END %]
[% IF changes._group_controls.now_mandatory.size %]
[% FOREACH g = changes._group_controls.now_mandatory %]
Включение [% terms.bugs_gen %] в обязательную для продукта
группу '[% g.name FILTER html %]'<p>
[% g.bug_count FILTER html %]
[%+ numeral(g.bug_count,
"${terms.bug} включена",
"${terms.bug_gen} включено",
"${terms.bugs_gen} включено")
FILTER html %]<p>
[% END %]
[% END %]
Параметры управления доступом изменены<p>
[% PROCESS admin/products/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# classifications: array of hashes having the following properties:
# - name: string; The name of the classification
# - description: string; The classification description (html allowed)
# - product_count: number; The number of products in this classification
#
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите раздел"
%]
[% columns = [
{
name => "name"
heading => "Продукты в..."
contentlink => 'editproducts.cgi?classification=%%name%%'
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
},
{
name => "product_count"
align => "right"
heading => "Продуктов"
}
]
%]
[% IF user.in_group('editcomponents') %]
[% columns.push({
heading => "Действие..."
content => "Добавить продукт"
contentlink => 'editproducts.cgi?action=add&amp;classification=%%name%%' })
%]
[% END %]
[% Hook.process('before_table') %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = classifications
%]
[%# No need for the standard edit products footer, as we have an 'add'
link in the table %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# products: array of Bugzilla::Product objects
#
# classification: Bugzilla::Classification object; If classifications
# are enabled, then this is
# the currently selected classification
# showbugcounts: boolean; true if bug counts should be included in the table
#%]
[% PROCESS global/variables.none.tmpl %]
[% IF classification %]
[% classification_url_part = BLOCK %]&amp;classification=
[%- classification.name FILTER uri %]
[%- END %]
[% classification_title = BLOCK %]
в разделе '[% classification.name FILTER html %]'
[% END %]
[% END %]
[% PROCESS global/header.html.tmpl
title = "Выберите продукт $classification_title"
%]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => 'editproducts.cgi?action=edit&amp;product=%%name%%'
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
},
{
name => "is_active"
heading => "Открыт для регистрации $terms.bugs_gen"
yesno_field => 1
},
] %]
[% IF showbugcounts %]
[% columns.push({
name => "bug_count"
heading => "$terms.Bugs_gen"
align => 'right'
contentlink => 'buglist.cgi?product=%%name%%'
})
%]
[% END %]
[% columns.push({
heading => "Действие"
content => "Удалить"
contentlink => 'editproducts.cgi?action=del&amp;product=%%name%%'
})
%]
[% Hook.process('before_table') %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = products
%]
[% IF !showbugcounts %]
<p><a href="editproducts.cgi?showbugcounts=1[% classification_url_part %]">
Показать счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS admin/products/footer.html.tmpl
no_edit_other_products_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product : Bugzilla::Product Object; new product.
# classification: Bugzilla::Classification Object; The product classification (may be empty or missing)
# changes: hashref with all changes made to the product. Each key is an edited field,
# and its value is an arrayref of the form [old values, new values].
#%]
[% IF classification %]
[% classification_text = BLOCK %]
of classification '[% classification.name FILTER html %]'
[% END %]
[% END %]
[% title = BLOCK %]Изменение продукта '[% product.name FILTER html %]'
[% classification_text FILTER none %][% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% IF changes.name.defined %]
<p>
Название продукта изменено с '[% changes.name.0 FILTER html %]' на
'<a href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">[% product.name FILTER html %]</a>'.
</p>
[% END %]
[% IF changes.description.defined %]
<p>
Изменено описание продукта:
</p>
<p style="margin: 1em 3em 1em 3em">[% product.description FILTER html_light %]</p>
[% END %]
[% IF changes.isactive.defined %]
<p>
Продукт
[% IF product.is_active %]
открыт
[% ELSE %]
закрыт
[% END %]
для регистрации [% terms.bugs_gen %].
</p>
[% END %]
[% IF changes.defaultmilestone.defined %]
<p>
План по умолчанию изменен с '[% changes.defaultmilestone.0 FILTER html %]' на
'[% product.default_milestone FILTER html %]'.
</p>
[% END %]
[% IF changes.allows_unconfirmed.defined %]
<p>
[% IF product.allows_unconfirmed %]
В продукте теперь можно использовать
статус [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %].
[% ELSE %]
В продукте больше нельзя использовать
статус [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %].
Обратите внимание, что все
<a href="buglist.cgi?product=
[%- product.name FILTER uri %]&amp;bug_status=UNCONFIRMED">
[%- terms.bugs %] имеющие в данное время статус
[%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %]</a>
останутся в этом статусе, пока он не будет изменён.
[% END %]
</p>
[% END %]
[% Hook.process('changes') %]
[% IF !changes.keys.size %]
<p>Изменений продукта '[% product.name FILTER html %]' не обнаружено.</p>
[% END %]
[% PROCESS admin/products/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl title = "Проверка целостности"
style_urls = ['skins/standard/admin.css'] %]
<div>
<p>
[% terms.Bugzilla %] проверяет ссылочную целостность базы данных.
Этот процесс может занять несколько минут.
</p>
<p>
Найденные ошибки будут <span class="alert">выделены цветом</span>.
В зависимости от характера ошибок будут показаны ссылки на инструменты их
устранения. После исправления ошибок проверка будет автоматически запущена
еще раз (и может занять больше времени, чем предыдущий запуск).
</p>
</div>
<hr>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% san_message = BLOCK %]
[% IF san_tag == "checks_start" %]
Запуск проверки целостности.
[% ELSIF san_tag == "checks_completed" %]
Проверка целостности завершена.
[% ELSIF san_tag == "attachment_reference_deletion_start" %]
Удаляем ссылки на несуществующие приложения.
[% ELSIF san_tag == "attachment_reference_deletion_end" %]
Все ссылки на несуществующие приложения удалены.
[% ELSIF san_tag == "bug_check_alert" %]
[% errortext FILTER html %]: [% INCLUDE bug_list badbugs = badbugs %]
[% ELSIF san_tag == "bug_check_repair" %]
<a href="sanitycheck.cgi?[% param FILTER uri %]=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">[% text FILTER html %]</a>.
[% ELSIF san_tag == "bug_check_creation_date" %]
Поиск [% terms.bugs_gen %] без даты регистрации (такие [% terms.bugs %] невидимы).
[% ELSIF san_tag == "bug_check_creation_date_error_text" %]
[% terms.Bugs %] без даты регистрации
[% ELSIF san_tag == "bug_check_creation_date_repair_text" %]
Восстановление даты регистрации для этих [% terms.bugs_gen %]
[% ELSIF san_tag == "bug_check_bugs_fulltext" %]
Поиск [% terms.bugs_gen %], не охваченных полнотекстовым поиском.
[% ELSIF san_tag == "bug_check_bugs_fulltext_error_text" %]
[% terms.Bugs %], не охваченные полнотекстовым поиском
[% ELSIF san_tag == "bug_check_bugs_fulltext_repair_text" %]
Включение [% terms.bugs_gen %] в полнотекстовый поиск
[% ELSIF san_tag == "bug_check_res_dupl" %]
Проверка дублирующих [% terms.bugs_gen %]
[% ELSIF san_tag == "bug_check_res_dupl_error_text" %]
В таблице дубликатов найдены [% terms.bugs %], не отмеченные как дублирующие
[% ELSIF san_tag == "bug_check_res_dupl_error_text2" %]
Найдены [% terms.bugs %] с решением "Дублирование", не упомянутые в таблице дубликатов
[% ELSIF san_tag == "bug_check_status_res" %]
Проверка состояний и решений
[% ELSIF san_tag == "bug_check_status_res_error_text" %]
Найдены [% terms.bugs %] в открытых состояниях с указанным решением
[% ELSIF san_tag == "bug_check_status_res_error_text2" %]
Найдены [% terms.bugs %] в закрытых состояниях без указания решения
[% ELSIF san_tag == "bug_check_status_everconfirmed" %]
Проверка состояния подтверждения
[% ELSIF san_tag == "bug_check_status_everconfirmed_error_text" %]
Найдены [% terms.bugs %] в состоянии "Не подтверждена" но с флагом подтверждения
[% ELSIF san_tag == "bug_check_status_everconfirmed_error_text2" %]
Найдены [% terms.bugs %] в подтвержденнном состоянии но без флага подтверждения
[% ELSIF san_tag == "bug_check_control_values" %]
Поиск недопустимых значений записей управления доступом
[% ELSIF san_tag == "bug_check_control_values_alert" %]
[% numeral( entries,
"Найдено $entries недопустимое значение записи управления доступом",
"Найдено $entries недопустимых значения записей управления доступом",
"Найдено $entries недопустимых значений записей управления доступом")
FILTER html %]
[% ELSIF san_tag == "bug_check_control_values_violation" %]
Поиск [% terms.bugs_gen %] с нарушениями прав доступа по группам
[% ELSIF san_tag == "bug_check_control_values_error_text" %]
Найдены группы, недопустимые для соответствующих продуктов
[% ELSIF san_tag == "bug_check_control_values_repair_text" %]
Разрешаем недопустимые группы для соответствующих продуктов
(устанавливаем значение <code>Разрешено</code>)
[% ELSIF san_tag == "bug_check_control_values_error_text2" %]
Поиск несуществующих групп, обязательных для продуктов.
[% ELSIF san_tag == "bug_creation_date_start" %]
Восстановление отсутствующих дат регистрации [% terms.bugs_gen %].
[% ELSIF san_tag == "bug_creation_date_fixed" %]
[% numeral( bug_count,
"$bug_count $bug исправлена",
"$bug_count $bug_gen исправлено",
"$bug_count $bugs_gen исправлено")
FILTER html %]
[% ELSIF san_tag == "bugs_fulltext_start" %]
OK, индексируем [% terms.bugs %] для полнотекстового поиска.
[% ELSIF san_tag == "bugs_fulltext_fixed" %]
[% numeral( bug_count,
"$bug_count $bug исправлена",
"$bug_count $bug_gen исправлено",
"$bug_count $bugs_gen исправлено")
FILTER html %]
[% ELSIF san_tag == "bug_reference_deletion_start" %]
Удаляем ссылки на несуществующие [% terms.bugs %].
[% ELSIF san_tag == "bug_reference_deletion_end" %]
Все ссылки на несуществующие [% terms.bugs %] удалены.
[% ELSIF san_tag == "cross_check_to" %]
Проверка ссылок на [% table FILTER html %].[% field FILTER html %]...
[% ELSIF san_tag == "cross_check_from" %]
... из [% table FILTER html %].[% field FILTER html %].
[% ELSIF san_tag == "cross_check_alert" %]
Недопустимое значение '[% value FILTER html %]' в поле
[%+ table FILTER html %].[% field FILTER html %]
[% IF keyname %]
[% IF keyname == "bug_id" %]
([% PROCESS bug_link bug_id = key %])
[% ELSE %]
([% keyname FILTER html %] == '[% key FILTER html %]')
[% END %]
[% END %]
[% ELSIF san_tag == "cross_check_attachment_has_references" %]
<a href="sanitycheck.cgi?remove_invalid_attach_references=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">Удалить
ссылки на несуществующие приложения.</a>
[% ELSIF san_tag == "cross_check_bug_has_references" %]
<a href="sanitycheck.cgi?remove_invalid_bug_references=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">Удалить
ссылки на несуществующие [% terms.bugs %].</a>
[% ELSIF san_tag == "double_cross_check_to" %]
Проверка ссылок на [% table FILTER html %].[% field1 FILTER html %] /
[%+ table FILTER html %].[% field2 FILTER html %]...
[% ELSIF san_tag == "double_cross_check_from" %]
... из [% table FILTER html %].[% field1 FILTER html %] /
[%+ table FILTER html %].[% field2 FILTER html %].
[% ELSIF san_tag == "double_cross_check_alert" %]
Недопустимые значения '[% value1 FILTER html %]', '[% value2 FILTER html %]' в
полях [% table FILTER html %].[% field1 FILTER html %] /
[%+ table FILTER html %].[% field2 FILTER html %].
[% IF keyname %]
[% IF keyname == "bug_id" %]
([% PROCESS bug_link bug_id = key %])
[% ELSE %]
([% keyname FILTER html %] == '[% key FILTER html %]')
[% END %]
[% END %]
[% ELSIF san_tag == "everconfirmed_start" %]
Проверка состояния флага подтверждения.
[% ELSIF san_tag == "everconfirmed_end" %]
флаги подтверждения проверены.
[% ELSIF san_tag == "flag_check_start" %]
Поиск согласований, не определенных для указанного продукта/компонента.
[% ELSIF san_tag == "flag_deletion_start" %]
Удаление недопустимых согласований.
[% ELSIF san_tag == "flag_deletion_end" %]
Недопустимые согласования удалены.
[% ELSIF san_tag == "flag_alert" %]
Недопустимое согласование [% flag_id FILTER html %] для
[% IF attach_id %]
приложения [% attach_id FILTER html %] in
[% END %]
[%+ PROCESS bug_link bug_id = bug_id %].
[% ELSIF san_tag == "flag_fix" %]
<a href="sanitycheck.cgi?remove_invalid_flags=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">Удалить
недопустимые согласования</a>
[% ELSIF san_tag == "group_control_map_entries_creation" %]
Генерация записей доступа <code>Разрешено</code>
для комбинаций группа/продукт без соответствующих записей.
[% ELSIF san_tag == "group_control_map_entries_update" %]
Замена записи <code>Запрещено/<em>xxx</em></code>
для группы <em>[% group_name FILTER html %]</em> на
<code>Разрешено/<em>xxx</em></code> в продукте
<em>[% product_name FILTER html %]</em>.
[% ELSIF san_tag == "group_control_map_entries_generation" %]
Установка записи <code>Разрешено/Запрещено</code>
для группы <em>[% group_name FILTER html %]</em> в продукте
<em>[% product_name FILTER html %]</em>.
[% ELSIF san_tag == "group_control_map_entries_repaired" %]
[% numeral( counter,
"Исправлена $counter недопустимая запись доступа",
"Исправлено $counter недопустимых записи доступа",
"Исправлено $counter недопустимых записей доступа")
FILTER html %]
[% ELSIF san_tag == "keyword_check_start" %]
Проверка таблицы ключевых слов.
[% ELSIF san_tag == "keyword_check_alert" %]
Дублирование записи keyworddefs с кодом [% id FILTER html %].
[% ELSIF san_tag == "keyword_check_invalid_name" %]
Неверное имя в keyworddefs для кода [% id FILTER html %].
[% ELSIF san_tag == "keyword_check_invalid_id" %]
Неверные коды [% id FILTER html %] в таблице ключевых слов.
[% ELSIF san_tag == "keyword_check_duplicated_ids" %]
Дублирование ключевых слов в [% PROCESS bug_link bug_id = id %].
[% ELSIF san_tag == "profile_login_start" %]
Проверка учетных записей.
[% ELSIF san_tag == "product_alert" %]
Продукт <a href="editproducts.cgi?product=[% name FILTER html%]">
[%- name FILTER html %]</a> не имеет компонентов или версий.
[% ELSIF san_tag == "product_check_start" %]
Проверка продуктов без компонентов или версий.
[% ELSIF san_tag == "profile_login_alert" %]
Недопустимый адрес электронной почты, id=[% id FILTER html %],
&lt;[% email FILTER html %]&gt;.
[% ELSIF san_tag == "repair_bugs" %]
Откорректировать эти [% terms.bugs %].
[% ELSIF san_tag == "send_bugmail_start" %]
Попытка отправки задержанных оповещений.
[% ELSIF san_tag == "send_bugmail_status" %]
[% numeral( bug_count,
"Обнаружена $bug_count $terms.bug",
"Обнаружено $bug_count $terms.bug_gen",
"Обнаружено $bug_count $terms.bugs_gen")
FILTER html %] с задержанных оповещениями.
[% ELSIF san_tag == "send_bugmail_end" %]
Задержанные оповещения отправлены.
[% ELSIF san_tag == "unsent_bugmail_check" %]
Проверка задержанных оповещений
[% ELSIF san_tag == "unsent_bugmail_alert" %]
[% terms.Bugs %] с изменениями, но без отправленных оповещений за
последние полчаса: [% INCLUDE bug_list badbugs = badbugs %]
[% ELSIF san_tag == "unsent_bugmail_fix" %]
<a href="sanitycheck.cgi?rescanallBugMail=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">Отправить оповещения</a>.
[% ELSIF san_tag == "whines_obsolete_target_deletion_start" %]
OK, удаляем несуществующих пользователей и группы из оповещений.
[% ELSIF san_tag == "whines_obsolete_target_deletion_end" %]
Несуществующие пользователи и группы удалены из оповещений.
[% ELSIF san_tag == "whines_obsolete_target_start" %]
Поиск оповещений для несуществующих пользователей и групп.
[% ELSIF san_tag == "whines_obsolete_target_alert" %]
[% FOREACH schedule = schedules %]
[% (type == constants.MAILTO_USER) ? "Несуществующий пользователь" : "Несуществующая группа" FILTER html %]
[%+ schedule.1 FILTER html %] для оповещения [% schedule.0 FILTER html %]<br>
[% END %]
[% ELSIF san_tag == "whines_obsolete_target_fix" %]
<a href="sanitycheck.cgi?remove_old_whine_targets=1&amp;token=
[%- issue_hash_token(['sanitycheck']) FILTER uri %]">Удалить
несуществующих пользователей или группы из оповещений</a>
[% ELSE %]
[% message = Hook.process("statuses") %]
[% IF message %]
[% message FILTER none %]
[% ELSE %]
Строка статусного сообщения <code>[% san_tag FILTER html %]</code> не найдена.
Пожалуйста, отправьте письмо по адресу [% Param("maintainer") %] с описанием
шагов произведённых для получения этого сообщения.
[% END %]
[% END %]
[% END %]
[% USE Bugzilla %]
[% IF Bugzilla.usage_mode == constants.USAGE_MODE_CMDLINE %]
[% san_message FILTER none %]
[% ELSE %]
[%# Avoid the txt filter in message.txt.tmpl. %]
[% san_message FILTER html %]
[% END %]
[% BLOCK bug_list %]
[% FOREACH bug_id = badbugs %]
[%# Do not use FILTER bug_link() here, because bug_link() calls get_text()
# which itself calls this template again, generating a recursion error.
# I doubt having a tooltip with the bug status and summary is so
# important here anyway, as you can click the "(as buglist)" link. %]
<a href="show_bug.cgi?id=[% bug_id FILTER uri %]">[% bug_id FILTER html %]</a>
[% ", " IF !loop.last %]
[% END %]
(<a href="buglist.cgi?bug_id=[% badbugs.join(",") FILTER uri %]">в виде списка [% terms.bugs_gen %]</a>).
[% END %]
[% BLOCK bug_link %]
<a href="show_bug.cgi?id=[% bug_id FILTER uri %]">[% terms.bug %] [%+ bug_id FILTER html %]</a>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# settings: a hash of hashes, keyed by setting name.
# Each hash contains:
# is_enabled - boolean
# default_value - string (global default for this setting)
# value - string (user-defined preference)
# is_default - boolean (true if user has no preference)
#%]
[% PROCESS global/header.html.tmpl
title = "Настройки пользователей"
%]
[% PROCESS "global/setting-descs.none.tmpl" %]
<p>
Редактирование настроек пользователей.
</p>
<p>
Указанные значения по умолчанию действуют для всех пользователей, которые
не изменят их индивидуально, а также до входа в систему.
</p>
<p>
Флажок 'Разрешено' указывает, могут ли пользователи изменять значение
настройки индивидуально.<br>
Если он установлен, пользователи увидят эти настройки на вкладке 'Общие параметры'
и смогут их изменить.<br>
Если он не установлен, пользователи не увидят эти настройки и значение по умолчанию
распространяется на всех.
</p>
<hr>
[% IF settings.size %]
<form name="adminsettingform" method="post" action="editsettings.cgi">
<table border="1" cellpadding="4">
<tr>
<th>Название настройки</th>
<th>Значение по умолчанию</th>
<th>Разрешено</th>
</tr>
[% FOREACH name = settings.keys %]
[% checkbox_name = name _ '-enabled' %]
<tr>
<td align="right">
[% setting_descs.$name OR name FILTER html %]
</td>
<td>
<select name="[% name FILTER html %]" id="[% name FILTER html %]">
[% FOREACH x = settings.${name}.legal_values %]
<option value="[% x FILTER html %]"
[% " selected=\"selected\"" IF x == settings.${name}.default_value %]>
[% setting_descs.${x} OR x FILTER html %]
</option>
[% END %]
</select>
</td>
<td align="center">
<input type="checkbox"
name="[% checkbox_name FILTER html %]"
id="[% checkbox_name FILTER html %]"
[% " checked=\"checked\"" IF settings.${name}.is_enabled %]>
<br>
</td>
</tr>
[% END %]
</table>
<input type="hidden" name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<table>
<tr>
<td width="150"></td>
<td>
<input type="submit" id="update" value="Сохранить">
</td>
</tr>
</table>
</form>
[% ELSE %]
Редактируемые настройки отсутствуют.
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Работа от имени другого пользователя"
style_urls = ['skins/standard/admin.css']
doc_section = "useradmin.html#impersonatingusers"
%]
[% DEFAULT target_login = "" %]
<p>
Функция [% terms.Bugzilla %] <b>sudo</b> позволяет работать в системе
от имени другого пользователя. В течение такой сессии доступны все функции
в том виде, как они доступны другому пользователю.
</p>
<p class="areyoureallyreallysure">
Эта функция очень мощная, и её использовать следует с осторожностью.
Действия пользователя протоколируются более подробно, чем обычно.
</p>
<form action="relogin.cgi" method="POST">
<p>
[% IF Param('usemenuforusers') %]
Выберите
[% ELSE %]
Введите регистрационное имя
[% END %]
<label for="target_login">пользователя, от имени которого начать сеанс</label>:
[% INCLUDE global/userselect.html.tmpl
id => "target_login"
name => "target_login"
value => target_login_default
accesskey => "u"
size => 30
%]
</p>
[% IF !Param('usemenuforusers') %]
<p>
Имя пользователя должно быть введено точно. Поиск похожих не производится.
</p>
[% END %]
<p>
Объясните <label for="reason">необходимость работы от имени другого
пользователя</label>:<br>
<input type="text" id="reason" name="reason" size="80" maxlength="200"
value="[% reason_default FILTER html %]">
</p>
<p>
Введенный здесь текст будет отправлен владельцу учетной записи по
электронной почте. Можно ничего не писать, но владелец будет
оповещен в любом случае.
</p>
[% IF user.authorizer.can_login %]
<p>
Введите <label for="Bugzilla_password">ваш пароль
[% terms.Bugzilla %]</label>:
<input type="hidden" name="Bugzilla_login" value="[% user.login FILTER html %]">
<input type="password" id="Bugzilla_password" name="Bugzilla_password" size="20">
<input type="hidden" name="Bugzilla_login_token"
value="[% login_request_token FILTER html %]">
<br>
У этого требования есть две причины. Во-первых это снижает
вероятность неавторизованного использования рабочего места
уже вошедшего в систему пользователя. Во-вторых это шанс ещё раз
обдумать необходимость работы под чужой учетной записью.
</p>
[% END %]
<p>
Нажмите на кнопку, чтобы начать сессию:
<input type="submit" id="begin_sudo" value="Начать сессию">
<input type="hidden" name="action" value="begin-sudo">
<input type="hidden" name="token" value="[% token FILTER html %]">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# columns:
# array of hashes representing the columns in the table.
# Each hash contains data for a single column. Hash keys:
# name: Name of the field in the data param
# heading: The text to print at the header cell
# contentlink: URI to which the content of a data cell shall be linked to.
# Expressions of format %%xxx%% are replaced with value
# with the key xxx in data hash of the current row.
# content: If specified, the content of this variable is used
# instead of the data pulled from the current row.
# NOTE: This value is only partially HTML filtered!
# content_use_field: If defined and true, then each value in the
# column corresponds with a key in the
# field_descs field, and that value from the
# field_descs hash will be used instead of "content."
# See fieldvalues/select-field for an example of use.
# This content WILL be HTML-filtered in this case.
# align: left/center/right. Controls the horizontal alignment of the
# text in the column.
# allow_html_content: if defined, then this column allows some html content
# and so it will be only partially filtered.
# yesno_field: Turn the data from 0/!0 into Yes/No
#
# data:
# array of hashes representing the data for the table.
# Each hash contains data for a single row of data. The
# keys are column names from columns subhashes name field.
#
# overrides:
# Example:
# overrides { # first hash
# column_name_to_be_overwriten => { # second hash
# name_of_row_to_match_against => { # third hash
# value_to_match_against => { # fourth hash
# content => "some contents"
# override_content => 1
# }
# }
# }
# }
#
# Provides a method for overriding individual table cells. This is a hash
# (1), whose key is the column name, so the column must be named for
# one of it's cells to be overwritten. The hash value is another hash
# (2). The keys of that second hash are the name of the row to match
# against. The second hash then again points to another hash. Within this
# third hash (3), the keys represent values to match against. The item
# contains a fourth hash (4) specifying overridden values.
#
# Each column value mentioned in the 'columns' documentation above
# can be overwritten (apart from name and heading). To override a
# table-cell value 'xxx', specify a new 'xxx' value, and specify a
# 'override_xxx' value as well. See
# admin/milestones/list.html.tmpl for example
#
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[%################### TABLE HEADER ######################%]
<table id="admin_table" border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
[% FOREACH c = columns %]
[%# Default to align left for headers %]
<th align="[% (c.align || 'left') FILTER html %]">
[% c.heading FILTER html %]
</th>
[% END %]
</tr>
[%################### TABLE CONTENT ######################%]
[% FOREACH row = data %]
<tr>
[% FOREACH c = columns %]
[%# Copy to local variables, as we may update these %]
[% contentlink = c.contentlink
content = c.content
content_use_field = c.content_use_field
align = c.align
class = c.class
allow_html_content = c.allow_html_content
yesno_field = c.yesno_field
%]
[%# Get any specific "important" overrides for this c.name and row.name ? %]
[% SET important = overrides.${c.name}.name.${row.name} %]
[% IF important %]
[% FOREACH key IN important.keys %]
[% SET ${key} = important.${key} %]
[% END %]
[% ELSE %]
[%# Are there any specific overrides for this column? %]
[% FOREACH match_field = overrides.${c.name}.keys %]
[% override = overrides.${c.name}.${match_field}.${row.$match_field} %]
[% NEXT UNLESS override %]
[% FOREACH key IN override.keys %]
[% SET ${key} = override.${key} %]
[% END %]
[% LAST %]
[% END %]
[% END %]
<td [% IF align %] align="[% align FILTER html %]" [% END %]
[% IF class %] class="[% class FILTER html %]" [% END %]>
[% IF contentlink %]
[% FOREACH m = contentlink.match('%%(.+?)%%', 1) %]
[% replacement_value = FILTER uri; row.$m; END %]
[% contentlink = contentlink.replace("%%$m%%", replacement_value) %]
[% END %]
<a href="[% contentlink %]">
[% END %]
[% IF content_use_field %]
[% colname = row.${c.name} %]
[% field_descs.${colname} FILTER html %]
[% ELSIF content %]
[% content FILTER html_light %]
[% ELSIF yesno_field %]
[% row.${c.name} ? "Да" : "Нет" %]
[% ELSIF allow_html_content %]
[% row.${c.name} FILTER html_light %]
[% ELSE %]
[% row.${c.name} FILTER html %]
[% END %]
[% IF contentlink %]
</a>
[% END %]
</td>
[% END %]
</tr>
[% END %]
[% IF data.size == 0 %]
<tr><td colspan="[% columns.size %]" align="center"><i>&lt;нет данных&gt;</i></td></tr>
[% END %]
[%################### TABLE FOOTER ######################%]
</table>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# listselectionvalues: selection values to recreate the current user
# list.
# editusers: is viewing user member of editusers?
# otheruser: Bugzilla::User object of the viewed user.
# reporter: number of bugs reported by the user
# assignee_or_qa: number of bugs the user is either the assignee
# or the QA contact
# bugs_activity: number of bugs the viewed user has activity
# entries on
# cc number of bugs the viewed user is cc list member
# of
# flags.requestee: number of flags the viewed user is being asked for
# flags.setter: number of flags the viewed user has set
# longdescs: number of bug comments the viewed user has written
# namedqueries: number of named queries the user has created
# namedquery_group_map: number of named queries the user has shared
# profiles_activity: number of changes made to other users' profiles
# series: number of series the viewed user has created
# watch.watched: number of users the viewed user is being watched
# by
# watch.watcher: number of users the viewed user is watching
# whine_events: number of whine events the viewed user has created
# whine_schedules: number of whine schedules the viewed user has
# created
#%]
[% title = BLOCK %]Подтвердите удаление [% otheruser.login FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css',
'skins/standard/editusers.css']
doc_section = "useradmin.html#user-account-deletion"
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
<table class="main">
<tr>
<th>Учетная запись:</th>
<td>[% otheruser.login FILTER html %]</td>
</tr>
<tr>
<th>Полное имя:</th>
<td>[% otheruser.name FILTER html %]</td>
</tr>
<tr>
<th>Группы:</th>
<td>
[% IF otheruser.groups.size %]
<ul>
[% FOREACH group = otheruser.groups %]
<li>[% group.name FILTER html %]</li>
[% END %]
</ul>
[% ELSE %]
нет
[% END %]
</td>
</tr>
[% IF otheruser.product_responsibilities.size %]
<tr>
<th>Ответственность по продуктам:</th>
<td>
[% PROCESS admin/users/responsibilities.html.tmpl otheruser = otheruser %]
</td>
</tr>
[% END %]
</table>
[% IF otheruser.product_responsibilities.size %]
<p>
Пользователь [%+ otheruser.login FILTER html %] не может быть
удален поскольку отвечает за один или несколько продуктов.
</p>
<p>
[% IF user.in_group("editcomponents", component.product_id) %]
Вы можете изменить параметры продуктов (см. ссылки выше),
[% ELSE %]
Вы можете только
[% END %]
[% ELSE %]
[% accept_deletion = 1 %]
[% IF attachments || reporter || bugs_activity || flags.setter || longdescs || profiles_activity %]
<div class="criticalmessages">
<p>Выполнение перечисленных ниже операций <b>не рекомендуется</b>,
так как приведет к нарушению целостности базы данных!</p>
<ul>
[% IF attachments %]
<li>
Пользователь [% otheruser.login FILTER html %]
<a href="buglist.cgi?field0-0-0=attachments.submitter&type0-0-0=equals&value0-0-0=
[%- otheruser.login FILTER uri %]">создал
[%+ attachments %][%+ numeral(attachments,
"приложение","приложения","приложений")
FILTER html -%]</a> к [% terms.bugs_dat %].
Удаление пользователя приведет к нарушению целостности базы
данных и пропаданию этих приложений.
</li>
[% END %]
[% IF reporter %]
<li>
Пользователем [% otheruser.login FILTER html %]
<a href="buglist.cgi?emailreporter1=1&amp;emailtype1=exact&amp;email1=
[%- otheruser.login FILTER uri %]">
[% numeral(reporter,
"зарегистрирована ${reporter} ${terms.bug}",
"зарегистрировано ${reporter} ${terms.bug_gen}",
"зарегистрировано ${reporter} ${terms.bugs_gen}")
FILTER html -%].
Удаление пользователя приведет к нарушению целостности базы
данных и пропаданию этих [% terms.bugs_gen %].
</li>
[% END %]
[% IF bugs_activity %]
<li>
Пользователем [% otheruser.login FILTER html %] выполнено
[% bugs_activity FILTER none %]
[% numeral(bugs_activity, "изменение", "изменения", "изменений") FILTER html %]
в состоянии [% terms.bugs_gen %].
Удаление пользователя приведет к нарушению целостности базы
данных и пропаданию записей в историях изменений [% terms.bugs_gen %].
</li>
[% END %]
[% IF flags.setter %]
<li>
Пользователь [% otheruser.login FILTER html %]
<a href="buglist.cgi?field0-0-0=setters.login_name&amp;type0-0-0=equals&amp;value0-0-0=
[%- otheruser.login FILTER uri %]">
выполнил или запросил</a> [% flags.setter %]
[% numeral(flags.setter,
"согласование", "согласования", "согласований") FILTER html -%].
Удаление пользователя приведет к нарушению целостности базы
данных и некорректному отображению согласований.
</li>
[% END %]
[% IF longdescs %]
<li>
Пользователь [% otheruser.login FILTER html %] участвовал в
<a href="buglist.cgi?emaillongdesc1=1&amp;emailtype1=exact&amp;email1=
[%- otheruser.login FILTER uri %]">переписке
по [% terms.bugs_abl %] [% longdescs %]
[% numeral(longdescs, "раз", "раза", "раз") FILTER html -%].</a>.
Удаление пользователя приведет к нарушению целостности базы
данных и комментарии этого пользователя отображаться не будут.
</li>
[% END %]
[% IF profiles_activity %]
<li>
Пользователь [% otheruser.login FILTER html %] выполнил
[% profiles_activity FILTER none %]
[% numeral(profiles_activity,
"изменение", "изменения", "изменений") FILTER html %]
в настройках других пользователей.
Удаление пользователя приведет к нарушению целостности базы
данных в части отслеживания действий пользователей.
</li>
[% END %]
</ul>
</div>
[% accept_deletion = 0 %]
[% END %]
[% IF assignee_or_qa || cc || component_cc || email_setting || flags.requestee ||
namedqueries || profile_setting || quips || series || watch.watched ||
watch.watcher || whine_events || whine_schedules || otheruser.has_audit_entries ||
other_safe %]
<div class="warningmessages">
<p>Выполнение перечисленных ниже операций <b>безопасно</b>,
и не приведет к нарушению целостности базы данных.</p>
<ul>
[% IF assignee_or_qa %]
<li>
Пользователь [% otheruser.login FILTER html %]
<a href="buglist.cgi?emailassigned_to1=1&amp;emailqa_contact1=1&amp;emailtype1=exact&amp;email1=
[%- otheruser.login FILTER uri %]">является
исполнителем или ответственным за приемку [%+ assignee_or_qa %]
[% numeral(assignee_or_qa,
"${terms.bug_gen}", "${terms.bugs_gen}", "${terms.bugs_gen}")
FILTER html -%]</a>.
Удаление пользователя приведет к передаче [% terms.bugs_gen %]
ответственным соответствующих продуктов.
</li>
[% END %]
[% IF cc %]
<li>
Пользователь [% otheruser.login FILTER html %]
<a href="buglist.cgi?emailcc1=1&amp;emailtype1=exact&amp;email1=
[%- otheruser.login FILTER uri %]">подписан
на [% cc %]
[% numeral(cc,
"${terms.bug_acc}", "${terms.bugs_acc}", "${terms.bugs_gen}")
FILTER html -%]</a>.
Удаление пользователя приведет к аннулированию его подписки.
</li>
[% END %]
[% IF component_cc %]
<li>
Пользователь [% otheruser.login FILTER html %] подписан на все
[% terms.bugs %] [%+ component_cc %]
[% numeral(component_cc,
"компонента", "компонентов", "компонентов")
FILTER html -%].
Удаление пользователя приведет к аннулированию его подписки.
</li>
[% END %]
[% IF email_setting %]
<li>
Вместе с пользователем будут удалены его настройки
электронной почты.
</li>
[% END %]
[% IF flags.requestee %]
<li>
У пользователя [% otheruser.login FILTER html %]
<a href="buglist.cgi?field0-0-0=requestees.login_name&amp;type0-0-0=equals&amp;value0-0-0=
[%- otheruser.login FILTER uri %]">запрошено
[% flags.requestee %]
[% numeral(flags.requestee,
"согласование", "согласования", "согласований")
FILTER html -%]</a>.
Удаление пользователя приведет к изменению запроса согласования на безадресный.
</li>
[% END %]
[% IF namedqueries %]
<li>
Пользователь [% otheruser.login FILTER html %]
имеет [%+ namedqueries FILTER html %]
[% numeral(namedqueries,
"сохраненное условие",
"сохраненных условия",
"сохраненных условий")
FILTER html %]
отбора. Все они будут удалены.
[% IF namedquery_group_map %]
Среди условий отбора [%+ namedquery_group_map FILTER html %]
[% numeral(namedquery_group_map,
"опубликовано", "опубликованы", "опубликованы")
FILTER html %]
для других пользователей. Пользователи потеряют возможность
пользоваться этими условиями отбора.
[% END %]
</li>
[% END %]
[% IF profile_setting %]
<li>
Вместе с пользователем будут удалены его настройки
параметров.
</li>
[% END %]
[% IF series %]
<li>
Пользователь [% otheruser.login FILTER html %] создал [%+ series %]
[% numeral(namedquery_group_map,
"серию", "серии", "серий") FILTER html %] данных.
При удалении пользователя все они будут удалены.
</li>
[% END %]
[% IF quips %]
<li>
Пользователь [% otheruser.login FILTER html %] опубликовал
[%+ quips %] [% numeral(quips,
"цитату", "цитаты", "цитат") FILTER html -%].
При удалении пользователя цитата сохранится, но без указания
автора.
</li>
[% END %]
[% IF watch.watched || watch.watcher %]
<li>
[% IF watch.watched %]
Оповещения пользователя [% otheruser.login FILTER html %] дублируются другими.
[% END %]
[% IF watch.watcher %]
Пользователь [% otheruser.login FILTER html %] дублирует оповещения других пользователей.
[% END %].
При удалении пользователя дублирование будет прекращено.
</li>
[% END %]
[% IF whine_events %]
<li>
Пользователь [% otheruser.login FILTER html %]
настроил рассылку [%+ whine_events %]
[% numeral(whine_events,
"оповещения", "оповещений", "оповещений") FILTER html -%].
При удалении пользователя [% numeral(whine_events,
"это оповещение будет удалено",
"эти оповещения будут удалены",
"эти оповещения будут удалены") FILTER html -%].
</li>
[% END %]
[% IF whine_schedules %]
<li>
Пользователь [% otheruser.login FILTER html %]
является получателем [%+ whine_schedules %]
[% numeral(whine_schedules,
"оповещения", "оповещений", "оповещений") FILTER html -%].
При удалении пользователя расписания рассылки будут удалены,
но настройки оповещений сохранятся.
</li>
[% END %]
[% IF otheruser.has_audit_entries %]
<li>
Пользователь выполнял административные функции,
журнал аудита которых вёлся в базе данных.
Если вы удалите этого пользователя, его записи журнала аудита
больше не удастся идентифицировать.
</li>
[% END %]
[% Hook.process('warn_safe') %]
</ul>
</div>
[% IF accept_deletion %]
<p class="areyoureallyreallysure">
Пожалуйста примите к сведению перечисленные последствия удаления пользователя.
</p>
<p>Подтвердите удаление пользователя:</p>
<form method="post" action="editusers.cgi">
<p>
<input type="submit" id="delete" value="Да, удалить"/>
<input type="hidden" name="action" value="delete" />
<input type="hidden" name="userid" value="[% otheruser.id %]" />
<input type="hidden" name="token" value="[% token FILTER html %]">
[% INCLUDE listselectionhiddenfields %]
</p>
</form>
<p>Если вы не хотите удалять пользователя, вы можете
[% ELSE %]
<p><b>Удаление пользователя невозможно</b> из-за описанных выше зависимостей. Вы можете
[% END %]
[% END %]
[% END %]
<a href="editusers.cgi?action=edit&amp;userid=[% otheruser.id %]
[% INCLUDE listselectionurlparams %]">отредактировать его</a>,
вернуться
<a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">к
списку пользователей</a>,
[% IF editusers %]
<a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">создать
пользователя</a>,
[% END %]
или <a href="editusers.cgi">выполнить поиск пользователей</a>.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# listselectionvalues: selection values to recreate the current user list.
# editusers: is viewing user member of editusers?
#%]
[% PROCESS global/header.html.tmpl
title = "Добавление пользователя"
style_urls = ['skins/standard/editusers.css']
onload = "document.forms['f'].login.focus()"
doc_section = "useradmin.html#createnewusers"
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
<form name="f" method="post" action="editusers.cgi">
<table class="main">
[% PROCESS admin/users/userdata.html.tmpl
editform = 0
editusers = editusers
otheruser = []
%]
</table>
<p>
<input type="submit" id="add" value="Создать"/>
<input type="hidden" name="action" value="new" />
<input type="hidden" name="token" value="[% token FILTER html %]">
[% INCLUDE listselectionhiddenfields %]
</p>
</form>
<p>
Выполнить <a href="editusers.cgi">поиск пользователей</a>
[% IF listselectionvalues %],
или вернуться
<a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">к
списку пользователей</a>
[% END %].
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# message: message tag specifying a global/messages.html.tmpl
# message
# listselectionvalues: selection values to recreate the current user list.
# editusers: is viewing user member of editusers?
# otheruser: Bugzilla::User object of viewed user.
# groups: array of group information (name, grant type,
# canbless) for viewed user.
#%]
[% title = BLOCK %]Изменение пользователя [% otheruser.identity FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
message = message
style_urls = ['skins/standard/admin.css', 'skins/standard/editusers.css']
doc_section = "useradmin.html#modifyusers"
javascript_urls = [ 'js/field.js' ]
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
<form method="post" action="editusers.cgi">
<table class="main">
[% PROCESS admin/users/userdata.html.tmpl
editform = 1
editusers = editusers
otheruser = otheruser
%]
[% IF groups.size %]
<tr>
<th>Доступ к группам:</th>
<td>
<table class="groups">
<tr>
[% IF editusers %]
<th colspan="3">
Управляет включением в группы
</th>
[% END %]
</tr>
<tr>
[% IF editusers %]
<td style="text-align: center; font-weight: bold">|</td>
[% END %]
<th colspan="2">Включен в группы</th>
</tr>
[% FOREACH group = groups %]
[% perms = permissions.${group.id} %]
<tr class="[% 'in' IF perms.regexpmember || perms.derivedmember %]direct">
[% IF editusers %]
<td class="checkbox">
[% '[' IF perms.indirectbless %]
[% %]<input type="checkbox"
name="bless_[% group.id %]"
value="1"
[% ' checked="checked"' IF perms.directbless %] />
[% ']' IF perms.indirectbless %]</td>
[% END %]
<td class="checkbox">
[% '[' IF perms.derivedmember %]
[% '*' IF perms.regexpmember %]
[%%]<input type="checkbox"
id="group_[% group.id %]"
name="group_[% group.id %]"
value="1"
[% ' checked="checked"' IF perms.directmember %] />
[% '*' IF perms.regexpmember %]
[% ']' IF perms.derivedmember %]</td>
<td class="groupname">
<label for="group_[% group.id %]">
<strong>[% group.name FILTER html %]:</strong>
[%+ group.description FILTER html_light %]
</label>
</td>
</tr>
[% END %]
</table>
</td>
</tr>
[% END %]
<tr>
<th>Роли для продуктов:</th>
<td>
[% IF otheruser.product_responsibilities.size %]
[% PROCESS admin/users/responsibilities.html.tmpl otheruser = otheruser %]
[% ELSE %]
<em>нет</em>
[% END %]
</td>
</tr>
<tr>
<th>Последний вход:</th>
<td>
[% IF otheruser.last_seen_date %]
[% otheruser.last_seen_date FILTER html %]
[% ELSE %]
<em>никогда</em>
[% END %]
</td>
</tr>
</table>
<p>
<input type="submit" id="update" value="Сохранить изменения" />
<input type="hidden" name="userid" value="[% otheruser.id %]" />
<input type="hidden" name="action" value="update" />
<input type="hidden" name="token" value="[% token FILTER html %]">
[% INCLUDE listselectionhiddenfields %]
или <a href="editusers.cgi?action=activity&amp;userid=[% otheruser.id %]"
title="История учетной записи'
[%- otheruser.login FILTER html %]'">просмотреть историю учетной записи</a>
</p>
</form>
<p>
Пользователь включен в отмеченные группы и в группы, помеченные
серым цветом. Серый цвет указывает на неявное включение,
связанное с принадлежностью другой группе (квадратные скобки)
или соответствием маске группы ('*').
</p>
[% IF editusers %]
<p>
Квадратные скобки около левой отметки указывают на возможность
управлять включением в группу неявно, путем включения в другие группы.
</p>
[% END %]
[% IF Param('allowuserdeletion') && editusers %]
<form method="post" action="editusers.cgi">
<p>
<input type="submit" id="delete" value="Удалить пользователя" />
<input type="hidden" name="action" value="del" />
<input type="hidden" name="userid" value="[% otheruser.id %]" />
[% INCLUDE listselectionhiddenfields %]
</p>
</form>
[% END %]
<p>
Вы также можете
[% IF editusers %]
<a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">создать
пользователя</a>
[% IF listselectionvalues %],
[% END %]
[% END %]
[% IF listselectionvalues %]
вернуться
<a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">к
списку пользователей</a>
[% END %]
[% IF editusers OR listselectionvalues %]
или
[% END %]
<a href="editusers.cgi">выполнить поиск пользователей</a>.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# listselectionvalues: selection values to recreate the current user list.
# editusers: is viewing user member of editusers?
# users: list of user information (id, login_name, realname,
# disabledtext).
#%]
[% PROCESS global/header.html.tmpl
title = "Выберите пользователя"
style_urls = ['skins/standard/editusers.css']
doc_section = "useradmin.html"
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
[% listselectionurlparams = INCLUDE listselectionurlparams %]
[% columns =
[{name => 'login_name'
heading => 'Редактировать...'
contentlink => 'editusers.cgi?action=edit&amp;userid=%%userid%%' _
listselectionurlparams
}
{name => 'realname'
heading => 'Полное имя'
}
{name => 'last_seen_date'
heading => 'Последний вход'
}
{heading => 'История учетной записи'
content => 'Просмотреть'
contentlink => 'editusers.cgi?action=activity' _
'&amp;userid=%%userid%%' _
listselectionurlparams
}
]
%]
[% IF Param('allowuserdeletion') && editusers %]
[% columns.push({heading => 'Действие'
content => 'Удалить'
contentlink => 'editusers.cgi?action=del' _
'&amp;userid=%%userid%%' _
listselectionurlparams
}
)
%]
[% END %]
[%# Disabled users are crossed out. Missing realnames are noticed in red. %]
[% overrides.login_name = {} %]
[% overrides.realname = {} %]
[% FOREACH thisuser = users %]
[% IF !thisuser.realname %]
[%# We cannot pass one class now and one class later. %]
[% SET classes = (thisuser.is_enabled ? "missing" : "bz_inactive missing") %]
[% overrides.realname.login_name.${thisuser.login_name} = {
content => "не указано"
override_content => 1
class => "$classes"
override_class => 1
}
%]
[% ELSIF !thisuser.is_enabled %]
[% overrides.realname.login_name.${thisuser.login_name} = {
class => "bz_inactive"
override_class => 1
}
%]
[% END %]
[% IF !thisuser.is_enabled %]
[% overrides.login_name.login_name.${thisuser.login_name} = {
class => "bz_inactive"
override_class => 1
}
%]
[% END %]
[% END %]
<p>[% numeral(users.size,
"Найден ${users.size} пользователь",
"Найдены ${users.size} пользователя",
"Найдено ${users.size} пользователей")
FILTER html %].</p>
[% PROCESS admin/table.html.tmpl
columns = columns
data = users
overrides = overrides
%]
<p>
Вы также можете
<a href="editusers.cgi">выполнить новый поиск</a>
[% IF editusers %]
или
<a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">создать
нового пользователя</a>
[% END %].
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% hidden_products = 0 %]
<table id="user_responsibilities" border="0">
[% FOREACH item = otheruser.product_responsibilities %]
[% IF !user.can_see_product(item.product.name) %]
[% hidden_products = 1 %]
[% NEXT %]
[% END %]
<tbody>
<tr>
<th colspan="3" class="product">Продукт: [% item.product.name FILTER html %]</th>
</tr>
<tr>
<th>Компонент</th>
<th>Ответственный исполнитель</th>
<th>Ответственный за приемку</th>
<th>Подписанный пользователь</th>
</tr>
[% FOREACH component = item.components %]
<tr>
<td>
[% IF user.in_group("editcomponents", component.product_id) %]
<a href="editcomponents.cgi?action=edit&amp;product=
[% item.product.name FILTER uri %]&amp;component=
[% component.name FILTER uri %]">
[% END %]
[% component.name FILTER html %]
[% IF user.in_group("editcomponents", component.product_id) %]
</a>
[% END %]
</td>
[% FOREACH responsibility = ['default_assignee', 'default_qa_contact'] %]
<td class="center">
[% component.$responsibility.id == otheruser.id ? "X" : "&nbsp;" %]
</td>
[% END %]
<td class="center">
[% component.initial_cc.contains(otheruser) ? "X" : "&nbsp;" %]
</td>
</tr>
[% END %]
</tbody>
[% END %]
</table>
[% IF hidden_products %]
<p class="criticalmessages">Пользователь имеет роли в продуктах, к которым Вы
не имеете доступа. Эти продукты не перечислены здесь. Обратитесь к администратору
с достаточными правами для корректировки ролей пользователя для этих продуктов.</p>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# editusers: is viewing user member of editusers?
# restrictablegroups: list of groups visible to the user:
# id: group id
# name: group name
#%]
[% PROCESS global/header.html.tmpl
title = "Поиск пользователей"
style_urls = ['skins/standard/editusers.css']
onload = "document.forms['f'].matchstr.focus()"
doc_section = "useradmin.html#user-account-search"
%]
[% PROCESS admin/users/listselectvars.html.tmpl
listselectionvalues = listselectionvalues
%]
<form name="f" method="get" action="editusers.cgi">
<input type="hidden" name="action" value="list" />
<p><label for="matchvalue">Найти пользователей по</label>
<select id="matchvalue" name="matchvalue">
<option value="login_name">учетной записи</option>
<option value="realname">полному имени</option>
<option value="userid">идентификатору</option>
</select>
<label for="matchstr">которые</label>
<input size="32" name="matchstr" id="matchstr" />
<select name="matchtype">
<option value="substr" selected="selected">содержат строку (без учета регистра)</option>
<option value="regexp">соответствуют шаблону (без учета регистра)</option>
<option value="notregexp">не соответствуют шаблону (без учета регистра)</option>
<option value="exact">соответствуют в точности (конкретного пользователя)</option>
</select>
<input type="submit" id="search" value="Найти" /></p>
[% IF restrictablegroups.size %]
<p><input type="checkbox" name="grouprestrict" value="1" id="grouprestrict" />
<label for="grouprestrict">Только входящих в группу</label>
<select name="groupid"
onchange="document.forms['f'].grouprestrict.checked=true">
[% FOREACH group = restrictablegroups %]
<option value="[% group.id FILTER html %]">[% group.name FILTER html %]</option>
[% END %]
</select></p>
[% END %]
<p>
<input type="checkbox" name="enabled_only" value="1" id="enabled_only"
checked="checked">
<label for="enabled_only">Только включённые учетные записи пользователей</label>
</p>
[% Hook.process('end') %]
</form>
[% IF editusers %]
<p>
Вы также можете <a href="editusers.cgi?action=add">создать пользователя</a>
[%- IF listselectionvalues %],
или вернуться
<a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">к
списку пользователей</a>
[%- END %].
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#
# editform: is this an edit form? (It's a create form otherwise)
# editusers: is viewing user member of editusers?
# otheruser: Bugzilla::User object of user to edit
#%]
<script type="text/javascript">
var disable_mail_manually_set = [% (otheruser.email_disabled ? 1 : 0) FILTER js %];
</script>
<tr>
<th><label for="login">Учетная запись:</label></th>
<td>
[% IF editusers %]
<input size="64" maxlength="255" name="login"
id="login" value="[% otheruser.login FILTER html %]" />
[% IF editform %]
[% IF !otheruser.in_group('bz_sudo_protect') %]
<br />
<a href="relogin.cgi?action=prepare-sudo&amp;target_login=
[%- otheruser.login FILTER uri %]">Сеанс от его имени</a>
[% END %]
[% END %]
[% ELSE %]
[% otheruser.login FILTER html %]
[% END %]
</td>
</tr>
[% IF default_authorizer.extern_id_used %]
<tr>
<th><label for="extern_id">ID внешней учетной записи:</label></th>
<td>
[% IF editusers %]
<input size="64" maxlength="64" name="extern_id"
id="extern_id" value="[% otheruser.extern_id FILTER html %]">
[% ELSE %]
[% otheruser.extern_id FILTER html %]
[% END %]
</td>
</tr>
[% END %]
<tr>
<th><label for="name">Полное имя:</label></th>
<td>
[% IF editusers %]
<input size="64" maxlength="255" name="name"
autocomplete="off"
id="name" value="[% otheruser.name FILTER html %]" />
[% ELSE %]
[% otheruser.name FILTER html %]
[% END %]
</td>
</tr>
[%# XXX This condition (can_change_password) will cause a problem
# if we ever have a login system that can create accounts through
# createaccount.cgi but can't change passwords.
#%]
[% IF editusers %]
[% IF user.authorizer.can_change_password %]
<tr>
<th><label for="password">Пароль:</label></th>
<td>
<input type="password" size="16" name="password" id="password"
value="" autocomplete="off" />
[% IF editform %]<br />
(Для смены пароля укажите новый.)
[% END %]
</td>
</tr>
[% END %]
<tr>
<th><label for="disable_mail">Блокировка почты:</label></th>
<td>
<input type="checkbox" name="disable_mail" id="disable_mail" value="1"
[% IF otheruser.email_disabled %] checked="checked" [% END %]
onchange="disable_mail_manually_set=1;">
(Действует на подписку и оповещения, не запрещает сброс пароля и другие
административные сообщения)
</td>
</tr>
<tr>
<th><label for="disabledtext">Блокировка пользователя:</label></th>
<td>
[% INCLUDE global/textarea.html.tmpl
name = 'disabledtext'
id = 'disabledtext'
minrows = 2
maxrows = 10
defaultrows = 10
cols = 60
defaultcontent = otheruser.disabledtext
onchange = "userDisabledTextOnChange(this);"
%]<br>
(Причина блокировки — пользователь не может войти с помощью этой
учётной записи, когда это поле не пусто)
</td>
</tr>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the version belongs.
# version: object; Bugzilla::Version object representing the
# version the user wants to delete.
#%]
[% title = BLOCK %]Удалить версию продукта '[% product.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">Версия:</td>
<td valign="top">[% version.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">Продукт:</td>
<td valign="top">[% product.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">[% terms.Bugs_gen %]:</td>
<td valign="top">
[% IF version.bug_count %]
<a title="Список [% terms.bugs_gen %] версии '
[%- version.name FILTER html %]'"
href="buglist.cgi?version=[% version.name FILTER uri %]&amp;product=
[%- product.name FILTER uri %]">
[%- version.bug_count FILTER none %]</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
</table>
<h2>Подтверждение</h2>
[% IF version.bug_count %]
<p class="confirmation">
Для данной версии продукта
[% numeral(version.bug_count,
"зарегистрирована ${version.bug_count} ${terms.bug}",
"зарегистрировано ${version.bug_count} ${terms.bugs}",
"зарегистрировано ${version.bug_count} ${terms.bugs_gen}")
FILTER html -%].
Для удаления этой версии необходимо переназначить их на другие версии.
</p>
[% ELSE %]
<p>Удалить версию?<p>
<form method="post" action="editversions.cgi">
<input type="submit" id="delete" value="Да, удалить">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="version" value="[% version.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% END %]
[% PROCESS admin/versions/footer.html.tmpl %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the version is being created for
#%]
[% title = BLOCK %]Создание версии продукта '[% product.name FILTER html %]'[% END %]
[% subheader = BLOCK %]Страница добавления новой версии для продукта
'[% product.name FILTER html %]'.[% END %]
[% PROCESS global/header.html.tmpl
title = title
subheader = subheader
%]
<form method="post" action="editversions.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th align="right"><label for="version">Версия:</label></th>
<td><input id="version" size="64" maxlength="64" name="version"
value=""></td>
</tr>
</table>
<input type="submit" id="create" value="Создать">
<input type="hidden" name="action" value="new">
<input type="hidden" name='product' value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
[% PROCESS admin/versions/footer.html.tmpl
no_add_version_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the version belongs.
# version: object; Bugzilla::Version object representing the
# version the user wants to edit.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Изменение версии '[% version.name FILTER html %]' продукта '
[%- product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
<form method="post" action="editversions.cgi">
<table border="0" cellpadding="4" cellspacing="0">
<tr>
<th class="field_label"><label for="version">Версия:</label></th>
<td><input id="version" size="64" maxlength="64" name="version" value="
[%- version.name FILTER html %]"></td>
</tr>
<tr>
<th class="field_label"><label for="isactive">Доступна для [% terms.Bugs_gen %]:</label></th>
<td><input id="isactive" name="isactive" type="checkbox" value="1"
[% 'checked="checked"' IF version.isactive %]></td>
</tr>
</table>
<input type="hidden" name="versionold" value="[% version.name FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update" value="Сохранить изменения">
</form>
[% PROCESS admin/versions/footer.html.tmpl
no_edit_version_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the version belongs.
# version: object; Bugzilla::Version object representing the version
#
# no_XXX_link: boolean; if defined, then don't show the corresponding
# link. Supported parameters are:
#
# no_edit_version_link
# no_edit_other_versions_link
# no_add_version_link
#%]
<hr>
<p>
[% UNLESS no_add_version_link %]
<a title="Создать версию продукта '[% product.name FILTER html %]'"
href="editversions.cgi?action=add&amp;product=
[%- product.name FILTER uri %]">Создать</a> новую версию.
[% END %]
[% IF version.name && !no_edit_version_link %]
Изменить версию <a
title="Edit Version '[% version.name FILTER html %]' продукта '
[%- product.name FILTER html %]'"
href="editversions.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;version=
[%- version.name FILTER uri %]">
'[% version.name FILTER html %]'</a>.
[% END %]
[% UNLESS no_edit_other_versions_link %]
Изменить другие версии продукта <a
href="editversions.cgi?product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
[% END %]
Изменить продукт <a
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
</p>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; Bugzilla::Product object representing the product to
# which the versions belongs.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Выберите версию
'[% product.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
[% edit_contentlink = BLOCK %]editversions.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;version=%%name%%[% END %]
[% delete_contentlink = BLOCK %]editversions.cgi?action=del&amp;product=
[%- product.name FILTER uri %]&amp;version=%%name%%[% END %]
[% bug_count_contentlink = BLOCK %]buglist.cgi?version=%%name%%&amp;product=
[%- product.name FILTER uri %][% END %]
[% columns = [
{
name => "name"
heading => "Изменить..."
contentlink => edit_contentlink
},
{
name => "isactive"
heading => "Доступна"
yesno_field => 1
}
]
%]
[% IF showbugcounts %]
[% columns.push({
name => "bug_count"
heading => "$terms.Bugs_gen"
align => "right"
contentlink => bug_count_contentlink
})
%]
[% END %]
[% columns.push({
heading => "Действие"
content => "Удалить"
contentlink => delete_contentlink
})
%]
[% Hook.process('before_table') %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = product.versions
%]
[% IF ! showbugcounts %]
<p><a href="editversions.cgi?product=[% product.name FILTER uri %]&amp;showbugcounts=1">
Показать счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS admin/versions/footer.html.tmpl
no_edit_other_versions_link = 1
%]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# products: array of product objects
# showbugcounts: if defined, then bug counts should be included in the table
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Выберите продукт?"
%]
[% columns = [
{
name => "name"
heading => "Изменить версии..."
contentlink => "editversions.cgi?product=%%name%%"
},
{
name => "description"
heading => "Описание"
allow_html_content => 1
}
]
%]
[% IF showbugcounts %]
[% columns.push({
name => 'bug_count'
heading => "$terms.Bugs_gen"
align => "right"
contentlink => "buglist.cgi?product=%%name%%"
})
%]
[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = products
%]
[% IF !showbugcounts %]
<p><a href="editversions.cgi?showbugcounts=1">
Показать счетчики [% terms.bugs_gen %] (требует времени)</a></p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% INCLUDE global/header.html.tmpl
title = "Правила для комментариев при изменении состояния"
style_urls = ['skins/standard/admin.css']
%]
<script type="text/javascript">
<!--
function toggle_cell(cell) {
if (cell.checked)
cell.parentNode.className = "checkbox-cell checked";
else
cell.parentNode.className = "checkbox-cell";
}
//-->
</script>
<p>
Определение переходов между состояниями, требующих от пользователя
обязательного указания комментария.
</p>
<form id="workflow_form" method="POST" action="editworkflow.cgi">
<table>
<tr>
<th colspan="2">&nbsp;</th>
<th colspan="[% statuses.size FILTER html %]" class="title">В</th>
</tr>
<tr>
<th rowspan="[% statuses.size + 2 FILTER html %]" class="title">Из</th>
<th>&nbsp;</th>
[% FOREACH status = statuses %]
<th class="col-header[% status.is_open ? " open-status" : " closed-status" %]">
[% display_value("bug_status", status.name) FILTER html %]
</th>
[% END %]
</tr>
[%# This defines the entry point in the workflow %]
[% p = [{id => 0, name => "{Начальное}", is_open => 1}] %]
[% FOREACH status = p.merge(statuses) %]
<tr class="highlight">
<th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]">
[% display_value("bug_status", status.name) FILTER html %]
</th>
[% FOREACH new_status = statuses %]
[% IF workflow.${status.id}.${new_status.id}.defined %]
<td align="center" class="checkbox-cell
[% " checked" IF workflow.${status.id}.${new_status.id} %]"
title="[% status.name FILTER html %] -&gt; [% new_status.name FILTER html %]">
<input type="checkbox" name="c_[% status.id %]_[% new_status.id %]"
id="c_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)"
[% " checked='checked'" IF workflow.${status.id}.${new_status.id} %]>
</td>
[% ELSE %]
<td class="checkbox-cell forbidden">&nbsp;</td>
[% END %]
[% END %]
</tr>
[% END %]
</table>
<p align="center">
<input type="hidden" name="action" value="update_comment">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update_comment" value="Сохранить изменения"> -
<a href="editworkflow.cgi?action=edit_comment">Отменить изменения</a> -
<a href="editworkflow.cgi">Переходы между состояниями</a>
</p>
</form>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% INCLUDE global/header.html.tmpl
title = "Переходы между состояниями $terms.bugs_gen"
style_urls = ['skins/standard/admin.css']
%]
<script type="text/javascript">
<!--
function toggle_cell(cell) {
if (cell.checked)
cell.parentNode.className = "checkbox-cell checked";
else
cell.parentNode.className = "checkbox-cell";
}
//-->
</script>
<p>
Настройка разрешенных переходов между состояниями [% terms.bugs_gen %].
Для совместимости с предыдущими версиями [% terms.Bugzilla %], повторное открытие [% terms.bug_gen %]
допускает только одно из состояний <b>[% display_value("bug_status", "UNCONFIRMED") FILTER html %]</b> или
<b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> (если соответствующие переходы разрешены).
Выбор зависит от того, была ли [% terms.bug %] подтверждена до принятия решения.
Рекомендуется разрешить оба перехода и оставить выбор на усмотрение [% terms.Bugzilla %].
</p>
<form id="workflow_form" method="POST" action="editworkflow.cgi">
<table>
<tr>
<th colspan="2">&nbsp;</th>
<th colspan="[% statuses.size FILTER html %]" class="title">В</th>
</tr>
<tr>
<th rowspan="[% statuses.size + 2 FILTER html %]" class="title">Из</th>
<th>&nbsp;</th>
[% FOREACH status = statuses %]
<th class="col-header[% status.is_open ? " open-status" : " closed-status" %]">
[% display_value("bug_status", status.name) FILTER html %]
</th>
[% END %]
</tr>
[%# This defines the entry point in the workflow %]
[% p = [{id => 0, name => "{Начальное}", is_open => 1}] %]
[% FOREACH status = p.merge(statuses) %]
<tr class="highlight">
<th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]">
[% display_value("bug_status", status.name) FILTER html %]
</th>
[% FOREACH new_status = statuses %]
[% IF status.id != new_status.id %]
[% checked = workflow.${status.id}.${new_status.id}.defined ? 1 : 0 %]
[% mandatory = (status.id && new_status.name == Param("duplicate_or_move_bug_status")) ? 1 : 0 %]
<td align="center" class="checkbox-cell[% " checked" IF checked || mandatory %]"
title="[% status.name FILTER html %] -&gt; [% new_status.name FILTER html %]">
<input type="checkbox" name="w_[% status.id %]_[% new_status.id %]"
id="w_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)"
[%+ "checked='checked'" IF checked || mandatory %]
[%+ "disabled='disabled'" IF mandatory %]>
</td>
[% ELSE %]
<td class="checkbox-cell forbidden">&nbsp;</td>
[% END %]
[% END %]
</tr>
[% END %]
</table>
<p>
При принятии решения о дублировании [% terms.bug_gen %] или перемещении
в другую базу данных состояние [% terms.bug_gen %] автоматически устанавливается в
<b>[% display_value("bug_status", Param("duplicate_or_move_bug_status")) FILTER html %]</b>. Переходы
в это состояние должны быть допустимы из любого, поэтому изменения для него
запрещены.<br>
Это может быть изменено на странице
<a href="editparams.cgi?section=bugchange#duplicate_or_move_bug_status">Настройки</a>
изменением параметра <i>duplicate_or_move_bug_status</i>.
</p>
<p align="center">
<input type="hidden" name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update_workflow" value="Сохранить изменения"> -
<a href="editworkflow.cgi">Отменить изменения</a> -
<a href="editworkflow.cgi?action=edit_comment">Правила для комментариев при изменении состояния</a>
</p>
</form>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Поиск приложения",
onload = "document.forms['choose-id'].id.focus()"
%]
<form name="choose-id" method="get" action="attachment.cgi">
<p>Доступ к приложению по его номеру:</p>
<p>ID приложения: <input name="id" size="6">
<button name="action" value="edit" id="edit">Изменить</button>
<button name="action" value="view" id="view">Перейти</button>
</p>
</form>
<form method="get" action="show_bug.cgi">
<p>Доступ через список приложений [% terms.bug_gen %]:</p>
<p>Номер [% terms.bug_gen %]: <input name="id" size="6">
<input type="submit" name="action" value="Перейти" id="action">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# a: attachment object; attachment the user wants to delete.
# token: string; The token used to identify the session.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
Удалить приложение [% a.id FILTER html %] [%+ terms.bug_gen %] [%+ a.bug_id FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
doc_section = "attachments.html"
%]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th valign="top" align="left">Поле</th>
<th valign="top" align="left">Значение</th>
</tr>
<tr>
<td valign="top">ID приложения:</td>
<td valign="top">
<a href="attachment.cgi?id=[% a.id FILTER html %]">[% a.id FILTER html %]</a>
</td>
</tr>
<tr>
<td valign="top">Имя файла:</td>
<td valign="top">[% a.filename FILTER html %]</td>
</tr>
<tr>
<td valign="top">Описание:</td>
<td valign="top">[% a.description FILTER html %]</td>
</tr>
<tr>
<td valign="top">К [% terms.bug_dat %]:</td>
<td valign="top">[% a.bug_id FILTER bug_link(a.bug_id) FILTER none %]</td>
</tr>
<tr>
<td valign="top">Создал:</td>
<td valign="top">[% a.attacher.identity FILTER html %]</td>
</tr>
<tr>
<td valign="top">Дата создания:</td>
<td valign="top">[% a.attached FILTER time %]</td>
</tr>
</table>
<h2>Подтверждение</h2>
<table border="0" cellpadding="20" width="70%" bgcolor="red">
<tr>
<td>
Отменить удаление приложения <b>невозможно</b>.
</td>
</tr>
</table>
<p>Подтвердите удаление приложения</p>
<form action="attachment.cgi" method="POST">
<label for="reason">Причина удаления:</label>
<input type="text" id="reason" name="reason" value="" size="80" maxlength="200">
<br>
<input type="submit" value="Да, удалить" id="delete">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="[% a.id FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
<p>
Отменить удаление и вернуться к
[%+ "$terms.bug_dat " _ a.bug_id FILTER bug_link(a.bug_id) FILTER none %].
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[%# Define strings that will serve as the title and header of this page %]
[% title = BLOCK %]Создать новое приложение для [% terms.bug_gen %] #[% bug.bug_id %][% END %]
[% header = BLOCK %]Создать новое приложение для
[%+ "$terms.bug_gen $bug.bug_id" FILTER bug_link(bug) FILTER none %][% END %]
[% subheader = BLOCK %][% bug.short_desc FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
header = header
subheader = subheader
style_urls = [ 'skins/standard/attachment.css' ]
yui = [ 'autocomplete' ]
javascript_urls = [ "js/attachment.js", 'js/field.js', "js/util.js", "js/TUI.js" ]
doc_section = "attachments.html"
%]
<script type="text/javascript">
<!--
TUI_hide_default('attachment_text_field');
-->
</script>
<form name="entryform" method="post" action="attachment.cgi"
enctype="multipart/form-data"
onsubmit="return validateAttachmentForm(this)">
<input type="hidden" name="bugid" value="[% bug.bug_id %]">
<input type="hidden" name="action" value="insert">
<input type="hidden" name="token" value="[% token FILTER html %]">
<table class="attachment_entry">
[% PROCESS attachment/createformcontents.html.tmpl %]
[%# Additional fields for attachments on existing bugs: %]
[% IF attachments.size %]
<tr>
<th>Заменяет:</th>
<td>
<em>(необязательно) Укажите приложения к [% terms.bug_dat %], которые заменены этим.</em><br>
[% FOREACH attachment = attachments %]
<input type="checkbox" id="[% attachment.id %]"
name="obsolete" value="[% attachment.id %]">
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">[% attachment.id %]: [% attachment.description FILTER html %]</a><br>
[% END %]
</td>
</tr>
[% END %]
[% IF (user.id != bug.assigned_to.id) AND user.in_group("editbugs", bug.product_id) %]
<tr>
<th>Изменение исполнителя:</th>
<td>
<em>Если вы хотите стать исполнителем [% terms.bug_gen %],
выберите этот вариант.</em><br>
<input type="checkbox" id="takebug" name="takebug" value="1">
<label for="takebug">взять [% terms.bug_acc %] на себя</label>
[% bug_statuses = [] %]
[% FOREACH bug_status = bug.status.can_change_to %]
[% NEXT IF bug_status.name == "UNCONFIRMED"
&& !bug.product_obj.allows_unconfirmed %]
[% bug_statuses.push(bug_status) IF bug_status.is_open %]
[% END %]
[% IF bug_statuses.size %]
<label for="takebug">и установить состояние [% terms.bug_gen %]</label>
<select id="bug_status" name="bug_status">
<option value="[% bug.status.name FILTER html %]">[% display_value("bug_status", bug.status.name) FILTER html %] (текущее)</option>
[% FOREACH bug_status = bug_statuses %]
[% NEXT IF bug_status.id == bug.status.id %]
<option value="[% bug_status.name FILTER html %]">[% display_value("bug_status", bug_status.name) FILTER html %]</option>
[% END %]
</select>
[% END %]
</td>
</tr>
[% END %]
<tr>
<th><label for="comment">Комментарий:</label></th>
<td>
<em>(дополнительно) Добавьте комментарий для этого приложения к [% terms.bug_dat %].</em><br>
[% INCLUDE global/textarea.html.tmpl
name = 'comment'
id = 'comment'
minrows = 6
maxrows = 15
cols = constants.COMMENT_COLS
wrap = 'soft'
%]
[% IF NOT bug.cc.contains(user.login) %]
<br>
<input type="checkbox" id="addselfcc" name="addselfcc"
[%~ ' checked="checked"'
IF user.settings.state_addselfcc.value == 'always'
|| (!bug.user.has_any_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Добавить меня в список подписанных пользователей</label>
[% END %]
</td>
</tr>
[% IF user.is_insider %]
<tr>
<th>Конфиденциальность:</th>
<td>
<input type="checkbox" name="isprivate" id="isprivate"
value="1" onClick="updateCommentPrivacy(this)">
<label for="isprivate">
Сделать приложение и комментарий конфиденциальными
(видимыми только членам группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
</td>
</tr>
[% END %]
[% Hook.process('form_before_submit') %]
<tr>
<th>&nbsp;</th>
<td><input type="submit" id="create" value="Сохранить"></td>
</tr>
</table>
</form>
[% Hook.process('end') %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# attachment: object of the attachment just created.
# contenttypemethod: string. How we got the content type of the attachment.
# Possible values: autodetect, list, manual.
#%]
[% PROCESS global/variables.none.tmpl %]
[% bug = bugs.0 %]
[% PROCESS "bug/show-header.html.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Приложение $attachment.id добавлено к $terms.bug_dat $attachment.bug_id"
%]
<dl>
<dt>
<a title="[% attachment.description FILTER html %]"
href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">Приложение [% attachment.id %]</a>
к [% "$terms.bug_dat $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %] создано
</dt>
<dd>
[% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = attachment.bug_id %]
[% IF convertedbmp %]
<p>
<b>Note:</b> [% terms.Bugzilla %] автоматически преобразовала файл BMP
в сжатый формат PNG.
</p>
[% END %]
[% IF contenttypemethod == 'autodetect' %]
<p>
<b>Примечание:</b> [% terms.Bugzilla %] автоматически определила тип
<em>[% attachment.contenttype FILTER html %]</em> приложения.
Вы можете изменить тип приложения
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">здесь</a>.
</p>
[% END %]
[%# Links to more information about the changed bug. %]
[% Hook.process("links") %]
</dd>
</dl>
<p>
<a href="attachment.cgi?bugid=[% attachment.bug_id %]&amp;action=enter">Создать
другое приложение к [% terms.bug_dat %] [%+ attachment.bug_id %]</a>
</p>
[% PROCESS bug/show.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% max_local = Param('maxlocalattachment') * 1024 %]
[% max_limit = Param('maxattachmentsize')> max_local ? Param('maxattachmentsize') : max_local %]
<tr class="attachment_data">
<th><label for="data">Файл</label>:</th>
<td>
<em>Введите путь к файлу на вашем компьютере</em> (или
<a id="attachment_data_controller" href="javascript:TUI_toggle_class('attachment_text_field');
javascript:TUI_toggle_class('attachment_data')"
>вставьте текст как приложение</a>).<br>
<input type="file" id="data" name="data" size="50" onchange="DataFieldHandler()">
<br><em>(Максимальный размер файла: [% max_limit FILTER html %] КБ)</em>
</td>
</tr>
<tr class="attachment_text_field">
<th><label for="attach_text">Файл</label>:</th>
<td>
<em>Вставьте текст, чтобы добавить его как приложение</em> (или
<a id="attachment_text_field_controller" href="javascript:TUI_toggle_class('attachment_text_field');
javascript:TUI_toggle_class('attachment_data')"
>приложите файл</a>).<br>
<textarea id="attach_text" name="attach_text" cols="80" rows="15"
onkeyup="TextFieldHandler()" onblur="TextFieldHandler()"></textarea>
</td>
</tr>
<tr>
<th class="required"><label for="description">Описание</label>:</th>
<td>
<em>Кратко опишите приложение.</em><br>
<input type="text" id="description" name="description" class="required"
size="60" maxlength="200">
</td>
</tr>
<tr[% ' class="expert_fields"' UNLESS bug.id %]>
<th>Тип приложения:</th>
<td>
<em>Является ли приложение патчем?</em><br>
<input type="checkbox" id="ispatch" name="ispatch" value="1"
onchange="setContentTypeDisabledState(this.form);">
<label for="ispatch">патч</label><br><br>
[%# Reset this whenever the page loads so that the JS state is up to date %]
<script type="text/javascript">
YAHOO.util.Event.onDOMReady(function() {
bz_fireEvent(document.getElementById('ispatch'), 'change');
});
</script>
<em>Иначе, выберите метод определения типа файла.</em><br>
<input type="radio" id="autodetect"
name="contenttypemethod" value="autodetect" checked="checked">
<label for="autodetect">автоопределение</label><br>
<input type="radio" id="list"
name="contenttypemethod" value="list">
<label for="list">выберите из списка</label>:
<select name="contenttypeselection" id="contenttypeselection"
onchange="this.form.contenttypemethod[1].checked = true;">
[% PROCESS content_types %]
</select><br>
<input type="radio" id="manual"
name="contenttypemethod" value="manual">
<label for="manual">введите вручную</label>:
<input type="text" name="contenttypeentry" id="contenttypeentry"
size="30" maxlength="200"
onchange="if (this.value) this.form.contenttypemethod[2].checked = true;">
</td>
</tr>
<tr[% ' class="expert_fields"' UNLESS bug.id %]>
<td> </td>
<td>
[% IF flag_types && flag_types.size > 0 %]
[% PROCESS "flag/list.html.tmpl" %]<br>
[% END %]
</td>
</tr>
[% BLOCK content_types %]
[% mimetypes = [{type => "text/plain", desc => "простой текст"},
{type => "text/html", desc => "HTML файл"},
{type => "application/xml", desc => "XML файл"},
{type => "image/gif", desc => "изображение GIF"},
{type => "image/jpeg", desc => "изображение JPEG"},
{type => "image/png", desc => "изображение PNG"},
{type => "application/pdf", desc => "документ PDF"},
{type => "application/octet-stream", desc => "бинарный файл"}]
%]
[% Hook.process("mimetypes", "attachment/createformcontents.html.tmpl") %]
[% FOREACH m = mimetypes %]
<option value="[% m.type FILTER html %]">[% m.desc FILTER html %] ([% m.type FILTER html %])</option>
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# attachment: object of the attachment the user wants to delete.
# reason: string; The reason provided by the user.
#%]
Содержание приложения [% attachment.id %] было удалено
[%~ IF reason %] по следующей причине:
[%+ reason %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# This line is really long for a reason: to get rid of any possible textnodes
# between the elements. This is necessary because DOM parent-child-sibling
# relations can change and screw up the javascript for restoring, collapsing
# and expanding. Do not change without testing all three of those.
# Also, the first empty row is required because 'table-layout: fixed' only
# considers the first row to determine column widths. If a colspan is found,
# it then share the width equally among all columns, which we don't want.
#%]
<table class="file_table"><thead><tr><td class="num"></td><td></td><td class="num"></td><td></td></tr><tr><td class="file_head" colspan="4"><a href="#" onclick="return twisty_click(this)">[% collapsed ? '(+)' : '(-)' %]</a><input type="checkbox" name="[% file.filename FILTER html %]"[% collapsed ? '' : ' checked' %] style="display: none">
[% IF lxr_prefix && !file.is_add %]
<a href="[% lxr_prefix %]">[% file.filename FILTER html %]</a>
[% ELSE %]
[% file.filename FILTER html %]
[% END %]
[% IF file.plus_lines %]
[% IF file.minus_lines %]
(-[% file.minus_lines %]&nbsp;/&nbsp;+[% file.plus_lines %]&nbsp;lines)
[% ELSE %]
(+[% file.plus_lines %]&nbsp;lines)
[% END %]
[% ELSE %]
[% IF file.minus_lines %]
(-[% file.minus_lines %]&nbsp;lines)
[% END %]
[% END %]
</td></tr></thead><tbody class="[% collapsed ? 'file_collapse' : 'file' %]">
<script type="text/javascript">
incremental_restore()
</script>
[% section_num = 0 %]
[% FOREACH section = sections %]
[% section_num = section_num + 1 %]
<tr><th colspan="4" class="section_head">
<table id="[% file.filename FILTER html %]_sec[% section_num %]" cellpadding="0" cellspacing="0">
<tr><th width="95%" align="left">
[% IF file.is_add %]
Добавлен
[% ELSIF file.is_remove %]
[% IF bonsai_prefix %]
<a href="[% bonsai_prefix %]">Удален</a>
[% ELSE %]
Удален
[% END %]
[% ELSE %]
[% IF bonsai_prefix %]
<a href="[% bonsai_prefix %]#[% section.old_start %]">
[% END %]
[% IF section.old_lines > 1 %]
&nbsp;Строки&nbsp;[% section.old_start %]-[% section.old_start +
section.old_lines - 1 %]
[% ELSE %]
Строка&nbsp;[% section.old_start %]
[% END %]
[% IF bonsai_prefix %]
</a>
[% END %]
&nbsp;&nbsp;[% section.func_info FILTER html IF section.func_info %]
[% END %]
</th><th>
<a href="#[% file.filename FILTER html %]_sec[% section_num %]">Ссылка</a>&nbsp;
</th></tr></table>
</th></tr>
[% current_line_old = section.old_start %]
[% current_line_new = section.new_start %]
[% FOREACH group = section.groups %]
[% IF group.context %]
[% FOREACH line = group.context %]
<tr>
<td class="num">[% current_line_old %]</td>
<td><pre>[% line FILTER html %]</pre></td>
<td class="num">[% current_line_new %]</td>
<td><pre>[% line FILTER html %]</pre></td>
</tr>
[% current_line_old = current_line_old + 1 %]
[% current_line_new = current_line_new + 1 %]
[% END %]
[% END %]
[% IF group.plus.size %]
[% IF group.minus.size %]
[% i = 0 %]
[% WHILE (i < group.plus.size || i < group.minus.size) %]
[%# WHILE cannot loop more than 1000 times by default, so we break it every 500 times. %]
[% currentloop = 0 %]
[% WHILE currentloop < 500 && (i < group.plus.size || i < group.minus.size) %]
<tr>
[% IF i < group.minus.size %]
<td class="num">[% current_line_old + i %]</td>
<td class="changed"><pre>[% group.minus.$i FILTER html %]</pre></td>
[% ELSIF i == group.minus.size %]
[% rowspan = group.plus.size - group.minus.size %]
<td class="num"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
<td class="changed"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
[% END %]
[% IF i < group.plus.size %]
<td class="num">[% current_line_new + i %]</td>
<td class="changed"><pre>[% group.plus.$i FILTER html %]</pre></td>
[% ELSIF i == group.plus.size %]
[% rowspan = group.minus.size - group.plus.size %]
<td class="num"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
<td class="changed"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
[% END %]
</tr>
[% currentloop = currentloop + 1 %]
[% i = i + 1 %]
[% END %]
[% END %]
[% current_line_old = current_line_old + group.minus.size %]
[% current_line_new = current_line_new + group.plus.size %]
[% ELSE %]
[% FOREACH line = group.plus %]
[% IF file.is_add %]
<tr>
<td class="num">[% current_line_new %]</td>
<td class="added" colspan="3"><pre>[% line FILTER html %]</pre></td>
</tr>
[% ELSE %]
<tr>
[% IF loop.first %]
<td class="num"[% IF group.plus.size > 1 %] rowspan="[% group.plus.size %]"[% END %]></td>
<td[% IF group.plus.size > 1 %] rowspan="[% group.plus.size %]"[% END %]></td>
[% END %]
<td class="num">[% current_line_new %]</td>
<td class="added"><pre>[% line FILTER html %]</pre></td>
</tr>
[% END %]
[% current_line_new = current_line_new + 1 %]
[% END %]
[% END %]
[% ELSE %]
[% IF group.minus.size %]
[% FOREACH line = group.minus %]
[% IF file.is_remove %]
<tr>
<td class="num">[% current_line_old %]</td>
<td class="removed" colspan="3"><pre>[% line FILTER html %]</pre></td>
</tr>
[% ELSE %]
<tr>
<td class="num">[% current_line_old %]</td>
<td class="removed"><pre>[% line FILTER html %]</pre></td>
[% IF loop.first %]
<td class="num"[% IF group.minus.size > 1 %] rowspan="[% group.minus.size %]"[% END %]></td>
<td[% IF group.minus.size > 1 %] rowspan="[% group.minus.size %]"[% END %]></td>
[% END %]
</tr>
[% END %]
[% current_line_old = current_line_old + 1 %]
[% END %]
[% END %]
[% END %]
[% END %]
[% END %]
</table>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
</form>
[% IF headers %]
<br>
[% PROCESS global/variables.none.tmpl %]
<span>Вернуться к [% "$terms.bug_dat $bugid" FILTER bug_link(bugid) FILTER none %]</span>
[% PROCESS global/footer.html.tmpl %]
[% ELSE %]
</body>
</html>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# Define strings that will serve as the title and header of this page %]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
[% IF attachid %]
Приложение #[% attachid %] к [% terms.bug_dat %] #[% bugid %]
[% ELSE %]
Сравнение приложений #[% oldid %] и #[% newid %] к [% terms.bug_dat %] #[% bugid %]
[% END %]
[% END %]
[% onload = 'restore_all(); document.checkboxform.restore_indicator.checked = true' %]
[% BLOCK viewurl %]attachment.cgi?id=[% id %][% END %]
[% BLOCK editurl %][% PROCESS viewurl %]&amp;action=edit[% END %]
[% BLOCK diffurl %][% PROCESS viewurl %]&amp;action=diff[% END %]
[% IF headers %]
[% header = BLOCK %]
[% IF attachid %]
Приложение #[% attachid %]: [% description FILTER html %]
[% ELSE %]
Сравнение приложений
#[% oldid %]: <a href="[% PROCESS diffurl id=oldid %]">[% old_desc FILTER html %]</a>
и
#[% newid %]: <a href="[% PROCESS diffurl id=newid %]">[% new_desc FILTER html %]</a>
[% END %]
к <a href="show_bug.cgi?id=[% bugid %]">[% terms.bug_dat %] #[% bugid %]</a>
[% END %]
[% subheader = BLOCK %]
[% bugsummary FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl doc_section = "attachments.html#patchviewer"
javascript_urls = "js/attachment.js"
style_urls = ['skins/standard/attachment.css'] %]
[% ELSE %]
<html>
<head>
<link href="[% 'skins/standard/attachment.css' FILTER mtime %]"
rel="stylesheet" type="text/css">
<script src="[% 'js/attachment.js' FILTER mtime %]"
type="text/javascript"></script>
</head>
<body onload="[% onload FILTER html %]">
[% END %]
[%# If we have attachid, we are in diff, otherwise we're in interdiff %]
[% IF attachid %]
[%# HEADER %]
[% IF headers %]
<a href="[% PROCESS viewurl id=attachid %]">Просмотр</a>
| <a href="[% PROCESS editurl id=attachid %]">Свойства</a>
| <a href="[% PROCESS diffurl id=attachid %]&amp;context=[% context FILTER uri %]&amp;collapsed=[% collapsed FILTER uri %]&amp;headers=[% headers FILTER uri %]&amp;format=raw">Raw&nbsp;Unified</a>
| Вернуться к [% "$terms.bug_dat $bugid" FILTER bug_link(bugid) FILTER none %]
[%# FIXME-ru: переводить ли Raw и Unified? %]
[% END %]
[% IF other_patches.size > 0 %]
[% IF headers %] |[%END%]
Сравнение
<form style="display: inline" action="attachment.cgi">
<select name="oldid">
[% FOREACH patch = other_patches %]
<option value="[% patch.id %]"
[% IF patch.selected %] выбран[% END %]
>[% patch.desc FILTER html %]</option>
[% END %]
</select>
и данным патчем
<input type="submit" id="diff" value="Сравнить">
<input type="hidden" name="action" value="interdiff">
<input type="hidden" name="newid" value="[% attachid %]">
<input type="hidden" name="headers" value="[% headers FILTER html %]">
</form>
[% END %]
<br>
[% ELSE %]
[% IF headers %]
<a href="attachment.cgi?oldid=[% oldid %]&amp;newid=[% newid %]&amp;action=interdiff&amp;format=raw">Raw Unified</a>
| Вернуться к [% "$terms.bug_dat $bugid" FILTER bug_link(bugid) FILTER none %]
|
[% END %]
[% END %]
[%# Collapse / Expand %]
<a href="#"
onmouseover="lastStatus = window.status; window.status='Collapse All'; return true"
onmouseout="window.status = lastStatus; return true"
onclick="return collapse_all()">Свернуть все</a> |
<a href="#"
onmouseover="lastStatus = window.status; window.status='Expand All'; return true"
onmouseout="window.status = lastStatus; return true"
onclick="return expand_all()">Развернуть все</a>
[% IF do_context %]
[%# only happens for normal viewing, not interdiff %]
| <span style='font-weight: bold'>Контекст:</span>
[% IF context == "patch" %]
(<strong>Патч</strong> /
[% ELSE %]
(<a href="[% PROCESS diffurl id=attachid %]&amp;headers=[% headers FILTER uri %]">Патч</a> /
[% END %]
[% IF context == "file" %]
<strong>Файл</strong> /
[% ELSE %]
<a href="[% PROCESS diffurl id=attachid %]&amp;headers=[% headers FILTER uri %]&amp;context=file">Файл</a> /
[% END %]
[% IF context == "patch" || context == "file" %]
[% context = 3 %]
[% END %]
[%# textbox for context %]
<form style="display: inline" action="attachment.cgi"><input type="hidden" name="action" value="diff"><input type="hidden" name="id" value="[% attachid %]"><input type="hidden" name="collapsed" value="[% collapsed FILTER html %]"><input type="hidden" name="headers" value="[% headers FILTER html %]"><input type="text" name="context" value="[% context FILTER html %]" size="3"></form>)
[% END %]
[% IF warning %]
<h2 class="warning">Внимание:
[% IF warning == "interdiff1" %]
данное сравнение двух патчей может некорректно отображать расположение изменений
в силу ограничений [% terms.Bugzilla %] при сравнении патчей между разными
наборами файлов.
[% END %]
[% IF warning == "interdiff2" %]
сравнение двух патчей может быть неточным в силу ограничений
[%+ terms.Bugzilla %] при сравнении патчей между разными ревизиями файла.
[% END %]
</h2>
[% ELSE %]
<br><br>
[% END %]
[%# Restore Stuff %]
<form name="checkboxform" action="attachment.cgi">
<input type="checkbox" name="restore_indicator" style="display: none">
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[%# Define strings that will serve as the title and header of this page %]
[% title = BLOCK %]
Свойства приложения [% attachment.id %] для [% terms.bug_gen %] [%+ attachment.bug_id %]
[% END %]
[% header = BLOCK %]
Свойства приложения [% attachment.id %] для
[%+ "$terms.bug_gen ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]
[% END %]
[% subheader = BLOCK %][% attachment.bug.short_desc FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
header = header
subheader = subheader
doc_section = "attachments.html"
javascript_urls = ['js/attachment.js', 'js/field.js']
style_urls = ['skins/standard/attachment.css']
yui = [ 'autocomplete' ]
bodyclasses = "no_javascript"
%]
[%# No need to display the Diff button and iframe if the attachment is not a patch. %]
[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) %]
[% can_edit = attachment.validate_can_edit %]
[% editable_or_hide = can_edit ? "" : " bz_hidden_option" %]
<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
<input type="hidden" name="id" value="[% attachment.id %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="contenttypemethod" value="manual">
<input type="hidden" name="delta_ts" value="[% attachment.modification_time FILTER html %]">
[% IF user.id %]
<input type="hidden" name="token" value="[% issue_hash_token([attachment.id, attachment.modification_time]) FILTER html %]">
[% END %]
<div id="attachment_info" class="attachment_info [% IF can_edit %] edit[% ELSE %] read[% END%]">
<div id="attachment_attributes">
<div id="attachment_information_read_only" class="[% "bz_private" IF attachment.isprivate %]">
<div class="title">
[% "[patch]" IF attachment.ispatch%]
<span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]">
[% attachment.description FILTER html %]
</span>
[% IF can_edit %]
<span class="bz_edit">(<a href="javascript:toggle_attachment_details_visibility()">изменить информацию</a>)</span>
[% END %]
</div>
<div class="details">
[% attachment.filename FILTER html %] ([% attachment.contenttype FILTER html %]),
[% IF attachment.datasize %]
[%+ attachment.datasize FILTER unitconvert %]
[% ELSE %]
<em>удалено</em>
[% END %], создано [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] в [%+ attachment.attached FILTER time %]
[% IF attachment.isprivate %];
<span class="bz_private">видимо только для <strong>[% Param('insidergroup') FILTER html %]</strong> членов группы</span>
[% END %]
</div>
</div>
<div id="attachment_information_edit">
<span class="bz_hide">
(<a href="javascript:toggle_attachment_details_visibility();">hide</a>)
</span>
<div id="attachment_description">
<label for="description">Описание:</label>&nbsp;
[% INCLUDE global/textarea.html.tmpl
id = 'description'
name = 'description'
minrows = 3
cols = 25
wrap = 'soft'
classes = 'block' _ editable_or_hide
defaultcontent = attachment.description
%]
</div>
<div id="attachment_filename">
<label for="filename">Имя файла:</label>
<input type="text" size="20" class="text block[% editable_or_hide %]"
id="filename" name="filename"
value="[% attachment.filename FILTER html %]">
</div>
<div id="attachment_mimetype">
<label for="contenttypeentry">Тип файла:</label>
<input type="text" size="20" class="text block[% editable_or_hide %]"
id="contenttypeentry" name="contenttypeentry"
value="[% attachment.contenttype FILTER html %]">
</div>
<div id="attachment_creator">
<span class="label">Автор:</span>
[%+ INCLUDE global/user.html.tmpl who = attachment.attacher %]
</div>
<div id="attachment_created">
<span class="label">Дата создания:</span>
[%+ attachment.attached FILTER time %]
</div>
<div id="attachment_size">
<span class="label">Размер:</span>
[% IF attachment.datasize %]
[%+ attachment.datasize FILTER unitconvert %]
[% ELSE %]
<em>удалено</em>
[% END %]
</div>
<div id="attachment_ispatch">
<input type="checkbox" id="ispatch" name="ispatch" value="1"
[%+ 'checked="checked"' IF attachment.ispatch %]>
<label for="ispatch">патч</label>
</div>
<div class="readonly">
<div class="checkboxes">
<div id="attachment_isobsolete">
<input type="checkbox" id="isobsolete" name="isobsolete" value="1"
[%+ 'checked="checked"' IF attachment.isobsolete %]>
<label for="isobsolete">неактуально</label>
</div>
[% IF user.is_insider %]
<div id="attachment_isprivate">
<input type="checkbox" id="isprivate" name="isprivate" value="1"
[%+ 'checked="checked"' IF attachment.isprivate %]>
[% IF can_edit %]
<label for="isprivate">конфиденциально (видимо только членам группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
[% ELSE %]
<span class="label">Конфиденциально:</span>
[%+ attachment.isprivate ? "да" : "нет" %]
[% END %]
</div>
[% END %]
</div>
</div>
</div>
<div id="attachment_view_window">
[% IF !attachment.datasize %]
<div><b>Содержание приложения удалено.</b></div>
[% ELSIF !Param("allow_attachment_display") %]
<div id="view_disabled">
<p><b>
Приложение недоступно для просмотра в целях безопасности
согласно ограничениям установленным администратором [% terms.Bugzilla %].
</b></p>
<p><b>
Для просмотра содержимого приложения следует
<a href="attachment.cgi?id=[% attachment.id %]">его загрузить</a>.
</b></p>
</div>
[% ELSIF attachment.is_viewable %]
<div>
[% INCLUDE global/textarea.html.tmpl
id = 'editFrame'
name = 'comment'
classes = 'bz_default_hidden'
minrows = 10
cols = 80
wrap = 'soft'
disabled = 'disabled'
defaultcontent = (attachment.contenttype.match('^text\/')) ?
attachment.data.replace('(.*\n|.+)', '>$1') : undef
%]
[% IF attachment.contenttype == 'text/plain' AND is_safe_url(attachment.data) %]
<p>
<a href="[% attachment.data FILTER html %]">
[% IF attachment.datasize < 120 %]
[% attachment.data FILTER html %]
[% ELSE %]
[% attachment.data FILTER truncate(80) FILTER html %]
...
[% attachment.data.match('.*(.{20})$').0 FILTER html %]
[% END %]
</a>
</p>
[% ELSIF attachment.contenttype == "text/html" %]
[%# For security reasons (clickjacking, embedded scripts), we never
# render HTML pages from here. The source code is displayed instead. %]
[% INCLUDE global/textarea.html.tmpl
id = 'viewFrame'
minrows = 10
cols = 80
defaultcontent = attachment.data
readonly = 'readonly'
%]
[% ELSE %]
<iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]">
<b>Вы не можете одновременно редактировать и просматривать сообщения, потому что ваш браузер не поддерживает IFRAME.
<a href="attachment.cgi?id=[% attachment.id %]">Просмотреть приложение на отдельной странице</a>.</b>
</iframe>
[% END %]
<script type="text/javascript">
<!--
var patchviewerinstalled = 0;
var attachment_id = [% attachment.id %];
if (typeof document.getElementById == "function") {
[% IF use_patchviewer %]
var patchviewerinstalled = 1;
document.write('<iframe id="viewDiffFrame" class="bz_default_hidden"><\/iframe>');
[% END %]
[% IF user.id %]
document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Изменить приложение как текст<\/button>');
document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Отменить изменения<\/button>');
document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Вернуть изменения<\/button>');
var editFrame = document.getElementById('editFrame');
if (editFrame) {
editFrame.disabled = false;
}
[% END %]
[% IF use_patchviewer %]
document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">Просмотр в режиме сравнения<\/button>');
[% END %]
document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" class="bz_default_hidden">Просмотр в исходном виде<\/button>');
}
//-->
</script>
</div>
[% ELSE %]
<div id="noview">
<p><b>
Просмотр приложения невозможен, потому что
ваш браузер не поддерживает тип файлов
([% attachment.contenttype FILTER html %]).
</b></p>
<p><b>
<a href="attachment.cgi?id=[% attachment.id %]">Загрузить приложение</a>.
</b></p>
</div>
[% END %]
</div>
<div id="attachment_comments_and_flags">
[% IF user.id %]
<div id="smallCommentFrame" >
<label for="comment">Комментарий (на [% terms.bug_acc %]):</label>
[% classNames = 'block' %]
[% classNames = "$classes bz_private" IF attachment.isprivate %]
[% INCLUDE global/textarea.html.tmpl
id = 'comment'
name = 'comment'
minrows = 10
cols = 80
wrap = 'soft'
classes = classNames
%]
[% IF NOT attachment.bug.cc.contains(user.login) %]
<input type="checkbox" id="addselfcc" name="addselfcc"
[%~ ' checked="checked"'
IF user.settings.state_addselfcc.value == 'always'
|| (!attachment.bug.user.has_any_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Добавить меня в список подписанных пользователей</label>
[% END %]
</div>
[% END %]
<div id="attachment_flags">
[% IF attachment.flag_types.size > 0 %]
[% PROCESS "flag/list.html.tmpl" flag_types = attachment.flag_types
read_only_flags = !can_edit
%]
[% END %]
</div>
[% Hook.process('form_before_submit') %]
[% IF user.id %]
<div id="update_container">
<input type="submit" value="Отправить" id="update">
</div>
[% END %]
</div>
</div>
</div>
</form>
<div id="attachment_actions">
<span class="label">Действия:</span>
<a href="attachment.cgi?id=[% attachment.id %]">Просмотреть</a>
[% IF use_patchviewer %]
| <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Сравнить</a>
[% END %]
[% IF Param("allow_attachment_deletion")
&& user.in_group('admin')
&& attachment.datasize > 0 %]
| <a href="attachment.cgi?id=[% attachment.id %]&amp;action=delete">Удалить</a>
[% END %]
[% Hook.process('action') %]
</div>
<div id="attachment_list">
Приложения к этой [% "$terms.bug_dat ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]:
[% FOREACH a = attachments %]
[% IF a.isobsolete %]
<span class="bz_obsolete">
[% END %]
[% IF a.id == attachment.id %]
[%+ a.id FILTER html %]
[% ELSE %]
<a href="attachment.cgi?id=[% a.id FILTER uri %]&amp;action=edit"
title="[% a.description FILTER html %]">[% a.id FILTER html %]</a>
[% END %]
[% IF a.isobsolete %]
</span>
[% END %]
[% " |" UNLESS loop.last() %]
[% END %]
</div>
[% IF can_edit %]
<script type="text/javascript">
<!--
YAHOO.util.Dom.removeClass( document.body, "no_javascript" );
toggle_attachment_details_visibility( );
-->
</script>
[% END %]
[% Hook.process('end') %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% RETURN UNLESS attachments.size || Param("maxattachmentsize") || Param("maxlocalattachment") %]
<script type="text/javascript">
<!--
function toggle_display(link) {
var table = document.getElementById("attachment_table");
var view_all = document.getElementById("view_all");
var hide_obsolete_url_parameter = "&hide_obsolete=1";
// Store current height for scrolling later
var originalHeight = table.offsetHeight;
var rows = YAHOO.util.Dom.getElementsByClassName(
'bz_tr_obsolete', 'tr', table);
for (var i = 0; i < rows.length; i++) {
bz_toggleClass(rows[i], 'bz_default_hidden');
}
if (YAHOO.util.Dom.hasClass(rows[0], 'bz_default_hidden')) {
link.innerHTML = "Показать неактуальные";
view_all.href = view_all.href + hide_obsolete_url_parameter
}
else {
link.innerHTML = "Скрыть неактуальные";
view_all.href = view_all.href.replace(hide_obsolete_url_parameter,"");
}
var newHeight = table.offsetHeight;
// This scrolling makes the window appear to not move at all.
window.scrollBy(0, newHeight - originalHeight);
return false;
}
//-->
</script>
<br>
<table id="attachment_table" cellspacing="0" cellpadding="4">
<tr id="a0">
<th colspan="[% show_attachment_flags ? 3 : 2 %]" align="left">
Приложения
</th>
</tr>
[% count = 0 %]
[% obsolete_attachments = 0 %]
[% user_cache = template_cache.users %]
[% FOREACH attachment = attachments %]
[% count = count + 1 %]
[% IF !attachment.isprivate || user.is_insider || attachment.attacher.id == user.id %]
[% IF attachment.isobsolete %]
[% obsolete_attachments = obsolete_attachments + 1 %]
[% END %]
<tr id="a[% count %]" class="[% "bz_contenttype_" _ attachment.contenttype
FILTER css_class_quote %]
[% " bz_patch" IF attachment.ispatch %]
[% " bz_private" IF attachment.isprivate %]
[% " bz_tr_obsolete bz_default_hidden"
IF attachment.isobsolete %]">
<td valign="top">
[% IF attachment.datasize %]
<a href="attachment.cgi?id=[% attachment.id %]"
title="Просмотр приложения">
[% END %]
<b>[% attachment.description FILTER html FILTER obsolete(attachment.isobsolete) %]</b>
[% "</a>" IF attachment.datasize %]
<span class="bz_attach_extra_info">
[% IF attachment.datasize %]
([% attachment.datasize FILTER unitconvert %],
[% IF attachment.ispatch %]
патч)
[% ELSE %]
[%+ attachment.contenttype FILTER html %])
[% END %]
[% ELSE %]
(<em>удалено</em>)
[% END %]
<br>
<a href="#attach_[% attachment.id %]"
title="Перейти к комментарию, связанному с приложением">
[%- attachment.attached FILTER time %]</a>,
[%# No need to recreate the exact same template if we already have it. %]
[% attacher_id = attachment.attacher.id %]
[% UNLESS user_cache.$attacher_id %]
[% user_cache.$attacher_id = BLOCK %]
[% INCLUDE global/user.html.tmpl who = attachment.attacher %]
[% END %]
[% END %]
[% user_cache.$attacher_id FILTER none %]
</span>
</td>
[% IF show_attachment_flags %]
<td class="bz_attach_flags" valign="top">
[% IF attachment.flags.size == 0 %]
<i>нет</i>
[% ELSE %]
[% FOREACH flag = attachment.flags %]
[% IF user.id %]
<span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
[% ELSIF flag.setter.name %]
<span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
[% ELSE %]
[% flag.setter.nick FILTER html %]:
[% END %]
[%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
[%+ IF flag.status == "?" && flag.requestee %]
[% IF user.id %]
(<span title="[% flag.requestee.identity FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
[% ELSIF flag.requestee.name %]
(<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
[% ELSE %]
([% flag.requestee.nick FILTER html %])
[% END %]
[% END %]<br>
[% END %]
[% END %]
</td>
[% END %]
<td valign="top">
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">Свойства</a>
[% IF attachment.ispatch && feature_enabled('patch_viewer') %]
| <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Сравнить</a>
[% END %]
[% Hook.process("action") %]
</td>
</tr>
[% END %]
[% END %]
<tr class="bz_attach_footer">
<td colspan="[% show_attachment_flags ? 3 : 2 %]">
[% IF attachments.size %]
<span class="bz_attach_view_hide">
[% IF obsolete_attachments %]
<a href="#a0" onclick="return toggle_display(this);">Скрыть
неактуальные</a> ([% obsolete_attachments %])
[% END %]
[% IF Param("allow_attachment_display") %]
<a id="view_all" href="attachment.cgi?bugid=
[%- bugid %]&amp;action=viewall
[%- "&amp;hide_obsolete=1" IF obsolete_attachments %]">Просмотреть все</a>
[% END %]
</span>
[% END %]
[% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
<a href="attachment.cgi?bugid=[% bugid %]&amp;action=enter">Создать новое приложение</a>
(патч, тестовый пример и т.п.)
[% END %]
</td>
</tr>
</table>
<br>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# operations: array; bug activity since the user last displayed the attachment form,
# used by bug/activity/table.html.tmpl to display recent changes that will
# be overwritten if the user submits these changes. See that template
# for further documentation.
# attachment: object; the attachment being changed.
#%]
[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl title = "Конфликт версий!" %]
<h1>Обнаружен конфликт версий!</h1>
<p>
Кто-то еще выполнил изменения
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">приложения [% attachment.id %]</a>
[% "$terms.bug_gen $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %]
одновременно с Вами. Сводка изменений:
</p>
<p>
[% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
</p>
[% IF cgi.param("comment") %]
<p>
Ваш комментарий:<br>
<blockquote><pre class="bz_comment_text">
[% cgi.param("comment") FILTER html %]
</pre></blockquote>
</p>
[% END %]
<p>
Варианты выбора:
</p>
<ul>
<li>
<form method="post" action="attachment.cgi">
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
<input type="submit" id="process" value="Сохранить мои изменения">
Это приведет к потере изменений, описанных выше.
</form>
</li>
<li>
Отказаться от моих изменений и
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">вернуться к
приложению [% attachment.id %]</a>
</li>
</ul>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% filtered_summary = bugsummary FILTER html %]
[% header = BLOCK %]Просмотр всех приложений к
[%+ "$terms.bug_dat $bug.id" FILTER bug_link(bug) FILTER none %][% END %]
[% title = BLOCK %]
Просмотр всех приложений для [% terms.bug_gen %] [%+ bug.bug_id FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
header = header
subheader = filtered_summary
style_urls = ['skins/standard/attachment.css']
%]
[% IF hide_obsolete %]
<div id="hidden_obsolete_message">
Неактуальные приложения скрыты. Чтобы просмотреть все приложения (включая неактуальные)
<a href="attachment.cgi?bugid=[% bug.id FILTER html %]&amp;action=viewall">нажмите здесь</a>.
</div>
[% END %]
<br>
[% FOREACH a = attachments %]
<div align="center">
<table class="attachment_info" cellspacing="0" cellpadding="4" border="1" width="75%">
<tr>
<td valign="top" bgcolor="#cccccc" colspan="6">
<big><b>Приложение #[% a.id %]</b></big>
</td>
</tr>
<tr>
<td valign="top">
[% a.description FILTER html FILTER obsolete(a.isobsolete) %]
</td>
<td valign="top">
[% IF a.ispatch %]
<i>патч</i>
[% ELSE %]
[% a.contenttype FILTER html %]
[% END %]
</td>
<td valign="top">[% a.attached FILTER time %]</td>
<td valign="top">[% a.datasize FILTER unitconvert %]</td>
<td valign="top">
[% IF a.flags.size == 0 %]
<i>согласований нет</i>
[% ELSE %]
[% FOREACH flag = a.flags %]
[% flag.setter.nick FILTER html %]:
[%+ flag.type.name FILTER html %][% flag.status %]
[% IF flag.status == "?" && flag.requestee %]
([% flag.requestee.nick FILTER html %])
[% END %]
[% ", " IF !loop.last %]
[% END %]
[% END %]
</td>
<td valign="top">
<a href="attachment.cgi?id=[% a.id %]&amp;action=edit">Свойства</a>
</td>
</tr>
</table>
[% IF a.is_viewable %]
[% IF a.contenttype == "text/html" %]
[%# For security reasons (clickjacking, embedded scripts), we never
# render HTML pages from here. The source code is displayed instead. %]
[% INCLUDE global/textarea.html.tmpl
minrows = 10
cols = 80
defaultcontent = a.data
readonly = 'readonly'
classes = 'viewall_frame'
%]
[% ELSE %]
<iframe src="attachment.cgi?id=[% a.id %]" class="viewall_frame">
<b>Просмотр на этой странице невозможен, потому что ваш веб-обозреватель не поддерживает IFRAME.
<a href="attachment.cgi?id=[% a.id %]">Просмотреть приложение на отдельной странице</a>.</b>
</iframe>
[% END %]
[% ELSE %]
<p><b>
Приложение не может быть просмотрено, так как его тип данных не является текстом или изображением.
<a href="attachment.cgi?id=[% a.id %]">Загрузить приложение</a>.
</b></p>
[% END %]
</div>
<br><br>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# attachment: object of the attachment we just attached.
#%]
[% PROCESS global/variables.none.tmpl %]
[% bug = bugs.0 %]
[% PROCESS "bug/show-header.html.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Изменения приложения $attachment.id к $terms.bug_obj $attachment.bug_id сохранены"
%]
<dl>
<dt>Изменения в
<a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">приложении [% attachment.id %]</a>
к [% "$terms.bug_dat $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %] сохранены
</dt>
<dd>
[% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = attachment.bug_id %]
[%# Links to more information about the changed bug. %]
[% Hook.process("links") %]
</dd>
</dl>
[% PROCESS bug/show.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# bug: object. The bug whose activity is being displayed.
# operations: array of hashes, see activity/table.html.tmpl.
#
# This template also needs to be called with the interface to the
# activity/table.html.tmpl template fulfilled.
#%]
[% PROCESS global/variables.none.tmpl %]
[% filtered_desc = bug.short_desc FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Изменения по $terms.bug_dat $terms.bug $bug.bug_id"
header = "Журнал изменений $terms.bug_gen $bug.bug_id: $filtered_desc"
%]
<p>
[% "Вернуться к $terms.bug_dat $bug.bug_id" FILTER bug_link(bug) FILTER none %]
</p>
[% PROCESS bug/activity/table.html.tmpl %]
[% IF operations.size > 0 %]
<p>
[% "Вернуться к $terms.bug_dat $bug.bug_id" FILTER bug_link(bug) FILTER none %]
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# operations: array of hashes. May be empty. Each has has three members:
# who: string. who performed the operation
# when: string. when they performed it
# changes: hash. Details of what they changed. This hash has three
# compulsory and one optional member:
# field: string. The name of the field
# removed: string. What was removed from the field
# added: string. What was added to the field
# attach_id: integer. If the change was adding an attachment, its id.
# incomplete_data: boolean. True if some of the data is incomplete (because
# it was affected by an old Bugzilla bug.)
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS bug/time.html.tmpl %]
[% IF incomplete_data %]
<p>
В предыдущих версиях <a href="http://www.bugzilla.org/">Bugzilla</a>
содержалась ошибка, которая приводила к потере данных журнала изменений
при большом количестве подписанных пользователей или зависимостей.
Ошибка исправлена, однако данные, накопленные до ее исправления, уже
невозможно восстановить. Такие изменения отмечены знаком '?'.
</p>
[% END %]
[% IF operations.size > 0 %]
<table border cellpadding="4">
<tr>
<th>Кто</th>
<th>Когда</th>
<th>Что</th>
<th>Удалено</th>
<th>Добавлено</th>
</tr>
[% FOREACH operation = operations %]
<tr>
<td rowspan="[% operation.changes.size %]" valign="top">
[% operation.who FILTER email FILTER html %]
</td>
<td rowspan="[% operation.changes.size %]" valign="top">
[% operation.when FILTER time %]
</td>
[% FOREACH change = operation.changes %]
[% "</tr><tr>" IF loop.index > 0 %]
<td>
[% IF change.attachid %]
<a href="attachment.cgi?id=[% change.attachid %]">
Приложение #[% change.attachid %]</a>
[% END %]
[% IF change.comment.defined %]
[% comment_desc = field_descs.${change.fieldname} %]
[% comment_num = "Comment $change.comment.count" FILTER bug_link(bug.bug_id, comment_num => change.comment.count) %]
[% comment_desc.replace('^(Comment )?', "$comment_num ") FILTER none %]
[% ELSE %]
[%+ field_descs.${change.fieldname} FILTER html %]
[% END %]
</td>
[% PROCESS change_column change_type = change.removed %]
[% PROCESS change_column change_type = change.added %]
[% END %]
</tr>
[% END %]
</table>
[% ELSE %]
<p>
В этой [% terms.bug_dat %] пока не было произведено изменений.
</p>
[% END %]
[% BLOCK change_column %]
<td>
[% IF change_type.defined %]
[% IF change.fieldname == 'estimated_time' ||
change.fieldname == 'remaining_time' ||
change.fieldname == 'work_time' %]
[% PROCESS formattimeunit time_unit=change_type %]
[% ELSIF change.fieldname == 'blocked' ||
change.fieldname == 'dependson' %]
[% change_type FILTER bug_list_link FILTER none %]
[% ELSIF change.fieldname == 'assigned_to' ||
change.fieldname == 'reporter' ||
change.fieldname == 'qa_contact' ||
change.fieldname == 'cc' ||
change.fieldname == 'flagtypes.name' %]
[% display_value(change.fieldname, change_type) FILTER email FILTER html %]
[% ELSE %]
[% display_value(change.fieldname, change_type) FILTER html %]
[% END %]
[% ELSE %]
&nbsp;
[% END %]
</td>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Поиск по номеру $terms.bug_gen"
%]
<form method="get" action="show_bug.cgi">
<p>
Поиск конкретной [% terms.bug_gen %] по номеру:
<input name="id" size="6">
<input type="submit" id="show" value="Найти">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS bug/time.html.tmpl %]
<script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript">
</script>
<script type="text/javascript">
<!--
/* Adds the reply text to the `comment' textarea */
function replyToComment(id, real_id, name) {
var prefix = "(Ответ " + name + " на комментарий" + id + ")\n";
var replytext = "";
[% IF user.settings.quote_replies.value == 'quoted_reply' %]
/* pre id="comment_name_N" */
var text_elem = document.getElementById('comment_text_'+id);
var text = getText(text_elem);
replytext = prefix + wrapReplyText(text);
[% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
replytext = prefix;
[% END %]
[% IF user.is_insider %]
if (document.getElementById('isprivate_' + real_id).checked) {
document.getElementById('newcommentprivacy').checked = 'checked';
updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
}
[% END %]
/* <textarea id="comment"> */
var textarea = document.getElementById('comment');
if (textarea.value != replytext) {
textarea.value += replytext;
}
textarea.focus();
}
//-->
</script>
[% DEFAULT start_at = 0 mode = "show" %]
[% sort_order = user.settings.comment_sort_order.value %]
[% user_cache = template_cache.users %]
[%# NOTE: (start_at > 0) means we came here from a midair collision,
# in which case we don't care what the user's preference is.
%]
[% IF (start_at > 0) %]
[% sort_order = "oldest_to_newest" %]
[% END %]
<!-- This auto-sizes the comments and positions the collapse/expand links
to the right. -->
<table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr>
<td>
[% FOREACH comment = comments %]
[% IF comment.count >= start_at %]
[% PROCESS a_comment %]
[% END %]
[% END %]
[% IF mode == "edit" && user.id
&& user.settings.comment_box_position.value == "before_comments" %]
<div class="bz_add_comment">
<a href="#"
onclick="return goto_add_comments();">
Добавить комментарий</a>
</div>
[% END %]
[%# Note: this template is used in multiple places; if you use this hook,
# make sure you are aware of this fact.
#%]
[% Hook.process("aftercomments") %]
</td>
<td>
[% IF mode == "edit" %]
<ul class="bz_collapse_expand_comments">
<li><a href="#" onclick="toggle_all_comments('collapse');
return false;">Свернуть все комментарии</a></li>
<li><a href="#" onclick="toggle_all_comments('expand');
return false;">Развернуть все комментарии</a></li>
[% IF user.settings.comment_box_position.value == "after_comments" && user.id %]
<li class="bz_add_comment"><a href="#"
onclick="return goto_add_comments('bug_status_bottom');">
Добавить комментарий</a></li>
[% END %]
</ul>
[% END %]
</td>
</tr></table>
[%############################################################################%]
[%# Block for individual comments #%]
[%############################################################################%]
[% BLOCK a_comment %]
[% RETURN IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %]
[% comment_text = comment.body_full %]
[% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %]
<div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
[% " bz_comment_hilite" IF marks.${comment.count} %]
[% " bz_first_comment" IF comment.count == 0 %]">
[% IF comment.count == 0 %]
[% class_name = "bz_first_comment_head" %]
[% comment_label = "Описание" %]
[% ELSE %]
[% class_name = "bz_comment_head" %]
[% comment_label = "Комментарий " _ comment.count %]
[% END %]
<div class="[% class_name FILTER html %]">
[% IF mode == "edit" %]
<span class="bz_comment_actions">
[% IF bug.check_can_change_field('longdesc', 0, 1) %]
[<a class="bz_reply_link" href="#add_comment"
[% IF user.settings.quote_replies.value != 'off' %]
onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;"
[% END %]
>ответить</a>]
[% END %]
<script type="text/javascript"><!--
addCollapseLink([% comment.count %], 'Переключить показ комментариев'); // -->
</script>
</span>
[% END %]
[% IF mode == "edit" && user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
<div class="bz_private_checkbox">
<input type="hidden" value="1"
name="defined_isprivate_[% comment.id %]">
<input type="checkbox"
name="isprivate_[% comment.id %]" value="1"
id="isprivate_[% comment.id %]"
onClick="updateCommentPrivacy(this, [% comment.count %])"
[% " checked=\"checked\"" IF comment.is_private %]>
<label for="isprivate_[% comment.id %]">Конфиденциально</label>
</div>
[% END %]
<span class="bz_comment_number">
<a
href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]">
[%- comment_label FILTER html %]</a>
</span>
<span class="bz_comment_user">
[%# No need to recreate the exact same template if we already have it. %]
[% commenter_id = comment.author.id %]
[% UNLESS user_cache.$commenter_id %]
[% user_cache.$commenter_id = BLOCK %]
[% INCLUDE global/user.html.tmpl who = comment.author %]
[% END %]
[% END %]
[% user_cache.$commenter_id FILTER none %]
</span>
<span class="bz_comment_user_images">
[% FOREACH group = comment.author.groups_with_icon %]
<img src="[% group.icon_url FILTER html %]"
alt="[% group.name FILTER html %]"
title="[% group.name FILTER html %] - [% group.description FILTER html %]">
[% END %]
</span>
<span class="bz_comment_time">
[%+ comment.creation_ts FILTER time %]
</span>
</div>
[% IF user.is_timetracker &&
(comment.work_time > 0 || comment.work_time < 0) %]
<br>
Отработанное время:
[% PROCESS formattimeunit time_unit=comment.work_time %]
[% END %]
[%# Don't indent the <pre> block, since then the spaces are displayed in the
# generated HTML
#%]
<pre class="bz_comment_text"
[% ' id="comment_text_' _ comment.count _ '"' IF mode == "edit" %]>
[%- comment_text FILTER quoteUrls(bug, comment) -%]
</pre>
</div>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
User-Agent: [%+ cgi.user_agent() %]
Build Identifier: [%+ cgi.param("buildid") %]
[%+ cgi.param("comment") IF cgi.param("comment") %]
[%+ IF cgi.param("reproducible") != "Выберите..." -%]
Воспроизводимость: [%+ cgi.param("reproducible") %]
[% END %]
[% IF !(cgi.param("reproduce_steps").match('^1\.\s*2\.\s*3\.\s*$') || cgi.param("reproduce_steps").match('^\s*$')) %]
Последовательность воспроизведения:
[%+ cgi.param("reproduce_steps") %]
[% END %]
[% IF cgi.param("actual_results") -%]
Полученный результат:
[%+ cgi.param("actual_results") %]
[% END %]
[% IF cgi.param("expected_results") %]
Ожидаемый результат:
[%+ cgi.param("expected_results") %]
[% END %]
[%+ cgi.param("additional_info") %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has the same interface as create.html.tmpl
#%]
[% PROCESS global/variables.none.tmpl %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/header.html.tmpl
title = "Регистрация $terms.bug_gen"
onload = "PutDescription()"
style = "#somebugs { width: 100%; height: 500px }"
%]
[% style = "" %]
<p>
<font color="red">
Это шаблон используется на mozilla.org. Этот шаблон, а также
comment-guided.txt.tmpl, который форматирует результат заполнения
формы для переноса в базу данных, включены в поставку для демонстрации
возможностей настройки шаблонов. Поскольку большая часть текста
специфична для mozilla.org, рекомендуется исправить форму для вашей
системы [% terms.Bugzilla %].
</font>
</p>
[% tablecolour = "#FFFFCC" %]
[%# This script displays the descriptions for selected components. %]
<script type="text/javascript">
var descriptions = [
[% FOREACH c = product.components %]
[% NEXT IF NOT c.is_active %]
'[% c.description FILTER js %]',
[% END %]
];
function PutDescription() {
if ((document.getElementById) && (document.body.innerHTML)) {
var componentIndex = document.getElementById('component').selectedIndex;
if (componentIndex != -1) {
var description = document.getElementById('description');
description.innerHTML = descriptions[componentIndex];
}
}
}
</script>
<h3 id="step1">Шаг 1 из 3 - поиск [% terms.bug_gen %] среди уже зарегистрированных</h3>
<p>
<font color="red">Пожалуйста, не пропускайте этот шаг — значительная часть вновь вводимых
[% terms.bugs_gen %] уже зарегистрирована ранее.</font>
Проверьте списки часто регистрируемых [% terms.bugs_gen %]:
</p>
[%# Include other products if sensible %]
[% IF product.name == "Firefox" %]
[% productstring = "product=Mozilla%20Application%20Suite&amp;product=Firefox" %]
[% ELSIF product.name == "Thunderbird" %]
[% productstring = "product=Mozilla%20Application%20Suite&amp;product=Thunderbird" %]
[% ELSE %]
[% productstring = BLOCK %]product=[% product.name FILTER uri %][% END %]
[% END %]
<p>
<a href="duplicates.cgi?[% productstring %]&amp;format=simple" target="somebugs">100 наиболее частых</a> (за всю историю) |
<a href="duplicates.cgi?[% productstring %]&amp;format=simple&amp;sortby=delta&amp;reverse=1&amp;maxrows=100&amp;changedsince=14" target="somebugs">Наиболее частые за последние две недели</a>
</p>
<iframe name="somebugs" id="somebugs"
style="border: 2px black solid"
src="duplicates.cgi?[% productstring %]&amp;format=simple">
</iframe>
<p>
Если вашей [% terms.bug_gen %] там нет, выполните поиск в [% terms.Bugzilla %]
по нескольким ключевым словам, имеющим отношение к [% terms.bug_dat %].
Например: <tt><b>почта pop3</b></tt> или <tt><b>копировать вставить</b></tt>.
Результат будет представлен выше.
</p>
[%# All bugs opened inside the past six months %]
<form action="buglist.cgi" method="get" target="somebugs">
<input type="hidden" name="format" value="simple">
<input type="hidden" name="order" value="relevance desc">
<input type="hidden" name="bug_status" value="__all__">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
[% IF product.name == "Firefox" OR
product.name == "Thunderbird" OR
product.name == "Mozilla Application Suite" OR
product.name == "Camino" %]
<input type="hidden" name="product" value="Core">
<input type="hidden" name="product" value="Toolkit">
<input type="hidden" name="product" value="PSM">
<input type="hidden" name="product" value="NSPR">
<input type="hidden" name="product" value="NSS">
[% END %]
<input type="hidden" name="chfieldfrom" value="-6m">
<input type="hidden" name="chfieldto" value="Now">
<input type="hidden" name="chfield" value="[Bug creation]">
<input type="text" name="content" size="40">
<input type="submit" id="search" value="Найти">
</form>
<p>
Изучите результаты поиска. Если получено сообщение
<tt><b>[% terms.zeroSearchResults %]</b></tt>, [% terms.bugs_gen %]
по заданным словам не найдено. Проверьте возможные опечатки в словах,
попробуйте меньше слов или другие слова. Если найдена [% terms.bug %],
по описанию похожая на вашу, добавьте к ней комментарий с известной вам
новой информацией, но не регистрируйте новую [% terms.bug_acc %].
</p>
<h3 id="step2">Шаг 2 из 3 - сбор информации</h3>
<p>
Если по результатам поиска подобных [% terms.bugs_gen %] не найдено,
следует зарегистрировать новую [% terms.bug_acc %].
</p>
<form method="post" action="post_bug.cgi">
<input type="hidden" name="format" value="guided">
<input type="hidden" name="assigned_to" value="">
<input type="hidden" name="priority"
value="[% default.priority FILTER html %]">
<input type="hidden" name="version"
value="[% default.version FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<table valign="top" cellpadding="5" cellspacing="5" border="0">
<tr bgcolor="[% tablecolour %]">
<td align="right" valign="top">
<b>Продукт</b>
</td>
<td valign="top">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
[% product.name FILTER html %]
</td>
</tr>
<tr>
<td align="right" valign="top">
<b>Компонент</b>
</td>
<td valign="top">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td valign="top">
<select name="component" id="component"
size="5" onchange="PutDescription()">
[% IF NOT default.component_ %]
[%# Various b.m.o. products have a "General" component,
which is a useful default. %]
[% default.component_ = "General" %]
[% END %]
[% FOREACH c = product.components %]
[% NEXT IF NOT c.is_active %]
<option value="[% c.name FILTER html %]"
[% " selected=\"selected\"" IF c.name == default.component_ %]>
[% c.name FILTER html %]
</option>
[% END %]
</select>
</td>
<td valign="top" width="100%">
<div id="description" style="color: green; margin-left: 10px;
height: 5em; overflow: auto;">
<script type="text/javascript">
if ((document.getElementById) && (document.body.innerHTML)) {
document.write("\
Выберите компонент, чтобы увидеть его описание здесь.");
}
</script>
</div>
</td>
</tr>
</table>
<p>
Область возникновения проблемы.
Для правильного выбора компонента ориентируйтесь на значения, указанные
в подобных [% terms.bugs_obj %] или ознакомьтесь с полным списком
<a target="_blank" href="describecomponents.cgi?product=
[% product.name FILTER uri %]">описаний
компонентов</a> (будет открыт в отдельном окне).
</p>
</td>
</tr>
[%# We override rep_platform and op_sys for simplicity. The values chosen
are based on which are most common in the b.m.o database %]
[% rep_platform = [ "PC", "Macintosh", "All", "Other" ] %]
<tr bgcolor="[% tablecolour %]">
<td align="right" valign="top">
<b>[% field_descs.rep_platform FILTER html %]</b>
</td>
<td valign="top">
[% PROCESS select sel = 'rep_platform' %]
</td>
</tr>
[% op_sys = [ "Windows 2000", "Windows XP", "Windows Vista", "Windows 7",
"Mac OS X", "Linux", "All", "Other" ] %]
<tr>
<td align="right" valign="top">
<b>Операционная система</b>
</td>
<td valign="top">
[% PROCESS select sel = 'op_sys' %]
</td>
</tr>
[% IF product.name.match("Firefox|Camino|Mozilla Application Suite") %]
[% matches = cgi.user_agent('Gecko/(\d+)') %]
[% buildid = cgi.user_agent() IF matches %]
[% END %]
[%# Accept URL parameter build ID for non-browser products %]
[% IF cgi.param("buildid") %]
[% buildid = cgi.param("buildid") %]
[% END %]
<tr bgcolor="[% tablecolour %]">
<td align="right" valign="top">
<b>Идентификатор версии</b>
</td>
<td valign="top">
<input type="text" size="80" name="buildid" value="[% buildid FILTER html %]">
<p>
Это точное описание продукта, использованного вами в момент [% terms.bug_gen %].
Если поле не заполнено или заполнено неверно, скопируйте текст
версии из справки. В случае Mozilla или Firefox это строка,
начинающаяся с <tt>"Mozilla/5.0"</tt> в меню <tt>Справка | О Mozilla Firefox</tt>.
Если программа не запускается вовсе, укажите полный адрес, откуда она была
скачана.
</p>
</td>
</tr>
<tr>
<td align="right" valign="top">
<b>URL</b>
</td>
<td valign="top">
<input type="text" size="80" name="bug_file_loc" value="http://">
<p>
Адрес URL, при обращении к которому возникает проблема (заполнять не обязательно).
<b>ВАЖНО</b>: если проблема связана с некорректно созданной страницей,
сообщите об этом
<a href="https://bugzilla.mozilla.org/page.cgi?id=broken-website.html">другим способом</a>.
</p>
</td>
</tr>
<tr bgcolor="[% tablecolour %]">
<td align="right" valign="top">
<b>Аннотация</b>
</td>
<td valign="top">
<input type="text" size="80" name="short_desc" id="short_desc"
maxlength="255" spellcheck="true">
<p>
Краткое описание проблемы.
Пожалуйста будьте точны и используйте максимум ключевых слов.
</p>
<p>
<tt>
<font color="#990000">Неправильно</font>: почта сыпется
</tt>
<br>
<tt>
<font color="#009900">Правильно</font>:
авария при закрытии окна во время проверки новых сообщений POP
</tt>
</p>
</td>
</tr>
<tr>
<td align="right" valign="top">
<b>Подробности</b>
</td>
<td valign="top">
[% INCLUDE global/textarea.html.tmpl
name = 'comment'
minrows = 6
cols = constants.COMMENT_COLS
%]
<p>
Подробное описание этой проблемы. Пожалуйста подробно
опишите, что именно не так.
</p>
<p>
<tt>
<font color="#990000">Неправильно</font>: Mozilla сыпется.
Идиоты!
</tt>
<br>
<tt>
<font color="#009900">Правильно</font>: После аварии
во время сортировки закладок,<br> исчезли все папки закладок
первого уровня с именами, начинающимися с Q по Z.
</tt>
</p>
</td>
</tr>
<tr bgcolor="[% tablecolour %]">
<td align="right" valign="top">
<b>Воспроизводимость</b>
</td>
<td valign="top">
<select name="reproducible">
<option name="AlwaysReproducible" value="Всегда">
Происходит каждый раз.
</option>
<option name="Sometimes" value="Иногда">
Происходит иногда, но не каждый раз.
</option>
<option name="DidntTry" value="Не пробовали">
Не пытались повторить ситуацию.
</option>
<option name="NotReproducible" value="Не удается">
Пытались повторить, безуспешно.
</option>
</select>
</td>
</tr>
<tr>
<td align="right" valign="top">
<b>Как повторить ситуацию</b>
</td>
<td valign="top">
[% INCLUDE global/textarea.html.tmpl
name = 'reproduce_steps'
minrows = 4
cols = constants.COMMENT_COLS
defaultcontent = "1.\n2.\n3."
%]
<p>
Опишите, что необходимо сделать, чтобы возникла проблема.
Подробности установки продукта тоже имеют значение.
</p>
</td>
</tr>
<tr bgcolor="[% tablecolour %]">
<td valign="top" align="right">
<b>Что происходит</b>
</td>
<td valign="top">
[% INCLUDE global/textarea.html.tmpl
name = 'actual_results'
minrows = 4
cols = constants.COMMENT_COLS
%]
<p>
Что именно происходит после выполнения описанных выше шагов?
</p>
</td>
</tr>
<tr>
<td valign="top" align="right">
<b>Ожидаемый результат</b>
</td>
<td valign="top">
[% INCLUDE global/textarea.html.tmpl
name = 'expected_results'
minrows = 4
cols = constants.COMMENT_COLS
%]
<p>
Что должно было произойти при правильной работе?
</p>
</td>
</tr>
<tr bgcolor="[% tablecolour %]">
<td valign="top" align="right">
<b>Дополнительные сведения</b>
</td>
<td valign="top">
[% INCLUDE global/textarea.html.tmpl
name = 'additional_info'
minrows = 8
cols = constants.COMMENT_COLS
%]
<p>
Add any additional information you feel may be
relevant to this [% terms.bug %], such as the <b>theme</b> you were
using (does the [% terms.bug %] still occur
with the default theme?), a
<b><a href="http://kb.mozillazine.org/Quality_Feedback_Agent">Talkback crash ID</a></b>, or special
information about <b>your computer's configuration</b>. Any information
longer than a few lines, such as a <b>stack trace</b> or <b>HTML
testcase</b>, should be added
using the "Add an Attachment" link on the [% terms.bug %], after
it is filed. If you believe that it's relevant, please also include
your build configuration, obtained by typing <tt>about:buildconfig</tt>
into your URL bar.
<br>
<br>
If you are reporting a crash, note the module in
which the software crashed (e.g., <tt>Application Violation in
gkhtml.dll</tt>).
</p>
</td>
</tr>
<tr>
<td valign="top" align="right">
<b>[% field_descs.bug_severity FILTER html %]</b>
</td>
<td valign="top">
<select name="bug_severity">
<option name="critical" value="critical">
Критичная: Приводит к аварии, зависанию или потере данных.
</option>
<option name="major" value="major">
Серьезная: Нарушена работа важной функции.
</option>
<option name="normal" value="normal" selected="selected">
Существенная: Это [% terms.bug %] и она должна быть исправлена.
</option>
<option name="minor" value="minor">
Незначительная: Несущественная потеря функциональности или известно обходное решение.
</option>
<option name="trivial" value="trivial">
Тривиальная: Косметическая проблема: опечатка, размещение
на экране, оформление.
</option>
<option name="enhancement" value="enhancement">
Пожелание: Предложение о добавлении или совершенствовании функций.
</option>
</select>
<p>
Насколько серьезна обнаруженная проблема, или это
пожелание по развитию продукта.
</p>
</td>
</tr>
[% Hook.process('form') %]
</table>
<h3 id="step3">Шаг 3 из 3 - зарегистрировать [% terms.bug_acc %]</h3>
<p>
<input type="submit" id="report" value=" Сохранить [% terms.bug_acc %] "
onclick="if (this.form.comment.value == '')
{ alert('Пожалуйста заполните информацию по существу [% terms.bug_gen %].');
this.form.comment.focus();
return false; } return true;">
</p>
<p>
Готово. Большое спасибо! Обо всех изменениях по существу [% terms.bug_gen %]
будут отправлены оповещения по электронной почте.
<p>
Пожалуйста примите к сведению, что мы обрабатываем
большое количество [% terms.bugs_gen %] - может пройти некоторое время
до передачи [% terms.bug_gen %]в работу. Ваша помощь заключается в
предоставлении полной информации в понятной форме и
в своевременных ответах на вопросы, которые могут поступить
по электронной почте.
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK select %]
<select name="[% sel %]">
[%- IF default.$sel %]
<option value="[% default.$sel FILTER html %]" selected="selected">
[% default.$sel FILTER html -%]
</option>
[% END %]
[%- FOREACH x = $sel %]
[% NEXT IF x == default.$sel %]
<option value="[% x FILTER html %]">
[% x FILTER html -%]
</option>
[%- END %]
</select>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = BLOCK %]Регистрация [% terms.bug_gen %]: [% product.name FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
title = title
yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ]
style_urls = [ 'skins/standard/attachment.css',
'skins/standard/enter_bug.css' ]
javascript_urls = [ "js/attachment.js", "js/util.js",
"js/field.js", "js/TUI.js", "js/bug.js" ]
onload = "set_assign_to(); hideElementById('attachment_true');
showElementById('attachment_false'); showElementById('btn_no_attachment');"
%]
[% PROCESS etersoft/timersplash.html.tmpl %]
<script type="text/javascript">
function myform() {
if (!validateEnterBug(document.Create)) {
return false;
}
mysubmitnew();
return false;
}
</script>
<script type="text/javascript">
<!--
var initialowners = new Array([% product.components.size %]);
var last_initialowner;
var initialccs = new Array([% product.components.size %]);
var components = new Array([% product.components.size %]);
var comp_desc = new Array([% product.components.size %]);
var flags = new Array([% product.components.size %]);
[% IF Param("useqacontact") %]
var initialqacontacts = new Array([% product.components.size %]);
var last_initialqacontact;
[% END %]
[% count = 0 %]
[%- FOREACH c = product.components %]
[% NEXT IF NOT c.is_active %]
components[[% count %]] = "[% c.name FILTER js %]";
comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]";
initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]";
[% flag_list = [] %]
[% FOREACH f = c.flag_types.bug %]
[% NEXT UNLESS f.is_active %]
[% flag_list.push(f.id) %]
[% END %]
[% FOREACH f = c.flag_types.attachment %]
[% NEXT UNLESS f.is_active %]
[% flag_list.push(f.id) %]
[% END %]
flags[[% count %]] = [[% flag_list.join(",") FILTER js %]];
[% IF Param("useqacontact") %]
initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]";
[% END %]
[% SET initial_cc_list = [] %]
[% FOREACH cc_user = c.initial_cc %]
[% initial_cc_list.push(cc_user.login) %]
[% END %]
initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]";
[% count = count + 1 %]
[%- END %]
function set_assign_to() {
// Based on the selected component, fill the "Assign To:" field
// with the default component owner, and the "QA Contact:" field
// with the default QA Contact. It also selectively enables flags.
var form = document.Create;
var assigned_to = form.assigned_to.value;
[% IF Param("useqacontact") %]
var qa_contact = form.qa_contact.value;
[% END %]
var index = -1;
if (form.component.type == 'select-one') {
index = form.component.selectedIndex;
} else if (form.component.type == 'hidden') {
// Assume there is only one component in the list
index = 0;
}
if (index != -1) {
var owner = initialowners[index];
var component = components[index];
if (assigned_to == last_initialowner
|| assigned_to == owner
|| assigned_to == '') {
form.assigned_to.value = owner;
last_initialowner = owner;
}
document.getElementById('initial_cc').innerHTML = initialccs[index];
document.getElementById('comp_desc').innerHTML = comp_desc[index];
[% IF Param("useqacontact") %]
var contact = initialqacontacts[index];
if (qa_contact == last_initialqacontact
|| qa_contact == contact
|| qa_contact == '') {
form.qa_contact.value = contact;
last_initialqacontact = contact;
}
[% END %]
// We show or hide the available flags depending on the selected component.
var flag_rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody');
for (var i = 0; i < flag_rows.length; i++) {
// Each flag table row should have one flag form select element
// We get the flag type id from the id attribute of the select.
var flag_select = YAHOO.util.Dom.getElementsByClassName('flag_select',
'select',
flag_rows[i])[0];
var type_id = flag_select.id.split('-')[1];
var can_set = flag_select.options.length > 1 ? 1 : 0;
var show = 0;
// Loop through the allowed flag ids for the selected component
// and if we match, then show the row, otherwise hide the row.
for (var j = 0; j < flags[index].length; j++) {
if (flags[index][j] == type_id) {
show = 1;
break;
}
}
if (show && can_set) {
flag_select.disabled = false;
YAHOO.util.Dom.removeClass(flag_rows[i], 'bz_default_hidden');
} else {
flag_select.disabled = true;
YAHOO.util.Dom.addClass(flag_rows[i], 'bz_default_hidden');
}
}
}
}
var status_comment_required = new Array();
[% FOREACH status = bug_status %]
status_comment_required['[% status.name FILTER js %]'] =
[% status.comment_required_on_change_from() ? 'true' : 'false' %]
[% END %]
TUI_alternates['expert_fields'] = 'Показать дополнительные поля';
// Hide the Advanced Fields by default, unless the user has a cookie
// that specifies otherwise.
TUI_hide_default('expert_fields');
// Also hide the "Paste text as attachment" textarea by default.
TUI_hide_default('attachment_text_field');
-->
</script>
<form name="Create" id="Create" method="post" action="post_bug.cgi"
class="enter_bug_form" enctype="multipart/form-data"
onsubmit="return myform();">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<table>
<tbody>
<tr>
<td colspan="4">
[%# Migration note: The following file corresponds to the old Param
# 'entryheaderhtml'
#%]
[% PROCESS 'bug/create/user-message.html.tmpl' %]
</td>
</tr>
<tr>
<td colspan="2">
<a id="expert_fields_controller" class="controller bz_default_hidden"
href="javascript:TUI_toggle_class('expert_fields')">Скрыть
дополнительные поля</a>
[%# Show the link if the browser supports JS %]
<script type="text/javascript">
YAHOO.util.Dom.removeClass('expert_fields_controller',
'bz_default_hidden');
</script>
</td>
<td colspan="2">
(<span class="required_star">*</span> =
<span class="required_explanation">Необходимое поле</span>)
</td>
</tr>
<tr id="error_user" login='[% user.login%]' style="display:none">
<td colspan="4" align='center'>
<H3> <span class='required_star'>Внимание! Для более быстрой обработке и решения вашей проблемы - просим сообщать о ней
через специальную форму <br/>на <a target='_blank' href='http://sales.etersoft.ru/product'>странице продукта</a>
</td>
</tr>
<script type="text/javascript">
//Проверка логина
login = document.getElementById("error_user").getAttribute('login');
email = login.split('@');
string = email[1]+'';
if (string != 'etersoft.ru' && string != 'office.etersoft.ru') {
document.getElementById("error_user").style.display = 'table-row';
}
</script>
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.product, editable = 0,
value = product.name %]
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.reporter, editable = 0,
value = user.login %]
</tr>
[%# We can't use the select block in these two cases for various reasons. %]
<tr>
[% component_desc_url = BLOCK -%]
describecomponents.cgi?product=[% product.name FILTER uri %]
[% END %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.component editable = 1
desc_url = component_desc_url
%]
<td id="field_container_component">
<select name="component" id="component" onchange="set_assign_to();"
size="7" aria-required="true" class="required">
[%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %]
[% IF Param("usemenuforusers") %]
[% assignees_list = user.get_userlist.clone %]
[% qa_contacts_list = user.get_userlist.clone %]
[% END %]
[%- FOREACH c = product.components %]
[% NEXT IF NOT c.is_active %]
<option value="[% c.name FILTER html %]"
id="v[% c.id FILTER html %]_component"
[% IF c.name == default.component_ %]
[%# This is for bug/field.html.tmpl, for visibility-related
# controls. %]
[% default.component_id = c.id %]
selected="selected"
[% END %]>
[% c.name FILTER html -%]
</option>
[% IF Param("usemenuforusers") %]
[% INCLUDE build_userlist default_user = c.default_assignee,
userlist = assignees_list %]
[% INCLUDE build_userlist default_user = c.default_qa_contact,
userlist = qa_contacts_list %]
[% END %]
[%- END %]
</select>
<script type="text/javascript">
<!--
[%+ INCLUDE "bug/field-events.js.tmpl"
field = bug_fields.component, product = product %]
//-->
</script>
</td>
<td colspan="2" id="comp_desc_container">
[%# Enclose the fieldset in a nested table so that its width changes based
# on the length on the component description. %]
<table>
<tr>
<td>
<fieldset>
<legend>Описание компонента</legend>
<div id="comp_desc" class="comment">Выберите компонент для просмотра описания.</div>
</fieldset>
</td>
</tr>
</table>
</td>
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.version editable = 1 rowspan = 3
%]
<td rowspan="3">
<select name="version" id="version" size="5" aria-required="true"
class="required">
[%- FOREACH v = version %]
[% NEXT IF NOT v.is_active %]
<option value="[% v.name FILTER html %]"
[% ' selected="selected"' IF v.name == default.version %]>[% v.name FILTER html -%]
</option>
[%- END %]
</select>
</td>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.bug_severity, editable = 1,
value = default.bug_severity %]
</tr>
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.rep_platform, editable = 1,
value = default.rep_platform %]
</tr>
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.op_sys, editable = 1,
value = default.op_sys %]
</tr>
[% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %]
<tr>
<th colspan="3">&nbsp;</th>
<td id="os_guess_note" class="comment">
<div>Ваша
[% IF Param('defaultplatform') %]
операционная система определена автоматически. Проверьте это значение
[% ELSIF Param('defaultopsys') %]
платформа определена автоматически. Проверьте это значение
[% ELSE %]
операционная система и платформа определены автоматически. Проверьте эти значения
[% END %]
и при необходимости внесите исправления.</div>
</td>
</tr>
[% END %]
</tbody>
<tbody class="expert_fields">
<tr>
[% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
[% INCLUDE select field = bug_fields.target_milestone %]
[% ELSE %]
<td colspan="2">&nbsp;</td>
[% END %]
[% IF Param('letsubmitterchoosepriority') && user.in_group('Etersoft') %]
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.priority, editable = 1,
value = default.priority %]
[% ELSE %]
<td colspan="2">&nbsp;</td>
[% END %]
</tr>
</tbody>
<tbody class="expert_fields">
<tr>
<td colspan="4">&nbsp;</td>
</tr>
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.bug_status,
editable = (bug_status.size > 1), value = default.bug_status
override_legal_values = bug_status %]
<td>&nbsp;</td>
[%# Calculate the number of rows we can use for flags %]
[% num_rows = 7 + (Param("useqacontact") ? 1 : 0) +
(user.is_timetracker ? 3 : 0)
%]
<td rowspan="[% num_rows FILTER html %]">
[% IF product.flag_types.bug.size > 0 %]
[% display_flag_headers = 0 %]
[% any_flags_requesteeble = 0 %]
[% FOREACH flag_type = product.flag_types.bug %]
[% NEXT UNLESS flag_type.is_active %]
[% display_flag_headers = 1 %]
[% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %]
[% END %]
[% IF display_flag_headers %]
[% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug
any_flags_requesteeble = any_flags_requesteeble
flag_table_id = "bug_flags"
%]
[% END %]
[% END %]
</td>
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.assigned_to editable = 1
%]
<td colspan="2">
[% INCLUDE global/userselect.html.tmpl
id => "assigned_to"
name => "assigned_to"
value => assigned_to
disabled => assigned_to_disabled
size => 30
emptyok => 1
custom_userlist => assignees_list
%]
<noscript>(По умолчанию — ответственный исполнитель компонента)</noscript>
</td>
</tr>
[% IF Param("useqacontact") %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.qa_contact editable = 1
%]
<td colspan="2">
[% INCLUDE global/userselect.html.tmpl
id => "qa_contact"
name => "qa_contact"
value => qa_contact
disabled => qa_contact_disabled
size => 30
emptyok => 1
custom_userlist => qa_contacts_list
%]
<noscript>(По умолчанию — ответственный за приемку компонента)</noscript>
</td>
</tr>
[% END %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.cc editable = 1
%]
<td colspan="2">
[% INCLUDE global/userselect.html.tmpl
id => "cc"
name => "cc"
value => cc
disabled => cc_disabled
size => 30
multiple => 5
%]
</td>
</tr>
<tr>
<th>[% field_descs.cc FILTER html %] по умолчанию:</th>
<td colspan="2">
<div id="initial_cc">
</div>
</td>
</tr>
<tr>
<td colspan="3">&nbsp;</td>
</tr>
[% IF user.is_timetracker %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.estimated_time editable = 1
%]
<td colspan="2">
<input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]">
<input name="work_time" id="work_time" value="0" hidden>
</td>
</tr>
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.deadline, value = deadline,
editable = 1, value_span = 2 %]
</tr>
<tr>
<td colspan="3">&nbsp;</td>
</tr>
[% END %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.alias editable = 1
%]
<td colspan="2">
<input name="alias" size="20" value="[% alias FILTER html %]">
</td>
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.bug_file_loc editable = 1
%]
<td colspan="2" class="field_value">
<input name="bug_file_loc" id="bug_file_loc" class="text_input"
size="40" value="[% bug_file_loc FILTER html %]">
</td>
</tr>
</tbody>
<tbody>
[% USE Bugzilla %]
[% FOREACH field = Bugzilla.active_custom_fields %]
[% NEXT UNLESS field.enter_bug %]
[% SET value = ${field.name}.defined ? ${field.name} : "" %]
<tr [% 'class="expert_fields"' IF !field.is_mandatory %]>
[% INCLUDE bug/field.html.tmpl
bug = default, field = field, value = value, editable = 1,
value_span = 3 %]
</tr>
[% END %]
</tbody>
<tbody>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.short_desc editable = 1
%]
<td colspan="3" class="field_value">
<input name="short_desc" size="70" value="[% short_desc FILTER html %]"
maxlength="255" spellcheck="true" aria-required="true"
class="required text_input" id="short_desc">
</td>
</tr>
[% IF feature_enabled('jsonrpc') AND !cloned_bug_id %]
<tr id="possible_duplicates_container" class="bz_default_hidden">
<th>Возможные<br>дубликаты:</th>
<td colspan="3">
<div id="possible_duplicates"></div>
<script type="text/javascript">
var dt_columns = [
{ key: "id", label: "[% field_descs.bug_id FILTER js %]",
formatter: YAHOO.bugzilla.dupTable.formatBugLink },
{ key: "summary",
label: "[% field_descs.short_desc FILTER js %]",
formatter: "text" },
{ key: "status",
label: "[% field_descs.bug_status FILTER js %]",
formatter: YAHOO.bugzilla.dupTable.formatStatus },
{ key: "update_token", label: '',
formatter: YAHOO.bugzilla.dupTable.formatCcButton }
];
YAHOO.bugzilla.dupTable.addCcMessage = "Add Me to the CC List";
YAHOO.bugzilla.dupTable.init({
container: 'possible_duplicates',
columns: dt_columns,
product_name: '[% product.name FILTER js %]',
summary_field: 'short_desc',
options: {
MSG_LOADING: 'Поиск возможных дубликатов...',
MSG_EMPTY: 'Возможные дубликаты не найдены.',
SUMMARY: 'Возможные дубликаты'
}
});
</script>
</td>
</tr>
[% END %]
<tr>
<th>Описание:</th>
<td colspan="3">
[% defaultcontent = BLOCK %]
[% IF cloned_bug_id %]
+++ Данная [% terms.bug %] создана размножением [% terms.bug_gen %] [%+ cloned_bug_id %] +++
[% END %]
[%-# We are within a BLOCK. The comment will be correctly HTML-escaped
# by global/textarea.html.tmpl. So we must not escape the comment here. %]
[% comment FILTER none %]
[%- END %]
[% INCLUDE global/textarea.html.tmpl
name = 'comment'
id = 'comment'
minrows = 10
maxrows = 25
cols = constants.COMMENT_COLS
defaultcontent = defaultcontent
%]
<br>
</td>
</tr>
[% IF user.is_insider %]
<tr class="expert_fields">
<th>&nbsp;</th>
<td colspan="3">
&nbsp;&nbsp;
<input type="checkbox" id="comment_is_private" name="comment_is_private"
[% ' checked="checked"' IF comment_is_private %]
onClick="updateCommentTagControl(this, 'comment')">
<label for="comment_is_private">
Сделать описание [% terms.bug_gen %] и все новые приложения
конфиденциальными (видимыми только членам группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
<script>
updateCommentTagControl(document.getElementById('comment_is_private'), 'comment');
</script>
</td>
</tr>
[% END %]
[% IF Param("maxattachmentsize") || Param("maxlocalattachment") %]
<tr>
<th>Приложение:</th>
<td colspan="3">
<div id="attachment_false" class="bz_default_hidden">
<input type="button" value="Добавить приложение" onClick="handleWantsAttachment(true)">
</div>
<div id="attachment_true">
<input type="button" id="btn_no_attachment" value="Не добавлять приложение"
class="bz_default_hidden" onClick="handleWantsAttachment(false)">
<fieldset>
<legend>Добавить приложение</legend>
<table class="attachment_entry">
[% PROCESS attachment/createformcontents.html.tmpl
flag_types = product.flag_types.attachment
any_flags_requesteeble = 1
flag_table_id ="attachment_flags" %]
</table>
</fieldset>
</div>
</td>
</tr>
[% END %]
</tbody>
<tbody class="expert_fields">
[% IF user.in_group('editbugs', product.id) %]
[% IF use_keywords %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = default, field = bug_fields.keywords, editable = 1,
value = keywords, possible_values = all_keywords,
desc_url = "describekeywords.cgi", value_span = 2
%]
</tr>
[% END %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.dependson editable = 1
%]
<td colspan="3">
<input name="dependson" accesskey="d" value="[% dependson FILTER html %]">
</td>
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.blocked editable = 1
%]
<td colspan="3">
<input name="blocked" accesskey="b" value="[% blocked FILTER html %]">
</td>
</tr>
[% END %]
</tbody>
<tbody class="expert_fields">
[% IF product.groups_available.size %]
<tr>
<th>&nbsp;</th>
<td colspan="3">
<br>
<strong>
[%+ terms.bug %] доступна только членам следующих групп:
</strong>
<br>
<font size="-1">
(Снятие всех отметок делает [% terms.bug_acc %] общедоступной.)
</font>
<br>
<br>
<!-- Checkboxes -->
<input type="hidden" name="defined_groups" value="1">
[% FOREACH group = product.groups_available %]
<input type="checkbox" id="group_[% group.id FILTER html %]"
name="groups" value="[% group.name FILTER html %]"
[% ' checked="checked"' IF default.groups.contains(group.name)
OR group.is_default %]>
<label for="group_[% group.id FILTER html %]">
[%- group.description FILTER html_light %]</label><br>
[% END %]
</td>
</tr>
[% END %]
</tbody>
<tbody>
[%# Form controls for entering additional data about the bug being created. %]
[% Hook.process("form") %]
<tr>
<th>&nbsp;</th>
<td colspan="3">
<input type="button" id="commit" value="Зарегистрировать [% terms.bug_acc %]"
onclick="if (this.form.short_desc.value == '') {alert('Не указана краткая аннотация для [% terms.bug_gen %]'); return false;} mysubmitnew();"
>
&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" name="maketemplate" id="maketemplate"
value="Сохранить в качестве образца"
onclick="bz_no_validate_enter_bug=true" class="expert_fields">
</td>
</tr>
</tbody>
</table>
<input type="hidden" name="form_name" value="enter_bug">
</form>
[%# Links or content with more information about the bug being created. %]
[% Hook.process("end") %]
[% PROCESS global/footer.html.tmpl %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK select %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field editable = 1
%]
<td>
<select name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]">
[%- FOREACH x = ${field.name} %]
[% NEXT IF NOT x.is_active %]
<option value="[% x.name FILTER html %]"
[% " selected=\"selected\"" IF x.name == default.${field.name} %]>
[% display_value(field.name, x.name) FILTER html %]
</option>
[% END %]
</select>
</td>
[% END %]
[% BLOCK build_userlist %]
[% user_found = 0 %]
[% default_login = default_user.login %]
[% RETURN UNLESS default_login %]
[% FOREACH user = userlist %]
[% IF user.login == default_login %]
[% user_found = 1 %]
[% LAST %]
[% END %]
[% END %]
[% userlist.push({login => default_login,
identity => default_user.identity,
visible => 1})
UNLESS user_found %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# id: number; the ID of the bug that was created.
# sentmail: array of hash; bugs for which BugMail should be sent, contains:
# type: string; type of change for this bug, either 'created' if this bug
# was created or 'dep' if it was added as a dependent/blocker
# id: integer; the ID of the bug
# bug: object; Bugzilla::Bug object of the bug that was created (used in
# template bug/edit.html.tmpl
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "bug/show-header.html.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "$terms.Bug $id сохранена &ndash; $filtered_desc"
header = "$terms.Bug&nbsp;$id сохранена"
%]
[% header_done = 1 %]
[% FOREACH item = sentmail %]
[% PROCESS bug/process/results.html.tmpl
type = item.type
id = item.id
sent_bugmail = item
%]
[% END %]
<br>
<hr>
[% PROCESS bug/edit.html.tmpl %]
<hr>
[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1 %]
<br>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# url: URL to a pre-filled bug entry form.
# short_desc: Bug summary as entered in the form.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Создание закладки"
header = "Шаблон создан"
%]
<p>
Добавьте в закладки эту ссылку:
&ldquo;<a href="enter_bug.cgi?[% url FILTER html %]">
[% IF short_desc %]
[% short_desc FILTER html %]
[% ELSE %]
Шаблон для регистрации [% terms.bug_gen %]
[% END %]</a>&rdquo;.
Переход по этой ссылке вызовет форму регистрации [% terms.bug_gen %]
с уже заполненными полями.
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# Migration note: this file corresponds to the old Param
# 'entryheaderhtml'
#%]
[%# You can make the output of this template product-specific by using
# Template Toolkit IF statements. The current product name is stored in
# the 'product' variable.
#%]
[% PROCESS global/variables.none.tmpl %]
Прежде, чем регистрировать новую [% terms.bug_acc %], пожалуйста, прочтите
<a href="page.cgi?id=bug-writing.html">
руководство по регистрации [% terms.bugs_gen %]</a>, ознакомьтесь со списком
<a href="duplicates.cgi">наиболее часто регистрируемых [% terms.bugs_gen %]</a>, и выполните
<a href="query.cgi">поиск</a> среди существующих [% terms.bugs_gen %].
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# bug_id: integer. The number of the bug(s).
# multiple_bugs: boolean. True if bug_id contains > 1 bug number.
# showsummary: boolean. True if we are showing bug summaries.
# rankdir: string. "TB" if we are ranking top-to-bottom,
"LR" if left-to-right.
# image_url: string. The URL of the graphic showing the dependencies.
# map_url: string. The URL of the map file for the image. (Optional)
# image_map: string. The image map for the graphic showing the
dependencies. (Optional)
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = "Диаграмма зависимостей"
header = title
%]
[% IF NOT multiple_bugs %]
[% filtered_desc = short_desc FILTER html %]
[% title = "$title $terms.bug_gen номер $bug_id"
header = "$header для $terms.bug_gen номер <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
subheader = filtered_desc
%]
[% END %]
[% PROCESS global/header.html.tmpl %]
[% image_map %]
<p>
Незакрытые [% terms.bugs %] обозначены зеленым цветом.
</p>
[% IF image_map %]
<img src="[% image_url %]" alt="Диаграмма зависимостей" usemap="#imagemap">
[% ELSE %]
<a href="[% map_url %]">
<img src="[% image_url %]" alt="Диаграмма зависимостей" ismap="ismap">
</a>
[% END %]
<hr>
<form action="showdependencygraph.cgi" method="GET">
<table>
<tr>
<th align="left"><label for="id">Номера [% terms.bugs_gen %]</label>:</th>
<td><input id="id" name="id" value="[% bug_id %]"></td>
<td>
<input type="checkbox" id="showsummary" name="showsummary" [% " checked" IF showsummary %]>
<label for="showsummary">Показать аннотации [% terms.bugs_gen %]</label>
</td>
</tr>
<tr>
<th align="left"><label for="display">Показать:</label></th>
<td colspan="2">
<select id="display" name="display">
<option value="tree"[% 'selected="selected"' IF (!display || display == "tree") %]>
только [% terms.bugs %], непосредственно связанные с перечисленными</option>
<option value="web" [% 'selected="selected"' IF display == "web" %]>
все [% terms.bugs %], имеющие любые связи с перечисленными</option>
</select>
</td>
</tr>
<tr>
<th align="left"><label for="rankdir">Ориентация:</label></th>
<td colspan="2">
<select id="rankdir" name="rankdir">
<option value="TB"[% " selected" IF rankdir == "TB" %]>сверху вниз</option>
<option value="BT"[% " selected" IF rankdir == "BT" %]>снизу вверх</option>
<option value="LR"[% " selected" IF rankdir == "LR" %]>слева направо</option>
<option value="RL"[% " selected" IF rankdir == "RL" %]>справа налево</option>
</select>
</td>
</tr>
</table>
<input type="submit" id="change" value="Применить">
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS 'global/field-descs.none.tmpl' %]
[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Дерево зависимостей $terms.bug_gen номер $bugid"
header = "Дерево зависимостей
<a href=\"show_bug.cgi?id=$bugid\">$terms.bug_gen номер $bugid</a>"
javascript_urls = ["js/expanding-tree.js"]
style_urls = ["skins/standard/dependency-tree.css"]
subheader = filtered_desc
doc_section = "hintsandtips.html#dependencytree"
%]
[% PROCESS depthControlToolbar %]
[% INCLUDE tree_section ids=dependson_ids type=1 %]
[% INCLUDE tree_section ids=blocked_ids type=2 %]
[% PROCESS depthControlToolbar %]
[% PROCESS global/footer.html.tmpl %]
[%###########################################################################%]
[%# Tree-drawing blocks #%]
[%###########################################################################%]
[% BLOCK tree_section %]
[%# INTERFACE
# - ids: a list of bug IDs to be displayed as children
# - type: the type of tree. 1 = depends on, 2 = blockeds
# GLOBALS
# - seen: Maintains a global hash of bugs that have been displayed
#%]
[% global.seen = {} %]
[%# Display the tree of bugs that this bug depends on. %]
<h3>
<a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a>
[% IF type == 1 %]
[% tree_name = "dependson_tree" %]
[% IF ids.size %]
зависит от
[%+ ids.size %]
[%+ IF hide_resolved %]
[% numeral( ids.size, "незакрытой", "незакрытых", "незакрытых") FILTER html %]
[% END %]
[% numeral( ids.size, terms.bug_gen, terms.bugs_gen, terms.bugs_gen) FILTER html %]
[% ELSE %]
не зависит от других [% 'незакрытых ' IF hide_resolved %][% terms.bugs_gen %].
[% END %]
[% ELSIF type == 2 %]
[% tree_name = "blocked_tree" %]
[% IF ids.size %]
блокирует
[%+ ids.size %]
[%+ IF hide_resolved %]
[% numeral( ids.size, "незакрытую", "незакрытые", "незакрытые") FILTER html %]
[% END %]
[% numeral( ids.size, terms.bug_acc, terms.bugs_acc, terms.bugs_acc) FILTER html %]
[% ELSE %]
не блокирует другие [% 'незакрытые ' IF hide_resolved %][% terms.bugs_acc %].
[% END %]
[% END %]
</h3>
[% IF ids.size %]
[%# 27 chars is the length of buglist.cgi?tweak=&bug_id=" %]
[% use_post = (ids.join(",").length > constants.CGI_URI_LIMIT - 27 ) ? 1 : 0 %]
[% IF use_post %]
<form action="buglist.cgi" method="post">
<input type="hidden" name="bug_id" value="[% ids.join(",") %]">
[% END %]
[% IF maxdepth -%]До [% maxdepth %] уровня | [% END -%]
[% IF use_post %]
<button>В виде списка [% terms.bugs_gen %]</button>
[% IF user.in_group('editbugs') && ids.size > 1 %]
| <button type="submit" name="tweak" value="1">Групповое редактирование</button>
[% END %]
</form>
[% ELSE %]
<a href="buglist.cgi?bug_id=[% ids.join(",") %]">В виде списка [% terms.bugs_gen %]</a>
[% IF user.in_group('editbugs') && ids.size > 1 %]
| <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">Групповое редактирование</a>
[% END %]
[% END %]
<ul class="tree">
[% INCLUDE display_tree tree=$tree_name %]
</ul>
[% END %]
[% END %]
[% BLOCK display_tree %]
[%# INTERFACE
# - bugid: the ID of the bug being displayed
# - tree: a hash of bug objects and of bug dependencies
#%]
[% bug = tree.$bugid %]
<li>
[%- INCLUDE bullet bugid=bugid tree=tree -%]
<span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
id="[% bugid FILTER html %]"
[% IF global.seen.$bugid %]
onMouseover="duplicatedover('[% bugid FILTER html %]')"
onMouseout="duplicatedout('[% bugid FILTER html %]')"
[% END %]>
[%- INCLUDE buglink bug=bug bugid=bugid %]
</span>
[% IF global.seen.$bugid %]
<b><a title="Показана ранее, щелкните для перехода"
onclick="duplicated('[% bugid FILTER html %]')"
href="#b[% bugid %]">(*)</a></b>
[% ELSIF tree.dependencies.$bugid.size %]
<ul>
[% FOREACH depid = tree.dependencies.$bugid %]
[% INCLUDE display_tree bugid=depid %]
[% END %]
</ul>
[% END %]
</li>
[% global.seen.$bugid = 1 %]
[% END %]
[% BLOCK bullet %]
[% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
[% extra_class = " b_open" %]
[% extra_args = 'onclick="return doToggle(this, event)"' %]
[% END %]
<a id="b[% bugid %]"
class="b [%+ extra_class FILTER none %]"
title="Щелкните для развертывания или свертывания части дерева. Щелкните, удерживая Ctrl, для развертывания или свертывания всех уровней."
[% extra_args FILTER none %]>&nbsp;&nbsp;</a>
[% END %]
[% BLOCK buglink %]
[% isclosed = !bug.isopened %]
[% FILTER closed(isclosed) -%]
<a title="[% INCLUDE buginfo bug=bug %]"
href="show_bug.cgi?id=[% bugid %]">
<b>[%- bugid %]:</b>
<span class="summ_text">[%+ bug.short_desc FILTER html %]</span>
<span class="summ_info">[[% INCLUDE buginfo %]]</span>
</a>
<a href="showdependencytree.cgi?id=[% bugid FILTER uri %]"
class="tree_link">
<img src="skins/standard/dependency-tree/tree.png"
title="Показать дерево зависимостей [% terms.bug_gen %] [%+ bugid FILTER html %]">
</a>
[% END %]
[% END %]
[% BLOCK buginfo %]
[% display_value("bug_status", bug.bug_status) FILTER html -%] [%+ display_value("resolution", bug.resolution) FILTER html %];
[%-%] исполнитель [% bug.assigned_to.login FILTER email FILTER html %]
[%-%][% "; План: " _ bug.target_milestone IF bug.target_milestone %]
[% END %]
[%###########################################################################%]
[%# Block for depth control toolbar #%]
[%###########################################################################%]
[% BLOCK depthControlToolbar %]
<table cellpadding="3" border="0" cellspacing="0" bgcolor="#e0e0e0">
<tr>
[%# Hide/show resolved button
Swaps text depending on the state of hide_resolved %]
<td align="center">
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
<input name="id" type="hidden" value="[% bugid %]">
[% IF maxdepth %]
<input name="maxdepth" type="hidden" value="[% maxdepth %]">
[% END %]
<input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]">
<input type="submit" id="toggle_visibility"
value="[% IF hide_resolved %]Показать[% ELSE %]Скрыть[% END %] завершенные">
</form>
</td>
<td>
Уровни:
</td>
<td>
&nbsp;
</td>
<td>
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
[%# set to one form %]
<input type="submit" id="change_maxdepth"
value="&nbsp;1&nbsp;"
[% "disabled" IF realdepth < 2 || maxdepth == 1 %]>
<input name="id" type="hidden" value="[% bugid %]">
<input name="maxdepth" type="hidden" value="1">
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
</form>
</td>
<td>
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
[%# Minus one form
Allow subtracting only when realdepth and maxdepth > 1 %]
<input name="id" type="hidden" value="[% bugid %]">
<input name="maxdepth" type="hidden" value="[%
maxdepth == 1 ? 1
: ( maxdepth ? maxdepth - 1 : realdepth - 1 )
%]">
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
<input type="submit" id="decrease_depth" value="&nbsp;&lt;&nbsp;"
[% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]>
</form>
</td>
<td>
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
[%# Limit entry form: the button can not do anything when total depth
is less than two, so disable it %]
<input name="maxdepth" size="4" maxlength="4" value="[%
maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""
%]">
<input name="id" type="hidden" value="[% bugid %]">
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
<noscript>
<input type="submit" id="change_depth" value="Установить"
[% "disabled" IF realdepth < 2 %]>
</noscript>
</form>
</td>
<td>
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
[%# plus one form
Disable button if total depth < 2, or if depth set to unlimited %]
<input name="id" type="hidden" value="[% bugid %]">
[% IF maxdepth %]
<input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
[% END %]
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
<input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;"
[% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]>
</form>
</td>
<td>
<form method="get" action="showdependencytree.cgi"
style="display: inline; margin: 0px;">
[%# Unlimited button %]
<input name="id" type="hidden" value="[% bugid %]">
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
<input type="submit" id="remove_limit"
value="&nbsp;Все&nbsp;"
[% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]>
</form>
</td>
</tr>
</table>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS bug/time.html.tmpl %]
[% PROCESS etersoft/timersplash.html.tmpl %]
<script type="text/javascript">
<!--
[% IF user.is_timetracker %]
var fRemainingTime = [% bug.remaining_time %]; // holds the original value
function adjustRemainingTime() {
// subtracts time spent from remaining time
var new_time;
// prevent negative values if work_time > fRemainingTime
new_time =
Math.max(fRemainingTime - document.changeform.work_time.value, 0.0);
// get upto 2 decimal places
document.changeform.remaining_time.value =
Math.round(new_time * 100)/100;
}
function updateRemainingTime() {
// if the remaining time is changed manually, update fRemainingTime
fRemainingTime = document.changeform.remaining_time.value;
}
[% END %]
[% IF user.id %]
/* Index all classifications so we can keep track of the classification
* for the selected product, which could control field visibility.
*/
var all_classifications = new Array([% bug.choices.product.size %]);
[%- FOREACH product = bug.choices.product %]
all_classifications['[% product.name FILTER js %]'] = '
[%- product.classification.name FILTER js %]';
[%- END %]
[% END %]
//-->
</script>
<form name="changeform" id="changeform" method="post" action="process_bug.cgi">
<input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
<input type="hidden" name="longdesclength" value="[% bug.comments.size %]">
<input type="hidden" name="id" value="[% bug.bug_id %]">
<input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
[% PROCESS section_title %]
<table class="edit_form">
<tr>
[%# 1st Column %]
<td id="bz_show_bug_column_1" class="bz_show_bug_column">
<table>
[%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
[% PROCESS section_status %]
[% PROCESS section_spacer %]
[% PROCESS section_details1 %]
[% PROCESS section_spacer %]
[%# *** severity, priority, version and milestone *** %]
[% PROCESS section_details2 %]
[%# *** assigned to and qa contact *** %]
[% PROCESS section_people %]
[% PROCESS section_spacer %]
[% PROCESS section_url_keyword_whiteboard %]
[% PROCESS section_spacer %]
[%# *** Dependencies and duplicates *** %]
[% PROCESS section_duplicates %]
[% PROCESS section_dependson_blocks %]
</table>
</td>
<td>
<div class="bz_column_spacer">&nbsp;</div>
</td>
[%# 2nd Column %]
<td id="bz_show_bug_column_2" class="bz_show_bug_column">
<table cellpadding="3" cellspacing="1">
[%# *** Reported and modified dates *** %]
[% PROCESS section_dates %]
[% PROCESS section_cclist %]
[% PROCESS section_spacer %]
[% PROCESS section_see_also %]
[% PROCESS section_customfields %]
[% PROCESS section_spacer %]
[% Hook.process("after_custom_fields") %]
[% PROCESS section_flags %]
</table>
</td>
</tr>
<tr>
<td colspan="3">
<hr id="bz_top_half_spacer">
</td>
</tr>
</table>
<table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr>
<td>
[% IF user.is_timetracker %]
[% PROCESS section_timetracking %]
[% END %]
[%# *** Attachments *** %]
[% PROCESS attachment/list.html.tmpl
attachments = bug.attachments
bugid = bug.bug_id
num_attachment_flag_types = bug.num_attachment_flag_types
show_attachment_flags = bug.show_attachment_flags
%]
[% IF user.settings.comment_box_position.value == 'before_comments' %]
[% PROCESS comment_box %]
[% END %]
</td>
<td>
[% PROCESS section_restrict_visibility %]
</td>
</tr></table>
[%# *** Additional Comments *** %]
<div id="comments">
[% PROCESS bug/comments.html.tmpl
comments = bug.comments
mode = user.id ? "edit" : "show"
%]
</div>
[% IF user.settings.comment_box_position.value == 'after_comments' %]
<hr>
[% PROCESS comment_box %]
[% END %]
</form>
[%############################################################################%]
[%# Block for the Title (alias and short desc) #%]
[%############################################################################%]
[% BLOCK section_title %]
[%# That's the main table, which contains all editable fields. %]
<div class="bz_alias_short_desc_container edit_form">
[% PROCESS commit_button id="_top"%]
<a href="show_bug.cgi?id=[% bug.bug_id %]">
[%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
[%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
[% IF bug.alias != "" %]
(<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
[% END %]
<span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
[% IF bug.check_can_change_field('short_desc', 0, 1) ||
bug.check_can_change_field('alias', 0, 1) %]
<small class="editme">(<a href="#" id="editme_action">Изменить</a>)</small>
[% END %]
</span>
<!-- Etersoft -->
&nbsp;&nbsp;<a title="Создать копию текущей [% terms.bug_gen %] по основным параметрам"
href="enter_bug.cgi?product=[% bug.product %]&component=[% bug.component %]&blocked=[% bug_blocked_string %]&assigned_to=[% bug.assigned_to.email %]&cc=[% bug_cc_string %]&qa_contact=[% bug.qa_contact.email %]">Создать подобную</a>
<!-- Etersoft END -->
<div id="summary_alias_input">
<table id="summary">
<tr>
[% IF bug.check_can_change_field('alias', 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.alias
editable = 1
%]
<td>
[% ELSIF bug.alias %]
<td colspan="2">(
[% ELSE %]
<td colspan="2">
[% END %]
[% PROCESS input inputname => "alias"
size => "20"
maxlength => "20"
no_td => 1
%][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
&& bug.alias %]
</td>
</tr>
[%# *** Summary *** %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.short_desc
editable = 1
accesskey = "s"
%]
<td>
[% PROCESS input inputname => "short_desc" size => "80" colspan => 2
maxlength => 255 spellcheck => "true" no_td => 1 %]
</td>
</tr>
</table>
</div>
</div>
<script type="text/javascript">
hideAliasAndSummary('[% bug.short_desc FILTER js %]', '[% bug.alias FILTER js %]');
</script>
[% END %]
[%############################################################################%]
[%# Block for the first table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details1 %]
[%#############%]
[%# PRODUCT #%]
[%#############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product,
override_legal_values = bug.choices.product
desc_url = 'describecomponents.cgi', value = bug.product
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
[%# Classification is here so that it can be used in value controllers
# and visibility controllers. It comes after product because
# it uses some javascript that depends on the existence of the
# product field.
#%]
<tr class="bz_default_hidden">
[% INCLUDE bug/field.html.tmpl
bug = bug field = bug_fields.classification
override_legal_values = bug.choices.classification
value = bug.classification
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
[%###############%]
[%# Component #%]
[%###############%]
<tr>
<th class='field_label'>
Список:
</th>
<td>
<a title="Выводит список всех [% terms.bugs_gen %] по этой компоненте"
href="buglist.cgi?product=[% bug.product %]&component=[% bug.component %]">Вывести</a>
</td>
</tr>
<tr>
[% INCLUDE "bug/field.html.tmpl"
bug = bug, field = bug_fields.component, value = bug.component
override_legal_values = bug.choices.component
desc_url = "describecomponents.cgi?product=$bug.product"
editable = bug.check_can_change_field('component', 0, 1)
%]
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.version editable = 1 %]
[% PROCESS select selname => "version" %]
</tr>
[%############%]
[%# PLATFORM #%]
[%############%]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.rep_platform, editable = 1, accesskey = "h" %]
<td class="field_value">
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.rep_platform,
no_tds = 1, value = bug.rep_platform
editable = bug.check_can_change_field('rep_platform', 0, 1) %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.op_sys,
no_tds = 1, value = bug.op_sys
editable = bug.check_can_change_field('op_sys', 0, 1) %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the status section #%]
[%############################################################################%]
[% BLOCK section_status %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td id="bz_field_status">
<span id="static_bug_status">
[% display_value("bug_status", bug.bug_status) FILTER html %]
[% IF bug.resolution %]
[%+ display_value("resolution", bug.resolution) FILTER html %]
[% IF bug.dup_id %]
(дублирует [% "${terms.bug_acc} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %])
[% END %]
[% END %]
[% IF bug.user.canedit || bug.user.isreporter %]
(<a href="#add_comment"
onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">изменить</a>)
[% END %]
</span>
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the second table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details2 %]
[%###############################################################%]
[%# Importance (priority and severity) #%]
[%###############################################################%]
<tr>
<th class="field_label">
<label for="priority" accesskey="i">
<a href="page.cgi?id=fields.html#importance">Важность</a></label>:
</th>
<td>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.priority,
no_tds = 1, value = bug.priority
editable = bug.check_can_change_field('priority', 0, 1) %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.bug_severity,
no_tds = 1, value = bug.bug_severity
editable = bug.check_can_change_field('bug_severity', 0, 1) %]
[% Hook.process('after_importance', 'bug/edit.html.tmpl') %]
</td>
</tr>
[% IF Param("usetargetmilestone") && bug.target_milestone %]
<tr>
<th class="field_label">
<label for="target_milestone">
<a href="page.cgi?id=fields.html#target_milestone">
Запланировано</a></label>:
</th>
[% PROCESS select selname = "target_milestone" %]
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for the table in the "People" section #%]
[%############################################################################%]
[% BLOCK section_people %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#assigned_to">Исполнитель</a>:
</th>
<td>
[% IF bug.check_can_change_field("assigned_to", 0, 1) %]
<div id="bz_assignee_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
(<a href="#" id="bz_assignee_edit_action">изменить</a>)
[% IF bug.assigned_to.id != user.id %]
(<a title="Взять исполнение на себя"
href="#" id="bz_assignee_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_assignee_input">
[% INCLUDE global/userselect.html.tmpl
id => "assigned_to"
name => "assigned_to"
value => bug.assigned_to.login
classes => ["bz_userfield"]
size => 30
%]
<br>
<input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
<label id="set_default_assignee_label" for="set_default_assignee">Вернуть исполнителю по умолчанию</label>
</div>
<script type="text/javascript">
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_edit_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]' );
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_take_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]',
'[% user.login FILTER js %]' );
initDefaultCheckbox('assignee');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
[% END %]
</td>
</tr>
[% IF Param('useqacontact') %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.qa_contact
editable = 1
accesskey = "q"
%]
<td>
[% IF bug.check_can_change_field("qa_contact", 0, 1) %]
<div id="bz_qa_contact_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
(<a href="#" id="bz_qa_contact_edit_action">изменить</a>)
[% IF bug.qa_contact.id != user.id %]
(<a title="Взять приемку на себя"
href="#" id="bz_qa_contact_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_qa_contact_input">
[% INCLUDE global/userselect.html.tmpl
id => "qa_contact"
name => "qa_contact"
value => bug.qa_contact.login
size => 30
classes => ["bz_userfield"]
emptyok => 1
%]
<br>
<input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
<label for="set_default_qa_contact" id="set_default_qa_contact_label">Вернуть ответственному за приемку по умолчанию</label>
</div>
<script type="text/javascript">
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_edit_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]');
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_take_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]',
'[% user.login FILTER js %]');
initDefaultCheckbox('qa_contact');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
[% END %]
</td>
</tr>
[% END %]
<script type="text/javascript">
assignToDefaultOnChange(['product', 'component'],
'[% bug.component_obj.default_assignee.login FILTER js %]',
'[% bug.component_obj.default_qa_contact.login FILTER js %]');
</script>
[% END %]
[%############################################################################%]
[%# Block for URL Keyword and Whiteboard #%]
[%############################################################################%]
[% BLOCK section_url_keyword_whiteboard %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.bug_file_loc
editable = 1
accesskey = "u"
%]
<td>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
<span id="bz_url_edit_container" class="bz_default_hidden">
[% IF is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
title="[% bug.bug_file_loc FILTER html %]">
[% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
[% ELSE %]
[% bug.bug_file_loc FILTER html %]
[% END %]
(<a href="#" id="bz_url_edit_action">изменить</a>)</span>
[% END %]
<span id="bz_url_input_area">
[% url_output = PROCESS input no_td=1 inputname => "bug_file_loc" size => "40" colspan => 2 %]
[% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1)
AND is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]">[% url_output FILTER none %]</a>
[% ELSE %]
[% url_output FILTER none %]
[% END %]
</span>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
<script type="text/javascript">
hideEditableField('bz_url_edit_container',
'bz_url_input_area',
'bz_url_edit_action',
'bug_file_loc',
"[% bug.bug_file_loc FILTER js %]");
</script>
[% END %]
</td>
</tr>
[% IF Param('usestatuswhiteboard') %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.status_whiteboard
editable = 1
accesskey = "w"
%]
[% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %]
</tr>
[% END %]
[% IF use_keywords %]
<tr>
<th class="field_label">
<label for="keywords" accesskey="k">
<a href="describekeywords.cgi">Ключевые слова</a></label>:
</th>
<td class="field_value" colspan="2">
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.keywords, value = bug.keywords
editable = bug.check_can_change_field("keywords", 0, 1),
no_tds = 1, possible_values = all_keywords
%]
</td>
</tr>
[% END %]
[% IF user.id %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.tag, value = bug.tags.join(", "),
editable = 1, possible_values = user.tags.keys
%]
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Duplicates #%]
[%############################################################################%]
[% BLOCK section_duplicates %]
[% RETURN UNLESS bug.duplicates.size %]
<tr>
<th class="field_label">
<label for="duplicates">Дубликаты</label>:
</th>
<td class="field_value" colspan="2">
<span id="duplicates">
[% FOREACH dupe = bug.duplicates %]
[% dupe.id FILTER bug_link(dupe, use_alias => 1) FILTER none %][% " " %]
[% END %]
</span>
(<a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]">
[%-%]показать как список [% terms.bugs_gen %]</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Depends On / Blocks #%]
[%############################################################################%]
[% BLOCK section_dependson_blocks %]
<tr>
[% INCLUDE dependencies
field = bug_fields.dependson deps = bug.depends_on_obj %]
</tr>
<tr>
[% INCLUDE dependencies
field = bug_fields.blocked deps = bug.blocks_obj %]
</tr>
<tr>
<th>&nbsp;</th>
<td colspan="2" align="left" id="show_dependency_tree_or_graph">
Показать <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">дерево</a>
[% IF Param('webdotbase') %]
/&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">диаграмму</a>
[% END %] зависимостей
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Restricting Visibility #%]
[%############################################################################%]
[% BLOCK section_restrict_visibility %]
[% RETURN UNLESS bug.groups.size %]
<div class="bz_group_visibility_section">
[% inallgroups = 1 %]
[% inagroup = 0 %]
[% emitted_description = 0 %]
[% FOREACH group = bug.groups %]
[% SET inallgroups = 0 IF NOT group.ingroup %]
[% SET inagroup = 1 IF group.ison %]
[% NEXT IF group.mandatory %]
[% IF NOT emitted_description %]
[% emitted_description = 1 %]
<div id="bz_restrict_group_visibility_help">
<b>[%+ terms.Bug %] видна только пользователям, входящим в каждую из групп:</b>
<p class="instructions">
Снятие отметок делает [% terms.bug_acc %] более доступной.
</p>
</div>
[% END %]
[% IF group.ingroup %]
<input type="hidden" name="defined_groups"
value="[% group.name FILTER html %]">
[% END %]
<input type="checkbox" value="[% group.name FILTER html %]"
name="groups" id="group_[% group.bit %]"
[% ' checked="checked"' IF group.ison %]
[% ' disabled="disabled"' IF NOT group.ingroup %]>
<label for="group_[% group.bit %]">
[%- group.description FILTER html_light %]</label>
<br>
[% END %]
[% IF emitted_description %]
[% IF NOT inallgroups %]
<p class="instructions">Только члены группы могут управлять видимостью
[% terms.bug_gen %] для этой группы.</p>
[% END %]
[% END %]
[% IF inagroup %]
<div id="bz_enable_role_visibility_help">
<b>Пользователям выбранных ролей [% terms.bug %] видима всегда:</b>
</div>
<div id="bz_enable_role_visibility">
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("reporter_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_reporter_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="reporter_accessible" id="reporter_accessible"
[% " checked" IF bug.reporter_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="reporter_accessible">Инициатор</label>
</div>
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("cclist_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_cclist_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="cclist_accessible" id="cclist_accessible"
[% " checked" IF bug.cclist_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="cclist_accessible">Подписчики</label>
</div>
<p class="instructions">
Исполнитель
[% IF (Param('useqacontact')) %]
и ответственный за приемку
[% END %]
всегда имеют доступ к [% terms.bug_dat %]. Данная настройка действует
если видимость [% terms.bug_gen %] ограничена некоторой группой.
</p>
</div>
[% END %]
</div> [%# bz_group_visibility_section %]
[% END %]
[%############################################################################%]
[%# Block for Dates #%]
[%############################################################################%]
[% BLOCK section_dates %]
<tr>
<th class="field_label">
Зарегистрирована:
</th>
<td>
[% bug.creation_ts FILTER time %] пользователем [% INCLUDE global/user.html.tmpl who = bug.reporter %]
</td>
</tr>
<tr>
<th class="field_label">
Изменена:
</th>
<td>
[% bug.delta_ts FILTER time FILTER replace(':\d\d$', '') FILTER replace(':\d\d ', ' ')%]
(<a href="show_activity.cgi?id=[% bug.bug_id %]">История изменений</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for CC LIST #%]
[%############################################################################%]
[% BLOCK section_cclist %]
<tr>
<th class="field_label">
<label for="newcc" accesskey="a">Подписчики:</label>
</th>
<td>
[% IF user.id %]
[% IF NOT bug.cc.contains(user.login) %]
<input type="checkbox" id="addselfcc" name="addselfcc"
[% " checked=\"checked\""
IF user.settings.state_addselfcc.value == 'always'
|| (!bug.user.has_any_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Добавить себя</label>
<br>
[% END %]
[% END %]
[% bug.cc.size FILTER html %]&nbsp;[% numeral(bug.cc.size,
"пользователь", "пользователя", "пользователей") FILTER html %]
[% IF user.id %]
[% IF bug.cc.contains( user.email ) %]
(включая себя)
[% END %]
[% END %]
[% IF user.id || bug.cc.size %]
<span id="cc_edit_area_showhide_container" class="bz_default_hidden">
(<a href="#" id="cc_edit_area_showhide">[% IF user.id %]изменить[% ELSE %]показать[% END %]</a>)
</span>
[% END %]
<div id="cc_edit_area">
<br>
[% IF user.id %]
<div>
<div><label for="cc"><b>Подписать</b></label></div>
[% INCLUDE global/userselect.html.tmpl
id => "newcc"
name => "newcc"
value => ""
size => 30
classes => ["bz_userfield"]
multiple => 5
%]
</div>
[% END %]
[% IF bug.cc.size %]
<select id="cc" multiple="multiple" size="5"
[% IF bug.user.canedit %]name="cc"[% END %]>
[% FOREACH c = bug.cc %]
<option value="[% c FILTER email FILTER html %]">
[% c FILTER email FILTER html %]</option>
[% END %]
</select>
[% IF user.id && !bug.user.canedit %]
<input type="hidden" name="cc" value="[% user.login FILTER email FILTER html %]">
[% END %]
[% IF user.id AND (bug.user.canedit OR bug.cc.contains(user.login)) %]
<br>
<input type="checkbox" id="removecc" name="removecc">
<label for="removecc">
[% IF bug.user.canedit %]
Отменить подписку выбранных пользователей
[% ELSE %]
Отменить мою подписку
[% END %]
</label>
<br>
[% END %]
[% END %]
</div>
[% IF user.id || bug.cc.size %]
<script type="text/javascript">
hideEditableField( 'cc_edit_area_showhide_container',
'cc_edit_area',
'cc_edit_area_showhide',
'',
'');
</script>
[% END %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for See Also #%]
[%############################################################################%]
[% BLOCK section_see_also %]
[% IF Param('use_see_also') || bug.see_also.size %]
<tr>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.see_also
value = bug.see_also
editable = bug.check_can_change_field('see_also', 0, 1)
%]
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for FLAGS #%]
[%############################################################################%]
[% BLOCK section_flags %]
[%# *** Flags *** %]
[% show_bug_flags = 0 %]
[% bug_flags_set = 0 %]
[% show_more_flags = 0 %]
[% FOREACH type = bug.flag_types %]
[% IF type.flags.size || (user.id && type.is_active && user.can_request_flag(type)) %]
[% show_bug_flags = 1 %]
[% END %]
[% IF user.id && type.is_active && (!type.flags.size || type.is_multiplicable) %]
[% show_more_flags = 1 %]
[% END %]
[% IF type.flags.size %]
[% bug_flags_set = 1 %]
[% END %]
[% LAST IF show_bug_flags && show_more_flags && bug_flags_set %]
[% END %]
[% IF show_bug_flags %]
<tr>
<th class="field_label">
<label>Согласования:</label>
</th>
<td>
[% IF bug.flag_types.size %]
[% PROCESS "flag/list.html.tmpl" flag_no_header = 1
flag_types = bug.flag_types
any_flags_requesteeble = bug.any_flags_requesteeble %]
[% END %]
[% IF show_more_flags %]
<span id="bz_flags_more_container" class="bz_default_hidden">
[% IF !bug_flags_set %]<em>Ещё не установлены</em>[% END %]
(<a href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]послать на[% ELSE %]добавить[% END %] согласование</a>)
</span>
<script type="text/javascript">
YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden');
var table = YAHOO.util.Dom.get("flags");
var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table);
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) {
YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden');
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.preventDefault(e);
});
</script>
[% END %]
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Custom Fields #%]
[%############################################################################%]
[% BLOCK section_customfields %]
[%# *** Custom Fields *** %]
[% USE Bugzilla %]
[% FOREACH field = Bugzilla.active_custom_fields %]
<tr>
[% PROCESS bug/field.html.tmpl value = bug.${field.name}
editable = bug.check_can_change_field(field.name, 0, 1)
value_span = 2 %]
</tr>
[% IF extra_field_item %]
<tr>
<th class="field_label">[% extra_field_item.header FILTER none %]</th>
<td>[% extra_field_item.data FILTER none %]</td>
</tr>
[% END %]
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Section Spacer #%]
[%############################################################################%]
[% BLOCK section_spacer %]
<tr>
<td colspan="2" class="bz_section_spacer"></td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for dependencies #%]
[%############################################################################%]
[% BLOCK dependencies %]
[% INCLUDE "bug/field-label.html.tmpl" %]
<td>
<span id="[% field.name FILTER html %]_input_area">
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" class="text_input"
value="[% bug.${field.name}.join(', ') FILTER html %]">
[% END %]
</span>
[% FOREACH dep_bug = deps %]
[% dep_bug.id FILTER bug_link(dep_bug, use_alias => 1)
FILTER none %][% " " %]
[% END %]
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<span id="[% field.name FILTER html %]_edit_container"
class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action">изменить</a>)
</span>
<script type="text/javascript">
hideEditableField('[% field.name FILTER js %]_edit_container',
'[% field.name FILTER js %]_input_area',
'[% field.name FILTER js %]_edit_action',
'[% field.name FILTER js %]',
'[% bug.${field.name}.join(', ') FILTER js %]');
</script>
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for Time Tracking Group #%]
[%############################################################################%]
[% BLOCK section_timetracking %]
<table class="bz_time_tracking_table">
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.estimated_time, editable = 1
%]
<th>
Текущая оценка:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.work_time, editable = 1
%]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.remaining_time, editable = 1
%]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.percentage_complete, editable = 1
%]
<th>
Отклонение:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.deadline, editable = 1
%]
</tr>
<tr>
<td>
<input name="estimated_time" id="estimated_time"
value="[% PROCESS formattimeunit
time_unit=bug.estimated_time %]"
size="6" maxlength="6">
</td>
<td>
[% PROCESS formattimeunit
time_unit=(bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.actual_time %] +
<input name="work_time" id="work_time"
value="0" size="3" maxlength="6" readonly
onchange="adjustRemainingTime();">
</td>
<td>
<input name="remaining_time" id="remaining_time"
value="[% PROCESS formattimeunit
time_unit=bug.remaining_time %]"
size="6" maxlength="6" onchange="updateRemainingTime();">
</td>
<td>
[% PROCESS calculatepercentage act=bug.actual_time
rem=bug.remaining_time %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.deadline, value = bug.deadline, no_tds = 1
editable = bug.check_can_change_field('deadline', 0, 1) %]
</td>
</tr>
<tr>
<td colspan="7" class="bz_summarize_time">
<a href="summarize_time.cgi?id=[% bug.bug_id %]&amp;do_depends=1">
Анализ трудозатрат (с учетом зависимостей [% terms.bugs_gen %])</a>
</td>
</tr>
</table>
[% END %]
[%############################################################################%]
[%# Block for the Additional Comments box #%]
[%############################################################################%]
[% BLOCK comment_box %]
<div id="add_comment" class="bz_section_additional_comments">
[% IF user.id %]
<label for="comment" accesskey="c"><b>Дополнительные
<u>К</u>омментарии</b></label>:
[% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
<input type="checkbox" name="comment_is_private" value="1"
id="newcommentprivacy"
onClick="updateCommentTagControl(this, 'comment')">
<label for="newcommentprivacy">
Сделать комментарий конфиденциальным (только для членов группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
[% END %]
<!-- This table keeps the submit button aligned with the box. -->
<table><tr><td>
[% IF bug.check_can_change_field('longdesc', 0, 1) %]
[% INCLUDE global/textarea.html.tmpl
name = 'comment'
id = 'comment'
minrows = 10
maxrows = 25
cols = constants.COMMENT_COLS
%]
[% IF user.is_insider %]
<script>
updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
</script>
[% END %]
[% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
[% ELSE %]
Вам не разрешено добавлять дополнительные комментарии в эту [% terms.bug_acc %].
[% END %]
<br>
[% PROCESS commit_button id=""%]
<table id="bug_status_bottom"
class="status" cellspacing="0" cellpadding="0">
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td>
[% PROCESS bug/knob.html.tmpl %]
</td>
</tr>
</table>
</td></tr></table>
[%# For logged-out users %]
[% ELSE %]
<table>
<tr>
<td>
<fieldset>
<legend>Внимание</legend>
Для добавления комментариев и внесения изменений в эту [% terms.bug_acc %] следует
<a href="show_bug.cgi?id=
[%- bug.bug_id %]&amp;GoAheadAndLogIn=1">войти в систему</a>.
</fieldset>
</td>
</tr>
</table>
[% END %]
</div>
[% END %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK select %]
<td>
[% IF bug.check_can_change_field(selname, 0, 1)
AND bug.choices.${selname}.size > 1 %]
<input type="hidden" id="[% selname %]_dirty">
<select id="[% selname %]" name="[% selname %]">
[% FOREACH x = bug.choices.${selname} %]
[% NEXT IF NOT x.is_active AND x.name != bug.${selname} %]
<option value="[% x.name FILTER html %]"
[% " selected" IF x.name == bug.${selname} %]>
[%- x.name FILTER html %]
</option>
[% END %]
</select>
[% ELSE %]
[% bug.${selname} FILTER html %]
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for INPUT fields #%]
[%############################################################################%]
[% BLOCK input %]
[% IF no_td != 1 %]
<td[% " colspan=\"$colspan\"" IF colspan %]>
[% END %]
[% val = value ? value : bug.$inputname %]
[% IF bug.check_can_change_field(inputname, 0, 1) %]
<input id="[% inputname %]" name="[% inputname %]" class="text_input"
value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
[% " maxlength=\"$maxlength\"" IF maxlength %]
[% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
[% ELSE %]
[% IF size && val.length > size %]
<span title="[% val FILTER html %]">
[% val FILTER truncate(size) FILTER html %]
</span>
[% ELSE %]
[% val FILTER html %]
[% END %]
[% END %]
[% IF no_td != 1 %]
</td>
[% END %]
[% no_td = 0 %]
[% maxlength = 0 %]
[% colspan = 0 %]
[% size = 0 %]
[% value = undef %]
[% spellcheck = undef %]
[% END %]
[% BLOCK commit_button %]
[% IF user.id %]
<div class="knob-buttons">
<input type="button" value="Сохранить" onclick="mysubmit();"
id="commit[% id FILTER css_class_quote %]">
</div>
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# This file describes both bug fields and search fields.
# As calling this template once per label is very expensive,
# it is called only by Template.pm. %]
[% RETURN UNLESS in_template_var %]
[% PROCESS "global/variables.none.tmpl" %]
[% vars.help_html = {
# Note that all these keys here are in alphabetical order, though
# search-specific fields are at the bottom.
##############
# Bug Fields #
##############
alias =>
"Короткое, уникальное имя, присвоенное $terms.abug призванное помочь в её
поиске и при проставлении на неё ссылок из других частей ${terms.Bugzilla}.",
assigned_to =>
"Лицо, ответственное за работы по существу ${terms.bug_gen}.",
blocked =>
"Для того, чтобы появилась возможность решить перечисленные в этом поле
${terms.bugs}, вначале нужно решить эту ${terms.bug_acc}.",
bug_file_loc =>
"$terms.Bugs может быть сопоставлен адрес интернета - например"
_ " ссылка на веб-сайт с проблемой.",
bug_id =>
"Цифровой идентификатор $terms.bug_gen, уникальный в пределах этой"
_ " установки ${terms.Bugzilla}.",
bug_severity =>
"Степень серьезности $terms.bug_gen или является ли она пожеланием.",
bug_status =>
"$terms.Bug может быть в любом из определенных состояний.",
cc =>
"Пользователи, которые могут не участвовать напрямую в исправлении этой
${terms.bug_gen}, но которые заинтересованы в её решении.",
classification =>
"$terms.Bugs относятся к Разделам, Продуктам и"
_ " их Компонентам. Разделы — высший уровень деления.",
component =>
"Компоненты — категории второго уровня; каждая принадлежит к"
_ " определенному продукту. Выберите продукт для сужения списка компонентов.",
creation_ts =>
"Когда была создана эта ${terms.bug}.",
deadline =>
"Дата, к которой должна быть исправлена эта ${terms.bug}, введённая в формате
ГГГГ-ММ-ДД.",
delta_ts =>
"Дата последнего обновления этой ${terms.bug_gen}.",
dependson =>
"Для того, чтобы появилась возможность решить эту ${terms.bug_acc}, вначале
нужно решить перечисленные здесь ${terms.bugs}.",
estimated_time =>
"Оценка количества времени, которое потребуется для решения
этой ${terms.bug_gen}.",
importance =>
"Важность ${terms.bug_gen} описана в качестве комбинации
её полей $vars.field_descs.priority и ${vars.field_descs.bug_severity}.",
keywords =>
"К $terms.bugs_dat могут быть добавлены ключевые слова из определенного списка"
_ " для облегчения их идентификации и группировки.",
longdesc =>
"Пользователи $terms.Bugzilla добавляют к $terms.bugs_dat свои комментарии."
_ " Это поле для поиска по тексту этих комментариев.",
op_sys =>
"Операционная система, к которой относится ${terms.bug}.",
percentage_complete =>
"Насколько завершение решения этого $terms.bugs_acc близко к 100% — производится
путём сравнения значения '$vars.field_descs.work_time' с
значением '$${vars.field_descs.estimated_time}'.",
priority =>
"Приоритет, назначенный $terms.bug_dat исполнителем.",
# Note that this has extra text added below if useclassification is on.
product =>
"$terms.Bugs разделены на категории по Продуктам и их Компонентам.",
qa_contact =>
"Лицо, ответственное за подтверждение этой $terms.bug_gen, если она"
_ " не подтверждена, и за верификацию исправления после того как $terms.bug"
_ " была исправлена.",
remaining_time =>
"Количество часов работы, которое осталось провести для решения этой
$terms.bug_gen — вычисляется путём вычитания '$vars.field_descs.work_time' из
'${vars.field_descs.estimated_time}'.",
rep_platform =>
"Аппаратная платформа, к которой относится ${terms.bug}.",
reporter =>
"Лицо, которое создало эту ${terms.bug_acc}.",
resolution =>
"Если $terms.bug в завершенном состоянии,"
_ " то $terms.bug_dat присвоено некоторое решение.",
see_also =>
"Позволяют ссылаться на $terms.bugs в других системах.
Введите URL $terms.bug_gen в поле 'Добавить ссылки на ${terms.bugs}'
для указания того, что та $terms.bug имеет отношение к этой. Можно вводить
несколько адресов URL через запятую.
<p>Как правило это поле используется для ссылок на $terms.bugs в
<em>других</em> установках системы. Если $terms.bugs зарегистрированы
в этом экземпляре, лучше использовать поля '$vars.field_descs.dependson' и
'$vars.field_descs.blocked'.</p>",
short_desc =>
"Аннотация ${terms.bug_gen} — краткое описание"
_ " содержания ${terms.bug_gen}.",
status_whiteboard =>
"Каждая $terms.bug имеет однострочное поле для"
_ " для добавления меток и информации о состоянии.",
tag =>
"В отличие от ${vars.field_descs.keywords}, являющихся глобальными и видимыми
для всех пользователей, ${vars.field_descs.tag} являются персональными и
могут просматриваться и изменяться только их автором. Их редактирование
не отправит никаких уведомлений другим пользователям. Используйте их для
пометки и отслеживания ${terms.bugs_gen}.",
target_milestone =>
"Поле $vars.field_descs.target_milestone определяет когда"
_ " исполнитель $terms.bug рассчитывает решить проблему.",
version =>
"Поле версии определяет версию продукта,"
_ " к которой относится ${terms.bug}.",
votes =>
"Для некоторых $terms.bugs_gen разрешено голосование."
_ " Возможен поиск $terms.bugs_gen с некоторым числом голосов.",
work_time =>
"Полное количество времени, проведённое над решением этой $terms.bug_gen
на текущий момент.",
##########################
# Search-specific fields #
##########################
chfield =>
"Поиск по истории изменений — выберите поле"
_" изменения в котором надо найти.",
# Duplicated to chfieldto below, also.
chfieldfrom =>
"Укажите диапазон дат в формате ГГГГ-ММ-ДД (возможно добавление
времени в формате ЧЧ:ММ), или относительно текущей даты: например,
1h, 2d, 3w, 4m, 5y, что означает соответственно один час, два дня,
три недели, четыре месяца и пять лет; 0d — полночь, и
0h, 0w, 0m, 0y — начало текущего часа, недели, месяца и года.",
chfieldvalue =>
"Значение, которое указанное поле получило в этот период.",
content =>
"Это поле доступно в поисках, которые производят 'полнотекстовый' поиск
а-ля Google по полям '$vars.field_descs.short_desc' и '$vars.field_descs.longdesc'.",
# Duplicated to email2 below, also.
email1 =>
"С каждым $terms.bug_abl связаны пользователи в различных ролях. Возможен поиск"
_ " по принадлежности $terms.bugs_gen пользователям в определенной роли.",
} %]
[% vars.help_html.email2 = vars.help_html.email1 %]
[% vars.help_html.chfieldto = vars.help_html.chfieldfrom %]
[% vars.help_html.deadlinefrom = vars.help_html.deadline %]
[% vars.help_html.deadlineto = vars.help_html.deadline %]
[% help_all_note = BLOCK %]
<strong>Примечание:</strong> При выборе при поиске опции "Любая"
будут найдены только те [% terms.bugs %] имеющие в этом поле реальное
слово "Любая".
[% END %]
[% FOREACH all_field = ['op_sys', 'rep_platform'] %]
[% vars.help_html.$all_field = vars.help_html.$all_field _ ' ' _ help_all_note %]
[% END %]
[% IF Param('useclassification') %]
[% vars.help_html.product = vars.help_html.product
_ " Для уточнения этого списка выберите классификацию." %]
[% END %]
[% FOREACH help_field = bug_fields.keys %]
[%# Add help for custom fields. %]
[% IF !vars.help_html.${help_field}.defined %]
[% IF bug_fields.${help_field}.long_desc %]
[% vars.help_html.${help_field} = bug_fields.${help_field}.long_desc %]
[% ELSE %]
[% SET field_type = bug_fields.${help_field}.type %]
[% field_type_desc = BLOCK -%]
[% field_types.$field_type FILTER html %]
[%- END %]
[% vars.help_html.${help_field} =
"Настраиваемое поле $field_type_desc в этой установке"
_ " ${terms.Bugzilla}." %]
[% END %]
[% END %]
[%# Add help for the search types, for query.cgi. %]
[% type_desc = BLOCK %]
Тип [% vars.field_descs.${help_field} FILTER html %] поиска который вы
хотите произвести.
[% END %]
[% SET type_name = help_field _ '_type' %]
[% vars.help_html.$type_name = type_desc %]
[% END %]
[% Hook.process("end") %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# field: a Bugzilla::Field object
# value: The value of the field for this bug.
# override_legal_values (optional): The list of legal values, for select fields.
# editable: Whether the field should be displayed as an editable
# <input> or as just the plain text of its value.
# allow_dont_change: display the --do_not_change-- option for select fields.
# value_span: A colspan for the table cell containing
# the field value.
# no_tds: boolean; if true, don't display the label <th> or the
# wrapping <td> for the field.
# bug (optional): The current Bugzilla::Bug being displayed, or a hash
# with default field values being displayed on a page.
#%]
[% IF NOT no_tds %]
[% field_hidden = 0 %]
[% IF bug AND !field.is_visible_on_bug(bug) %]
[% field_hidden = 1 %]
[% END %]
[% INCLUDE "bug/field-label.html.tmpl" hidden = field_hidden %]
<td class="field_value [% ' bz_hidden_field' IF field_hidden %]"
id="field_container_[% field.name FILTER html %]"
[% " colspan=\"$value_span\"" FILTER none IF value_span %]>
[% END %]
[% Hook.process('start_field_column') %]
[% IF editable %]
[% SWITCH field.type %]
[% CASE constants.FIELD_TYPE_FREETEXT %]
<input id="[% field.name FILTER html %]" class="text_input"
name="[% field.name FILTER html %]"
value="[% value FILTER html %]" size="40"
maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
[% ' aria-required="true"' IF field.is_mandatory %]>
[% CASE constants.FIELD_TYPE_DATETIME %]
<input name="[% field.name FILTER html %]" size="20"
id="[% field.name FILTER html %]"
value="[% value FILTER html %]"
[% ' aria-required="true"' IF field.is_mandatory %]
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_[% field.name FILTER html %]"
onclick="showCalendar('[% field.name FILTER js %]')">
<span>Календарь</span>
</button>
<div id="con_calendar_[% field.name FILTER html %]"></div>
<script type="text/javascript">
<!--
[%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
//--></script>
[% CASE constants.FIELD_TYPE_BUG_ID %]
<span id="[% field.name FILTER html %]_input_area">
<input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
value="[% value FILTER html %]" size="7"
[% ' aria-required="true"' IF field.is_mandatory %]>
</span>
[% IF value %]
[% value FILTER bug_link(value, use_alias => 1) FILTER none %]
[% END %]
<span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
</span>
<script type="text/javascript">
hideEditableField('[% field.name FILTER js %]_edit_container',
'[% field.name FILTER js %]_input_area',
'[% field.name FILTER js %]_edit_action',
'[% field.name FILTER js %]',
"[% value FILTER js %]");
</script>
[% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
constants.FIELD_TYPE_MULTI_SELECT ] %]
<input type="hidden" id="[% field.name FILTER html %]_dirty">
<select id="[% field.name FILTER html %]"
name="[% field.name FILTER html %]"
[% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
[% SET field_size = 5 %]
[% IF field.legal_values.size < 5 %]
[% SET field_size = field.legal_values.size %]
[% END %]
size="[% field_size FILTER html %]" multiple="multiple"
[% ' aria-required="true"' IF field.is_mandatory %]
[% END %]
>
[% IF allow_dont_change %]
<option value="[% dontchange FILTER html %]"
[% ' selected="selected"' IF value == dontchange %]>
[% dontchange FILTER html %]
</option>
[% END %]
[% IF override_legal_values %]
[% legal_values = override_legal_values %]
[% ELSE %]
[% legal_values = field.legal_values %]
[% END %]
[% FOREACH legal_value = legal_values %]
[% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %]
<option value="[% legal_value.name FILTER html %]"
id="v[% legal_value.id FILTER html %]_
[%- field.name FILTER html %]"
[%# We always show selected values, even if they should be
# hidden %]
[% IF value.contains(legal_value.name).size %]
selected="selected"
[% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %]
class="bz_hidden_option" disabled="disabled"
[% END %]>
[%- display_value(field.name, legal_value.name) FILTER html ~%]
</option>
[% END %]
</select>
[%# When you pass an empty multi-select in the web interface,
# it doesn't appear at all in the CGI object. Instead of
# forcing all users of process_bug to always specify every
# multi-select, we have this field defined if the multi-select
# field is defined, and then if this is passed but the multi-select
# isn't, we know that the multi-select was emptied.
%]
[% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
<input type="hidden" name="defined_[% field.name FILTER html %]">
[% END %]
<script type="text/javascript">
<!--
initHidingOptionsForIE('[% field.name FILTER js %]');
[%+ INCLUDE "bug/field-events.js.tmpl"
field = field, product = bug.product_obj %]
//-->
</script>
[% CASE constants.FIELD_TYPE_TEXTAREA %]
[% INCLUDE global/textarea.html.tmpl
id = field.name name = field.name minrows = 4 maxrows = 8
cols = 60 defaultcontent = value mandatory = field.is_mandatory %]
[% CASE constants.FIELD_TYPE_BUG_URLS %]
[% '<ul class="bug_urls">' IF value.size %]
[% FOREACH bug_url = value %]
<li>
[% PROCESS bug_url_link bug_url = bug_url %]
<label><input type="checkbox" value="[% bug_url.name FILTER html %]"
name="remove_[% field.name FILTER html %]">
Удалить</label>
</li>
[% END %]
[% '</ul>' IF value.size %]
[% IF Param('use_see_also') %]
<span id="container_showhide_[% field.name FILTER html %]"
class="bz_default_hidden">
(<a href="#" id="showhide_[% field.name FILTER html %]">добавить</a>
</span>
<div id="container_[% field.name FILTER html %]">
<label for="[% field.name FILTER html %]">
<strong>Добавить ссылки на [% terms.bugs %]:</strong>
</label><br>
<input type="text" id="[% field.name FILTER html %]" size="40"
class="text_input" name="[% field.name FILTER html %]">
</div>
<script type="text/javascript">
setupEditLink('[% field.name FILTER js %]');
</script>
[% END %]
[% CASE constants.FIELD_TYPE_KEYWORDS %]
<div id="[% field.name FILTER html %]_container">
<input type="text" id="[% field.name FILTER html %]" size="40"
class="text_input" name="[% field.name FILTER html %]"
value="[% value FILTER html %]">
<div id="[% field.name FILTER html %]_autocomplete"></div>
</div>
<script type="text/javascript" defer="defer">
if (typeof YAHOO.bugzilla.field_array === "undefined")
YAHOO.bugzilla.field_array = [];
YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [
[%- FOREACH val = possible_values %]
[%-# %]"[% val FILTER js %]"
[%- "," IF NOT loop.last %][% END %]];
YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
'[% field.name FILTER js %]_autocomplete');
</script>
[% END %]
[% ELSE %]
[% SWITCH field.type %]
[% CASE constants.FIELD_TYPE_TEXTAREA %]
<div class="uneditable_textarea">[% value FILTER html %]</div>
[% CASE constants.FIELD_TYPE_BUG_ID %]
[% IF value %]
[% value FILTER bug_link(value, use_alias => 1) FILTER none %]
[% END %]
[% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
constants.FIELD_TYPE_MULTI_SELECT ] %]
[% FOREACH val = value %]
[% display_value(field.name, val) FILTER html %]
[% ', ' UNLESS loop.last() %]
[% END %]
[% CASE constants.FIELD_TYPE_BUG_URLS %]
[% '<ul class="bug_urls">' IF value.size %]
[% FOREACH bug_url = value %]
<li>
[% PROCESS bug_url_link bug_url = bug_url %]
</li>
[% END %]
[% '</ul>' IF value.size %]
[% CASE %]
[% value.join(', ') FILTER html %]
[% END %]
[% END %]
[% Hook.process('end_field_column') %]
[% '</td>' IF NOT no_tds %]
[%# for reverse relationships, we show this pseudo-field after the main field %]
[% IF bug.id && field.is_relationship %]
[% extra_field_item = {} %]
[% extra_field_item.header = field.reverse_desc _ ":" FILTER html %]
[% extra_field_item.data = BLOCK %]
[% FOREACH depbug = bug.related_bugs(field) %]
[% depbug.id FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
[% END %]
[% END %]
[% ELSE %]
[% extra_field_item = '' %]
[% END %]
[% BLOCK bug_url_link %]
[% IF bug_url.isa('Bugzilla::BugUrl::Bugzilla::Local') %]
[% bug_url.target_bug_id FILTER bug_link(bug_url.target_bug_id, use_alias => 1) FILTER none %]
[% ELSE %]
<a href="[% bug_url.name FILTER html %]">
[% bug_url.name FILTER html %]</a>
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# NOTE: Everywhere you use this template, you must call
# "FILTER remove('^X')" on the result. This is unfortunately the only way
# to preserve leading whitespace in comments.
#%]
[%# INTERFACE:
# comment: A Bugzilla::Comment object.
# is_bugmail: boolean; True if this comment is going into a plain-text
# bugmail.
#%]
[%# Please don't use field-descs here. It can slow down Bugzilla. %]
[% PROCESS 'global/variables.none.tmpl' %]
[% SET comment_body = comment.body %]
[% IF comment.type == constants.CMT_DUPE_OF %]
X[% comment_body %]
*** Эта [% terms.bug %] признана повтором [% terms.bug_gen %] [%+ comment.extra_data %] ***
[% ELSIF comment.type == constants.CMT_HAS_DUPE %]
*** [% terms.Bug %] [%+ comment.extra_data %] признана повтором этой [% terms.bug_gen %]. ***
[% ELSIF comment.type == constants.CMT_ATTACHMENT_CREATED %]
Создано attachment [% comment.extra_data %]
[% IF is_bugmail %]
--> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data _ "&action=edit" %]
[% END %]
[%+ comment.attachment.description %]
[%+ comment.body %]
[% ELSIF comment.type == constants.CMT_ATTACHMENT_UPDATED %]
Комментарии к attachment [% comment.extra_data %]
[% IF is_bugmail %]
--> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data %]
[% END %]
[%+ comment.attachment.description %]
[%+ comment.body %]
[% ELSE %]
X[% Hook.process('type') %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
<div id="status">
[% PROCESS bug/field.html.tmpl
no_tds = 1
field = bug_fields.bug_status
value = bug.bug_status
override_legal_values = bug.choices.bug_status
editable = bug.choices.bug_status.size > 1
%]
[% IF bug.resolution
OR bug.check_can_change_field('resolution', bug.resolution, 1)
%]
<noscript><br>resolved&nbsp;as&nbsp;</noscript>
[% END %]
<span id="resolution_settings">
[% PROCESS bug/field.html.tmpl
no_tds = 1
field = bug_fields.resolution
value = bug.resolution
override_legal_values = bug.choices.resolution
editable = bug.check_can_change_field('resolution', bug.resolution, 1)
%]
</span>
[% IF bug.check_can_change_field('dup_id', 0, 1) %]
<noscript><br> дублирует</noscript>
<span id="duplicate_settings">
<span id="dup_id_container" class="bz_default_hidden">
[% "${terms.bug_acc} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
(<a href="#" id="dup_id_edit_action">изменить</a>)
</span
><input id="dup_id" name="dup_id" size="6"
value="[% bug.dup_id FILTER html %]">
</span>
[% IF bug.dup_id %]
<noscript>[% bug.dup_id FILTER bug_link(bug.dup_id) FILTER none %]</noscript>
[% END %]
<div id="dup_id_discoverable" class="bz_default_hidden">
<a href="#" id="dup_id_discoverable_action">Отметить как дубликат</a>
</div>
[% ELSIF bug.dup_id %]
<noscript><br> дублирует</noscript>
<span id="duplicate_display">
[% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]</span>
[% END %]
</div>
<script type="text/javascript">
var close_status_array = [
[% FOREACH status = bug.choices.bug_status %]
[% NEXT IF status.is_open %]
'[% status.name FILTER js %]'[% ',' UNLESS loop.last %]
[% END %]
];
YAHOO.util.Dom.removeClass('dup_id_discoverable', 'bz_default_hidden');
hideEditableField( "dup_id_container", "dup_id", 'dup_id_edit_action',
'dup_id', '[% bug.dup_id FILTER js %]' )
showHideStatusItems( "", ['[% "is_duplicate" IF bug.dup_id %]',
'[% bug.bug_status FILTER js %]']);
YAHOO.util.Event.addListener( 'bug_status', "change", showHideStatusItems,
['[% "is_duplicate" IF bug.dup_id %]',
'[% bug.bug_status FILTER js %]']);
YAHOO.util.Event.addListener( 'resolution', "change", showDuplicateItem);
YAHOO.util.Event.addListener( 'dup_id_discoverable_action',
'click',
setResolutionToDuplicate,
'[% Param('duplicate_or_move_bug_status')
FILTER js %]');
YAHOO.util.Event.addListener( window, 'load', showHideStatusItems,
['[% "is_duplicate" IF bug.dup_id %]',
'[% bug.bug_status FILTER js %]'] );
[% INCLUDE "bug/field-events.js.tmpl" field = select_fields.bug_status %]
[% INCLUDE "bug/field-events.js.tmpl" field = select_fields.resolution %]
</script>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% RETURN IF !bug %]
[% PROCESS global/variables.none.tmpl %]
[% IF bottom_navigator == 1 %]
<ul class="related_actions">
<li><a href="show_bug.cgi?format=multiple&amp;id=
[% bug.bug_id FILTER uri %]">Версия для печати</a></li>
<li>&nbsp;-&nbsp;<a href="show_bug.cgi?ctype=xml&amp;id=
[% bug.bug_id FILTER uri %]">XML</a></li>
<li>&nbsp;-&nbsp;<a href="enter_bug.cgi?cloned_bug_id=
[% bug.bug_id FILTER uri %]">Создать копию
[% terms.bug_gen %]</a></li>
[%# Links to more things users can do with this bug. %]
[% Hook.process("links") %]
<li>&nbsp;-&nbsp;<a href="#">В начало страницы </a></li>
</ul>
[% END %]
<div class="navigation">
[% SET my_search = user.recent_search_for(bug) %]
[% IF my_search %]
[% SET last_bug_list = my_search.bug_list %]
[% SET this_bug_idx = lsearch(last_bug_list, bug.id) %]
<b>Список [% terms.bugs_gen %]:</b>
([% this_bug_idx + 1 %] из [% last_bug_list.size %])
<a href="show_bug.cgi?id=
[%- last_bug_list.first FILTER uri %]&amp;list_id=
[%- my_search.id FILTER uri %]">Первая</a>
<a href="show_bug.cgi?id=
[%- last_bug_list.last FILTER uri %]&amp;list_id=
[%- my_search.id FILTER uri %]">Последняя</a>
[% IF this_bug_idx > 0 %]
[% prev_bug = this_bug_idx - 1 %]
<a href="show_bug.cgi?id=
[%- last_bug_list.$prev_bug FILTER uri %]&amp;list_id=
[%- my_search.id FILTER uri %]">Предыдущая</a>
[% ELSE %]
<i><font color="#777777">Предыдущая</font></i>
[% END %]
[% IF this_bug_idx + 1 < last_bug_list.size %]
[% next_bug = this_bug_idx + 1 %]
<a href="show_bug.cgi?id=
[%- last_bug_list.$next_bug FILTER uri %]&amp;list_id=
[%- my_search.id FILTER uri %]">Следующая</a>
[% ELSE %]
<i><font color="#777777">Следующая</font></i>
[% END %]
&nbsp;&nbsp;<a href="buglist.cgi?regetlastlist=
[%- my_search.id FILTER uri %]">Показать результат последнего поиска</a>
[% ELSE %]
[%# With no list, don't show link to search results %]
<i><font color="#777777">Первая</font></i>
<i><font color="#777777">Последняя</font></i>
<i><font color="#777777">Предыдущая</font></i>
<i><font color="#777777">Следующая</font></i>
&nbsp;&nbsp;
<i><font color="#777777">Эта [% terms.bug %] не входит в результат
последнего поиска.</font></i>
[% END %]
</div>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# mailing_bugid: The bug ID that email is being sent for.
# sent_bugmail: The results of Bugzilla::BugMail::Send().
#%]
[% PROCESS global/variables.none.tmpl %]
<dl>
[% PROCESS emails
description = "Оповещение отправлено"
names = sent_bugmail.sent
%]
[% PROCESS emails
description = "Исключая"
names = sent_bugmail.excluded
%]
</dl>
[%############################################################################%]
[%# Block for a set of email addresses #%]
[%############################################################################%]
[% BLOCK emails %]
<dt>[% description FILTER html %]:</dt>
<dd>
[% IF user.can_see_bug(mailing_bugid) %]
[% IF names.size > 0 %]
[%+ FOREACH name = names %]
<code>[% name FILTER html %]</code>[% ", " UNLESS loop.last() %]
[% END %]
[% ELSE %]
никому
[% END %]
[% ELSE %]
(список получателей недоступен)
[% END %]
</dd>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# original_bug_id: number; the bug number for the bug
# against which a bug is being duped
# duplicate_bug_id: number; the bug number for the bug
# being duped
# cclist_accessible: boolean; whether or not users on the cc: list
# of the original bug can access that bug.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl title="Предупреждение о дублировании" %]
[% orig_bug = "$terms.bug $original_bug_id"
FILTER bug_link(original_bug_id) %]
<p>
При признании [% terms.bug_gen %] дубликатом существующей, ее инициатор
добавляется в число подписчиков оригинала. Настройки доступа к
оригиналу — [% terms.bug_dat %] [% orig_bug FILTER none %] — таковы,
что инициатор дубликата не имеет доступа к ней.
</p>
<p>
<b>Добавление инициатора в список подписчиков [% terms.bug_gen %]
[%+ orig_bug FILTER none %]
[% IF cclist_accessible %]
немедленно даст
[% ELSE %]
может в будущем дать
[% END %]
инициатору доступ к оригиналу.</b>
Продолжить регистрацию дубликата?
</p>
<form method="post" action="process_bug.cgi">
[% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
<p>
<input type="radio" name="confirm_add_duplicate" value="1">
Да, подписать инициатора на [% terms.bug_acc %] [%+ orig_bug FILTER none %]
</p>
<p>
<input type="radio" name="confirm_add_duplicate" value="0" checked="checked">
Нет, не подписывать инициатора на [% terms.bug_acc %] [%+ orig_bug FILTER none %]
</p>
<p>
[% "Отменить изменения и вернуться к $terms.bug_dat $duplicate_bug_id"
FILTER bug_link(duplicate_bug_id) FILTER none %]
</p>
<p>
<input type="submit" id="process" value="Сохранить">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# As global/header.html.tmpl.
#%]
[% PROCESS global/variables.none.tmpl %]
[% USE Bugzilla %]
[% PROCESS "bug/show-header.html.tmpl" %]
[% IF title_tag == "bug_processed" %]
[% title = BLOCK %]
[% IF Bugzilla.cgi.param('id') %]
[% terms.Bug %] [%+ id FILTER html %] обработана
[% ELSE %]
[% terms.Bugs %] обработаны
[% END %]
[% END %]
[% ELSIF title_tag == "mid_air" %]
[% title = "Обнаружен конфликт доступа!" %]
[% END %]
[% Hook.process('title') %]
[% PROCESS global/header.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# operations: array; bug activity since the user last displayed the bug form,
# used by bug/activity/table.html.tmpl to display recent changes that will
# be overwritten if the user submits these changes. See that template
# for further documentation.
# start_at: number; the comment at which show/comments.tmpl should begin
# displaying comments, either the index of the last comment (if the user
# entered a comment along with their change) or a number less than that
# (if they didn't), in which case no comments are displayed.
# comments: array; all the comments on the bug.
# bug: Bugzilla::Bug; the bug being changed.
#%]
[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/variables.none.tmpl %]
[% UNLESS header_done %]
[% PROCESS bug/process/header.html.tmpl %]
[% END %]
<h1>Обнаружен конфликт доступа!</h1>
<p>
Содержимое
[%+ "$terms.bug_gen $bug.id" FILTER bug_link(bug) FILTER none %]
изменено другим пользователем во время редактирования.
Сводка изменений:
</p>
<p>
[% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
</p>
[% IF comments.size > start_at %]
<p>
Добавлены комментарии:
<blockquote>
[% PROCESS "bug/comments.html.tmpl" %]
</blockquote>
</p>
[% END %]
[% IF cgi.param("comment") %]
<p>
Ваш комментарий:<br>
<blockquote><pre class="bz_comment_text">
[% cgi.param("comment") FILTER html %]
</pre></blockquote>
</p>
[% END %]
<p>
Возможные варианты:
</p>
<ul>
<li>
<form method="post" action="process_bug.cgi">
<input type="hidden" name="delta_ts"
value="[% bug.delta_ts FILTER html %]">
[% PROCESS "global/hidden-fields.html.tmpl"
exclude="^Bugzilla_login|Bugzilla_password|delta_ts$" %]
<input type="submit" id="process" value="Сохранить изменения">
Все перечисленные изменения будут потеряны
[% ", кроме добавленных комментариев" IF comments.size > start_at %].
</form>
</li>
[% IF cgi.param("comment") %]
<li>
<form method="post" action="process_bug.cgi">
<input type="hidden" name="id" value="[% cgi.param("id") FILTER html %]">
<input type="hidden" name="delta_ts" value="[% bug.delta_ts FILTER html %]">
<input type="hidden" name="comment" value="[% cgi.param("comment") FILTER html %]">
<input type="hidden" name="comment_is_private"
value="[% cgi.param("comment_is_private") FILTER html %]">
<input type="hidden" name="longdesclength" value="[% bug.comments.size %]">
<input type="hidden" name="token" value="[% cgi.param("token") FILTER html %]">
<input type="submit" id="process_comment" value="Сохранить только мой комментарий">
</form>
</li>
[% END %]
<li>
Отменить мои изменения,
[%+ "вернуться к $terms.bug_dat $bug.id" FILTER bug_link(bug) FILTER none %]
</li>
</ul>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# id: number; the ID of the bug that was changed/checked.
#
# type: string; the type of change/check that was made: "bug" when a bug
# is changed, "dupe" when a duplication notation is added to a bug,
# and "dep" when a bug is checked for changes to its dependencies.
#%]
[% PROCESS global/variables.none.tmpl %]
[% UNLESS header_done %]
[% PROCESS bug/process/header.html.tmpl %]
[% END %]
[% DEFAULT type="bug" %]
[% Link = BLOCK %][% "$terms.Bug $id" FILTER bug_link(id) %][% END %]
[% link = BLOCK %][% "$terms.bug_gen $id" FILTER bug_link(id) %][% END %]
[%
title = {
'bug' => "Изменения для $link сохранены" ,
'dupe' => "Зарегистрирован дубль для $link" ,
'dep' => "Корректировка зависимостей $link" ,
'created' => "$Link зарегистрирована в базе данных" ,
'move' => "$Link перемещена в другую базу данных" ,
}
%]
[% Hook.process('title') %]
<dl>
<dt>[% title.$type %]</dt>
<dd>
[% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = id %]
[%# Links to more information about the changed bug. %]
[% Hook.process("links") %]
</dd>
</dl>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object; the new product.
# versions: array; versions for the new product.
# components: array; components for the new product.
# milestones: array; milestones for the new product.
# defaults: hash; keys are names of fields, values are defaults for
# those fields
#
# verify_bug_groups: If groups need to be confirmed in addition to fields.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = 'Изменения при смене продукта...' %]
<form action="process_bug.cgi" method="post">
[% SET exclude_items = ['version', 'component', 'target_milestone'] %]
[% IF verify_bug_groups %]
[% exclude_items.push('groups', 'defined_groups') %]
[% END %]
[% Hook.process('exclude') %]
[% PROCESS "global/hidden-fields.html.tmpl"
exclude = '^' _ exclude_items.join('|') _ '$' %]
<input type="hidden" name="confirm_product_change" value="1">
[%# Verify the version, component, and target milestone fields. %]
<h3>Подтвердите версию, компонент
[%- ", план"
IF Param("usetargetmilestone")
&& bug.check_can_change_field('target_milestone', 0, 1) %]</h3>
<p>
[% IF Param("usetargetmilestone")
&& bug.check_can_change_field('target_milestone', 0, 1)
%]
Вы перемещаете [% terms.bug_acc %] в продукт
<b>[% product.name FILTER html %]</b>,
в результате версия, компонент и/или план должны быть приведены
в соответствие. Установите значения для нового продукта:
[% ELSE %]
Вы перемещаете [% terms.bug_acc %] в продукт
<b>[% product.name FILTER html %]</b>,
в результате версия и компонент должны быть приведены
в соответствие. Установите значения для нового продукта:
[% END %]
</p>
<table>
<tr>
<td>
<b>Версия:</b><br>
[% IF versions.size == 1 %]
[% SET default_version = versions.0 %]
[% ELSE %]
[% SET default_version = defaults.version %]
[% END %]
[% PROCESS "global/select-menu.html.tmpl"
name="version"
options=versions
default=default_version
size=10 %]
</td>
<td>
<b>Компонент:</b><br>
[% IF components.size == 1 %]
[% SET default_component = components.0 %]
[% ELSE %]
[% SET default_component = defaults.component %]
[% END %]
[% PROCESS "global/select-menu.html.tmpl"
name="component"
options=components
default=default_component
size=10 %]
</td>
[% IF Param("usetargetmilestone")
&& bug.check_can_change_field('target_milestone', 0, 1)
%]
<td>
<b>Запланировано:</b><br>
[% PROCESS "global/select-menu.html.tmpl"
name="target_milestone"
options=milestones
default=defaults.milestone
size=10 %]
</td>
[% END %]
[% Hook.process('field') %]
</tr>
</table>
[% IF verify_bug_groups %]
[% mandatory_groups = [] %]
[% optional_groups = [] %]
[% FOREACH gid = product.group_controls.keys %]
[% group = product.group_controls.$gid %]
[% NEXT UNLESS group.group.is_active %]
[% IF group.membercontrol == constants.CONTROLMAPMANDATORY
|| (group.othercontrol == constants.CONTROLMAPMANDATORY && !user.in_group(group.group.name)) %]
[% mandatory_groups.push(group) %]
[% ELSIF (group.membercontrol != constants.CONTROLMAPNA && user.in_group(group.group.name))
|| group.othercontrol != constants.CONTROLMAPNA %]
[% optional_groups.push(group) %]
[% END %]
[% END %]
[% IF old_groups.size || optional_groups.size || mandatory_groups.size %]
<h3>Подтвердите права доступа</h3>
[% END %]
[% IF old_groups.size %]
<p>Перечисленные группы недопустимы для продукта '[% product.name FILTER html %]'
или недостаточно прав доступа для назначения этих групп [% terms.bugs_acc -%].
Доступ к [%+ terms.bugs_dat %] не будет в дальнейшем ограничен этими группами, [%+ terms.bugs %]
могут стать общедоступными, если не будут указаны другие группы:
[% FOREACH group = old_groups %]
<input type="checkbox" id="group_[% group.id FILTER html %]"
name="groups" disabled="disabled" value="[% group.name FILTER html %]">
<label for="group_[% group.id FILTER html %]">
[% group.name FILTER html %]: [% group.description FILTER html %]
</label>
<br>
[% END %]
</p>
[% END %]
[% IF optional_groups.size %]
<p>Следующие группы не обязательны. Вы можете ограничить видимость [% terms.bugs_gen %]
членами следующих групп:<br>
[% IF multiple_bugs %]
<script type="text/javascript">
function turn_off(myself, id) {
var other_checkbox = document.getElementById(id);
if (myself.checked && other_checkbox) {
other_checkbox.checked = false;
}
}
</script>
<table border="1">
<tr>
<th>Удалить<br>[% terms.bugs_acc %]<br>из этой<br>группы</th>
<th>Добавить<br>[% terms.bugs_acc %]<br>в эту<br>группу</th>
<th>Имя группы:</th>
</tr>
[% FOREACH group = optional_groups %]
<tr>
<td align="center">
<input type="checkbox" name="defined_groups"
id="defined_group_[% group.group.id FILTER html %]"
value="[% group.group.name FILTER html %]"
[% IF cgi.param("defined_groups").contains(group.group.name) %] checked="checked"[% END %]
onchange="turn_off(this, 'group_[% group.group.id FILTER html %]')">
</td>
<td align="center">
<input type="checkbox" name="groups"
id="group_[% group.group.id FILTER html %]"
value="[% group.group.name FILTER html %]"
[% IF cgi.param("groups").contains(group.group.name) %] checked="checked"[% END %]
onchange="turn_off(this, 'defined_group_[% group.group.id FILTER html %]')">
</td>
<td>
[% group.group.description FILTER html %]
</td>
</tr>
[% END %]
</table>
[% ELSE %]
[% FOREACH group = optional_groups %]
<input type="hidden" name="defined_groups"
value="[% group.group.name FILTER html %]">
<input type="checkbox" id="group_[% group.group.id FILTER html %]"
name="groups"
[% ' checked="checked"' IF ((group.membercontrol == constants.CONTROLMAPDEFAULT && user.in_group(group.group.name))
|| (group.othercontrol == constants.CONTROLMAPDEFAULT && !user.in_group(group.group.name))
|| cgi.param("groups").contains(group.group.name)) %]
value="[% group.group.name FILTER html %]">
<label for="group_[% group.group.id FILTER html %]">
[% group.group.name FILTER html %]: [% group.group.description FILTER html %]
</label>
<br>
[% END %]
[% END %]
</p>
[% END %]
[% IF mandatory_groups.size %]
<p>Следующие группы обязательны. Видимость [% terms.bugs_gen %] автоматически
ограничена членами следующих групп:<br>
[% FOREACH group = mandatory_groups %]
<input type="checkbox" id="group_[% group.group.id FILTER html %]"
checked="checked" disabled="disabled"
name="groups" value="[% group.group.name FILTER html %]">
<label for="group_[% group.group.id FILTER html %]">
[% group.group.name FILTER html %]: [% group.group.description FILTER html %]
</label>
<br>
[% END %]
</p>
[% END %]
[% END %]
<input type="submit" id="change_product" value="Сохранить">
</form>
<hr>
[%# If 'id' is defined, then we are editing a single bug.
# Else we are editing several bugs at once. %]
[% IF cgi.param('id') AND cgi.param('id').match('^\d+$') %]
[% id = cgi.param('id') %]
Отменить и вернуться к [% "$terms.bug_dat $id" FILTER bug_link(id) FILTER none %]
[% ELSE %]
Отменить и вернуться к <a href="buglist.cgi?regetlastlist=1">результатам поиска</a>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# This template should be called with PROCESS before processing
# "global/header.html.tmpl" in any template that is going to load the
# bug form. It expects only a "bug" object, and can even manage to get
# along without that. Some of these variables are just defaults that will
# be overridden by the calling templates.
#%]
[% filtered_desc = bug.short_desc FILTER html %]
[% subheader = filtered_desc %]
[% filtered_timestamp = bug.delta_ts FILTER time %]
[% title = "$terms.Bug $bug.bug_id &ndash; $filtered_desc" %]
[% yui = ['autocomplete', 'calendar'] %]
[% javascript_urls = [ "js/util.js", "js/field.js" ] %]
[% IF bug.defined %]
[% header = "$terms.Bug&nbsp;$bug.bug_id" %]
[% header_addl_info = "Дата последней модификации: $filtered_timestamp" %]
[% unfiltered_title = "$terms.Bug $bug.bug_id – $bug.short_desc" %]
[% javascript = BLOCK %]
if (history && history.replaceState) {
if(!document.location.href.match(/show_bug\.cgi/)) {
history.replaceState( null,
"[% unfiltered_title FILTER js %]",
"show_bug.cgi?id=[% bug.bug_id FILTER js %]" );
document.title = "[% unfiltered_title FILTER js %]";
}
if (document.location.href.match(/show_bug\.cgi\?.*list_id=/)) {
var href = document.location.href;
href = href.replace(/[\?&]+list_id=(\d+|cookie)/, '');
history.replaceState(null, "[% unfiltered_title FILTER js %]", href);
}
}
YAHOO.util.Event.onDOMReady(function() {
initDirtyFieldTracking();
});
[% javascript FILTER none %]
[% END %]
[% END %]
[% style_urls = [ "skins/standard/show_bug.css" ] %]
[% doc_section = "bug_page.html" %]
[% bodyclasses = ['bz_bug',
"bz_status_$bug.bug_status",
"bz_product_$bug.product",
"bz_component_$bug.component",
"bz_bug_$bug.bug_id",
] %]
[% FOREACH group = bug.groups_in %]
[% bodyclasses.push("bz_group_$group.name") %]
[% END %]
[% Hook.process('end') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Подробный список $terms.bugs_gen"
h1 = ""
style_urls = ["skins/standard/show_multiple.css",
"skins/standard/buglist.css"]
doc_section = "bug_page.html"
%]
[% PROCESS bug/time.html.tmpl %]
[% IF bugs.first %]
[% ids = [] %]
[% FOREACH bug = bugs %]
[% PROCESS bug_display %]
[% ids.push(bug.bug_id) UNLESS bug.error %]
[% END %]
[% IF ids.size > 1 %]
<div class="bz_query_buttons">
<form method="post" action="buglist.cgi">
<input type="hidden" name="bug_id" value="[% ids.join(",") FILTER html %]">
<input type="submit" id="short_format" value="Сокращенный формат">
</form>
</div>
[% END %]
[% ELSE %]
<p>
Список ошибок пуст.
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%###########################################################################%]
[%# Block for an individual bug #%]
[%###########################################################################%]
[% BLOCK bug_display %]
<h1>
[% terms.Bug %]
<a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">[% bug.bug_id FILTER html %]</a>
[% IF bug.alias AND NOT bug.error %]
(<a href="show_bug.cgi?id=[% bug.alias FILTER uri %]">
[% bug.alias FILTER html %]</a>)
[% END %]
</h1>
<table class="bugfields">
[% IF bug.error %]
<tr>
<td class="error">
[% IF bug.error == "InvalidBugId" %]
'Недопустимый номер [% terms.bug_gen %]: [%+ bug.bug_id FILTER html %]'
[% terms.bug_gen %] с таким именем также не найдено.
[% ELSIF bug.error == "NotPermitted" %]
Недостаточно прав для просмотра [% terms.bug_gen %].
[% ELSIF bug.error == "NotFound" %]
[% terms.Bug %] не найдена.
[% ELSE %]
[%+ bug.error FILTER html %]
[% END %]
</td>
</tr>
[% ELSE %]
[%# The rightcell block (also called by the row block) automatically shows
# the fields from rightcells %]
[% rightcells = ['reporter', 'assigned_to'] %]
[% IF Param('useqacontact') %]
[% rightcells.push('qa_contact') %]
[% END %]
[% rightcells.push('') %]
[% IF bug.cc.size %]
[% rightcells.push('cc') %]
[% END %]
[% IF bug.keywords %]
[% rightcells.push('keywords') %]
[% END %]
[%# Determine if the bug has a flag %]
[% FOREACH type = bug.flag_types %]
[% IF type.flags.size %]
[% rightcells.push('flags') %]
[% LAST %]
[% END %]
[% END %]
[% PROCESS row cell = "short_desc" fullrow = 1 %]
<tr>
<th>[% field_descs.product FILTER html %]:</th>
<td>
[% IF Param("useclassification") && bug.classification_id != 1 %]
[[% bug.classification FILTER html %]]&nbsp;
[% END %]
[% bug.product FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
[% PROCESS row cell = "component" %]
<tr>
<th>[% field_descs.bug_status FILTER html %]:</th>
<td>
[% display_value("bug_status", bug.bug_status) FILTER html %]
[%+ display_value("resolution", bug.resolution) FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
<tr>
<th>[% field_descs.bug_severity FILTER html %]:</th>
<td class="bz_[% bug.bug_severity FILTER css_class_quote -%]">
[% display_value("bug_severity", bug.bug_severity) FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
<tr>
<th>[% field_descs.priority FILTER html %]:</th>
<td class="bz_[% bug.priority FILTER css_class_quote -%]">
[% bug.priority FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
[% PROCESS row cell = "version" %]
[% PROCESS row cell = "target_milestone" IF Param('usetargetmilestone') %]
[% PROCESS row cell = "rep_platform" %]
[% PROCESS row cell = "op_sys" %]
[% IF bug.bug_file_loc %]
<tr>
<th>[% field_descs.bug_file_loc FILTER html %]:</th>
<td colspan="3">
[% IF is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]">
[% bug.bug_file_loc FILTER html %]</a>
[% ELSE %]
[% bug.bug_file_loc FILTER html %]
[% END %]
</td>
</tr>
[% END %]
[% IF bug.see_also.size %]
<tr>
<th>[% field_descs.see_also FILTER html %]:</th>
<td colspan="3">
[% FOREACH see_also = bug.see_also %]
<a href="[% see_also.name FILTER html %]">[% see_also.name FILTER html %]</a>
[% "<br>" IF not loop.last() %]
[% END %]
</td>
</tr>
[% END %]
[% IF Param("usestatuswhiteboard") %]
[% PROCESS row cell = "status_whiteboard" fullrow = 1 %]
[% END %]
[% USE Bugzilla %]
[% field_counter = 0 %]
[% FOREACH field = Bugzilla.active_custom_fields %]
[% field_counter = field_counter + 1 %]
[%# Odd-numbered fields get an opening <tr> %]
[% '<tr>' IF field_counter % 2 %]
[% PROCESS bug/field.html.tmpl value=bug.${field.name} editable=0 %]
[%# Even-numbered fields get a closing <tr> %]
[% '</tr>' IF !(field_counter % 2) %]
[% IF extra_field_item %]
[% field_counter = field_counter + 1 %]
[% '<tr>' IF field_counter % 2 %]
<th>[% extra_field_item.header FILTER none %]</th>
<td>[% extra_field_item.data FILTER none %]</td>
[% '</tr>' IF !(field_counter % 2) %]
[% END %]
[% END %]
[%# And we have to finish the row if we ended on an odd number. %]
[% '<th></th><td></td></tr>' IF field_counter % 2 %]
[% IF (bug.dependson.size || bug.blocked.size) %]
[% PROCESS dependencies name = "dependson" %]
[% PROCESS dependencies name = "blocked" %]
[% END %]
[% IF user.is_timetracker %]
<tr>
<th>Учет времени:</th>
<td colspan="3">
<table class="timetracking">
<tr>
<th>[% field_descs.estimated_time FILTER html %]</th>
<th>[% field_descs.actual_time FILTER html %]</th>
<th>[% field_descs.work_time FILTER html %]</th>
<th>[% field_descs.remaining_time FILTER html %]</th>
<th>[% field_descs.percentage_complete FILTER html %]</th>
<th>Gain</th>
</tr>
<tr>
<td>
[% PROCESS formattimeunit time_unit = bug.estimated_time %]
</td>
<td>
[% PROCESS formattimeunit
time_unit=(bug.remaining_time + bug.actual_time) %]
</td>
<td>[% PROCESS formattimeunit time_unit = bug.actual_time %]</td>
<td>
[% PROCESS formattimeunit time_unit = bug.remaining_time %]
</td>
<td>
[% PROCESS calculatepercentage act = bug.actual_time
rem = bug.remaining_time %]
</td>
<td>
[% PROCESS formattimeunit
time_unit=bug.estimated_time -
(bug.actual_time + bug.remaining_time) %]
</td>
</tr>
</table>
</td>
</tr>
[% PROCESS row cell="deadline" %]
[% END %]
[% IF bug.attachments.size %]
<tr>
<th>Приложения:</th>
<td colspan="3">
[% IF bug.show_attachment_flags %]
<table>
<tr>
<th>Описание</th>
<th>Согласования</th>
</tr>
[% FOREACH attachment = bug.attachments %]
<tr>
<td>
<a href="attachment.cgi?id=[% attachment.id %]">
[% attachment.description FILTER html %]
</a>[% "<br>" IF not loop.last() %]
</td>
<td>
[% IF attachment.flags.size == 0 %]
<i>нет</i>
[% ELSE %]
[% FOREACH flag = attachment.flags %]
[% flag.setter.nick FILTER html %]:
[%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
[% IF flag.status == "?" && flag.requestee %]
([% flag.requestee.nick FILTER html %])
[% END %][% ", " IF not loop.last() %]
[% END %]
[% END %]
</td>
</tr>
[% END %]
</table>
[% ELSE %]
[% FOREACH attachment = bug.attachments %]
<a href="attachment.cgi?id=[% attachment.id %]">
[% attachment.description FILTER html %]
</a>[% "<br>" IF not loop.last() %]
[% END %]
[% END %]
</td>
</tr>
[% END %]
[% END %]
[% Hook.process("last_row", "bug/show-multiple.html.tmpl") %]
</table>
<br>
[% PROCESS bug/comments.html.tmpl
comments = bug.comments %]
[% END %]
[%###########################################################################%]
[%# Block for standard table rows #%]
[%###########################################################################%]
[% BLOCK row %]
<tr>
<th>[% field_descs.${cell} FILTER html %]:</th>
<td[% " colspan=3" IF fullrow %]>[% display_value(cell, bug.${cell}) FILTER html %]</td>
[% PROCESS rightcell IF !fullrow %]
</tr>
[% fullrow = 0 %]
[% END %]
[%############################################################################%]
[%# Block for dependencies #%]
[%############################################################################%]
[% BLOCK dependencies %]
<tr>
<th>[% terms.Bug %] [%+ field_descs.${name} FILTER html %]:</th>
<td>
[% FOREACH depbug = bug.${name} %]
[% depbug FILTER bug_link(depbug) FILTER none %][% ", " IF not loop.last() %]
[% END %]
</td>
[% PROCESS rightcell %]
</tr>
[% END %]
[%############################################################################%]
[%# Block for cells shown right of the table #%]
[%############################################################################%]
[% BLOCK rightcell %]
[% IF rightcells %]
[% name = rightcells.shift %]
[% IF name == "cc" %]
<th class="rightcell">[% field_descs.cc FILTER html %]:</th>
<td>
[% FOREACH c = bug.cc %]
[% c FILTER email FILTER html %][% ", " IF not loop.last() %]
[% END %]
[% ELSIF name == "reporter" || name == "assigned_to"
|| name == "qa_contact" %]
<th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
<td>[% bug.${name}.identity FILTER email FILTER html %]</td>
[% ELSIF name == "flags" %]
<th class="rightcell">Согласования:</th>
<td>
[% FOREACH type = bug.flag_types %]
[% FOREACH flag = type.flags %]
[% flag.setter.nick FILTER html %]:
[%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
[%+ IF flag.status == "?" && flag.requestee %]
([% flag.requestee.nick FILTER html %])
[% END %]<br>
[% END %]
[% END %]
</td>
[% ELSIF name != "" %]
<th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
<td>[% display_value(name, bug.${name}) FILTER html %]</td>
[% ELSE %]
<td>&nbsp;</td>
<td>&nbsp;</td>
[% END %]
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[%# This script/template only handles one bug #%]
[% bug = bugs.0 %]
[% IF !header_done %]
[% PROCESS "bug/show-header.html.tmpl" %]
[% PROCESS global/header.html.tmpl %]
[% END %]
[% IF nextbug %]
<hr>
<p>
Следующая [% terms.bug %] в списке
<a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>:
</p>
<hr>
[% END %]
[% PROCESS bug/navigate.html.tmpl %]
[% PROCESS bug/edit.html.tmpl %]
<hr>
[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1%]
<br>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% title = "Анализ затрат времени " %]
[% IF do_depends %]
[% title = title _ "для " %]
[% header = "$terms.bug_gen $ids.0" FILTER bug_link(ids.0) FILTER none %]
[% header = title _ header _ " ( и ${terms.bugs_gen}, блокирующих ее)" %]
[% title = title _ "$terms.bug_gen $ids.0: " %]
[% ELSE %]
[% title = title _ numeral(ids.size,
"(выбрана ${ids.size} ${terms.bug})",
"(выбрано ${ids.size} ${terms.bug_gen})",
"(выбрано ${ids.size} ${terms.bugs_gen})") %]
[% header = title %]
[% END %]
[% PROCESS global/header.html.tmpl
title = title
header = header
style_urls = ["skins/standard/summarize-time.css"]
doc_section = "timetracking.html"
yui = ['calendar']
javascript_urls = [ "js/util.js", "js/field.js" ]
%]
[% INCLUDE query_form %]
[% IF do_report %]
[% global.grand_total = 0 global.estimated = 0 global.remaining = 0 %]
[% FOREACH workdata = part_list %]
[%# parts contains date ranges (from, to). %]
[% part = parts.shift %]
<div align="right">
<h4 style="padding-right: 2em; margin: 0;">
[% IF part.0 or part.1 %]
С [% part.0 OR "начала" FILTER html %] по [% part.1 OR "настоящее время" FILTER html %]
[% ELSE %]
Полный анализ (период не указан)
[% END %]
</h4>
</div>
[% IF group_by == "number" %]
[% INCLUDE number_report %]
[% ELSE %]
[% INCLUDE owner_report %]
[% END %]
[% END %]
[% IF detailed %]
<h4 style="margin: 0">
От первоначальной оценки в [% global.estimated FILTER format("%.2f") %]ч
осталось [% global.remaining FILTER format("%.2f") %]ч
[% IF global.deadline %]
(срок [% global.deadline FILTER html %])
[% END %]
</h4>
[% END %]
[% IF monthly %]
<h4 style="margin: 0">Итого отработано [% global.grand_total FILTER format("%.2f") %] часов</h4>
<hr noshade size="1">
[% END %]
[% IF null.size > 0 %]
[% INCLUDE inactive_report %]
<h4 style="margin: 0">Итого [% null.size %] [% terms.bugs_gen %] неактивно</h4>
[% END %]
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%#
#
# Developer reporting
#
#%]
[% BLOCK owner_report %]
[% global.total = 0 global.bug_count = {} global.owner_count = {} %]
<table cellpadding="4" cellspacing="0" width="90%" class="realitems owner">
[% FOREACH owner = workdata.keys.sort %]
[% INCLUDE do_one_owner owner=owner ownerdata=workdata.$owner
detailed=detailed %]
[% END %]
[% additional = "$global.owner_count.size developers @
$global.bug_count.size $terms.bugs" %]
[% INCLUDE section_total colspan=3 additional=additional %]
</table>
[% END %]
[% BLOCK do_one_owner %]
[% global.owner_count.$owner = 1 %]
<tr><td colspan="5" class="owner_header">
<b>[% owner FILTER html %]</b>
</td></tr>
[% col = 0 subtotal = 0%]
[% FOREACH bugdata=ownerdata.nsort("bug_id") %]
[% bug_id = bugdata.bug_id %]
[% INCLUDE calc_bug_total id=bug_id %]
[% global.bug_count.$bug_id = 1 %]
[% IF detailed %]
[% INCLUDE bug_header cid=col id=bug_id bugdata=bugdata extra=1 %]
[% col = col + 1 %]
[% END %]
[% subtotal = subtotal + bugdata.total_time %]
[% END %]
<tr>
<td colspan="4" align="right"><b>Итого</b>:</td>
<td align="right" class="subtotal" width="100">
<b>[% subtotal FILTER format("%.2f") %]</b></td>
[% global.total = global.total + subtotal %]
</tr>
[% END %]
[%#
#
# Bug Number reporting
#
#%]
[% BLOCK number_report %]
[% global.total = 0 global.owner_count = {} global.bug_count = {} %]
<table cellpadding="4" cellspacing="0" width="90%" class="realitems number">
[% FOREACH bug = workdata.keys.nsort %]
[% INCLUDE do_one_bug id=bug bugdata=workdata.$bug
detailed=detailed %]
[% END %]
[% additional = "$global.bug_count.size $terms.bugs &
$global.owner_count.size developers" %]
[% INCLUDE section_total additional=additional colspan=2 %]
</table>
[% END %]
[% BLOCK do_one_bug %]
[% subtotal = 0.00 cid = 0 %]
[% INCLUDE calc_bug_total id=id %]
[% global.bug_count.$id = 1 %]
[% INCLUDE bug_header id=id %]
[% FOREACH owner = bugdata.sort("login_name") %]
[% work_time = owner.total_time %]
[% subtotal = subtotal + work_time %]
[% login_name = owner.login_name %]
[% global.owner_count.$login_name = 1 %]
[% IF detailed %]
[% cid = cid + 1 %]
<tr class="owner_header[% 2 FILTER none IF cid % 2 %]">
<td>&nbsp;</td>
<td colspan="2"><b>[% login_name FILTER html %]</b></td>
<td align="right">
[% work_time FILTER format("%.2f") %]</td>
</tr>
[% END %]
[% END %]
<tr>
<td colspan="2">&nbsp;</td>
<td align="right">
<b>Итого</b>:
</td>
<td align="right" class="subtotal" width="100">
<b>[% subtotal FILTER format("%.2f") %]</b>
</td>
</tr>
[% global.total = global.total + subtotal %]
[% END %]
[% BLOCK bug_header %]
<tr class="bug_header[% '2' IF cid % 2 %]">
<td width="80" valign="top">
<b>[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</b>
</td>
<td width="100"><b>[% display_value("bug_status", bugs.$id.bug_status) FILTER html %]</b></td>
<td colspan="2">[% bugs.$id.short_desc FILTER html %]</td>
[% IF extra %]
<td align="right" valign="top">[% bugdata.total_time FILTER html %]</td>
[% END %]
</tr>
[% IF detailed %]
<tr class="bug_header[% '2' IF cid % 2 %]">
<td>&nbsp;</td>
<td colspan="3">
<table width="100%" cellpadding="0" cellspacing="0">
<tr>
<td width="33%">
Первоначальная оценка: [% bugs.$id.estimated_time FILTER format("%.2f") %]ч
</td>
<td width="33%">
Осталось: [% bugs.$id.remaining_time FILTER format("%.2f") %]ч
</td>
<td width="33%">
Срок: [% bugs.$id.deadline || "<b>Не установлен</b>" %]
</td>
</tr>
</table>
</td>
[% IF extra %]
<td>&nbsp;</td>
[% END %]
</tr>
[% END %]
[% END %]
[% BLOCK calc_bug_total %]
[% IF !global.bug_count.$id %]
[% global.estimated = global.estimated + bugs.$id.estimated_time %]
[% global.remaining = global.remaining + bugs.$id.remaining_time %]
[% IF !global.deadline || bugs.$id.deadline &&
global.deadline.replace("-", "") < bugs.$id.deadline.replace("-", "") %]
[% SET global.deadline = bugs.$id.deadline %]
[% END %]
[% END %]
[% END %]
[% BLOCK inactive_report %]
<h3>Неактивные [% terms.bugs %]</h3>
<table cellpadding="4" cellspacing="0" width="90%" class="zeroitems">
[% cid = 0 %]
[% FOREACH bug_id = null.nsort %]
[% INCLUDE bug_header id=bug_id cid=cid %]
[% cid = cid + 1 %]
[% END %]
</table>
[% END %]
[% BLOCK section_total %]
[% IF global.total > 0 %]
<tr class="section_total">
<td><b>Totals</b></td>
<td colspan="[% colspan FILTER html %]" align="right"><b>[% additional FILTER html %]</b></td>
<td align="right"><b>[% global.total FILTER format("%.2f") %]</b></td>
</tr>
[% ELSE %]
<tr>
<td>Затрат времени в течение указанного периода не было.</td>
</tr>
[% END %]
[% global.grand_total = global.grand_total + global.total %]
[% END %]
[%#
#
# The query form
#
#%]
[% BLOCK query_form %]
<hr noshade size=1>
<form method="post" name="summary" style="display: inline" action="summarize_time.cgi">
<input type="hidden" name="do_depends" value="[% do_depends FILTER html %]">
<input type="hidden" name="id" value="[% ids.join(",") FILTER html %]">
<input type="hidden" name="do_report" value="1">
[% IF warn_swap_dates %]
<h4 style="border: 1px solid red; margin: 1em; padding: 0.5em">The
end date specified occurs before the start date, which doesn't
make sense; the dates below have therefore been swapped.</h4>
[% END %]
<table>
<tr>
<td align="right">
<b><label accesskey="s"
for="start_date">Период с</label></b>:
</td><td colspan="3">
<input type="text" id="start_date" name="start_date" size="11"
align="right" value="[% start_date FILTER html %]" maxlength="10"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_start_date"
onclick="showCalendar('start_date')"><span>Календарь</span>
</button>
<div id="con_calendar_start_date"></div>
&nbsp;
<b>and <label accesskey="e" for="end_date">по</label></b>:
<input type="text" name="end_date" size="11" id="end_date"
align="right" value ="[% end_date FILTER html %]" maxlength="10"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_end_date"
onclick="showCalendar('end_date')"><span>Календарь</span>
</button>
<div id="con_calendar_end_date"></div>
</td><td align="right">
<input type="submit" id="summarize" value="Анализировать">
</td></tr>
<tr>
<td>&nbsp;</td><td colspan="4">
<small>(Указание дат не обязательно, формат ГГГГ-ММ-ДД)</small>
</td>
<tr><td align="right">
<b>Группировать по</b>:
</td><td colspan="2">
<input type="radio" name="group_by" id="number" value="number" [%+
'checked="checked"' IF group_by == "number"
%]><label
for="number" accesskey="n">Номеру [% terms.bug_gen %]</label>
<input type="radio" name="group_by" id="owner" value="owner" [%+
'checked="checked"' IF group_by == "owner"
%]><label
for="owner" accesskey="d">Исполнителю</label>
</td><td colspan="2">
<label for="ctype"><b>Формат</b></label>: <select name="ctype" id="ctype">
<option value="html">HTML</option>
</select>
</td></tr><tr>
<td>&nbsp;</td><td colspan="4">
<input type="checkbox" name="monthly" [% 'checked="checked"' IF
monthly %] id="monthly">
<label for="monthly" accesskey="m">По месяцам</label>
[%# XXX: allow splitting by other intervals %]
&nbsp;
<input type="checkbox" name="detailed" [% 'checked="checked"' IF
detailed %] id="detailed">
<label for="detailed" accesskey="t">Подробно</label>
&nbsp;
<input type="checkbox" name="inactive" [% 'checked="checked"' IF
inactive %] id="inactive">
<label for="inactive" accesskey="i">С учетом неактивных
[%+ terms.bugs_gen %]</label>
</td>
</tr></table>
</form>
<script type="text/javascript">
<!--
[%+ PROCESS "global/calendar.js.tmpl" id = 'start_date' %]
[% PROCESS "global/calendar.js.tmpl" id = 'end_date' %]
document.forms['summary'].start_date.focus();
//--></script>
<hr noshade size=1>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% Param('maintainer') %]
Subject: [[% terms.Bugzilla %]] Учётная запись заблокирована: [% locked_user.login %] ([% address %])
X-Bugzilla-Type: admin
С адреса [% address %] было произведено слишком много неудачных попыток входа (
[%- constants.MAX_LOGIN_ATTEMPTS +%]) в
учётную запись [% locked_user.login %].
Попытки входа были произведены в следующее время:
[% FOREACH login = attempts %]
[%+ login.login_time FILTER time %]
[% END %]
Этот IP сможет снова войти в эту учётную запись в
[%+ unlock_at FILTER time %].
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/variables.none.tmpl" %]
From: [% Param('mailfrom') %]
To: [% addressee %]
Subject: [[% terms.Bugzilla %]] Результаты проверки целостности
X-Bugzilla-Type: sanitycheck
[%+ urlbase %]sanitycheck.cgi
Протокол проверки целостности.
[% IF error_found %]
Обнаружены ошибки.
[% ELSE %]
Ошибок не обнаружено.
[% END %]
[% output %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
From: [% Param('mailfrom') %]
To: [% user.email %]
Subject: [[% terms.Bugzilla %]] Your account [% user.login -%]
is being impersonated
X-Bugzilla-Type: admin
[%+ sudoer.identity %] использовал доступ в
[%+ terms.Bugzilla %] от вашего имени.
[% IF reason %]
[%+ sudoer.identity %] указал следующую причину обращения:
[% reason FILTER wrap_comment %]
[% ELSE %]
[%+ sudoer.identity %] не указал причины обращения.
[% END %]
Если вы считаете это неправильным, обратитесь к
[%+ Param("maintainer") %]. Более подробно эта возможность описана
здесь: <[% urlbase %]page.cgi?id=sudo.html>.
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
From: [% Param("mailfrom") %]
To: [% email %][% Param("emailsuffix") %]
Subject: Изменения в Вашем списке [% terms.bugs_gen %] [%+ terms.Bugzilla %].
X-Bugzilla-Type: whine
[Данное сообщение сгенерировано автоматически.]
Вам назначены [% terms.bugs %] в системе отслеживания [% terms.bugs_gen %] [% terms.Bugzilla %]
([% urlbase %]), и они требуют Вашего внимания.
Все эти [% terms.bugs %] находятся в состоянии '[% display_value("bug_status", "CONFIRMED") %]',
и на них не было реакции в течение [% Param("whinedays") %] дней и более.
Вам следует изучить их и принять первоначальное решение.
Как правило, это один из четырёх вариантов:
(1) Вы считаете, что решение очевидно (например, [% display_value("resolution", "INVALID") %]),
и закрываете вопрос немедленно.
(2) Вы считаете, что [% terms.bug %] не принадлежит Вам и переадресуете ее другому
исполнителю. (Если неясно, кому следует ее переназначить, уточните значение
поля Компонент и используйте команду "Переадресовать ответственному за компонент".)
(3) Вы считаете, что [% terms.bug %] принадлежит Вам, но не можете решить ее немедленно.
В этому случает возьмите на себя [% terms.bug_acc %], установив его статус
в [% display_value("bug_status", "IN_PROGRESS") %].
(4) Вы считаете, что [% terms.bug %] принадлежит Вам, но не можете решить её не
В этому случае отложите [% terms.bug_acc %], установив статус немедленно.
в [% display_value("bug_status", "DEFERRED") %].
Используйте список всех [%+ terms.bugs_gen %] в состоянии [% display_value("bug_status", "CONFIRMED") %],
(при необходимости создайте закладку):
[% urlbase %]buglist.cgi?bug_status=CONFIRMED&assigned_to=[% email %]
Также используйте форму поиска:
[%+ urlbase %]query.cgi
Ниже приведены ссылки на все Ваши [%+ terms.bugs %] в состоянии '[% display_value("bug_status", "CONFIRMED") %]',
на которые нет реакции в течение [% Param("whinedays") %] дней и более.
Данное сообщение генерируется автоматически один раз в день до изменения состояния всех
перечисленных [% terms.bugs_gen %]!
[% FOREACH bug = bugs %]
[%+ bug.summary %]
-> [% urlbase %]show_bug.cgi?id=[% bug.id %]
[% END %]
<link rel="stylesheet" type="text/css" href="js/etersoft/timersplash.css" />
<div style="display: none;" id="useremail" class="[% user.email FILTER html %]"></div>
<div style="display: none;" id="assigntoemail" class="[% bug.assigned_to.email FILTER html %]"></div>
<!-- Таймер -->
<div id="timerblock" title="Время на странице">
<img src="js/etersoft/control_pause.gif" id="timer_pause" onclick="controlTimer()" title="Пауза" />
<img src="js/etersoft/control_right.gif" id="timer_play" onclick="controlTimer()" title="Продолжить" />
<img src="js/etersoft/control_stop.gif" id="timer_stop" onclick="if (confirm('Вы точно хотите сбросить таймер?')) {resetTimer();}" title="Сбросить таймер" />
<input type="text" size="10" title="Время на странице" id='timespent' name="timespent" value="" readonly="readonly">
</div>
<!-- Сохранение времени -->
<div id="timeQuestionDiv">
<strong>Укажите отработанное время</strong>
<div name="worktimediv">
<nobr>Отработанное время (в минутах):
<input type="text" id='realworktime' name="realworktime" onchange='update_remain();' onkeydown="javascript:if(13==event.keyCode){premysubmit(-1); return false;}; if(27==event.keyCode){getElementById('timeQuestionDiv').style.display = 'none'; return false;}" />
<a onclick="premysubmit(-1);">Сохранить</a></p>
</nobr>
<div id='id_remain_time' class='div_hide'>Оставшееся время (в часах):
<input type="text" id="realremaintime" name="realremaintime" onchange='changed_remain = 1; update_remain();' onkeydown="javascript:if(13==event.keyCode){return false;}" />
</div>
<div id='message' class='div_hide'>
<p>Отслеживайте корректность оставшегося времени.</p>
</div>
<div id='message_warning' class='div_hide' color='red'>
<p>Внимание! Оставшееся время равно 0.<br>Если задача ещё не решена, то укажите необходимое для её решения время.</p>
</div>
</div>
<div>
<p><a onclick="premysubmit(-1);">Сохранить значение из поля</a></p>
<p><a onclick="premysubmit(5);">Сохранить 5 минут</a></p>
<p><a onclick="premysubmit(15);">Сохранить 15 минут</a></p>
<p><a onclick="premysubmit(30);">Сохранить 30 минут</a></p>
<p><a onclick="closeDiv();">Закрыть</a></p>
</div>
</div>
<script language="javascript" type="text/javascript" src="js/etersoft/timer.js"></script>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
Хуки шаблонов размещаются в этом каталоге. Хуки шаблонов вызываются в обычных шаблонах
[%+ terms.Bugzilla %] как [[% '%' %] Hook.process('some-hook') %].
Более подробную информацию о них можно найти в документации на
B[% %]ugzilla::Extension. (Выполните "perldoc B[% %]ugzilla::Extension" из главного
каталога [%+ terms.Bugzilla %] чтобы увидеть эту документацию.)
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
Обычные шаблоны размещаются в этом каталоге. Вы можете загружать их в
свой код следующим образом:
use B[% %]ugzilla::Error;
my $template = B[% %]ugzilla->template;
$template->process('[% name FILTER lower %]/ваш-шаблон.html.tmpl')
or ThrowTemplateError($template->error());
Это приведёт к загрузке файла с именем <kbd>ваш-шаблон.html.tmpl</kbd>, который
был размещён в этом каталоге.
Примите во внимание, что вы должны убедиться, что полный путь вашего шаблона
никогда не должен конфликтовать с шаблоном существующим в [% terms.Bugzilla %]
или в другом расширении, или ваш шаблон может нарушить работу того шаблона.
Вот почему мы создали для вас этот каталог называемый '[% name FILTER lower %]',
чтобы вы могли положить сюда ваши шаблоны и избежать конфликтов.
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
Файлы, доступные из Интернет, типа файлов JavaScript, CSS и изображений
размещаются в этом каталоге. Вы можете ссылаться на них напрямую в вашем HTML.
Например, если у вас есть файл с именем "style.css" и ваше расширение называется
"Foo", вы можете поместить его в "extensions/Foo/web/style.css", и сослаться на
него в HTML как:
<link href="extensions/Foo/web/style.css" rel="stylesheet" type="text/css">
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
# Important! The following classes of directives are excluded in the test,
# and so do not need to be added here. Doing so will cause warnings.
# See 008filter.t for more details.
#
# Comments - [%#...
# Directives - [% IF|ELSE|UNLESS|FOREACH...
# Assignments - [% foo = ...
# Simple literals - [% " selected" ...
# Values always used for numbers - [% (i|j|k|n|count) %]
# Params - [% Param(...
# Safe functions - [% (time2str)...
# Safe vmethods - [% foo.size %] [% foo.length %]
# [% foo.push() %]
# TT loop variables - [% loop.count %]
# Already-filtered stuff - [% wibble FILTER html %]
# where the filter is one of html|csv|js|quoteUrls|time|uri|xml|none
%::safe = (
'whine/schedule.html.tmpl' => [
'event.key',
'query.id',
'query.sort',
'schedule.id',
'option.0',
'option.1',
],
'whine/mail.html.tmpl' => [
'bug.bug_id',
],
'flag/list.html.tmpl' => [
'flag.status',
'type.id',
],
'search/form.html.tmpl' => [
'qv.name',
'qv.description',
],
'search/search-specific.html.tmpl' => [
'status.name',
],
'search/tabs.html.tmpl' => [
'content',
],
'request/queue.html.tmpl' => [
'column_headers.$group_field',
'column_headers.$column',
'request.status',
'request.bug_id',
'request.attach_id',
],
'reports/keywords.html.tmpl' => [
'keyword.bug_count',
],
'reports/report-table.csv.tmpl' => [
'data.$tbl.$col.$row',
'colsepchar',
],
'reports/report-table.html.tmpl' => [
'"&amp;$col_vals" IF col_vals',
'"&amp;$row_vals" IF row_vals',
'classes.$row_idx.$col_idx',
'urlbase',
'data.$tbl.$col.$row',
'row_total',
'col_totals.$col',
'grand_total',
],
'reports/report.html.tmpl' => [
'width',
'height',
'imageurl',
'formaturl',
'other_format.name',
'switchbase',
'cumulate',
],
'reports/chart.html.tmpl' => [
'width',
'height',
'imageurl',
'sizeurl',
'height + 100',
'height - 100',
'width + 100',
'width - 100',
],
'reports/series-common.html.tmpl' => [
'sel.name',
'"onchange=\"$sel.onchange\"" IF sel.onchange',
],
'reports/chart.csv.tmpl' => [
'data.$j.$i',
'colsepchar',
],
'reports/create-chart.html.tmpl' => [
'series.series_id',
'newidx',
],
'reports/edit-series.html.tmpl' => [
'default.series_id',
],
'list/edit-multiple.html.tmpl' => [
'group.id',
'menuname',
],
'list/list.rdf.tmpl' => [
'template_version',
'bug.bug_id',
'column',
],
'list/table.html.tmpl' => [
'tableheader',
'bug.bug_id',
],
'list/list.csv.tmpl' => [
'bug.bug_id',
'colsepchar',
],
'list/list.js.tmpl' => [
'bug.bug_id',
],
'global/choose-product.html.tmpl' => [
'target',
],
# You are not permitted to add any values here. Everything in this file should
# be filtered unless there's an extremely good reason why not, in which case,
# use the "none" dummy filter.
'global/code-error.html.tmpl' => [
],
'global/header.html.tmpl' => [
'javascript',
'style',
'onload',
'title',
'" &ndash; $header" IF header',
'subheader',
'header_addl_info',
'message',
],
'global/messages.html.tmpl' => [
'message_tag',
'series.frequency * 2',
],
'global/select-menu.html.tmpl' => [
'options',
'size',
],
'global/tabs.html.tmpl' => [
'content',
],
# You are not permitted to add any values here. Everything in this file should
# be filtered unless there's an extremely good reason why not, in which case,
# use the "none" dummy filter.
'global/user-error.html.tmpl' => [
],
'global/variables.none.tmpl' => [
'name1',
'name2',
'name5',
],
'global/confirm-user-match.html.tmpl' => [
'script',
],
'global/site-navigation.html.tmpl' => [
'bug.bug_id',
],
'bug/comments.html.tmpl' => [
'comment.id',
'comment.count',
'bug.bug_id',
],
'bug/dependency-graph.html.tmpl' => [
'image_map', # We need to continue to make sure this is safe in the CGI
'image_url',
'map_url',
'bug_id',
],
'bug/dependency-tree.html.tmpl' => [
'bugid',
'maxdepth',
'hide_resolved',
'ids.join(",")',
'maxdepth + 1',
'maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""',
'maxdepth == 1 ? 1
: ( maxdepth ? maxdepth - 1 : realdepth - 1 )',
],
'bug/edit.html.tmpl' => [
'bug.remaining_time',
'bug.delta_ts',
'bug.bug_id',
'group.bit',
'selname',
'inputname',
'" colspan=\"$colspan\"" IF colspan',
'" size=\"$size\"" IF size',
'" maxlength=\"$maxlength\"" IF maxlength',
'" spellcheck=\"$spellcheck\"" IF spellcheck',
],
'bug/show-multiple.html.tmpl' => [
'attachment.id',
'flag.status',
],
'bug/show.html.tmpl' => [
'bug.bug_id',
],
'bug/show.xml.tmpl' => [
'constants.BUGZILLA_VERSION',
'a.id',
'field',
],
'bug/summarize-time.html.tmpl' => [
'global.grand_total FILTER format("%.2f")',
'subtotal FILTER format("%.2f")',
'work_time FILTER format("%.2f")',
'global.total FILTER format("%.2f")',
'global.remaining FILTER format("%.2f")',
'global.estimated FILTER format("%.2f")',
'bugs.$id.remaining_time FILTER format("%.2f")',
'bugs.$id.estimated_time FILTER format("%.2f")',
],
'bug/time.html.tmpl' => [
'time_unit FILTER format(\'%.1f\')',
'time_unit FILTER format(\'%.2f\')',
'(act / (act + rem)) * 100
FILTER format("%d")',
],
'bug/process/results.html.tmpl' => [
'title.$type',
'"$terms.Bug $id" FILTER bug_link(id)',
'"$terms.bug_gen $id" FILTER bug_link(id)',
],
'bug/create/create.html.tmpl' => [
'cloned_bug_id',
],
'bug/create/create-guided.html.tmpl' => [
'tablecolour',
'sel',
'productstring',
],
'bug/activity/table.html.tmpl' => [
'change.attachid',
],
'attachment/create.html.tmpl' => [
'bug.bug_id',
'attachment.id',
],
'attachment/created.html.tmpl' => [
'attachment.id',
'attachment.bug_id',
],
'attachment/edit.html.tmpl' => [
'attachment.id',
'attachment.bug_id',
'editable_or_hide',
],
'attachment/list.html.tmpl' => [
'attachment.id',
'flag.status',
'bugid',
'obsolete_attachments',
],
'attachment/midair.html.tmpl' => [
'attachment.id',
],
'attachment/show-multiple.html.tmpl' => [
'a.id',
'flag.status'
],
'attachment/updated.html.tmpl' => [
'attachment.id',
],
'attachment/diff-header.html.tmpl' => [
'attachid',
'id',
'bugid',
'oldid',
'newid',
'patch.id',
],
'attachment/diff-file.html.tmpl' => [
'lxr_prefix',
'file.minus_lines',
'file.plus_lines',
'bonsai_prefix',
'section.old_start',
'section_num',
'current_line_old',
'current_line_new',
],
'admin/admin.html.tmpl' => [
'class'
],
'admin/table.html.tmpl' => [
'contentlink'
],
'admin/custom_fields/cf-js.js.tmpl' => [
'constants.FIELD_TYPE_SINGLE_SELECT',
'constants.FIELD_TYPE_MULTI_SELECT',
'constants.FIELD_TYPE_BUG_ID',
],
'admin/params/common.html.tmpl' => [
'sortlist_separator',
],
'admin/products/groupcontrol/confirm-edit.html.tmpl' => [
'group.count',
],
'admin/products/groupcontrol/edit.html.tmpl' => [
'group.id',
'constants.CONTROLMAPNA',
'constants.CONTROLMAPSHOWN',
'constants.CONTROLMAPDEFAULT',
'constants.CONTROLMAPMANDATORY',
],
'admin/products/list.html.tmpl' => [
'classification_url_part',
],
'admin/products/footer.html.tmpl' => [
'classification_url_part',
'classification_text',
],
'admin/flag-type/confirm-delete.html.tmpl' => [
'flag_type.flag_count',
'flag_type.id',
],
'admin/flag-type/edit.html.tmpl' => [
'selname',
],
'admin/flag-type/list.html.tmpl' => [
'type.id',
],
'admin/components/confirm-delete.html.tmpl' => [
'comp.bug_count'
],
'admin/groups/delete.html.tmpl' => [
'shared_queries'
],
'admin/users/confirm-delete.html.tmpl' => [
'attachments',
'reporter',
'assignee_or_qa',
'cc',
'component_cc',
'flags.requestee',
'flags.setter',
'longdescs',
'quips',
'series',
'watch.watched',
'watch.watcher',
'whine_events',
'whine_schedules',
'otheruser.id'
],
'admin/users/edit.html.tmpl' => [
'otheruser.id',
'group.id',
],
'admin/components/edit.html.tmpl' => [
'comp.bug_count'
],
'admin/workflow/edit.html.tmpl' => [
'status.id',
'new_status.id',
],
'admin/workflow/comment.html.tmpl' => [
'status.id',
'new_status.id',
],
'account/auth/login-small.html.tmpl' => [
'qs_suffix',
],
'account/prefs/email.html.tmpl' => [
'relationship.id',
'event.id',
'prefname',
],
'account/prefs/prefs.html.tmpl' => [
'current_tab.label',
'current_tab.name',
],
'account/prefs/saved-searches.html.tmpl' => [
'group.id',
],
'config.rdf.tmpl' => [
'escaped_urlbase',
],
);
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% IF user.id && !read_only_flags && (!bug || bug.check_can_change_field('flagtypes.name', 0, 1)) %]
[%# We list flags by looping twice over the flag types relevant for the bug.
# In the first loop, we display existing flags and then, for active types,
# we display UI for adding new flags. In the second loop, we display UI
# for adding additional new flags for those types for which a flag already
# exists but which are multiplicable (can have multiple flags of the type
# on a single bug/attachment).
#%]
[% DEFAULT flag_table_id = "flags" %]
<script src="[% 'js/flag.js' FILTER mtime %]" type="text/javascript"></script>
<table id="[% flag_table_id FILTER html %]">
[% UNLESS flag_no_header %]
<tr>
<th colspan="3">
Вид согласования:
</th>
[% IF any_flags_requesteeble %]
<th>
Адресат:
</th>
[% END %]
</tr>
[% END %]
[%# Step 1: Display every flag type (except inactive types with no flags). %]
[% FOREACH type = flag_types -%]
[%-# Step 1a: Display existing flag(s). %]
[% FOREACH flag = type.flags %]
[% PROCESS flag_row flag = flag type = type %]
[% END -%]
[% SET flag = "" %]
[%-# Step 1b: Display UI for setting flag. %]
[% IF (!type.flags || type.flags.size == 0) && type.is_active %]
[% PROCESS flag_row type = type %]
[% END %]
[% END %]
[%# Step 2: Display flag type again (if type is multiplicable). %]
[% FOREACH type = flag_types %]
[% NEXT UNLESS type.flags && type.flags.size > 0 && type.is_multiplicable && type.is_active %]
[% IF !separator_displayed %]
<tbody class="bz_flag_type">
<tr><td colspan="3"><hr></td></tr>
</tbody>
[% separator_displayed = 1 %]
[% END %]
[% PROCESS flag_row type = type addl_text = "Доп." %]
[% END %]
</table>
[% ELSE %]
[%# The user is logged out. Display flags as read-only. %]
[% header_displayed = 0 %]
[% FOREACH type = flag_types %]
[% FOREACH flag = type.flags %]
[% IF !flag_no_header AND !header_displayed %]
<p><b>Вид согласования:</b></p>
[% header_displayed = 1 %]
[% END %]
[% IF flag.setter.name %]
<span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
[% ELSE %]
[% flag.setter.nick FILTER html %]:
[% END %]
[%+ type.name FILTER html FILTER no_break %][% flag.status %]
[% IF flag.requestee %]
[% IF flag.requestee.name %]
(<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>)
[% ELSE %]
([% flag.requestee.nick FILTER html %])
[% END %]
[% END %]<br>
[% END %]
[% END %]
[% END %]
[%# Display a table row for flags %]
[% BLOCK flag_row %]
[% RETURN IF !flag && !((type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type)) %]
[% SET fid = flag ? "flag-$flag.id" : "flag_type-$type.id" %]
<tbody[% ' class="bz_flag_type"' IF !flag %]>
<tr>
<td>
[% IF flag %]
<span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>:
[% ELSE %]
[% addl_text FILTER html %]
[% END %]
</td>
<td>
<label title="[% type.description FILTER html %]" for="[% fid FILTER html %]">
[%- type.name FILTER html FILTER no_break -%]</label>
</td>
<td>
<input type="hidden" id="[% fid FILTER html %]_dirty">
<select id="[% fid FILTER html %]" name="[% fid FILTER html %]"
title="[% type.description FILTER html %]"
onchange="toggleRequesteeField(this);"
class="flag_select flag_type-[% type.id %]">
[%# Only display statuses the user is allowed to set. %]
[% IF !flag || user.can_request_flag(type) || flag.setter_id == user.id %]
<option value="X"></option>
[% END %]
[% IF type.is_active %]
[% IF (type.is_requestable && user.can_request_flag(type)) || (flag && flag.status == "?") %]
<option value="?" [% "selected" IF flag && flag.status == "?" %]>?</option>
[% END %]
[% IF user.can_set_flag(type) || (flag && flag.status == "+") %]
<option value="+" [% "selected" IF flag && flag.status == "+" %]>+</option>
[% END %]
[% IF user.can_set_flag(type) || (flag && flag.status == "-") %]
<option value="-" [% "selected" IF flag && flag.status == "-" %]>-</option>
[% END %]
[% ELSE %]
<option value="[% flag.status %]" selected="selected">[% flag.status %]</option>
[% END %]
</select>
</td>
[% IF any_flags_requesteeble %]
<td>
[% IF (type.is_active && type.is_requestable && type.is_requesteeble) || (flag && flag.requestee) %]
<span style="white-space: nowrap;">
[% SET grant_list = [] %]
[% IF Param('usemenuforusers') %]
[% grant_list = type.grant_list %]
[% IF flag && !(type.is_active && type.is_requestable && type.is_requesteeble) %]
[%# We are here only because there was already a requestee. In this case,
the only valid action is to remove the requestee or leave it alone;
nothing else. %]
[% grant_list = [flag.requestee] %]
[% END %]
[% END %]
[% SET flag_name = flag ? "requestee-$flag.id" : "requestee_type-$type.id" %]
[% SET flag_requestee = (flag && flag.requestee) ? flag.requestee.login : '' %]
[% SET flag_multiple = flag ? 0 : type.is_multiplicable * 3 %]
[% SET flag_empty_ok = flag ? 1 : !type.is_multiplicable %]
[% INCLUDE global/userselect.html.tmpl
name => flag_name
id => flag_name
value => flag_requestee
multiple => flag_multiple
emptyok => flag_empty_ok
classes => ["requestee"]
custom_userlist => grant_list
%]
</span>
[% END %]
</td>
[% END %]
</tr>
</tbody>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# classifications: an array of classification objects containing
# at least one product accessible by the user.
#%]
[% IF target == "enter_bug.cgi" %]
[% title = "Выбор раздела" %]
[% subheader = "Выберите раздел." %]
[% END %]
[% DEFAULT title = "Выбор раздела" %]
[% PROCESS global/header.html.tmpl %]
<table>
<tr>
<th align="right">
<a href="[% target FILTER uri %]?classification=__all
[% IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
Все</a>:
</th>
<td valign="top">&nbsp;Показать все продукты</td>
</tr>
<tr>
<th colspan="2">&nbsp;</th>
</tr>
[% FOREACH class = classifications %]
<tr>
<th align="right">
<a href="[% target FILTER uri %]?classification=[% class.name FILTER uri -%]
[%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
[% class.name FILTER html %]</a>:
</th>
[% IF class.description %]
<td valign="top">&nbsp;[% class.description FILTER html_light %]</td>
[% END %]
</tr>
[% END %]
</table>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# classifications: array of hashes, with an 'object' key representing a
# classification object and 'products' the list of
# product objects the user can enter bugs into.
# target: the script that displays this template.
# cloned_bug_id: ID of the bug being cloned.
# format: the desired format to display the target.
#%]
[% PROCESS global/variables.none.tmpl %]
[% IF target == "enter_bug.cgi" %]
[% title = "Регистрация $terms.bug_gen" %]
[% h2 = BLOCK %]Прежде всего, выберите продукт, к которому относится [% terms.abug %]. [% END %]
[% ELSIF target == "describecomponents.cgi" %]
[% title = "Просмотр компонентов" %]
[% h2 = "Выберите продукт для описания компонентов." %]
[% END %]
[% DEFAULT title = "Выберите продукт" %]
[% PROCESS global/header.html.tmpl %]
<h2>[% h2 FILTER html %]</h2>
<table>
[% FOREACH c = classifications %]
[% IF c.object %]
<tr>
<th colspan="2" align="left">[% c.object.name FILTER html %]:
[%+ c.object.description FILTER html_light %]</th>
</tr>
[% END %]
[% FOREACH p = c.products %]
<tr>
<th align="right" valign="top">
<a href="[% target %]?product=[% p.name FILTER uri -%]
[%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
[% p.name FILTER html FILTER no_break %]</a>:&nbsp;
</th>
<td valign="top">[% p.description FILTER html_light %]</td>
</tr>
[% END %]
<tr>
<th colspan="2">&nbsp;</th>
</tr>
[% END %]
</table>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# header_done: boolean. True if the header has already been printed.
# error: string. The tag of the error.
# variables: hash. Useful data about the problem. The keys are the variable
# names, and the values the variable values.
#%]
[%# This is a list of all the possible code errors. Please keep them in
# alphabetical order by error tag, and leave a blank line between errors.
#
# Note that you must explicitly filter every single template variable
# in this file; if you do not wish to change it, use the "none" filter.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% DEFAULT title = "Внутренняя ошибка" %]
[% error_message = BLOCK %]
[% IF error == "auth_invalid_email" %]
[% title = "Недопустимый адрес электронной почты" %]
Адрес электронной почты (<b>[% addr FILTER html %]</b>),
указанный при создании или изменении учетной записи,
не прошел проверки на допустимость:
[% IF default %]
Адрес должен содержать в точности один символ '@',
и по меньшей мере один символ '.' после '@'.
[% ELSE %]
[%+ Param('emailregexpdesc') FILTER html_light %]
[% END %]
Также адрес не должен содержать запрещённых символов.
[% ELSIF error == "authres_unhandled" %]
Код возврата процедуры авторизации [% value FILTER html %] не обработан
процедурой входа в систему.
[% ELSIF error == "bad_arg" %]
Недопустимый аргумент <code>[% argument FILTER html %]</code>
при вызове функции <code>[% function FILTER html %]</code>.
[% ELSIF error == "bug_error" %]
Внутренняя ошибка [% bug.error FILTER html %] при обращении
к [% terms.bug_dat %] [%+ bug.bug_id FILTER html %] .
[% ELSIF error == "chart_data_not_generated" %]
[% admindocslinks = {'extraconfig.html' => 'Настройка диаграмм'} %]
[% IF product %]
Диаграммы для продукта <em>[% product FILTER html %]</em> не могут
быть построены, поскольку с момента создания продукта не собрано
достаточно статистических данных.
[% ELSE %]
Данные счетчиков [% terms.bugs_gen %] еще не собраны.
[% END %]
Попробуйте еще раз через день.
Если вы видите данное сообщение повторно через несколько дней,
обратитесь к администратору системы <a href="mailto:[% Param('maintainer') %]">[% Param('maintainer') %]</a>
и опишите ситуацию.
[% ELSIF error == "chart_datafile_corrupt" %]
Файл данных диаграммы [% file FILTER html %] поврежден.
[% ELSIF error == "chart_dir_nonexistent" %]
Один из каталогов <tt>[% dir FILTER html %]</tt> или
<tt>[% graph_dir FILTER html %]</tt> не существует.
[% ELSIF error == "chart_file_open_fail" %]
Ошибка открытия файла данных диаграммы <tt>[% filename FILTER html %]</tt>.
[% ELSIF error == "column_alter_nonexistent_fk" %]
Вы попытались изменить чужой ключ для
[%+ table FILTER html %].[% column FILTER html %], но в этом
столбце нет чужого ключа.
[% ELSIF error == "column_not_null_without_default" %]
Ошибка добавления поля [% name FILTER html %]:
Невозможно добавить в таблицу поле NOT NULL без значения по умолчанию,
укажите значение аргумента <code>$init_value</code>.
[% ELSIF error == "column_not_null_no_default_alter" %]
Невозможно объявить поле [% name FILTER html %] NOT NULL
без указания значения по умолчанию или аргумента $set_nulls_to, поскольку
среди текущих значений есть NULL.
[% ELSIF error == "comment_extra_data_not_allowed" %]
Вы попытались присвоить полю <code>extra_data</code> значение
'[% extra_data FILTER html %]', но комментарии с типом [% type FILTER html %]
не принимают параметр <code>extra_data</code>.
[% ELSIF error == "comment_extra_data_required" %]
Комментарии с типом [% type FILTER html %] требуют, чтобы был установлен
параметр <code>extra_data</code>.
[% ELSIF error == "comment_extra_data_not_numeric" %]
Вы попытались присвоить полю <code>extra_data</code> значение
'[% extra_data FILTER html %]', но комментарии с типом [% type FILTER html %]
требуют чтобы был установлен численный параметр <code>extra_data</code>.
[% ELSIF error == "comment_type_invalid" %]
Тип комментария '[% type FILTER html %]' недействителен.
[% ELSIF error == "db_rename_conflict" %]
Конфликт имен: невозможно переименовать [% old FILTER html %] в
[%+ new FILTER html %], поскольку [% new FILTER html %] уже существует.
[% ELSIF error == "cookies_need_value" %]
Для cookie должно быть установлено значение.
[% ELSIF error == "env_no_email" %]
[% terms.Bugzilla %] не получает из окружения адрес электронной почты
[% IF Param("auth_env_email") %]
Это означает что переменная окружения '[% Param("auth_env_email") FILTER html %]'
не существует или имеет пустое значение.
[% ELSE %]
Следует установить параметр настройки "auth_env_email",
указав имя переменной окружения, содержащей адрес
электронной почты пользователя.
[% END %]
[% ELSIF error == "extension_must_be_subclass" %]
<code>[% package FILTER html %]</code> из
<code>[% filename FILTER html %]</code> не является подклассом
<code>[% class FILTER html %]</code>.
[% ELSIF error == "extension_must_return_name" %]
<code>[% extension FILTER html %]</code> возвратил
<code>[% returned FILTER html %]</code>, что не является корректным именем
для расширения. Расширения должны возвращать своё имя, а не <code>1</code>
или число. Для получения более подробной информации обратитесь к документации по
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">Bugzilla::Extension</a>.
[% ELSIF error == "extension_no_name" %]
Мы не нашли метод <code>NAME</code> в
<code>[% package FILTER html %]</code> (загруженный из
<code>[% filename FILTER html %]</code>). Это значит, что
у расширения имеется одна или несколько следующих проблем:
<ul>
<li><code>[% filename FILTER html %]</code> не определяет
пакет <code>[% package FILTER html %]</code>.</li>
<li><code>[% package FILTER html %]</code> не определяет
метод <code>NAME</code> (или же метод <code>NAME</code>
вернул пустую строку).</li>
</ul>
[% ELSIF error == "extern_id_conflict" %]
Внешний идентификатор '[% extern_id FILTER html %]' уже зарегистрирован
для пользователя '[% username FILTER html %]', но сервер аутентификации
считает его принадлежащим пользователю '[% extern_user FILTER html %]'.
[% ELSIF error == "field_choice_must_use_type" %]
При вызове метода класса <code>Bugzilla::Field::Choice</code>,
необходимо вызывать <code>Bugzilla::Field::Choice-&gt;type('some_field')</code>
для генерации правильного экземпляра (нельзя вызывать напрямую методы
класса Bugzilla::Field::Choice).
[% ELSIF error == "field_not_custom" %]
'[% field.description FILTER html %]' ([% field.name FILTER html %])
не является настраиваемым атрибутом.
[% ELSIF error == "field_type_not_specified" %]
[% title = "Не указан тип атрибута" %]
Указание типа при создании атрибута обязательно.
[% ELSIF error == "illegal_field" %]
Недопустимое значение поля [% field FILTER html %].
[% ELSIF error == "invalid_customfield_type" %]
[% title = "Недопустимый тип атрибута" %]
Тип <em>[% type FILTER html %]</em> не является допустимым.
[% ELSIF error == "invalid_feature" %]
[% title = "Недопустимое имя функционала" %]
Имя функционала '[% feature FILTER html %]' недопустимо. Допустимые имена в
<code>Bugzilla::Install::Requirements</code> в разделе
<code>OPTIONAL_MODULES</code>.
[% ELSIF error == "invalid_flag_association" %]
[% title = "Недопустимый объект согласования" %]
Согласование не может быть выполнено с
[% IF attach_id %]
приложением [% attach_id FILTER html %].
[% ELSE %]
[%+ terms.bug_abl %] [%+ bug_id FILTER html %].
[% END %]
[% ELSIF error == "invalid_series_id" %]
[% title = "Недопустимая серия" %]
Недопустимый код серии [% series_id FILTER html %]. Возможно,
серия данных удалена.
[% ELSIF error == "invalid_timestamp" %]
Введённый штамп времени <code>[% timestamp FILTER html %]</code> не удалось
преобразовать в действительную дату и время.
[% ELSIF error == "invalid_webservergroup" %]
Группа [% group FILTER html %] не существует. Проверьте значение параметра $webservergroup
в [% constants.bz_locations.localconfig FILTER html %].
[% ELSIF error == "flag_unexpected_object" %]
[% title = "Недопустимый объект согласования" %]
Согласования невозможны для объектов типа [% caller FILTER html %].
Поддерживаются согласования только для [% terms.bugs_gen %] и приложений.
[% ELSIF error == "flag_type_inactive" %]
[% title = "Вид согласования запрещен" %]
Вид согласования [% type FILTER html %] запрещен, согласования этого вида
не выполняются.
[% ELSIF error == "flag_type_target_type_invalid" %]
Недопустимый тип объекта <em>[% variables.target_type FILTER html %]</em>.
Допустимыми типами являются <em>[% terms.bug %]</em> или <em>приложение</em>.
[% ELSIF error == "invalid_field_name" %]
Недопустимый формат имени поля [% field FILTER html %].
[% ELSIF error == "jobqueue_insert_failed" %]
[% title = "Ошибка очереди заданий" %]
Постановка задания <code>[% job FILTER html %]</code> в очередь
привела к ошибке: [% errmsg FILTER html %]
[% ELSIF error == "jobqueue_no_job_mapping" %]
Не выполнена настройка <code>Bugzilla::JobQueue</code> для задания
"[% job FILTER html %]". Необходимо добавить этот тип задания
в константу <code>JOB_MAP</code> модуля <code>Bugzilla::JobQueue</code>,
возможно путём использования хука 'job_map'.
[% ELSIF error == "ldap_bind_failed" %]
Ошибка обращения к серверу LDAP:
<code>[% errstr FILTER html %]</code>
[% ELSIF error == "ldap_cannot_retreive_attr" %]
Указанный атрибут LDAP [% attr FILTER html %] не найден.
[% ELSIF error == "ldap_connect_failed" %]
Ошибка соединения с сервером(серверами) LDAP: <code>[% server FILTER html %]</code>.
[% ELSIF error == "ldap_start_tls_failed" %]
Ошибка защищенного соединения с сервером LDAP: <code>[% error FILTER html %]</code>.
[% ELSIF error == "ldap_search_error" %]
Ошибка поиска
&quot;[% username FILTER html %]&quot; на сервере LDAP:
[% IF errstr %]
<code>[% errstr FILTER html %]</code>
[% ELSE %]
Невозможно найти пользователя в LDAP
[% END %]
[% ELSIF error == "ldap_server_not_defined" %]
Не определен сервер LDAP для аутентификации.
[% ELSIF error == "mail_send_error" %]
Ошибка отправки электронной почты от '[% mail.header('From') FILTER html %]'
к '[% mail.header('To') FILTER html %]':
[%+ msg FILTER html %]
[% ELSIF error == "missing_series_id" %]
При попытке добавления серии данных не получен код серии.
Серия: [% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %].
[% ELSIF error == "object_dep_sort_loop" %]
В VALIDATOR_DEPENDENCIES имеется петля, включающая
'[%+ field FILTER html %]'. Мы приняли во внимание следующие поля:
[%+ considered.join(', ') FILTER html %].
[% ELSIF error == "param_invalid" %]
[% title = "Недопустимый параметр" %]
Недопустимый параметр <code>[% param FILTER html %]</code>
для функции <code>[% function FILTER html %]</code>.
[% ELSIF error == "param_must_be_numeric" %]
[% title = "Недопустимый параметр" %]
Функции [% function FILTER html %] передан недопустимый параметр
<code>[% param FILTER html %]</code>. Требуется передать число.
[% ELSIF error == "param_required" %]
[% title = "Параметр не указан" %]
Для функции <code>[% function FILTER html %]</code> обязателен аргумент
<code>[% param FILTER html %]</code>, аргумент
не задан.
[% ELSIF error == "params_required" %]
[% title = "Параметр не указан" %]
Для функции <code>[% function FILTER html %]</code>
является обязательным указание одного из параметров:
<code>[% params.join(', ') FILTER html %]</code>
[% ELSIF error == "product_empty_group_controls" %]
[% title = "Не установлены права доступа" %]
Необходимо установить значения прав доступа для
группы [% group.name FILTER html %].
[% ELSIF error == "product_illegal_group_control" %]
[% title = "Недопустимые права доступа" %]
Значение '[% value FILTER html %]' недопустимо для
поля '[% field FILTER html %]'.
[% ELSIF error == "protection_violation" %]
Функция <code>[% function FILTER html %]</code> вызвана
[% IF argument %]
с аргументом <code>[% argument FILTER html %]</code>
[% END %]
из
[% IF caller %]
<code>[%+ caller FILTER html %]</code>, которая вне
[% ELSE %]
извне
[% END %]
пакета. Вызов функции разрешен только из
подкласса <code>[% superclass FILTER html %]</code>.
[% ELSIF error == "radius_preparation_error" %]
Ошибка подготовки запроса аутентификации RADIUS:
<code>[% errstr FILTER html %]</code>.
[% ELSIF error == "search_cp_without_op" %]
Параметр поиска f[% id FILTER html %] является "CP", но перед ним
нет подходящего "OP".
[% ELSIF error == "search_invalid_joiner" %]
'[% joiner FILTER html %]' не является корректным оператором объединения
для поиска.
[% ELSIF error == "setting_info_invalid" %]
При создании новой настройки требуется указать название, список значений
с ключами сортировки и значение по умолчанию.
[% ELSIF error == "setting_name_invalid" %]
Имя настройки <em>[% name FILTER html %]</em> недопустимо.
Имена настроек должны начинаться с латинской буквы, содержать только буквы,
цифры или символы '_', '-', '.', ':'.
[% ELSIF error == "setting_subclass_invalid" %]
Класс настроек
<code>[% subclass FILTER html %]</code> не существует.
[% ELSIF error == "setting_value_invalid" %]
Значение "<code>[% value FILTER html %]</code>" не входит в список допустимых
значений настройки <em>[% name FILTER html %]</em>.
[% ELSIF error == "token_generation_error" %]
Серьезная ошибка генерации номера жетона.
[% ELSIF error == "cancel_token_does_not_exist" %]
Отменяемый жетон не существует.
[% ELSIF error == "template_error" %]
[% template_error_msg FILTER html %]
[% ELSIF error == "template_invalid" %]
Недопустимое имя файла шаблона в вызове функции: [% name FILTER html %].
[% ELSIF error == "unable_to_retrieve_password" %]
Старый пароль не найден в базе данных.
[% ELSIF error == "undefined_field" %]
Поле формы [% field FILTER html %] не заполнено.
[% ELSIF error == "unknown_method" %]
Не найден запрошенный метод '[% method FILTER html %]'.
[% ELSIF error == "usage_mode_invalid" %]
Недопустимый режим использования '[% invalid_usage_mode FILTER html %]'.
[% ELSIF error == "must_be_patch" %]
[% title = "Приложение не является патчем" %]
Приложение #[% attach_id FILTER html %] не является патчем.
[% ELSIF error == "not_in_transaction" %]
Попытка завершения неначатой транзакции.
[% ELSIF error == "invalid_post_bug_submit_action" %]
Недопустимый параметр для post_bug_submit_action
[% ELSIF error == "search_field_operator_unsupported" %]
[% terms.Bugzilla %] не поддерживает тип поиска
"[% operator FILTER html %]".
[% ELSE %]
[%# Try to find hooked error messages %]
[% error_message = Hook.process("errors") %]
[% IF NOT error_message %]
[% title = "Внутренняя ошибка" %]
Произошла внутренняя ошибка, код ошибки [% terms.Bugzilla %]
<code>[% error FILTER html %]</code> неизвестен.
Если Вы пользователь [% terms.Bugzilla %], пожалуйста, сохраните это
сообщение и отправьте его по адресу [% Param('maintainer') %].
[% ELSE %]
[% error_message FILTER none %]
[% END %]
[% END %]
[% END %]
[%# We only want HTML error messages for ERROR_MODE_WEBPAGE %]
[% USE Bugzilla %]
[% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
[% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
[% error_message FILTER none %]
[% ELSE %]
[% error_message FILTER txt %]
[% END %]
[% RETURN %]
[% END %]
[% UNLESS header_done %]
[% PROCESS global/header.html.tmpl %]
[% END %]
[% PROCESS global/docslinks.html.tmpl
docslinks = docslinks
admindocslinks = admindocslinks
%]
<p>
Произошла неожиданная ошибка. Это может быть временной проблемой, или
какой-либо код ведёт себя некорректно. Если эта проблема не прекратится,
пожалуйста, отправьте эту страницу по адресу
<a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>
с описанием, того, что вы делали в момент возникновения этого сообщения.
</p>
<tt>
<script type="text/javascript"> <!--
document.write("<p>URL: " +
document.location.href.replace(/&/g,"&amp;")
.replace(/</g,"&lt;")
.replace(/>/g,"&gt;") + "</p>");
// -->
</script>
</tt>
<table cellpadding="20">
<tr>
<td id="error_msg" class="throw_error">
[% error_message FILTER none %]
</td>
</tr>
</table>
<p>Трейсбэк:</p>
<pre>[% traceback FILTER html %]</pre>
[% IF variables %]
<pre>
Параметры:
[% FOREACH key = variables.keys %]
[%+ key FILTER html %]: [%+ variables.$key FILTER html %]
[% END %]
</pre>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% DEFAULT qs_suffix = "" %]
[% USE Bugzilla %]
<ul class="links">
<li><a href="./">В начало</a></li>
<li><span class="separator">| </span><a href="enter_bug.cgi">Создать</a></li>
<li><span class="separator">| </span><a href="describecomponents.cgi">Список</a></li>
<li><span class="separator">| </span><a href="query.cgi">Поиск</a></li>
<li class="form">
<span class="separator">| </span>
<form action="buglist.cgi" method="get"
onsubmit="if (this.quicksearch.value == '')
{ alert('Введите условие поиска.');
return false; } return true;">
<input type="hidden" id="no_redirect[% qs_suffix FILTER html %]" name="no_redirect" value="0">
<script type="text/javascript">
if (history && history.replaceState) {
var no_redirect = document.getElementById("no_redirect[% qs_suffix FILTER js %]");
no_redirect.value = 1;
}
</script>
<input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch"
title="Быстрый поиск" value="[% quicksearch FILTER html %]">
<input class="btn" type="submit" value="Искать"
id="find[% qs_suffix FILTER html %]">
[%-# Work around FF bug: keep this on one line %]</form>
<a href="page.cgi?id=quicksearch.html" title="Справка по быстрому поиску">[?]</a></li>
<li><span class="separator">| </span><a href="report.cgi">Отчеты</a></li>
<li>
[% IF Param('shutdownhtml') || Bugzilla.has_flags %]
<span class="separator">| </span>
[% IF user.id %]
<a href="request.cgi?requester=[% user.login FILTER uri %]&amp;requestee=
[% user.login FILTER uri %]&amp;do_union=1&amp;group=type&amp;action=queue">Мои согласования</a>
[% ELSE %]
<a href="request.cgi">Согласования</a>
[% END %]
[% END %]
[%-# Work around FF bug: keep this on one line %]</li>
[% IF user.login %]
<li><span class="separator">| </span><a href="userprefs.cgi">Параметры</a></li>
[% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless
|| (Param('useclassification') && user.in_group('editclassifications'))
|| user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups')
|| user.in_group('editkeywords') || user.in_group('bz_canusewhines')
|| user.get_products_by_permission("editcomponents").size %]
<li><span class="separator">| </span><a href="admin.cgi">Администрирование</a></li>
[% END %]
[% PROCESS link_to_documentation %]
<li>
<span class="separator">| </span>
[% IF user.authorizer.can_logout %]
<a href="index.cgi?logout=1">Завершить&nbsp;сеанс</a>
[% ELSE %]
Пользователь
[% END %]
[% IF sudoer %]
[%+ sudoer.login FILTER html %] (<b>от имени
[%+ user.login FILTER html %]</b>
<a href="relogin.cgi?action=end-sudo">завершить сеанс</a>)
[% ELSE %]
[%+ user.login FILTER html %]
[% END %]
[%-# Work around FF bug: keep this on one line %]</li>
[% ELSE %]
[% PROCESS link_to_documentation %]
[% IF Param('createemailregexp')
&& user.authorizer.user_can_create_account %]
<li id="new_account_container[% qs_suffix FILTER html %]">
<span class="separator">| </span>
<a href="createaccount.cgi">Регистрация</a>
</li>
[% END %]
[%# Only display one login form when we're on a LOGIN_REQUIRED page. That
# way, we're guaranteed that the user will use the form that has
# hidden_fields in it (the center form) instead of this one. Also, it's
# less confusing to have one form (as opposed to three) when you're
# required to log in.
#%]
[% IF user.authorizer.can_login && !Bugzilla.page_requires_login %]
[% PROCESS "account/auth/login-small.html.tmpl" %]
[% END %]
[% END %]
</ul>
[% Hook.process("link-row") %]
[% BLOCK link_to_documentation %]
[% IF doc_section && Param('docs_urlbase') %]
<li>
<span class="separator">| </span>
<a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Справка</a>
</li>
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# script_name: the script generating this warning.
# token: a valid token for the current action.
# reason: reason of the failure.
#%]
[% PROCESS global/header.html.tmpl title = "Подозрительные действия"
style_urls = ['skins/standard/global.css'] %]
[% PROCESS global/variables.none.tmpl %]
<div class="throw_error">
<!--reason=[%reason FILTER html %]-->
[% IF reason == "expired_token" %]
В сохранении изменений отказано, так как превышен лимит времени
([% constants.MAX_TOKEN_AGE FILTER html %]
[% numeral(constants.MAX_TOKEN_AGE, "день", "дня", "дней") FILTER html %])
между отображением и сохранением [% script_name FILTER html %]. Страница
отображалась слишком долго, или в форме случайно оказались старые данные.
[% ELSIF reason == "missing_token" %]
Попытка сохранения с нестандартной страницы.
Возможно, адрес введен напрямую в поле адреса веб-обозревателя,
это должно быть безопасно. Другой причиной может быть переход по ссылке,
которая перенаправила сюда <b>без Вашего согласия</b>.
[% ELSIF reason == "invalid_token" %]
Попытка сохранить изменения в [% script_name FILTER html %] с недопустимым
идентификатором. Это может свидетельстовать о попытке использовать Ваши
учетные данные для манипуляций с [% terms.Bugzilla %], например, предлагая
переход по ссылке, которая перенаправила сюда <b>без Вашего согласия</b>.
[% END %]
<p>
Вы уверены, что изменения следует сохранить?
</p>
</div>
<form name="check" id="check" method="post" action="[% script_name FILTER html %]">
[% PROCESS "global/hidden-fields.html.tmpl"
exclude="^(Bugzilla_login|Bugzilla_password|token)$" %]
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="confirm" value="Да, подтверждаю изменения">
</form>
<p><a href="index.cgi">Нет, отказаться от изменений</a> (и перейти
на главную страницу).</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# fields: hash/record; the fields being matched, each of which has:
# type: single|multi: whether or not the user can select multiple matches
# flag_type: for flag requestee fields, the type of flag being requested
# matches: hash; Hierarchical. The levels go like this:
# field_name {
# pattern_text {
# 'users' = @user_list (user objects)
# 'status' = success|fail|trunc (result of search.
# 'trunc' (truncated) means max was reached)
# }
# }
# script: string; The name of the calling script, used to create a
# self-referential URL
#%]
[%# use the global field descs %]
[% PROCESS "global/field-descs.none.tmpl" %]
[%# This lists fields which use the user auto-completion feature and which
# are not listed in field_descs. %]
[% field_labels = { # Used by editcomponents.cgi
"initialcc" => "Default CC List",
"initialowner" => "Default Assignee",
"initialqacontact" => "Default QA Contact",
# Used by process_bug.cgi
"masscc" => "CC List",
# Used by request.cgi
"requester" => "Requester",
"requestee" => "Requestee",
# Used by userprefs.cgi
"new_watchedusers" => "Watch List",
}
%]
[% IF matchsuccess == 1 %]
[% PROCESS global/header.html.tmpl title="Подтверждение выбора" %]
[% USE Bugzilla %]
<form method="post"
[% IF script -%]
action="[% script %]"
[%- END -%]
[% IF Bugzilla.cgi.param("data") %]
enctype="multipart/form-data"
[% END %]
>
<p>
[% IF matchmultiple %]
Одно или несколько имен и/или адресов электронной почты,
указанных на предыдущей странице, допускают неоднозначный выбор.
Пожалуйста, выберите пользователей из предлагаемого списка,
[% ELSE %]
Требуется подтверждение выбора пользователей, указанных по имени или
части адреса электронной почты.
<br>Пожалуйста, проверьте соответствие выбранных учетных записей
и указанных Вами данных,
[% END %]
или вернитесь на предыдущую страницу и уточните ваш выбор.
</p>
[% ELSE %]
[% PROCESS global/header.html.tmpl title="Пользователь не найден" %]
<p>
Одно или несколько имен и/или адресов электронной почты,
указанных на предыдущей странице, не найдены.
[% IF !user.id %]
<b>Внимание: Вы не зарегистрировались и можете выполнять только
поиск по полным адресам электронной почты.</b>
[% END %]
</p>
<p>Пожалуйста, вернитесь на предыдущую страницу и уточните Ваш выбор.</p>
[% END %]
<table border="0">
<tr>
<td colspan="2">
<hr width="100%" size="1">
</td>
</tr>
[%# this is messy to allow later expansion %]
[% FOREACH field = matches %]
<tr>
<td align="left" valign="top">
[% PROCESS field_names field_name=field.key %]:
</td>
<td align="left" valign="top">
[% FOREACH query = field.value %]
<div class="user_match">
<b>[% query.key FILTER html %]</b>
[% IF query.value.users.size %]
[% IF query.value.users.size > 1 %]
[% IF query.value.status == 'fail' %]
<font color="#FF0000">
соответствует нескольким пользователям.
</font>
Пожалуйста, вернитесь на предыдущую страницу и укажите
имя или адрес более точно.
[% ELSE %]
[% IF query.value.status == 'trunc' %]
количество найденных
пользователей больше допустимого
[% query.value.users.size %]:<br>
[% ELSE %]
варианты:<br>
[% END %]
<select name="[% field.key FILTER html %]"
id="[% field.key FILTER html %]"
[% IF fields.${field.key}.type == 'multi' %]
multiple="multiple"
[% IF query.value.users.size > 5 %]
size="5"
[% ELSE %]
size="[% query.value.users.size %]"
[% END %]
[% END %]
>
[% FOREACH match = query.value.users %]
<option value="[% match.login FILTER html %]">
[%- match.identity FILTER html -%]
</option>
[% END %]
</select>
[% END %]
[% ELSE %]
найден пользователь
<b>[% query.value.users.0.identity FILTER html %]</b>
[% END %]
[% ELSE %]
[% IF query.key.length < 3 %]
<font color="#FF0000">слишком коротко для поиска подстроки
(минимум 3 символа)</font>
[% ELSE %]
<font color="#FF0000">совпадений не найдено</font>
[% END %]
[% END %]
</div>
[% END %]
</td>
</tr>
<tr>
<td colspan="2">
<hr width="100%" size="1">
</td>
</tr>
[% END %]
</table>
[% IF matchsuccess == 1 %]
[% SET exclude_these = ['Bugzilla_login', 'Bugzilla_password'] %]
[% FOREACH key IN matches.keys %]
[% exclude_these.push(key) IF cgi.param(key) == '' %]
[% END %]
[% SET exclude = '^' _ exclude_these.join('|') _ '$' %]
[% PROCESS "global/hidden-fields.html.tmpl" exclude = exclude %]
<p>
<input type="submit" id="continue" value="Продолжить">
</p>
</form>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[% BLOCK field_names %]
[% IF field_descs.$field_name %]
[% field_descs.$field_name FILTER html %]
[% ELSIF field_labels.$field_name %]
[% field_labels.$field_name FILTER html %]
[% ELSIF field_name.match("^requestee") %]
адресат согласования [% fields.${field_name}.flag_type.name FILTER html %]
[% ELSE %]
[% field_name FILTER html %]
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# docslinks: hash. Hash keys will be used as text of the documentation links,
# hash values will be used as links to the document, relative to
# the main Bugzilla documentation directory.
# Example: If you want a 'FAQ' link to point to, the "faq-general"
# named anchor on faq.html, assign
# { 'FAQ' => "faq.html#faq-general" }
# to docslinks.
# You may only link to sections by their given ID; it is not allowed
# to link to a section which is not given an ID (thus getting
# assigned an automatically generated ID). Otherwise, the link
# would break on a recompilation of the documentation.
# admindocslinks: hash. Same as docslinks, but will only be displayed to
# members of the admin group.
#%]
[% IF Param('docs_urlbase') &&
docslinks.keys.size || (admindocslinks.keys.size && user.in_group('admin')) %]
<div id="docslinks">
<h2>Документация</h2>
<ul>
[% IF user.in_group('admin') %]
[% PROCESS docslinkslist docstype = admindocslinks %]
[% END %]
[% PROCESS docslinkslist docstype = docslinks %]
</ul>
</div>
[% END %]
[% BLOCK docslinkslist %]
[% FOREACH docslink = docstype.keys %]
<li>
<a href="[% docs_urlbase FILTER html %]
[% docslink FILTER none %]">[% docstype.$docslink FILTER html %]</a>
</li>
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# Remember to PROCESS rather than INCLUDE this template. %]
[% PROCESS global/variables.none.tmpl %]
[% SET search_descs = {
"noop" => "---",
"equals" => "равно",
"notequals" => "не равно",
"anyexact" => "равно любой из строк",
"substring" => "содержит текст в любом регистре",
"casesubstring" => "содержит текст в точности",
"notsubstring" => "не содержит текста",
"anywordssubstr" => "содержит любое из слов (строк)",
"allwordssubstr" => "содержит все слова (строки)",
"nowordssubstr" => "не содержит ни одного из слов",
"regexp" => "содержит регулярное выражение",
"notregexp" => "не содержит регулярного выражения",
"lessthan" => "меньше",
"lessthaneq" => "меньше или равно",
"greaterthan" => "больше",
"greaterthaneq" => "больше или равно",
"anywords" => "содержит любое из этих слов",
"allwords" => "содержит все эти слова",
"nowords" => "не содержит ни одного из этих слов",
"changedbefore" => "изменено до",
"changedafter" => "изменено после",
"changedfrom" => "изменено с",
"changedto" => "изменено на",
"changedby" => "изменено пользователем",
"matches" => "соответствует регулярному выражению",
"notmatches" => "не соответствует регулярному выражению",
} %]
[% field_types = { ${constants.FIELD_TYPE_UNKNOWN} => "Неизвестный",
${constants.FIELD_TYPE_FREETEXT} => "Текст",
${constants.FIELD_TYPE_SINGLE_SELECT} => "Выбор",
${constants.FIELD_TYPE_MULTI_SELECT} => "Множественный выбор",
${constants.FIELD_TYPE_TEXTAREA} => "Многострочный текст",
${constants.FIELD_TYPE_DATETIME} => "Дата/Время",
${constants.FIELD_TYPE_BUG_ID} => "Номер $terms.bug_gen",
} %]
[% IF in_template_var %]
[% PROCESS "global/value-descs.none.tmpl" %]
[% SET vars.value_descs = value_descs %]
[% SET vars.terms = terms %]
[%# field_descs is loaded as a global template variable and cached
# across all templates--see VARIABLES in Bugzilla/Template.pm.
#%]
[% vars.field_descs = {
"[Bug creation]" => "[Регистрация $terms.bug_gen]",
"actual_time" => "Трудозатраты",
"alias" => "Имя",
"assigned_to" => "Исполнитель",
"assigned_to_realname" => "Полное имя исполнителя",
"attach_data.thedata" => "Данные приложения",
"attachments.description" => "Описание приложения",
"attachments.filename" => "Имя файла приложения",
"attachments.mimetype" => "Тип MIME приложения",
"attachments.ispatch" => "Приложение является патчем",
"attachments.isobsolete" => "Приложение неактуально",
"attachments.isprivate" => "Приложение конфиденциально",
"attachments.submitter" => "Создатель приложения",
"blocked" => "Блокирует",
"bug_file_loc" => "URL",
"bug_group" => "Группа",
"bug_id" => "Номер $terms.bug_gen",
"bug_severity" => "Серьёзность",
"bug_status" => "Состояние",
"changeddate" => "Дата последнего изменения",
"cc" => "Подписчики",
"classification" => "Раздел",
"cclist_accessible" => "Список подписчиков?",
"commenter" => "Участник обсуждения",
"component_id" => "Код компонента",
"component" => "Компонент",
"content" => "Текст",
"creation_ts" => "Дата регистрации",
"days_elapsed" => "Дней с момента изменения $terms.bug_gen",
"deadline" => "Срок",
"delta_ts" => "Время последнего изменения",
"dependson" => "Зависимости",
"dup_id" => "Повторная",
"estimated_time" => "Оценка времени",
"everconfirmed" => "Подтверждена?",
"flagtypes.name" => "Согласования",
"keywords" => "Ключевые слова",
"longdesc" => "Комментарий",
"longdescs.count" => "Число комментариев",
"longdescs.isprivate" => "Комментарий конфиденциален",
"newcc" => "Подписчики",
"op_sys" => "ОС",
"opendate" => "Дата открытия",
"owner_idle_time" => "Время бездействия исполнителя",
"percentage_complete" => "% выполнения",
"priority" => "Приоритет",
"product_id" => "Код продукта",
"product" => "Продукт",
"qa_contact" => "Приемка",
"qa_contact_realname" => "Полное имя приемщика",
"remaining_time" => "Осталось времени",
"rep_platform" => "Платформа",
"reporter" => "Инициатор",
"reporter_accessible" => "Инициатор доступен?",
"reporter_realname" => "Полное имя инициатора",
"requestees.login_name" => "Инициатор согласования",
"resolution" => "Решение",
"see_also" => "Ссылки",
"setters.login_name" => "Исполнитель согласования",
"setting" => "Настройка",
"settings" => "Настройки",
"short_desc" => "Аннотация",
"short_short_desc" => "Аннотация",
"status_whiteboard" => "Заметки",
"tag" => "Условия отбора",
"target_milestone" => "Запланировано",
"version" => "Версия",
"work_time" => "Отработано времени",
} %]
[%# Also include any custom fields or fields which don't have a
Description here, by copying their Description from the
database. If you want to override this for your language
or your installation, just use a hook. %]
[% UNLESS Param('shutdownhtml') %]
[% FOREACH bz_field = bug_fields.values %]
[% SET vars.field_descs.${bz_field.name} = bz_field.description
IF !vars.field_descs.${bz_field.name}.defined %]
[% END %]
[% END %]
[% PROCESS "bug/field-help.none.tmpl" %]
[% END %]
[% Hook.process("end") %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# (All the below interface elements are optional.)
# title: string. Page title.
# header: string. Main page header.
# subheader: string. Page subheader.
# header_addl_info: string. Additional header information.
# bodyclasses: array of extra CSS classes for the <body>
# onload: string. JavaScript code to run when the page finishes loading.
# javascript: string. Javascript to go in the header.
# javascript_urls: list. List of URLs to Javascript.
# style: string. CSS style.
# style_urls: list. List of URLs to CSS style sheets.
# message: string. A message to display to the user. May contain HTML.
# atomlink: Atom link URL, May contain HTML
#%]
[% IF message %]
[% PROCESS global/messages.html.tmpl %]
[% END %]
[% DEFAULT
subheader = ""
header_addl_info = ""
onload = ""
style_urls = []
yui = []
%]
[% SET yui_css = {
autocomplete => 1,
calendar => 1,
datatable => 1,
button => 1,
} %]
[%# Note: This is simple dependency resolution--you can't have dependencies
# that depend on each other. You have to specify all of a module's deps,
# if that module is going to be specified in "yui".
#%]
[% SET yui_deps = {
autocomplete => ['json', 'connection', 'datasource'],
datatable => ['json', 'connection', 'datasource', 'element'],
} %]
[%# When using certain YUI modules, we need to process certain
# extra JS templates.
#%]
[% SET yui_templates = {
datatable => ['global/value-descs.js.tmpl'],
} %]
[%# These are JS URLs that are *always* on the page and come before
# every other JS URL.
#%]
[% SET starting_js_urls = [
"js/yui/yahoo-dom-event/yahoo-dom-event.js",
"js/yui/cookie/cookie-min.js",
] %]
[%# We should be able to set the default value of the header variable
# to the value of the title variable using the DEFAULT directive,
# but that doesn't work if a caller sets header to the empty string
# to avoid header inheriting the value of title, since DEFAULT
# mistakenly treats empty strings as undefined and gives header the
# value of title anyway. To get around that problem we explicitly
# set header's default value here only if it is undefined. %]
[% IF !header.defined %][% header = title %][% END %]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
[% Hook.process("start") %]
<title>[% title %]</title>
[% IF Param('utf8') %]
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
[% END %]
[%# Migration note: contents of the old Param 'headerhtml' would go here %]
[% PROCESS "global/site-navigation.html.tmpl" %]
[% PROCESS 'global/setting-descs.none.tmpl' %]
[% SET yui = yui_resolve_deps(yui, yui_deps) %]
[% SET css_sets = css_files(style_urls, yui, yui_css) %]
[%# CSS cascade, parts 1 & 2: YUI & Standard Bugzilla stylesheet set (persistent).
# Always present. %]
<link href="[% 'skins/standard/global.css' FILTER mtime FILTER html %]"
rel="alternate stylesheet"
title="[% setting_descs.standard FILTER html %]">
[% FOREACH style_url = css_sets.standard %]
[% PROCESS format_css_link css_set_name = 'standard' %]
[% END %]
[%# CSS cascade, part 3: Third-party stylesheet set, per user prefs. %]
[% FOREACH style_url = css_sets.skin %]
[% PROCESS format_css_link css_set_name = user.settings.skin.value %]
[% END %]
[%# CSS cascade, part 4: page-specific styles. %]
[% IF style %]
<style type="text/css">
[% style %]
</style>
[% END %]
[%# CSS cascade, part 5: Custom Bugzilla stylesheet set (persistent).
# Always present. Site administrators may override all other style
# definitions, including skins, using custom stylesheets.
#%]
[% FOREACH style_url = css_sets.custom %]
[% PROCESS format_css_link css_set_name = 'standard' %]
[% END %]
[%# YUI Scripts %]
[% FOREACH yui_name = yui %]
[% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %]
[% END %]
[% starting_js_urls.push('js/global.js') %]
[% FOREACH javascript_url = starting_js_urls %]
[% PROCESS format_js_link %]
[% END %]
<script type="text/javascript">
<!--
YAHOO.namespace('bugzilla');
YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) {
if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; };
var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false;
return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture);
};
if ( "onpagehide" in window || YAHOO.env.ua.gecko) {
YAHOO.util.Event._simpleRemove(window, "unload",
YAHOO.util.Event._unload);
}
[%# The language selector needs javascript to set its cookie,
# so it is hidden in HTML/CSS by the "bz_default_hidden" class.
# If the browser can run javascript, it will then "unhide"
# the language selector using the following code.
#%]
function unhide_language_selector() {
YAHOO.util.Dom.removeClass(
'lang_links_container', 'bz_default_hidden'
);
}
YAHOO.util.Event.onDOMReady(unhide_language_selector);
[%# Make some Bugzilla information available to all scripts.
# We don't import every parameter and constant because we
# don't want to add a lot of uncached JS to every page.
#%]
var BUGZILLA = {
param: {
cookiepath: '[% Param('cookiepath') FILTER js %]',
maxusermatches: [% Param('maxusermatches') FILTER js %]
},
constant: {
COMMENT_COLS: [% constants.COMMENT_COLS FILTER js %]
},
string: {
[%# Please keep these in alphabetical order. %]
attach_desc_required:
'Вы должны ввести описание для этого приложения.',
component_required:
'Вы должны выбрать компонент для этой [% terms.bugs %].',
description_required:
'Вы должны ввести описание для этой [% terms.bugs %].',
short_desc_required:
'Вы должны ввести аннотацию для этой [% terms.bugs %].',
version_required:
'Вы должны ввести выбрать версию для этой [% terms.bugs %].'
}
};
[% FOREACH yui_name = yui %]
[% FOREACH yui_template = yui_templates.$yui_name %]
[% INCLUDE $yui_template %]
[% END %]
[% END %]
[% IF javascript %]
[% javascript %]
[% END %]
// -->
</script>
[% FOREACH javascript_url = javascript_urls %]
[% PROCESS format_js_link %]
[% END %]
[%# this puts the live bookmark up on firefox for the Atom feed %]
[% IF atomlink %]
<link rel="alternate"
type="application/atom+xml" title="Подписка (Atom)"
href="[% atomlink FILTER html %]">
[% END %]
[%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %]
<link rel="search" type="application/opensearchdescription+xml"
title="[% terms.Bugzilla %]" href="./search_plugin.cgi">
<link rel="shortcut icon" href="images/favicon.ico" >
[% Hook.process("additional_header") %]
</head>
[%# Migration note: contents of the old Param 'bodyhtml' go in the body tag,
# but set the onload attribute in the DEFAULT directive above.
#%]
<body onload="[% onload %]"
class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %]
[% FOREACH class = bodyclasses %]
[% ' ' %][% class FILTER css_class_quote %]
[% END %] yui-skin-sam">
[%# Migration note: the following file corresponds to the old Param
# 'bannerhtml'
#%]
<div id="header">
[% INCLUDE global/banner.html.tmpl %]
<table border="0" cellspacing="0" cellpadding="0" id="titles">
<tr>
<td id="title">
<p>[% terms.Bugzilla %]
[% " &ndash; $header" IF header %]</p>
</td>
[% IF subheader %]
<td id="subtitle">
<p class="subheader">[% subheader %]</p>
</td>
[% END %]
[% IF header_addl_info %]
<td id="information">
<p class="header_addl_info">[% header_addl_info %]</p>
</td>
[% END %]
</tr>
</table>
<table id="lang_links_container" cellpadding="0" cellspacing="0"
class="bz_default_hidden"><tr><td>
[% IF Bugzilla.languages.size > 1 %]
<ul class="links">
[% FOREACH lang = Bugzilla.languages.sort %]
<li>[% IF NOT loop.first %]<span class="separator"> | </span>[% END %]
[% IF lang == current_language %]
<span class="lang_current">[% lang FILTER html FILTER upper %]</span>
[% ELSE %]
<a href="#" onclick="set_language('[% lang FILTER none %]');">
[%- lang FILTER html FILTER upper %]</a>
[% END %]
</li>
[% END %]
</ul>
[% END %]
</td></tr></table>
[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %]
</div> [%# header %]
<div id="bugzilla-body">
[% IF Param('announcehtml') %]
[% Param('announcehtml') FILTER none %]
[% END %]
[% IF message %]
<div id="message">[% message %]</div>
[% END %]
[% BLOCK format_css_link %]
[% IF style_url.match('/IE-fixes\.css') %]
<!--[if lte IE 7]>
[%# Internet Explorer treats [if IE] HTML comments as uncommented.
# We use it to import CSS fixes so that Bugzilla looks decent on IE 7
# and below.
#%]
[% END %]
[% IF css_set_name == 'standard' %]
[% SET css_title_link = '' %]
[% ELSE %]
[% css_title_link = BLOCK ~%]
title="[% setting_descs.${user.settings.skin.value} || user.settings.skin.value FILTER html %]"
[% END %]
[% END %]
<link href="[% style_url FILTER html %]" rel="stylesheet"
type="text/css" [% css_title_link FILTER none %]>
[% '<![endif]-->' IF style_url.match('/IE-fixes\.css') %]
[% END %]
[% BLOCK format_js_link %]
<script type="text/javascript" src="[% javascript_url FILTER mtime FILTER html %]"></script>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# exclude: string; a regular expression matching fields to exclude
# from the list of hidden fields generated by this template
#%]
[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[%# Generate hidden form fields for non-excluded fields. %]
[% FOREACH field = cgi.param() %]
[% NEXT IF exclude && field.search(exclude) %]
[%# The '.slice(0)' bit is here to force the 'param(field)' to be evaluated
in a list context, so we can avoid extra code checking for single valued or
empty fields %]
[% IF field == "data" && cgi.param("data") %]
<div class="box">
<p>
Невозможно сохранить закачанный файл, потому что недостаточно данных в отправленной
форме. Поскольку нет возможности временно хранить файл в интервале между отправками
формы, заполните недостающую информацию и приложите файл повторно.
</p>
<p>
Пожалуйста, укажите файл <b>[% cgi.param(field) FILTER html %]</b> в
этом поле:
</p>
<p>
<input type="file" id="data" name="data" size="50">
</p>
</div>
[% ELSE %]
[% FOREACH mvalue = cgi.param(field).slice(0) %]
<input type="hidden" name="[% field FILTER html %]"
value="[% mvalue FILTER html_linebreak %]">
[% END %]
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# url: string. An optional URL to go to.
# link: string. The link text for that URL.
#%]
[% PROCESS global/variables.none.tmpl %]
[% DEFAULT title = "Сообщение $terms.Bugzilla" %]
[% PROCESS global/header.html.tmpl %]
[%# The "header" template automatically displays a message if it finds one.
Note that the global messages list is in messages.html.tmpl. %]
[%# Display a URL if the calling script or message block has included one. %]
[% IF url && link %]
<p>
<a href="[% url FILTER html %]">[% link FILTER html %]</a>
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# This is a list of all the possible messages. Please keep them in
# alphabetical order by message tag, and leave a blank line between messages.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% message_tag = message %]
[% message = BLOCK %]
[% IF message_tag == "account_created" %]
Учетная запись [% otheruser.login FILTER html %] создана успешно.
[% IF groups.size %]
Проверьте и измените при необходимости принадлежность к группам.
[% END %]
[% ELSIF message_tag == "account_creation_canceled" %]
[% title = "Создание учетной записи отменено" %]
Создание учетной записи [% account FILTER html %]
отменено.
[% ELSIF message_tag == "account_updated" %]
[% IF changed_fields.size
+ groups_added_to.size + groups_removed_from.size
+ groups_granted_rights_to_bless.size + groups_denied_rights_to_bless.size %]
[% title = "Учетная запись $loginold изменена" %]
Выполнены следующие изменения учетной записи
[%+ loginold FILTER html %]:
<ul>
[% FOREACH field = changed_fields %]
<li>
[% IF field == 'login_name' %]
Адрес электронной почты [% otheruser.login FILTER html %].
[% ELSIF field == 'realname' %]
Изменено имя пользователя.
[% ELSIF field == 'cryptpassword' %]
Установлен новый пароль.
[% ELSIF field == 'disabledtext' %]
Текст сообщения "вход заблокирован" был изменен.
[% ELSIF field == 'is_enabled' %]
Вход под этой учётной записью пользователя был [% otheruser.is_enabled ? 'включён' : 'отключён' %].
[% ELSIF field == 'extern_id' %]
ID внешней учетной записи пользователя был изменён.
[% ELSIF field == 'disable_mail' %]
[% IF otheruser.email_disabled %]
Отключены почтовые оповещения.
[% ELSE %]
Включены почтовые оповещения.
[% END %]
[% END %]
</li>
[% END %]
[% IF groups_added_to.size %]
<li>
Учетная запись добавлена в
[%+ groups_added_to.size > 1 ? 'группы' : 'группу' %]
[%+ groups_added_to.join(', ') FILTER html %].
</li>
[% END %]
[% IF groups_removed_from.size %]
<li>
Учетная запись исключена из
[%+ groups_removed_from.size > 1 ? 'групп' : 'группы' %]
[%+ groups_removed_from.join(', ') FILTER html %].
</li>
[% END %]
[% IF groups_granted_rights_to_bless.size %]
<li>
Учетной записи делегировано управление
[%+ groups_granted_rights_to_bless.size > 1 ? 'группами' : 'группой' %]
[%+ groups_granted_rights_to_bless.join(', ') FILTER html %].
</li>
[% END %]
[% IF groups_denied_rights_to_bless.size %]
<li>
У учетной записи отозвано управление
[%+ groups_denied_rights_to_bless.size > 1 ? 'группами' : 'группой' %]
[%+ groups_denied_rights_to_bless.join(', ') FILTER html %].
</li>
[% END %]
</ul>
[% ELSE %]
[% title = "Учетная запись $otheruser.login не изменена" %]
Никаких изменений учетной записи [%+ otheruser.login FILTER html %] не указано.
[% END %]
[% ELSIF message_tag == "account_deleted" %]
[% title = "Учетная запись $otheruser.login удалена" %]
Учетная запись [% otheruser.login FILTER html %] успешно удалена.
[% ELSIF message_tag == "account_disabled" %]
Вход под учётной записью пользователя [% account FILTER html %] заблокирован,
изменение пароля запрещено.
[% ELSIF message_tag == "attachment_creation_failed" %]
[% terms.Bug %] зарегистрирована успешно, но при создании приложения
произошел сбой.
Добавьте приложение повторно, используя ссылку "Создать новое приложение"
ниже.
[% ELSIF message_tag == "bug_group_description" %]
Доступ к [% terms.bugs_dat %] продукта [% product.name FILTER html %]
[% ELSIF message_tag == "buglist_adding_field" %]
[% title = "Добавляем поле в форму поиска..." %]
[% link = "Выберите эту ссылку если страница не обновилась автоматически." %]
[% ELSIF message_tag == "buglist_updated_named_query" %]
[% title = "Условие отбора обновлено" %]
Условие отбора <code><a
href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% queryname FILTER uri %]"
>[% queryname FILTER html %]</a></code> обновлено.
[% ELSIF message_tag == "buglist_new_default_query" %]
Условия отбора по умолчанию сохранены. Кроме того, вы можете создать
закладку (добавить в "Избранное") на результат любого поиска.
[% ELSIF message_tag == "buglist_new_named_query" %]
[% title = "Условие отбора создано" %]
Создано новое условие отбора <code><a
href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% queryname FILTER uri %]"
>[% queryname FILTER html %]</a></code>.
[% ELSIF message_tag == "buglist_query_gone" %]
[% title = "Условие отбора удалено" %]
[% link = "Вернуться к поиску." %]
Условие отбора <b>[% namedcmd FILTER html %]</b> удалено.
[% ELSIF message_tag == "buglist_sorted_by_relevance" %]
[% terms.Bugs %] в данном списке отсортированы по соответствию,
начиная с наиболее подходящих.
[% ELSIF message_tag == "change_columns" %]
[% title = "Изменение списка колонок" %]
Повторяем поиск с новым списком колонок...
Выберите <a href="[% redirect_url FILTER html %]">эту ссылку</a>
если страница не обновилась автоматически.
[% ELSIF message_tag == "classification_created" %]
[% title = "Раздел создан" %]
Раздел <em>[% classification.name FILTER html %]</em> создан.
[% ELSIF message_tag == "classification_deleted" %]
[% title = "Раздел удален" %]
Раздел <em>[% classification.name FILTER html %]</em> удален.
[% ELSIF message_tag == "classification_updated" %]
[% title = "Изменения раздела сохранены" %]
[% IF changes.keys.size %]
Изменения раздела <em>[% classification.name FILTER html %]</em>
сохранены:
<ul>
[% IF changes.name.defined %]
<li>Название раздела изменено на '[% classification.name FILTER html %]'</li>
[% END %]
[% IF changes.description.defined %]
[% IF classification.description %]
<li>Описание изменено на '[% classification.description FILTER html %]'</li>
[% ELSE %]
<li>Описание удалено</li>
[% END %]
[% END %]
[% IF changes.sortkey.defined %]
<li>Порядок сортировки изменен на '[% classification.sortkey FILTER html %]'</li>
[% END %]
[% Hook.process('classification_updated_fields') %]
</ul>
[% ELSE %]
Никаких изменений раздела <em>[% classification.name FILTER html %]</em> не указано.
[% END %]
[% ELSIF message_tag == "component_created" %]
[% title = "Компонент создан" %]
Компонент <em>[% comp.name FILTER html %]</em> создан.
[% ELSIF message_tag == "component_deleted" %]
[% title = "Компонент удален" %]
Компонент <em>[% comp.name FILTER html %]</em> удален.
[% IF comp.bug_count %]
Все [% terms.bugs %] для этого компонента и все ссылки
на них также удалены.
[% END %]
[% ELSIF message_tag == "component_updated" %]
[% title = "Компонент изменен" %]
[% IF changes.keys.size %]
Изменения компонента <em>[% comp.name FILTER html %]</em> сохранены:
<ul>
[% IF changes.name.defined %]
<li>Наименование изменено на '[% comp.name FILTER html %]'</li>
[% END %]
[% IF changes.description.defined %]
<li>Описание изменено на '[% comp.description FILTER html_light %]'</li>
[% END %]
[% IF changes.initialowner.defined %]
<li>Ответственный исполнитель заменен на '[% comp.default_assignee.login FILTER html %]'</li>
[% END %]
[% IF changes.initialqacontact.defined %]
[% IF comp.default_qa_contact %]
<li>Ответственный за приемку заменен на '[% comp.default_qa_contact.login FILTER html %]'</li>
[% ELSE %]
<li>Ответственный за приемку не назначен</li>
[% END %]
[% END %]
[% IF changes.cc_list.defined %]
[% IF comp.initial_cc.size %]
[% cc_list = [] %]
[% FOREACH cc_user = comp.initial_cc %]
[% cc_list.push(cc_user.login) %]
[% END %]
<li>Список подписчиков изменен на [% cc_list.join(", ") FILTER html %]</li>
[% ELSE %]
<li>Список подписчиков очищен</li>
[% END %]
[% END %]
[% IF changes.isactive.defined %]
<li>[% comp.is_active ? "Включён" : "Отключён" %] для [% terms.bugs_gen %]</li>
[% END %]
[% Hook.process('component_updated_fields') %]
</ul>
[% ELSE %]
Никаких изменений компонента <em>[% comp.name FILTER html %]</em> не задано.
[% END %]
[% ELSIF message_tag == "custom_field_created" %]
[% title = "Атрибут создан" %]
Пользовательский атрибут '[% field.name FILTER html %]' создан
успешно.
[% ELSIF message_tag == "custom_field_deleted" %]
[% title = "Атрибут удален" %]
Настраиваемый атрибут '[% field.name FILTER html %]'
успешно удален.
[% ELSIF message_tag == "custom_field_updated" %]
[% title = "Атрибут изменен" %]
Свойства атрибута '[% field.name FILTER html %]' изменены
успешно.
[% ELSIF message_tag == "default_settings_updated" %]
[% IF changes_saved %]
Изменения стандартных настроек пользователей сохранены.
[% ELSE %]
Изменений не задано.
[% END %]
[% ELSIF message_tag == "emailold_change_canceled" %]
[% title = "Отмена запроса на изменение адреса электронной почты" %]
Запрос на изменение адреса электронной почты пользователя на
[%+ new_email FILTER html %] аннулирован.
[% ELSIF message_tag == "email_change_canceled" %]
[% title = "Отмена запроса на изменение адреса электронной почты" %]
Запрос на изменение адреса электронной почты пользователя
[%+ old_email FILTER html %] на [%+ new_email FILTER html %]
аннулирован.
[% ELSIF message_tag == "email_change_canceled_reinstated" %]
[% title = "Отмена запроса на изменение адреса электронной почты" %]
Запрос на изменение адреса электронной почты
пользователя [%+ old_email FILTER html %] на
[%+ new_email FILTER html %] аннулирован.
Восстановлены старые параметры пользователя.
[% ELSIF message_tag == "extension_created" %]
По адресу [% path FILTER html %] было создано расширение с именем
[% name FILTER html %].
[% ELSIF message_tag == "field_value_created" %]
[% title = "Значение атрибута создано" %]
Значение <em>[% value.name FILTER html %]</em> добавлено в список возможных
значений атрибута <em>[% field_descs.${field.name} FILTER html %]</em>
(<em>[% field.name FILTER html %]</em>) field.
[% IF field.name == "bug_status" %]
Следует перейти к <a href="editworkflow.cgi">настройке состояний</a>
и описать новое состояние [% terms.bug_gen %].
[% END %]
[% ELSIF message_tag == "field_value_deleted" %]
[% title = "Значение атрибута удалено" %]
Значение <em>[% value.name FILTER html %]</em> атрибута
<em>[% field_descs.${field.name} FILTER html %]</em>
(<em>[% field.name FILTER html %]</em>) field удалено.
[% ELSIF message_tag == "field_value_updated" %]
[% title = "Значение атрибута изменено" %]
[% IF changes.keys.size %]
Изменения значения <em>[% value_old FILTER html %]</em> атрибута
<em>[% field_descs.${field.name} FILTER html %]</em>
(<em>[% field.name FILTER html %]</em>) сохранены:
<ul>
[% IF changes.value %]
<li>Значение изменено на
<em>[% changes.value.1 FILTER html %]</em>.
[% IF value.is_default %]
(это значение по умолчание для данного атрибута. Все
ссылки на значение по умолчанию теперь указывают на новое значение)
[% END %]
</li>
[% END %]
[% IF changes.sortkey %]
<li>Порядок сортировки изменен на
<em>[% changes.sortkey.1 FILTER html %]</em>.</li>
[% END %]
[% IF changes.visibility_value_id %]
[% IF value.visibility_value.defined %]
<li>Отображается при установке атрибуту
'[% field_descs.${value.field.value_field.name} FILTER html %]' значения
'[%+ value.visibility_value.name FILTER html %]'.</li>
[% ELSE %]
<li>Отображается вне зависимости от значений атрибута
'[%+ field_descs.${value.field.value_field.name} FILTER html %]'.
</li>
[% END %]
[% END %]
</ul>
[% ELSE %]
Никаких изменений значения <em>[% value_old FILTER html %]</em> не указано.
[% END %]
[% ELSIF message_tag == "flag_cleared" %]
Некоторые согласования недопустимы для нового продукта (компонента)
и были удалены.
[% ELSIF message_tag == "flag_creation_failed" %]
[% title = "Ошибка создания согласования" %]
Ошибка при проверке согласования:
[%+ flag_creation_error FILTER none %]
[% ELSIF message_tag == "get_field_desc" %]
[% field_descs.$field_name FILTER html %]
[% ELSIF message_tag == "get_resolution" %]
[% display_value("resolution", resolution) FILTER html %]
[% ELSIF message_tag == "get_status" %]
[% display_value("bug_status", status) FILTER html %]
[% ELSIF message_tag == "group_created" %]
[% title = "Группа создана" %]
Группа <em>[% group.name FILTER html %]</em> создана.
[% ELSIF message_tag == "group_deleted" %]
[% title = "Группа" %]
Группа <em>[% name FILTER html %]</em> удалена.
[% ELSIF message_tag == "group_membership_removed" %]
[% title = "Пользователи исключены из группы" %]
[% IF users.size %]
Из группы <em>[% group FILTER html %]</em> исключены пользователи
[%- IF regexp %], соответствующие регулярному выражению '[% regexp FILTER html %]'[% END %]:
[% FOREACH user = users %]
[%+ user.login FILTER html %]
[% END %]
[% ELSE %]
Никаких изменений состава группы не указано.
[% END %]
[% ELSIF message_tag == "group_updated" %]
[% IF changes.keys.size %]
Изменения группы '[% group.name FILTER html %]'
сохранены:
<ul>
[% FOREACH field = changes.keys.sort %]
[% SWITCH field %]
[% CASE 'name' %]
<li>Имя группы изменено на '[% changes.name.1 FILTER html %]'</li>
[% CASE 'description' %]
<li>Изменено описание группы.</li>
[% CASE 'userregexp' %]
<li>Изменено регулярное выражение.</li>
[% CASE 'isactive' %]
[% IF changes.isactive.1 %]
<li>Группа может быть использована для доступа к [% terms.bugs_dat %].</li>
[% ELSE %]
<li>Группа не может быть использована для доступа к [% terms.bugs_dat %].</li>
[% END %]
[% CASE 'icon_url' %]
<li>Изменен значок группы.</li>
[% CASE 'members_add' %]
<li>Следующие группы включены в данную:
[%+ changes.members_add.join(', ') FILTER html %]</li>
[% CASE 'members_remove' %]
<li>Следующие группы исключены из данной:
[%+ changes.members_remove.join(', ') FILTER html %]</li>
[% CASE 'member_of_add' %]
<li>Данная группа включена в группы:
[%+ changes.member_of_add.join(', ') FILTER html %]</li>
[% CASE 'member_of_remove' %]
<li>Данная группа исключена из групп:
[%+ changes.member_of_remove.join(', ') FILTER html %]</li>
[% CASE 'bless_from_add' %]
<li>Следующие группы наделены правом управлять членством в данной группе:
[%+ changes.bless_from_add.join(', ') FILTER html %]</li>
[% CASE 'bless_from_remove' %]
<li>У следующих групп отозвано право управлять членством в данной группе:
[%+ changes.bless_from_remove.join(', ') FILTER html %]</li>
[% CASE 'bless_to_add' %]
<li>Группе дано право управлять членством в группах:
[%+ changes.bless_to_add.join(', ') FILTER html %]</li>
[% CASE 'bless_to_remove' %]
<li>У группы отозвано право управлять членством в группах:
[%+ changes.bless_to_remove.join(', ') FILTER html %]</li>
[% CASE 'visible_from_add' %]
<li>Следующим группам дано право видеть состав данной группы:
[%+ changes.visible_from_add.join(', ') FILTER html %]</li>
[% CASE 'visible_from_remove' %]
<li>У следующих групп отозвано право видеть состав данной группы:
[%+ changes.visible_from_remove.join(', ') FILTER html %]</li>
[% CASE 'visible_to_me_add' %]
<li>Группе дано право видеть состав групп:
[%+ changes.visible_to_me_add.join(', ') FILTER html %]</li>
[% CASE 'visible_to_me_remove' %]
<li>У группы отозвано право видеть состав групп:
[%+ changes.visible_to_me_remove.join(', ') FILTER html %]</li>
[% CASE %]
[% Hook.process('group_updated_fields') %]
[% END %]
[% END %]
</ul>
[% ELSE %]
Никаких изменений группы '[% group.name FILTER html %]'
не задано.
[% END %]
[% ELSIF message_tag == "invalid_column_name" %]
Указанный порядок сортировки содержал одно или несколько недопустимых
имен колонок: <em>[% invalid_fragments.join(', ') FILTER html %]</em>.
Все они были удалены.
[% ELSIF message_tag == "job_queue_depth" %]
[% count FILTER html %]
[% numeral(count, "задание", "задания", "заданий") FILTER html %]
в очереди.
[% ELSIF message_tag == "keyword_created" %]
[% title = "Ключевое слово создано" %]
Ключевое слово <em>[% name FILTER html %]</em> создано.
[% ELSIF message_tag == "keyword_deleted" %]
[% title = "Ключевое слово удалено" %]
Ключевое слово <em>[% keyword.name FILTER html %]</em> удалено.
[% ELSIF message_tag == "keyword_updated" %]
[% title = "Ключевое слово изменено" %]
[% IF changes.keys.size %]
Изменения ключевого слова <em>[% keyword.name FILTER html %]</em>
сохранены:
<ul>
[% IF changes.name.defined %]
<li>
Ключевое слово переименовано в <em>[% keyword.name FILTER html %]</em>.</li>
[% END %]
[% IF changes.description.defined %]
<li>Описание изменено на <em>[% keyword.description FILTER html %]</em></li>
[% END %]
</ul>
[% ELSE %]
Никаких изменений не задано.
[% END %]
[% ELSIF message_tag == "logged_out" %]
[% title = "Выход из системы" %]
[% url = "index.cgi?GoAheadAndLogIn=1" %]
[% link = "Войти заново." %]
<b>Выход из системы успешно завершен</b>.
Cookie с данными о сеансе пользователя удален. При следующем
входе система запросит имя пользователя и пароль.
[% ELSIF message_tag == "login_changed" %]
[% title = "Имя пользователя $terms.Bugzilla изменено" %]
Ваше имя пользователя [% terms.Bugzilla %] изменено.
[% ELSIF message_tag == "migrate_component_created" %]
Создан компонент: [% comp.name FILTER html %]
(в продукте [% product.name FILTER html %])
[% ELSIF message_tag == "migrate_creating_bugs" %]
Создание [% terms.bugs_gen %]...
[% ELSIF message_tag == "migrate_field_created" %]
Новый атрибут: [% field_descs.${field.name} FILTER html %]
([% field.name FILTER html %])
[% ELSIF message_tag == "migrate_product_created" %]
Создан продукт: [% created.name FILTER html %]
[% ELSIF message_tag == "migrate_reading_bugs" %]
Анализ [% terms.bugs_gen %]...
[% ELSIF message_tag == "migrate_reading_products" %]
Анализ продуктов...
[% ELSIF message_tag == "migrate_reading_users" %]
Анализ пользователей...
[% ELSIF message_tag == "migrate_translating_bugs" %]
Конвертация данных [% terms.bugs_gen %] для использования в
[%+ terms.Bugzilla %]...
[% ELSIF message_tag == "migrate_user_created" %]
Создан пользователь: [% created.email FILTER html %]
[% IF password %] Пароль: [% password FILTER html %][% END %]
[% ELSIF message_tag == "migrate_value_created" %]
[% IF product.defined %]
Продукт [% product.name FILTER html %].
[% END %]
Создано значение атрибута [%+ field_descs.${field.name} FILTER html %]:
[% value FILTER html %]
[% ELSIF message_tag == "milestone_created" %]
[% title = "План создан" %]
План <em>[% milestone.name FILTER html %]</em> создан.
[% ELSIF message_tag == "milestone_deleted" %]
[% title = "План удален" %]
План <em>[% milestone.name FILTER html %]</em> удален.
[% IF milestone.bug_count %]
Запланированные [%+ terms.bugs %] перенесены в
план по умолчанию <em>[% product.default_milestone FILTER html %]</em> для продукта.
[% END %]
[% ELSIF message_tag == "milestone_updated" %]
[% title = "План изменен" %]
[% IF changes.size %]
Изменения плана <em>[% milestone.name FILTER html %]</em>
сохранены:
<ul>
[% IF changes.value.defined %]
<li>Название плана изменено на <em>[% milestone.name FILTER html %]</em></li>
[% END %]
[% IF changes.sortkey.defined %]
<li>Порядок сортировки изменен на <em>[% milestone.sortkey FILTER html %]</em>
[% END %]
[% IF changes.isactive.defined %]
<li>[% milestone.is_active ? "Включён" : "Отключён" %] для [% terms.bugs_gen %]</li>
[% END %]
</ul>
[% ELSE %]
Никаких изменений плана <em>[% milestone.name FILTER html %]</em> не задано.
[% END %]
[% ELSIF message_tag == "parameters_updated" %]
[% title = "Изменения настроек" %]
[% IF param_changed.size > 0 %]
[% FOREACH param = param_changed %]
Изменена настройка <em>[% param FILTER html %]</em><br>
[% IF param == 'utf8' && Param('utf8') %]
<strong>Следует немедленно выполнить <kbd>checksetup.pl</kbd>.</strong><br>
[% END %]
[% END %]
[% ELSE %]
Изменений не задано.
[% END %]
[% IF shutdown_is_active == 1 %]
<hr>
Доступ к [% terms.Bugzilla %] запрещен. Для разрешения доступа
очистите поле <em>shutdownhtml</em>.
[% END%]
[% ELSIF message_tag == "password_change_canceled" %]
[% title = "Отмена запроса на изменение пароля" %]
Запрос на изменение пароля аннулирован.
[% ELSIF message_tag == "password_change_request" %]
[% title = "Запрос на изменение пароля" %]
Жетон на изменение пароля пользователя отправлен по электронной
почте. Для изменения пароля следуйте указаниям в сообщении
электронной почты.
[% ELSIF message_tag == "password_changed" %]
[% title = "Пароль изменен" %]
Ваш пароль был изменен.
[% ELSIF message_tag == "flag_type_created" %]
[% title = BLOCK %]Вид согласования '[% name FILTER html %]' создан[% END %]
Вид согласования <em>[% name FILTER html %]</em> успешно создан.
[% ELSIF message_tag == "flag_type_updated" %]
[% title = BLOCK %]Вид согласования '[% flagtype.name FILTER html %]' обновлён[% END %]
[% IF changes.size %]
Изменения вида согласования <em>[% flagtype.name FILTER html %]</em>
были сохранены:
<ul>
[% IF changes.is_active.defined %]
<li>Вид согласования теперь [% flagtype.is_active ? "активен" : "неактивен" %]</li>
[% END %]
[% IF changes.name.defined %]
<li>Вид согласования переименован в <em>[% flagtype.name FILTER html %]</em></li>
[% END %]
[% IF changes.description.defined %]
<li>Описание обновлено на <em>[% flagtype.description FILTER html %]</em></li>
[% END %]
[% IF changes.cc_list.defined %]
[% IF flagtype.cc_list %]
<li>Список подписчиков обновлён на <em>[% flagtype.cc_list FILTER html %]</em></li>
[% ELSE %]
<li>Список подписчиков теперь пуст</li>
[% END %]
[% END %]
[% IF changes.sortkey.defined %]
<li>Порядок сортировки обновлён на <em>[% flagtype.sortkey FILTER html %]</em></li>
[% END %]
[% IF changes.is_requestable.defined %]
<li>Вид согласования [% "более не" UNLESS flagtype.is_requestable %] разрешено запрашивать</li>
[% END %]
[% IF changes.is_requesteeble.defined AND flagtype.is_requestable %]
<li>
Вид согласования [% "более не" UNLESS flagtype.is_requesteeble %] разрешено
запрашивать конкретным пользователям
</li>
[% END %]
[% IF changes.is_multiplicable.defined %]
<li>Вид согласования [% "более не" UNLESS flagtype.is_multiplicable %] является многократным</li>
[% END %]
[% IF changes.grant_group_id.defined %]
[% IF flagtype.grant_group_id %]
<li>Группа ответственных обновлена на <em>[% flagtype.grant_group.name FILTER html %]</em></li>
[% ELSE %]
<li>Группа ответственных удалена</li>
[% END %]
[% END %]
[% IF changes.request_group_id.defined %]
[% IF flagtype.request_group_id %]
<li>Группа инициаторов обновлена на <em>[% flagtype.request_group.name FILTER html %]</em></li>
[% ELSE %]
<li>Группа инициаторов удалена</li>
[% END %]
[% END %]
[% IF changes.inclusions.defined || changes.exclusions.defined %]
<li>Списки включений и исключений были обновлены</li>
[% END %]
</ul>
[% ELSE %]
Изменений в виде согласования не произведено <em>[% flagtype.name FILTER html %]</em>.
[% END %]
[% ELSIF message_tag == "flag_type_deleted" %]
[% title = BLOCK %]Вид согласования '[% name FILTER html %]' удален[% END %]
Вид согласования <em>[% name FILTER html %]</em> удален.
[% ELSIF message_tag == "flag_type_deactivated" %]
[% title = BLOCK %]Вид согласования '[% name FILTER html %]' запрещен[% END %]
Вид согласования <em>[% flag_type.name FILTER html %]</em> запрещен.
[% ELSIF message_tag == "install_admin_get_email" %]
Введите адрес электронной почты администратора:
[% ELSIF message_tag == "install_admin_get_name" %]
Введите полное имя администратора:
[% ELSIF message_tag == "install_admin_get_password" %]
Введите пароль учетной записи администратора:
[% ELSIF message_tag == "install_admin_created" %]
Пользователю [% user.login FILTER html %] даны права администратора.
[% ELSIF message_tag == "install_admin_setup" %]
Не установлен пользователь с правами администратора.
Или это первый вход в [% terms.Bugzilla %], или
права существующего администратора были отозваны.
[% ELSIF message_tag == "install_column_add" %]
Добавление поля '[% column FILTER html %]' в таблицу '[% table FILTER html %]'...
[% ELSIF message_tag == "install_column_drop" %]
Удаление поля '[% column FILTER html %]' из таблицы '[% table FILTER html %]'...
[% ELSIF message_tag == "install_column_rename" %]
Переименование поля '[% old FILTER html %]' в '[% new FILTER html %]'...
[% ELSIF message_tag == "install_confirm_password" %]
Повторите ввод пароля:
[% ELSIF message_tag == "install_default_classification" %]
Создание раздела по умолчанию '[% name FILTER html %]'...
[% ELSIF message_tag == "install_default_product" %]
Создание первого тестового продукта '[% name FILTER html %]'...
[% ELSIF message_tag == "install_file_perms_fix" %]
Настройка прав доступа к файлам...
[% ELSIF message_tag == "install_fk_add" %]
Добавление ссылочного ключа: [% table FILTER html %].[% column FILTER html %] -&gt; [% fk.TABLE FILTER html %].[% fk.COLUMN FILTER html %]...
[% ELSIF message_tag == "install_fk_drop" %]
Удаление ссылочного ключа: [% table FILTER html %].[% column FILTER html %] -&gt; [% fk.TABLE FILTER html %].[% fk.COLUMN FILTER html %]...
[% ELSIF message_tag == "install_fk_invalid" %]
ОШИБКА: Обнаружены недопустимые значения поля [% column FILTER html %] в таблице [% table FILTER html %].
(Эти значения отсутствуют в поле [%+ foreign_column FILTER html %] таблицы
[% foreign_table FILTER html %].)
Прежде чем продолжить checksetup, необходимо исправить эти значения,
либо удалением строк таблицы, либо изменением значений поля
[% column FILTER html %] в таблице [% table FILTER html %] на одно из значений поля [% foreign_table FILTER html %].[% foreign_column FILTER html %].
Недопустимые значения [% table FILTER html %].[% column FILTER html %]:
[%+ values.join(', ') FILTER html %]
[% ELSIF message_tag == "install_fk_invalid_fixed" %]
ВНИМАНИЕ: Недопустимые значения поля [% table FILTER html %].[% column FILTER html %],
которые были [% IF action == 'delete' %]удалены[% ELSE %]очищены (NULL)[% END %]:
[%+ values.join(', ') FILTER html %]
[% ELSIF message_tag == "install_fk_setup" %]
Настройка чужих ключей...
[% ELSIF message_tag == "install_group_create" %]
Создание группы [% name FILTER html %]...
[% ELSIF message_tag == "install_groups_setup" %]
Создание групп по умолчанию...
[% ELSIF message_tag == "install_setting_new" %]
Создание настройки '[% name FILTER html %]'
[% ELSIF message_tag == "install_setting_setup" %]
Установка настроек пользователя...
[% ELSIF message_tag == "install_success" %]
checksetup.pl завершён.
[% ELSIF message_tag == "install_table_drop" %]
Удаление таблицы '[% name FILTER html %]'...
[% ELSIF message_tag == "install_table_rename" %]
Переименование таблицы '[% old FILTER html %]' в '[% new FILTER html %]'...
[% ELSIF message_tag == "install_urlbase_default" %]
Теперь по окончании установки [% terms.Bugzilla %] перейдите на страницу
'Настройки системы' (по ссылке внизу страницы учетной записи
администратора) для проверки значений настроек - в частности,
необходимо настроить параметр 'urlbase'.
[% ELSIF message_tag == "install_reset_password" %]
Укажите пароль для пользователя [% user.login FILTER html %]:
[% ELSIF message_tag == "install_reset_password_done" %]
Установлен новый пароль.
[% ELSIF message_tag == "install_webservergroup_empty" %]
****************************************************************************
ВНИМАНИЕ! Не указано значение параметра "webservergroup" в файле
localconfig. Это означает что файлы и каталоги, которые должны быть доступны
для изменения веб-серверу, будут доступны для изменения всем, а другие файлы
(в частности, localconfig, в котором хранится пароль доступа базы данных)
должен быть доступен всем. Это приведет к тому, что любые пользователи с
локальным доступом к серверу могут выполнить любые изменения а экземпляре
[%+ terms.Bugzilla %], и скорее всего смогут запустить произвольный код
Perl с привилегиями веб-сервера.
Следует ОБЯЗАТЕЛЬНО установить параметр "webservergroup".
****************************************************************************
[% ELSIF message_tag == "install_webservergroup_not_in" %]
Внимание: вы указали значение параметра "webservergroup" в файле
localconfig, но не являетесь администратором ([% constants.ROOT_USER FILTER html %])
и не входите в эту группу. Это может вызвать проблемы настройки доступа
к файлам и ухудшить безопасность системы. Если при выполнении скриптов [% terms.Bugzilla %]
возникают ошибки, зарегистрируйтесь как [% constants.ROOT_USER FILTER html %] и вызовите скрипт повторно,
либо добейтесь включения в группу, либо измените значение параметра "webservergroup".
[% ELSIF message_tag == "install_webservergroup_windows" %]
Внимание: вы указали значение параметра "webservergroup" в файле [% constants.bz_locations.localconfig FILTER html %].
Обратите внимание, что в среде Windows это не приводит к ожидаемому
уровню безопасности автоматически.
Убедитесь, что права доступа к файлам в каталоге [% terms.Bugzilla %]
достаточно строги. Не допускайте излишних прав на изменение.
[% ELSIF message_tag == "install_workflow_init" %]
Настройка состояний по умолчанию...
[% ELSIF message_tag == "product_created" %]
[% title = "Продукт создан" %]
Продукт <em>[% product.name FILTER html %]</em> создан.
[% ELSIF message_tag == "product_deleted" %]
[% title = "Продукт удален" %]
Продукт <em>[% product.name FILTER html %]</em>, его версии,
компоненты, планы и настройки доступа удалены.
[% IF product.bug_count %]
Все [% terms.bugs %], зарегистрированные для продукта, и все ссылки
на них также удалены.
[% END %]
[% ELSIF message_tag == "product_invalid" %]
[% title = "Описания компонентов $terms.Bugzilla" %]
Продукт <em>[% product FILTER html %]</em> не существует либо
отсутствуют права доступа к нему. Список доступных продуктов:
[% ELSIF message_tag == "report_created" %]
Вы сохранили новый отчёт с именем <em>[% reportname FILTER html %]</em>.
[% ELSIF message_tag == "report_deleted" %]
Отчёт <em>[% reportname FILTER html %]</em> удалён.
[% ELSIF message_tag == "report_updated" %]
Сохранённый отчёт <em>[% reportname FILTER html %]</em> был обновлён.
[% ELSIF message_tag == "remaining_time_zeroed" %]
Поле [% field_descs.remaining_time FILTER html %] обнулено
автоматически при закрытии [% terms.bug_gen %].
[% ELSIF message_tag == "sanitycheck" %]
[%# We use this way to call sanitycheck-specific messages so that
# we can still use get_text(). %]
[% PROCESS "admin/sanitycheck/messages.html.tmpl" %]
[% ELSIF message_tag == "series_all_open" %]
Все открытые
[% ELSIF message_tag == "series_all_closed" %]
Все закрытые
[% ELSIF message_tag == "series_subcategory" %]
-Все-
[% ELSIF message_tag == "sudo_started" %]
[% title = "Работа от имени другого пользователя" %]
Начат сеанс от имени пользователя ([% target FILTER html %]).
Ближайшие 6 часов или до завершения сеанса, все изменения
выполняются от имени и с привилегиями указанного пользователя.
[% ELSIF message_tag == "sudo_ended" %]
[% title = "Работа от имени другого пользователя завершена" %]
Завершен сеанс от имени другого пользователя. Все будущие действия
будут происходить под вашей учётной записью.
[% ELSIF message_tag == "series_created" %]
[% title = "Серия данных создана" %]
Серия <em>[% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %]</em>
создана. Обратите внимание: может потребоваться не менее
[%+ series.frequency * 2 %] дней для накопления достаточного
количества данных для построения диаграмм.
[% ELSIF message_tag == "series_deleted" %]
[% title = "Серия данных удалена" %]
Серия <em>[% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %]</em>
удалена.
[% ELSIF message_tag == "shutdown" %]
[% title = "Система $terms.Bugzilla остановлена." %]
[% Param("shutdownhtml") %]
[% IF userid %]
<p>В целях безопасности произведен автоматический выход из системы.
Данные о сеансе пользователя удалены.
[% END %]
[% ELSIF message_tag == "term" %]
[% terms.$term FILTER html %]
[% ELSIF message_tag == "unexpected_flag_types" %]
Некоторые виды согласований не могут быть установлены. Проверьте Ваши изменения.
[% ELSIF message_tag == "user_match_failed" %]
Введенное имя пользователя неизвестно, поле [% match_field FILTER html %]
очищено.
[% ELSIF message_tag == "user_match_multiple" %]
Введенное имя пользователя неоднозначно, поле
[% match_field FILTER html %] очищено.
[% ELSIF message_tag == "version_created" %]
[% title = "Версия создана" %]
Версия <em>[% version.name FILTER html %]</em> продукта
<em>[% product.name FILTER html %]</em> создана.
[% ELSIF message_tag == "version_deleted" %]
[% title = "Версия удалена" %]
Версия <em>[% version.name FILTER html %]</em> продукта
<em>[% product.name FILTER html %]</em> удалена.
[% ELSIF message_tag == "version_updated" %]
[% title = "Версия изменена" %]
[% IF changes.size %]
Изменения в версии <em>[% version.name FILTER html %]</em>
были сохранены:
<ul>
[% IF changes.value.defined %]
<li>Версия переименована в <em>[% version.name FILTER html %]</em></li>
[% END %]
[% IF changes.isactive.defined %]
<li>[% version.is_active ? "Включена" : "Отключена" %] для [% terms.bugs_gen %]</li>
[% END %]
</ul>
[% ELSE %]
Никаких изменений версии <em>[% version.name FILTER html %] не произведено</em>.
[% END %]
[% ELSIF message_tag == "whine_query_failed" %]
Запрос '[% query_name FILTER html %]' произведённый [% author.login FILTER html %]
не сработал: [% reason FILTER html %]
[% ELSIF message_tag == "workflow_updated" %]
Состояния изменены.
[% END %]
[% END %]
[% IF !message %]
[% message = Hook.process('messages') %]
[% END %]
[%# Give sensible error if the message function is used incorrectly. #%]
[% IF !message %]
[% message = BLOCK %]
Некорректный вызов функции выдачи сообщений [% terms.Bugzilla %].
Не определен код сообщения '[% message_tag %]'. Для выдачи сообщения
код должен быть развернут в сообщение об ошибке в файле
<kbd>messages.html.tmpl</kbd>.<br>
<br>
Если Вы — пользователь [% terms.Bugzilla %], сохраните это сообщение
и отправьте его по адресу [% Param('maintainer') %].
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/variables.none.tmpl" %]
[% SET reason_descs = {
${constants.REL_ASSIGNEE} => "Вы — исполнитель ${terms.bug_gen}.",
${constants.REL_REPORTER} => "Вы зарегистрировали ${terms.bug_acc}.",
${constants.REL_QA} => "Вы — ответственный за приемку ${terms.bug_gen}.",
${constants.REL_CC} => "Вы подписаны на ${terms.bug_acc}.",
${constants.REL_GLOBAL_WATCHER} => "Вы получаете все изменения ${terms.bugs_gen}.",
} %]
[% SET watch_reason_descs => {
${constants.REL_ASSIGNEE} =>
"Вы замещаете исполнителя ${terms.bug_gen}.",
${constants.REL_REPORTER} =>
"Вы замещаете зарегистрировавшего ${terms.bug_acc}.",
${constants.REL_QA} =>
"Вы замещаете ответственного за приемку ${terms.bug_gen}.",
${constants.REL_CC} =>
"Вы замещаете кого-либо из подписчиков ${terms.bug_gen}.",
} %]
[% Hook.process('end') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# Remember to PROCESS rather than INCLUDE this template. %]
[% PROCESS global/variables.none.tmpl %]
[% setting_descs = {
"comment_sort_order" => "Порядок отображения комментариев при просмотре $terms.bug_gen",
"csv_colsepchar" => "Разделитель полей формата CSV",
"display_quips" => "Отображать цитаты в списках $terms.bugs_gen",
"zoom_textareas" => "Увеличивать текстовые поля при редактировании (требуется JavaScript)",
"newest_to_oldest" => "Новые вверху",
"newest_to_oldest_desc_first" => "Новые вверху, после описания",
"off" => "Выкл",
"oldest_to_newest" => "Новые внизу",
"on" => "Вкл",
"post_bug_submit_action" => "После редактирования $terms.bug_gen",
"next_bug" => "Перейти к следующей $terms.bug_dat в списке",
"same_bug" => "Вернуться к этой $terms_dat",
"standard" => "Классическая",
"skin" => "Тема оформления $terms.Bugzilla (skin)",
"nothing" => "Ничего",
"state_addselfcc" => "Автоматически добавлять мне подписку на изменяемые $terms.bugs",
"always" => "Всегда",
"never" => "Никогда",
"cc_unless_role" => "Только при отсутствии других ролей",
"lang" => "Язык сообщений электронной почты",
"quote_replies" => "Цитировать комментарий при ответе",
"quoted_reply" => "Цитировать комментарий полностью",
"simple_reply" => "Только ссылка на номер комментария",
"comment_box_position" => "Позиция блока дополнительных комментариев",
"before_comments" => "До других комментариев",
"after_comments" => "После других комментариев",
"timezone" => "Часовой пояс отображения даты и времени",
"local" => "Совпадает с настройкой сервера",
"quicksearch_fulltext" => "Включать комментарии при выполнении быстрого поиска (медленнее)",
"email_format" => "Предпочтительный формат почтовых сообщений",
"html" => "HTML",
"text_only" => "Только текст",
"requestee_cc" => "Автоматически добавлять меня в список подписки $terms.bugs_gen, патчи для которых меня просят проверить",
"bugmail_new_prefix" => "Добавлять 'Новая:' в тему письма, отправляемого при регистрации новой $terms.bug_gen",
}
%]
[% Hook.process('settings') %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# bug.bug_id: integer. Number of current bug (for navigation purposes)
#%]
[% PROCESS global/variables.none.tmpl %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% IF NOT (cgi.user_agent("MSIE [1-6]") OR cgi.user_agent("Mozilla/4")) %]
<link rel="Top" href="[% urlbase FILTER html %]">
[%# *** Attachment *** %]
[% IF attachment && attachment.bug_id %]
<link rel="Up" href="show_bug.cgi?id=[% attachment.bug_id FILTER none %]">
[% END %]
[%# *** Dependencies, Activity, Print-version *** %]
[% IF bug %]
<link rel="Show" title="Дерево зависимостей"
href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">
[% IF Param('webdotbase') %]
<link rel="Show" title="Диаграмма зависимостей"
href="showdependencygraph.cgi?id=[% bug.bug_id %]">
[% END %]
<link rel="Show" title="История [% terms.bug_gen %]"
href="show_activity.cgi?id=[% bug.bug_id %]">
<link rel="Show" title="Версия для печати"
href="show_bug.cgi?format=multiple&amp;id=[% bug.bug_id %]">
[% END %]
[%# *** Saved Searches *** %]
[% IF user.showmybugslink %]
[% user_login = user.login FILTER uri %]
<link rel="Условия&nbsp;отбора" title="Мои [% terms.Bugs %]"
href="[% Param('mybugstemplate').replace('%userid%', user_login) %]">
[% END %]
[% FOREACH q = user.queries_subscribed %]
<link rel="Условие&nbsp;отбора"
title="[% q.name FILTER html %] ([% q.user.login FILTER html %])"
href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
[% q.name FILTER uri %]&amp;sharer_id=
[% q.user.id FILTER uri %]">
[% END %]
[%# *** Bugzilla Administration Tools *** %]
[% IF user.login %]
[% '<link rel="Administration" title="Система"
href="editparams.cgi">' IF user.in_group('tweakparams') %]
[% '<link rel="Administration" title="Пользователи"
href="editusers.cgi">' IF user.in_group('editusers') %]
[% '<link rel="Administration" title="Продукты" href="editproducts.cgi">'
IF user.in_group('editcomponents') || user.get_products_by_permission("editcomponents").size %]
[% '<link rel="Administration" title="Согласования"
href="editflagtypes.cgi">' IF user.in_group('editcomponents') %]
[% '<link rel="Administration" title="Группы"
href="editgroups.cgi">' IF user.in_group('creategroups') %]
[% '<link rel="Administration" title="Ключевые слова"
href="editkeywords.cgi">' IF user.in_group('editkeywords') %]
[% '<link rel="Administration" title="Оповещения"
href="editwhines.cgi">' IF user.in_group('bz_canusewhines') %]
[% '<link rel="Administration" title="Проверка системы"
href="sanitycheck.cgi">' IF user.in_group('editcomponents') %]
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# Migration note: this whole file corresponds to the old %commandmenu%
substitution param in 'footerhtml' %]
[% PROCESS global/variables.none.tmpl %]
<ul id="useful-links">
<li id="links-actions">
[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_bottom" %]
</li>
[%# Saved searches %]
[% IF user.showmybugslink OR user.queries.size
OR user.queries_subscribed.size
%]
[% print_pipe = 0 %]
<li id="links-saved">
<ul class="links">
[% IF user.showmybugslink %]
[% filtered_username = user.login FILTER uri %]
<li><a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">Мои&nbsp;[% terms.bugs %]</a></li>
[% print_pipe = 1 %]
[% END %]
[% FOREACH q = user.queries %]
[% IF q.link_in_footer %]
<li>[% '<span class="separator">| </span>' IF print_pipe %]
<a href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% q.name FILTER uri %]">[% q.name FILTER html %]</a></li>
[% print_pipe = 1 %]
[% END %]
[% END %]
[% new_line = print_pipe %]
[% print_pipe = 0 %]
[% FOREACH q = user.queries_subscribed %]
[% IF new_line %]
<br>
[% new_line = 0 %]
[% END %]
<li>
[% '<span class="separator">| </span>' IF print_pipe %]
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
[% q.name FILTER uri %]&amp;sharer_id=
[% q.user.id FILTER uri %]"
class="shared"
title="Опубликован пользователем [% q.user.identity FILTER html %]"
>[% q.name FILTER html FILTER no_break %]</a></li>
[% print_pipe = 1 %]
[% END %]
</ul>
</li>
[% END %]
[% IF user.reports.size %]
<li id="reports-saved">
<ul class="links">
[% FOREACH r = user.reports %]
<li>[% '<span class="separator">| </span>' IF print_pipe %]
<a href="report.cgi?[% r.query FILTER html %]&amp;saved_report_id=
[%~ r.id FILTER uri %]">[% r.name FILTER html %]</a></li>
[% print_pipe = 1 %]
[% END %]
</ul>
</li>
[% END %]
[%# Sections of links to more things users can do on this installation. %]
[% Hook.process("end") %]
</ul>
This source diff could not be displayed because it is too large. You can view the blob instead.
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# This is a list of terms that may be changed to "brand" the Bugzilla
# instance (for example, referring to "bugs" as "issues".) When used, these
# strings are used in several different types of content, and are not
# protected with Template-Toolkit FILTERs. Consequently, no special
# characters are allowed.
#
# Remember to PROCESS rather than INCLUDE this template.
#%]
[% terms = {
"bug" => "задача",
"bug_gen" => "задачи",
"bug_dat" => "задаче",
"bug_acc" => "задачу",
"bug_abl" => "задачей",
"bug_obj" => "задаче",
"Bug" => "Задача",
"Bug_gen" => "Задачи",
"Bug_dat" => "Задаче",
"Bug_acc" => "Задачу",
"Bug_abl" => "Задачей",
"Bug_obj" => "Задаче",
"abug" => "задача", # стараемся не использовать в Bugzilla-ru
"ABug" => "Задача", # стараемся не использовать в Bugzilla-ru
"bugs" => "задачи",
"bugs_gen" => "задач",
"bugs_dat" => "задачам",
"bugs_acc" => "задачи",
"bugs_abl" => "задачами",
"bugs_obj" => "задачах",
"Bugs" => "Задачи",
"Bugs_gen" => "Задач",
"Bugs_dat" => "Задачам",
"Bugs_acc" => "Задачи",
"Bugs_abl" => "Задачами",
"Bugs_obj" => "Задач",
"zeroSearchResults" => "Задач не найдено",
"Bugzilla" => "Etersoft Bugzilla"
}
%]
[% MACRO numeral(n, name1, name2, name5) BLOCK %]
[% n1 = n % 10 %]
[% n10 = n % 100 - n1 %]
[% IF n10 == 10 || n1 == 0 || n1 > 4 %]
[% name5 %]
[% ELSIF n1 == 1 %]
[% name1 %]
[% ELSE %]
[% name2 %]
[% END %]
[% END %]
[% USE Hook %]
[% Hook.process("end") %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# release: a hash containing data about new releases, if any.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "$terms.Bugzilla: главная страница"
header = "Главная страница"
header_addl_info = "версия ${constants.BUGZILLA_VERSION} (ru: 4.4.4)"
style_urls = [ 'skins/standard/index.css' ]
%]
<script type="text/javascript">
<!--
function onLoadActions() {
quicksearchHelpText('quicksearch_main', 'show');
if( window.external.AddSearchProvider ){
YAHOO.util.Dom.removeClass('quicksearch_plugin', 'bz_default_hidden');
}
document.getElementById('quicksearch_top').focus();
}
var quicksearch_message = "Введите номер [% terms.bug_gen %] или текст для поиска";
function checkQuicksearch( form ) {
if (form.quicksearch.value == '' || form.quicksearch.value == quicksearch_message ) {
alert('Введите данные для поиска.');
return false;
}
return true;
}
function quicksearchHelpText(el_id, action){
var el = document.getElementById(el_id);
if ( action == "show") {
if( el.value == "" ) {
el.value = quicksearch_message
YAHOO.util.Dom.addClass(el, "quicksearch_help_text");
}
} else {
if( el.value == quicksearch_message ) {
el.value = "";
YAHOO.util.Dom.removeClass(el, "quicksearch_help_text");
}
}
}
YAHOO.util.Event.onDOMReady(onLoadActions);
//-->
</script>
[% IF release %]
<div id="new_release">
[% IF release.data %]
[% IF release.deprecated %]
<p>[% terms.Bugzilla %] [%+ release.deprecated FILTER html %] больше
не поддерживается. Для поддержания безопасности Вашей системы на должном уровне
настоятельно рекомендуется обновить версию.</p>
[% END %]
<p>Новая версия [% terms.Bugzilla %] ([% release.data.latest_ver FILTER html %])
доступна здесь:
<a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br>
Дата выпуска: [% release.data.date FILTER html %]</p>
<p class="notice">Данное сообщение отображается только пользователям с правами администратора.
Настройка этого сообщения возможна в
<a href="editparams.cgi?section=general#upgrade_notification_desc">настройках системы</a>.</p>
[% ELSIF release.error == "cannot_download" %]
<p>Не удалось загрузить удалённый файл <a href="[% constants.REMOTE_FILE FILTER html %]">
[%~ constants.REMOTE_FILE FILTER html %]</a> (причина: [% release.reason FILTER html %]).<br>
Либо удалённый сервер временно недоступен, либо веб-сервер не имеет доступа в Интернет.
При использовании proxy установите
параметр <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a>.</p>
[% ELSIF release.error == "no_write" %]
<p>Ошибка создания локального файла XML '[% constants.LOCAL_FILE FILTER html %]'
(причина: [% release.reason FILTER html %]).<br>
Убедитесь что у веб-сервера достаточно прав на создание файла в этом каталоге.
[% ELSIF release.error == "no_update" %]
<p>Ошибка обновления локального файла XML'[% constants.LOCAL_FILE FILTER html %]'.
Убедитесь что у веб-сервера достаточно прав для изменения файла.</p>
[% ELSIF release.error == "no_access" %]
<p>Ошибка чтения локального файла XML '[% constants.LOCAL_FILE FILTER html %]'.
Проверьте права доступа к файлу.</p>
[% ELSIF release.error == "corrupted" %]
<p>Недопустимый формат локального файла XML '[% constants.LOCAL_FILE FILTER html %]'.
Удалите его и обновите эту страницу.</p>
[% ELSIF release.error == "unknown_parameter" %]
<p>Недопустимое значение параметра оповещения об обновлениях '[% Param("upgrade_notification") FILTER html %]'
Проверьте значение параметра на странице
<a href="editparams.cgi?section=general#upgrade_notification_desc">настройки системы</a>.</p>
[% END %]
</div>
[% END %]
<div id="page-index">
<table>
<tr>
<td>
<h1 id="welcome"> Добро пожаловать в [% terms.Bugzilla %]</h1>
<div class="intro">[% Hook.process('intro') %]</div>
<div class="bz_common_actions">
<ul>
<li>
<a id="enter_bug" href="enter_bug.cgi"><span>Зарегистрировать [% terms.bug_acc %]</span></a>
</li>
<li>
<a id="query" href="query.cgi"><span>Найти</span></a>
</li>
<li>
<a id="account"
[% IF user.id %]
href="userprefs.cgi"><span>Настройки пользователя</span></a>
[% ELSIF Param('createemailregexp')
&& user.authorizer.user_can_create_account
%]
href="createaccount.cgi"><span>Зарегистрировать нового пользователя</span></a>
[% ELSE %]
href="?GoAheadAndLogIn=1"><span>Войти</span></a>
[% END %]
</li>
</ul>
</div>
<form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi"
onsubmit="return checkQuicksearch(this);">
<div>
<input id="quicksearch_main" type="text" name="quicksearch"
title="Быстрый поиск"
onfocus="quicksearchHelpText(this.id, 'hide');"
onblur="quicksearchHelpText(this.id, 'show');"
>
<input id="find" type="submit" value="Найти">
<ul class="additional_links" id="quicksearch_links">
<li>
<a href="page.cgi?id=quicksearch.html">Справка по поиску</a>
</li>
<li class="bz_default_hidden" id="quicksearch_plugin">
|
<a href="javascript:window.external.AddSearchProvider('[% urlbase FILTER html %]search_plugin.cgi')">
Установить надстройку для быстрого поиска
</a>
</li>
</ul>
<ul class="additional_links">
<li>
<a href="[% docs_urlbase FILTER html %]using.html">
Руководство пользователя [% terms.Bugzilla -%]</a>
</li>
<li>
|
<a href="page.cgi?id=release-notes.html">Сопроводительная записка к релизу</a>
</li>
[% Hook.process('additional_links') %]
</ul>
</div>
</form>
<div class="outro">[% Hook.process('outro') %]</div>
</td>
</tr>
</table>
</div>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Формат вывода"
javascript_urls = "js/change-columns.js"
onload = "initChangeColumns()"
%]
<p>
Выберите поля которые вы хотите видеть в списке [% terms.bugs_gen %].
(Требуется поддержка cookies)
</p>
[% PROCESS "global/field-descs.none.tmpl" %]
[% field_descs.short_short_desc = "Аннотация (первые 60 символов)" %]
[% field_descs.short_desc = "Аннотация (полная)" %]
[% field_descs.assigned_to_realname = "$field_descs.assigned_to Real Name" %]
[% field_descs.reporter_realname = "$field_descs.reporter Real Name" %]
[% field_descs.qa_contact_realname = "$field_descs.qa_contact Real Name" %]
[%# Create a mapping of field descriptions to field names, so that
# the "Available Columns" list can be sorted alphabetically by
# field description.
#%]
[% SET available_columns = {} %]
[% FOREACH column = columns.keys %]
[% NEXT IF collist.contains(column) %]
[%# We lowecase the keys so that the sort happens case-insensitively. %]
[% SET column_desc = field_descs.$column || column FILTER lower %]
[% available_columns.$column_desc = column %]
[% END %]
<form name="changecolumns" action="colchange.cgi" onsubmit="change_submit();">
<input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]">
<table>
<tr>
<th><div id="avail_header" class="bz_default_hidden">Доступные поля</div></th>
<th></th>
<th colspan="2">Выбранные поля</th>
</tr>
<tr>
<td>
<select name="available_columns" id="available_columns"
size="15" multiple="multiple" onchange="updateView();"
class="bz_default_hidden">
</select>
</td>
<td>
<button type="button" id="select_button" name="select"
class="bz_default_hidden arrow_button"
onclick="move_select()">&rarr;</button>
<br><br>
<button type="button" id="deselect_button" name="deselect"
class="bz_default_hidden arrow_button"
onclick="move_deselect()">&larr;</button>
</td>
<td>
<select name="selected_columns" id="selected_columns"
size="15" multiple="multiple" onchange="updateView();">
[% FOREACH column = collist %]
<option value="[% column FILTER html %]" selected="selected">
[% (field_descs.${column} || column) FILTER html %]
</option>
[% END %]
[% FOREACH key = available_columns.keys.sort %]
[% SET column = available_columns.$key %]
<option value="[% column FILTER html %]">
[%# Don't display the lower-cased column description,
# display the correct-case one. %]
[% (field_descs.$column || column) FILTER html %]
</option>
[% END %]
</select>
</td>
<td>
<button type="button" id="up_button" name="up"
class="bz_default_hidden arrow_button"
onclick="move_up()">&uarr;</button>
<br><br>
<button type="button" id="down_button" name="down"
class="bz_default_hidden arrow_button"
onclick="move_down()">&darr;</button>
</td>
</tr>
</table>
<p>
<input id="nosplitheader" type="radio" name="splitheader" value="0"
[%+ "checked='checked'" IF NOT splitheader %]>
<label for="nosplitheader">
Стандартная шапка
</label>
<br>
<input id="splitheader" type="radio" name="splitheader" value="1"
[%+ "checked='checked'" IF splitheader %]>
<label for="splitheader">
Компактная шапка
</label>
</p>
[% IF saved_search %]
<p>
<input type="hidden" name="saved_search"
value="[% saved_search.id FILTER html%]" >
<input type="hidden" name="token"
value="[% issue_hash_token([saved_search.id, saved_search.name]) FILTER html %]">
<input type="checkbox" id="save_columns_for_search" checked="checked"
name="save_columns_for_search" value="1">
<label for="save_columns_for_search">Сохранить формат вывода
для условия отбора '[% saved_search.name FILTER html %]'</label>
</p>
[% ELSE %]
<input type="hidden" name="token"
value="[% issue_hash_token(['default-list']) FILTER html %]">
[% END %]
<p>
<input type="submit" id="change" value="Изменить поля">
</p>
<input type="submit" id="resetit" name="resetit"
value="Вернуть стандартные значения [% terms.Bugzilla %]">
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% dontchange = "--не_изменять--" %]
<input type="hidden" name="dontchange" value="[% dontchange FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
<script type="text/javascript">
function SetCheckboxes(value) {
var elements = document.forms.changeform.getElementsByTagName('input'),
numelements = elements.length,
item, i;
for (i = 0; i < numelements; i++) {
item = elements[i];
if (item.type === 'checkbox' && item.name.match(/^id_/)) {
item.checked = value;
}
}
}
document.write(' <input type="button" name="uncheck_all" value="Убрать все" onclick="SetCheckboxes(false);">');
document.write(' <input type="button" name="check_all" value="Выбрать все" onclick="SetCheckboxes(true);">');
</script>
<hr>
<p style="font-size:smaller">
Для группового редактирования [% terms.bugs_gen %]:</p>
<ol style="font-size:smaller">
<li>Отметьте [% terms.bugs %] в списке сверху.</li>
<li>Введите изменения в предлагаемой форме.
При необходимости добавьте комментарий.</li>
<li>Нажмите кнопку <em>Сохранить</em>.</li>
</ol>
<table id="form">
<tr>
<th><label for="product">Продукт:</label></th>
<td>
[% PROCESS selectmenu menuname = "product"
menuitems = products
property = "name" %]
</td>
<th><label for="version">Версия:</label></th>
<td>
[% PROCESS selectmenu menuname = "version"
menuitems = versions
property = "" %]
</td>
</tr>
<tr>
<th><label for="component">Компонент:</label></th>
<td>
[% PROCESS selectmenu menuname = "component"
menuitems = components %]
</td>
<th>
<label for="priority">
<a href="page.cgi?id=fields.html#priority">Приоритет</a>:
</label>
</th>
<td>
[% PROCESS selectmenu menuname = "priority"
menuitems = priorities %]
</td>
</tr>
<tr>
<th>
<label for="rep_platform">
<a href="page.cgi?id=fields.html#rep_platform">
[% field_descs.rep_platform FILTER html %]</a>:
</label>
</th>
<td>
[% PROCESS selectmenu menuname = "rep_platform"
menuitems = platforms %]
</td>
<th>
<label for="bug_severity">
<a href="page.cgi?id=fields.html#bug_severity">
[% field_descs.bug_severity FILTER html %]</a>:
</label>
</th>
<td>
[% PROCESS selectmenu menuname = "bug_severity"
menuitems = severities %]
</td>
</tr>
<tr>
<th>
<label for="op_sys">
<a href="page.cgi?id=fields.html#op_sys">[% field_descs.op_sys FILTER html %]</a>:
</label>
</th>
<td [% " colspan=\"3\"" IF !Param("usetargetmilestone") %]>
[% PROCESS selectmenu menuname = "op_sys"
menuitems = op_sys %]
</td>
[% IF Param("usetargetmilestone") %]
<th><label for="target_milestone">Запланировано:</label></th>
<td>
[% PROCESS selectmenu menuname = "target_milestone"
menuitems = targetmilestones %]
</td>
[% END %]
</tr>
<tr>
<th><label for="bug_status">Состояние:</label></th>
<td colspan="3">[% PROCESS status_section %]</td>
</tr>
[% IF user.is_timetracker %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.estimated_time, editable = 1
%]
<td>
<input id="estimated_time"
name="estimated_time"
value="[% dontchange FILTER html %]"
size="6">
</td>
[% PROCESS bug/field.html.tmpl
field = bug_fields.deadline, value = dontchange
editable = 1, allow_dont_change = 1 %]
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.remaining_time, editable = 1
%]
<td>
<input id="remaining_time"
name="remaining_time"
value="[% dontchange FILTER html %]"
size="6">
</td>
<th>&nbsp;</th>
<td>&nbsp;</td>
</tr>
[% END %]
<tr>
<th><label for="assigned_to">Исполнитель:</label></th>
<td colspan="3">
[% INCLUDE global/userselect.html.tmpl
id => "assigned_to"
name => "assigned_to"
value => dontchange
size => 40
%]
<input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
<label for="set_default_assignee">Передать ответственному за компонент</label>
</td>
</tr>
[% IF Param("useqacontact") %]
<tr>
<th><label for="qa_contact">Приемка:</label></th>
<td colspan="3">
[% INCLUDE global/userselect.html.tmpl
id => "qa_contact"
name => "qa_contact"
value => dontchange
size => 40
%]
<input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
<label for="set_default_qa_contact">Установить ответственного за приемку компонента</label>
</td>
</tr>
[% END %]
<tr>
<th><label for="masscc">Подписка:</label></th>
<td colspan="3">
[% INCLUDE global/userselect.html.tmpl
id => "masscc"
name => "masscc"
value => ""
size => 40
multiple => 5
%]
<select name="ccaction">
<option value="add">Добавить в список</option>
<option value="remove">Исключить из списка</option>
</select>
</td>
</tr>
[% IF use_keywords %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.keywords, editable = 1
desc_url = "describekeywords.cgi"
%]
<td colspan="3">
[% INCLUDE bug/field.html.tmpl
field = bug_fields.keywords, editable = 1, value = keywords
possible_values = all_keywords
no_tds = 1
%]
<select name="keywordaction">
<option value="add">Добавить ключевые слова</option>
<option value="remove">Удалить ключевые слова</option>
<option value="set">Заменить</option>
</select>
</td>
</tr>
[% END %]
<tr>
<th>
<label for="dependson">
Зависит от:
</label>
</th>
<td colspan="3">
<input id="dependson" name="dependson" size="40">
<select name="dependson_action">
<option value="add">Добавить к списку</option>
<option value="remove">Исключить из списка</option>
</select>
</td>
</tr>
<tr>
<th>
<label for="blocked">
Блокирует:
</label>
</th>
<td colspan="3">
<input id="blocked" name="blocked" size="40">
<select name="blocked_action">
<option value="add">Добавить к списку</option>
<option value="remove">Исключить из списка</option>
</select>
</td>
</tr>
[% IF Param('usestatuswhiteboard') %]
<tr>
<td align="right">
<b>Заметки:</b>
</td>
<td colspan="7">
<input name="status_whiteboard"
value="[% dontchange FILTER html %]" size="60">
</td>
</tr>
[% END %]
[% USE Bugzilla %]
[%# Show all legal values and all fields, ignoring visibility controls. %]
[% bug = 0 %]
[% FOREACH field = Bugzilla.active_custom_fields %]
<tr>
[% PROCESS bug/field.html.tmpl value = dontchange
editable = 1
allow_dont_change = 1 %]
</tr>
[% END %]
[% Hook.process("after_custom_fields") %]
</table>
<b><label for="comment">Комментарий:</label></b>
[% IF user.is_insider %]
<input type="checkbox" name="comment_is_private" value="1"
id="newcommentprivacy"
onClick="updateCommentTagControl(this, 'comment')"/>
<label for="newcommentprivacy">
Сделать комментарий конфиденциальным (видимым только членам группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
[% END %]
<br>
[% INCLUDE global/textarea.html.tmpl
name = 'comment'
id = 'comment'
minrows = 5
maxrows = 25
cols = constants.COMMENT_COLS
%]<br>
[% IF user.is_insider %]
<script>
updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
</script>
[% END %]
[% Hook.process('before_groups') %]
[% IF groups.size > 0 %]
<script type="text/javascript">
function turn_off(myself, id) {
var other_checkbox = document.getElementById(id);
if (myself.checked && other_checkbox) {
other_checkbox.checked = false;
}
}
</script>
<b>Принадлежность группам:</b><br>
<table border="1">
<tr>
<th>Исключить<br>[% terms.bugs_acc %]<br>из этой<br>группы</th>
<th>Добавить<br>[% terms.bugs_acc %]<br>в эту<br>группу</th>
<th>Группа:</th>
</tr>
[% FOREACH group = groups %]
<tr>
<td align="center">
<input type="checkbox" name="defined_groups"
id="defined_group_[% group.id %]"
value="[% group.name FILTER html %]"
onchange="turn_off(this, 'group_[% group.id %]')">
</td>
[% IF group.is_active %]
<td align="center">
<input type="checkbox" name="groups"
id="group_[% group.id FILTER html %]"
value="[% group.name FILTER html %]"
onchange="turn_off(this, 'defined_group_[% group.id %]')">
</td>
[% ELSE %]
<td>&nbsp;</td>
[% foundinactive = 1 %]
[% END %]
<td>
[% SET inactive = !group.is_active %]
[% group.description FILTER html_light FILTER inactive(inactive) %]
</td>
</tr>
[% END %]
</table>
[% IF foundinactive %]
<p style="font-size:smaller">(Примечание: Добавление [% terms.bugs_gen %] в [% FILTER inactive %]
закрытые группы [% END %] невозможно. Удаление — разрешено.)</p>
[% END %]
[% END %]
[%+ Hook.process('after_groups') %]
<input type="submit" id="commit" value="Сохранить">
[%############################################################################%]
[%# Select Menu Block #%]
[%############################################################################%]
[% BLOCK selectmenu %]
<select id="[% menuname %]" name="[% menuname %]">
<option value="[% dontchange FILTER html %]" selected="selected">
[% dontchange FILTER html %]
</option>
[% FOREACH menuitem = menuitems %]
[% IF property %][% menuitem = menuitem.$property %][% END %]
<option value="[% menuitem FILTER html %]">[% display_value(menuname, menuitem) FILTER html %]</option>
[% END %]
</select>
[% END %]
[%############################################################################%]
[%# Status Block #%]
[%############################################################################%]
[% BLOCK status_section %]
[% all_open_bugs = !current_bug_statuses.containsany(closedstates) %]
[% all_closed_bugs = !current_bug_statuses.containsany(openstates) %]
[% closed_status_array = [] %]
<select name="bug_status" id="bug_status">
<option value="[% dontchange FILTER html %]" selected="selected">[% dontchange FILTER html %]</option>
[% FOREACH bug_status = new_bug_statuses %]
<option value="[% bug_status.name FILTER html %]">
[% display_value("bug_status", bug_status.name) FILTER html %]
</option>
[% IF !bug_status.is_open %]
[% filtered_status = bug_status.name FILTER js %]
[% closed_status_array.push( filtered_status ) %]
[% END %]
[% END %]
[%# If all the bugs being changed are closed, allow the user to change their resolution. %]
[% IF all_closed_bugs %]
[% filtered_status = dontchange FILTER js %]
[% closed_status_array.push( filtered_status ) %]
[% END %]
</select>
<span id="resolution_settings">
<select id="resolution" name="resolution">
<option value="[% dontchange FILTER html %]" selected >[% dontchange FILTER html %]</option>
[% FOREACH r = resolutions %]
[% NEXT IF !r %]
[% NEXT IF r == "DUPLICATE" || r == "MOVED" %]
<option value="[% r FILTER html %]">[% display_value("resolution", r) FILTER html %]</option>
[% END %]
</select>
</span>
<script type="text/javascript">
var close_status_array = new Array("[% closed_status_array.join('", "') FILTER none %]");
YAHOO.util.Event.addListener('bug_status', "change", showHideStatusItems, '[% "is_duplicate" IF bug.dup_id %]');
YAHOO.util.Event.onDOMReady( showHideStatusItems );
</script>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# title: string. The title for this page. (optional)
#%]
[% PROCESS global/variables.none.tmpl %]
[% DEFAULT title = "Список $terms.bugs_gen" %]
<html>
<head>
<title>[% title FILTER html %]</title>
<base href="[% urlbase FILTER html %]">
<link href="[% 'skins/standard/buglist.css' FILTER mtime %]"
rel="stylesheet" type="text/css">
</head>
<body>
[% IF bugs.size == 0 %]
<h3>[% terms.zeroSearchResults %].</h3>
[% ELSE %]
[% PROCESS list/table.html.tmpl %]
[% END %]
</body>
</html>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% DEFAULT title = "$terms.Bugs из $terms.Bugzilla " %]
<?xml version="1.0"[% IF Param('utf8') %] encoding="UTF-8"[% END %]?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>[% title FILTER xml %]</title>
<link rel="alternate" type="text/html"
href="[% urlbase FILTER html %]buglist.cgi?
[%- urlquerypart.replace('ctype=atom[&]?','') FILTER xml %]"/>
<link rel="self" type="application/atom+xml"
href="[% urlbase FILTER html %]buglist.cgi?
[%- urlquerypart FILTER xml %]"/>
<updated>[% bugs.sort('changedtime').last.changedtime FILTER time("%Y-%m-%dT%H:%M:%SZ", "UTC")
FILTER xml %]</updated>
<id>[% urlbase FILTER html %]buglist.cgi?[% urlquerypart FILTER xml %]</id>
[% FOREACH bug = bugs %]
<entry>
<title>[% "@" IF bug.secure_mode %][[% terms.Bug %] [%+ bug.bug_id FILTER xml %]] [% bug.short_desc FILTER xml %]</title>
<link rel="alternate" type="text/html"
href="[% urlbase FILTER html %]show_bug.cgi?id=
[%- bug.bug_id FILTER xml %]"/>
<id>[% urlbase FILTER xml %]show_bug.cgi?id=[% bug.bug_id FILTER xml %]</id>
<author>
<name>[% bug.reporter_realname ? bug.reporter_realname : bug.reporter FILTER xml %]</name>
</author>
<updated>[% bug.changedtime FILTER time("%Y-%m-%dT%H:%M:%SZ", "UTC") FILTER xml %]</updated>
<summary type="html">
[%# Filter out the entire block, so that we don't need to escape the html code out %]
[% FILTER xml %]
<table>
<tr>
<th>Атрибут</th><th>Значение</th>
</tr><tr class="bz_feed_product">
<td>[% columns.product.title FILTER html %]</td>
<td>[% bug.product FILTER html %]</td>
</tr><tr class="bz_feed_component">
<td>[% columns.component.title FILTER html %]</td>
<td>[% bug.component FILTER html %]</td>
</tr><tr class="bz_feed_assignee">
<td>[% columns.assigned_to_realname.title FILTER html %]</td>
<td>[% bug.assigned_to_realname ? bug.assigned_to_realname : bug.assigned_to FILTER html %]</td>
</tr><tr class="bz_feed_reporter">
<td>[% columns.reporter_realname.title FILTER html %]</td>
<td>[% bug.reporter_realname ? bug.reporter_realname : bug.reporter FILTER html %]</td>
</tr><tr class="bz_feed_bug_status">
<td>[% columns.bug_status.title FILTER html %]</td>
<td>[% display_value("bug_status", bug.bug_status) FILTER html %]</td>
</tr><tr class="bz_feed_resolution">
<td>[% columns.resolution.title FILTER html %] </td>
<td>[% display_value("resolution", bug.resolution) FILTER html %]</td>
</tr><tr class="bz_feed_priority">
<td>[% columns.priority.title FILTER html %]</td>
<td>[% display_value("priority", bug.priority) FILTER html %]</td>
</tr><tr class="bz_feed_severity">
<td>[% columns.bug_severity.title FILTER html %] </td>
<td>[% display_value("bug_severity", bug.bug_severity) FILTER html %]</td>
[% IF Param("usetargetmilestone") %]
</tr><tr class="bz_feed_target_milestone">
<td>[% columns.target_milestone.title FILTER html %]</td>
<td>[% bug.target_milestone FILTER html %]</td>
[% END %]
</tr><tr class="bz_feed_creation_date">
<td>[% columns.opendate.title FILTER html %]</td>
<td>[% bug.opendate FILTER html %]</td>
</tr><tr class="bz_feed_changed_date">
<td>[% columns.changeddate.title FILTER html %]</td>
<td>[% bug.changeddate FILTER html -%]</td>
</tr>
</table>
[% END %]
</summary>
</entry>
[% END %]
</feed>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# searchtype: string. Type of search - either "series", "saved" or undef.
# ...
# defaultsavename: string. The default name for saving the query.
#%]
[%############################################################################%]
[%# Template Initialization #%]
[%############################################################################%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% unfiltered_title = "Список ${terms.bugs_gen}" %]
[% IF searchname || defaultsavename %]
[% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %]
[% END %]
[% title = unfiltered_title FILTER html %]
[% qorder = order FILTER uri IF order %]
[% javascript = BLOCK %]
[% IF quicksearch %]
[% new_param = BLOCK ~%]
quicksearch=[% quicksearch FILTER uri %]
[%~ IF cgi.param('list_id') ~%]
&list_id=[% cgi.param('list_id') FILTER uri %]
[%~ END %]
[% END %]
[% ELSIF cgi.param('token') != '' %]
[% new_param = cgi.canonicalise_query('token', 'cmdtype', 'remtype') %]
[% ELSE %]
[% new_param = cgi.canonicalise_query %]
[% END %]
[% IF new_param.length + 12 < constants.CGI_URI_LIMIT %]
if (history && history.replaceState) {
history.replaceState(null, "[% unfiltered_title FILTER js %]",
"buglist.cgi?[% new_param FILTER js %]");
document.title = "[% unfiltered_title FILTER js %]";
}
[% END %]
[% javascript FILTER none %]
[% END %]
[%############################################################################%]
[%# Page Header #%]
[%############################################################################%]
[% PROCESS global/header.html.tmpl
title = title
style = style
atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom"
yui = [ 'autocomplete', 'calendar' ]
javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ]
style_urls = [ "skins/standard/buglist.css" ]
doc_section = "query.html#list"
%]
<div class="bz_query_head">
<span class="bz_query_timestamp">
[% currenttime FILTER time('%a %b %e %Y %T %Z') FILTER html %]<br>
</span>
[% IF debug %]
<div class="bz_query_debug">
<p>Полное время выполнения: [% query_time FILTER html %] сек.</p>
[% FOREACH query = queries %]
<p>[% query.sql FILTER html %]</p>
<p>Время выполнения: [% query.time FILTER html %] сек</p>
[% IF query.explain %]
<pre>[% query.explain FILTER html %]</pre>
[% END %]
[% END %]
</div>
[% END %]
[% IF user.settings.display_quips.value == 'on' %]
[% DEFAULT quip = "$terms.Bugzilla добавляет сюда произвольную цитату, но увы, сейчас сборник цитат пуст!" %]
<span class="bz_quip">
<a href="quips.cgi"><em>[% quip FILTER html %]</em></a>
</span>
[% END %]
</div>
[% IF toolong %]
<h2 class="bz_smallminded">
Размер списка слишком велик для [% terms.Bugzilla %]; кнопки навигации
на страницах отдельных [% terms.bugs_gen %] отключены.
</h2>
[% END %]
[% SET shown_types = [
'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
'nowordssubstr', 'notmatches',
] %]
<a id="search_description_controller" class="bz_default_hidden"
href="javascript:TUI_toggle_class('search_description')">Скрыть описание поиска</a>
[%# Show the link if the browser supports JS %]
<script type="text/javascript">
TUI_alternates['search_description'] = 'Показать описание поиска';
YAHOO.util.Dom.removeClass('search_description_controller',
'bz_default_hidden');
</script>
<ul class="search_description">
[% FOREACH desc_item = search_description %]
<li>
<strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
[% IF shown_types.contains(desc_item.type) || debug %]
([% search_descs.${desc_item.type} FILTER html %])
[% END %]
[% FOREACH val IN desc_item.value.split(',') %]
[%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
[% END %]
[% IF debug %]
(<code>[% desc_item.term FILTER html %]</code>)
[% END %]
</li>
[% END %]
</ul>
<hr>
[%############################################################################%]
[%# Preceding Status Line #%]
[%############################################################################%]
[% IF bugs.size > 9 %]
[% PROCESS num_results %]
[% END %]
[%############################################################################%]
[%# Start of Change Form #%]
[%############################################################################%]
[% IF dotweak %]
<form name="changeform" method="post" action="process_bug.cgi">
[% END %]
[%############################################################################%]
[%# Bug Table #%]
[%############################################################################%]
[% PROCESS list/table.html.tmpl %]
[%############################################################################%]
[%# Succeeding Status Line #%]
[%############################################################################%]
[% PROCESS num_results %]
[% IF bugs.size == 0 %]
<ul class="zero_result_links">
<li>[% PROCESS enter_bug_link %]</li>
[% IF one_product.defined %]
<li><a href="enter_bug.cgi">Зарегистрировать новую [% terms.bug_acc %] в
другом продукте</a></li>
[% END %]
<li><a href="[% PROCESS edit_search_url %]">Изменить условия поиска</a></li>
<li><a href="query.cgi">Начать поиск заново</a></li>
</ul>
[% END %]
<br>
[%############################################################################%]
[%# Rest of Change Form #%]
[%############################################################################%]
[% IF dotweak %]
[% PROCESS "list/edit-multiple.html.tmpl" %]
</form>
<hr>
[% END %]
[%############################################################################%]
[%# Navigation Bar #%]
[%############################################################################%]
<table>
<tr>
[% IF bugs.size > 0 %]
<td valign="middle" class="bz_query_buttons">
<form method="post" action="show_bug.cgi">
[% id = buglist.join(",") %]
<input type="hidden" name="id" value="[% id FILTER html %]">
<input type="hidden" name="format" value="multiple">
<input type="submit" id="long_format" value="Подробно">
</form>
<form method="post" action="show_bug.cgi">
<input type="hidden" name="ctype" value="xml">
[% FOREACH id = buglist %]
<input type="hidden" name="id" value="[% id FILTER html %]">
[% END %]
<input type="hidden" name="excludefield" value="attachmentdata">
<input type="submit" value="XML" id="xml">
</form>
[% IF user.is_timetracker %]
<form method="post" action="summarize_time.cgi">
<input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
<input type="submit" id="timesummary" value="Сводка времени">
</form>
[% IF time_summary_limited %]
<small>
Сводка времени включает в себя только показанные выше [% terms.bugs %]. Чтобы
просмотреть сводку времени для всех [% terms.bugs_gen %], найденных поиском, вы можете
<a href="buglist.cgi?[% urlquerypart FILTER html %]
[%- "&order=$qorder" FILTER html IF order %]&limit=0">
Отобразить все результаты поиска</a>.</small>
[% END %]
[% END %]
</td>
<td>&nbsp;</td>
<td valign="middle" class="bz_query_links">
<a href="buglist.cgi?
[% urlquerypart FILTER html %]&amp;ctype=csv&amp;human=1">CSV</a> |
<a href="buglist.cgi?
[% urlquerypart FILTER html %]&amp;title=
[%- title FILTER html %]&amp;ctype=atom">RSS</a> |
<a href="buglist.cgi?
[% urlquerypart FILTER html %]&amp;ctype=ics">iCalendar</a> |
<a href="colchange.cgi?
[% urlquerypart FILTER html %]&amp;query_based_on=
[% defaultsavename OR searchname FILTER uri %]">Формат&nbsp;вывода</a> |
[% IF bugs.size > 1 && caneditbugs && !dotweak %]
<a href="buglist.cgi?[% urlquerypart FILTER html %]
[%- "&order=$qorder" FILTER html IF order %]&amp;tweak=1"
>Групповое&nbsp;редактирование&nbsp;[% terms.bugs_gen %]</a>
|
[% END %]
[% IF bugowners && user.id %]
<a href="mailto:
[% bugowners FILTER html %]">Отправить&nbsp;сообщения&nbsp;исполнителям&nbsp;[% terms.bugs_gen %]</a> |
[% END %]
[%# Links to more things users can do with this bug list. %]
[% Hook.process("links") %]
</td>
[% END %]
<td valign="middle" class="bz_query_edit">
<a href="[% PROCESS edit_search_url %]">Изменить&nbsp;отбор</a>
</td>
[% IF searchtype == "saved" %]
<td valign="middle" nowrap="nowrap" class="bz_query_forget">
|
<a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
[% searchname FILTER uri %]&amp;token=
[% issue_hash_token([search_id, searchname]) FILTER uri %]">
Удалить&nbsp;отбор&nbsp;'[% searchname FILTER html %]'</a>
</td>
[% ELSE %]
<td>&nbsp;</td>
<td valign="middle" class="bz_query_remember">
<form method="get" action="buglist.cgi">
<input type="submit" id="remember" value="Сохранить условия отбора"> как
<input type="hidden" name="newquery"
value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
<input type="hidden" name="cmdtype" value="doit">
<input type="hidden" name="remtype" value="asnamed">
<input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
<input type="text" id="save_newqueryname" name="newqueryname" size="20"
title="Имя нового запроса" value="[% defaultsavename FILTER html %]">
</form>
</td>
[% END %]
</tr>
</table>
[% IF one_product.defined && bugs.size %]
<p class="bz_query_single_product">
[% PROCESS enter_bug_link %]
</p>
[% END %]
[%############################################################################%]
[%# Page Footer #%]
[%############################################################################%]
[% PROCESS global/footer.html.tmpl %]
[%##########%]
[%# Blocks #%]
[%##########%]
[% BLOCK edit_search_url %]
[% editqueryname = searchname OR defaultsavename OR '' %]
query.cgi?[% urlquerypart FILTER html %]
[%- IF editqueryname != '' %]&amp;known_name=
[%- editqueryname FILTER uri %]
[% END %]
[% END %]
[% BLOCK enter_bug_link %]
<a href="enter_bug.cgi
[%- IF one_product.defined %]?product=
[%- one_product.name FILTER uri %][% END %]">Зарегистрировать
новую [% terms.bug_acc %]
[% IF one_product.defined %]
для продукта "[% one_product.name FILTER html %]"
[% END %]</a>
[% END %]
[% BLOCK num_results %]
<span class="bz_result_count">
[% IF bugs.size == 0 %]
<span class="zero_results">[% terms.zeroSearchResults %].</span>
[% ELSIF default_limited AND bugs.size >= Param('default_search_limit') %]
Этот результат был ограничен [% Param('default_search_limit') FILTER html %]
[%+ terms.bugs_abl %].
<a href="buglist.cgi?[% urlquerypart FILTER html %]
[%- "&order=$qorder" FILTER html IF order %]&limit=0">Отобразить
все результаты поиска для этого запроса</a>.
[% time_summary_limited = 1 %]
[% ELSIF bugs.size == 1 %]
Найдена одна [% terms.bug %].
[% ELSE %]
Найдено [% bugs.size %] [%+ terms.bugs_gen %].
[% END %]
</span>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# added_quip: string. Defined if the CGI added a quip data before
# displaying anything; if defined, its value is that quip.
# show_quips: boolean. True if we are showing the entire quip list.
# quips: list of strings. Defined if and only if show_quips is true.
# List of all quips.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Копилка перлов $terms.Bugzilla"
header = "Добавьте своё изречение"
%]
[% IF added_quip %]
<p>
<font color="red">
Ваша мысль '<tt>[% added_quip FILTER html %]</tt>' была добавлена.
[% IF Param("quip_list_entry_control") == "moderated" AND !user.in_group('bz_quip_moderators') %]
Она будет использована после подтверждения.
[% END %]
</font>
</p>
[% END %]
[% IF deleted_quip %]
<p>
<font color="red">
Цитата '<tt>[% deleted_quip FILTER html %]</tt>' была удалена.
</font>
</p>
[% END %]
[% IF approved or unapproved %]
<p>[% approved.size %] цитат разрешено и [% unapproved.size %] цитат запрещено</p>
[% END %]
<p>
[% terms.Bugzilla %] выбирает случайную цитату из копилки для заголовка каждого
список [% terms.bugs_gen %].
</p>
[% IF Param("quip_list_entry_control") != "closed" %]
<p>
Вы можете добавлять свои свои изречения. Напишите что-нибудь мудрое,
остроумное или просто смешное (пожалуйста, не пишите грубостей и непристойностей)
и нажмите педаль.
[% IF Param("quip_list_entry_control") == "moderated" AND !user.in_group('bz_quip_moderators') %]
Ваша цитата будет добавлена в копилку после подтверждения.
[% END %]
</p>
<form method="post" action="quips.cgi">
<input type="hidden" name="action" value="add">
<input type="hidden" name="token"
value="[% issue_hash_token(['create-quips']) FILTER html %]">
<input size="80" name="quip" maxlength="512">
<p>
<input type="submit" id="add" value="Добавить">
</p>
</form>
[% ELSE %]
<p>Добавление цитат в данный момент запрещено.
</p>
[% END %]
[% IF show_quips %]
[% IF !user.in_group('bz_quip_moderators') %]
<h2>
Что сейчас в копилке:
</h2>
<ul>
[% FOREACH quipid = quipids %]
[% NEXT IF NOT quips.$quipid.approved %]
<li>[% quips.$quipid.quip FILTER html %]</li>
[% END %]
</ul>
[% ELSE %]
<h2>Редактировать существующие цитаты:</h2>
<p>
<strong>Примечание:</strong> Только разрешенные цитаты будут показаны.
Если в настройках системы параметр 'quip_list_entry_control' установлен
в <q>open</q>, введённые цитаты будут автоматически разрешены.
</p>
<form name="editform" method="post" action="quips.cgi">
<input type="hidden" name="action" value="разрешить">
<input type="hidden" name="token"
value="[% issue_hash_token(['approve-quips']) FILTER html %]">
<table border="1">
<thead><tr>
<th>Цитата</th>
<th>Автор</th>
<th>Действие</th>
<th>Разрешение</th>
</tr></thead><tbody>
[% FOREACH quipid = quipids %]
<tr>
<td>[% quips.$quipid.quip FILTER html %]</td>
<td>
[% userid = quips.$quipid.userid %]
[% users.$userid FILTER html %]
[% "Неизвестен" IF NOT users.$userid %]
</td>
<td>
<a href="quips.cgi?action=delete&amp;quipid=[% quipid FILTER uri %]&amp;token=
[%- issue_hash_token(['quips', quipid]) FILTER uri %]">
Удалить
</a>
</td>
<td>
<input type="hidden" name="defined_quipid_[% quipid FILTER html %]"
id="defined_quipid_[% quipid FILTER html %]"
value="1">
<input type="checkbox" name="quipid_[% quipid FILTER html %]"
id="quipid_[% quipid FILTER html %]"
[%- ' checked="checked"' IF quips.$quipid.approved %]>
</td>
</tr>
[% END %]
</tbody>
</table>
<script type="text/javascript"><!--
var numelements = document.forms.editform.elements.length;
function SetCheckboxes(value) {
var item;
for (var i=0 ; i<numelements ; i++) {
item = document.forms.editform.elements[i];
item.checked = value;
}
}
document.write(' <input type="button" name="uncheck_all" '
+'value="Запретить все" onclick="SetCheckboxes(false);">');
document.write(' <input type="button" name="check_all" '
+'value="Разрешить все" onclick="SetCheckboxes(true);">');
//--></script>
<input type="submit" id="update" value="Сохранить изменения">
</form>
<br>
[% END %]
[% ELSE %]
<p>
Любители мудростей в большом количестве могут
<a href="quips.cgi?action=show">посмотреть
[% IF user.in_group('bz_quip_moderators') %]
и изменить
[% END %]
весь список цитат</a>.
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# debug: boolean. True if we want the search displayed while we wait.
# query: string. The SQL query which makes the buglist.
#%]
[% PROCESS global/variables.none.tmpl %]
<html>
<head>
<title>Обработка запроса [% terms.Bugzilla %]</title>
<link href="[% 'skins/standard/global.css' FILTER mtime %]"
rel="stylesheet" type="text/css">
</head>
<body>
<h1 style="margin-top: 20%; text-align: center; font-size: xx-large;">Идёт поиск ...</h1>
[% IF debug %]
<p>[% query FILTER html %]</p>
[% IF query_explain.defined %]
<pre>[% query_explain FILTER html %]</pre>
[% END %]
[% END %]
</body>
</html>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%############################################################################%]
[%# Initialization #%]
[%############################################################################%]
[%# Don't display the table or do any processing if there are no bugs
# to display %]
[% RETURN IF !bugs.size %]
[%# Columns whose titles or values should be abbreviated to make the list
# more compact. For columns whose titles should be abbreviated,
# the shortened title is included. For columns whose values should be
# abbreviated, a maximum length is provided along with the ellipsis that
# should be added to an abbreviated value, if any.
# wrap is set if a column's contents should be allowed to be word-wrapped
# by the browser.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% field_descs.short_short_desc = field_descs.short_desc %]
[% field_descs.assigned_to_realname = field_descs.assigned_to %]
[% field_descs.reporter_realname = field_descs.reporter %]
[% field_descs.qa_contact_realname = field_descs.qa_contact %]
[% abbrev =
{
"bug_severity" => { maxlength => 3 , title => "Сер" } ,
"priority" => { maxlength => 7 , title => "Прт" } ,
"rep_platform" => { maxlength => 3 , title => "Жлз" } ,
"bug_status" => { maxlength => 4 , title => "Сост" } ,
"assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
"assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
"reporter" => { maxlength => 30 , ellipsis => "..." } ,
"reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
"qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "Приемка" } ,
"qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "Приемка" } ,
"resolution" => { maxlength => 4 , title => "Реш" } ,
"short_desc" => { wrap => 1 } ,
"short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
"status_whiteboard" => { title => "Заметки" , wrap => 1 } ,
"keywords" => { wrap => 1 } ,
"flagtypes.name" => { wrap => 1 } ,
"component" => { maxlength => 8 , title => "Компонент" } ,
"product" => { maxlength => 8 } ,
"version" => { maxlength => 5 , title => "Версия" } ,
"op_sys" => { maxlength => 4 } ,
"bug_file_loc" => { maxlength => 30 } ,
"target_milestone" => { title => "Запланировано" } ,
"longdescs.count" => { title => "# Комментариев" },
"percentage_complete" => { format_value => "%d %%" } ,
}
%]
[% PROCESS bug/time.html.tmpl %]
[% Hook.process("before_table") %]
[%############################################################################%]
[%# Table Header #%]
[%############################################################################%]
[% tableheader = BLOCK %]
<table class="bz_buglist" cellspacing="0" cellpadding="4" width="100%">
<tr class="bz_buglist_header bz_first_buglist_header">
[% IF dotweak %]
<th>&nbsp;</th>
[% END %]
<th colspan="[% splitheader ? 2 : 1 %]" class="first-child">
<a href="buglist.cgi?
[% urlquerypart FILTER html %]&amp;order=
[% PROCESS new_order id='bug_id' %]
[%-#%]&amp;query_based_on=
[% defaultsavename OR searchname FILTER uri %]">ID
[% PROCESS order_arrow id='bug_id' ~%]
</a>
</th>
[% IF splitheader %]
[% FOREACH id = displaycolumns %]
[% NEXT UNLESS loop.count() % 2 == 0 %]
[% column = columns.$id %]
[% PROCESS columnheader %]
[% END %]
</tr><tr class="bz_buglist_header">
[% IF dotweak %]
<th>&nbsp;</th>
[% END %]
<th>&nbsp;</th>
[% FOREACH id = displaycolumns %]
[% NEXT IF loop.count() % 2 == 0 %]
[% column = columns.$id %]
[% PROCESS columnheader %]
[% END %]
[% ELSE %]
[% FOREACH id = displaycolumns %]
[% column = columns.$id %]
[% PROCESS columnheader %]
[% END %]
[% END %]
</tr>
[% END %]
[% BLOCK columnheader %]
<th colspan="[% splitheader ? 2 : 1 %]">
<a href="buglist.cgi?[% urlquerypart FILTER html %]&amp;order=
[% PROCESS new_order %]
[%-#%]&amp;query_based_on=
[% defaultsavename OR searchname FILTER uri %]">
[%- abbrev.$id.title || field_descs.$id || column.title FILTER html -%]
[% PROCESS order_arrow ~%]
</a>
</th>
[% END %]
[% BLOCK new_order %]
[% desc = '' %]
[% IF (om = order.match("\\b$id( DESC)?")) %]
[% desc = ' DESC' IF NOT om.0 %]
[% END %]
[% id _ desc FILTER uri %]
[% IF id != 'bug_id' AND order %]
[% ',' _ order.remove("\\b$id( DESC)?(,\\s*|\$)") FILTER uri %]
[% END %]
[% END %]
[% BLOCK order_arrow %]
[% IF order.match("^$id DESC") %]
<span class="bz_sort_order_primary">&#x25BC;</span>
[% ELSIF order.match("^$id(,\\s*|\$)") %]
<span class="bz_sort_order_primary">&#x25B2;</span>
[% ELSIF order.match("\\b$id DESC") %]
<span class="bz_sort_order_secondary">&#x25BC;</span>
[% ELSIF order.match("\\b$id(,\\s*|\$)") %]
<span class="bz_sort_order_secondary">&#x25B2;</span>
[% END %]
[% END %]
[%############################################################################%]
[%# Bug Table #%]
[%############################################################################%]
[% tableheader %]
[% FOREACH bug = bugs %]
[% count = loop.count() %]
<tr id="b[% bug.bug_id %]" class="bz_bugitem
bz_[% bug.bug_severity FILTER css_class_quote -%]
bz_[% bug.priority FILTER css_class_quote -%]
bz_[% bug.bug_status FILTER css_class_quote -%]
[%+ "bz_$bug.resolution" FILTER css_class_quote IF bug.resolution -%]
[%+ "bz_secure" IF bug.secure_mode -%]
[%+ "bz_secure_mode_$bug.secure_mode" FILTER css_class_quote IF bug.secure_mode -%]
[%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]
">
[% IF dotweak %]
<td class="bz_checkbox_column">
<input type="checkbox" name="id_[% bug.bug_id %]">
</td>
[% END %]
<td class="first-child bz_id_column">
<a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>
<span style="display: none">[%+ '[SEC]' IF bug.secure_mode %]</span>
</td>
[% FOREACH column = displaycolumns %]
<td [% 'style="white-space: nowrap"' IF NOT abbrev.$column.wrap %]
class="bz_[% column FILTER css_class_quote %]_column">
[% IF abbrev.$column.maxlength %]
<span title="[%- display_value(column, bug.$column) FILTER html %]">
[% END %]
[% IF abbrev.$column.format_value %]
[%- bug.$column FILTER format(abbrev.$column.format_value) FILTER html -%]
[% ELSIF column == 'actual_time' ||
column == 'remaining_time' ||
column == 'estimated_time' %]
[% PROCESS formattimeunit time_unit=bug.$column %]
[%# Display the login name of the user if their real name is empty. %]
[% ELSIF column.match('_realname$') && bug.$column == '' %]
[% SET login_column = column.remove('_realname$') %]
[% bug.${login_column}.truncate(abbrev.$column.maxlength,
abbrev.$column.ellipsis) FILTER html %]
[% ELSIF column == 'short_desc' || column == "short_short_desc" %]
<a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">
[%- bug.$column.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%]
</a>
[% ELSE %]
[%- display_value(column, bug.$column).truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%]
[% END %]
[% IF abbrev.$column.maxlength %]
</span>
[% END %]
</td>
[% END %]
</tr>
[% IF loop.last() && time_info.time_present == 1 %]
[% PROCESS time_summary_line %]
[% END %]
[% END %]
</table>
[% BLOCK time_summary_line %]
<tr class="bz_time_summary_line">
[% columns_to_span = 1 %] [%# bugID %]
[% IF dotweak %]
[% columns_to_span = columns_to_span + 1 %]
[% END %]
[% FOREACH column = displaycolumns %]
[% IF column == 'actual_time' ||
column == 'remaining_time' ||
column == 'estimated_time' ||
column == 'percentage_complete' %]
[% IF columns_to_span > 0 %]
<td class="bz_total bz_total_label" colspan="
[%- columns_to_span FILTER html %]"><b>Итого</b></td>
[% columns_to_span = 0 %]
[% END %]
[% IF column == 'percentage_complete' %]
<td class="bz_total">[% time_info.percentage_complete
FILTER format(abbrev.$column.format_value) FILTER html %]</td>
[% ELSE %]
<td class="bz_total">
[%- PROCESS formattimeunit time_unit=time_info.$column %]</td>
[% END %]
[% ELSIF columns_to_span == 0 %] [%# A column following the first total %]
<td class="bz_total">&nbsp;</td>
[% ELSE %] [%# We haven't gotten to a time column yet, keep computing span %]
[% columns_to_span = columns_to_span + 1 %]
[% END %]
[% END %]
</tr>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% INCLUDE global/header.html.tmpl title = "Руководство по описанию $terms.bugs_gen" %]
<p>Чем эффективнее составлено сообщение об [% terms.bug_dat %],
тем вероятнее, что она будет исправлена.
Это руководство о том, как писать такие сообщения.
<h3>Правила</h3>
<ul>
<li>Будьте точны</li>
<li>Выражайтесь ясно - так, чтобы другие могли повторить [% terms.bug_acc %]</li>
<li>Одна [% terms.bug %] в одном сообщении</li>
<li>Нет [% terms.bugs_gen %], не заслуживающих упоминания -
мелкие [% terms.bugs %] могут скрывать более крупные</li>
<li>Четко отделяйте факты от умозаключений</li>
</ul>
<h3>Прежде чем писать сообщение</h3>
<ol>
<li>Повторите [% terms.bug_acc %] на наиболее свежей версии
программы, возможно она уже исправлена.
</li>
<li>Выполните <a href="query.cgi?format=specific">поиск</a>
в [% terms.Bugzilla %] среди уже зарегистрированных [% terms.bugs_gen %],
чтобы избежать дублирования.</li>
</ol>
<h3>Сообщение о новой [% terms.bug_obj %]</h3>
<p>Если [% terms.bug %] повторяется в свежей версии и никто не
зарегистрировал ее ранее:</p>
<ol>
<li>На главной странице [% terms.Bugzilla %] выберите
"<a href="enter_bug.cgi">Регистрация новой [% terms.bug_gen %]</a>"</li>
<li>Выберите продукт, в котором обнаружена [% terms.bug %]</li>
<li>Заполните форму. Необходимые пояснения для ее понимания:</li>
</ol>
<blockquote>
<p><b>Компонент</b>: В каком компоненте продукта проявляется
[% terms.bug %]?<br>
Это поле обязательное.
Нажав на ссылку "Компонент", можно увидеть краткое описание компонентов
продукта. Если ничего не подходит, ищите компонент "General".</p>
<p><b>[% field_descs.op_sys FILTER html %]:</b> В какой операционной системе
проявляется [% terms.bug %]?
(например: Linux, Windows XP, Mac OS X.)<br>
Если известно, что [% terms.bug %] происходит в любой операционной системе,
выберите <em>[% display_value("op_sys", "All") FILTER html %]</em>.
Если вашей [% field_descs.op_sys FILTER html %] нет в списке, используйте
<em>[% display_value("op_sys", "Other") FILTER html %]</em>.</p>
<p><b>Аннотация:</b> <b>Краткое, в пределах 60 символов, описание
[% terms.bug_gen %].</b><br>
Хорошая аннотация должна <b>описывать [% terms.bug_acc %] ясно и
однозначно</b>. Следует описывать именно проблему, а не варианты решения.<br>
<ul>
<li>Правильно: "<tt>Отмена диалогового окна копирования файла вызывает
аварию менеджера файлов</tt>"</li>
<li>Неудачно: "<tt>Сбой программы</tt>"</li>
<li>Неудачно: "<tt>Не отображается мой сайт</tt>"</li>
</ul>
<b>Описание:</b>
В этом поле нужно написать детальный отчет об [% terms.bug_dat %], включающий в себя:</p>
<blockquote>
<p><b>Общее описание:</b> Более развернутая аннотация.</p>
<blockquote>
<pre>
В версии для Mac OS выделение мышью на любой странице вызывает сбой в функции NSGetFactory.
</pre>
</blockquote>
<p><b>Как воспроизвести:</b> Действия, которые приводят к
[% terms.bug_dat %] (по шагам, кратко и четко). Опишите особенности
установки и настройки.</p>
<blockquote>
<pre>
1) Открыть любую страницу. (Например, используемую по умолчанию
resource:/res/samples/test0.html)
2) Выделите текст мышью. (Точнее, нажав клавишу мыши в любой точке страницы,
тяните указатель вниз к границе окна.)
</pre>
</blockquote>
<p><b>Реальные результаты:</b> Что произошло после описанных шагов
на самом деле.</p>
<blockquote>
<pre>
Крах приложения.
</pre>
</blockquote>
<p><b>Ожидаемые результаты:</b> Что должно было произойти, если бы
[% terms.bug_gen %] не было.</p>
<blockquote>
<pre>
Должна быть прокрутка окна вниз с выделением текста. (Или, как минимум,
приложение не должно завершаться аварийно.)
</pre>
</blockquote>
<p><b>Версия и [% field_descs.rep_platform FILTER html %]:</b>
Дата и [% field_descs.rep_platform FILTER lower FILTER html %] версии,
в которой впервые замечена [% terms.bug %].</p>
<blockquote>
<pre>
Релиз от 10.08.2006 для Mac OS 10.4.3
</pre>
</blockquote>
<p><b>Другие версии и платформы:</b> Воспроизводится или нет
[% terms.bug %] на других версиях или платформах (или других продуктах,
если это уместно).</p>
<blockquote>
<pre>
Не воспроизводится на релизе от 2006-08-10 на Windows XP Home (Service Pack 2)
</pre>
</blockquote>
<p><b>Дополнительная информация:</b> Любая другая полезная информация.
<br><br>Для случаев аварийного завершения:</p>
<ul>
<li><b>Windows:</b> укажите тип аварийного завершения и имя модуля, в котором замечена [% terms.bug %].
(Например, ошибка защиты в модуле apprunner.exe)</li>
<li><b>Mac OS X:</b> приложите журнал анализатора Crash Reporter, который
вызывается при аварии.
Включайте только раздел отказавшей нити, как правило озаглавленный</li>
"Thread 0 Crashed". Пожалуйста не вставляйте журнал целиком!</li>
</ul>
</blockquote>
<p>Еще раз проверьте всю указанную вами информацию, затем нажмите кнопку
"Сохранить". Ваш отчет попадет в базу
данных [% terms.Bugzilla %].<br>
</p>
</blockquote>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Поля $terms.bugs_gen"
style_urls = ['skins/standard/page.css']
%]
<p>На этой странице описаны различные поля, которые вы видите
в [% terms.bug_dat %].</p>
<table class="field_value_explanation">
<thead>
<tr>
<td id="bug_status">
<h2>[% field_descs.bug_status FILTER upper FILTER html %]</h2>
</td>
<td id="resolution">
<h2>[% field_descs.resolution FILTER upper FILTER html %]</h2>
</td>
</tr>
<tr>
<td>Поле [% field_descs.bug_status FILTER html %] указывает текущее
состояние [% terms.bug_gen %]. Переходы между состояниями подчиняются
определенным правилам.</td>
<td>Поле [% field_descs.resolution FILTER html %] показывает что именно
произошло с этой [%+ terms.bug_abl %].</td>
</tr>
</thead>
<tbody>
<tr class="header_row">
<td colspan="2">Открытые [% terms.Bugs %]</td>
</tr>
<tr>
<td>
<dl>
<dt class="unconfirmed">
[% display_value("bug_status", "UNCONFIRMED") FILTER html %]
</dt>
<dd class="unconfirmed">
Эта [% terms.bug %] недавно зарегистрирована в базе данных.
Никто не подтвердил, что проблема действительно имеет место.
Пользователи с правом "canconfirm" могут подтвердить [% terms.bug_acc %]
и изменить её состояние на
<b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>.
Также ситуация, связанная с этой [% terms.bug_abl %], может быть
решена немедленно и [% terms.bug %] может перейти в состояние
<b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
</dd>
<dt class='deferrer'>
<b>[% display_value("bug_status", "DEFERRED") FILTER html %]</b>
</dt>
<dd class='deferrer'>
Эта [% terms.bug %] отложена на некоторый срок, который должен быть
Из этого состояния [% terms.bug %] может быть передана
другому исполнителю и вернуться в состояние <b>[% display_value("bug_status", "NEW") FILTER html %]</b>
или может переоткрыта и получить состояние <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b>
</dd>
<dt class="confirmed">
[% display_value("bug_status", "CONFIRMED") FILTER html %]
</dt>
<dd class="confirmed">
Эта [% terms.bug %] была недавно добавлена к списку и подтверждена.
[%+ terms.Bugs %] в таком состоянии переходят в состояние
<b>[% display_value("bug_status", "IN_PROGRESS") FILTER html %]</b>,
когда кто-либо над ней работает, или могут быть решены и перейти в
состояние <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
</dd>
<dt class="in_progress">
[% display_value("bug_status", "IN_PROGRESS") FILTER html %]
</dt>
<dd class="in_progress">
Эта [% terms.bug %] ещё не решена, но уже передана конкретному
исполнителю который работает над [% terms.bug_abl %]. Из этого состояния
[%+ terms.bug %] может быть передана другому исполнителю и перейти
в состояние
<b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>,
или может быть решена и получит состояние
<b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
</dd>
[% Hook.process('open-status') %]
</dl>
</td>
<td>
Никакого решения пока нет. У всех [% terms.bugs_gen %] которые
находятся в одном из "открытых" состояний, поле решения не установлено.
</td>
</tr>
<tr class="header_row">
<td colspan="2">Закрытые [% terms.Bugs %]</td>
</tr>
<tr>
<td>
<dl>
<dt class="resolved">
[% display_value("bug_status", "RESOLVED") FILTER html %]
</dt>
<dd class="resolved">
Решение было произведено и ожидает проверки приемки.
Отсюда [% terms.bugs %] могут быть либо открыты вновь и получить
один из открытых статусов, либо проверены приемкой и помечены как
<b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>.
</dd>
<dt class="verified">
[% display_value("bug_status", "VERIFIED") FILTER html %]
</dt>
<dd class="verified">
Принятое решение подтверждено ответственным за приемку.
Это окончательное состояние для [% terms.bugs %].
</dd>
[% Hook.process('closed-status') %]
</dl>
</td>
<td>
<dl>
<dt class="fixed">
[% display_value("resolution", "FIXED") FILTER html %]
</dt>
<dd class="fixed">
Необходимые изменения внесены и протестированы.
</dd>
<dt class="invalid">
[% display_value("resolution", "INVALID") FILTER html %]
</dt>
<dd class="invalid">
[% terms.Bug %] по описанию не является проблемой или оформлена неверно.
</dd>
<dt class="wontfix">
[% display_value("resolution", "WONTFIX") FILTER html %]
</dt>
<dd class="wontfix">
Описываемая проблема признана, но в её исправлении отказано.
</dd>
<dt class="duplicate">
[% display_value("resolution", "DUPLICATE") FILTER html %]
</dt>
<dd class="duplicate">
Повторная регистрация существующей [% terms.bug_gen %].
Когда [% terms.abug %] помечается как
<b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b>,
то рядом с решением вы увидите номер существующей [% terms.bug_gen %].
</dd>
<dt class="worksforme">
[% display_value("resolution", "WORKSFORME") FILTER html %]
</dt>
<dd class="worksforme">
Все попытки воспроизвести проблему были безуспешны,
анализ не позволил понять возможные причины появления
описанной проблемы. При получении дополнительной информации,
[% terms.bug_acc %] следует открыть повторно, до тех пор работы над
[% terms.bug_abl %] прекращены.
</dd>
[% Hook.process('resolution') %]
</dl>
</td>
</tr>
</tbody>
</table>
<h2>Другие поля</h2>
[% SET field_help_map = {} %]
[% FOREACH field = bug_fields.keys %]
[% SET field_desc = field_descs.$field %]
[% field_help_map.$field_desc = { help => help_html.$field,
field => field } %]
[% END %]
[%# This field is not a real one, but its label is visible in bugs. %]
[% field_help_map.Importance = { help => help_html.importance,
field => "важность" } %]
[%# These are fields that don't need to be documented, either because
# they have docs somewhere else in the UI, or they don't show up on bugs.
# %]
[% SET skip_fields = [
'days_elapsed',
'everconfirmed',
'reporter_accessible',
'cclist_accessible',
'bug_group',
'commenter',
'owner_idle_time',
'bug_status',
'resolution',
] %]
<dl class="field_descriptions">
[% FOREACH field_desc = field_help_map.keys.sort %]
[% SET field = field_help_map.${field_desc}.field %]
[% SET field_object = bug_fields.$field %]
[% NEXT IF field_object.obsolete %]
[% NEXT IF !user.is_timetracker AND field_object.is_timetracking %]
[% NEXT IF field == 'status_whiteboard' AND !Param('usestatuswhiteboard') %]
[% NEXT IF field == 'target_milestone' AND !Param('usetargetmilestone') %]
[%# For now we don't have help for attachment fields and so on. %]
[% NEXT IF field.match('\.') %]
[% NEXT IF skip_fields.contains(field) %]
<dt id="[% field FILTER html %]">[% field_desc FILTER html %]</dt>
<dd>
[% field_help_map.${field_desc}.help FILTER html_light %]
</dd>
[% END %]
</dl>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% INCLUDE global/header.html.tmpl title = "Ваш текст со ссылками" %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
<p>
Скопируйте текст и вставьте сюда:
</p>
<hr>
<p>
<pre class="bz_comment_text">
[%- cgi.param("text") FILTER quoteUrls FILTER html -%]
</pre>
</p>
<hr>
<p>
Если вы разместите это в тегах <tt>&lt;pre&gt;</tt>,
текст будет выглядеть так:
</p>
<hr>
<p>
<pre class="bz_comment_text">
[%- cgi.param("text") FILTER quoteUrls -%]
</pre>
</p>
<hr>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% INCLUDE global/header.html.tmpl title = "Разметка текста" %]
<p>
Эта форма поможет в разметке текста по аналогии со стандартным
комментарием [% terms.Bugzilla %]. Номера [% terms.bugs_gen %],
адреса URL и адреса электронной почты будут дополнены гиперссылками.
</p>
<form action="page.cgi" method="post">
[% INCLUDE global/textarea.html.tmpl
name = 'text'
minrows = 20
cols = constants.COMMENT_COLS
%]
<br>
<input type="hidden" name="id" value="linked.html">
<input type="submit" id="linkify" value="Выполнить разметку">
</form>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/variables.none.tmpl" %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% INCLUDE global/header.html.tmpl
title = "Быстрый поиск в $terms.Bugzilla",
style_urls = ['skins/standard/page.css']
onload = 'document.forms[\'f\'].quicksearch.focus()'
%]
[% USE Bugzilla %]
<p><label for="quicksearch">Введите одно или несколько слов (или фрагментов слов)
для поиска:</label></p>
<form name="f" action="buglist.cgi" method="get"
onsubmit="if (this.quicksearch.value == '')
{ alert('Введите слова для поиска.');
return false; } return true;">
<input type="text" size="40" name="quicksearch" id="quicksearch">
<input type="submit" value="Искать" id="find">
</form>
<ul>
<li><a href="#basics">Основы</a></li>
<li><a href="#basic_examples">Примеры простых запросов</a></li>
<li><a href="#fields">Поля в которых можно вести поиск</a></li>
<li><a href="#advanced_features">Расширенные возможности</a></li>
<li><a href="#shortcuts">Дополнительные ярлыки</a></li>
<li><a href="#advanced_examples">Примеры сложных запросов</a></li>
</ul>
<h2 id="basics">Основы</h2>
<ul class="qs_help">
<li>Если вы просто введёте слово или несколько слов в поле поиска,
[%+ terms.Bugzilla %] будет искать ваше слово или слова в полях
[%+ field_descs.product FILTER html %],
[%+ field_descs.component FILTER html %],
[%+ IF use_keywords %][%+ field_descs.keywords FILTER html %],[% END %]
[%+ field_descs.alias FILTER html %],
[%+ field_descs.short_desc FILTER html %]
[%+ IF Param('usestatuswhiteboard') %][% field_descs.status_whiteboard FILTER html %],[% END %]
и [% field_descs.longdesc FILTER html %].</li>
<li>Введя только <strong>номер</strong> в поле поиска, вы перейдете прямо в
[% terms.bug_acc %] с этим номером. Кроме того, введя только
<strong>имя</strong> [% terms.bug_gen %], вы перейдете прямо в эту
[% terms.bug_acc %].
</li>
<li>Добавление дополнительных терминов <strong>сужает</strong> поиск, а не
расширяет его. (Другими словами, [% terms.Bugzilla %] ищет
[%+ terms.bugs %] которые подходят под <em>все</em> ваши критерии, а не
[%+ terms.bugs %] которые подходят под <em>любой</em> из ваших критериев.)</li>
<li>Поиск ведется <strong>без учета регистра</strong>. Так что
<kbd>таблица</kbd>, <kbd>Таблица</kbd> и <kbd>ТАБЛИЦА</kbd> дают одинаковый
результат.</li>
<li>[% terms.Bugzilla %] не просто ищет введённое вами точное слово, но также
ищет любое слово <strong>содержащее</strong> это слово. Так, например, при
поиске слова "кот" найдутся [% terms.bugs %], которые содержат его в
качестве фрагментов других слов &mdash; например, [% terms.abug %] упоминающая
"с<strong>кот</strong>" или "ро<strong>кот</strong>". Однако, поиск не
найдет фрагментов слов в полях [% field_descs.longdesc FILTER html %] или
[% field_descs.keywords FILTER html %] &mdash; только целые слова.</li>
<li>По умолчанию, поиск производится только в <strong>открытых</strong>
[% terms.bugs_obj %]. Если вы хотите знать, как искать в закрытых [% terms.bugs_obj %],
обратитесь к разделу <a href="#shortcuts">Дополнительные ярлыки</a>.</li>
<li>Если вы хотите искать в областях <strong>конкретных полей</strong>, вы
можете сделать запрос в виде <kbd>поле:значение</kbd>, где <kbd>поле</kbd>
является одним из <a href="#fields">имен полей</a>, перечисленных ниже в
этом документе, а <kbd>значение</kbd> является значением поля, которое вы
хотите найти в этом поле. Если вы введёте в поле <kbd>значение</kbd>
запятые, то оно будет интерпретировано как список значений, и будет
произведён поиск [% terms.bugs_gen %] подходящих под <em>любое</em> из этих
значений.</li>
</ul>
<h2 id="basic_examples">Примеры простых запросов</h2>
<p>Здесь приведены примеры составления некоторых простых запросов.
Ниже на этой странице можно найти
<a href="#advanced_examples">Примеры составления более сложных запросов</a>.</p>
<ul class="qs_help">
<li>Все открытые [% terms.bugs %], в которых userA@company.com находится в списке подписчиков
(нет необходимости упоминать открытые [% terms.bugs %], так как это значение по умолчанию):<br>
<kbd>cc:userA@company.com</kbd></li>
<li>Все неподтверждённые [% terms.bugs %] в продукте productA (помещение
состояния [%+ terms.bug_gen %] в первую позицию автоматически делает его состоянием
искомых [% terms.bugs_gen %]):<br>
<kbd>UNCONFIRMED product:productA</kbd>
<li>Все открытые и закрытые [% terms.bugs %], зарегистрированные userB@company.com
(необходимо указать в качестве первого слова ALL, иначе будут выведены только
открытые [% terms.bugs %]):<br>
<kbd>ALL reporter:userB@company.com</kbd>
<li>Все открытые [% terms.bugs %], имеющие серьёзность "чрезвычайная" и "критическая", и
чей план установлен на 2.5:<br>
<kbd>severity:blocker,critical milestone:2.5</kbd>
<li>Все открытые [% terms.bugs %] в компоненте Research & Development
имеющие важность P1 или P2 (необходимо использовать кавычки для компонента, так как его имя
содержит пробелы):<br>
<kbd>component:"Research & Development" priority:P1,P2</kbd></li>
</ul>
<h2 id="fields">Поля в которых можно вести поиск</h2>
<p>Вы можете указать любое из этих полей в виде <kbd>поле:значение</kbd> в
панели поиска, чтобы произвести в них поиск. Вы также можете ввести
сократить имя поля, если сокращённое имя будет подходит лишь под имя одного
поля. Так, например, поиск по <kbd>stat:VERIFIED</kbd> найдет все
[%+ terms.bugs %] в состоянии <kbd>VERIFIED</kbd>. У некоторых полей есть
несколько имён, и вы можете использовать любое из этих имён для поиска
по ним.</p>
[% IF Bugzilla.active_custom_fields.size %]
[% SET first_field = Bugzilla.active_custom_fields.0 %]
<p>Для настраиваемых полей можно использовать часть их имени (или сокращённую
часть их имени) расположенную <em>после</em> префикса <kbd>cf_</kbd>, в
дополнение к их стандартному имени начинающемся с <kbd>cf_</kbd>. Так,
например, на <kbd>[% first_field.name FILTER html %]</kbd> можно также
сослаться по имени <kbd>[% first_field.name.replace('^cf_') FILTER html %]</kbd>.
Однако, если это приведёт к конфликту между именами стандартных полей
[%+ terms.Bugzilla %] и именами настраиваемых полей, приоритет всегда будет
отдан именам стандартных полей.</p>
[% END %]
[% SET field_table = {} %]
[% FOREACH field = quicksearch_field_names.keys %]
[% description = field_descs.$field %]
[% field_table.$description = quicksearch_field_names.${field} %]
[% END %]
<table cellspacing="0" cellpadding="0" border="0" class="qs_fields">
<thead>
<tr>
<th class="field_name">Поле</th>
<th class="field_nickname">Имя или имена поля для поиска</th>
</tr>
</thead>
<tbody>
[% FOREACH desc = field_table.keys.sort %]
<tr>
<td class="field_name">[% desc FILTER html %]</td>
<td class="field_nickname">
[% FOREACH nickname = field_table.$desc %]
<kbd>[% nickname FILTER html %]</kbd>
[% ",&nbsp; " UNLESS loop.last %]
[% END %]
</tr>
[% END %]
</tbody>
</table>
<h2 id="advanced_features">Расширенные возможности</h2>
<ul class="qs_help">
<li>Если вы хотите найти <strong>фразу</strong> или что-то, что содержит
пробелы, запятые, двоеточия или кавычки, вы должны поместить запрос в кавычки, например:
<kbd>"да, это фраза"</kbd>. Вы также должны использовать кавычки для поиска
символов, которые иначе были бы интерпретированы быстрым поиском
специальным образом. Например, <kbd>"this|that"</kbd> в буквальном смысле
будет искать фразу <em>this|that</em> и не будет распарсено как <kbd>"this OR that"</kbd>.
Также, <kbd>"-field:value"</kbd> в буквальном смысле будет искать
фразу <em>-field:value</em> и не будет распарсено как
<kbd>"NOT field:value"</kbd>.</li>
<li>При поиске вы можете использовать операторы <strong>AND</strong>,
<strong>NOT</strong> и <strong>OR</strong>.
Вы можете также использовать <kbd>-</kbd> что означает "NOT" и <kbd>|</kbd>
что означает "OR". Для "AND" нет специального символа, так как по умолчанию
любые условия поиска, разделенные пробелом, соединены "AND".
Примеры:
<ul>
<li>
<strong>NOT</strong>:<br>
Используйте <kbd><strong>-</strong><em>summary:foo</em></kbd> чтобы
исключить [%+ terms.bugs %] с <kbd>foo</kbd> в аннотации.<br>
<kbd><em>NOT summary:foo</em></kbd> будет иметь тот же эффект.
</li>
<li>
<strong>AND</strong>:<br>
<kbd><em>foo bar</em></kbd> будет искать [% terms.bugs %] содержащие
и <kbd>foo</kbd> и <kbd>bar</kbd>.<br>
<kbd><em>foo AND bar</em></kbd> будет иметь тот же эффект.
</li>
<li>
<strong>OR</strong>:<br>
<kbd><em>foo<strong>|</strong>bar</em></kbd> будет искать
[% terms.bugs %] содержащие <kbd>foo</kbd> ИЛИ <kbd>bar</kbd>.<br>
<kbd><em>foo OR bar</em></kbd> будет иметь тот же эффект.<br>
</li>
</ul>
<p>Вы не можете использовать ни | ни OR для перечисления возможных значений данного поля.
Вместо них вы должны использовать запятые. Так <kbd>field:value1,value2</kbd> будет делать
то, что вы ожидаете, но <kbd>field:value1|value2</kbd> будет интерпретировано как
<kbd>field:value1 OR value2</kbd>, что значит, что value2 не связано с
данным полем.</p>
<p>OR имеет более высокий приоритет, чем AND; AND является оператором
верхнего уровня.
Например:</p>
<p>Поиск <em><kbd>url|location bar|field -focus</kbd></em> означает
(<kbd>url</kbd> ИЛИ <kbd>location</kbd>) И (<kbd>bar</kbd> ИЛИ
<kbd>field</kbd>) И (НЕ <kbd>focus</kbd>)</p>
</li>
</ul>
<h2 id="shortcuts">Дополнительные ярлыки</h2>
<p>В дополнение к использованию <a href="#fields">имен полей</a> для поиска в
конкретных областях, есть определенные символы или слова, которые можно
использовать в качестве "ярлыков" для поиска в определенных областях:</p>
<table cellspacing="0" cellpadding="0" border="0" class="qs_fields">
<thead>
<tr>
<th class="field_name">Поле</th>
<th class="field_nickname">Ярлык(и)</th>
</tr>
</thead>
<tbody>
<tr>
<td class="field_name">[% field_descs.bug_status FILTER html %]</td>
<td class="field_nickname">
Делает <strong>первое слово</strong> вашего поиска именем любого
состояния, или даже аббревиатурой любого состояния, и производит поиск
[% terms.bugs %] в этом состоянии. <strong><kbd>ALL</kbd></strong> это
специальный ярлык, который означает "все состояния".
<strong><kbd>OPEN</kbd></strong> это специальный ярлык, который
означает "все открытые состояния".
</td>
</tr>
<tr>
<td class="field_name">[% field_descs.resolution FILTER html %]</td>
<td class="field_nickname">
Делает <strong>первое слово</strong> вашего поиска именем любого
решения, или даже аббревиатурой любого решения, и производит поиск
[%+ terms.bugs %] с этим решением. Например, сделав <kbd>FIX</kbd>
первым словом вашего поиска вы найдёте все [%+ terms.bugs %] с решением
<kbd>FIXED</kbd> .
</tr>
<tr>
<td class="field_name">[% field_descs.priority FILTER html %]</td>
<td class="field_nickname">"<strong>P1</strong>" (как слово в любом месте
поискового запроса) означает "найти [% terms.bugs %] с наивысшим приоритетом".
"P2" означает второй по важности приоритет и т.д.
<p>Поиск по "<strong>P1-3</strong>" найдёт [% terms.bugs %] с любым из
трёх самых высоких приоритетов и т.д.</p>
</td>
</tr>
<tr>
<td class="field_name">[% field_descs.assigned_to FILTER html %]</td>
<td class="field_nickname"><strong>@</strong><em>значение</em></td>
</tr>
<tr>
<td class="field_name">[% field_descs.product FILTER html %] или
[%+ field_descs.component FILTER html %]</td>
<td class="field_nickname"><strong>:</strong><em>значение</em></td>
</tr>
[% IF use_keywords %]
<tr>
<td class="field_name">[% field_descs.keywords FILTER html %]</td>
<td class="field_nickname"><strong>!</strong><em>значение</em></td>
</tr>
[% END %]
<tr>
[% SET key = "flagtypes.name" %]
<td class="field_name">[% field_descs.$key FILTER html %]</td>
<td class="field_nickname">
<em>флаг</em><strong>?</strong><em>инициатор</em>
</td>
</tr>
<tr>
<td class="field_name">[% field_descs.longdesc FILTER html %]
или [% field_descs.short_desc FILTER html %]</td>
<td class="field_nickname">
<strong>#</strong><em>значение</em>
</td>
</tr>
[% IF Param('usestatuswhiteboard') %]
<tr>
<td class="field_name">[% field_descs.short_desc FILTER html %]
или [% field_descs.status_whiteboard FILTER html %]</td>
<td class="field_nickname"><strong>[</strong><em>значение</em></td>
</tr>
[% END %]
</tbody>
</table>
<h2 id="advanced_examples">Примеры сложных запросов</h2>
<p>Вы можете без особых усилий достаточно легко составлять сложные запросы.
Для составления очень сложных запросов, вам необходимо использовать
форму <a href="query.cgi?format=advanced">Расширенного поиска</a>.</p>
<ul class="qs_help">
<li>Все [% terms.bugs %], зарегистрированные или назначенные userA@company.com
(начальный @ является ярлыком для исполнителя, см. выше раздел
<a href="#shortcuts">Дополнительные ярлыки</a>):<br>
<kbd>ALL @userA@company.com OR reporter:userA@company.com</kbd></li>
<li>Все открытые [% terms.bugs %] в продукте productA либо с серьёзностью
"чрезвычайная", "критическая" или "серьёзная", либо с важностью P1, либо с установленным
согласованием blocker+, и которые не назначены ни userB@company.com ни
userC@company.com (предполагается, что у нас только два пользователя, подходящие
под userB и userC, иначе нужно будет писать логин целиком):<br>
<kbd>:productA sev:blocker,critical,major OR pri:P1 OR flag:blocker+ -assign:userB,userC</kbd></li>
<li>Все РЕШЁННЫЕ [% terms.bugs %] с установленным согласованием blocker+, но для которых
не установлено ни согласование approval+ ни согласование approval?:<br>
<kbd>FIXED flag:blocker+ -flag:approval+ -flag:approval?</kbd></li>
<li>[% terms.Bugs %], чья аннотация содержит фразу <em>That's a "unusual" issue</em>
(двойные кавычки экранируются при помощи <em>\"</em>):<br>
<kbd>summary:"That's a \"unusual\" issue"</kbd></li>
</ul>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% INCLUDE global/header.html.tmpl title = "sudo: Работа от имени пользователя" %]
<p>
[%+ terms.Bugzilla %] имеет возможность выполнять действия от имени других
пользователей. Функция называется <i>сеанс sudo</i> и требует наличия специальных
привилегий у пользователя sudo.
</p>
<p>
Во время сеанса [% terms.Bugzilla %] будет действовать от имени указанного
пользователя во всех деталях функционирования. Это особенно важно при отладке
или при выполнении срочных и критичных работ в отсутствие пользователя.
[% terms.Bugzilla %] отправит пользователю оповещение о работе от его имени
в момент начала сеанса, но о содержании сеанса никаких данных не будет.
</p>
<p>
Для использования этой функции Вы должны быть включены в специальную группу.
По умолчанию группа включает администраторов. Другим пользователям и членам
других групп доступ может быть предоставлен в индивидуальном порядке. Для
получения доступа следует обратиться к администратору:
<a href="mailto:[% Param("maintainer") %]">
[%- Param("maintainer") %]</a>.
</p>
<p>
Для запрета работы от вашего имени обратитесь к администратору, и уточните
возможность такого запрета. Для пользователей, имеющих доступ к работе от
имени других, такой запрет установлен автоматически.
</p>
<p id="message">
[% IF user.in_group('bz_sudoers') %]
Вы входите в группу <b>bz_sudoers</b>. Вы можете использовать
функцию работы от имени других пользователей.
[% ELSE %]
Вы не входите в соответствующую группу и не можете использовать
функцию работы от имени других пользователей.
[% END %]
[% IF user.in_group('bz_sudo_protect') %]
<br>
Вы входите в группу <b>bz_sudo_protect</b>. Другие пользователи
не могут использовать функцию для работы от Вашего имени.
[% END %]
</p>
[% INCLUDE global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% colsepchar = user.settings.csv_colsepchar.value %]
[% data = chart.data %]
Дата\Серия
[% FOREACH label = chart.labels %]
[% colsepchar %][% label FILTER csv %]
[% END %]
[%# The data, which is in the correct format for GD, is conceptually the wrong
# way round for CSV output. So, we need to invert it here, which is why
# these loops aren't just plain FOREACH.
#%]
[% i = 0 %]
[% WHILE i < data.0.size %]
[% j = 0 %]
[% WHILE j < data.size %]
[% IF j > 0 %]
[% colsepchar %]
[% END %]
[% data.$j.$i %]
[% j = j + 1 %]
[% END %]
[% i = i + 1 %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
#%]
[% DEFAULT width = 600
height = 350
%]
[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Диаграмма"
header_addl_info = time
%]
<div align="center">
[% imageurl = BLOCK %]chart.cgi?
[% imagebase FILTER html %]&amp;ctype=png&amp;action=plot&amp;width=
[% width %]&amp;height=[% height -%]
[% END %]
<img alt="Диаграмма" src="[% imageurl %]"
width="[% width %]" height="[% height %]">
<p>
[% sizeurl = BLOCK %]chart.cgi?
[% imagebase FILTER html %]&amp;action=wrap
[% END %]
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
[% height + 100 %]">Длиннее</a><br>
<a href="[% sizeurl %]&amp;width=[% width - 100 %]&amp;height=
[% height %]">Уже</a> *
<a href="[% sizeurl %]&amp;width=[% width + 100 %]&amp;height=
[% height %]">Шире</a>&nbsp;&nbsp;&nbsp;&nbsp;<br>
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
[% height - 100 %]">Короче</a><br>
</p>
<p>
<a href="chart.cgi?
[% imagebase FILTER html %]&amp;ctype=csv&amp;action=plot">CSV</a> |
<a href="chart.cgi?[% imagebase FILTER html %]&amp;action=assemble">Параметры
диаграммы</a>
</p>
</div>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% y_label = "$terms.Bugs" %]
[% x_label = "Дата" %]
[% IF chart.cumulate %]
[% USE graph = GD.Graph.area(width, height) %]
[% graph.set(cumulate => "true") %]
[% ELSE %]
[% USE graph = GD.Graph.lines(width, height) %]
[% END %]
[% FILTER null;
x_label_skip = (30 * chart.data.0.size / width);
graph.set(x_label => x_label,
y_label => y_label,
y_tick_number => 8,
y_max_value => chart.y_max_value,
x_label_position => 0.5,
x_labels_vertical => 1,
x_label_skip => x_label_skip,
legend_placement => "RT",
line_width => 2,
dclrs => ["lred", "lgreen", "lblue", "lyellow",
"lpurple", "lorange", "black", "green",
"blue", "dpink", "lbrown", "gray",
"red", "dpurple", "gold", "marine"]);
# Workaround for the fact that set_legend won't take chart.labels directly,
# because chart.labels is an array reference rather than an array.
graph.set_legend(chart.labels.0, chart.labels.1, chart.labels.2,
chart.labels.3, chart.labels.4, chart.labels.5,
chart.labels.6, chart.labels.7, chart.labels.8,
chart.labels.9, chart.labels.10, chart.labels.11,
chart.labels.12, chart.labels.13, chart.labels.14,
chart.labels.15);
graph.plot(chart.data).png | stdout(1);
END;
-%]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# product: object. The product for which we want to display component
# descriptions.
#%]
[% title = BLOCK %]
Компоненты продукта [% product.name FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl
style_urls = [ "skins/standard/reports.css" ]
title = title
%]
[% IF Param("useqacontact") %]
[% numcols = 3 %]
[% ELSE %]
[% numcols = 2 %]
[% END %]
<table cellpadding="0" cellspacing="0" id="components_header_table">
<tr>
<td class="instructions">
Выберите компонент для просмотра незакрытых [% terms.bugs_gen %] для этого
компонента:
</td>
<td class="product_container">
<span class="product_name">[% product.name FILTER html %]</span>
<div class="product_desc">
[% product.description FILTER html_light %]
</div>
</td>
</tr>
</table>
<span class="components_header">Компоненты</span>
<table summary="Таблица компонентов"
class="component_table" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>&nbsp;</th>
<th>Исполнитель</th>
[% IF Param("useqacontact") %]
<th>Приемка</th>
[% END %]
</tr>
</thead>
<tbody>
[% FOREACH comp = product.components %]
[% INCLUDE describe_comp %]
[% END %]
</tbody>
</table>
[% PROCESS global/footer.html.tmpl %]
[%############################################################################%]
[%# BLOCK for components %]
[%############################################################################%]
[% BLOCK describe_comp %]
<tr id="[% comp.name FILTER html %]">
<td rowspan="2" class="component_name">
<a href="buglist.cgi?product=
[%- product.name FILTER uri %]&amp;component=
[%- comp.name FILTER uri %]&amp;resolution=---">
[% comp.name FILTER html %]</a>
</td>
<td class="component_assignee">
[% INCLUDE global/user.html.tmpl who = comp.default_assignee %]
</td>
[% IF Param("useqacontact") %]
<td class="component_qa_contact">
[% IF comp.default_qa_contact %]
[% INCLUDE global/user.html.tmpl who = comp.default_qa_contact %]
[% END %]
</td>
[% END %]
</tr>
<tr>
<td colspan="[% numcols - 1 %]" class="component_description">
[% comp.description FILTER html_light %]
</td>
</tr>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# chart: Chart object representing the currently assembled chart.
# category: hash (keyed by category) of hashes (keyed by subcategory) of
# hashes (keyed by name), with value being the series_id of the
# series. Contains details of all series the user can see.
#%]
[% PROCESS global/header.html.tmpl
title = "Создание диаграммы"
%]
[% PROCESS "reports/series-common.html.tmpl"
donames = 1
%]
<script type="text/javascript">
[%# This function takes necessary action on selection of a subcategory %]
function subcatSelected() {
var cat = document.chartform.category.value;
var subcat = document.chartform.subcategory.value;
var names = series[cat][subcat];
var namewidget = document.chartform.name;
namewidget.options.length = 0;
var i = 0;
for (x in names) {
namewidget.options[i] = new Option(x, names[x]);
i++;
}
namewidget.disabled = false;
namewidget.options[0].selected = true;
checkNewState();
}
</script>
[% gttext = "Итого" %]
<form method="get" action="chart.cgi" name="chartform">
<table cellpadding="2" cellspacing="2" border="0">
[% IF NOT category OR category.size == 0 %]
<tr>
<td>
<i>Наборы данных не созданы, либо недоступны.</i>
</td>
</tr>
[% ELSE %]
<tr>
<th><label for="category">Категория</label>:</th>
<th></th>
<th><label for="subcategory">Подкатегория</label>:</th>
<th></th>
<th><label for="name" accesskey="N">Имя</label>:</th>
<th><br>
</th>
</tr>
<tr>
[% PROCESS series_select sel = { name => 'category',
size => 5,
onchange = "catSelected();
subcatSelected();" } %]
<td>
<noscript>
<input type="submit" name="action-assemble" value="Обновить --&gt;"
id="action-assemble">
</noscript>
</td>
[% PROCESS series_select sel = { name => 'subcategory',
size => 5,
onchange = "subcatSelected()" } %]
<td>
<noscript>
<input type="submit" name="action-assemble" value="Обновить --&gt;"
id="action-assemble2">
</noscript>
</td>
[% PROCESS series_select sel = { name => 'name',
size => 5,
multiple => 1,
# We want to use the series ID as value,
# not its name.
value_in_hash => 1 } %]
<td align="center" valign="middle">
<input type="submit" name="action-add" value="Добавить в список"
id="action-add"><br>
</td>
</tr>
[% END %]
</table>
<h3>Наборы данных для диаграммы</h3>
[% IF chart.lines.size %]
<table cellspacing="2" cellpadding="2">
<tr>
<th style="width: 5em;">Выбрать</th>
<th>Подпись</th>
<th></th>
<th>Набор данных</th>
<th></th>
</tr>
[%# The external loop has two counters; one which keeps track of where we
# are in the old labels array, and one which keeps track of the new
# indexes for the form elements. They are different if chart.lines has
# empty slots in it.
#%]
[% labelidx = 0 %]
[% newidx = 0 %]
[% FOREACH line = chart.lines %]
[% IF NOT line %]
[%# chart.lines has an empty slot, so chart.labels will too. We
# increment labelidx only to keep the labels in sync with the data.
#%]
[% labelidx = labelidx + 1 %]
[% NEXT %]
[% END %]
[% FOREACH series = line %]
<tr>
[% IF loop.first %]
<td align="center" rowspan="[% line.size %]">
<input type="checkbox" value="1" name="select[% newidx %]">
</td>
<td rowspan="[% line.size %]">
<input type="text" size="20" name="label[% newidx %]"
value="[% (chart.labels.$labelidx OR series.name)
FILTER html %]">
</td>
[% END %]
<td>
[% "{" IF line.size > 1 %]
</td>
<td>
[% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %]
<input type="hidden" name="line[% newidx %]"
value="[% series.series_id %]">
</td>
<td align="center">
[% IF user.id == series.creator_id OR user.in_group("admin") %]
<a href="chart.cgi?action=edit&amp;series_id=
[% series.series_id %]">Изменить</a> |
<a href="chart.cgi?action=confirm-delete&amp;series_id=
[%- series.series_id %]">Удалить</a> |
[% END %]
<a href="buglist.cgi?cmdtype=dorem&amp;namedcmd=
[% series.category FILTER uri %]%20/%20
[% series.subcategory FILTER uri %]%20/%20
[% series.name FILTER uri -%]&amp;series_id=
[% series.series_id %]&amp;remaction=runseries">Выполнить поиск</a>
</td>
</tr>
[% END %]
[% labelidx = labelidx + 1 %]
[% newidx = newidx + 1 %]
[% END %]
[% IF chart.gt %]
<tr>
<td align="center">
<input type="checkbox" value="1" name="select65536">
<input type="hidden" value="1" name="gt">
</td>
<td>
<input type="text" size="20" name="labelgt"
value="[% (chart.labelgt OR gttext) FILTER html %]">
</td>
<td></td>
<td>
<i>[% gttext FILTER html %]</i>
</td>
<td></td>
</tr>
[% END %]
<tr>
<td colspan="6">&nbsp;</td>
</tr>
<tr>
<td valign="bottom" style="text-align: center;">
<input type="submit" name="action-sum" value="Добавить"
style="width: 5em;" id="action-sum"><br>
<input type="submit" name="action-remove" value="Исключить"
style="width: 5em;" id="action-remove">
</td>
<td style="text-align: right; vertical-align: bottom;">
<label for="cumulate"><b>Суммировать</b></label>:
<input type="checkbox" name="cumulate" id="cumulate" value="1"
[% " checked" IF chart.cumulate %]>
</td>
<td></td>
<td valign="bottom">
<label for="datefrom"><b>Диапазон дат</b></label>: с
<input type="text" size="12" name="datefrom" id="datefrom"
value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom%]">
<label for="dateto"><b>по</b></label>
<input type="text" size="12" name="dateto" id="dateto"
value="[% time2str("%Y-%m-%d", chart.dateto) IF chart.dateto %]">
</td>
<td style="text-align: right" valign="bottom">
<input type="submit" name="action-wrap" value="Построить диаграмму"
id="action-wrap">
</td>
</tr>
</table>
[% ELSE %]
<p><i>Не указаны</i></p>
[% END %]
</form>
[% IF user.in_group('editbugs') %]
<h3>Создать набор данных</h3>
<p>
Вы можете создать новый набор данных на основе сохраненного условия отбора
или начать с чистого листа.
</p>
<form action="chart.cgi" id="create_series" name="create_series" method="GET">
<input type="hidden" name="action" value="convert_search">
<label for="series_from_search">На основе:</label>
<select id="series_from_search" name="series_from_search">
<option value="">(чистый лист)</option>
[% FOREACH q = user.queries %]
<option value="[% q.name FILTER html %]">[% q.name FILTER html %]</option>
[% END %]
</select>
<input id="submit_create" type="submit" value="Создать новый набор данных">
</form>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% series_name = BLOCK %]
[% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl title = "Удаление серии данных"
style_urls = ['skins/standard/admin.css'] %]
<p>
Вы собираетесь удалить серию <b>[% series_name FILTER none %]</b>
из базы данных. Все данные в этой серии будут удалены без возможности восстановления.
</p>
<p>
[% IF series.creator %]
Эта серия данных создана пользователем <a href="mailto:[% series.creator.email FILTER html %]">
[% series.creator.email FILTER html %]</a>
[% ELSE %]
Эта серия данных создана [% terms.Bugzilla %] автоматически
[% END %]
[% IF series.public %]
и является общедоступной.
[% ELSIF series.creator %]
и доступна только этому пользователю.
[% ELSE %]
и не может быть использована никем.
[% END %]
</p>
<p class="areyoureallyreallysure">Подтвердите удаление серии данных</p>
<p>
<a href="chart.cgi?action=delete&amp;series_id=[% series.series_id FILTER html %]&amp;token=
[%- issue_hash_token([series.id, series.name]) FILTER uri %]">Да, удалить</a> |
<a href="chart.cgi">Нет, вернуться к диаграммам</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# You need to fulfill the interface to duplicates-table.html.tmpl.
#%]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
[% IF product.size %]
[% title = BLOCK %]
Наиболее частые [% terms.Bugs %] продукта [% product.join(', ') FILTER html %]
[% END %]
[% ELSE %]
[% title = "Наиболее частые $terms.bugs" %]
[% END%]
<head>
<title>[% title FILTER html %]</title>
<link href="[% 'skins/standard/global.css' FILTER mtime %]"
rel="stylesheet" type="text/css">
<link href="[% 'skins/standard/duplicates.css' FILTER mtime %]"
rel="stylesheet" type="text/css">
</head>
<body>
[% PROCESS "reports/duplicates-table.html.tmpl" %]
</body>
</html>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# bugs: list of hashes. May be empty. Each hash has three members:
# bug: A Bugzilla::Bug object
# count: integer. The number of dupes
# delta: integer. The change in count in the last $changedsince days
#
# bug_ids: list of integers. May be empty. The IDs of the bugs in $bugs.
#
# sortby: string. the column on which we are sorting the buglist.
# reverse: boolean. True if we are reversing the current sort.
# maxrows: integer. Max number of rows to display.
# changedsince: integer. The number of days ago for the changedsince column.
# openonly: boolean. True if we are only showing open bugs.
# product: array of strings. Restrict to these products only.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[%# *** Column Headers *** %]
[% SET columns = [
{ name => "id", description => "$terms.Bug #" },
{ name => "count", description => "Кол-во<br>дублей" },
{ name => "delta",
description => "Изменения за<br>$changedsince дней" },
{ name => "component", description => field_descs.component },
{ name => "bug_severity", description => field_descs.bug_severity },
{ name => "op_sys", description => field_descs.op_sys },
{ name => "target_milestone", description => field_descs.target_milestone },
{ name => "short_desc", description => field_descs.short_desc },
] %]
[% SET base_args = [] %]
[% FOREACH param = ['maxrows', 'openonly', 'format', 'sortvisible',
'changedsince', 'product']
%]
[% NEXT IF NOT ${param}.defined %]
[% FOREACH value = ${param} %]
[% filtered_value = value FILTER uri %]
[% base_args.push("$param=$filtered_value") %]
[% END %]
[% END %]
[% IF sortvisible %]
[% bug_ids_string = bug_ids.nsort.join(',') FILTER uri %]
[% base_args.push("bug_id=$bug_ids_string") %]
[% END %]
[% base_args_string = base_args.join('&amp;') %]
[% IF bugs.size %]
<table id="duplicates_table" cellpadding="0" cellspacing="0">
<thead>
<tr>
[% FOREACH column = columns %]
[% IF column.name == sortby %]
[%# We add this to the column object so it doesn't affect future
# iterations of the loop.
#%]
[% column.reverse_sort = reverse ? 0 : 1 %]
[% END %]
<th class="[% column.name FILTER html %]">
<a href="duplicates.cgi?sortby=[% column.name FILTER uri %]
[% IF column.reverse_sort.defined %]
[%- %]&amp;reverse=[% column.reverse_sort FILTER uri %]
[% END %]
[% IF base_args_string %]
[% "&amp;$base_args_string" FILTER none %]
[% END %]"
>[% column.description FILTER none %]</a>
</th>
[% END %]
</tr>
</thead>
[%# *** Buglist *** %]
<tbody>
[% FOREACH item = bugs %]
[% SET bug = item.bug %]
<tr [% " class='resolved'" IF NOT bug.isopened %]>
<td class="id">
[% bug.id FILTER bug_link(bug) FILTER none %]
</td>
<td class="count">[% item.count FILTER html %]</td>
<td class="delta">[% item.delta FILTER html %]</td>
<td class="component">[% bug.component FILTER html %]</td>
<td class="bug_severity">
[%- display_value('bug_severity', bug.bug_severity) FILTER html %]
</td>
<td class="op_sys">
[%- display_value('op_sys', bug.op_sys) FILTER html %]
</td>
<td class="target_milestone">
[% display_value('target_milestone',
bug.target_milestone) FILTER html %]
</td>
<td class="short_desc">[% bug.short_desc FILTER html %]</td>
</tr>
[% END %]
</tbody>
</table>
[% ELSE %]
<h3>Дубликатов [% terms.bugs_gen %] не найдено.</h3>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# sortby: string. the column on which we are sorting the buglist.
# reverse: boolean. True if we are reversing the current sort.
# maxrows: integer. Max number of rows to display.
# changedsince: integer. The number of days ago for the changedsince column.
# openonly: boolean. True if we are only showing open bugs.
# product: array of strings. The set of products we check for dups.
#
# Additionally, you need to fulfill the interface to
# duplicates-table.html.tmpl.
#%]
[% PROCESS global/variables.none.tmpl %]
[% IF product.size %]
[% title = BLOCK %]
Наиболее частые [% terms.Bugs %] для
[%+ product.join(', ') FILTER html %]
[% END %]
[% ELSE %]
[% title = "Наиболее частые $terms.bugs" %]
[% END%]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/duplicates.css']
%]
<p>
<a href="#explanation">Пояснения к отчету</a>
<br>
<a href="#params">Изменить параметры</a>
</p>
[% PROCESS "reports/duplicates-table.html.tmpl" %]
[%# *** Parameters *** %]
[% bug_ids_string = bug_ids.join(',') %]
<h3 id="params">Изменить параметры</h3>
<form method="get" action="duplicates.cgi">
<input type="hidden" name="sortby" value="[% sortby FILTER html %]">
<input type="hidden" name="reverse" value="[% reverse FILTER html %]">
<input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]">
<table>
<tr>
<td>Сортировка и фильтр применяются к:</td>
<td>
<input type="radio" name="sortvisible" id="entirelist" value="0"
[% ' checked="checked"' IF NOT sortvisible %]>
<label for="entirelist">
всему списку
</label>
<br>
<input type="radio" name="sortvisible" id="visiblelist" value="1"
[% ' checked="checked"' IF sortvisible %]>
<label for="visiblelist">
отображаемой части
</label>
</td>
<td rowspan="4" valign="top">Продукты:</td>
<td rowspan="4" valign="top">
<select name="product" size="5" multiple="multiple">
[% FOREACH p = user.get_selectable_products %]
<option name="[% p.name FILTER html %]"
[% ' selected="selected"' IF product.contains(p.name) %]
>[% p.name FILTER html %]</option>
[% END %]
</select>
</td>
</tr>
<tr>
<td><label for="maxrows">Ошибок не более:</label></td>
<td>
<input size="4" name="maxrows" id="maxrows"
value="[% maxrows FILTER html %]">
</td>
</tr>
<tr>
<td>
<label for="changedsince">Изменения за последние:</label>
</td>
<td>
<input size="4" name="changedsince" id="changedsince"
value="[% changedsince FILTER html %]"> дней
</td>
</tr>
<tr>
<td>
<label for="openonly">
Только незакрытые [% terms.bugs %]:
</label>
</td>
<td>
<input type="checkbox" name="openonly" id="openonly" value="1"
[% ' checked="checked"' IF openonly %]>
</td>
</tr>
</table>
<input type="submit" id="change" value="Применить">
</form>
<form method="post" action="buglist.cgi">
<input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]">
Или сформировать как <input type="submit" id="list"
value="список [% terms.bugs_gen %]">.
(Порядок сортировки может измениться.)
</form>
<hr>
<h3 id="explanation">
Что такое "наиболее частые [% terms.bugs %]"?
</h3>
<p>
Список наиболее частых [% terms.bugs_gen %] перечисляет
незакрытые [%+ terms.bugs %], которые регистрируются наиболее часто,
путём подсчета прямых и косвенных дублей каждой [% terms.bug_gen %].
Эти данные должны способствовать уменьшению количества повторно
регистрируемых [% terms.bugs_gen %] и повышению
производительности разработчиков.
</p>
<b>Как пользоваться списком?</b>
<ul>
<li>Изучите список наиболее частых [% terms.bugs_gen %].</li>
<li>Если проблема упомянута в нем:</li>
<ul>
<li>Выберите номер [% terms.bug_gen %] для подтверждения факта ее обнаружения, при
необходимости добавьте комментарии. Или просто продолжайте тестирование.
</li>
</ul>
<li>Если проблемы нет в списке:</li>
<ul>
<li>Используйте <a href="query.cgi">форму поиска</a>
для поиска уже зарегистрированных сообщений об этой проблеме.</li>
<li>Если проблема уже описана, добавьте комментарий с дополнительными данными
по проблеме, которые вы собрали.</li>
<li>Если описание проблемы не найдено, переходите к
<a href="enter_bug.cgi">форме регистрации [% terms.bug_gen %]</a>.</li>
</ul>
</ul>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% title = "Редактирование серии" %]
[% subheader = BLOCK %]
[% default.category FILTER html %] /
[%+ default.subcategory FILTER html %] /
[%+ default.name FILTER html %]
[% END %]
[% PROCESS global/header.html.tmpl %]
[% IF changes_saved %]
<p>
<font color="red">
Серия данных обновлена.
</font>
</p>
[% END %]
<form method="get" action="chart.cgi" name="chartform">
[% PROCESS reports/series.html.tmpl
button_name = "Изменить набор данных" %]
<input type="hidden" name="action" value="alter">
<input type="hidden" name="token"
value="[% issue_hash_token([default.id, default.name]) FILTER html %]">
[% IF default.series_id %]
<input type="hidden" name="series_id" value="[% default.series_id %]">
[% END %]
</form>
<p>
<b>Подготовил</b>:
[% IF default.creator %]
<a href="mailto:[% default.creator.email FILTER html %]">
[% default.creator.email FILTER html %]</a>
[% ELSE %]
(Создано [% terms.Bugzilla %] автоматически.)
[% END %]
</p>
<p>Примечание: изменение условий отбора для этого набора данных в текущей версии невозможно.
</p>
<p>
<a href="query.cgi?[% default.query FILTER html %]">Условия отбора серии</a> |
<a href="buglist.cgi?cmdtype=dorem&amp;namedcmd=
[% default.category FILTER uri %]-
[% default.subcategory FILTER uri %]-
[% default.name FILTER uri %]&amp;remaction=runseries&amp;series_id=
[% default.series_id %]">Выполнить отбор</a>
</p>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# keywords: array keyword objects. May be empty. Each has has four members:
# id: id of the keyword
# name: the name of the keyword
# description: keyword description. Can contain some limited HTML code.
# bug_count: number of bugs with that keyword
# caneditkeywords: boolean. True if this user can edit keywords
%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Ключевые слова"
%]
[% FOREACH keyword = keywords %]
[% IF loop.index % 50 == 0 %]
[% IF loop.index != 0 %]
</table>
[% END %]
<table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF">
<th align="left">Слово</th>
<th align="left">Значение</th>
<th align="left">Незакрытые [% terms.bugs %]</th>
<th align="left">Всего [% terms.bugs_gen %]</th>
</tr>
[% END %]
<tr id="[% keyword.name FILTER html %]">
<th>
[% keyword.name FILTER html %]
</th>
<td>[% keyword.description FILTER html_light %]</td>
<td align="center">
[% IF keyword.bug_count > 0 %]
<a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]&amp;resolution=---">
Найти</a>
[% ELSE %]
none
[% END %]
</td>
<td align="right">
[% IF keyword.bug_count > 0 %]
<a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]">
[% keyword.bug_count %]</a>
[% ELSE %]
нет
[% END %]
</td>
</tr>
[% END %]
[% IF keywords.size > 0 %]
</table>
[% END %]
[% IF caneditkeywords %]
<p>
<a href="editkeywords.cgi">Редактировать ключевые слова</a>.
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface. It's a list of the available report
# types in Bugzilla.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Подготовка отчетов и диаграмм"
doc_section = "reporting.html"
style_urls = ['skins/standard/reports.css']
%]
<p>
[% terms.Bugzilla %] позволяет анализировать состояние базы данных
[% terms.bugs_gen %] несколькими способами.
</p>
<h2>Текущее состояние</h2>
<ul>
<li id="report_search">
<strong><a href="query.cgi">Поиск</a></strong> -
просмотр списков [% terms.bugs_gen %].
</li>
<li id="report_tabular">
<strong>
<a href="query.cgi?format=report-table">Отчеты</a>
</strong> -
таблицы количества [% terms.bugs_gen %] в 1, 2 или 3 измерениях, в формате HTML или CSV.
</li>
[% IF feature_enabled('graphical_reports') %]
<li id="report_graphical">
<strong>
<a href="query.cgi?format=report-graph">Диаграммы</a>
</strong> -
графики, гистограммы и круговые диаграммы.
</li>
[% END %]
<li id="report_duplicates">
<strong><a href="duplicates.cgi">Дубли</a></strong> -
список наиболее часто регистрируемых [% terms.bugs_gen %].
</li>
[% Hook.process('current_state') %]
</ul>
[% IF feature_enabled('new_charts') OR feature_enabled('old_charts') %]
<h2>Динамика изменений</h2>
<ul>
[% IF feature_enabled('old_charts') %]
<li id="old_charts">
<strong><a href="reports.cgi">Старый способ</a></strong> -
графики состояний и решений [% terms.bugs_gen %] вдоль
оси времени, для каждого продукта.
</li>
[% END %]
[% IF feature_enabled('new_charts') AND user.in_group(Param("chartgroup")) %]
<li id="new_charts">
<strong><a href="chart.cgi">Новый способ</a></strong> -
результат любого условия отбора во времени. Гораздо более
мощный инструмент.
</li>
[% END %]
</ul>
[% END %]
[% Hook.process('end') %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# products: an array of product names the user is allowed to view.
# datasets: an array of hashes with available statuses and resolutions.
# url_image: URL of the generated graph.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS global/header.html.tmpl
title = "Диаграммы"
h1 = "Добро пожаловать в инструмент построения диаграмм $terms.Bugzilla"
doc_section = "reporting.html#charts"
%]
<div align="center">
[% IF url_image %]
<img src="[% url_image FILTER html %]">
<br clear="both">
[% ELSE %]
<form id="choose_product" method="get" action="reports.cgi">
<table border="1" cellpadding="5" cellspacing="2">
<tr>
<th>Продукт:</th>
<td align="center">
<select id="product" name="product">
[% FOREACH product = products %]
<option value="[% product FILTER html %]">[% product FILTER html %]</option>
[% END %]
</select>
</td>
</tr>
<tr>
<th>Данные для диаграммы:</th>
<td align="center">
<select id="datasets" name="datasets" multiple="multiple" size="5">
[%# We cannot use translated statuses and resolutions from field-descs.none.html
# because old charts do not distinguish statuses from resolutions. %]
[% FOREACH dataset = datasets %]
<option value="[% dataset.value FILTER html %]"
[% " selected=\"selected\"" IF dataset.selected %]>
[% dataset.value FILTER html %]</option>
[% END %]
</select>
</td>
</tr>
<tr>
<th colspan="2">
<input type="submit" id="submit" value="Построить диаграмму">
</th>
</tr>
</table>
</form>
[% END %]
</div>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# You need to fulfill the interface to report-table.html.tmpl.
#%]
[% PROCESS global/variables.none.tmpl %]
<html>
[% title = "Список $terms.bugs_gen" %]
<head>
<title>[% title FILTER html %]</title>
</head>
<body>
[% PROCESS "reports/report-table.html.tmpl" %]
</body>
</html>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% colsepchar = user.settings.csv_colsepchar.value %]
[% num_bugs = BLOCK %]Количество [% terms.bugs_gen %][% END %]
[% tbl_field_disp = field_descs.$tbl_field || tbl_field %]
[% col_field_disp = field_descs.$col_field || col_field %]
[% row_field_disp = field_descs.$row_field || row_field %]
[% IF tbl_field %]
[% IF tbl_field == 'assigned_to' OR tbl_field == 'reporter'
OR tbl_field == 'qa_contact'
%]
[% tbl_disp = tbl FILTER email %]
[% ELSE %]
[% tbl_disp = tbl %]
[% END %]
[% tbl_field_disp FILTER csv %]: [% tbl_disp FILTER csv %]
[% END %]
[% IF row_field %]
[% row_field_disp FILTER csv %]
[% END %]
[% " / " IF col_field AND row_field %]
[% col_field_disp FILTER csv %]
[% IF col_field -%]
[% FOREACH col = col_names -%]
[% colsepchar %]
[% PROCESS value_display value = col field = col_field %]
[% END -%]
[% ELSE -%]
[% colsepchar %][% num_bugs FILTER csv %]
[% END %]
[% FOREACH row = row_names %]
[% PROCESS value_display value = row field = row_field %]
[% FOREACH col = col_names %]
[% colsepchar %]
[% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %]
[% data.$tbl.$col.$row -%]
[% ELSE %]
[% -%]0
[% END %]
[% END %]
[% END %]
[% BLOCK value_display %]
[% SET disp_value = display_value(field, value) %]
[% IF field == 'assigned_to' OR field == 'reporter'
OR field == 'qa_contact'
%]
[% disp_value = value FILTER email %]
[% END %]
[% disp_value FILTER csv %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# buglistbase: The base query for this table, in URL form
# col_field: string. Name of the field being plotted as columns.
# row_field: string. Name of the field being plotted as rows.
# tbl_field: string. Name of the field being plotted as tables.
# col_names: array. List of values for the field being plotted as columns.
# row_names: array. List of values for the field being plotted as rows.
# data: <depends on format>. Data to plot. Only data.$tbl is accessed.
# tbl: Name of a hash in data which is the table to be plotted.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% col_field_disp = field_descs.$col_field || col_field %]
[% row_field_disp = field_descs.$row_field || row_field %]
[% urlbase = BLOCK %]buglist.cgi?[% buglistbase FILTER html %][% END %]
[% IF tbl == "-total-" %]
[% IF tbl_vals %]
[% urlbase = urlbase _ "&amp;" _ tbl_vals %]
[% END %]
[% ELSIF tbl_field %]
[% urlbase = BLOCK %][% urlbase %]&amp;[% tbl_field FILTER uri %]=[% tbl FILTER uri %][% END %]
[% END %]
<script type="text/javascript">
function bz_encode (str, decode) {
// First decode HTML entities, if requested.
if (decode)
str = str.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"')
.replace(/&nbsp;/g, " ").replace(/&amp;/g, "&").replace(/\s+$/,"");
// encodeURIComponent() doesn't escape single quotes.
return encodeURIComponent(str).replace(/'/g, escape);
};
YAHOO.util.Event.addListener(window, "load", function() {
this.Linkify = function(elLiner, oRecord, oColumn, oData) {
if (oData == 0)
elLiner.innerHTML = ".";
else if (oRecord.getData("row_title") == "Итого")
elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% col_field FILTER uri FILTER js %]='
+ bz_encode(oColumn.field)
+ '[% "&amp;" _ row_vals IF row_vals %]">' + oData + '</a>';
else
elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% row_field FILTER uri FILTER js %]='
+ bz_encode(oRecord.getData("row_title"), 1)
+ '&amp;[% col_field FILTER uri FILTER js %]='
+ bz_encode(oColumn.field) + '">' + oData + '</a>';
};
this.LinkifyTotal = function(elLiner, oRecord, oColumn, oData) {
if (oData == 0)
elLiner.innerHTML = ".";
else if (oRecord.getData("row_title") == "Итого")
elLiner.innerHTML = '<a href="[% urlbase FILTER js %][% "&amp;" _ row_vals IF row_vals %]
[%~ "&amp;" _ col_vals IF col_vals %]">'
+ oData + '</a>';
else
elLiner.innerHTML = '<a href="[% urlbase FILTER js %]&amp;[% row_field FILTER uri FILTER js %]='
+ bz_encode(oRecord.getData("row_title"), 1)
+ '[% "&amp;" _ col_vals IF col_vals %]">' + oData + '</a>';
YAHOO.util.Dom.addClass(elLiner.parentNode, "ttotal");
};
var totalRowFormatter = function( elTr, oRecord ) {
if ( oRecord.getData('row_title') == "Итого" ) {
YAHOO.util.Dom.addClass( elTr, 'ttotal' );
}
return true;
};
var totalNumberSorter = function( a, b, desc, field ){
var a_value = a.getData(field);
var b_value = b.getData(field);
var a_total_test = a.getData("row_title");
var b_total_test = b.getData("row_title");
var comp_result = YAHOO.util.Sort.compare(a_value, b_value, desc);
if( a_total_test == "Итого" ){
comp_result = 1;
}else if( b_total_test == "Итого" ){
comp_result = -1;
}
return comp_result;
};
var myColumnDefs = [
{key:"row_title", label:"", sortable:true, sortOptions: { sortFunction:totalNumberSorter }},
[% FOREACH col = col_names %]
{key:"[% col FILTER js %]", label:"[% display_value(col_field, col) FILTER html FILTER js %]", sortable:true,
formatter:this.Linkify, sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC, sortFunction:totalNumberSorter }},
[% END %]
{key:"total", label:"Итого", sortable:true, formatter:this.LinkifyTotal,
sortOptions: { defaultDir: YAHOO.widget.DataTable.CLASS_DESC, sortFunction:totalNumberSorter }}
];
this.parseString = function(str) {
return YAHOO.lang.trim(str);
};
this.parseNumber = function(str) {
if (str.match(/^\s*\.\s*$/m))
return 0;
// Do not use <\/a>$. For some reason, IE6 doesn't understand it.
// We use [^\d]+$ instead.
var res = str.match(/>(\d+)[^\d]+$/m);
if (res && res[1])
return parseFloat(res[1]);
};
this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("tabular_report"));
this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
this.myDataSource.responseSchema = {
fields: [
{key:"row_title", parser:this.parseString},
[% FOREACH col = col_names %]
{key:"[% col FILTER js %]", parser:this.parseNumber},
[% END %]
{key:"total", parser:this.parseNumber}
]
};
this.myDataTable = new YAHOO.widget.DataTable("tabular_report_container_
[% tbl FILTER js %]", myColumnDefs, this.myDataSource,
{formatRow: totalRowFormatter});
});
</script>
[% IF tbl_field %]
<h2>[% tbl_disp FILTER email FILTER html %]</h2>
[% END %]
<table>
<tr>
<td>
</td>
<td align="center">
<strong>[% col_field_disp FILTER html %]</strong>
</td>
</tr>
<tr>
<td valign="middle">
<strong>[% row_field_disp FILTER html %]</strong>
</td>
<td>
[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %]
[% col_idx = 0 %]
[% row_idx = 0 %]
[% grand_total = 0 %]
<div id="tabular_report_container_[% tbl FILTER html %]">
<table id="tabular_report" border="1">
[% IF col_field %]
<thead>
<tr>
<th class="[% classes.$row_idx.$col_idx %]">
</th>
[% FOREACH col = col_names %]
[% col_totals.$col = 0 %]
[% NEXT IF col == "" %]
[% col_idx = 1 - col_idx %]
<th class="[% classes.$row_idx.$col_idx %]">
[% PROCESS value_display value = col field = col_field %]
</th>
[% END %]
<th class="ttotal">
Итого
</th>
</tr>
</thead>
[% END %]
<tbody>
[% FOREACH row = row_names %]
[% row_total = 0 %]
[% row_idx = 1 - row_idx %]
<tr>
<td class="[% classes.$row_idx.$col_idx %]" align="right">
[% PROCESS value_display value = row field = row_field %]
</td>
[% FOREACH col = col_names %]
[% row_total = row_total + data.$tbl.$col.$row %]
[% NEXT IF col == "" %]
[% col_totals.$col = (col_totals.$col || 0) + data.$tbl.$col.$row %]
[% col_idx = 1 - col_idx %]
<td class="[% classes.$row_idx.$col_idx %]" align="center">
[% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %]
<a href="[% urlbase %]&amp;
[% row_field FILTER uri %]=[% row FILTER uri %]&amp;
[% col_field FILTER uri %]=[% col FILTER uri %]">
[% data.$tbl.$col.$row %]</a>
[% ELSE %]
.
[% END %]
</td>
[% END %]
<td class="ttotal" align="right">
<a href="[% urlbase %]&amp;
[% row_field FILTER uri %]=[% row FILTER uri %]
[% "&amp;$col_vals" IF col_vals %]">
[% row_total %]</a>
[% grand_total = grand_total + row_total %]
</td>
</tr>
[% END %]
<tr>
[% row_idx = 1 - row_idx %]
<td class="ttotal">
Итого
</td>
[% FOREACH col = col_names %]
[% NEXT IF col == "" %]
<td class="ttotal" align="center">
<a href="[% urlbase %]&amp;
[% col_field FILTER uri %]=[% col FILTER uri %]
[% "&amp;$row_vals" IF row_vals %]">
[% col_totals.$col %]</a>
</td>
[% END %]
<td class="ttotal" align="right">
<strong>
<a href="[% urlbase %]
[% "&amp;$row_vals" IF row_vals %]
[% "&amp;$col_vals" IF col_vals %]">[% grand_total %]</a>
</strong>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</table>
[% BLOCK value_display %]
[% SET disp_value = display_value(field, value) %]
[% IF field == 'assigned_to' OR field == 'reporter'
OR field == 'qa_contact'
%]
[% disp_value = value FILTER email %]
[% END %]
[% disp_value FILTER html FILTER replace('^ $','&nbsp;') %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# col_field: string. Name of the field being plotted as columns.
# row_field: string. Name of the field being plotted as rows.
# tbl_field: string. Name of the field being plotted as tables.
# tbl_names: array. List of values for the field being plotted as tables.
# time: integer. Seconds since the epoch.
# data: <depends on format>. Data to plot.
# format: string. Format of the individual reports.
# width: integer. For image charts, height of the image.
# height: integer. For image charts, width of the image.
# imagebase: string. Base URL for chart image.
# switchbase: string. Base URL for format switching.
# cumulate: boolean. For bar/line charts, whether to cumulate data sets.
#%]
[% DEFAULT width = 1024
height = 600
%]
[% IF min_width AND width < min_width %]
[% width = min_width %]
[% END %]
[%# We ignore row_field for pie charts %]
[% IF format == "pie" %]
[% row_field = "" %]
[% END %]
[% PROCESS "global/field-descs.none.tmpl" %]
[% tbl_field_disp = field_descs.$tbl_field || tbl_field %]
[% col_field_disp = field_descs.$col_field || col_field %]
[% row_field_disp = field_descs.$row_field || row_field %]
[% switchbase = switchbase FILTER html %]
[% title = BLOCK %]
Отчёт:
[% IF tbl_field %]
[% tbl_field_disp FILTER html %]
[% END %]
[% " / " IF tbl_field AND (col_field OR row_field) %]
[% IF row_field %]
[% row_field_disp FILTER html %]
[% END %]
[% " / " IF col_field AND row_field %]
[% col_field_disp FILTER html %]
[% END %]
[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
[% PROCESS global/header.html.tmpl
header_addl_info = time
style_urls = ['skins/standard/reports.css']
yui = ['datatable']
%]
[% IF debug %]
[% FOREACH query = queries %]
<p>[% query.sql FILTER html %]</p>
[% END %]
[% END %]
<div align="center">
[% FOREACH tbl = tbl_names %]
[% IF tbl == "-total-" %]
[% tbl_disp = "Итого" %]
[% ELSE %]
[% tbl_disp = tbl %]
[% END %]
[% IF format == "table" %]
[% PROCESS "reports/report-table.html.tmpl" %]
[% ELSE %]
[% IF tbl %]
<h2>[% tbl_disp FILTER email FILTER html %]</h2>
[% END %]
[% imageurl = BLOCK %]report.cgi?[% imagebase FILTER html %]&amp;format=
[% format FILTER uri %]&amp;ctype=png&amp;action=plot&amp;
[% IF tbl_field %]
[% IF tbl != "-total-" %]
[% tbl_field FILTER uri %]=[% tbl FILTER uri %]&amp;
[% ELSE %]
[% FOREACH tblname = tbl_names %]
[% IF tblname != "-total-" %]
[% tbl_field FILTER uri %]=[% tblname FILTER uri %]&amp;
[% END %]
[% END %]
[% END %]
[% END %]width=[% width %]&amp;height=[% height %]
[% END %]
<img id="graphical_report" alt="Диаграмма" src="[% imageurl %]">
[% END %]
<br>
[% END %]
[% formats = [ { name => "pie", description => "Круговая" },
{ name => "bar", description => "Гистограмма" },
{ name => "line", description => "График" },
{ name => "table", description => "Таблица" } ] %]
[% formaturl = "report.cgi?$switchbase&amp;width=$width&amp;height=$height&amp;action=wrap" %]
[% FOREACH other_format = formats %]
[% NEXT IF other_format.name == "pie" AND row_field AND col_field %]
[% UNLESS other_format.name == format %]
<a href="[% formaturl %]&amp;format=[% other_format.name %]">
[% END %]
[% other_format.description FILTER html %]
[% "</a>" UNLESS other_format.name == format %] |
[% END %]
<a href="[% formaturl %]&amp;ctype=csv&amp;format=table">CSV</a>
<table>
<tr>
<td>
[% IF format == "table" %]
<a href="query.cgi?[% switchbase %]&amp;format=report-table">Параметры отчета</a>
[% ELSE %]
<a href="query.cgi?[% switchbase %]&amp;chart_format=
[%~ format FILTER uri %]&amp;format=report-graph&amp;cumulate=[% cumulate %]">
Параметры диаграммы</a>
[% END %]
</td>
<td>|</td>
<td>
[% IF saved_report_id %]
<a href="report.cgi?action=del&amp;saved_report_id=[% saved_report_id FILTER uri %]&amp;token=
[%~ issue_hash_token(['delete_report', saved_report_id]) FILTER uri %]">Удалить этот отчёт</a>
[% ELSE %]
<form method="get" action="report.cgi">
<input type="submit" id="remember" value="Записать отчёт"> как
<input type="hidden" name="query" value="[% switchbase %]&amp;format=[% format FILTER uri %]&amp;action=wrap">
<input type="hidden" name="action" value="add">
<input type="hidden" name="token" value="[% issue_hash_token(['save_report']) FILTER html %]">
<input type="text" id="name" name="name" size="20" value="" maxlength="64">
</form>
[% END %]
</td>
</tr>
</table>
</div>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# default: hash. Defaults for category, subcategory, name etc.
# button_name: string. What the button will say.
# category: hash (keyed by category) of hashes (keyed by subcategory) of
# hashes (keyed by name), with value being the series_id of the
# series. Contains details of all series the user can see.
#%]
[% PROCESS "reports/series-common.html.tmpl"
newtext = "Новая серия"
%]
<table cellpadding="2" cellspacing="2" border="0"
style="text-align: left; margin-left: 20px">
<tbody>
<tr>
<th>Категория:</th>
<th></th>
<th>Подкатегория:</th>
<th>Имя:</th>
<td></td>
</tr>
<tr>
[% PROCESS series_select sel = { name => 'category',
size => 5,
onchange => "catSelected()" } %]
<td>
<noscript>
<input type="submit" name="action-edit" value="Обновить --&gt;"
id="action-edit">
</noscript>
</td>
[% PROCESS series_select sel = { name => 'subcategory',
size => 5,
onchange => "checkNewState()" } %]
<td valign="top" name="name">
<input type="text" name="name" maxlength="64"
value="[% default.name.0 FILTER html %]" size="25">
</td>
<td valign="top">
<span style="font-weight: bold;">Выполнять каждые</span> &nbsp;
<input type="text" size="2" name="frequency"
value="[% (default.frequency.0 OR 7) FILTER html %]">
<span style="font-weight: bold;">&nbsp;дней</span><br>
[%# Change 'admin' here and in Series.pm, or remove the check
completely, if you want to change who can make series public. %]
[% IF user.in_group('admin') %]
<input type="checkbox" name="public"
[%+ "checked='checked'" IF default.public.0 %]>
<span style="font-weight: bold;">Результат доступен всем<br>
(с учетом прав доступа)</span>
[% END %]
</td>
</tr>
<tr>
<td>
<input type="text" style="width: 100%" name="newcategory"
maxlength="64" value="[% default.newcategory.0 FILTER html %]">
</td>
<td></td>
<td>
<input type="text" style="width: 100%" name="newsubcategory"
maxlength="64"
value="[% default.newsubcategory.0 FILTER html %]">
</td>
<td></td>
<td>
<input type="submit" name="submit-button" id="submit-button"
value="[% button_name FILTER html %]">
</td>
</tr>
</tbody>
</table>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% PROCESS global/header.html.tmpl
title="Ожидание согласования"
onload="var f = document.request_form; selectProduct(f.product, f.component, null, null, 'Any');"
javascript_urls=["js/productform.js", "js/field.js"]
style_urls = ['skins/standard/buglist.css']
yui = ['autocomplete']
%]
<script type="text/javascript">
var useclassification = false; // No classification level in use
var first_load = true; // Is this the first time we load the page?
var last_sel = []; // Caches last selection
var cpts = new Array();
[% n = 1 %]
[% IF Param('useclassification') %]
[% FOREACH clas = user.get_selectable_classifications %]
[% FOREACH prod = user.get_selectable_products(clas.id) %]
[%+ PROCESS js_comp %]
[% END %]
[% END %]
[% ELSE %]
[% FOREACH prod = user.get_selectable_products %]
[%+ PROCESS js_comp %]
[% END %]
[% END %]
</script>
[% BLOCK js_comp %]
cpts['[% n %]'] = [
[%- FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%]];
[% n = n+1 %]
[% END %]
<p>
Вошедшим в систему пользователям по умолчанию отображаются только
согласования, адресованные пользователю или запрошенные им. Критерии
отображения могут быть изменены ниже. Анонимным пользователям отображаются
все согласования, доступ к которым не ограничен членством в группах.
</p>
<form id="request_form" name="request_form" action="request.cgi" method="get">
<input type="hidden" name="action" value="queue">
<table id="filtering">
<tr>
<th>Инициатор:</th>
<td>
[% INCLUDE global/userselect.html.tmpl
id => "requester"
name => "requester"
value => cgi.param('requester')
size => 20
emptyok => 1
field_title => "Email инициатора"
%]
</td>
<th>Продукт:</th>
<td>
<select name="product" onchange="selectProduct(this, this.form.component, null, null, 'Any');">
<option value="">Все</option>
[% IF Param('useclassification') %]
[% FOREACH c = user.get_selectable_classifications %]
<optgroup label="[% c.name FILTER html %]">
[% FOREACH p = user.get_selectable_products(c.id) %]
<option value="[% p.name FILTER html %]"
[% " selected" IF cgi.param('product') == p.name %]>
[% p.name FILTER html %]
</option>
[% END %]
</optgroup>
[% END %]
[% ELSE %]
[% FOREACH p = user.get_selectable_products %]
<option value="[% p.name FILTER html %]"
[% " selected" IF cgi.param('product') == p.name %]>
[% p.name FILTER html %]
</option>
[% END %]
[% END %]
</select>
</td>
<th>Вид согласования:</th>
<td>
[% PROCESS "global/select-menu.html.tmpl"
name="type"
options=types
default=cgi.param('type') %]
</td>
[%# We could let people see a "queue" of non-pending requests. %]
<!--
<th>Состояние:</th>
<td>
[%# PROCESS "global/select-menu.html.tmpl"
name="status"
options=["все", "?", "+-", "+", "-"]
default=cgi.param('status') %]
</td>
-->
</tr>
<tr>
<th>Адресат:</th>
<td>
[% INCLUDE global/userselect.html.tmpl
id => "requestee"
name => "requestee"
value => cgi.param('requestee')
size => 20
emptyok => 1
hyphenok => 1
field_title => "Email адресата запроса или \"-\" (дефис) для запросов без конкретного адресата"
%]
</td>
<th>Компонент:</th>
<td>
<select name="component">
<option value="">Все</option>
[% FOREACH comp = components %]
<option value="[% comp FILTER html %]" [% "selected" IF cgi.param('component') == comp %]>
[% comp FILTER html %]</option>
[% END %]
</select>
</td>
<th>Группировать по:</th>
<td>
[% groups = {
"Инициатору" => 'requester' ,
"Адресату" => 'requestee',
"Виду" => 'type' ,
"Продукту/Компоненту" => 'category'
} %]
[% PROCESS "global/select-menu.html.tmpl" name="group" options=groups default=cgi.param('group') %]
</td>
</tr>
<tr>
<th></th>
<td>
<select id="do_union" name="do_union">
<option value="0">Соответствие инициатору И адресату</option>
<option value="1" [% 'selected="selected"' IF cgi.param('do_union') %]>
Соответствие инициатору ИЛИ адресату</option>
</select>
</td>
<td colspan="3"></td>
<td><input type="submit" id="filter" value="Выбрать"></td>
</tr>
</table>
</form>
[% column_headers = {
"type" => "Вид" ,
"status" => "Состояние" ,
"bug" => "$terms.Bug" ,
"attachment" => "Приложение" ,
"requester" => "Инициатор" ,
"requestee" => "Адресат" ,
"created" => "Дата" ,
"category" => "Продукт/Компонент" } %]
[% DEFAULT display_columns = ["requester", "requestee", "type", "bug", "attachment", "created"]
group_field = "Адресату"
group_value = ""
%]
[% IF debug %]
<p>[% query FILTER html %]</p>
[% END %]
[% IF requests.size == 0 %]
<p>
Нет незавершенных согласований.
</p>
[% ELSE %]
[% FOREACH request = requests %]
[% IF loop.first %] [% PROCESS start_new_table %] [% END %]
[% IF request.$group_field != group_value || loop.first %]
[% group_value = request.$group_field %]
[% PROCESS display_buglist UNLESS loop.first %]
[% PROCESS start_new_table %]
[% END %]
[% buglist.${request.bug_id} = 1 %]
<tr>
[% FOREACH column = display_columns %]
[% NEXT IF column == group_field || excluded_columns.contains(column) %]
<td>
[% PROCESS "display_$column" %]
[% Hook.process('after_column') %]
</td>
[% END %]
</tr>
[% END %]
[% PROCESS display_buglist %]
[% END %]
[% PROCESS global/footer.html.tmpl %]
[% BLOCK start_new_table %]
[% buglist = {} %]
<h3>[% column_headers.$group_field %]:
[%+ (request.$group_field || "Нет") FILTER email FILTER html %]</h3>
<table class="requests" cellspacing="0" cellpadding="4" border="1">
<tr>
[% FOREACH column = display_columns %]
[% NEXT IF column == group_field || excluded_columns.contains(column) %]
<th>[% column_headers.$column %]</th>
[% END %]
</tr>
[% END %]
[% BLOCK display_type %]
[% request.type FILTER html %]
[% END %]
[% BLOCK display_status %]
[% request.status %]
[% END %]
[% BLOCK display_bug %]
<a href="show_bug.cgi?id=[% request.bug_id %]"
[%- ' class="bz_secure"' IF request.restricted %]>
[% request.bug_id %]: [%+ request.bug_summary FILTER html %]</a>
[% END %]
[% BLOCK display_attachment %]
[% IF request.attach_id %]
<a href="attachment.cgi?id=[% request.attach_id %]&amp;action=edit">
[% request.attach_id %]: [%+ request.attach_summary FILTER html %]</a>
[% ELSE %]
N/A
[% END %]
[% END %]
[% BLOCK display_requestee %]
[% request.requestee FILTER email FILTER html %]
[% END %]
[% BLOCK display_requester %]
[% request.requester FILTER email FILTER html %]
[% END %]
[% BLOCK display_created %]
[% request.created FILTER time %]
[% END %]
[% BLOCK display_buglist %]
</table>
[% NEXT UNLESS buglist.keys.size %]
<a href="buglist.cgi?bug_id=
[%- buglist.keys.nsort.join(",") FILTER html %]">(просмотреть как
список [%+ terms.bug %])</a>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% types = [
"noop",
"equals",
"notequals",
"anyexact",
"substring",
"casesubstring",
"notsubstring",
"anywordssubstr",
"allwordssubstr",
"nowordssubstr",
"regexp",
"notregexp",
"lessthan",
"lessthaneq",
"greaterthan",
"greaterthaneq",
"anywords",
"allwords",
"nowords",
"changedbefore",
"changedafter",
"changedfrom",
"changedto",
"changedby",
"matches",
"notmatches",
] %]
<div class="bz_section_title" id="custom_search_filter">
<div id="custom_search_query_controller" class="arrow">&#9660;</div>
<a id="chart" href="javascript:TUI_toggle_class('custom_search_query')" >
Настраиваемый поиск</a> <span class="section_help">Не нашли наверху то что
ищете? В этой форме можно использовать AND-ы, OR-ы, и другие более
сложные поисковые запросы.</span>
</div>
<div id="custom_search_filter_section"
class="bz_search_section custom_search_query">
[% SET indent_level = 0 %]
[% SET cond_num = 0 %]
[% FOREACH condition = default.custom_search %]
[% SET cond_num = loop.count - 1 %]
[% PROCESS one_condition with_buttons = 0 %]
[% END %]
[% PROCESS one_condition
with_buttons = 1
condition = { f => 'noop' }
cond_num = cond_num + 1 %]
<script type="text/javascript">
TUI_alternates['custom_search_query'] = '&#9658;';
TUI_hide_default('custom_search_query');
TUI_alternates['custom_search_advanced'] = "Показать дополнительные функции";
TUI_hide_default('custom_search_advanced');
</script>
<script type="text/javascript" src="[% 'js/custom-search.js' FILTER mtime %]"></script>
<script type="text/javascript">
redirect_html4_browsers();
[%# These are alternative labels for the AND and OR options in and_all_select %]
var cs_and_label = 'Подходит под ВСЕ из следующих:';
var cs_or_label = 'Подходит под ЛЮБОЕ из следующих:';
cs_reconfigure('custom_search_last_row');
</script>
<script type="text/javascript" src="[% 'js/history.js/native.history.js' FILTER mtime %]"></script>
</div>
[% BLOCK one_condition %]
[%# Skip any conditions that don't have a field defined. %]
[% RETURN IF !condition.f %]
[% IF !top_level_any_shown %]
[% INCLUDE any_all_select
name = "j_top" selected = default.j_top.0
with_advanced_link = 1 %]
[% top_level_any_shown = 1 %]
[% END %]
[% IF condition.f == "CP" %]
[% indent_level = indent_level - 1 %]
[% END %]
<div class="custom_search_condition"
[% ' style="margin-left: ' _ (indent_level * 2) _ 'em"' IF indent_level %]
[% ' id="custom_search_last_row"' IF with_buttons %]>
[% IF previous_condition.f == "OP" %]
[% INCLUDE any_all_select
name = "j" _ (cond_num - 1)
selected = previous_condition.j %]
[% END %]
[% IF with_buttons %]
<button id="op_button" type="button" class="custom_search_advanced"
title="Начать формирование новой группы критериев, включая этот ряд"
onclick="custom_search_open_paren()">(</button>
[% END %]
[% UNLESS condition.f == "CP" %]
[%# This only gets hidden via custom_search_advanced if it isn't set. %]
<span id="custom_search_not_container_[% cond_num FILTER html %]"
class="custom_search_not_container
[%- ' custom_search_advanced' UNLESS condition.n %]"
title="Найти здесь обратный критерий">
<input type="checkbox" id="n[% cond_num FILTER html %]"
class="custom_search_form_field"
name="n[% cond_num FILTER html %]" value="1"
onclick="custom_search_not_changed([% cond_num FILTER js %])"
[% ' checked="checked"' IF condition.n %]>
<label for="n[% cond_num FILTER html %]">Нет</label>
</span>
[% END %]
[% IF condition.f == "OP" %]
<input type="hidden" name="f[% cond_num FILTER html %]"
id="f[% cond_num FILTER html %]" value="OP">
(
[% indent_level = indent_level + 1 %]
[% ELSIF condition.f == "CP" %]
<input type="hidden" name="f[% cond_num FILTER html %]"
id="f[% cond_num FILTER html %]" value="CP">
)
[% ELSE %]
<select name="f[% cond_num FILTER html %]" title="Поле"
id="f[% cond_num FILTER html %]"
onchange="fix_query_string(this)"
class="custom_search_form_field">
[% FOREACH field = fields %]
<option value="[% field.name FILTER html %]"
[%~ ' selected="selected"' IF field.name == condition.f %]>
[% field_descs.${field.name} || field.description FILTER html %]
</option>
[% END %]
</select>
[% INCLUDE "search/type-select.html.tmpl"
name = "o${cond_num}", class = "custom_search_form_field"
types = types, selected = condition.o %]
<input name="v[% cond_num FILTER html %]" title="Значение"
class="custom_search_form_field"
onchange="fix_query_string(this)"
value="[% condition.v FILTER html %]">
[% END %]
[% IF with_buttons %]
<button class="custom_search_add_button" type="button"
id="add_button" title="Добавить новый ряд"
onclick="custom_search_new_row()">+</button>
<span id="cp_container" [% ' class="bz_default_hidden"' IF !indent_level %]>
<button id="cp_button" type="button"
title="Завершить формирование этой группы критериев"
onclick="custom_search_close_paren()">)</button>
</span>
[% END %]
</div>
[% previous_condition = condition %]
[% END %]
[% BLOCK any_all_select %]
<div class="any_all_select">
<select name="[% name FILTER html %]" id="[% name FILTER html %]"
onchange="fix_query_string(this)">
<option value="AND">Подходит под ВСЕ из следующих по отдельности:</option>
<option value="OR" [% ' selected="selected"' IF selected == "OR" %]>
Подходит под ЛЮБОЕ из следующих по отдельности:</option>
<option value="AND_G" [% ' selected' IF selected == "AND_G" %]>
Подходит под ВСЕ из следующих содержащих одинаковое поле:</option>
</select>
[% IF with_advanced_link %]
<a id="custom_search_advanced_controller"
href="javascript:TUI_toggle_class('custom_search_advanced')">
Скрыть дополнительные функции
</a>
[% END %]
</div>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% SWITCH field.type %]
[% CASE [ constants.FIELD_TYPE_FREETEXT,
constants.FIELD_TYPE_TEXTAREA,
constants.FIELD_TYPE_UNKNOWN ] %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field
tag_name = "span"
editable = 1
%]
[% INCLUDE "search/type-select.html.tmpl"
name = field.name _ "_type",
types = types,
selected = type_selected
%]
<input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" size="40"
[% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
value="[% value FILTER html %]">
[% CASE constants.FIELD_TYPE_KEYWORDS %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field
tag_name = "span"
editable = 1
%]
[% INCLUDE "search/type-select.html.tmpl"
name = field.name _ "_type",
types = types,
selected = type_selected
%]
<div id="[% field.name FILTER html %]_container">
<input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" size="40"
[% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
value="[% value FILTER html %]">
<div id="[% field.name FILTER html %]_autocomplete"></div>
</div>
<script type="text/javascript" defer="defer">
if (typeof YAHOO.bugzilla.field_array === "undefined")
YAHOO.bugzilla.field_array = [];
YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [
[%- FOREACH val = possible_values %]
[%-# %]"[% val FILTER js %]"
[%- "," IF NOT loop.last %][% END %]];
YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
'[% field.name FILTER js %]_autocomplete');
</script>
[% CASE constants.FIELD_TYPE_DATETIME %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field
tag_name = "span"
editable = 1
%]
с <input name="[% field.name FILTER html %]from"
id="[% field.name FILTER html %]"
size="10" maxlength="10"
value="[% value.0 FILTER html %]"
onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
<button type="button" class="calendar_button"
id="button_calendar_[% field.name FILTER html %]"
onclick="showCalendar('[% field.name FILTER js %]')">
<span>Календарь</span>
</button>
<span id="con_calendar_[% field.name FILTER html %]"></span>
по <input name="[% field.name FILTER html %]to"
id="[% field.name FILTER html %]to" size="10" maxlength="10"
value="[% value.1 FILTER html %]"
onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
<button type="button" class="calendar_button"
id="button_calendar_[% field.name FILTER html %]to"
onclick="showCalendar('[% field.name FILTER js %]to')">
<span>Календарь</span>
</button>
<small>(ГГГГ-ММ-ДД или относительные даты)</small>
<span id="con_calendar_[% field.name FILTER html %]to"></span>
<script type="text/javascript">
<!--
[%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
[% PROCESS "global/calendar.js.tmpl" id = field.name _ 'to' %]
//--></script>
[% CASE [ constants.FIELD_TYPE_SINGLE_SELECT,
constants.FIELD_TYPE_MULTI_SELECT ] %]
<div id="container_[% field.name FILTER html %]" class="search_field_grid">
[% INCLUDE "bug/field-label.html.tmpl"
field = field
editable = 1
tag_name = "span"
%]
<select name="[% field.name FILTER html%]"
id="[% field.name FILTER html %]"
[% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
multiple="multiple" size="7">
[% legal_values = ${field.name} %]
[% IF field.name == "component" %]
[% legal_values = ${"component_"} %]
[% END %]
[% FOREACH current_value = legal_values %]
[% SET v = current_value.name OR '---' -%]
[% SET display = display_value(field.name, current_value.name) %]
<option value="[% v FILTER html %]"
id="v[% current_value.id FILTER html %]_[% field.name FILTER html %]"
[% ' selected="selected"' IF value.contains( v ) %]>
[%~ display FILTER html ~%]
</option>
[% END %]
</select>
</div>
[% IF value_controllers.${field.name}.defined %]
<script type="text/javascript"><!--
[%+ FILTER collapse %]
[% FOREACH accessor = value_controllers.${field.name}.keys %]
[% PROCESS controller_js %]
[% END %]
[%~ END ~%]
// --></script>
[% END %]
[% IF duplicates.${field.name}.keys.size %]
[% SET field_dups = duplicates.${field.name} %]
[% SET dup_counts = duplicate_count.${field.name} %]
<script type="text/javascript">
[%+ FILTER collapse %]
bz_option_duplicates['[% field.name FILTER js %]'] = {
[% FOREACH dup = field_dups.keys %]
[% dup FILTER js %]:[% field_dups.$dup.id FILTER js %]
[%~ ',' UNLESS loop.last %]
[% END ~%]
};
bz_option_duplicate_count['[% field.name FILTER js %]'] = {
[% FOREACH dup_target = dup_counts.keys %]
[% dup_target FILTER js %]:[% dup_counts.$dup_target FILTER js %]
[%~ ',' UNLESS loop.last %]
[% END %]
};
[% END %]
</script>
[% END %]
[% END %]
[%# END OF SWITCH %]
[% BLOCK controller_js %]
[%# If there are selected values already, we need to fire the
# "change" event once the page has loaded, so we can set all
# the values in all the other <select>s properly.
#%]
YAHOO.util.Event.onDOMReady(function() {
var field = document.getElementById('[% field.name FILTER js %]');
if (field.selectedIndex != -1) bz_fireEvent(field, 'change');
});
[% SET sub_field = value_controllers.${field.name}.$accessor %]
[% SET prod_per_class = {} %]
[% IF field.name == "classification" %]
[% FOREACH p = product %]
[% prod_per_class.${p.classification_id}.${p.id} = 1 %]
[% END %]
[% END %]
[% FOREACH legal_value = legal_values %]
[% SET controlled_ids = [] %]
[% IF field.name == "classification" %]
[% controlled_ids = prod_per_class.${legal_value.id}.keys %]
[% ELSE %]
[% FOREACH sub_value = legal_value.$accessor %]
[% controlled_ids.push(sub_value.id) %]
[% END %]
[% END %]
[% NEXT IF !controlled_ids.size %]
showValueWhen('[% sub_field.name FILTER js %]',
[[% controlled_ids.join(',') FILTER js %]],
'[% field.name FILTER js %]',
[% legal_value.id FILTER js %],
true);
[% END %]
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
<input type="hidden" id="no_redirect" name="no_redirect" value="0">
<script type="text/javascript">
if (history && history.replaceState) {
var no_redirect = document.getElementById("no_redirect");
no_redirect.value = 1;
}
// Hide the Advanced Fields by default, unless the user has a cookie
// that specifies otherwise.
// &#9656; and &#9662; are both utf8 escaped characters for right
// and down facing arrows respectivly.
TUI_alternates['history_query'] = '&#9658;';
TUI_alternates['people_query'] = '&#9658;';
TUI_alternates['information_query'] = '&#9658;';
TUI_hide_default('history_query');
TUI_hide_default('people_query');
TUI_hide_default('information_query');
</script>
[% query_types = [
"allwordssubstr",
"anywordssubstr",
"substring",
"casesubstring",
"allwords",
"anywords",
"regexp",
"notregexp",
] %]
[%# If we resubmit to ourselves, we need to know if we are using a format. %]
[% thisformat = query_format != '' ? query_format : format %]
<input type="hidden" name="query_format" value="[% thisformat FILTER html %]">
[%# *** Summary *** %]
<div class="search_field_row" id="summary_field">
[% INCLUDE "search/field.html.tmpl"
field = bug_fields.short_desc
types = query_types
value = default.short_desc.0
type_selected = default.short_desc_type.0
accesskey = "s"
%]
<script type="text/javascript"> <!--
document.getElementById('short_desc').focus();
// -->
</script>
[% IF button_name %]
<input type="submit" id="[% button_name FILTER css_class_quote %]_top"
value="[% button_name FILTER html %]">
[% END %]
</div>
[%# *** Classification Product Component *** %]
[% value_controllers = {
'classification' => { 'products' => bug_fields.product },
'product' => { 'components' => bug_fields.component,
'versions' => bug_fields.version,
'milestones' => bug_fields.target_milestone },
} %]
[% Hook.process('before_selects_top') %]
[% IF Param('useclassification') %]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.classification
accesskey => "c"
value => default.classification
%]
[% END %]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.product
accesskey => "p"
value => default.product
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.component
accesskey => "m"
value => default.component
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.bug_status
accesskey => "a"
value => default.bug_status
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.resolution
accesskey => "r"
value => default.resolution
%]
[% Hook.process('after_selects_top') %]
<div id="detailed_information" class="bz_section_title">
<div id="information_query_controller" class="arrow">&#9660;</div>
<a href="javascript:TUI_toggle_class('information_query')">
Подробная информация об [% terms.bug_dat %]
</a>
<span class="section_help">Уточнить результаты используя следующие поля:
[%+ field_descs.longdesc FILTER html %], [%+ field_descs.bug_file_loc FILTER html %],
[% IF Param('usestatuswhiteboard') %] [%+ field_descs.status_whiteboard FILTER html %], [%+ END %]
[% IF use_keywords %] [%+ field_descs.keywords FILTER html %], [%+ END %]
[% IF user.is_timetracker %] [%+ field_descs.deadline FILTER html %], [%+ END %]
Номер [% terms.bug_gen %], [%+ field_descs.version FILTER html %],
[% IF Param('usetargetmilestone') %] [%+ field_descs.target_milestone FILTER html %], [%+ END %]
[% field_descs.bug_severity FILTER html %], [%+ field_descs.priority FILTER html %], [%+ field_descs.rep_platform FILTER html %],
[%+ field_descs.op_sys FILTER html %]
</span>
</div>
[%# *** Comment URL Whiteboard Keywords *** %]
<div id="detailed_information_section" class="bz_search_section information_query">
[% SET freetext_fields = [
{ field => bug_fields.longdesc, accesskey => 'c' },
{ field => bug_fields.bug_file_loc, accesskey => 'u' },
{ field => bug_fields.status_whiteboard, accesskey => 'w' },
{ field => bug_fields.keywords, accesskey => 'k',
qtypes => ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'] }
] %]
[% Hook.process('before_freetext_fields') %]
[%# loop through a bunch of free text fields and print out their text stuff %]
[% FOREACH field_container = freetext_fields %]
[% NEXT IF field_container.field.name == 'status_whiteboard'
AND NOT Param('usestatuswhiteboard')
%]
[% NEXT IF field_container.field.name == 'keywords'
AND NOT use_keywords
%]
<div class="search_field_row">
[% type = field_container.field.name _ "_type" %]
[% possible_values = field_container.field.name == 'keywords' ? all_keywords : [] %]
[% INCLUDE "search/field.html.tmpl"
field => field_container.field
types => field_container.qtypes || query_types
accesskey => field_container.accesskey
value => default.${field_container.field.name}.0
type_selected => default.$type.0
%]
</div>
[% END %]
[%# Deadline %]
[% IF user.is_timetracker %]
<div class="search_field_row">
[% INCLUDE "search/field.html.tmpl"
field = bug_fields.deadline
accesskey = "l"
value = [ default.deadlinefrom.0, default.deadlineto.0 ]
%]
</div>
[% END %]
<div class="search_field_row">
<span class="field_label"><label for="bug_id">[% terms.Bugs %] с номером</label></span>
<div id="bug_id_container" >
<input type="text" name="bug_id" id="bug_id"
value="[% default.bug_id.0 FILTER html %]" size="20">
<div class="field_help">(список разделённый запятыми)</div>
</div>
должны быть
<select name="bug_id_type" id="bug_id_type">
<option value="anyexact"[% " selected" IF default.bug_id_type.0 == "anyexact" %]>включены в результаты</option>
<option value="nowords"[% " selected" IF default.bug_id_type.0 == "nowords" %]>исключены из результатов</option>
</select>
</div>
[% Hook.process('after_freetext_fields') %]
[%# *** Status Resolution Severity Priority Hardware OS *** %]
<div>
[% Hook.process('before_selects_bottom') %]
[% fake_version_field = { name => bug_fields.version.name,
type => constants.FIELD_TYPE_SINGLE_SELECT }%]
[% INCLUDE "search/field.html.tmpl"
field => fake_version_field
value => default.version
%]
[% IF Param('usetargetmilestone') %]
[% fake_target_milestone_field = { name => bug_fields.target_milestone.name ,
type => constants.FIELD_TYPE_SINGLE_SELECT } %]
[% INCLUDE "search/field.html.tmpl"
field => fake_target_milestone_field
value => default.target_milestone
%]
[% END %]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.bug_severity
accesskey=> "v"
value => default.bug_severity
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.priority
accesskey => "i"
value => default.priority
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.rep_platform
accesskey =>"h"
value => default.rep_platform
%]
[% INCLUDE "search/field.html.tmpl"
field => bug_fields.op_sys
accesskey =>"o"
value => default.op_sys
%]
[% Hook.process('after_selects_bottom') %]
</div>
</div>
[%# *** Email Numbering *** %]
<div class="bz_section_title" id="people_filter">
<div id="people_query_controller" class="arrow">&#9660;</div>
<a href="javascript:TUI_toggle_class('people_query')">Поиск по людям</a>
<span>Уточнить результаты по роли (т.е. по ролям [% field_descs.assigned_to FILTER html %],
[%+ field_descs.reporter FILTER html %], [% field_descs.commenter FILTER html %],
и т.д.) которые человек может иметь в [% terms.bug_dat %]
</span>
</div>
<div id="people_filter_section" class="bz_search_section people_query">
[% FOREACH n = [1, 2, 3] %]
<div class="search_email_fields">
Любой из:
[% PROCESS role_types field = { count => n, name => "emailassigned_to",
label=> "${field_descs.assigned_to} ${terms.bugs}" } %]
[% PROCESS role_types field = { count => n, name => "emailreporter",
label=> "${field_descs.reporter}" } %]
[% IF Param('useqacontact') %]
[% PROCESS role_types field = { count => n, name => "emailqa_contact",
label=> "${field_descs.qa_contact}" } %]
[% END %]
[% PROCESS role_types field = { count => n, name => "emailcc",
label=> "${field_descs.cc}" } %]
[% PROCESS role_types field = { count => n, name => "emaillongdesc",
label=> "${field_descs.commenter}" } %]
<select name="emailtype[% n %]">
[% FOREACH qv = [
{ name => "substring", description => "содержит" },
{ name => "notsubstring", description => "не содержит" },
{ name => "exact", description => "равен" },
{ name => "notequals", description => "не равен" },
{ name => "regexp", description => "соответствует регулярному выражению" },
{ name => "notregexp", description => "не соответствует регулярному выражению" } ] %]
<option value="[% qv.name %]"
[% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option>
[% END %]
</select>
[% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') %]
<div id="email[% n %]_autocomplete">
[% END %]
<input name="email[% n %]" class="email" id="email[% n %]"
value="[% default.email.$n FILTER html %]">
[% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') %]
<div id="email[% n %]_autocomplete_container"></div>
</div>
<script type="text/javascript">
YAHOO.bugzilla.userAutocomplete.init( "email[% n %]",
"email[% n %]_autocomplete_container");
</script>
[% END %]
</div>
[% END %]
[% Hook.process('email_numbering_end') %]
</div>
[%# *** Bug Changes *** %]
<div class="bz_section_title" id="history_filter">
<div id="history_query_controller" class="arrow">&#9660;</div>
<a href="javascript:TUI_toggle_class('history_query')" >Поиск по истории изменений</a>
<span>Уточнить результаты по тому какие изменения были произведены в полях за
определённый период времени</span>
</div>
<ul class="bug_changes bz_search_section history_query" id="history_filter_section" >
<li>
<label for="chfield">где ЛЮБОЕ из полей:</label>
[%# Create array, so we can sort it by description #%]
[% chfields = [] %]
[% FOREACH field = chfield %]
[% chfields.push({value => field, desc => (field_descs.$field || field) }) %]
[% END %]
<select name="chfield" id="chfield" multiple="multiple" size="4">
[% FOREACH field = chfields.sort('desc') %]
<option value="[% field.value FILTER html %]"
[% " selected" IF default.chfield.contains(field.value) %]>
[% field.desc FILTER html %]</option>
[% END %]
</select>
</li>
<li>
<label for="chfieldvalue">[% search_descs.changedto FILTER html %]:</label>
<input name="chfieldvalue" id="chfieldvalue"
size="20" value="[% default.chfieldvalue.0 FILTER html %]">
</li>
<li>
<label for="chfieldfrom">между:</label>
<input name="chfieldfrom" id="chfieldfrom" size="10"
value="[% default.chfieldfrom.0 FILTER html %]" onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_chfieldfrom"
onclick="showCalendar('chfieldfrom')"><span>Календарь</span></button>
и
<div id="con_calendar_chfieldfrom"></div>
<input name="chfieldto" size="10" id="chfieldto"
value="[% default.chfieldto.0 || "Now" FILTER html %]"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_chfieldto"
onclick="showCalendar('chfieldto')"><span>Календарь</span></button>
<div id="con_calendar_chfieldto"></div>
(ГГГГ-ММ-ДД или отнoсительные даты)
<script type="text/javascript">
<!--
[%+ PROCESS "global/calendar.js.tmpl" id = 'chfieldfrom' %]
[% PROCESS "global/calendar.js.tmpl" id = 'chfieldto' %]
//--></script>
</li>
</ul>
[%############################################################################%]
[%# Block for email role type use to select which email to search through #%]
[%############################################################################%]
[% BLOCK role_types %]
<div class="role_type">
<input type="checkbox" name="[% field.name _ field.count FILTER html %]"
id="[% field.name _ field.count FILTER html %]" value="1"
[% " checked" IF default.${field.name}.${field.count} %]>
<label for="[% field.name _ field.count FILTER html%]">
[% field.label FILTER html%]
</label>
</div>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# (incomplete!)
# ...
# known_name: string. Possibly known stored name for the query being
# edited. This value is just passed through in a
# hidden field.
#%]
[% PROCESS global/variables.none.tmpl %]
[%# This is not necessary for English templates, but useful for localizers. %]
[% ordersdesc = {
"Reuse same sort as last time" => "Сохранить текущий",
"Bug Number" => "Номер $terms.bug_gen",
"Importance" => "Важность",
"Assignee" => "Исполнитель",
"Last Changed" => "Последнее изменение" } %]
<input type="hidden" name="cmdtype" value="doit">
[% IF user.id %]
<input type="hidden" name="token" value="[% issue_hash_token(['searchknob']) FILTER html %]">
[% END %]
<p>
<label for="order">Порядок сортировки результатов</label>:
<select name="order" id="order">
[% FOREACH order = orders %]
<option value="[% order FILTER html %]"
[% " selected" IF default.order.0 == order %]>
[% ordersdesc.$order FILTER html %]</option>
[% END %]
</select>
</p>
<p>
<input type="submit" id="[% button_name FILTER html %]"
value="[% button_name FILTER html %]">
[% IF known_name %]
[%# We store known_name in case the user adds a boolean chart. %]
<input type="hidden" name="known_name" value="[% known_name FILTER html %]">
[%# The name of the existing query will be passed to buglist.cgi. %]
<input type="hidden" name="query_based_on" value="[% known_name FILTER html %]">
[% END %]
[%# Preserve any custom column list that might be set. %]
[% IF columnlist %]
<input type="hidden" name="columnlist" value="[% columnlist FILTER html %]">
[% END %]
</p>
[% IF user.id %]
<p>
&nbsp;&nbsp;&nbsp;
<input type="checkbox" id="remasdefault"
name="remtype" value="asdefault">
<label for="remasdefault">
и сохранить как стандартное условие отбора
</label>
</p>
[% END %]
[% IF userdefaultquery %]
<p>
<a href="query.cgi?nukedefaultquery=1&amp;token=
[%- issue_hash_token(['nukedefaultquery']) FILTER uri %]">
Сбросить условие отбора в исходное значение</a>.
</p>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface. However, to use it, you need to fulfill
# the interfaces of search/form.html.tmpl, search/knob.html.tmpl and
# search/boolean-charts.html.tmpl.
#%]
[% PROCESS global/variables.none.tmpl %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
[% javascript = BLOCK %]
function remove_token() {
if (queryform.token) {
var asDefault = document.getElementById('remasdefault');
queryform.token.disabled = !asDefault.checked;
}
}
[% END %]
[% PROCESS global/header.html.tmpl
title = "Поиск $terms.bugs_gen"
yui = [ 'autocomplete', 'calendar' ]
javascript = javascript
javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js"]
style_urls = [ "skins/standard/search_form.css" ]
doc_section = "query.html"
%]
[% WRAPPER search/tabs.html.tmpl %]
[% button_name = "Найти" %]
<p id="search_help">Для получения справки по нужному полю наведите на имя этого поля курсор мыши.</p>
<form method="post" action="buglist.cgi" name="queryform" id="queryform"
onsubmit="remove_token()">
[% PROCESS search/form.html.tmpl %]
[% PROCESS "search/boolean-charts.html.tmpl" %]
[% PROCESS search/knob.html.tmpl %]
</form>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface. However, to use it, you need to fulfill
# the interfaces of search/form.html.tmpl, reports/series.html.tmpl and
# search/boolean-charts.html.tmpl.
#%]
[% PROCESS global/variables.none.tmpl %]
[% js_data = BLOCK %]
var queryform = "chartform";
[% END %]
[% PROCESS global/header.html.tmpl
title = "Создать новую серию данных"
onload = "doOnSelectProduct(0);"
yui = [ 'autocomplete', 'calendar' ]
javascript = js_data
javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
style_urls = [ "skins/standard/search_form.css" ]
doc_section = "reporting.html#charts-new-series"
%]
<form method="get" action="chart.cgi" name="chartform">
[% PROCESS search/form.html.tmpl %]
<p>
<input type="submit" id="action-search" name="action-search" value="Найти">
[% terms.bugs %], которые будут включены в серию данных.
</p>
<h3>Параметры набора данных</h3>
[% PROCESS reports/series.html.tmpl
button_name = "Создать набор данных" %]
<input type="hidden" name="action" value="create">
<input type="hidden" name="token" value="[% issue_hash_token(['create-series']) FILTER html %]">
<script type="text/javascript">
document.chartform.category[0].selected = true;
catSelected();
checkNewState();
</script>
<hr>
[% PROCESS "search/boolean-charts.html.tmpl" %]
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>[% terms.Bugzilla %]</ShortName>
<Description>Быстрый поиск в [% terms.Bugzilla %]</Description>
<InputEncoding>UTF-8</InputEncoding>
[% IF favicon %]
<Image width="16" height="16">data:image/x-icon;base64,[% favicon FILTER base64 %]</Image>
[% ELSE %]
<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALBSURBVHjaYnxckcEAA3%2F%2B%2FT%2F17LUcH%2Fevf%2F8U%2BHmYGBkZMABAALEgc%2B68%2F3T227cf2tJKKhJLt59n%2FfmbnYnZV1KEhYkJrgYggBghNrz78fPIi3d8uvKBIdb%2FOaWPnzitLc97%2Bc5rFXnhnVO3%2BslLwjUABBDIhnsfPl%2Fj53VO91FX4Gfgkjxw%2Fd%2F6Q49%2FWStqyAj%2B%2B88gZqn%2B9u5rYU52iAaAAGL69%2F%2F%2F2d9%2FYiMclGT4fv76%2BZ9DbO%2FeA39%2BfJHVcvj5l%2Bnh03e%2FWThOvnwLtwEgAAAxAM7%2FBPj8%2FRYkHQYHAf3%2F%2Fv%2F%2B%2Fv8BAVNTUPX18yorLNHE2S8mB%2FT2%2Bq7a4dvu8iUSDgAAAAKICRgUv3%2F8ZGKGeIvpz6eXBvq61lZWLMwMv%2F5zMP7%2FqSAjVFyZ%2FNvZftuT10DnAAQAMQDO%2FwQIBAPz5Or6%2Ff0CBQEAAgT99ubq38z2%2BwT18%2FAM%2F%2BkNDAv6%2FQMCAA1GVVrhMze5h4kCCORpkd9%2F3n74KiHO%2B%2BffX8b%2Ff7m%2BXWP985%2Bf5R%2BPLNdfoK%2F%2F%2Ffv39%2BePj2%2FkZYR0fe0BAgikQZGX%2B9b9FzLS%2FH%2F%2B%2FGVgYGRlZWNlA7nv7z9QuDP8%2B8nw%2FRXjn68Mv4Gu%2FAwQQCCni3FxPLn7nIGZGegfNhYmNjYWZnBMASOakZER6Eumf9%2FYGT4y%2FHx%2F%2BfBFgAAC2cDGzPT99WeGvwzvv%2Fx89vrr%2F39%2FJER4pcT5Gf4z%2FP37D2jtj9%2B%2FL918fmzrKSsWNoAAgiaN%2Fz9%2Fff%2F6S4CP8%2BWbz9vWHfv54aukpAAz0Og%2Ff%2F7%2F%2Bs36668cO3ugED9QJUAAQTUArf7%2F8x87D9vRjcejhPiZhAUYcACAAGI5%2FOHH9ddvXzAxmjz%2B8P8lw4fXn5l4eRlwA4AAYmaTkBFg%2FKvJwfbkwZuXN57y%2Fv%2F34stXGR4uRmxpGwgAAgwA4%2FkfrfCWvLQAAAAASUVORK5CYII%3D</Image>
[% END %]
<Url type="text/html" method="GET" template="[% urlbase FILTER xml %]buglist.cgi?quicksearch={searchTerms}"/>
</OpenSearchDescription>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface. However, to use it, you need to fulfill
# the interfaces of the templates it contains.
#%]
[% js_data = BLOCK %]
var queryform = "reportform"
[% END %]
[% PROCESS global/header.html.tmpl
title = "Построение диаграммы"
onload = "doOnSelectProduct(0); chartTypeChanged()"
yui = [ 'autocomplete', 'calendar' ]
javascript = js_data
javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
style_urls = [ "skins/standard/search_form.css" ]
doc_section = "reporting.html#reports"
%]
[% PROCESS "search/search-report-select.html.tmpl" %]
<p>
Выберите поля для использования в качестве осей координат, затем
уточните критерии выбора [% terms.bugs %].
</p>
<script type="text/javascript"><!--
[%# The Y-axis fields are not used for pie charts %]
function chartTypeChanged() {
// format[2] is the pie chart radio button
if (document.reportform.format[2].checked == true) {
document.reportform.y_axis_field.disabled = true;
document.reportform.cumulate[0].disabled = true;
document.reportform.cumulate[1].disabled = true;
} else {
document.reportform.y_axis_field.disabled = false;
document.reportform.cumulate[0].disabled = false;
document.reportform.cumulate[1].disabled = false;
}
}
// -->
</script>
[% button_name = "Построить" %]
<form method="get" action="report.cgi" name="reportform" id="reportform">
<table align="center">
<tr>
<td valign="middle">
<b>Вертикальная ось:</b><br>
<noscript><small>(кроме круговых диаграмм)</small><br></noscript>
[% PROCESS select name = 'y_axis_field' %]<br>
<br>
<b>Отображать наборы данных:</b><br>
<input type="radio" name="cumulate" value="0"
[% " checked" IF default.cumulate.0 != "1" %]>
Рядом<br>
<input type="radio" name="cumulate" value="1"
[% " checked" IF default.cumulate.0 == "1" %]>
С накоплением
</td>
<td width="150" height="150">
<table border="1" width="100%" height="100%">
<tr>
<td align="center" valign="middle">
<b>Несколько диаграмм:</b><br>
[% PROCESS select name = 'z_axis_field' %]
</td>
</tr>
</table>
</td>
<td rowspan="2">
<b>Вид:</b><br>
[% chart_formats = [
{ name => "line", description => "График" },
{ name => "bar", description => "Гистограмма" },
{ name => "pie", description => "Круговая диаграмма" } ] %]
[% default.chart_format.0 = default.chart_format.0 || "bar" %]
[% FOREACH chart_format = chart_formats %]
<input type="radio" name="format"
value="[% chart_format.name FILTER html %]"
onchange="chartTypeChanged()"
[% " checked" IF default.chart_format.0 == chart_format.name %]>
[% chart_format.description FILTER html %]<br>
[% END %]
</td>
</tr>
<tr>
<td>
</td>
<td align="left">
<b>Горизонтальная ось:</b>
[% PROCESS select name = 'x_axis_field' %]<br>
<label for="x_labels_vertical"><b>Подписи вертикально:</b></label>
<input type="checkbox" name="x_labels_vertical" id="x_labels_vertical"
value="1"
[% " checked" IF default.x_labels_vertical.0 == "1" %]>
</td>
<td>
</td>
</tr>
</table>
<hr>
[% PROCESS search/form.html.tmpl %]
[% PROCESS "search/boolean-charts.html.tmpl" %]
<div id="knob">
<input type="submit" id="[% button_name FILTER css_class_quote %]"
value="[% button_name FILTER html %]">
<input type="hidden" name="action" value="wrap">
</div>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# name: string. The name of the select block to output.
# default.$name.0: string. The default value for the block, if any.
#%]
[% BLOCK select %]
[% Hook.process('rep_fields', 'search/search-report-select.html.tmpl') %]
<select name="[% name FILTER html %]">
<option value="">&lt;не выбрано&gt;</option>
[% FOREACH field = report_columns.keys.sort %]
[% NEXT IF field == "classification" AND !Param('useclassification') %]
[% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %]
[% NEXT IF field == "qa_contact" AND !Param('useqacontact') %]
<option value="[% field FILTER html %]"
[% " selected" IF default.$name.0 == field %]>
[% field_descs.$field || field FILTER html %]</option>
[% END %]
</select>
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface. However, to use it, you need to fulfill
# the interfaces of the templates it contains.
#%]
[% js_data = BLOCK %]
var queryform = "reportform"
[% END %]
[% PROCESS global/header.html.tmpl
title = "Формирование отчета"
onload = "doOnSelectProduct(0)"
yui = [ 'autocomplete', 'calendar' ]
javascript = js_data
javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ]
style_urls = [ "skins/standard/search_form.css" ]
doc_section = "reporting.html#reports"
%]
[% PROCESS "search/search-report-select.html.tmpl" %]
<p>
Выберите поля для использования в качестве строк и колонок таблицы,
затем уточните критерии выбора [% terms.bugs %].
</p>
[% button_name = "Сформировать отчет" %]
<form method="get" action="report.cgi" name="reportform" id="reportform">
<table align="center">
<tr>
<td>
</td>
<td align="center">
<b>Колонки:</b>
[% PROCESS select name = 'x_axis_field' %]
</td>
</tr>
<tr>
<td valign="middle" align="center">
<b>Строки:</b><br>
[% PROCESS select name = 'y_axis_field' %]
</td>
<td width="150" height="150">
<table border="1" width="100%">
<tr>
<td align="center" valign="middle" height="150">
<b>Страницы:</b><br>
[% PROCESS select name = 'z_axis_field' %]
</td>
</tr>
</table>
</td>
</tr>
</table>
<hr>
[% PROCESS search/form.html.tmpl %]
[% PROCESS "search/boolean-charts.html.tmpl" %]
<div id="knob">
<input type="submit" id="[% button_name FILTER css_class_quote %]"
value="[% button_name FILTER html %]">
<input type="hidden" name="format" value="table">
<input type="hidden" name="action" value="wrap">
</div>
</form>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
title = "Простой поиск"
style_urls = [ "skins/standard/search_form.css" ]
%]
[% WRAPPER search/tabs.html.tmpl %]
<p>
Поиск конкретной [% terms.bug_gen %] по характерным словам.
[% terms.Bugzilla %] будет искать [% terms.bugs %], в описаниях и
комментариях которых встречается данные слова. Сортировка будет
произведена по степени соответствия.
</p>
<p>
Например, для поиска информации об аварии веб-обозревателя при доступе к
защищенной странице с Flash-анимацией, введите "crash secure SSL flash".
</p>
<form name="queryform" method="get" action="buglist.cgi">
<input type="hidden" name="query_format" value="specific">
<input type="hidden" name="order" value="relevance desc">
<input type="hidden" id="no_redirect" name="no_redirect" value="0">
<script type="text/javascript">
if (history && history.replaceState) {
var no_redirect = document.getElementById("no_redirect");
no_redirect.value = 1;
}
</script>
<table summary="Поля поиска" class="bz_simple_search_form">
<tr>
<th>
<label for="bug_status">[% field_descs.bug_status FILTER html %]:</label>
</th>
<td>
<select name="bug_status" id="bug_status">
[% statuses = [ { name = 'open', label = "Открытые" },
{ name = 'closed', label = "Завершенные" },
{ name = 'all', label = "Все" } ] %]
[% FOREACH status = statuses %]
<option value="__[% status.name %]__"
[% " selected" IF default.bug_status.0 == "__${status.name}__" %]>
[% status.label FILTER html %]
</option>
[% END %]
</select>
</td>
</tr>
<tr>
<th>
<label for="product">[% field_descs.product FILTER html %]:</label>
</th>
<td>
<select name="product" id="product">
<option value="">Все</option>
[% IF Param('useclassification') %]
[% FOREACH c = classification %]
<optgroup label="[% c.name FILTER html %]">
[% FOREACH p = user.get_selectable_products(c.id) %]
[% IF p.components.size %]
<option value="[% p.name FILTER html %]"
[% " selected" IF default.product.contains(p.name) %]>
[% p.name FILTER html %]
</option>
[% END %]
[% END %]
</optgroup>
[% END %]
[% ELSE %]
[% FOREACH p = product %]
<option value="[% p.name FILTER html %]"
[% " selected" IF default.product.contains(p.name) %]>
[% p.name FILTER html %]
</option>
[% END %]
[% END %]
</select>
</td>
</tr>
<tr>
<th>
<label for="content">Слова:</label>
</th>
<td>
<input name="content" size="40" id="content"
value="[% default.content.0 FILTER html %]">
<script type="text/javascript"> <!--
document.forms['queryform'].content.focus();
// -->
</script>
</td>
</tr>
<tr>
<td></td>
<td>
[% IF Param('search_allow_no_criteria') %]
<input type="submit" id="search" value="Найти">
[% ELSE %]
<input type="submit" id="search" value="Найти"
onclick="if (this.form.content.value == '')
{alert('Поле Слова не может быть пустым. Введите ' +
'хотя бы одно слово для поиска.');
return false;} return true;">
[% END %]
</td>
</tr>
</table>
</form>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# This template has no interface.
#%]
[% WRAPPER global/tabs.html.tmpl
tabs = [ { name => 'specific', label => "Простой поиск",
link => "query.cgi?format=specific" },
{ name => 'advanced', label => "Расширенный поиск",
link => "query.cgi?format=advanced" } ]
current_tab_name = query_format || format || "advanced"
%]
[% content %]
[% END %]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
# This file contains a single hash named %strings, which is used by the
# installation code to display strings before Template-Toolkit can safely
# be loaded.
#
# Each string supports a very simple substitution system, where you can
# have variables named like ##this## and they'll be replaced by the string
# variable with that name.
#
# Please keep the strings in alphabetical order by their name.
%strings = (
any => 'любая',
apachectl_failed => <<END,
ПРЕДУПРЕЖДЕНИЕ: Не удалось проверить конфигурацию Apache. Это иногда
происходит если вы не запускаете checksetup.pl с правами ##root##. Чтобы увидеть
произошедшую проблему, выполните команду: ##command##
END
bad_executable => 'not a valid executable: ##bin##',
blacklisted => '(в черном списке)',
bz_schema_exists_before_220 => <<'END',
You are upgrading from a version before 2.20, but the bz_schema table
already exists. This means that you restored a mysqldump into the Bugzilla
database without first dropping the already-existing Bugzilla database,
at some point. Whenever you restore a Bugzilla database backup, you must
always drop the entire database first.
Please drop your Bugzilla database and restore it from a backup that does
not contain the bz_schema table. If for some reason you cannot do this, you
can connect to your MySQL database and drop the bz_schema table, as a last
resort.
END
checking_for => 'Проверка',
checking_dbd => 'Проверка установленных модулей Perl DBD...',
checking_optional => 'Следующие модули Perl рекомендуются:',
checking_modules => 'Проверка модулей Perl...',
chmod_failed => '##path##: Ошибка изменения прав доступа: ##error##',
chown_failed => '##path##: Ошибка изменения владельца: ##error##',
commands_dbd => <<EOT,
ВЫПОЛНИТЕ ОДНУ ИЗ ЭТИХ КОМАНД (в зависимости от используемой
базы данных):
EOT
commands_optional => 'КОМАНДЫ УСТАНОВКИ РЕКОМЕНДУЕМЫХ МОДУЛЕЙ:',
commands_required => <<EOT,
КОМАНДЫ УСТАНОВКИ ОБЯЗАТЕЛЬНЫХ МОДУЛЕЙ (Обязательно выполните их все
и затем запустите checksetup.pl снова):
EOT
continue_without_answers => <<'END',
Re-run checksetup.pl in interactive mode (without an 'answers' file)
to continue.
END
cpan_bugzilla_home =>
"WARNING: Using the Bugzilla directory as the CPAN home.",
db_enum_setup => "Setting up choices for standard drop-down fields:",
db_schema_init => "Initializing bz_schema...",
db_table_new => "Adding new table ##table##...",
db_table_setup => "Creating tables...",
done => 'Готово.',
enter_or_ctrl_c => "Press Enter to continue or Ctrl-C to exit...",
error_localconfig_read => <<'END',
An error has occurred while reading the ##localconfig## file. The text of
the error message is:
##error##
Please fix the error in the localconfig file. Alternately, rename your
localconfig file and re-run checksetup.pl to have it create a new
localconfig file:
$ mv -f localconfig localconfig.old
$ ./checksetup.pl
END
extension_must_return_name => <<END,
##file## вернул ##returned##, что не является корректным именем для расширения.
Расширения должны возвращать своё имя, а не <code>1</code> или какое-либо число.
Для получения более подробной информации обратитесь к документации Bugzilla::Extension.
END
feature_auth_ldap => 'Аутентификация LDAP',
feature_auth_radius => 'Аутентификация RADIUS',
feature_graphical_reports => 'Диаграммы',
feature_html_desc => 'Использование HTML в описаниях продуктов и групп',
feature_inbound_email => 'Входящая электронная почта',
feature_jobqueue => 'Очередь электронной почты',
feature_jsonrpc => 'Интерфейс JSON-RPC',
feature_jsonrpc_faster => 'Ускорить JSON-RPC',
feature_new_charts => 'Диаграммы нового образца',
feature_old_charts => 'Диаграммы старого образца',
feature_mod_perl => 'mod_perl',
feature_moving => 'Перемещение ошибок между экземплярами Bugzilla',
feature_patch_viewer => 'Просмотр патчей',
feature_smtp_auth => 'Аутентификация SMTP',
feature_smtp_ssl => 'Поддержка SSL для SMTP',
feature_updates => 'Автоматическое уведомление о новых версиях',
feature_xmlrpc => 'Интерфейс XML-RPC',
feature_detect_charset => 'Автоматическое определение кодировки текстовых приложений',
feature_typesniffer => 'Автоопределение типа MIME приложений',
file_remove => 'Удаление ##name##...',
file_rename => 'Переименование ##from## в ##to##...',
header => "* Bugzilla ##bz_ver## на Perl ##perl_ver##\n"
. "* Запущена на ##os_name## ##os_ver##",
install_all => <<EOT,
Попробуйте установить все требуемые и рекомендуемые модули одной
командой:
##perl## install-module.pl --all
EOT
install_data_too_long => <<EOT,
ВНИМАНИЕ: Некоторые данные в поле ##table##.##column## длинней чем
размер поля в текущей версии (##max_length## символов). Данные, которые следует
перечислены ниже (сначала значение кода ##id_column##, затем
значение поля ##column##, которое следует исправить):
EOT
install_module => 'Установка модуля ##module## версии ##version##...',
installation_failed => '*** Установка прервана. Изучите сообщения об ошибках выше. ***',
install_no_compiler => <<END,
ERROR: Using install-module.pl requires that you install a compiler, such as
gcc.
END
install_no_make => <<END,
ERROR: Using install-module.pl requires that you install "make".
END
lc_new_vars => <<'END',
This version of Bugzilla contains some variables that you may want to
change and adapt to your local settings. The following variables are
new to ##localconfig## since you last ran checksetup.pl:
##new_vars##
Please edit the file ##localconfig## and then re-run checksetup.pl
to complete your installation.
END
lc_old_vars => <<'END',
The following variables are no longer used in ##localconfig##, and
have been moved to ##old_file##: ##vars##
END
localconfig_create_htaccess => <<'END',
If you are using Apache as your web server, Bugzilla can create .htaccess
files for you, which will keep this file (localconfig) and other
confidential files from being read over the web.
If this is set to 1, checksetup.pl will create .htaccess files if
they don't exist.
If this is set to 0, checksetup.pl will not create .htaccess files.
END
localconfig_cvsbin => <<'END',
If you want to use the CVS integration of the Patch Viewer, please specify
the full path to the "cvs" executable here.
END
localconfig_db_check => <<'END',
Should checksetup.pl try to verify that your database setup is correct?
With some combinations of database servers/Perl modules/moonphase this
doesn't work, and so you can try setting this to 0 to make checksetup.pl
run.
END
localconfig_db_driver => <<'END',
What SQL database to use. Default is mysql. List of supported databases
can be obtained by listing Bugzilla/DB directory - every module corresponds
to one supported database and the name of the module (before ".pm")
corresponds to a valid value for this variable.
END
localconfig_db_host => <<'END',
The DNS name or IP address of the host that the database server runs on.
END
localconfig_db_name => <<'END',
The name of the database. For Oracle, this is the database's SID. For
SQLite, this is a name (or path) for the DB file.
END
localconfig_db_pass => <<'END',
Enter your database password here. It's normally advisable to specify
a password for your bugzilla database user.
If you use apostrophe (') or a backslash (\) in your password, you'll
need to escape it by preceding it with a '\' character. (\') or (\)
(It is far simpler to just not use those characters.)
END
localconfig_db_port => <<'END',
Sometimes the database server is running on a non-standard port. If that's
the case for your database server, set this to the port number that your
database server is running on. Setting this to 0 means "use the default
port for my database server."
END
localconfig_db_sock => <<'END',
MySQL Only: Enter a path to the unix socket for MySQL. If this is
blank, then MySQL's compiled-in default will be used. You probably
want that.
END
localconfig_db_user => "Who we connect to the database as.",
localconfig_diffpath => <<'END',
For the "Difference Between Two Patches" feature to work, we need to know
what directory the "diff" bin is in. (You only need to set this if you
are using that feature of the Patch Viewer.)
END
localconfig_index_html => <<'END',
Most web servers will allow you to use index.cgi as a directory
index, and many come preconfigured that way, but if yours doesn't
then you'll need an index.html file that provides redirection
to index.cgi. Setting $index_html to 1 below will allow
checksetup.pl to create an index.html for you if it doesn't exist.
NOTE: checksetup.pl will not replace an existing file, so if you
wish to have checksetup.pl create one for you, you must
make sure that index.html doesn't already exist.
END
localconfig_interdiffbin => <<'END',
If you want to use the "Difference Between Two Patches" feature of the
Patch Viewer, please specify the full path to the "interdiff" executable
here.
END
localconfig_site_wide_secret => <<'END',
This secret key is used by your installation for the creation and
validation of encrypted tokens. These tokens are used to implement
security features in Bugzilla, to protect against certain types of attacks.
A random string is generated by default. It's very important that this key
is kept secret. It also must be very long.
END
localconfig_use_suexec => <<'END',
Set this to 1 if Bugzilla runs in an Apache SuexecUserGroup environment.
If your web server runs control panel software (cPanel, Plesk or similar),
or if your Bugzilla is to run in a shared hosting environment, then you are
almost certainly in an Apache SuexecUserGroup environment.
If this is a Windows box, ignore this setting, as it does nothing.
If set to 0, checksetup.pl will set file permissions appropriately for
a normal webserver environment.
If set to 1, checksetup.pl will set file permissions so that Bugzilla
works in a SuexecUserGroup environment.
END
localconfig_webservergroup => <<'END',
The name of the group that your web server runs as. On Red Hat
distributions, this is usually "apache". On Debian/Ubuntu, it is
usually "www-data".
If you have use_suexec turned on below, then this is instead the name
of the group that your web server switches to to run cgi files.
If this is a Windows machine, ignore this setting, as it does nothing.
If you do not have access to the group your scripts will run under,
set this to "". If you do set this to "", then your Bugzilla installation
will be _VERY_ insecure, because some files will be world readable/writable,
and so anyone who can get local access to your machine can do whatever they
want. You should only have this set to "" if this is a testing installation
and you cannot set this up any other way. YOU HAVE BEEN WARNED!
If you set this to anything other than "", you will need to run checksetup.pl
as ##root## or as a user who is a member of the specified group.
END
max_allowed_packet => <<EOT,
ВНИМАНИЕ: Установите значение параметра max_allowed_packet сервера MySQL
не менее ##needed##. Текущее значение -- ##current##.
Параметр настраивается в секции [mysqld] файла конфигурации MySQL.
EOT
min_version_required => "Требуется версия не ниже: ",
# Note: When translating these "modules" messages, don't change the formatting
# if possible, because there is hardcoded formatting in
# Bugzilla::Install::Requirements to match the box formatting.
modules_message_apache => <<END,
***********************************************************************
* МОДУЛИ APACHE *
***********************************************************************
* Обычно при обновлении Bugzilla все пользователи Bugzilla должны *
* очистить кэш своего браузера, иначе Bugzilla не будет работать. *
* Если вы включите определённые модули в конфигурации вашего Apache *
* (обычно вызываемые из httpd.conf или apache2.conf) то вашим *
* пользователям не нужно будет очищать свой кэш когда вы обновите *
* Bugzilla. Вам нужно будет включить следующие модули: *
* *
END
modules_message_db => <<EOT,
***********************************************************************
* ДОСТУП К БАЗЕ ДАННЫХ *
***********************************************************************
* Для доступа к базе данных Bugzilla требуется установка модуля *
* "DBD", соответствующего используемой модели базы данных. *
* Ниже приведена команда установки требуемого модуля. *
EOT
modules_message_optional => <<EOT,
***********************************************************************
* РЕКОМЕНДУЕМЫЕ МОДУЛИ *
***********************************************************************
* Некоторые модули Perl не требуются для работы Bugzilla, но *
* их установка позволит использовать дополнительные возможности. *
* *
* Ниже перечислены модули, которые пока не установлены, и *
* возможности, обеспечиваемые этими модулями. Далее приведены *
* команды установки недостающих модулей. *
EOT
modules_message_required => <<EOT,
***********************************************************************
* ОБЯЗАТЕЛЬНЫЕ МОДУЛИ *
***********************************************************************
* Для работы Bugzilla требуются модули Perl, которые либо отсутствуют *
* в данной системе, либо требуют обновления до более новой версии. *
* Команды установки недостающих модулей описаны ниже. *
EOT
module_found => "найден v##ver##",
module_not_found => "не найден",
module_ok => 'ОК',
module_unknown_version => "найдена неизвестная версия",
no_such_module => "На CPAN нет модуля Perl с именем ##module##.",
mysql_innodb_disabled => <<'END',
InnoDB is disabled in your MySQL installation.
Bugzilla requires InnoDB to be enabled.
Please enable it and then re-run checksetup.pl.
END
mysql_index_renaming => <<'END',
We are about to rename old indexes. The estimated time to complete
renaming is ##minutes## minutes. You cannot interrupt this action once
it has begun. If you would like to cancel, press Ctrl-C now...
(Waiting 45 seconds...)
END
mysql_utf8_conversion => <<'END',
WARNING: We are about to convert your table storage format to UTF-8. This
allows Bugzilla to correctly store and sort international characters.
However, if you have any non-UTF-8 data in your database,
it ***WILL BE DELETED*** by this process. So, before
you continue with checksetup.pl, if you have any non-UTF-8
data (or even if you're not sure) you should press Ctrl-C now
to interrupt checksetup.pl, and run contrib/recode.pl to make all
the data in your database into UTF-8. You should also back up your
database before continuing. This will affect every single table
in the database, even non-Bugzilla tables.
If you ever used a version of Bugzilla before 2.22, we STRONGLY
recommend that you stop checksetup.pl NOW and run contrib/recode.pl.
END
no_checksetup_from_cgi => <<END,
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>checksetup.pl cannot run from a web browser</title>
</head>
<body>
<h1>checksetup.pl cannot run from a web browser</h1>
<p>
You <b>must not</b> execute this script from your web browser.
To install or upgrade Bugzilla, run this script from
the command-line (e.g. <tt>bash</tt> or <tt>ssh</tt> on Linux
or <tt>cmd.exe</tt> on Windows), and follow instructions given there.
</p>
<p>
For more information on how to install Bugzilla, please
<a href="http://www.bugzilla.org/docs/">read the documentation</a>
available on the official Bugzilla website.
</p>
</body>
</html>
END
patchutils_missing => <<'END',
OPTIONAL NOTE: If you want to be able to use the 'difference between two
patches' feature of Bugzilla (which requires the PatchReader Perl module
as well), you should install patchutils from:
http://cyberelk.net/tim/patchutils/
END
template_precompile => "Компиляция шаблонов...",
template_removal_failed => <<END,
ВНИМАНИЕ: Каталог '##template_cache##' не может быть удален.
Он переименован в '##deleteme##', его следует
удалить вручную для экономии дискового пространства.
END
template_removing_dir => "Удаление скомпилированных шаблонов...",
update_cf_invalid_name =>
"Removing custom field '##field##', because it has an invalid name...",
update_flags_bad_name => <<'END',
"##flag##" is not a valid name for a flag. Rename it to not have any spaces
or commas.
END
update_nomail_bad => <<'END',
WARNING: The following users were listed in ##data##/nomail, but do
not have an account here. The unmatched entries have been moved to
##data##/nomail.bad:
END
update_summary_truncate_comment =>
"The original value of the Summary field was longer than 255"
. " characters, and so it was truncated during an upgrade."
. " The original summary was:\n\n##summary##",
update_summary_truncated => <<'END',
WARNING: Some of your bugs had summaries longer than 255 characters.
They have had their original summary copied into a comment, and then
the summary was truncated to 255 characters. The affected bug numbers were:
END
update_quips => <<'END',
Quips are now stored in the database, rather than in an external file.
The quips previously stored in ##data##/comments have been copied into
the database, and that file has been renamed to ##data##/comments.bak
You may delete the renamed file once you have confirmed that all your
quips were moved successfully.
END
update_queries_to_tags => "Populating the new 'tag' table:",
webdot_bad_htaccess => <<END,
WARNING: Dependency graph images are not accessible.
Delete ##dir##/.htaccess and re-run checksetup.pl.
END
);
1;
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# none
#%]
[% title = BLOCK %]Добро пожаловать в [% terms.Bugzilla %][% END %]
[% PROCESS global/header.html.tmpl
title = title
header_addl_info = "version $constants.BUGZILLA_VERSION"
style_urls = [ 'skins/standard/index.css' ]
%]
<div id="welcome-admin">
<p>Добро пожаловать, [% user.identity FILTER html %].</p>
<p>Появление этой страницы вызвано незавершенной настройкой некоторых основных параметров
системы. Цель – проинформировать Вас о необходимых действиях для завершения настройки
данного экземпляра системы.</p>
<p>Пользователю с привилегиями администратора доступен административный интерфейс
системы по ссылке <a href="admin.cgi">Администрирование</a> внизу этой страницы.
Эта ссылка доступны всегда, с любой страницы. На административной странице
обязательно следует посетить раздел <a href="editparams.cgi">Настройки</a>, который
позволяет устанавливать обязательные параметры экземпляра, в частности:</p>
<ul>
<li><a href="editparams.cgi?section=core#urlbase_desc">urlbase</a>, адрес URL данного
экземпляра системы, используемый в сообщениях электронной почты (до тех пор пока
параметр не будет настроен, эта страница будет отображаться вместо стартовой
страницы системы).</li>
<li><a href="editparams.cgi?section=core#cookiepath_desc">cookiepath</a> также важен
для корректной обработки cookies веб-обозревателем.</li>
<li><a href="editparams.cgi?section=general#maintainer_desc">maintainer</a>, ответственный
за этот экземпляр системы, контактное лицо в случае возникновения проблем.</li>
</ul>
<p>Другие важные параметры:</p>
<ul>
<li><a href="editparams.cgi?section=auth#requirelogin_desc">requirelogin</a>: при включении
данного параметра незарегистрированные пользователи не имеют доступа к системе.
Иными словами, пользователь не может видеть никаких данных без явной аутентификации,
в системе. Это то, что Вам требуется для сохранения конфиденциальности данных в системе.</li>
<li><a href="editparams.cgi?section=auth#createemailregexp_desc">createemailregexp</a>
определяет, какие пользователи имею право самостоятельно регистрироваться в системе.
Значение ".*" (по умолчанию) позволяет создавать учетную запись любому пользователю.
Значение "@mycompany.com$" разрешает регистрацию только пользователям с почтовыми адресами
@mycompany.com. Если значение параметра пусто, никто не может зарегистрироваться в системе
самостоятельно, все учетные записи должны быть созданы администратором. Если вы создаете
систему не для всеобщего доступа, установленное по умолчанию значение следует изменить.</li>
<li><a href="editparams.cgi?section=mta#mail_delivery_method_desc">mail_delivery_method</a>
определяет способ отправки электронной почты, например вызов sendmail или использование SMTP.
Без этого параметра отправка электронной почты не обеспечивается.</li>
</ul>
<p>
После установки всех перечисленных параметров обратите внимание на остальные параметры
[% terms.Bugzilla %], изучите их назначение и примите решение о необходимости их настройки
для Вашей системы.
</p>
</div>
[% PROCESS global/footer.html.tmpl %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# subject: subject line of message
# body: message body, shown before the query tables
# queries: array of hashes containing:
# bugs: array containing hashes of fieldnames->values for each bug
# title: the title given in the whine scheduling mechanism
# name: the name of the query
# columnlist: array of fieldnames to display in the mail
# author: user object for the person who scheduled this whine
# recipient: user object for the intended recipient of the message
#%]
[% PROCESS global/variables.none.tmpl %]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>
[[% terms.Bugzilla %]] [% subject FILTER html %]
</title>
</head>
<body bgcolor="#FFFFFF">
<pre>
[% body FILTER html %]
</pre>
<p align="left">
[% IF author.login == recipient.login %]
<a href="[%+ urlbase FILTER html %]editwhines.cgi">Настройка
оповещений</a>
[% ELSE %]
Оповещение установлено пользователем [% author.login FILTER html %].
[% END %]
</p>
[% IF queries.size %]
[% FOREACH query=queries %]
<h2>[%+ query.title FILTER html %] ([% query.bugs.size %] [%+ terms.bugs %])</h2>
<table width="100%">
<tr>
<th align="left">Номер</th>
[% FOREACH col = query.columnlist %]
[% NEXT IF col == 'bug_id' %]
<th align="left">[% field_descs.$col FILTER html %]</th>
[% END %]
</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>
[% FOREACH col = query.columnlist %]
[% NEXT IF col == 'bug_id' %]
<td align="left">[% display_value(col, bug.$col) FILTER html %]</td>
[% END %]
</tr>
[% END %]
</table>
[% IF author.login == recipient.login %]
<p align="left">
<a href="[% urlbase FILTER html %]buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% query.name FILTER uri %]">Показать как список [% terms.bugs_gen %]</a>
</p>
[% END %]
[% END %]
[% ELSE %]
<h3>Ни одной [% terms.bugs %] подходящей под поисковый запрос не найдено.</h3>
[% END %]
</body>
</html>
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# subject: subject line of message
# body: message body, shown before the query tables
# queries: array of hashes containing:
# bugs: array containing hashes of fieldnames->values for each bug
# title: the title given in the whine scheduling mechanism
# name: the name of the query
# columnlist: array of fieldnames to display in the mail
# author: user object for the person who scheduled this whine
# recipient: user object for the intended recipient of the message
#%]
[% PROCESS global/variables.none.tmpl %]
[% body %]
[% IF author.login == recipient.login %]
Для настройки оповещений перейдите по ссылке:
[%+ urlbase %]editwhines.cgi
[% ELSE %]
Оповещение установлено пользователем [% author.login %].
[% END %]
[% IF queries.size %]
[% FOREACH query=queries %]
[%+ query.title +%] ([% query.bugs.size %] [%+ terms.bugs %])
[%+ "-" FILTER repeat(query.title.length) %]
[% FOREACH bug=query.bugs %]
[% terms.Bug +%] [%+ bug.bug_id %]:
[%+ urlbase %]show_bug.cgi?id=[% bug.bug_id +%]
[% largest_title = 0 %]
[% FOREACH col = query.columnlist %]
[% NEXT IF col == 'bug_id' %]
[% IF field_descs.${col}.length > largest_title %]
[% largest_title = field_descs.${col}.length %]
[% END %]
[% END %]
[% FOREACH col = query.columnlist %]
[% NEXT IF col == 'bug_id' %]
[%+ " " FILTER repeat(largest_title - field_descs.${col}.length) %]
[% field_descs.$col %]: [% display_value($col, bug.$col) %]
[% END %]
[% END %]
[% IF author.login == recipient.login %]
Показать как список [% terms.bugs_gen %]: [% urlbase %]buglist.cgi?cmdtype=runnamed&namedcmd=[% query.name FILTER uri %]
[% END %]
[% END %]
[% ELSE %]
Ни одной [% terms.bugs %] подходящей под поисковый запрос не найдено.
[% END %]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[%# INTERFACE:
# events: hash, keyed by event_id number. Values are anonymous hashes of:
# schedule: array of hashes containing schedule info:
# day: value in day column
# time: value selected in time column
# mailto_type: 0=user 1=group
# mailto: recipient's id (profile or group)
# queries: as with schedule, an anonymous array containing hashes of:
# name: the named query's name
# title: title to be displayed on the results
# sort: integer that sets execution order on named queries
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = "Настройка оповещений" %]
[% PROCESS global/header.html.tmpl
title = title
style_urls = ['skins/standard/admin.css']
doc_section = "whining.html"
%]
<p>
Оповещения [% terms.Bugzilla %] — это возможность выполнения отбора
по заданным условиям и отправки полученного списка [% terms.bugs_gen %]
по электронной почте.
</p>
<p>
Для настройки нового оповещения выберите "Создать оповещение".
Введите тему и текст сообщения электронной почты.
</p>
<p>
Затем добавьте расписания, выбрав "Создать расписание". Укажите
дату, время или интервал времени (например, каждые 15 минут) и адрес
получателя (при наличии полномочий). Для отправки в разное время или
нескольким пользователям потребуется несколько расписаний.
</p>
<p>
Для построения списка [% terms.bugs_gen %] используются хранимые
условия отбора. Выполните <a href="query.cgi">поиск [% terms.bugs_gen %]</a>,
затем сохраните условия отбора, задав имя. Выберите "Создать условие",
укажите имя сохраненного условия отбора и название полученного списка
[% terms.bugs_gen %]. Необязательное поле "Порядок сортировки"
определяет порядок выполнения отбора по условиям. При выборе
флажка "Отдельными сообщениями" для каждой [% terms.bug_gen %]
будет отправлено отдельное сообщение.
</p>
<p>
Время в расписании — местное ([% local_timezone FILTER html %]).
</p>
<form method="post" action="editwhines.cgi">
[%# This hidden submit button must be here to set default behavior when
the user presses return on a form input field #%]
<input type="submit" value="Сохранить" name="commit"
style="display: none;" id="commit">
<input type="hidden" name="update" value="1">
<input type="hidden" name="token" value="[% token FILTER html %]">
[% FOREACH event = events %]
<table cellspacing="2" cellpadding="2" style="border: 1px solid;">
<tr>
<th align="left">
Оповещение:
</th>
<td align="right" colspan="2">
<input type="submit" value="Удалить"
name="remove_event_[% event.key %]"
id="remove_event_[% event.key %]">
</td>
</tr>
<tr>
<td valign="top" align="right">
Тема сообщения:
</td>
<td colspan="2">
<input type="text" name="event_[% event.key %]_subject"
size="60" maxlength="128" value="
[%- event.value.subject FILTER html %]">
</td>
</tr>
<tr>
<td valign="top" align="right">
Сопроводительный текст:
</td>
<td colspan="2">
[% INCLUDE global/textarea.html.tmpl
name = "event_${event.key}_body"
minrows = 3
maxrows = 10
defaultrows = 5
cols = 80
defaultcontent = event.value.body
%]
</td>
</tr>
<tr>
<td valign="top" align="right">
Отправлять сообщение даже если результат поиска пустой:
</td>
<td colspan="2">
<input type="checkbox" name="event_[% event.key %]_mailifnobugs"
[%- IF event.value.mailifnobugs == 1 %] checked [% END %]>
</td>
</tr>
[% IF event.value.schedule.size == 0 %]
<tr>
<td valign="top" align="right">
Расписание:
</td>
<td class="unset" colspan="2">
Не установлено<br>
<input type="submit" value="Создать расписание"
name="add_schedule_[% event.key %]"
id="add_schedule_[% event.key %]">
</td>
</tr>
[% ELSE %]
<tr>
<td valign="top" align="right">
Расписание:
</td>
<td class="set" colspan="2">
<table>
<tr>
<th>
Интервал
</th>
<th>
[% IF mail_others %]
Адресат
[% END %]
</th>
<th>
</th>
</tr>
[% FOREACH schedule = event.value.schedule %]
<tr>
<td align="left">
[%# these hidden fields allow us to compare old values instead
of reading the database to tell if a field has changed %]
<input type="hidden" value="[% schedule.day FILTER html %]"
name="orig_day_[% schedule.id %]">
<input type="hidden" value="[% schedule.time FILTER html %]"
name="orig_time_[% schedule.id %]">
[% PROCESS day_field val=schedule.day %]
[% PROCESS time_field val=schedule.time %]
</td>
<td align="left">
[% IF mail_others %]
<input type="hidden" name="orig_mailto_type_[% schedule.id %]"
value="[% schedule.mailto_type FILTER html %]">
<select name="mailto_type_[% schedule.id %]">
<option value="0" [% IF schedule.mailto_type == 0 %]
selected
[% END %]>Пользователь</option>
<option value="1" [% IF schedule.mailto_type == 1 %]
selected
[% END %]>Группа</option>
</select>
<input type="hidden" name="orig_mailto_[% schedule.id %]"
value="[% schedule.mailto FILTER html %]">
<input type="text" name="mailto_[% schedule.id %]"
value="[% schedule.mailto FILTER html %]" size="30">
[% END %]
</td>
<td align="left">
<input type="submit" value="Удалить"
name="remove_schedule_[% schedule.id %]"
id="remove_schedule_[% schedule.id %]">
</td>
</tr>
[% END %]
<tr>
<td colspan="3">
<input type="submit" value="Создать расписание"
name="add_schedule_[% event.key %]"
id="add_schedule_[% event.key %]">
</td>
</tr>
</table>
</td>
</tr>
[% END %]
[% IF event.value.queries.size == 0 %]
<tr>
<td valign="top" align="right">
Условия:
</td>
<td align="left">
не заданы <br>
<input type="submit" value="Создать условие"
name="add_query_[% event.key %]"
id="add_query_[% event.key %]">
</td>
<td align="right" valign="bottom">
<input type="submit" value="Сохранить" name="commit" id="update">
</td>
</tr>
[% ELSE %]
<tr>
<td valign="top" align="right">
Условия:
</td>
<td align="left" colspan="2">
<table>
<tr>
<th>Порядок</th>
<th>Условие</th>
<th>Название списка</th>
<th></th>
<th></th>
</tr>
[% FOREACH query = event.value.queries %]
<tr>
<td align="left">
<input type="text" name="query_sort_[% query.id %]"
size="3" value="[% query.sort %]">
<input type="hidden" value="[% query.sort %]"
name="orig_query_sort_[% query.id %]">
</td>
<td align="left">
<input type="hidden" value="[% query.name FILTER html %]"
name="orig_query_name_[% query.id %]">
[% PROCESS query_field thisquery=query.name %]
</td>
<td align="left">
<input type="hidden" value="[% query.title FILTER html %]"
name="orig_query_title_[% query.id %]">
<input type="text" name="query_title_[% query.id %]"
size="50" value="[% query.title FILTER html %]"
maxlength="64">
</td>
<td align="left">
<input type="hidden" value="[% query.onemailperbug FILTER html %]"
name="orig_query_onemailperbug_[% query.id %]">
<input type="checkbox" [% IF query.onemailperbug == 1 %] checked [% END %]
id="query_onemailperbug_[% query.id %]"
name="query_onemailperbug_[% query.id %]">
<label for="query_onemailperbug_[% query.id %]">Отдельными сообщениями</label>
</td>
<td align="right">
<input type="submit" value="Удалить"
name="remove_query_[% query.id %]"
id="remove_query_[% query.id %]">
</td>
</tr>
[% END %]
<tr>
<td colspan="3">
<input type="submit" value="Создать условие"
name="add_query_[% event.key %]"
id="add_query_[% event.key %]">
</td>
<td align="right" colspan="2">
<input type="submit" value="Сохранить" name="commit" id="update">
</td>
</tr>
</table>
</td>
</tr>
[% END %]
</table>
[% END %]
<p align="left">
<input type="submit" value="Создать оповещение" name="add_event" id="add_event">
</p>
</form>
[% PROCESS global/footer.html.tmpl %]
[% BLOCK query_field +%]
[% IF available_queries.size > 0 %]
<select name="query_name_[% query.id %]">
[% FOREACH q = available_queries %]
<option [% "selected" IF q == thisquery %] value="[% q FILTER html %]">
[% q FILTER html %]
</option>
[% END %]
</select>
[% ELSE %]
Сохраните условия отбора на <a href="query.cgi">странице поиска</a>
[% END %]
[%+ END %]
[% BLOCK day_field +%]
<select name="day_[% schedule.id %]">
[%
options = [
['All', 'Ежедневно', ],
['MF', 'В рабочие дни', ],
['Sun', 'Воскресенье', ],
['Mon', 'Понедельник', ],
['Tue', 'Вторник', ],
['Wed', 'Среда', ],
['Thu', 'Четверг', ],
['Fri', 'Пятница', ],
['Sat', 'Суббота', ],
['1', 'По 1 числам', ],
['2', 'По 2 числам', ],
['3', 'По 3 числам', ],
['4', 'По 4 числам', ],
['5', 'По 5 числам', ],
['6', 'По 6 числам', ],
['7', 'По 7 числам', ],
['8', 'По 8 числам', ],
['9', 'По 9 числам', ],
['10', 'По 10 числам', ],
['11', 'По 11 числам', ],
['12', 'По 12 числам', ],
['13', 'По 13 числам', ],
['14', 'По 14 числам', ],
['15', 'По 15 числам', ],
['16', 'По 16 числам', ],
['17', 'По 17 числам', ],
['18', 'По 18 числам', ],
['19', 'По 19 числам', ],
['20', 'По 20 числам', ],
['21', 'По 21 числам', ],
['22', 'По 22 числам', ],
['23', 'По 23 числам', ],
['24', 'По 24 числам', ],
['25', 'По 25 числам', ],
['26', 'По 26 числам', ],
['27', 'По 27 числам', ],
['28', 'По 28 числам', ],
['29', 'По 29 числам', ],
['30', 'По 30 числам', ],
['31', 'По 31 числам', ],
['last', 'По последним числам', ],
]
%]
[% FOREACH option = options %]
<option value="[% option.0 %]"
[%- IF val == option.0 +%] selected[% END %]>
[%- option.1 -%]
</option>
[% END %]
</select>
[%+ END %]
[% BLOCK time_field +%]
<select name="time_[% schedule.id %]">
[%
options = [
[ '0', '00:00', ],
[ '1', '01:00', ],
[ '2', '02:00', ],
[ '3', '03:00', ],
[ '4', '04:00', ],
[ '5', '05:00', ],
[ '6', '06:00', ],
[ '7', '07:00', ],
[ '8', '08:00', ],
[ '9', '09:00', ],
[ '10', '10:00', ],
[ '11', '11:00', ],
[ '12', '12:00', ],
[ '13', '13:00', ],
[ '14', '14:00', ],
[ '15', '15:00', ],
[ '16', '16:00', ],
[ '17', '17:00', ],
[ '18', '18:00', ],
[ '19', '19:00', ],
[ '20', '20:00', ],
[ '21', '21:00', ],
[ '22', '22:00', ],
[ '23', '23:00', ],
[ '60min', 'каждый час', ],
[ '30min', 'каждые 30 минут', ],
[ '15min', 'каждые 15 минут', ],
]
%]
[% FOREACH option = options %]
<option value="[% option.0 %]"
[%- IF val == option.0 +%] selected[% END %]>
[%- option.1 -%]
</option>
[% END %]
</select>
[%+ END %]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment