]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 469196 - WebService function to update a user's group membership
authorSimon Green <sgreen@redhat.com>
Wed, 2 Jul 2014 01:20:43 +0000 (11:20 +1000)
committerSimon Green <sgreen@redhat.com>
Wed, 2 Jul 2014 01:20:43 +0000 (11:20 +1000)
r=glob, a=glob

Bugzilla/User.pm
Bugzilla/WebService/User.pm

index 2631a5eae821f4a8d995aad4da34481534726eb6..55a967796948c32d409a3690c248b732467256c6 100644 (file)
@@ -25,6 +25,7 @@ use DateTime::TimeZone;
 use List::Util qw(max);
 use List::MoreUtils qw(any);
 use Scalar::Util qw(blessed);
+use Storable qw(dclone);
 use URI;
 use URI::QueryParam;
 
@@ -374,7 +375,8 @@ sub _set_groups {
            WHERE user_id = ? AND isbless = ? AND grant_type = ?},
         undef, $self->id, $is_bless, GRANT_DIRECT);
 
-    my $new_groups = my $current_groups = Bugzilla::Group->new_from_list($ids);
+    my $current_groups = Bugzilla::Group->new_from_list($ids);
+    my $new_groups = dclone($current_groups);
 
     # Record the changes
     if (exists $changes->{set}) {
@@ -390,10 +392,10 @@ sub _set_groups {
         }
     }
     else {
-        foreach my $group (@{$changes->{removed} // []}) {
+        foreach my $group (@{$changes->{remove} // []}) {
             @$new_groups = grep { $_->id ne $group->id } @$new_groups;
         }
-        foreach my $group (@{$changes->{added} // []}) {
+        foreach my $group (@{$changes->{add} // []}) {
             push @$new_groups, $group
                 unless grep { $_->id eq $group->id } @$new_groups;
         }
index f8358f78d6c065227997c88cd81b346e4755a179..f05b2b247f8cea8adb8006627c9770f9a0becba4 100644 (file)
@@ -314,6 +314,10 @@ sub update {
             # stays consistent for things that can become empty.
             $change->[0] = '' if !defined $change->[0];
             $change->[1] = '' if !defined $change->[1];
+            # We also flatten arrays (used by groups and blessed_groups)
+            $change->[0] = join(',', @{$change->[0]}) if ref $change->[0];
+            $change->[1] = join(',', @{$change->[1]}) if ref $change->[1];
+
             $hash{changes}{$field} = {
                 removed => $self->type('string', $change->[0]),
                 added   => $self->type('string', $change->[1]) 
@@ -733,6 +737,37 @@ C<string> A text field that holds the reason for disabling a user from logging
 into bugzilla, if empty then the user account is enabled otherwise it is
 disabled/closed.
 
+=item C<groups>
+
+C<hash> These specify the groups that this user is directly a member of.
+To set these, you should pass a hash as the value. The hash may contain
+the following fields:
+
+=over
+
+=item C<add> An array of C<int>s or C<string>s. The group ids or group names
+that the user should be added to.
+
+=item C<remove> An array of C<int>s or C<string>s. The group ids or group names
+that the user should be removed from.
+
+=item C<set> An array of C<int>s or C<string>s. An exact set of group ids
+and group names that the user should be a member of. NOTE: This does not
+remove groups from the user where the person making the change does not
+have the bless privilege for.
+
+If you specify C<set>, then C<add> and C<remove> will be ignored. A group in
+both the C<add> and C<remove> list will be added. Specifying a group that the
+user making the change does not have bless rights will generate an error.
+
+=back
+
+=item C<bless_groups>
+
+C<hash> - This is the same as groups, but affects what groups a user
+has direct membership to bless that group. It takes the same inputs as
+groups.
+
 =back
 
 =item B<Returns>