diff options
-rw-r--r-- | Bugzilla/Bug.pm | 125 |
1 files changed, 73 insertions, 52 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm index 008155800..8705d3805 100644 --- a/Bugzilla/Bug.pm +++ b/Bugzilla/Bug.pm @@ -128,19 +128,34 @@ sub VALIDATORS { my $validators = { alias => \&_check_alias, + assigned_to => \&_check_assigned_to, bug_file_loc => \&_check_bug_file_loc, bug_severity => \&_check_select_field, + bug_status => \&_check_bug_status, + cc => \&_check_cc, comment => \&_check_comment, commentprivacy => \&_check_commentprivacy, + component => \&_check_component, deadline => \&_check_deadline, + dup_id => \&_check_dup_id, estimated_time => \&_check_estimated_time, + everconfirmed => \&Bugzilla::Object::check_boolean, + groups => \&_check_groups, + keywords => \&_check_keywords, op_sys => \&_check_select_field, priority => \&_check_priority, product => \&_check_product, + qa_contact => \&_check_qa_contact, remaining_time => \&_check_remaining_time, rep_platform => \&_check_select_field, + resolution => \&_check_resolution, short_desc => \&_check_short_desc, status_whiteboard => \&_check_status_whiteboard, + target_milestone => \&_check_target_milestone, + version => \&_check_version, + + cclist_accessible => \&Bugzilla::Object::check_boolean, + reporter_accessible => \&Bugzilla::Object::check_boolean, }; # Set up validators for custom fields. @@ -170,17 +185,30 @@ sub VALIDATORS { return $validators; }; -use constant UPDATE_VALIDATORS => { - assigned_to => \&_check_assigned_to, - bug_status => \&_check_bug_status, - cclist_accessible => \&Bugzilla::Object::check_boolean, - dup_id => \&_check_dup_id, - everconfirmed => \&Bugzilla::Object::check_boolean, - qa_contact => \&_check_qa_contact, - reporter_accessible => \&Bugzilla::Object::check_boolean, - resolution => \&_check_resolution, - target_milestone => \&_check_target_milestone, - version => \&_check_version, +sub VALIDATOR_DEPENDENCIES { + my $cache = Bugzilla->request_cache; + return $cache->{bug_validator_dependencies} + if $cache->{bug_validator_dependencies}; + + my %deps = ( + assigned_to => ['component'], + bug_status => ['product', 'comment'], + cc => ['component'], + component => ['product'], + groups => ['product'], + keywords => ['product'], + qa_contact => ['component'], + target_milestone => ['product'], + version => ['product'], + ); + + my @custom_deps = Bugzilla->get_fields( + { visibility_field_id => NOT_NULL }); + foreach my $field (@custom_deps) { + $deps{$field->name} = [$field->visibility_field->name]; + } + $cache->{bug_validator_dependencies} = \%deps; + return \%deps; }; sub UPDATE_COLUMNS { @@ -581,32 +609,10 @@ sub run_create_validators { my $class = shift; my $params = $class->SUPER::run_create_validators(@_); - my $product = $params->{product}; + my $product = delete $params->{product}; $params->{product_id} = $product->id; - delete $params->{product}; - - ($params->{bug_status}, $params->{everconfirmed}) - = $class->_check_bug_status($params->{bug_status}, $product, - $params->{comment}); - - $params->{target_milestone} = $class->_check_target_milestone( - $params->{target_milestone}, $product); - - $params->{version} = $class->_check_version($params->{version}, $product); - - $params->{keywords} = $class->_check_keywords($params->{keywords}, $product); - - $params->{groups} = $class->_check_groups($params->{groups}, $product); - - my $component = $class->_check_component($params->{component}, $product); + my $component = delete $params->{component}; $params->{component_id} = $component->id; - delete $params->{component}; - - $params->{assigned_to} = - $class->_check_assigned_to($params->{assigned_to}, $component); - $params->{qa_contact} = - $class->_check_qa_contact($params->{qa_contact}, $component); - $params->{cc} = $class->_check_cc($component, $params->{cc}); # Callers cannot set reporter, creation_ts, or delta_ts. $params->{reporter} = $class->_check_reporter(); @@ -1042,8 +1048,10 @@ sub _check_alias { } sub _check_assigned_to { - my ($invocant, $assignee, $component) = @_; + my ($invocant, $assignee, undef, $params) = @_; my $user = Bugzilla->user; + my $component = blessed($invocant) ? $invocant->component_obj + : $params->{component}; # Default assignee is the component owner. my $id; @@ -1081,11 +1089,12 @@ sub _check_bug_file_loc { } sub _check_bug_status { - my ($invocant, $new_status, $product, $comment) = @_; + my ($invocant, $new_status, undef, $params) = @_; my $user = Bugzilla->user; my @valid_statuses; my $old_status; # Note that this is undef for new bugs. + my ($product, $comment); if (ref $invocant) { @valid_statuses = @{$invocant->statuses_available}; $product = $invocant->product_obj; @@ -1094,6 +1103,8 @@ sub _check_bug_status { $comment = $comments->[-1]; } else { + $product = $params->{product}; + $comment = $params->{comment}; @valid_statuses = @{Bugzilla::Status->can_change_to()}; if (!$product->allows_unconfirmed) { @valid_statuses = grep {$_->name ne 'UNCONFIRMED'} @valid_statuses; @@ -1158,12 +1169,17 @@ sub _check_bug_status { ThrowUserError("milestone_required", { bug => $invocant }); } - return $new_status->name if ref $invocant; - return ($new_status->name, $new_status->name eq 'UNCONFIRMED' ? 0 : 1); + if (!blessed $invocant) { + $params->{everconfirmed} = $new_status->name eq 'UNCONFIRMED' ? 0 : 1; + } + + return $new_status->name; } sub _check_cc { - my ($invocant, $component, $ccs) = @_; + my ($invocant, $ccs, undef, $params) = @_; + my $component = blessed($invocant) ? $invocant->component_obj + : $params->{component}; return [map {$_->id} @{$component->initial_cc}] unless $ccs; # Allow comma-separated input as well as arrayrefs. @@ -1213,10 +1229,11 @@ sub _check_comment_type { } sub _check_component { - my ($invocant, $name, $product) = @_; + my ($invocant, $name, undef, $params) = @_; $name = trim($name); $name || ThrowUserError("require_component"); - ($product = $invocant->product_obj) if ref $invocant; + my $product = blessed($invocant) ? $invocant->product_obj + : $params->{product}; my $obj = Bugzilla::Component->check({ product => $product, name => $name }); return $obj; } @@ -1391,8 +1408,9 @@ sub _check_estimated_time { } sub _check_groups { - my ($invocant, $group_names, $product) = @_; - + my ($invocant, $group_names, undef, $params) = @_; + my $product = blessed($invocant) ? $invocant->product_obj + : $params->{product}; my %add_groups; # In email or WebServices, when the "groups" item actually @@ -1427,12 +1445,13 @@ sub _check_groups { } sub _check_keywords { - my ($invocant, $keyword_string, $product) = @_; + my ($invocant, $keyword_string, undef, $params) = @_; $keyword_string = trim($keyword_string); return [] if !$keyword_string; # On creation, only editbugs users can set keywords. if (!ref $invocant) { + my $product = $params->{product}; return [] if !Bugzilla->user->in_group('editbugs', $product->id); } @@ -1471,9 +1490,10 @@ sub _check_priority { } sub _check_qa_contact { - my ($invocant, $qa_contact, $component) = @_; + my ($invocant, $qa_contact, undef, $params) = @_; $qa_contact = trim($qa_contact) if !ref $qa_contact; - + my $component = blessed($invocant) ? $invocant->component_obj + : $params->{component}; my $id; if (!ref $invocant) { # Bugs get no QA Contact on creation if useqacontact is off. @@ -1650,9 +1670,9 @@ sub _check_strict_isolation_for_user { } sub _check_target_milestone { - my ($invocant, $target, $product) = @_; - $product = $invocant->product_obj if ref $invocant; - + my ($invocant, $target, undef, $params) = @_; + my $product = blessed($invocant) ? $invocant->product_obj + : $params->{product}; $target = trim($target); $target = $product->default_milestone if !defined $target; my $object = Bugzilla::Milestone->check( @@ -1675,9 +1695,10 @@ sub _check_time { } sub _check_version { - my ($invocant, $version, $product) = @_; + my ($invocant, $version, undef, $params) = @_; $version = trim($version); - ($product = $invocant->product_obj) if ref $invocant; + my $product = blessed($invocant) ? $invocant->product_obj + : $params->{product}; my $object = Bugzilla::Version->check({ product => $product, name => $version }); return $object->name; |