]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 306601: Bugzilla::Classification needs a products() method - Patch by André Batos...
authorlpsolit%gmail.com <>
Fri, 14 Oct 2005 06:42:32 +0000 (06:42 +0000)
committerlpsolit%gmail.com <>
Fri, 14 Oct 2005 06:42:32 +0000 (06:42 +0000)
12 files changed:
Bugzilla/Classification.pm
Bugzilla/Product.pm
Bugzilla/User.pm
editclassifications.cgi
query.cgi
template/en/default/admin/classifications/del.html.tmpl
template/en/default/admin/classifications/delete.html.tmpl
template/en/default/admin/classifications/edit.html.tmpl
template/en/default/admin/classifications/reclassify.html.tmpl
template/en/default/filterexceptions.pl
template/en/default/search/form.html.tmpl
template/en/default/search/search-specific.html.tmpl

index 50094df0ab2cd8abcd88e4d13831b4a3998d4a9e..fae932b8593032358e94f0da012a9d6f594bb077 100644 (file)
@@ -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
index 94547476fe7bff78782a1d5003d27b2f161950a6..1bf1d4e56369aa7dff63d88c824a229823a468f4 100644 (file)
@@ -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.
index a20f2e338324a066f30a810e678009eca07da921..85584d70c4a5df4bae8e2b94025693093f29ed58 100644 (file)
@@ -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;
index e70d256c10346009eb2b9272ae9dda6c970a67c6..352d7816b9584b8f3a396ba610a7ae8927ef8f48 100755 (executable)
@@ -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);
 }
index 4a414d46c6234a151a2d6b1de6a8d1bbe40c8d54..986e2350b651647be23bb04b15f7cea3c3df10b3 100755 (executable)
--- 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.
index 1430e093d0f7f0aac8a4e57d5658c9a5a134aa12..c32e46b4df7f20a87db8b3297777d15df3069692 100644 (file)
 
 </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>
index b2ec26cbb22c76f7d4ac44a42f6dbd0dcf36442e..046c1469fc5f47d3096c679ed5779c33fc035014 100644 (file)
@@ -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.
index 65299df2270f1758344af7938e24f29d6a1341a1..b38f4d6aa24ffbd5a17dc4bd38c99ecafbd418ae 100644 (file)
   <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>
index 3f7982bb3214a6ffaa8940d7af15802b18c5ef9c..127aeea877662d48e149e74138715326cb08ee67 100644 (file)
   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 %]
       <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>
   </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 %]
+
index d03a772c47863ed8f465c9a429120ec74d617983..e0a811a48a950a4127cf957d1a9e3d1451f99aac 100644 (file)
   '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', 
 ],
index a8905cc0973a3f9080167ea6f9e7b2b467db3e70..80bf0a2b95e152a95bb846290f151e4c94e0df9e 100644 (file)
@@ -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 %]
 
index a36be340c39cf9d8113fc6a39d058dc6223bf500..1ff6f17acdfc2f42b9583cd5047b1cd33cd79a8c 100644 (file)
@@ -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>