Commit 38e12dd8 authored by Matt Tyson's avatar Matt Tyson Committed by Gervase Markham

'Bug 1159057: change to create flags as part of bug creation process. r=gerv

parent 513b4458
...@@ -820,7 +820,7 @@ sub update { ...@@ -820,7 +820,7 @@ sub update {
foreach my $bug (@bugs) { foreach my $bug (@bugs) {
$bug->set_all(\%values); $bug->set_all(\%values);
if ($flags) { if ($flags) {
my ($old_flags, $new_flags) = extract_flags($flags, $bug); my ($old_flags, $new_flags) = extract_flags($flags, $bug->flag_types, $bug->flags);
$bug->set_flags($old_flags, $new_flags); $bug->set_flags($old_flags, $new_flags);
} }
} }
...@@ -885,19 +885,29 @@ sub create { ...@@ -885,19 +885,29 @@ sub create {
my $flags = delete $params->{flags}; my $flags = delete $params->{flags};
if ($flags) {
my $product = Bugzilla::Product->check($params->{product});
my $component = Bugzilla::Component->check({
product => $product,
name => $params->{component}
});
my $flag_types = Bugzilla::FlagType::match({
product_id => $product->id,
component_id => $component->id,
is_active => 1,
});
my(undef, $new_flags) = extract_flags($flags, $flag_types);
$params->{flags} = $new_flags;
}
# We start a nested transaction in case flag setting fails # We start a nested transaction in case flag setting fails
# we want the bug creation to roll back as well. # we want the bug creation to roll back as well.
$dbh->bz_start_transaction(); $dbh->bz_start_transaction();
my $bug = Bugzilla::Bug->create($params); my $bug = Bugzilla::Bug->create($params);
# Set bug flags
if ($flags) {
my ($flags, $new_flags) = extract_flags($flags, $bug);
$bug->set_flags($flags, $new_flags);
$bug->update($bug->creation_ts);
}
$dbh->bz_commit_transaction(); $dbh->bz_commit_transaction();
$bug->send_changes(); $bug->send_changes();
...@@ -989,7 +999,7 @@ sub add_attachment { ...@@ -989,7 +999,7 @@ sub add_attachment {
}); });
if ($flags) { if ($flags) {
my ($old_flags, $new_flags) = extract_flags($flags, $bug, $attachment); my ($old_flags, $new_flags) = extract_flags($flags, $attachment->flag_types, $attachment->flags);
$attachment->set_flags($old_flags, $new_flags); $attachment->set_flags($old_flags, $new_flags);
} }
...@@ -1066,7 +1076,7 @@ sub update_attachment { ...@@ -1066,7 +1076,7 @@ sub update_attachment {
# Update the values # Update the values
foreach my $attachment (@attachments) { foreach my $attachment (@attachments) {
my ($update_flags, $new_flags) = $flags my ($update_flags, $new_flags) = $flags
? extract_flags($flags, $attachment->bug, $attachment) ? extract_flags($flags, $attachment->flag_types, $attachment->flags)
: ([], []); : ([], []);
if ($attachment->validate_can_edit) { if ($attachment->validate_can_edit) {
$attachment->set_all($params); $attachment->set_all($params);
......
...@@ -51,11 +51,10 @@ our @EXPORT = qw( ...@@ -51,11 +51,10 @@ our @EXPORT = qw(
); );
sub extract_flags { sub extract_flags {
my ($flags, $bug, $attachment) = @_; my ($flags, $flag_types, $current_flags) = @_;
my (@new_flags, @old_flags); my (@new_flags, @old_flags);
my $flag_types = $attachment ? $attachment->flag_types : $bug->flag_types; $current_flags //= [];
my $current_flags = $attachment ? $attachment->flags : $bug->flags;
# Copy the user provided $flags as we may call extract_flags more than # Copy the user provided $flags as we may call extract_flags more than
# once when editing multiple bugs or attachments. # once when editing multiple bugs or attachments.
......
...@@ -689,6 +689,7 @@ sub possible_duplicates { ...@@ -689,6 +689,7 @@ sub possible_duplicates {
# user is not a member of the timetrackinggroup. # user is not a member of the timetrackinggroup.
# C<deadline> - For time-tracking. Will be ignored for the same # C<deadline> - For time-tracking. Will be ignored for the same
# reasons as C<estimated_time>. # reasons as C<estimated_time>.
# C<flags> - An array of flags that will be applied to the bug.
sub create { sub create {
my ($class, $params) = @_; my ($class, $params) = @_;
my $dbh = Bugzilla->dbh; my $dbh = Bugzilla->dbh;
...@@ -724,6 +725,7 @@ sub create { ...@@ -724,6 +725,7 @@ sub create {
my $is_markdown = delete $params->{is_markdown}; my $is_markdown = delete $params->{is_markdown};
my $see_also = delete $params->{see_also}; my $see_also = delete $params->{see_also};
my $comment_tags = delete $params->{comment_tags}; my $comment_tags = delete $params->{comment_tags};
my $flags = delete $params->{flags};
# We don't want the bug to appear in the system until it's correctly # We don't want the bug to appear in the system until it's correctly
# protected by groups. # protected by groups.
...@@ -806,6 +808,14 @@ sub create { ...@@ -806,6 +808,14 @@ sub create {
delete $bug->{_update_ref_bugs}; delete $bug->{_update_ref_bugs};
} }
# Apply any flags.
if (defined $flags) {
$bug->set_flags($flags);
foreach my $flag (@{$bug->flags}) {
Bugzilla::Flag->create($flag);
}
}
# Comment #0 handling... # Comment #0 handling...
# We now have a bug id so we can fill this out # We now have a bug id so we can fill this out
......
...@@ -795,19 +795,41 @@ sub _check_status { ...@@ -795,19 +795,41 @@ sub _check_status {
=over =over
=item C<extract_flags_from_cgi($bug, $attachment, $hr_vars)> =item C<extract_flags_from_cgi($bug, $hr_vars, $skip, $args)>
Checks whether or not there are new flags to create and returns an Checks if are new flags to create and returns an array of hashes.
array of hashes. This array is then passed to Flag::create(). This array is then passed to Flag::create().
$args is a hash that can be one of two things.
It can contain a bug object, and optionally an attachment object.
OR
It can contain both a product_id AND a component id.
=back =back
=cut =cut
sub extract_flags_from_cgi { sub extract_flags_from_cgi {
my ($class, $bug, $attachment, $vars, $skip) = @_; my ($class, $vars, $skip, $args) = @_;
my $cgi = Bugzilla->cgi; my $cgi = Bugzilla->cgi;
my ($bug, $attachment, $component_id, $product_id);
if (defined($args->{bug})) {
$bug = $args->{bug};
$component_id = $bug->component_id;
$product_id = $bug->product_id;
$attachment = $args->{attachment} if defined $args->{attachment};
}
elsif (defined($args->{product_id})) {
$product_id = $args->{product_id};
$component_id = $args->{component_id};
}
my $match_status = Bugzilla::User::match_field({ my $match_status = Bugzilla::User::match_field({
'^requestee(_type)?-(\d+)$' => { 'type' => 'multi' }, '^requestee(_type)?-(\d+)$' => { 'type' => 'multi' },
}, undef, $skip); }, undef, $skip);
...@@ -873,8 +895,8 @@ sub extract_flags_from_cgi { ...@@ -873,8 +895,8 @@ sub extract_flags_from_cgi {
# Get a list of active flag types available for this product/component. # Get a list of active flag types available for this product/component.
my $flag_types = Bugzilla::FlagType::match( my $flag_types = Bugzilla::FlagType::match(
{ 'product_id' => $bug->{'product_id'}, { 'product_id' => $product_id,
'component_id' => $bug->{'component_id'}, 'component_id' => $component_id,
'is_active' => 1 }); 'is_active' => 1 });
foreach my $flagtype_id (@flagtype_ids) { foreach my $flagtype_id (@flagtype_ids) {
...@@ -895,9 +917,12 @@ sub extract_flags_from_cgi { ...@@ -895,9 +917,12 @@ sub extract_flags_from_cgi {
# We are only interested in flags the user tries to create. # We are only interested in flags the user tries to create.
next unless scalar(grep { $_ == $type_id } @flagtype_ids); next unless scalar(grep { $_ == $type_id } @flagtype_ids);
# If $bug is not defined, then we are creating a flag for an as
# yet uncreated bug.
if (defined $bug) {
# Get the number of flags of this type already set for this target. # Get the number of flags of this type already set for this target.
my $has_flags = $class->count( my $has_flags = $class->count({
{ 'type_id' => $type_id, 'type_id' => $type_id,
'target_type' => $attachment ? 'attachment' : 'bug', 'target_type' => $attachment ? 'attachment' : 'bug',
'bug_id' => $bug->bug_id, 'bug_id' => $bug->bug_id,
'attach_id' => $attachment ? $attachment->id : undef }); 'attach_id' => $attachment ? $attachment->id : undef });
...@@ -905,6 +930,7 @@ sub extract_flags_from_cgi { ...@@ -905,6 +930,7 @@ sub extract_flags_from_cgi {
# Do not create a new flag of this type if this flag type is # Do not create a new flag of this type if this flag type is
# not multiplicable and already has a flag set. # not multiplicable and already has a flag set.
next if (!$flag_type->is_multiplicable && $has_flags); next if (!$flag_type->is_multiplicable && $has_flags);
}
my $status = $cgi->param("flag_type-$type_id"); my $status = $cgi->param("flag_type-$type_id");
trick_taint($status); trick_taint($status);
......
...@@ -681,7 +681,7 @@ sub update { ...@@ -681,7 +681,7 @@ sub update {
foreach my $bug (@bugs) { foreach my $bug (@bugs) {
$bug->set_all(\%values); $bug->set_all(\%values);
if ($flags) { if ($flags) {
my ($old_flags, $new_flags) = extract_flags($flags, $bug); my ($old_flags, $new_flags) = extract_flags($flags, $bug->flag_types, $bug->flags);
$bug->set_flags($old_flags, $new_flags); $bug->set_flags($old_flags, $new_flags);
} }
} }
...@@ -747,6 +747,23 @@ sub create { ...@@ -747,6 +747,23 @@ sub create {
$params = Bugzilla::Bug::map_fields($params); $params = Bugzilla::Bug::map_fields($params);
my $flags = delete $params->{flags}; my $flags = delete $params->{flags};
# Set bug flags
if ($flags) {
my $product = Bugzilla::Product->check($params->{product});
my $component = Bugzilla::Component->check({
product => $product,
name => $params->{component}
});
my $flag_types = Bugzilla::FlagType::match({
product_id => $product->id,
component_id => $component->id,
is_active => 1,
});
my(undef, $new_flags) = extract_flags($flags, $flag_types);
$params->{flags} = $new_flags;
}
# We start a nested transaction in case flag setting fails # We start a nested transaction in case flag setting fails
# we want the bug creation to roll back as well. # we want the bug creation to roll back as well.
...@@ -754,13 +771,6 @@ sub create { ...@@ -754,13 +771,6 @@ sub create {
my $bug = Bugzilla::Bug->create($params); my $bug = Bugzilla::Bug->create($params);
# Set bug flags
if ($flags) {
my ($flags, $new_flags) = extract_flags($flags, $bug);
$bug->set_flags($flags, $new_flags);
$bug->update($bug->creation_ts);
}
$dbh->bz_commit_transaction(); $dbh->bz_commit_transaction();
$bug->send_changes(); $bug->send_changes();
...@@ -853,7 +863,10 @@ sub add_attachment { ...@@ -853,7 +863,10 @@ sub add_attachment {
}); });
if ($flags) { if ($flags) {
my ($old_flags, $new_flags) = extract_flags($flags, $bug, $attachment); my ($old_flags, $new_flags) = extract_flags($flags,
$attachment->flag_types,
$attachment->flags);
$attachment->set_flags($old_flags, $new_flags); $attachment->set_flags($old_flags, $new_flags);
} }
...@@ -938,7 +951,7 @@ sub update_attachment { ...@@ -938,7 +951,7 @@ sub update_attachment {
# Update the values # Update the values
foreach my $attachment (@attachments) { foreach my $attachment (@attachments) {
my ($update_flags, $new_flags) = $flags my ($update_flags, $new_flags) = $flags
? extract_flags($flags, $attachment->bug, $attachment) ? extract_flags($flags, $attachment->flag_types, $attachment->flags)
: ([], []); : ([], []);
if ($attachment->validate_can_edit) { if ($attachment->validate_can_edit) {
$attachment->set_all($params); $attachment->set_all($params);
......
...@@ -37,11 +37,10 @@ our @EXPORT_OK = qw( ...@@ -37,11 +37,10 @@ our @EXPORT_OK = qw(
); );
sub extract_flags { sub extract_flags {
my ($flags, $bug, $attachment) = @_; my ($flags, $flag_types, $current_flags) = @_;
my (@new_flags, @old_flags); my (@new_flags, @old_flags);
my $flag_types = $attachment ? $attachment->flag_types : $bug->flag_types; $current_flags //= [];
my $current_flags = $attachment ? $attachment->flags : $bug->flags;
# Copy the user provided $flags as we may call extract_flags more than # Copy the user provided $flags as we may call extract_flags more than
# once when editing multiple bugs or attachments. # once when editing multiple bugs or attachments.
......
...@@ -542,7 +542,8 @@ sub insert { ...@@ -542,7 +542,8 @@ sub insert {
} }
my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi( my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
$bug, $attachment, $vars, SKIP_REQUESTEE_ON_ERROR); $vars, SKIP_REQUESTEE_ON_ERROR,
{ bug => $bug, attachment => $attachment });
$attachment->set_flags($flags, $new_flags); $attachment->set_flags($flags, $new_flags);
# Insert a comment about the new attachment into the database. # Insert a comment about the new attachment into the database.
...@@ -700,7 +701,7 @@ sub update { ...@@ -700,7 +701,7 @@ sub update {
$bug->add_cc($user) if $cgi->param('addselfcc'); $bug->add_cc($user) if $cgi->param('addselfcc');
my ($flags, $new_flags) = my ($flags, $new_flags) =
Bugzilla::Flag->extract_flags_from_cgi($bug, $attachment, $vars); Bugzilla::Flag->extract_flags_from_cgi($vars, undef, { bug => $bug, attachment => $attachment });
if ($can_edit) { if ($can_edit) {
$attachment->set_flags($flags, $new_flags); $attachment->set_flags($flags, $new_flags);
......
...@@ -125,6 +125,18 @@ foreach my $field (@multi_selects) { ...@@ -125,6 +125,18 @@ foreach my $field (@multi_selects) {
$bug_params{$field->name} = [$cgi->param($field->name)]; $bug_params{$field->name} = [$cgi->param($field->name)];
} }
my $product = Bugzilla::Product->check($bug_params{'product'});
my $component_id = Bugzilla::Component->check({
product => $product,
name => $bug_params{'component'}})->id;
# Set bug flags.
my (undef, $flag_data) = Bugzilla::Flag->extract_flags_from_cgi($vars, SKIP_REQUESTEE_ON_ERROR,{
product_id => $product->id,
component_id => $component_id });
$bug_params{flags} = $flag_data;
my $bug = Bugzilla::Bug->create(\%bug_params); my $bug = Bugzilla::Bug->create(\%bug_params);
# Get the bug ID back and delete the token used to create this bug. # Get the bug ID back and delete the token used to create this bug.
...@@ -180,7 +192,8 @@ if ($data_fh || $attach_text) { ...@@ -180,7 +192,8 @@ if ($data_fh || $attach_text) {
if ($attachment) { if ($attachment) {
# Set attachment flags. # Set attachment flags.
my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi( my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
$bug, $attachment, $vars, SKIP_REQUESTEE_ON_ERROR); $vars, SKIP_REQUESTEE_ON_ERROR,
{ bug => $bug, attachment => $attachment });
$attachment->set_flags($flags, $new_flags); $attachment->set_flags($flags, $new_flags);
$attachment->update($timestamp); $attachment->update($timestamp);
my $comment = $bug->comments->[0]; my $comment = $bug->comments->[0];
...@@ -193,11 +206,6 @@ if ($data_fh || $attach_text) { ...@@ -193,11 +206,6 @@ if ($data_fh || $attach_text) {
} }
} }
# Set bug flags.
my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi($bug, undef, $vars,
SKIP_REQUESTEE_ON_ERROR);
$bug->set_flags($flags, $new_flags);
$bug->update($timestamp);
$vars->{'id'} = $id; $vars->{'id'} = $id;
$vars->{'bug'} = $bug; $vars->{'bug'} = $bug;
......
...@@ -347,7 +347,7 @@ if (defined $cgi->param('id')) { ...@@ -347,7 +347,7 @@ if (defined $cgi->param('id')) {
# product/component. The structure of flags code doesn't currently # product/component. The structure of flags code doesn't currently
# allow them to be set using set_all. # allow them to be set using set_all.
my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi( my ($flags, $new_flags) = Bugzilla::Flag->extract_flags_from_cgi(
$first_bug, undef, $vars); $vars, undef, { bug => $first_bug } );
$first_bug->set_flags($flags, $new_flags); $first_bug->set_flags($flags, $new_flags);
# Tags can only be set to one bug at once. # Tags can only be set to one bug at once.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment