Add components, versions and milestones to Product.get

RESOLVED FIXED in Bugzilla 4.2

Status

()

Bugzilla
WebService
--
enhancement
RESOLVED FIXED
7 years ago
6 years ago

People

(Reporter: glob, Assigned: glob)

Tracking

(Blocks: 1 bug)

Bugzilla 4.2
Dependency tree / graph
Bug Flags:
approval +

Details

Attachments

(1 attachment, 3 obsolete attachments)

(Assignee)

Description

7 years ago
Created attachment 530591 [details] [diff] [review]
patch v1

The Product.get webservice call should return components, versions and milestones.

The attached patch does that, as well as adding support for passing in a product name as well as id, and making it honour include_fields and exclude_fields.

The new fields are returned by default, but can be excluded if required.
Attachment #530591 - Flags: review?(dkl)
Comment on attachment 530591 [details] [diff] [review]
patch v1

Review of attachment 530591 [details] [diff] [review]:
-----------------------------------------------------------------

::: Bugzilla/WebService/Product.pm
@@ +84,5 @@
>      # Now create a result entry for each.
>      my @products = 
> +        map {
> +            my $field_data = {
> +                internals   => $_,

I would like to see internals go away and just return all information as normal key/values similar to what was done with Bug.get.

@@ +127,1 @@
>          } @requested_accessible;

Lets move this all out to a _get_product_attributes, _get_component_attributes, _get_version_attributes and _get_milestone_attributes.

@@ +234,3 @@
>  
>  A hash containing one item, C<products>, that is an array of
>  hashes. Each hash describes a product, and has the following items:

Need to add to the POD doc information about the include_fields, exclude_fields, etc. that can now be accepted.

From the Bugzilla/WebService/Bug.pm POD:

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.
Attachment #530591 - Flags: review?(dkl) → review-

Comment 2

7 years ago
Looks like a dupe of bug 385282 or bug 424921.

Comment 3

7 years ago
I might like to see Product.components implemented first, I think. Any thoughts on the value of having separate functions vs one?
(Assignee)

Comment 4

7 years ago
(In reply to comment #1)
> I would like to see internals go away and just return all information as
> normal key/values similar to what was done with Bug.get.

i agree, do you know why the internals information was exposed in the first place?

(In reply to comment #2)
> Looks like a dupe of bug 385282 or bug 424921.

it's different from bug 385282 as you can't use a component as a starting point.  it's a super-set of bug 424921, so once this bug has been fixed, that bug can be closed too.

(In reply to comment #3)
> I might like to see Product.components implemented first, I think. Any
> thoughts on the value of having separate functions vs one?

i wanted to avoid having to make multiple xhr calls to retrieve all information for a product (especially given how expensive each call is in some environments).

the use case i have is allowing someone to select a product, and using xhr to retrieve all the information required to fill an enter_bug form (components, versions and milestones).  there's a significant time difference between a single call and four on my dev env.
(Assignee)

Comment 5

7 years ago
(In reply to comment #1)
> I would like to see internals go away and just return all information as
> normal key/values similar to what was done with Bug.get.

max indicated this would be better to do in a separate bug, raised as bug 655652.
(Assignee)

Updated

7 years ago
Blocks: 655652
(Assignee)

Comment 6

7 years ago
Created attachment 530987 [details] [diff] [review]
patch v2
Attachment #530591 - Attachment is obsolete: true
Attachment #530987 - Flags: review?(dkl)

Comment 7

7 years ago
(In reply to comment #4)
> i wanted to avoid having to make multiple xhr calls to retrieve all
> information for a product (especially given how expensive each call is in
> some environments).

  FWIw, we can solve this in general by implementing system.multicall for XML-RPC and batch mode for JSON-RPC. (This should be pretty easy if we switch to RPC::Any.)
Comment on attachment 530987 [details] [diff] [review]
patch v2

Review of attachment 530987 [details] [diff] [review]:
-----------------------------------------------------------------

Looks good and works as expected. Please add History paragraph in the POD detailing the additions. r=dkl
Attachment #530987 - Flags: review?(dkl) → review+
(Assignee)

Updated

7 years ago
Flags: approval?

Comment 9

7 years ago
Comment on attachment 530987 [details] [diff] [review]
patch v2

  The code looks great, but on API review there are a few things that need to be fixed before I can approve this:

>=== modified file 'Bugzilla/WebService/Product.pm' (properties changed: -x to +x)
>+        my %names = map { lc $_ => 1 } @{$params->{names}};

  Nit: Precedence is unclear there, it should probably be lc($_) for clarity's sake.

>+    my @products =
>+        map {
>+            $self->_get_product_attributes($params, $_)
>         } @requested_accessible;

  Nit: To be consistent with other places, the formatting here should be something like:

  my @products = map { $self->_product_to_hash($params, $_) }
                     @requested_accessible;

>+sub _get_product_attributes {

  And as noted above, for consistency with Bugzilla::WebService::Bug, this should be named _product_to_hash.

>+sub _get_component_attributes {
>+    my ($self, $component) = @_;
>+    return {
>+        name =>
>+            $self->type('string', $component->name),

  "id" is also needed. (name can change, id cannot--clients may need to uniquely identify objects.)

>+        default_assignee_email =>
>+            $self->type('string' , $component->default_assignee->email),

  Should be default_assigned_to (consistency with Bugzilla::Bug).

>+        default_qa_email =>
>+            $self->type('string' , $component->default_qa_contact->email),

  Should be default_qa_contact.

>+sub _get_version_attributes {
>+    my ($self, $version) = @_;
>+    return {

  Missing "id".

>+sub _get_milestone_attributes {
>+    my ($self, $milestone) = @_;
>+    return {

  Needs id.

>+        name =>
>+            $self->type('string', $milestone->name),
>+        sort_key =>
>+            $self->type('int', $milestone->sortkey),

  This is currently "sortkey" in Bug.fields. However, I prefer it with the underscore. Could you patch Bug.fields to return it as sort_key (and also alias sortkey to that with a note that it will go away in a future version?).

>+=item C<components>
>+
>+C<array> An array of hashes, where each hash describes a component, and has the
>+following items: C<name>, C<description>, C<default_qa_email>, C<default_assignee_email>,
>+and C<id_active>.

  Typo: is_active.

  Also, this needs a sub-item that describes what each of those means and what their type is. (The others don't, it should be clear enough.)

>+=item C<versions>
>+
>+C<array> An array of hashes, where each hash describes a version, and has the
>+following items: C<name> and C<id_active>.

  Typo: is_active.

>+=item C<milestones>
>+
>+C<array> An array of hashes, where each hash describes a milestone, and has the
>+following items: C<name>, C<sort_key> and C<id_active>.

  Typo: is_active.

>+=item C<internals>
>+
>+An internal representation of the product.

  This needs to say UNSTABLE right below =item C<internals>.
Attachment #530987 - Flags: review-

Updated

7 years ago
Flags: approval?
Target Milestone: --- → Bugzilla 4.2
(Assignee)

Comment 10

7 years ago
(In reply to comment #9)
> >+        sort_key =>
> >+            $self->type('int', $milestone->sortkey),
> 
>   This is currently "sortkey" in Bug.fields. However, I prefer it with the
> underscore. Could you patch Bug.fields to return it as sort_key (and also
> alias sortkey to that with a note that it will go away in a future version?).

i don't see how we can alias returned fields; perhaps it's simpler to change sort_key to sortkey?

i also see Bug.fields is returning sortkey for versions and components (but always 0); should i do the same here?
(Assignee)

Comment 11

7 years ago
(In reply to comment #9)
> >+        default_assignee_email =>
> >+            $self->type('string' , $component->default_assignee->email),
> >+        default_qa_email =>
> >+            $self->type('string' , $component->default_qa_contact->email),

i just realised these should be returning ->login not ->email, i'll fix that too.

Comment 12

7 years ago
(In reply to comment #10)
> i don't see how we can alias returned fields; perhaps it's simpler to change
> sort_key to sortkey?

  You just send two versions of the fields. We're doing this in a few places already.

> i also see Bug.fields is returning sortkey for versions and components (but
> always 0); should i do the same here?

  Hmmmm, good question. Yeah, consistency is best.
(Assignee)

Comment 13

7 years ago
Created attachment 531863 [details] [diff] [review]
patch v3
Attachment #530987 - Attachment is obsolete: true
Attachment #531863 - Flags: review?(mkanat)

Comment 14

7 years ago
Comment on attachment 531863 [details] [diff] [review]
patch v3

>+    if (defined $params->{names}) {
>+        # Create a hash with the names the user wants
>+        my %names = map { lc($_) => 1 } @{$params->{names}};
>+        
>+        # Return the intersection of this, by grepping the names from 
>+        # accessible products.
>+        push(@requested_accessible,
>+            grep { $names{lc $_->name} } @$accessible_products);
>+    }

  I just realized there's one other problem here--if you specify both an id and a name for the same product, you'll get back duplicates, and shouldn't. (All the other functions attempt to avoid that case, I believe.)

>+        sort_key =>
>+            0,

  Add a comment explaining why you do this, for the product.

>+=item C<name>
>+
>+C<string> The internal name of the product.  This is a unique identifier for
> the product.

  It's actually not internal (this note applies to all the C<name> items).

>+=item C<default_assigned_to>
>+
>+C<string> The login name of the user to whom new bugs will be assigned to.

  "to whom new bugs will be assigned by default."

>+=item C<default_qa_contact>
>+
>+C<string> The login name of the user who will be set as the QA Contact for
>+new bugs.

  "by default."

>+=item C<sort_key>
>+
>+C<int> Values, when displayed in a list, are sorted first by this integer
>+and then secondly by their name.

  s/Values/Components/

>+=item C<is_active>
>+
>+C<boolean> A boolean indicating if the component is active.

  Explain what active means.


  Since we're returning sort_key for products, you should probably document that, too.
Attachment #531863 - Flags: review?(mkanat) → review-
(Assignee)

Comment 15

7 years ago
Created attachment 532567 [details] [diff] [review]
patch v4

this revision addresses most of your review points, except:

> Since we're returning sort_key for products

we're not returning sort_key for products, here or on Bug.fields.
Attachment #532567 - Flags: review?(mkanat)
(Assignee)

Updated

7 years ago
Blocks: 657317

Comment 16

7 years ago
Comment on attachment 532567 [details] [diff] [review]
patch v4

Looks good, except also mention that you added C<names> as an input parameter, in the History (you can do this on checkin).
Attachment #532567 - Flags: review?(mkanat) → review+

Updated

7 years ago
Flags: approval+
(Assignee)

Comment 17

7 years ago
Committing to: bzr+ssh://bzr.mozilla.org/bugzilla/trunk/
modified Bugzilla/WebService/Bug.pm
modified Bugzilla/WebService/Product.pm
Committed revision 7817.
Status: NEW → RESOLVED
Last Resolved: 7 years ago
Resolution: --- → FIXED
(Assignee)

Updated

7 years ago
Depends on: 424921

Updated

7 years ago
Blocks: 424921
No longer depends on: 424921

Updated

7 years ago
Attachment #531863 - Attachment is obsolete: true

Updated

7 years ago
Blocks: 686995

Updated

6 years ago
Blocks: 385282
You need to log in before you can comment on or make changes to this bug.