Commit a476a7bf authored by Max Kanat-Alexander's avatar Max Kanat-Alexander

Bug 567296: Make Bugzilla::Bug use VALIDATOR_DEPENDENCIES instead of

UPDATE_VALIDATORS r=dkl, a=mkanat
parent 0ac4d26f
......@@ -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;
......
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