blob: 37ae3a0cca5787e9cd793d441ece740dbc8d34c0 [file] [log] [blame]
# -*- 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;
use Bugzilla::Error;
use Bugzilla::Product;
###############################
#### Initialization ####
###############################
use constant DB_COLUMNS => qw(
classifications.id
classifications.name
classifications.description
classifications.sortkey
);
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;
if (defined $id) {
detaint_natural($id)
|| ThrowCodeError('param_must_be_numeric',
{function => 'Bugzilla::Classification::_init'});
$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
WHERE classification_id = ?}, undef, $self->id) || 0;
}
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 = ?
ORDER BY name}, undef, $self->id);
$self->{'products'} = Bugzilla::Product->new_from_list($product_ids);
}
return $self->{'products'};
}
###############################
#### Accessors ####
###############################
sub id { return $_[0]->{'id'}; }
sub name { return $_[0]->{'name'}; }
sub description { return $_[0]->{'description'}; }
sub sortkey { return $_[0]->{'sortkey'}; }
###############################
#### Subroutines ####
###############################
sub get_all_classifications {
my $dbh = Bugzilla->dbh;
my $ids = $dbh->selectcol_arrayref(q{
SELECT id FROM classifications ORDER BY sortkey, name});
my @classifications;
foreach my $id (@$ids) {
push @classifications, new Bugzilla::Classification($id);
}
return @classifications;
}
sub check_classification {
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;
}
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;
my $products = $classification->products;
my $hash_ref = Bugzilla::Classification::get_all_classifications();
my $classification = $hash_ref->{1};
my $classification =
Bugzilla::Classification::check_classification('AcmeClass');
=head1 DESCRIPTION
Classification.pm represents a Classification object.
A Classification is a higher-level grouping of Products.
=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.
=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
=over
=item C<get_all_classifications()>
Description: Returns all classifications.
Params: none.
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.
=back
=cut