Commit e679c186 authored by lpsolit%gmail.com's avatar lpsolit%gmail.com

Bug 301743: Replace old code from editcomponents.cgi by methods and routines…

Bug 301743: Replace old code from editcomponents.cgi by methods and routines from Component.pm and Product.pm - Patch by Tiago R. Mello <timello@gmail.com> r=LpSolit a=justdave
parent 3223b9f1
......@@ -21,6 +21,7 @@ package Bugzilla::Component;
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::User;
###############################
#### Initialization ####
......@@ -87,6 +88,50 @@ sub _init {
return $self;
}
sub bug_count {
my $self = shift;
my $dbh = Bugzilla->dbh;
if (!defined $self->{'bug_count'}) {
$self->{'bug_count'} = $dbh->selectrow_array(q{
SELECT COUNT(*) FROM bugs
WHERE component_id = ?}, undef, $self->id) || 0;
}
return $self->{'bug_count'};
}
sub bug_ids {
my $self = shift;
my $dbh = Bugzilla->dbh;
if (!defined $self->{'bugs_ids'}) {
$self->{'bugs_ids'} = $dbh->selectcol_arrayref(q{
SELECT bug_id FROM bugs
WHERE component_id = ?}, undef, $self->id);
}
return $self->{'bugs_ids'};
}
sub default_assignee {
my $self = shift;
if (!defined $self->{'default_assignee'}) {
$self->{'default_assignee'} =
new Bugzilla::User($self->{'initialowner'});
}
return $self->{'default_assignee'};
}
sub default_qa_contact {
my $self = shift;
if (!defined $self->{'default_qa_contact'}) {
$self->{'default_qa_contact'} =
new Bugzilla::User($self->{'initialqacontact'});
}
return $self->{'default_qa_contact'};
}
###############################
#### Accessors ####
###############################
......@@ -95,8 +140,6 @@ sub id { return $_[0]->{'id'}; }
sub name { return $_[0]->{'name'}; }
sub description { return $_[0]->{'description'}; }
sub product_id { return $_[0]->{'product_id'}; }
sub default_assignee { return $_[0]->{'initialowner'}; }
sub default_qa_contact { return $_[0]->{'initialqacontact'}; }
###############################
#### Subroutines ####
......@@ -128,6 +171,27 @@ sub get_components_by_product {
return @components;
}
sub check_component {
my ($product, $comp_name) = @_;
$comp_name || ThrowUserError('component_blank_name');
if (length($comp_name) > 64) {
ThrowUserError('component_name_too_long',
{'name' => $comp_name});
}
my $component =
new Bugzilla::Component({product_id => $product->id,
name => $comp_name});
unless ($component) {
ThrowUserError('component_not_valid',
{'product' => $product->name,
'name' => $comp_name});
}
return $component;
}
1;
__END__
......@@ -144,6 +208,8 @@ Bugzilla::Component - Bugzilla product component class.
my $component = new Bugzilla::Component({product_id => 1,
name => 'AcmeComp'});
my $bug_count = $component->bug_count();
my $bug_ids = $component->bug_ids();
my $id = $component->id;
my $name = $component->name;
my $description = $component->description;
......@@ -152,6 +218,7 @@ Bugzilla::Component - Bugzilla product component class.
my $default_qa_contact = $component->default_qa_contact;
my @components = Bugzilla::Component::get_components_by_product($id);
my $component = Bugzilla::Component::check_component($product, 'AcmeComp');
=head1 DESCRIPTION
......@@ -175,6 +242,40 @@ Component.pm represents a Product Component object.
Returns: A Bugzilla::Component object.
=item C<bug_count()>
Description: Returns the total of bugs that belong to the component.
Params: none.
Returns: Integer with the number of bugs.
=item C<bugs_ids()>
Description: Returns all bug IDs that belong to the component.
Params: none.
Returns: A reference to an array of bug IDs.
=item C<default_assignee()>
Description: Returns a user object that represents the default assignee for
the component.
Params: none.
Returns: A Bugzilla::User object.
=item C<default_qa_contact()>
Description: Returns a user object that represents the default QA contact for
the component.
Params: none.
Returns: A Bugzilla::User object.
=back
=head1 SUBROUTINES
......@@ -189,6 +290,17 @@ Component.pm represents a Product Component object.
Returns: An array of Bugzilla::Component objects.
=item C<check_component($product, $comp_name)>
Description: Checks if the component name was passed in and if it is a valid
component.
Params: $product - A Bugzilla::Product object.
$comp_name - String with a component name.
Returns: Bugzilla::Component object.
=back
=cut
......@@ -20,29 +20,13 @@
#%]
[%# INTERFACE:
# name: string; The name of the component
#
# description: string; Component description, may be empty
#
# bug_count: number; The number of bugs belonging to the component
#
# initialowner: string; default assignee, may be empty
#
# initialqacontact: string; if system parameter is set to use the default
# qa contact field, then this will be it,
# may be empty
#
# milestoneurl: string; milestone url, if milestones are in use,
# may be empty
#
# product: string; The name of the product
#
# disallownew: boolean; Are new bugs allowed for the product flag
#
# product_description: string; Description of product
# comp: object; Bugzilla::Component object representing the component the
# user wants to delete.
# prod: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% title = BLOCK %]Delete Component of Product '[% product FILTER html %]'
[% title = BLOCK %]Delete Component of Product '[% prod.name FILTER html %]'
[% END %]
[% PROCESS global/header.html.tmpl
......@@ -56,54 +40,58 @@
</tr>
<tr>
<td valign="top">Component:</td>
<td valign="top">[% name FILTER html %]</td>
<td valign="top">[% comp.name FILTER html %]</td>
</tr>
<tr>
<td valign="top">Component Description:</td>
<td valign="top">[% description FILTER html %]</td>
<td valign="top">[% comp.description FILTER html %]</td>
</tr>
<tr>
<td valign="top">Default assignee:</td>
<td valign="top">[% initialowner FILTER html %]</td>
<td valign="top">[% comp.default_assignee.login FILTER html %]</td>
[% IF Param('useqacontact') %]
</tr>
<tr>
<td valign="top">Default QA contact:</td>
<td valign="top">[% initialqacontact FILTER html %]</td>
<td valign="top">[% comp.default_qa_contact.login FILTER html %]</td>
[% END %]
</tr>
<tr>
<td valign="top">Component of Product:</td>
<td valign="top">[% product FILTER html %]</td>
<td valign="top">[% prod.name FILTER html %]</td>
[% IF product_description %]
[% IF prod.description %]
</tr>
<tr>
<td valign="top">Product Description:</td>
<td valign="top">[% product_description FILTER html %]</td>
<td valign="top">[% prod.description FILTER html %]</td>
[% END %]
[% IF Param('usetargetmilestone') %]
</tr>
<tr>
<td valign="top">Product Milestone URL:</td>
<td valign="top"><a href="[% milestoneurl FILTER uri %]">[% milestoneurl FILTER html %]</a></td>
<td valign="top">
<a href="[% prod.milestone_url FILTER uri %]">
[% prod.milestone_url FILTER html %]
</a>
</td>
[% END %]
</tr>
<tr>
<TD VALIGN="top">Closed for [% terms.bugs %]:</TD>
<TD VALIGN="top">[% IF $disallownew %]Yes[% ELSE %]No[% END %]</td>
<TD VALIGN="top">[% IF prod.disallow_new %]Yes[% ELSE %]No[% END %]</td>
</tr>
<tr>
<td valign="top">[% terms.Bugs %]:</td>
<td valign="top">
[% IF bug_count %]
<a title="List of [% terms.bugs %] for component '[% name FILTER html %]'"
href="buglist.cgi?component=[% name FILTER url_quote %]&amp;product=
[%- product FILTER url_quote %]">[% bug_count %]</a>
[% IF comp.bug_count %]
<a title="List of [% terms.bugs %] for component '[% comp.name FILTER html %]'"
href="buglist.cgi?component=[% comp.name FILTER url_quote %]&amp;product=
[%- prod.name FILTER url_quote %]">[% comp.bug_count %]</a>
[% ELSE %]
None
[% END %]
......@@ -113,21 +101,21 @@
<h2>Confirmation</h2>
[% IF bug_count %]
[% IF comp.bug_count %]
[% IF !Param("allowbugdeletion") %]
Sorry, there
[% IF bug_count > 1 %]
are [% bug_count %] [%+ terms.bugs %]
[% IF comp.bug_count > 1 %]
are [% comp.bug_count %] [%+ terms.bugs %]
[% ELSE %]
is [% bug_count %] [%+ terms.bug %]
is [% comp.bug_count %] [%+ terms.bug %]
[% END %]
outstanding for this component. You must reassign
[% IF bug_count > 1 %]
[% IF comp.bug_count > 1 %]
those [% terms.bugs %]
[% ELSE %]
that [% terms.bug %]
......@@ -139,8 +127,8 @@
<table border="0" cellpadding="20" width="70%" bgcolor="red"><tr><td>
There [% IF bug_count > 1 %]
are [% bug_count %] [%+ terms.bugs %]
There [% IF comp.bug_count > 1 %]
are [% comp.bug_count %] [%+ terms.bugs %]
[% ELSE %]
is 1 [% terms.bug %]
[% END %]
......@@ -153,19 +141,22 @@
[% END %]
[% IF bug_count == 0 || Param('allowbugdeletion') %]
[% IF comp.bug_count == 0 || Param('allowbugdeletion') %]
<p>Do you really want to delete this component?<p>
<form method="post" action="editcomponents.cgi">
<input type="submit" value="Yes, delete">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="product" value="[% product FILTER html %]">
<input type="hidden" name="component" value="[% name FILTER html %]">
<input type="hidden" name="product" value="[% prod.name FILTER html %]">
<input type="hidden" name="component" value="[% comp.name FILTER html %]">
</form>
[% END %]
[% PROCESS admin/components/footer.html.tmpl %]
[% PROCESS admin/components/footer.html.tmpl
name = comp.name
product = prod.name
%]
[% PROCESS global/footer.html.tmpl %]
......@@ -20,22 +20,15 @@
#%]
[%# INTERFACE:
# name: string; The name of the component.
#
# description: string; Component description, may be empty
#
# initialowner: string; default assignee, may be empty
#
# initialqacontact: string; default qa contact, may be empty
#
# product: string; The product the component belongs to
#
# bug_count: number; number of bugs belonging to the component
# comp: object; Bugzilla::Component object representing the component the
# user wants to edit.
# prod: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Edit Component '[% name FILTER html %]'[% END %]
[% title = BLOCK %]Edit Component '[% comp.name FILTER html %]'[% END %]
[% PROCESS global/header.html.tmpl
title = title
%]
......@@ -46,12 +39,12 @@
<tr>
<td valign="top">Component:</td>
<td><input size="64" maxlength="64" name="component" value="
[%- name FILTER html %]"></td>
[%- comp.name FILTER html %]"></td>
</tr>
<tr>
<td valign="top">Component Description:</td>
<td><textarea rows="4" cols="64" wrap="virtual"
name="description">[% description FILTER html %]</textarea>
name="description">[% comp.description FILTER html %]</textarea>
</td>
</tr>
<tr>
......@@ -60,7 +53,7 @@
[% INCLUDE global/userselect.html.tmpl
name => "initialowner"
id => "initialowner"
value => initialowner
value => comp.default_assignee.login
size => 64
emptyok => 1
%]
......@@ -74,7 +67,7 @@
[% INCLUDE global/userselect.html.tmpl
name => "initialqacontact"
id => "initialqacontact"
value => initialqacontact
value => comp.default_qa_contact.login
size => 64
emptyok => 1
%]
......@@ -85,11 +78,11 @@
<tr>
<td>[% terms.Bugs %]:</td>
<td>
[% IF bug_count > 0 %]
<a title="Bugs in component '[% name FILTER html %]'"
[% IF comp.bug_count > 0 %]
<a title="Bugs in component '[% comp.name FILTER html %]'"
href="buglist.cgi?component=
[%- name FILTER url_quote %]&amp;product=
[%- product FILTER url_quote %]">[% bug_count %]</a>
[%- comp.name FILTER url_quote %]&amp;product=
[%- prod.name FILTER url_quote %]">[% comp.bug_count %]</a>
[% ELSE %]
None
[% END %]
......@@ -98,26 +91,20 @@
</table>
<input type="hidden" name="componentold" value="
[%- name FILTER html %]">
<input type="hidden" name="descriptionold" value="
[%- description FILTER html %]">
<input type="hidden" name="initialownerold" value="
[%- initialowner FILTER html %]">
<input type="hidden" name="initialqacontactold" value="
[%- initialqacontact FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="product" value="[% product FILTER html %]">
<input type="hidden" name="componentold" value="[% comp.name FILTER html %]">
<input type="hidden" name="product" value="[% prod.name FILTER html %]">
<input type="submit" value="Update"> or <a
href="editcomponents.cgi?action=del&amp;product=
[%- product FILTER url_quote %]&amp;component=
[%- name FILTER url_quote %]">Delete</a> this component.
[%- prod.name FILTER url_quote %]&amp;component=
[%- comp.name FILTER url_quote %]">Delete</a> this component.
</form>
[% PROCESS admin/components/footer.html.tmpl
no_edit_component_link = 1 %]
no_edit_component_link = 1
name = comp.name
product = prod.name
%]
[% PROCESS global/footer.html.tmpl %]
......@@ -20,16 +20,8 @@
#%]
[%# INTERFACE:
# components: array of hashes having the properties:
# - name: string; The name of the component.
# - description: string; The description of the component.
# - initialowner: string; The default assignee of the component.
# - initialqacontact: string; The qa_contact of the component.
# - bug_count: number; The number of bugs in the component
# (if showbugcounts defined).
#
# components: array of component objects
# showbugcounts: if defined, then bug counts should be included in the table
#
# product: string; the name of the product we are editing components for
#%]
......@@ -96,10 +88,31 @@
contentlink => delete_contentlink
}) %]
[%# Overrides the initialowner and the initialqacontact with right values %]
[% overrides.initialowner = [] %]
[% overrides.initialqacontact = [] %]
[% FOREACH component = components %]
[% overrides.initialowner.push({
match_value => component.name
match_field => 'name'
override_content => 1
content => component.default_assignee.login
})
%]
[% overrides.initialqacontact.push({
match_value => component.name
match_field => 'name'
override_content => 1
content => component.default_qa_contact.login
})
%]
[% END %]
[% PROCESS admin/table.html.tmpl
columns = columns
data = components
footer = footer_row
overrides = overrides
%]
<p><a href="editcomponents.cgi?action=add&amp;product=[% product FILTER url_quote %]">Add</a>
......
......@@ -574,7 +574,7 @@
'admin/components/confirm-delete.html.tmpl' => [
'bug_count'
'comp.bug_count'
],
'admin/components/deleted.html.tmpl' => [
......@@ -608,7 +608,7 @@
],
'admin/components/edit.html.tmpl' => [
'bug_count'
'comp.bug_count'
],
'admin/components/list.html.tmpl' => [
......
......@@ -288,16 +288,6 @@
[% title = "Component Requires Default Assignee" %]
You must enter a default assignee for component '[% name FILTER html %]'.
[% ELSIF error == "component_need_valid_initialowner" %]
[% title = "Component Requires A Valid Default Assignee" %]
You must use an existing [% terms.Bugzilla %] account as the default assignee for
component '[% name FILTER html %]'.
[% ELSIF error == "component_need_valid_initialqacontact" %]
[% title = "Component Requires A Valid Default QA Contact" %]
You must use an existing [% terms.Bugzilla %] account as default QA contact for
component '[% name FILTER html %]'.
[% ELSIF error == "product_not_specified" %]
[% title = "No Product Specified" %]
No product specified when trying to edit components, milestones or
......
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