]> 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:18:35 +0000 (15:18 +0100)
committerFrédéric Buclin <LpSolit@gmail.com>
Fri, 15 Feb 2013 14:18:35 +0000 (15:18 +0100)
r/a=LpSolit

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

index e5e050da1a161faa344e45d28a551efcf64a4005..4d018772f71ee199927ec86b402903ee28a2de5e 100644 (file)
@@ -267,6 +267,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 07e9caca90909403f45389d989b96210bb4f00c3..b3ba0942de06546ea8bff457c546ec16f8d7670f 100644 (file)
@@ -212,12 +212,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);
@@ -241,23 +241,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 =>
@@ -281,12 +284,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 =>
@@ -296,11 +298,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 =>
@@ -310,6 +313,7 @@ sub _milestone_to_hash {
         is_active =>
             $self->type('boolean', $milestone->is_active),
     };
+    return filter($params, $field_data, 'milestones');
 }
 
 1;
@@ -417,6 +421,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 3c71e0a9ce001ea8de951948f10fc7b96d698585..12606fb703d2cc571225d70904422639699b43e2 100644 (file)
@@ -40,11 +40,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;