summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Classification.pm28
-rw-r--r--Bugzilla/Product.pm58
-rw-r--r--Bugzilla/User.pm4
-rwxr-xr-xeditclassifications.cgi38
-rwxr-xr-xquery.cgi18
-rw-r--r--template/en/default/admin/classifications/del.html.tmpl8
-rw-r--r--template/en/default/admin/classifications/delete.html.tmpl2
-rw-r--r--template/en/default/admin/classifications/edit.html.tmpl19
-rw-r--r--template/en/default/admin/classifications/reclassify.html.tmpl29
-rw-r--r--template/en/default/filterexceptions.pl12
-rw-r--r--template/en/default/search/form.html.tmpl2
-rw-r--r--template/en/default/search/search-specific.html.tmpl6
12 files changed, 79 insertions, 145 deletions
diff --git a/Bugzilla/Classification.pm b/Bugzilla/Classification.pm
index 50094df0a..fae932b85 100644
--- a/Bugzilla/Classification.pm
+++ b/Bugzilla/Classification.pm
@@ -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
diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm
index 94547476f..1bf1d4e56 100644
--- a/Bugzilla/Product.pm
+++ b/Bugzilla/Product.pm
@@ -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.
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index a20f2e338..85584d70c 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -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;
diff --git a/editclassifications.cgi b/editclassifications.cgi
index e70d256c1..352d7816b 100755
--- a/editclassifications.cgi
+++ b/editclassifications.cgi
@@ -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);
}
diff --git a/query.cgi b/query.cgi
index 4a414d46c..986e2350b 100755
--- a/query.cgi
+++ b/query.cgi
@@ -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.
diff --git a/template/en/default/admin/classifications/del.html.tmpl b/template/en/default/admin/classifications/del.html.tmpl
index 1430e093d..c32e46b4d 100644
--- a/template/en/default/admin/classifications/del.html.tmpl
+++ b/template/en/default/admin/classifications/del.html.tmpl
@@ -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>
diff --git a/template/en/default/admin/classifications/delete.html.tmpl b/template/en/default/admin/classifications/delete.html.tmpl
index b2ec26cbb..046c1469f 100644
--- a/template/en/default/admin/classifications/delete.html.tmpl
+++ b/template/en/default/admin/classifications/delete.html.tmpl
@@ -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.
diff --git a/template/en/default/admin/classifications/edit.html.tmpl b/template/en/default/admin/classifications/edit.html.tmpl
index 65299df22..b38f4d6aa 100644
--- a/template/en/default/admin/classifications/edit.html.tmpl
+++ b/template/en/default/admin/classifications/edit.html.tmpl
@@ -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>
diff --git a/template/en/default/admin/classifications/reclassify.html.tmpl b/template/en/default/admin/classifications/reclassify.html.tmpl
index 3f7982bb3..127aeea87 100644
--- a/template/en/default/admin/classifications/reclassify.html.tmpl
+++ b/template/en/default/admin/classifications/reclassify.html.tmpl
@@ -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 %]]&nbsp;[% 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 %]]&nbsp;[% 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 %]
+
diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl
index d03a772c4..e0a811a48 100644
--- a/template/en/default/filterexceptions.pl
+++ b/template/en/default/filterexceptions.pl
@@ -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',
],
diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl
index a8905cc09..80bf0a2b9 100644
--- a/template/en/default/search/form.html.tmpl
+++ b/template/en/default/search/form.html.tmpl
@@ -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 %]
diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl
index a36be340c..1ff6f17ac 100644
--- a/template/en/default/search/search-specific.html.tmpl
+++ b/template/en/default/search/search-specific.html.tmpl
@@ -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>