Classification.pm 6.38 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# -*- Mode: perl; indent-tabs-mode: nil -*-
#
# The contents of this file are subject to the Mozilla Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is the Bugzilla Bug Tracking System.
#
# Contributor(s): Tiago R. Mello <timello@async.com.br>
#

use strict;

package Bugzilla::Classification;

use Bugzilla::Util;
23
use Bugzilla::Error;
24
use Bugzilla::Product;
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

###############################
####    Initialization     ####
###############################

use constant DB_COLUMNS => qw(
    classifications.id
    classifications.name
    classifications.description
);

our $columns = join(", ", DB_COLUMNS);

###############################
####       Methods         ####
###############################

sub new {
    my $invocant = shift;
    my $class = ref($invocant) || $invocant;
    my $self = {};
    bless($self, $class);
    return $self->_init(@_);
}

sub _init {
    my $self = shift;
    my ($param) = @_;
    my $dbh = Bugzilla->dbh;

    my $id = $param unless (ref $param eq 'HASH');
    my $classification;

58 59 60 61
    if (defined $id) {
        detaint_natural($id)
          || ThrowCodeError('param_must_be_numeric',
                            {function => 'Bugzilla::Classification::_init'});
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

        $classification = $dbh->selectrow_hashref(qq{
            SELECT $columns FROM classifications
            WHERE id = ?}, undef, $id);

    } elsif (defined $param->{'name'}) {

        trick_taint($param->{'name'});
        $classification = $dbh->selectrow_hashref(qq{
            SELECT $columns FROM classifications
            WHERE name = ?}, undef, $param->{'name'});
    } else {
        ThrowCodeError('bad_arg',
            {argument => 'param',
             function => 'Bugzilla::Classification::_init'});
    }

    return undef unless (defined $classification);

    foreach my $field (keys %$classification) {
        $self->{$field} = $classification->{$field};
    }
    return $self;
}

sub product_count {
    my $self = shift;
    my $dbh = Bugzilla->dbh;

    if (!defined $self->{'product_count'}) {
        $self->{'product_count'} = $dbh->selectrow_array(q{
            SELECT COUNT(*) FROM products
94
            WHERE classification_id = ?}, undef, $self->id) || 0;
95 96 97 98
    }
    return $self->{'product_count'};
}

99 100 101 102 103 104 105
sub products {
    my $self = shift;
    my $dbh = Bugzilla->dbh;

    if (!$self->{'products'}) {
        my $product_ids = $dbh->selectcol_arrayref(q{
            SELECT id FROM products
106 107
            WHERE classification_id = ?
            ORDER BY name}, undef, $self->id);
108 109 110 111 112 113 114 115 116 117
 
        my @products;
        foreach my $product_id (@$product_ids) {
            push (@products, new Bugzilla::Product($product_id));
        }
        $self->{'products'} = \@products;
    }
    return $self->{'products'};
}

118 119 120 121 122 123 124 125 126 127 128 129
###############################
####      Accessors        ####
###############################

sub id          { return $_[0]->{'id'};          }
sub name        { return $_[0]->{'name'};        }
sub description { return $_[0]->{'description'}; }

###############################
####      Subroutines      ####
###############################

130
sub get_all_classifications {
131 132 133
    my $dbh = Bugzilla->dbh;

    my $ids = $dbh->selectcol_arrayref(q{
134
        SELECT id FROM classifications ORDER BY name});
135

136
    my @classifications;
137
    foreach my $id (@$ids) {
138
        push @classifications, new Bugzilla::Classification($id);
139
    }
140 141 142
    return @classifications;
}

143
sub check_classification {
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
    my ($class_name) = @_;

    unless ($class_name) {
        ThrowUserError("classification_not_specified");
    }

    my $classification =
        new Bugzilla::Classification({name => $class_name});

    unless ($classification) {
        ThrowUserError("classification_doesnt_exist",
                       { name => $class_name });
    }
    
    return $classification;
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
}

1;

__END__

=head1 NAME

Bugzilla::Classification - Bugzilla classification class.

=head1 SYNOPSIS

    use Bugzilla::Classification;

    my $classification = new Bugzilla::Classification(1);
    my $classification = new Bugzilla::Classification({name => 'Acme'});

    my $id = $classification->id;
    my $name = $classification->name;
    my $description = $classification->description;
    my $product_count = $classification->product_count;
180
    my $products = $classification->products;
181 182 183 184

    my $hash_ref = Bugzilla::Classification::get_all_classifications();
    my $classification = $hash_ref->{1};

185 186 187
    my $classification =
        Bugzilla::Classification::check_classification('AcmeClass');

188 189 190 191
=head1 DESCRIPTION

Classification.pm represents a Classification object.

192
A Classification is a higher-level grouping of Products.
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220

=head1 METHODS

=over

=item C<new($param)>

 Description: The constructor is used to load an existing
              classification by passing a classification
              id or classification name using a hash.

 Params:      $param - If you pass an integer, the integer is the
                      classification_id from the database that we
                      want to read in. If you pass in a hash with
                      'name' key, then the value of the name key
                      is the name of a classification from the DB.

 Returns:     A Bugzilla::Classification object.

=item C<product_count()>

 Description: Returns the total number of products that belong to
              the classification.

 Params:      none.

 Returns:     Integer - The total of products inside the classification.

221 222 223 224 225 226 227 228
=item C<products>

 Description: Returns all products of the classification.

 Params:      none.

 Returns:     A reference to an array of Bugzilla::Product objects.

229 230 231 232 233 234 235 236
=back

=head1 SUBROUTINES

=over

=item C<get_all_classifications()>

237
 Description: Returns all classifications.
238 239 240

 Params:      none.

241 242 243 244 245 246 247 248 249 250
 Returns:     Bugzilla::Classification object list.

=item C<check_classification($classification_name)>

 Description: Checks if the classification name passed in is a
              valid classification.

 Params:      $classification_name - String with a classification name.

 Returns:     Bugzilla::Classification object.
251 252 253 254

=back

=cut