Commit 7f0ba708 authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Bug 313122: Implement Product->create, $product->update and…

Bug 313122: Implement Product->create, $product->update and $product->remove_from_db, and make editproducts.cgi use them - Patch by Fré©ric Buclin <LpSolit@gmail.com> r=mkanat a=LpSolit
parent 4fc0f4b9
...@@ -3088,7 +3088,7 @@ sub RemoveVotes { ...@@ -3088,7 +3088,7 @@ sub RemoveVotes {
undef, ($votes, $id)); undef, ($votes, $id));
} }
# Now return the array containing emails to be sent. # Now return the array containing emails to be sent.
return \@messages; return @messages;
} }
# If a user votes for a bug, or the number of votes required to # If a user votes for a bug, or the number of votes required to
......
...@@ -146,6 +146,7 @@ use File::Basename; ...@@ -146,6 +146,7 @@ use File::Basename;
MAX_SMALLINT MAX_SMALLINT
MAX_LEN_QUERY_NAME MAX_LEN_QUERY_NAME
MAX_PRODUCT_SIZE
MAX_MILESTONE_SIZE MAX_MILESTONE_SIZE
MAX_COMPONENT_SIZE MAX_COMPONENT_SIZE
MAX_FREETEXT_LENGTH MAX_FREETEXT_LENGTH
...@@ -413,6 +414,9 @@ use constant MAX_SMALLINT => 32767; ...@@ -413,6 +414,9 @@ use constant MAX_SMALLINT => 32767;
# The longest that a saved search name can be. # The longest that a saved search name can be.
use constant MAX_LEN_QUERY_NAME => 64; use constant MAX_LEN_QUERY_NAME => 64;
# The longest product name allowed.
use constant MAX_PRODUCT_SIZE => 64;
# The longest milestone name allowed. # The longest milestone name allowed.
use constant MAX_MILESTONE_SIZE => 20; use constant MAX_MILESTONE_SIZE => 20;
......
...@@ -33,7 +33,6 @@ package Bugzilla::Series; ...@@ -33,7 +33,6 @@ package Bugzilla::Series;
use Bugzilla::Error; use Bugzilla::Error;
use Bugzilla::Util; use Bugzilla::Util;
use Bugzilla::User;
sub new { sub new {
my $invocant = shift; my $invocant = shift;
......
...@@ -540,13 +540,13 @@ foreach my $bug (@bug_objects) { ...@@ -540,13 +540,13 @@ foreach my $bug (@bug_objects) {
# an error later. # an error later.
delete $changed_deps{''}; delete $changed_deps{''};
# $msgs will store emails which have to be sent to voters, if any. # @msgs will store emails which have to be sent to voters, if any.
my $msgs; my @msgs;
if ($changes->{'product'}) { if ($changes->{'product'}) {
# If some votes have been removed, RemoveVotes() returns # If some votes have been removed, RemoveVotes() returns
# a list of messages to send to voters. # a list of messages to send to voters.
# We delay the sending of these messages till tables are unlocked. # We delay the sending of these messages till changes are committed.
$msgs = RemoveVotes($bug->id, 0, 'votes_bug_moved'); @msgs = RemoveVotes($bug->id, 0, 'votes_bug_moved');
CheckIfVotedConfirmed($bug->id, Bugzilla->user->id); CheckIfVotedConfirmed($bug->id, Bugzilla->user->id);
} }
...@@ -560,7 +560,7 @@ foreach my $bug (@bug_objects) { ...@@ -560,7 +560,7 @@ foreach my $bug (@bug_objects) {
############### ###############
# Now is a good time to send email to voters. # Now is a good time to send email to voters.
foreach my $msg (@$msgs) { foreach my $msg (@msgs) {
MessageToMTA($msg); MessageToMTA($msg);
} }
......
...@@ -31,14 +31,6 @@ ...@@ -31,14 +31,6 @@
style_urls = ['skins/standard/admin.css'] style_urls = ['skins/standard/admin.css']
%] %]
[% IF classification %]
[% classification_url_part = BLOCK %]&amp;classification=
[%- classification.name FILTER url_quote %]
[%- END %]
[% ELSE %]
[% classification_url_part = "" %]
[% END %]
<table border="1" cellpadding="4" cellspacing="0"> <table border="1" cellpadding="4" cellspacing="0">
<tr bgcolor="#6666FF"> <tr bgcolor="#6666FF">
<th valign="top" align="left">Field</th> <th valign="top" align="left">Field</th>
...@@ -66,8 +58,7 @@ ...@@ -66,8 +58,7 @@
<tr> <tr>
<td valign="top">Product:</td> <td valign="top">Product:</td>
<td valign="top"> <td valign="top">
<a href="editproducts.cgi?product=[% product.name FILTER url_quote %] <a href="editproducts.cgi?product=[% product.name FILTER url_quote %]">
[%- classification_url_part %]">
[% product.name FILTER html %] [% product.name FILTER html %]
</a> </a>
</td> </td>
...@@ -113,8 +104,7 @@ ...@@ -113,8 +104,7 @@
<tr> <tr>
<td> <td>
[% IF product.components.size > 0 %] [% IF product.components.size > 0 %]
<a href="editcomponents.cgi?product=[% product.name FILTER url_quote %] <a href="editcomponents.cgi?product=[% product.name FILTER url_quote %]"
[%- classification_url_part %]"
title="Edit components for product '[% product.name FILTER html %]'"> title="Edit components for product '[% product.name FILTER html %]'">
Components: Components:
</a> </a>
...@@ -148,8 +138,7 @@ ...@@ -148,8 +138,7 @@
<tr> <tr>
<td> <td>
[% IF product.versions.size > 0 %] [% IF product.versions.size > 0 %]
<a href="editversions.cgi?product=[%- product.name FILTER url_quote %] <a href="editversions.cgi?product=[%- product.name FILTER url_quote %]">
[%- classification_url_part %]">
Versions: Versions:
</a> </a>
[% ELSE %] [% ELSE %]
...@@ -172,8 +161,7 @@ ...@@ -172,8 +161,7 @@
<tr> <tr>
<td valign="top"> <td valign="top">
[% IF product.milestones.size > 0 %] [% IF product.milestones.size > 0 %]
<a href="editmilestones.cgi?product=[%- product.name FILTER url_quote %] <a href="editmilestones.cgi?product=[%- product.name FILTER url_quote %]">
[%- classification_url_part -%]">
Milestones: Milestones:
</a> </a>
[% ELSE %] [% ELSE %]
...@@ -196,10 +184,8 @@ ...@@ -196,10 +184,8 @@
<td>[% terms.Bugs %]:</td> <td>[% terms.Bugs %]:</td>
<td> <td>
[% IF product.bug_count %] [% IF product.bug_count %]
<a href="buglist.cgi?product=[%- product.name FILTER url_quote %] <a href="buglist.cgi?product=[% product.name FILTER url_quote %]"
[%- classification_url_part %]" title="List of [% terms.bugs %] for product '[% product.name FILTER html %]'">
title="List of [% terms.bugs %] for product '
[%- product.name FILTER html %]'">
[% product.bug_count FILTER html %] [% product.bug_count FILTER html %]
</a> </a>
[% ELSE %] [% ELSE %]
...@@ -264,8 +250,6 @@ ...@@ -264,8 +250,6 @@
<input type="hidden" name="action" value="delete"> <input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product.name FILTER html %]"> <input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]">
<input type="hidden" name="classification"
value="[% classification.name FILTER html %]">
</form> </form>
[% END %] [% END %]
......
...@@ -53,8 +53,6 @@ ...@@ -53,8 +53,6 @@
</table> </table>
<input type="submit" value="Add"> <input type="submit" value="Add">
<input type="hidden" name="subcategory" value="-All-">
<input type="hidden" name="open_name" value="All Open">
<input type="hidden" name="action" value="new"> <input type="hidden" name="action" value="new">
<input type="hidden" name="token" value="[% token FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]">
<input type="hidden" name="classification" <input type="hidden" name="classification"
......
...@@ -101,8 +101,7 @@ versions:</a> ...@@ -101,8 +101,7 @@ versions:</a>
<tr> <tr>
<th align="right" valign="top"> <th align="right" valign="top">
<a href="editproducts.cgi?action=editgroupcontrols&product= <a href="editproducts.cgi?action=editgroupcontrols&product=
[%- product.name FILTER url_quote %]&classification= [%- product.name FILTER url_quote %]">
[%- classification.name FILTER url_quote %]">
Edit Group Access Controls: Edit Group Access Controls:
</a> </a>
</th> </th>
...@@ -139,8 +138,6 @@ versions:</a> ...@@ -139,8 +138,6 @@ versions:</a>
value="[% product.name FILTER html %]"> value="[% product.name FILTER html %]">
<input type="hidden" name="action" value="update"> <input type="hidden" name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]">
<input type="hidden" name="classification"
value="[% classification.name FILTER html %]">
<input type="submit" name="submit" value="Save Changes"> <input type="submit" name="submit" value="Save Changes">
</form> </form>
......
...@@ -61,9 +61,7 @@ ...@@ -61,9 +61,7 @@
Edit product <a Edit product <a
title="Edit Product '[% product.name FILTER html %]' title="Edit Product '[% product.name FILTER html %]'
[%- classification_text %]" [%- classification_text %]"
href="editproducts.cgi?action=edit&amp;product= href="editproducts.cgi?action=edit&amp;product=[% product.name FILTER url_quote %]">
[%- product.name FILTER url_quote %]
[%- classification_url_part %]">
'[% product.name FILTER html %]'</a>. '[% product.name FILTER html %]'</a>.
[% END %] [% END %]
......
...@@ -39,14 +39,13 @@ ...@@ -39,14 +39,13 @@
[% edit_contentlink = BLOCK %] [% edit_contentlink = BLOCK %]
editproducts.cgi?action=edit&amp;product=%%name%% editproducts.cgi?action=edit&amp;product=%%name%%
[%- classification_url_part %]
[% END %] [% END %]
[% delete_contentlink = BLOCK %] [% delete_contentlink = BLOCK %]
editproducts.cgi?action=del&amp;product=%%name%% editproducts.cgi?action=del&amp;product=%%name%%
[%- classification_url_part %]
[% END %] [% END %]
[% bug_count_contentlink = BLOCK %]buglist.cgi?product=%%name%% [% bug_count_contentlink = BLOCK %]
[%- classification_url_part %][% END %] buglist.cgi?product=%%name%%
[% END %]
[% columns = [ [% columns = [
......
...@@ -16,38 +16,18 @@ ...@@ -16,38 +16,18 @@
# Rights Reserved. # Rights Reserved.
# #
# Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org> # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
# Frédéric Buclin <LpSolit@gmail.com>
#%] #%]
[%# INTERFACE: [%# INTERFACE:
#
# old_product : Bugzilla::Product Object; old product.
# product : Bugzilla::Product Object; new product. # product : Bugzilla::Product Object; new product.
#
# classification: Bugzilla::Classification Object; The product classification (may be empty or missing) # 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,
# checkvotes: boolean; is true if vote related fields have changed. If so, # and its value is an arrayref of the form [old values, new values].
# then the following parameters will be specified:
#
# toomanyvotes: list of hashes, each one with an 'id' and a 'name' hash key
# detailing the bug id and the username of users who had too
# many votes for a bug
#
# toomanytotalvotes: list of hashes, each one with an 'id' and a 'name' hash key
# detailing the bug id and the username of users who had
# too many total votes
#
# confirmedbugs: list of bug ids, which were confirmed by votes
#
# changer: string; login of the user making the changes, used for mailing
# bug changes if necessary
#
#%] #%]
[% IF classification %] [% IF classification %]
[% classification_url_part = BLOCK %]&amp;classification= [% classification_text = BLOCK %]
[%- classification.name FILTER url_quote %]
[% END %]
[% classification_text = BLOCK %]
of classification '[% classification.name FILTER html %]' of classification '[% classification.name FILTER html %]'
[% END %] [% END %]
[% END %] [% END %]
...@@ -58,28 +38,24 @@ ...@@ -58,28 +38,24 @@
title = title title = title
style_urls = ['skins/standard/admin.css'] style_urls = ['skins/standard/admin.css']
%] %]
[% updated = 0 %]
[% IF product.name != old_product.name %] [% IF changes.name.defined %]
<p> <p>
Updated product name from '[% old_product.name FILTER html %]' to Updated product name from '[% changes.name.0 FILTER html %]' to
<a href="editproducts.cgi?action=edit&amp;product= '<a href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER url_quote %] [%- product.name FILTER url_quote %]">[% product.name FILTER html %]</a>'.
[%- classification_url_part FILTER none %]">[% product.name FILTER html %]</a>.
</p> </p>
[% updated = 1 %]
[% END %] [% END %]
[% IF product.description != old_product.description %] [% IF changes.description.defined %]
<p> <p>
Updated description to: Updated description to:
</p> </p>
<p style="margin: 1em 3em 1em 3em">[% product.description FILTER html_light %]</p> <p style="margin: 1em 3em 1em 3em">[% product.description FILTER html_light %]</p>
[% updated = 1 %]
[% END %] [% END %]
[% IF product.disallow_new != old_product.disallow_new %] [% IF changes.disallownew.defined %]
<p> <p>
Product is now Product is now
[% IF product.disallow_new %] [% IF product.disallow_new %]
...@@ -89,15 +65,14 @@ ...@@ -89,15 +65,14 @@
[% END %] [% END %]
new [% terms.bugs %]. new [% terms.bugs %].
</p> </p>
[% updated = 1 %]
[% END %] [% END %]
[% IF product.milestone_url != old_product.milestone_url %] [% IF changes.milestoneurl.defined %]
<p> <p>
Updated milestone URL Updated milestone URL
[% IF old_product.milestone_url != '' %] [% IF changes.milestoneurl.0 != '' %]
from<br> <a href="[%- old_product.milestone_url FILTER html %]"> from<br> <a href="[%- changes.milestoneurl.0 FILTER html %]">
[%- old_product.milestone_url FILTER html %]</a> [%- changes.milestoneurl.0 FILTER html %]</a>
[% END %] [% END %]
to to
[% IF product.milestone_url != '' %] [% IF product.milestone_url != '' %]
...@@ -107,45 +82,43 @@ ...@@ -107,45 +82,43 @@
be empty. be empty.
[% END %] [% END %]
</p> </p>
[% updated = 1 %]
[% END %] [% END %]
[% IF product.default_milestone != old_product.default_milestone %] [% IF changes.defaultmilestone.defined %]
<p> <p>
Updated default milestone from '[% old_product.default_milestone FILTER html %]' to Updated default milestone from '[% changes.defaultmilestone.0 FILTER html %]' to
'[% product.default_milestone FILTER html %]'. '[% product.default_milestone FILTER html %]'.
</p> </p>
[% updated = 1 %]
[% END %] [% END %]
[% IF product.votes_per_user != old_product.votes_per_user %] [% IF changes.votesperuser.defined %]
<p> <p>
Updated votes per user from Updated votes per user from
[%+ old_product.votes_per_user FILTER html %] to [%+ changes.votesperuser.0 FILTER html %] to
[%+ product.votes_per_user FILTER html %]. [%+ product.votes_per_user FILTER html %].
</p> </p>
[% updated = 1 %] [% checkvotes = 1 %]
[% END %] [% END %]
[% IF product.max_votes_per_bug != old_product.max_votes_per_bug %] [% IF changes.maxvotesperbug.defined %]
<p> <p>
Updated maximum votes per [% terms.bug %] from Updated maximum votes per [% terms.bug %] from
[%+ old_product.max_votes_per_bug FILTER html %] to [%+ changes.maxvotesperbug.0 FILTER html %] to
[%+ product.max_votes_per_bug FILTER html %]. [%+ product.max_votes_per_bug FILTER html %].
</p> </p>
[% updated = 1 %] [% checkvotes = 1 %]
[% END %] [% END %]
[% IF product.votes_to_confirm != old_product.votes_to_confirm %] [% IF changes.votestoconfirm.defined %]
<p> <p>
Updated number of votes needed to confirm a [% terms.bug %] from Updated number of votes needed to confirm a [% terms.bug %] from
[%+ old_product.votes_to_confirm FILTER html %] to [%+ changes.votestoconfirm.0 FILTER html %] to
[%+ product.votes_to_confirm FILTER html %]. [%+ product.votes_to_confirm FILTER html %].
</p> </p>
[% updated = 1 %] [% checkvotes = 1 %]
[% END %] [% END %]
[% UNLESS updated %] [% IF !changes.keys.size %]
<p>Nothing changed for product '[% product.name FILTER html %]'.</p> <p>Nothing changed for product '[% product.name FILTER html %]'.</p>
[% END %] [% END %]
...@@ -159,8 +132,8 @@ ...@@ -159,8 +132,8 @@
<p>Checking existing votes in this product for anybody who now <p>Checking existing votes in this product for anybody who now
has too many votes for [% terms.abug %]...<br> has too many votes for [% terms.abug %]...<br>
[% IF toomanyvotes.size > 0 %] [% IF changes.too_many_votes.size %]
[% FOREACH detail = toomanyvotes %] [% FOREACH detail = changes.too_many_votes %]
&rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id= &rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id=
[%- detail.id FILTER url_quote %]"> [%- detail.id FILTER url_quote %]">
[%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br> [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br>
...@@ -172,8 +145,8 @@ ...@@ -172,8 +145,8 @@
<p>Checking existing votes in this product for anybody <p>Checking existing votes in this product for anybody
who now has too many total votes...<br> who now has too many total votes...<br>
[% IF toomanytotalvotes.size > 0 %] [% IF changes.too_many_total_votes.size %]
[% FOREACH detail = toomanytotalvotes %] [% FOREACH detail = changes.too_many_total_votes %]
&rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id= &rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id=
[%- detail.id FILTER url_quote %]"> [%- detail.id FILTER url_quote %]">
[%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br> [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br>
...@@ -185,14 +158,14 @@ ...@@ -185,14 +158,14 @@
<p>Checking unconfirmed [% terms.bugs %] in this product for any which now have <p>Checking unconfirmed [% terms.bugs %] in this product for any which now have
sufficient votes...<br> sufficient votes...<br>
[% IF confirmedbugs.size > 0 %] [% IF changes.confirmed_bugs.size %]
[% FOREACH id = confirmedbugs %] [% FOREACH id = changes.confirmed_bugs %]
[%# This is INCLUDED instead of PROCESSED to avoid variables getting [%# This is INCLUDED instead of PROCESSED to avoid variables getting
overwritten, which happens otherwise %] overwritten, which happens otherwise %]
[% INCLUDE bug/process/results.html.tmpl [% INCLUDE bug/process/results.html.tmpl
type = 'votes' type = 'votes'
mailrecipients = { 'changer' => changer } mailrecipients = { 'changer' => user.login }
header_done = 1 header_done = 1
id = id id = id
%] %]
......
...@@ -474,10 +474,6 @@ ...@@ -474,10 +474,6 @@
'classification_url_part', 'classification_url_part',
], ],
'admin/products/confirm-delete.html.tmpl' => [
'classification_url_part',
],
'admin/products/footer.html.tmpl' => [ 'admin/products/footer.html.tmpl' => [
'classification_url_part', 'classification_url_part',
'classification_text', 'classification_text',
......
...@@ -129,6 +129,9 @@ ...@@ -129,6 +129,9 @@
[% ELSIF message_tag == "bug_has_duplicate" %] [% ELSIF message_tag == "bug_has_duplicate" %]
*** [% terms.Bug %] [%+ dupe FILTER html %] has been marked as a duplicate of this [% terms.bug %]. *** *** [% terms.Bug %] [%+ dupe FILTER html %] has been marked as a duplicate of this [% terms.bug %]. ***
[% ELSIF message_tag == "bug_group_description" %]
Access to [% terms.bugs %] in the [% product.name FILTER html %] product
[% ELSIF message_tag == "bug_moved_to" %] [% ELSIF message_tag == "bug_moved_to" %]
<p>[% terms.Bug %] moved to [% Param("move-to-url") FILTER html %].</p> <p>[% terms.Bug %] moved to [% Param("move-to-url") FILTER html %].</p>
<p>If the move succeeded, [% login FILTER html %] will receive a mail <p>If the move succeeded, [% login FILTER html %] will receive a mail
...@@ -706,6 +709,9 @@ ...@@ -706,6 +709,9 @@
[% ELSIF message_tag == "series_all_closed" %] [% ELSIF message_tag == "series_all_closed" %]
All Closed All Closed
[% ELSIF message_tag == "series_subcategory" %]
-All-
[% ELSIF message_tag == "sudo_started" %] [% ELSIF message_tag == "sudo_started" %]
[% title = "Sudo session started" %] [% title = "Sudo session started" %]
The sudo session has been started. For the next 6 hours, or until you The sudo session has been started. For the next 6 hours, or until you
......
...@@ -273,11 +273,6 @@ ...@@ -273,11 +273,6 @@
[% title = "Classification Does Not Exist" %] [% title = "Classification Does Not Exist" %]
The classification '[% name FILTER html %]' does not exist. The classification '[% name FILTER html %]' does not exist.
[% ELSIF error == "classification_doesnt_exist_for_product" %]
[% title = "Classification Does Not Exist For Product" %]
The classification '[% classification FILTER html %]' does not exist
for product '[% product FILTER html %]'.
[% ELSIF error == "classification_invalid_sortkey" %] [% ELSIF error == "classification_invalid_sortkey" %]
[% title = "Invalid Sortkey for Classification" %] [% title = "Invalid Sortkey for Classification" %]
The sortkey <em>[% sortkey FILTER html %]</em> for the '[% name FILTER html %]' The sortkey <em>[% sortkey FILTER html %]</em> for the '[% name FILTER html %]'
...@@ -313,8 +308,8 @@ ...@@ -313,8 +308,8 @@
[% ELSIF error == "component_name_too_long" %] [% ELSIF error == "component_name_too_long" %]
[% title = "Component Name Is Too Long" %] [% title = "Component Name Is Too Long" %]
The name of a component is limited to 64 characters. The name of a component is limited to [% constants.MAX_COMPONENT_SIZE FILTER html %]
'[% name FILTER html %]' is too long ([% name.length %] characters). characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
[% ELSIF error == "component_need_initialowner" %] [% ELSIF error == "component_need_initialowner" %]
[% title = "Component Requires Default Assignee" %] [% title = "Component Requires Default Assignee" %]
...@@ -952,8 +947,8 @@ ...@@ -952,8 +947,8 @@
[% ELSIF error == "milestone_name_too_long" %] [% ELSIF error == "milestone_name_too_long" %]
[% title = "Milestone Name Is Too Long" %] [% title = "Milestone Name Is Too Long" %]
The name of a milestone is limited to 20 characters. The name of a milestone is limited to [% constants.MAX_MILESTONE_SIZE FILTER html %]
'[% name FILTER html %]' is too long ([% name.length %] characters). characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
[% ELSIF error == "milestone_required" %] [% ELSIF error == "milestone_required" %]
[% title = "Milestone Required" %] [% title = "Milestone Required" %]
...@@ -1241,37 +1236,19 @@ ...@@ -1241,37 +1236,19 @@
[% title = "Specified Product Does Not Exist" %] [% title = "Specified Product Does Not Exist" %]
The product '[% product FILTER html %]' does not exist. The product '[% product FILTER html %]' does not exist.
[% ELSIF error == "product_votes_per_bug_must_be_nonnegative" %] [% ELSIF error == "product_illegal_votes" %]
[% title = "Maximum Votes Must Be Non-negative" %] [% title = "Votes Must Be Non-negative" %]
[% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
'[% maxvotesperbug FILTER html %]' is an invalid value for the
<em>'Maximum Votes Per [% terms.Bug %]'</em> field, which should
contain a non-negative number.
[% ELSIF error == "product_votes_per_user_must_be_nonnegative" %]
[% title = "Votes Per User Must Be Non-negative" %]
[% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
'[% votesperuser FILTER html %]' is an invalid value for the
<em>'Votes Per User'</em> field, which should contain a
non-negative number.
[% ELSIF error == "product_votes_to_confirm_must_be_nonnegative" %]
[% title = "Votes To Confirm Must Be Non-negative" %]
[% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %] [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
'[% votestoconfirm FILTER html %]' is an invalid value for the '[% votes FILTER html %]' is an invalid value for the
<em>'Votes To Confirm'</em> field, which should contain a <em>
non-negative number. [% IF field == "votesperuser" %]
Votes Per User
[% ELSIF error == "product_cant_delete_description" %] [% ELSIF field == "maxvotesperbug" %]
[% title = "Cannot delete product description" %] Maximum Votes Per [% terms.Bug %]
[% admindocslinks = {'products.html' => 'Administering products'} %] [% ELSIF field == "votestoconfirm" %]
Cannot delete the description for product Votes To Confirm
'[% product FILTER html %]'. [% END %]
</em> field, which should contain a non-negative number.
[% ELSIF error == "product_cant_delete_name" %]
[% title = "Cannot delete product name" %]
[% admindocslinks = {'products.html' => 'Administering products'} %]
Cannot delete the product name for product '[% product FILTER html %]'.
[% ELSIF error == "product_name_already_in_use" %] [% ELSIF error == "product_name_already_in_use" %]
[% title = "Product name already in use" %] [% title = "Product name already in use" %]
...@@ -1284,19 +1261,17 @@ ...@@ -1284,19 +1261,17 @@
The product name '[% product FILTER html %]' differs from existing The product name '[% product FILTER html %]' differs from existing
product '[% existing_product FILTER html %]' only in case. product '[% existing_product FILTER html %]' only in case.
[% ELSIF error == "product_name_too_long" %]
[% title = "Product name too long" %]
The name of a product is limited to [% constants.MAX_PRODUCT_SIZE FILTER html %]
characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
[% ELSIF error == "product_must_define_defaultmilestone" %] [% ELSIF error == "product_must_define_defaultmilestone" %]
[% title = "Must define new default milestone" %] [% title = "Must define new default milestone" %]
[% admindocslinks = {'products.html' => 'Administering products', [% admindocslinks = {'products.html' => 'Administering products',
'milestones.html' => 'About Milestones'} %] 'milestones.html' => 'About Milestones'} %]
[% IF classification %] You must <a href="editmilestones.cgi?action=add&amp;product=[% product FILTER url_quote %]">
[% classification_url_part = BLOCK %]&amp;classification= create the milestone '[% milestone FILTER html %]'</a> before
[%- classification FILTER url_quote %]
[% END %]
[% END %]
You must <a href="editmilestones.cgi?action=add&amp;product=
[%- product FILTER url_quote %]
[%- classification_url_part FILTER none %]">
create the milestone '[% defaultmilestone FILTER html %]'</a> before
it can be made the default milestone for product '[% product FILTER html %]'. it can be made the default milestone for product '[% product FILTER html %]'.
[% ELSIF error == "product_admin_denied" %] [% ELSIF error == "product_admin_denied" %]
...@@ -1306,7 +1281,7 @@ ...@@ -1306,7 +1281,7 @@
[% ELSIF error == "product_blank_name" %] [% ELSIF error == "product_blank_name" %]
[% title = "Blank Product Name Not Allowed" %] [% title = "Blank Product Name Not Allowed" %]
[% admindocslinks = {'products.html' => 'Administering products'} %] [% admindocslinks = {'products.html' => 'Administering products'} %]
You must enter a name for the new product. You must enter a name for the product.
[% ELSIF error == "product_disabled" %] [% ELSIF error == "product_disabled" %]
[% title = BLOCK %]Product closed for [% terms.Bug %] Entry[% END %] [% title = BLOCK %]Product closed for [% terms.Bug %] Entry[% END %]
...@@ -1331,13 +1306,13 @@ ...@@ -1331,13 +1306,13 @@
[% ELSIF error == "product_must_have_description" %] [% ELSIF error == "product_must_have_description" %]
[% title = "Product needs Description" %] [% title = "Product needs Description" %]
[% admindocslinks = {'products.html' => 'Administering products'} %] [% admindocslinks = {'products.html' => 'Administering products'} %]
You must enter a description for product '[% product FILTER html %]'. You must enter a description for this product.
[% ELSIF error == "product_must_have_version" %] [% ELSIF error == "product_must_have_version" %]
[% title = "Product needs Version" %] [% title = "Product needs Version" %]
[% admindocslinks = {'products.html' => 'Administering products', [% admindocslinks = {'products.html' => 'Administering products',
'versions.html' => 'Administering versions'} %] 'versions.html' => 'Administering versions'} %]
You must enter a version for product '[% product FILTER html %]'. You must enter a valid version to create a new product.
[% ELSIF error == "product_not_specified" %] [% ELSIF error == "product_not_specified" %]
[% title = "No Product Specified" %] [% title = "No Product Specified" %]
...@@ -1363,7 +1338,8 @@ ...@@ -1363,7 +1338,8 @@
[% ELSIF error == "query_name_too_long" %] [% ELSIF error == "query_name_too_long" %]
[% title = "Query Name Too Long" %] [% title = "Query Name Too Long" %]
The name of the query must be less than 64 characters long. The name of the query must be less than [% constants.MAX_LEN_QUERY_NAME FILTER html %]
characters long.
[% ELSIF error == "quicksearch_unknown_field" %] [% ELSIF error == "quicksearch_unknown_field" %]
[% title = "Unknown QuickSearch Field" %] [% title = "Unknown QuickSearch Field" %]
......
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