]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 442016: Bugzilla::User::bless_groups should be returning Bugzilla::Group objects
authormkanat%bugzilla.org <>
Wed, 20 Aug 2008 02:32:36 +0000 (02:32 +0000)
committermkanat%bugzilla.org <>
Wed, 20 Aug 2008 02:32:36 +0000 (02:32 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=LpSolit

Bugzilla/User.pm
editusers.cgi
userprefs.cgi

index bc64e43eb3c083646748efe3d5fad3b6c7457216..760723279765ab03797e593e0b0e1a42e9fabc75 100644 (file)
@@ -425,49 +425,39 @@ sub bless_groups {
     return $self->{'bless_groups'} if defined $self->{'bless_groups'};
     return [] unless $self->id;
 
-    my $dbh = Bugzilla->dbh;
-    my $query;
-    my $connector;
-    my @bindValues;
-
     if ($self->in_group('editusers')) {
         # Users having editusers permissions may bless all groups.
-        $query = 'SELECT DISTINCT id, name, description FROM groups';
-        $connector = 'WHERE';
-    }
-    else {
-        # Get all groups for the user where:
-        #    + They have direct bless privileges
-        #    + They are a member of a group that inherits bless privs.
-        $query = q{
-            SELECT DISTINCT groups.id, groups.name, groups.description
-                       FROM groups, user_group_map, group_group_map AS ggm
-                      WHERE user_group_map.user_id = ?
-                        AND ((user_group_map.isbless = 1
-                              AND groups.id=user_group_map.group_id)
-                             OR (groups.id = ggm.grantor_id
-                                 AND ggm.grant_type = ?
-                                 AND ggm.member_id IN(} .
-                                 $self->groups_as_string . 
-                               q{)))};
-        $connector = 'AND';
-        @bindValues = ($self->id, GROUP_BLESS);
+        $self->{'bless_groups'} = [Bugzilla::Group->get_all];
+        return $self->{'bless_groups'};
     }
 
+    my $dbh = Bugzilla->dbh;
+
+    # Get all groups for the user where:
+    #    + They have direct bless privileges
+    #    + They are a member of a group that inherits bless privs.
+    my @group_ids = (map {$_->id} @{ $self->groups }) || (-1);
+    my $query =
+        'SELECT DISTINCT groups.id
+           FROM groups, user_group_map, group_group_map AS ggm
+          WHERE user_group_map.user_id = ?
+                AND ( (user_group_map.isbless = 1
+                       AND groups.id=user_group_map.group_id)
+                     OR (groups.id = ggm.grantor_id
+                         AND ggm.grant_type = ' . GROUP_BLESS . '
+                         AND ggm.member_id ' . $dbh->sql_in(\@group_ids)
+                     . ') )';
+
     # If visibilitygroups are used, restrict the set of groups.
-    if (!$self->in_group('editusers')
-        && Bugzilla->params->{'usevisibilitygroups'}) 
-    {
+    if (Bugzilla->params->{'usevisibilitygroups'}) {
+        return [] if !$self->visible_groups_as_string;
         # Users need to see a group in order to bless it.
-        my $visibleGroups = join(', ', @{$self->visible_groups_direct()})
-            || return $self->{'bless_groups'} = [];
-        $query .= " $connector id in ($visibleGroups)";
+        $query .= " AND groups.id "
+                  . $dbh->sql_in($self->visible_groups_inherited);
     }
 
-    $query .= ' ORDER BY name';
-
-    return $self->{'bless_groups'} =
-        $dbh->selectall_arrayref($query, {'Slice' => {}}, @bindValues);
+    my $ids = $dbh->selectcol_arrayref($query, undef, $self->id);
+    return $self->{'bless_groups'} = Bugzilla::Group->new_from_list($ids);
 }
 
 sub in_group {
@@ -979,12 +969,12 @@ sub can_bless {
     if (!scalar(@_)) {
         # If we're called without an argument, just return 
         # whether or not we can bless at all.
-        return scalar(@{$self->bless_groups}) ? 1 : 0;
+        return scalar(@{ $self->bless_groups }) ? 1 : 0;
     }
 
     # Otherwise, we're checking a specific group
     my $group_id = shift;
-    return (grep {$$_{'id'} eq $group_id} (@{$self->bless_groups})) ? 1 : 0;
+    return grep($_->id == $group_id, @{ $self->bless_groups }) ? 1 : 0;
 }
 
 sub flatten_group_membership {
@@ -1917,12 +1907,11 @@ Determines whether or not a user is in the given group by id.
 
 =item C<bless_groups>
 
-Returns an arrayref of hashes of C<groups> entries, where the keys of each hash
-are the names of C<id>, C<name> and C<description> columns of the C<groups>
-table.
+Returns an arrayref of L<Bugzilla::Group> objects.
+
 The arrayref consists of the groups the user can bless, taking into account
 that having editusers permissions means that you can bless all groups, and
-that you need to be aware of a group in order to bless a group.
+that you need to be able to see a group in order to bless it.
 
 =item C<get_products_by_permission($group)>
 
index 4e75d6df49952d4a8eaefb5fd5ddabdaa78d9841..f133b740929f98a443cd684e50a82881a37e1e36 100755 (executable)
@@ -276,9 +276,9 @@ if ($action eq 'search') {
     #      would allow to display a friendlier error message on page reloads.
     userDataToVars($otherUserID);
     my $permissions = $vars->{'permissions'};
-    foreach (@{$user->bless_groups()}) {
-        my $id = $$_{'id'};
-        my $name = $$_{'name'};
+    foreach my $blessable (@{$user->bless_groups()}) {
+        my $id = $blessable->id;
+        my $name = $blessable->name;
 
         # Change memberships.
         my $groupid = $cgi->param("group_$id") || 0;
index b281fd2146ef1962dfbc85749ef974af090b04ad..3ccfe820a9c357ec8137b6c3d4547104e9f970e6 100755 (executable)
@@ -400,7 +400,7 @@ sub DoSavedSearches {
         $vars->{'queryshare_groups'} =
             Bugzilla::Group->new_from_list($user->queryshare_groups);
     }
-    $vars->{'bless_group_ids'} = [map {$_->{'id'}} @{$user->bless_groups}];
+    $vars->{'bless_group_ids'} = [map { $_->id } @{$user->bless_groups}];
 }
 
 sub SaveSavedSearches {