# -*- 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. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): Joel Peshkin # Erik Stambaugh # Tiago R. Mello use strict; package Bugzilla::Group; use Bugzilla; use Bugzilla::Config; use Bugzilla::Util; use Bugzilla::Error; ############################### ##### Module Initialization ### ############################### use constant DB_COLUMNS => qw( groups.id groups.name groups.description groups.isbuggroup groups.last_changed groups.userregexp groups.isactive ); our $columns = join(", ", DB_COLUMNS); 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 $group; if (defined $id && detaint_natural($id)) { $group = $dbh->selectrow_hashref(qq{ SELECT $columns FROM groups WHERE id = ?}, undef, $id); } elsif (defined $param->{'name'}) { trick_taint($param->{'name'}); $group = $dbh->selectrow_hashref(qq{ SELECT $columns FROM groups WHERE name = ?}, undef, $param->{'name'}); } else { ThrowCodeError('bad_arg', {argument => 'param', function => 'Bugzilla::Group::_init'}); } return undef unless (defined $group); foreach my $field (keys %$group) { $self->{$field} = $group->{$field}; } return $self; } ############################### #### Accessors ###### ############################### sub id { return $_[0]->{'id'}; } sub name { return $_[0]->{'name'}; } sub description { return $_[0]->{'description'}; } sub is_bug_group { return $_[0]->{'isbuggroup'}; } sub last_changed { return $_[0]->{'last_changed'}; } sub user_regexp { return $_[0]->{'userregexp'}; } sub is_active { return $_[0]->{'isactive'}; } ################################ ##### Module Subroutines ### ################################ sub ValidateGroupName ($$) { my ($name, @users) = (@_); my $dbh = Bugzilla->dbh; my $query = "SELECT id FROM groups " . "WHERE name = ?"; if (Param('usevisibilitygroups')) { my @visible = (-1); foreach my $user (@users) { $user && push @visible, @{$user->visible_groups_direct}; } my $visible = join(', ', @visible); $query .= " AND id IN($visible)"; } my $sth = $dbh->prepare($query); $sth->execute($name); my ($ret) = $sth->fetchrow_array(); return $ret; } sub get_group_controls_by_product ($) { my ($product_id) = @_; my $dbh = Bugzilla->dbh; my $query = qq{SELECT $columns, group_control_map.entry, group_control_map.membercontrol, group_control_map.othercontrol, group_control_map.canedit FROM groups LEFT JOIN group_control_map ON groups.id = group_control_map.group_id WHERE group_control_map.product_id = ? AND groups.isbuggroup != 0 ORDER BY groups.name}; my $groups = $dbh->selectall_hashref($query, 'id', undef, ($product_id)); return $groups; } 1; __END__ =head1 NAME Bugzilla::Group - Bugzilla group class. =head1 SYNOPSIS use Bugzilla::Group; my $group = new Bugzilla::Group(1); my $group = new Bugzilla::Group({name => 'AcmeGroup'}); my $id = $group->id; my $name = $group->name; my $description = $group->description; my $last_changed = $group->last_changed; my $user_reg_exp = $group->user_reg_exp; my $is_active = $group->is_active; my $group_id = Bugzilla::Group::ValidateGroupName('admin', @users); my $grops = Bugzilla::Group::get_group_controls_by_product(1); =head1 DESCRIPTION Group.pm represents a Bugzilla Group object. =head1 METHODS =over =item C Description: The constructor is used to load an existing group by passing a group id or a hash with the group name. Params: $param - If you pass an integer, the integer is the group 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 product from the DB. Returns: A Bugzilla::Group object. =back =head1 SUBROUTINES =over =item C Description: ValidateGroupName checks to see if ANY of the users in the provided list of user objects can see the named group. Params: $name - String with the group name. @users - An array with Bugzilla::User objects. Returns: It returns the group id if successful and undef otherwise. =item C Description: Returns all group controls of a specific product. It is encouraged to use Bugzilla::Product object instead of directly calling this routine. Params: $product_id - Integer with a Bugzilla product id. Returns: A hash with group id as key and hash containing the group data as value. =back =cut