Bug 355837: Make the webservice able to create bugs
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=mbd, a=justdave git-svn-id: svn://10.0.0.236/trunk@214622 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -100,8 +100,8 @@ sub DB_COLUMNS {
|
||||
|
||||
use constant REQUIRED_CREATE_FIELDS => qw(
|
||||
bug_severity
|
||||
comment
|
||||
component
|
||||
creation_ts
|
||||
op_sys
|
||||
priority
|
||||
product
|
||||
@@ -319,9 +319,18 @@ sub create {
|
||||
|
||||
# And insert the comment. We always insert a comment on bug creation,
|
||||
# but sometimes it's blank.
|
||||
$dbh->do('INSERT INTO longdescs (bug_id, who, bug_when, thetext, isprivate)
|
||||
VALUES (?, ?, ?, ?, ?)', undef,
|
||||
$bug->bug_id, $bug->{reporter_id}, $timestamp, $comment, $privacy);
|
||||
my @columns = qw(bug_id who bug_when thetext);
|
||||
my @values = ($bug->bug_id, $bug->{reporter_id}, $timestamp, $comment);
|
||||
# We don't include the "isprivate" column unless it was specified.
|
||||
# This allows it to fall back to its database default.
|
||||
if (defined $privacy) {
|
||||
push(@columns, 'isprivate');
|
||||
push(@values, $privacy);
|
||||
}
|
||||
my $qmarks = "?," x @columns;
|
||||
chop($qmarks);
|
||||
$dbh->do('INSERT INTO longdescs (' . join(',', @columns) . ")
|
||||
VALUES ($qmarks)", undef, @values);
|
||||
|
||||
$dbh->bz_unlock_tables();
|
||||
|
||||
@@ -361,8 +370,12 @@ sub run_create_validators {
|
||||
# Callers cannot set Reporter, currently.
|
||||
$params->{reporter} = Bugzilla->user->id;
|
||||
|
||||
$params->{creation_ts} ||= Bugzilla->dbh->selectrow_array('SELECT NOW()');
|
||||
$params->{delta_ts} = $params->{creation_ts};
|
||||
$params->{remaining_time} = $params->{estimated_time};
|
||||
|
||||
if ($params->{estimated_time}) {
|
||||
$params->{remaining_time} = $params->{estimated_time};
|
||||
}
|
||||
|
||||
$class->_check_strict_isolation($product, $params->{cc},
|
||||
$params->{assigned_to}, $params->{qa_contact});
|
||||
@@ -370,6 +383,12 @@ sub run_create_validators {
|
||||
($params->{dependson}, $params->{blocked}) =
|
||||
$class->_check_dependencies($params->{dependson}, $params->{blocked});
|
||||
|
||||
# You can't set these fields on bug creation (or sometimes ever).
|
||||
delete $params->{resolution};
|
||||
delete $params->{votes};
|
||||
delete $params->{lastdiffed};
|
||||
delete $params->{bug_id};
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
@@ -562,9 +581,6 @@ sub _check_component {
|
||||
$name = trim($name);
|
||||
$name || ThrowUserError("require_component");
|
||||
my $obj = Bugzilla::Component::check_component($product, $name);
|
||||
# XXX Right now, post_bug needs this to return an object. However,
|
||||
# when we move to Bugzilla::Bug->create, this should just return
|
||||
# what it was passed.
|
||||
return $obj;
|
||||
}
|
||||
|
||||
@@ -682,9 +698,6 @@ sub _check_product {
|
||||
# can_enter_product already does everything that check_product
|
||||
# would do for us, so we don't need to use it.
|
||||
my $obj = new Bugzilla::Product({ name => $name });
|
||||
# XXX Right now, post_bug needs this to return an object. However,
|
||||
# when we move to Bugzilla::Bug->create, this should just return
|
||||
# what it was passed.
|
||||
return $obj;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,15 +13,38 @@
|
||||
# The Original Code is the Bugzilla Bug Tracking System.
|
||||
#
|
||||
# Contributor(s): Marc Schumann <wurblzap@gmail.com>
|
||||
# Max Kanat-Alexander <mkanat@bugzilla.org>
|
||||
|
||||
package Bugzilla::WebService::Bug;
|
||||
|
||||
use strict;
|
||||
use base qw(Bugzilla::WebService);
|
||||
import SOAP::Data qw(type);
|
||||
|
||||
use Bugzilla::WebService::Constants;
|
||||
use Bugzilla::Util qw(detaint_natural);
|
||||
use Bugzilla::Bug;
|
||||
use Bugzilla::BugMail;
|
||||
use Bugzilla::Constants;
|
||||
|
||||
#############
|
||||
# Constants #
|
||||
#############
|
||||
|
||||
# This maps the names of internal Bugzilla bug fields to things that would
|
||||
# make sense to somebody who's not intimately familiar with the inner workings
|
||||
# of Bugzilla. (These are the field names that the WebService uses.)
|
||||
use constant FIELD_MAP => {
|
||||
status => 'bug_status',
|
||||
severity => 'bug_severity',
|
||||
description => 'comment',
|
||||
summary => 'short_desc',
|
||||
platform => 'rep_platform',
|
||||
};
|
||||
|
||||
###########
|
||||
# Methods #
|
||||
###########
|
||||
|
||||
sub get_bug {
|
||||
my $self = shift;
|
||||
@@ -33,4 +56,181 @@ sub get_bug {
|
||||
return new Bugzilla::Bug($bug_id);
|
||||
}
|
||||
|
||||
|
||||
sub create {
|
||||
my ($self, $params) = @_;
|
||||
|
||||
Bugzilla->login(LOGIN_REQUIRED);
|
||||
|
||||
my %field_values;
|
||||
foreach my $field (keys %$params) {
|
||||
my $field_name = FIELD_MAP->{$field} || $field;
|
||||
$field_values{$field_name} = $params->{$field};
|
||||
}
|
||||
|
||||
# Make sure all the required fields are in the hash.
|
||||
foreach my $field (Bugzilla::Bug::REQUIRED_CREATE_FIELDS) {
|
||||
$field_values{$field} = undef unless exists $field_values{$field};
|
||||
}
|
||||
|
||||
# WebService users can't set the creation date of a bug.
|
||||
delete $field_values{'creation_ts'};
|
||||
|
||||
my $bug = Bugzilla::Bug->create(\%field_values);
|
||||
|
||||
Bugzilla::BugMail::Send($bug->bug_id, { changer => $bug->reporter->login });
|
||||
|
||||
return { id => type('int')->value($bug->bug_id) };
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
__END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Bugzilla::Webservice::Bug - The API for creating, changing, and getting the
|
||||
details of bugs.
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This part of the Bugzilla API allows you to file a new bug in Bugzilla.
|
||||
|
||||
=head1 METHODS
|
||||
|
||||
See L<Bugzilla::WebService> for a description of B<STABLE>, B<UNSTABLE>,
|
||||
and B<EXPERIMENTAL>.
|
||||
|
||||
=over
|
||||
|
||||
=item C<create> B<EXPERIMENTAL>
|
||||
|
||||
=over
|
||||
|
||||
=item B<Description>
|
||||
|
||||
This allows you to create a new bug in Bugzilla. If you specify any
|
||||
invalid fields, they will be ignored. If you specify any fields you
|
||||
are not allowed to set, they will just be set to their defaults or ignored.
|
||||
|
||||
You cannot currently set all the items here that you can set on enter_bug.cgi.
|
||||
|
||||
The WebService interface may allow you to set things other than those listed
|
||||
here, but realize that anything undocumented is B<UNSTABLE> and will very
|
||||
likely change in the future.
|
||||
|
||||
=item B<Params>
|
||||
|
||||
Some params must be set, or an error will be thrown. These params are
|
||||
marked B<Required>.
|
||||
|
||||
Some parameters can have defaults set in Bugzilla, by the administrator.
|
||||
If these parameters have defaults set, you can omit them. These parameters
|
||||
are marked B<Defaulted>.
|
||||
|
||||
Clients that want to be able to interact uniformly with multiple
|
||||
Bugzillas should always set both the params marked B<Required> and those
|
||||
marked B<Defaulted>, because some Bugzillas may not have defaults set
|
||||
for B<Defaulted> parameters, and then this method will throw an error
|
||||
if you don't specify them.
|
||||
|
||||
The descriptions of the parameters below are what they mean when Bugzilla is
|
||||
being used to track software bugs. They may have other meanings in some
|
||||
installations.
|
||||
|
||||
=over
|
||||
|
||||
=item C<product> (string) B<Required> - The name of the product the bug
|
||||
is being filed against.
|
||||
|
||||
=item C<component> (string) B<Required> - The name of a component in the
|
||||
product above.
|
||||
|
||||
=item C<summary> (string) B<Required> - A brief description of the bug being
|
||||
filed.
|
||||
|
||||
=item C<version> (string) B<Required> - A version of the product above;
|
||||
the version the bug was found in.
|
||||
|
||||
=item C<description> (string) B<Defaulted> - The initial description for
|
||||
this bug. Some Bugzilla installations require this to not be blank.
|
||||
|
||||
=item C<op_sys> (string) B<Defaulted> - The operating system the bug was
|
||||
discovered on.
|
||||
|
||||
=item C<platform> (string) B<Defaulted> - What type of hardware the bug was
|
||||
experienced on.
|
||||
|
||||
=item C<priority> (string) B<Defaulted> - What order the bug will be fixed
|
||||
in by the developer, compared to the developer's other bugs.
|
||||
|
||||
=item C<severity> (string) B<Defaulted> - How severe the bug is.
|
||||
|
||||
=item C<alias> (string) - A brief alias for the bug that can be used
|
||||
instead of a bug number when accessing this bug. Must be unique in
|
||||
all of this Bugzilla.
|
||||
|
||||
=item C<assigned_to> (username) - A user to assign this bug to, if you
|
||||
don't want it to be assigned to the component owner.
|
||||
|
||||
=item C<cc> (array) - An array of usernames to CC on this bug.
|
||||
|
||||
=item C<qa_contact> (username) - If this installation has QA Contacts
|
||||
enabled, you can set the QA Contact here if you don't want to use
|
||||
the component's default QA Contact.
|
||||
|
||||
=item C<status> (string) - The status that this bug should start out as.
|
||||
Note that only certain statuses can be set on bug creation.
|
||||
|
||||
=item C<target_milestone> (string) - A valid target milestone for this
|
||||
product.
|
||||
|
||||
=back
|
||||
|
||||
In addition to the above parameters, if your installation has any custom
|
||||
fields, you can set them just by passing in the name of the field and
|
||||
its value as a string.
|
||||
|
||||
=item B<Returns>
|
||||
|
||||
A hash with one element, C<id>. This is the id of the newly-filed bug.
|
||||
|
||||
=item B<Errors>
|
||||
|
||||
=over
|
||||
|
||||
=item 103 (Invalid Alias)
|
||||
|
||||
The alias you specified is invalid for some reason. See the error message
|
||||
for more details.
|
||||
|
||||
=item 104 (Invalid Field)
|
||||
|
||||
One of the drop-down fields has an invalid value. The error message will
|
||||
have more detail.
|
||||
|
||||
=item 105 (Invalid Component)
|
||||
|
||||
Either you didn't specify a component, or the component you specified was
|
||||
invalid.
|
||||
|
||||
=item 106 (Invalid Product)
|
||||
|
||||
Either you didn't specify a product, this product doesn't exist, or
|
||||
you don't have permission to enter bugs in this product.
|
||||
|
||||
=item 107 (Invalid Summary)
|
||||
|
||||
You didn't specify a summary for the bug.
|
||||
|
||||
=item 504 (Invalid User)
|
||||
|
||||
Either the QA Contact, Assignee, or CC lists have some invalid user
|
||||
in them. The error message will have more details.
|
||||
|
||||
=back
|
||||
|
||||
=back
|
||||
|
||||
|
||||
=back
|
||||
|
||||
@@ -52,6 +52,24 @@ use constant WS_ERROR_CODE => {
|
||||
invalid_bug_id_or_alias => 100,
|
||||
invalid_bug_id_non_existent => 101,
|
||||
bug_access_denied => 102,
|
||||
# These all mean "invalid alias"
|
||||
alias_not_defined => 103,
|
||||
alias_too_long => 103,
|
||||
alias_in_use => 103,
|
||||
alias_is_numeric => 103,
|
||||
alias_has_comma_or_space => 103,
|
||||
# Misc. bug field errors
|
||||
illegal_field => 104,
|
||||
# Component errors
|
||||
require_component => 105,
|
||||
component_name_too_long => 105,
|
||||
component_not_valid => 105,
|
||||
# Invalid Product
|
||||
no_products => 106,
|
||||
entry_access_denied => 106,
|
||||
product_disabled => 106,
|
||||
# Invalid Summary
|
||||
require_summary => 107,
|
||||
|
||||
# Authentication errors are usually 300-400.
|
||||
invalid_username_or_password => 300,
|
||||
@@ -64,6 +82,10 @@ use constant WS_ERROR_CODE => {
|
||||
illegal_email_address => 501,
|
||||
password_too_short => 502,
|
||||
password_too_long => 503,
|
||||
invalid_username => 504,
|
||||
# This is from strict_isolation, but it also basically means
|
||||
# "invalid user."
|
||||
invalid_user_group => 504,
|
||||
};
|
||||
|
||||
# These are the fallback defaults for errors not in ERROR_CODE.
|
||||
|
||||
Reference in New Issue
Block a user