зеркало из https://github.com/mozilla/pjs.git
Bug 306601: Bugzilla::Classification needs a products() method - Patch by Andr� Batosti <batosti@async.com.br> r=LpSolit a=justdave
This commit is contained in:
Родитель
58b6e1d4f1
Коммит
9409b49a06
|
@ -21,6 +21,7 @@ package Bugzilla::Classification;
|
|||
|
||||
use Bugzilla::Util;
|
||||
use Bugzilla::Error;
|
||||
use Bugzilla::Product;
|
||||
|
||||
###############################
|
||||
#### Initialization ####
|
||||
|
@ -92,6 +93,24 @@ sub product_count {
|
|||
return $self->{'product_count'};
|
||||
}
|
||||
|
||||
sub products {
|
||||
my $self = shift;
|
||||
my $dbh = Bugzilla->dbh;
|
||||
|
||||
if (!$self->{'products'}) {
|
||||
my $product_ids = $dbh->selectcol_arrayref(q{
|
||||
SELECT id FROM products
|
||||
WHERE classification_id = ?}, undef, $self->id);
|
||||
|
||||
my @products;
|
||||
foreach my $product_id (@$product_ids) {
|
||||
push (@products, new Bugzilla::Product($product_id));
|
||||
}
|
||||
$self->{'products'} = \@products;
|
||||
}
|
||||
return $self->{'products'};
|
||||
}
|
||||
|
||||
###############################
|
||||
#### Accessors ####
|
||||
###############################
|
||||
|
@ -154,6 +173,7 @@ Bugzilla::Classification - Bugzilla classification class.
|
|||
my $name = $classification->name;
|
||||
my $description = $classification->description;
|
||||
my $product_count = $classification->product_count;
|
||||
my $products = $classification->products;
|
||||
|
||||
my $hash_ref = Bugzilla::Classification::get_all_classifications();
|
||||
my $classification = $hash_ref->{1};
|
||||
|
@ -194,6 +214,14 @@ A Classification is a higher-level grouping of Products.
|
|||
|
||||
Returns: Integer - The total of products inside the classification.
|
||||
|
||||
=item C<products>
|
||||
|
||||
Description: Returns all products of the classification.
|
||||
|
||||
Params: none.
|
||||
|
||||
Returns: A reference to an array of Bugzilla::Product objects.
|
||||
|
||||
=back
|
||||
|
||||
=head1 SUBROUTINES
|
||||
|
|
|
@ -19,7 +19,6 @@ use strict;
|
|||
package Bugzilla::Product;
|
||||
|
||||
use Bugzilla::Component;
|
||||
use Bugzilla::Classification;
|
||||
use Bugzilla::Version;
|
||||
use Bugzilla::Milestone;
|
||||
|
||||
|
@ -111,16 +110,6 @@ sub components {
|
|||
}
|
||||
return $self->{components};
|
||||
}
|
||||
|
||||
sub classification {
|
||||
my $self = shift;
|
||||
|
||||
if (!defined $self->{'classification'}) {
|
||||
$self->{'classification'} =
|
||||
new Bugzilla::Classification($self->classification_id);
|
||||
}
|
||||
return $self->{'classification'};
|
||||
}
|
||||
|
||||
sub group_controls {
|
||||
my $self = shift;
|
||||
|
@ -217,33 +206,6 @@ sub classification_id { return $_[0]->{'classification_id'}; }
|
|||
#### Subroutines ######
|
||||
###############################
|
||||
|
||||
sub get_products_by_classification {
|
||||
my ($class_id) = @_;
|
||||
my $dbh = Bugzilla->dbh;
|
||||
$class_id ||= DEFAULT_CLASSIFICATION_ID;
|
||||
|
||||
my $stored_class_id = $class_id;
|
||||
unless (detaint_natural($class_id)) {
|
||||
ThrowCodeError(
|
||||
'invalid_numeric_argument',
|
||||
{argument => 'product_id',
|
||||
value => $stored_class_id,
|
||||
function =>
|
||||
'Bugzilla::Product::get_classification_products'}
|
||||
);
|
||||
}
|
||||
|
||||
my $ids = $dbh->selectcol_arrayref(q{
|
||||
SELECT id FROM products
|
||||
WHERE classification_id = ? ORDER by name}, undef, $class_id);
|
||||
|
||||
my @products;
|
||||
foreach my $id (@$ids) {
|
||||
push @products, new Bugzilla::Product($id);
|
||||
}
|
||||
return @products;
|
||||
}
|
||||
|
||||
sub get_all_products {
|
||||
my $dbh = Bugzilla->dbh;
|
||||
|
||||
|
@ -287,7 +249,6 @@ Bugzilla::Product - Bugzilla product class.
|
|||
my $product = new Bugzilla::Product('AcmeProduct');
|
||||
|
||||
my @components = $product->components();
|
||||
my $classification = $product->classification();
|
||||
my $groups_controls = $product->group_controls();
|
||||
my @milestones = $product->milestones();
|
||||
my @versions = $product->versions();
|
||||
|
@ -304,8 +265,6 @@ Bugzilla::Product - Bugzilla product class.
|
|||
my $defaultmilestone = $product->default_milestone;
|
||||
my $classificationid = $product->classification_id;
|
||||
|
||||
my @products = Bugzilla::Product::get_products_by_classification(1);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Product.pm represents a product object.
|
||||
|
@ -336,15 +295,6 @@ Product.pm represents a product object.
|
|||
|
||||
Returns: An array of Bugzilla::Component object.
|
||||
|
||||
=item C<classification()>
|
||||
|
||||
Description: Returns a Bugzilla::Classification object for
|
||||
the product classification.
|
||||
|
||||
Params: none.
|
||||
|
||||
Returns: A Bugzilla::Classification object.
|
||||
|
||||
=item C<group_controls()>
|
||||
|
||||
Description: Returns a hash (group id as key) with all product
|
||||
|
@ -386,14 +336,6 @@ Product.pm represents a product object.
|
|||
|
||||
=over
|
||||
|
||||
=item C<get_products_by_classification($class_id)>
|
||||
|
||||
Description: Returns all products for a specific classification id.
|
||||
|
||||
Params: $class_id - Integer with classification id.
|
||||
|
||||
Returns: Bugzilla::Product object list.
|
||||
|
||||
=item C<get_all_products()>
|
||||
|
||||
Description: Returns all products from the database.
|
||||
|
|
|
@ -42,6 +42,7 @@ use Bugzilla::Util;
|
|||
use Bugzilla::Constants;
|
||||
use Bugzilla::User::Setting;
|
||||
use Bugzilla::Product;
|
||||
use Bugzilla::Classification;
|
||||
|
||||
use base qw(Exporter);
|
||||
@Bugzilla::User::EXPORT = qw(insert_new_user is_available_username
|
||||
|
@ -469,7 +470,8 @@ sub get_selectable_classifications {
|
|||
|
||||
my $class;
|
||||
foreach my $product (@$products) {
|
||||
$class->{$product->classification_id} ||= $product->classification;
|
||||
$class->{$product->classification_id} ||=
|
||||
new Bugzilla::Classification($product->classification_id);
|
||||
}
|
||||
my @sorted_class = sort {lc($a->name) cmp lc($b->name)} (values %$class);
|
||||
$self->{selectable_classifications} = \@sorted_class;
|
||||
|
|
|
@ -29,7 +29,6 @@ use Bugzilla::Util;
|
|||
use Bugzilla::Error;
|
||||
use Bugzilla::Config qw($datadir);
|
||||
use Bugzilla::Classification;
|
||||
use Bugzilla::Product;
|
||||
|
||||
require "globals.pl";
|
||||
|
||||
|
@ -119,6 +118,8 @@ if ($action eq 'new') {
|
|||
# Make versioncache flush
|
||||
unlink "$datadir/versioncache";
|
||||
|
||||
$vars->{'classification'} = $class_name;
|
||||
|
||||
LoadTemplate($action);
|
||||
}
|
||||
|
||||
|
@ -141,8 +142,7 @@ if ($action eq 'del') {
|
|||
ThrowUserError("classification_has_products");
|
||||
}
|
||||
|
||||
$vars->{'description'} = $classification->description;
|
||||
$vars->{'classification'} = $classification->name;
|
||||
$vars->{'classification'} = $classification;
|
||||
|
||||
LoadTemplate($action);
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ if ($action eq 'delete') {
|
|||
|
||||
unlink "$datadir/versioncache";
|
||||
|
||||
$vars->{'classification'} = $classification->name;
|
||||
$vars->{'classification'} = $classification;
|
||||
|
||||
LoadTemplate($action);
|
||||
}
|
||||
|
@ -191,13 +191,7 @@ if ($action eq 'edit') {
|
|||
my $classification =
|
||||
Bugzilla::Classification::check_classification($class_name);
|
||||
|
||||
my @products =
|
||||
Bugzilla::Product::get_products_by_classification(
|
||||
$classification->id);
|
||||
|
||||
$vars->{'description'} = $classification->description;
|
||||
$vars->{'classification'} = $classification->name;
|
||||
$vars->{'products'} = \@products;
|
||||
$vars->{'classification'} = $classification;
|
||||
|
||||
LoadTemplate($action);
|
||||
}
|
||||
|
@ -259,8 +253,6 @@ if ($action eq 'reclassify') {
|
|||
my $classification =
|
||||
Bugzilla::Classification::check_classification($class_name);
|
||||
|
||||
$vars->{'description'} = $classification->description;
|
||||
|
||||
my $sth = $dbh->prepare("UPDATE products SET classification_id = ?
|
||||
WHERE name = ?");
|
||||
|
||||
|
@ -280,22 +272,10 @@ if ($action eq 'reclassify') {
|
|||
}
|
||||
}
|
||||
|
||||
my @selected_products = ();
|
||||
my @unselected_products = ();
|
||||
|
||||
my @products = Bugzilla::Product::get_all_products();
|
||||
|
||||
foreach my $product (@products) {
|
||||
if ($product->classification_id == $classification->id) {
|
||||
push @selected_products, $product;
|
||||
} else {
|
||||
push @unselected_products, $product;
|
||||
}
|
||||
}
|
||||
|
||||
$vars->{'selected_products'} = \@selected_products;
|
||||
$vars->{'unselected_products'} = \@unselected_products;
|
||||
$vars->{'classification'} = $classification->name;
|
||||
my @classifications =
|
||||
Bugzilla::Classification::get_all_classifications;
|
||||
$vars->{'classifications'} = \@classifications;
|
||||
$vars->{'classification'} = $classification;
|
||||
|
||||
LoadTemplate($action);
|
||||
}
|
||||
|
|
|
@ -298,23 +298,7 @@ $vars->{'product'} = \@products;
|
|||
|
||||
# Create data structures representing each classification
|
||||
if (Param('useclassification')) {
|
||||
my @classifications = ();
|
||||
|
||||
my $class = $user->get_selectable_classifications;
|
||||
foreach my $c (@$class) {
|
||||
# Extract the name of products being in this classification.
|
||||
my @prod_in_class
|
||||
= grep { $_->classification_id == $c->id } @selectable_product_objects;
|
||||
@prod_in_class = map { $_->name } @prod_in_class;
|
||||
# Create hash to hold attributes for each classification.
|
||||
my %classification = (
|
||||
'name' => $c->name,
|
||||
'products' => \@prod_in_class
|
||||
);
|
||||
# Assign hash back to classification array.
|
||||
push @classifications, \%classification;
|
||||
}
|
||||
$vars->{'classification'} = \@classifications;
|
||||
$vars->{'classification'} = $user->get_selectable_classifications;
|
||||
}
|
||||
|
||||
# We use 'component_' because 'component' is a Template Toolkit reserved word.
|
||||
|
|
|
@ -30,13 +30,13 @@
|
|||
|
||||
</tr><tr>
|
||||
<td valign="top">Classification:</td>
|
||||
<td valign="top">[% classification FILTER html %]</td>
|
||||
<td valign="top">[% classification.name FILTER html %]</td>
|
||||
|
||||
</tr><tr>
|
||||
<td valign="top">Description:</td>
|
||||
<td valign="top">
|
||||
[% IF description %]
|
||||
[% description %]
|
||||
[% IF classification.description %]
|
||||
[% classification.description FILTER none %]
|
||||
[% ELSE %]
|
||||
<font color="red">description missing</font>
|
||||
[% END %]
|
||||
|
@ -51,7 +51,7 @@
|
|||
<form method=post action="editclassifications.cgi">
|
||||
<input type=submit value="Yes, delete">
|
||||
<input type=hidden name="action" value="delete">
|
||||
<input type=hidden name="classification" value="[% classification FILTER html %]">
|
||||
<input type=hidden name="classification" value="[% classification.name FILTER html %]">
|
||||
</form>
|
||||
|
||||
<p>Back to the <a href="./">main [% terms.bugs %] page</a>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
title = "Classification deleted"
|
||||
%]
|
||||
|
||||
Classification [% classification FILTER html %] deleted.<br>
|
||||
Classification [% classification.name FILTER html %] deleted.<br>
|
||||
|
||||
<p>Back to the <a href="./">main [% terms.bugs %] page</a>
|
||||
or <a href="editclassifications.cgi"> edit</a> more classifications.
|
||||
|
|
|
@ -27,18 +27,24 @@
|
|||
<table border=0 cellpadding=4 cellspacing=0>
|
||||
<tr>
|
||||
<th align="right">Classification:</th>
|
||||
<td><input size=64 maxlength=64 name="classification" value="[% classification FILTER html %]"></TD>
|
||||
<td><input size=64 maxlength=64 name="classification"
|
||||
value="[% classification.name FILTER html %]"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th align="right">Description:</th>
|
||||
<td><textarea rows=4 cols=64 name="description">[% description %]</textarea></TD>
|
||||
<td><textarea rows=4 cols=64 name="description">
|
||||
[% classification.description FILTER none %]</textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign=top>
|
||||
<th align="right"><a href="editproducts.cgi?classification=[% classification FILTER url_quote %]">Edit products</a></th>
|
||||
<th align="right">
|
||||
<a href="editproducts.cgi?classification=[% classification.name FILTER url_quote %]">
|
||||
Edit products</a>
|
||||
</th>
|
||||
<td>
|
||||
[% IF products AND products.size > 0 %]
|
||||
[% IF classification.products.size > 0 %]
|
||||
<table>
|
||||
[% FOREACH product = products %]
|
||||
[% FOREACH product = classification.products %]
|
||||
<tr>
|
||||
<th align=right valign=top>[% product.name FILTER html %]</th>
|
||||
<td valign=top>
|
||||
|
@ -58,7 +64,8 @@
|
|||
</tr>
|
||||
</table>
|
||||
|
||||
<input type=hidden name="classificationold" value="[% classification FILTER html %]">
|
||||
<input type=hidden name="classificationold"
|
||||
value="[% classification.name FILTER html %]">
|
||||
<input type=hidden name="action" value="update">
|
||||
<input type=submit value="Update">
|
||||
</form>
|
||||
|
|
|
@ -23,19 +23,17 @@
|
|||
title = "Reclassify products"
|
||||
%]
|
||||
|
||||
[% main_classification = classification %]
|
||||
|
||||
<form method=post action="editclassifications.cgi">
|
||||
<table border=0 cellpadding=4 cellspacing=0>
|
||||
<tr>
|
||||
<td valign="top">Classification:</td>
|
||||
<td valign="top" colspan=3>[% main_classification FILTER html %]</td>
|
||||
<td valign="top" colspan=3>[% classification.name FILTER html %]</td>
|
||||
|
||||
</tr><tr>
|
||||
<td valign="top">Description:</td>
|
||||
<td valign="top" colspan=3>
|
||||
[% IF description %]
|
||||
[% description %]
|
||||
[% IF classification.description %]
|
||||
[% classification.description FILTER none %]
|
||||
[% ELSE %]
|
||||
<font color="red">description missing</font>
|
||||
[% END %]
|
||||
|
@ -45,16 +43,20 @@
|
|||
<td valign="top">Products:</td>
|
||||
<td valign="top">Products</td>
|
||||
<td></td>
|
||||
<td valign="top">[% main_classification FILTER html %] Products</td>
|
||||
<td valign="top">[% classification.name FILTER html %] Products</td>
|
||||
|
||||
</tr><tr>
|
||||
<td></td>
|
||||
<td valign="top">
|
||||
<select name="prodlist" id="prodlist" multiple="multiple" size="20">
|
||||
[% FOREACH product = unselected_products %]
|
||||
<option value="[% product.name FILTER html %]">
|
||||
[[% product.classification.name FILTER html %]] [% product.name FILTER html %]
|
||||
</option>
|
||||
[% FOREACH class = classifications %]
|
||||
[% IF class.id != classification.id %]
|
||||
[% FOREACH product = class.products %]
|
||||
<option value="[% product.name FILTER html %]">
|
||||
[[% class.name FILTER html %]] [% product.name FILTER html %]
|
||||
</option>
|
||||
[% END %]
|
||||
[% END %]
|
||||
[% END %]
|
||||
</select></td>
|
||||
|
||||
|
@ -65,7 +67,7 @@
|
|||
|
||||
<td valign="middle" rowspan=2>
|
||||
<select name="myprodlist" id="myprodlist" multiple="multiple" size="20">
|
||||
[% FOREACH product = selected_products %]
|
||||
[% FOREACH product = classification.products %]
|
||||
<option value="[% product.name FILTER html %]">
|
||||
[% product.name FILTER html %]
|
||||
</option>
|
||||
|
@ -75,10 +77,11 @@
|
|||
</table>
|
||||
|
||||
<input type=hidden name="action" value="reclassify">
|
||||
<input type=hidden name="classification" value="[% main_classification FILTER html %]">
|
||||
<input type=hidden name="classification" value="[% classification.name FILTER html %]">
|
||||
</form>
|
||||
|
||||
<p>Back to the <a href="./">main [% terms.bugs %] page</a>,
|
||||
or <a href="editclassifications.cgi"> edit</a> more classifications.
|
||||
|
||||
[% PROCESS global/footer.html.tmpl %]
|
||||
[% PROCESS global/footer.html.tmpl %]
|
||||
|
||||
|
|
|
@ -497,18 +497,6 @@
|
|||
'link_uri'
|
||||
],
|
||||
|
||||
'admin/classifications/del.html.tmpl' => [
|
||||
'description',
|
||||
],
|
||||
|
||||
'admin/classifications/edit.html.tmpl' => [
|
||||
'description',
|
||||
],
|
||||
|
||||
'admin/classifications/reclassify.html.tmpl' => [
|
||||
'description',
|
||||
],
|
||||
|
||||
'admin/classifications/select.html.tmpl' => [
|
||||
'cl.description',
|
||||
],
|
||||
|
|
|
@ -43,7 +43,7 @@ var tms = new Array();
|
|||
[% nclass = 0 %]
|
||||
[% FOREACH c = classification %]
|
||||
prods[[% nclass FILTER js %]] = [
|
||||
[%- FOREACH item = c.products %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
|
||||
[%- FOREACH item = c.products %]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
|
||||
[% nclass = nclass+1 %]
|
||||
[% END %]
|
||||
|
||||
|
|
|
@ -74,9 +74,9 @@ for "crash secure SSL flash".
|
|||
[% FOREACH c = classification %]
|
||||
<optgroup label="[% c.name FILTER html %]">
|
||||
[% FOREACH p = c.products %]
|
||||
<option value="[% p FILTER html %]"
|
||||
[% " selected" IF lsearch(default.product, p) != -1 %]>
|
||||
[% p FILTER html %]
|
||||
<option value="[% p.name FILTER html %]"
|
||||
[% " selected" IF lsearch(default.product, p.name) != -1 %]>
|
||||
[% p.name FILTER html %]
|
||||
</option>
|
||||
[% END %]
|
||||
</optgroup>
|
||||
|
|
Загрузка…
Ссылка в новой задаче