]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 838846: In Product.get, include_fields => ['components'] no longer returns data...
authorSimon Green <sgreen@redhat.com>
Fri, 15 Feb 2013 14:16:48 +0000 (15:16 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Fri, 15 Feb 2013 14:16:48 +0000 (15:16 +0100)
r/a=LpSolit

Bugzilla/WebService.pm
Bugzilla/WebService/Product.pm
Bugzilla/WebService/Util.pm

index 67aa21374fb5d34362f1a0b9e01331c99e48cb93..5b28253753aa8ebe58489b3ea8a947200e3fa0dc 100644 (file)
@@ -275,6 +275,13 @@ the returned hashes.
 If you specify all the fields, then this function will return empty
 hashes.
 
+Some RPC calls support specifying sub fields. If an RPC call states that
+it support sub field restrictions, you can restrict what information is
+returned within the first field. For example, if you call Products.get
+with an include_fields of components.name, then only the component name
+would be returned (and nothing else). You can include the main field,
+and exclude a sub field.
+
 Invalid field names are ignored.
 
 Specifying fields here overrides C<include_fields>, so if you specify a
index fc48ecd88d2c2baf6628301ce543ea2d03dda1ab..755477acf7b048dabd82d414836f174db558c6a3 100644 (file)
@@ -214,12 +214,12 @@ sub _product_to_hash {
     }
     if (filter_wants($params, 'versions')) {
         $field_data->{versions} = [map {
-            $self->_version_to_hash($_)
+            $self->_version_to_hash($_, $params)
         } @{$product->versions}];
     }
     if (filter_wants($params, 'milestones')) {
         $field_data->{milestones} = [map {
-            $self->_milestone_to_hash($_)
+            $self->_milestone_to_hash($_, $params)
         } @{$product->milestones}];
     }
     return filter($params, $field_data);
@@ -243,23 +243,26 @@ sub _component_to_hash {
             0,
         is_active =>
             $self->type('boolean', $component->is_active),
-        flag_types => {
+    };
+
+    if (filter_wants($params, 'flag_types', 'components')) {
+        $field_data->{flag_types} = {
             bug =>
                 [map {
-                    $self->_flag_type_to_hash($_, $params)
+                    $self->_flag_type_to_hash($_)
                 } @{$component->flag_types->{'bug'}}],
             attachment =>
                 [map {
-                    $self->_flag_type_to_hash($_, $params)
+                    $self->_flag_type_to_hash($_)
                 } @{$component->flag_types->{'attachment'}}],
-        }
-    };
-    return filter($params, $field_data, 'component');
+        };
+    }
+    return filter($params, $field_data, 'components');
 }
 
 sub _flag_type_to_hash {
-    my ($self, $flag_type, $params) = @_;
-    my $field_data = {
+    my ($self, $flag_type) = @_;
+    return {
         id =>
             $self->type('int', $flag_type->id),
         name =>
@@ -283,12 +286,11 @@ sub _flag_type_to_hash {
         request_group =>
             $self->type('int', $flag_type->request_group_id),
     };
-    return filter($params, $field_data, 'flag_type');
 }
 
 sub _version_to_hash {
-    my ($self, $version) = @_;
-    return {
+    my ($self, $version, $params) = @_;
+    my $field_data = {
         id =>
             $self->type('int', $version->id),
         name =>
@@ -298,11 +300,12 @@ sub _version_to_hash {
         is_active =>
             $self->type('boolean', $version->is_active),
     };
+    return filter($params, $field_data, 'versions');
 }
 
 sub _milestone_to_hash {
-    my ($self, $milestone) = @_;
-    return {
+    my ($self, $milestone, $params) = @_;
+    my $field_data = {
         id =>
             $self->type('int', $milestone->id),
         name =>
@@ -312,6 +315,7 @@ sub _milestone_to_hash {
         is_active =>
             $self->type('boolean', $milestone->is_active),
     };
+    return filter($params, $field_data, 'milestones');
 }
 
 1;
@@ -419,6 +423,8 @@ In addition to the parameters below, this method also accepts the
 standard L<include_fields|Bugzilla::WebService/include_fields> and
 L<exclude_fields|Bugzilla::WebService/exclude_fields> arguments.
 
+This RPC call supports sub field restrictions.
+
 =over
 
 =item C<ids>
index 9e20a1e06856d747e4a0a4a2b22d403741b84c9b..d2a8de85c12ac4ee78e9ad9c3001356f26895e96 100644 (file)
@@ -43,11 +43,20 @@ sub filter_wants ($$;$) {
 
     $field = "${prefix}.${field}" if $prefix;
 
-    if (defined $params->{include_fields}) {
-        return 0 if !$include{$field};
+    if (defined $params->{exclude_fields} && $exclude{$field}) {
+        return 0;
     }
-    if (defined $params->{exclude_fields}) {
-        return 0 if $exclude{$field};
+    if (defined $params->{include_fields} && !$include{$field}) {
+        if ($prefix) {
+            # Include the field if the parent is include (and this one is not excluded)
+            return 0 if !$include{$prefix};
+        }
+        else {
+            # We want to include this if one of the sub keys is included
+            my $key = $field . '.';
+            my $len = length($key);
+            return 0 if ! grep { substr($_, 0, $len) eq $key  } keys %include;
+        }
     }
 
     return 1;