зеркало из https://github.com/mozilla/pjs.git
Bug 385849: Make Bugzilla::Bug do updating for op_sys, rep_platform, and other product-inspecific fields
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit
This commit is contained in:
Родитель
6fc2f433d2
Коммит
7104b67ac2
|
@ -149,8 +149,15 @@ use constant UPDATE_VALIDATORS => {
|
||||||
|
|
||||||
use constant UPDATE_COLUMNS => qw(
|
use constant UPDATE_COLUMNS => qw(
|
||||||
everconfirmed
|
everconfirmed
|
||||||
|
bug_file_loc
|
||||||
|
bug_severity
|
||||||
bug_status
|
bug_status
|
||||||
|
op_sys
|
||||||
|
priority
|
||||||
|
rep_platform
|
||||||
resolution
|
resolution
|
||||||
|
short_desc
|
||||||
|
status_whiteboard
|
||||||
);
|
);
|
||||||
|
|
||||||
# This is used by add_comment to know what we validate before putting in
|
# This is used by add_comment to know what we validate before putting in
|
||||||
|
@ -1145,6 +1152,19 @@ sub fields {
|
||||||
# Mutators
|
# Mutators
|
||||||
#####################################################################
|
#####################################################################
|
||||||
|
|
||||||
|
# To run check_can_change_field.
|
||||||
|
sub _set_global_validator {
|
||||||
|
my ($self, $value, $field) = @_;
|
||||||
|
my $current_value = $self->$field;
|
||||||
|
my $privs;
|
||||||
|
$self->check_can_change_field($field, $current_value, $value, \$privs)
|
||||||
|
|| ThrowUserError('illegal_change', { field => $field,
|
||||||
|
oldvalue => $current_value,
|
||||||
|
newvalue => $value,
|
||||||
|
privs => $privs });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#################
|
#################
|
||||||
# "Set" Methods #
|
# "Set" Methods #
|
||||||
#################
|
#################
|
||||||
|
@ -1160,13 +1180,20 @@ sub set_dependencies {
|
||||||
$self->{'blocked'} = $blocked;
|
$self->{'blocked'} = $blocked;
|
||||||
}
|
}
|
||||||
sub _set_everconfirmed { $_[0]->set('everconfirmed', $_[1]); }
|
sub _set_everconfirmed { $_[0]->set('everconfirmed', $_[1]); }
|
||||||
|
sub set_op_sys { $_[0]->set('op_sys', $_[1]); }
|
||||||
|
sub set_platform { $_[0]->set('rep_platform', $_[1]); }
|
||||||
|
sub set_priority { $_[0]->set('priority', $_[1]); }
|
||||||
sub set_resolution { $_[0]->set('resolution', $_[1]); }
|
sub set_resolution { $_[0]->set('resolution', $_[1]); }
|
||||||
|
sub set_severity { $_[0]->set('bug_severity', $_[1]); }
|
||||||
sub set_status {
|
sub set_status {
|
||||||
my ($self, $status) = @_;
|
my ($self, $status) = @_;
|
||||||
$self->set('bug_status', $status);
|
$self->set('bug_status', $status);
|
||||||
# Check for the everconfirmed transition
|
# Check for the everconfirmed transition
|
||||||
$self->_set_everconfirmed(1) if (is_open_state($status) && $status ne 'UNCONFIRMED');
|
$self->_set_everconfirmed(1) if (is_open_state($status) && $status ne 'UNCONFIRMED');
|
||||||
}
|
}
|
||||||
|
sub set_status_whiteboard { $_[0]->set('status_whiteboard', $_[1]); }
|
||||||
|
sub set_summary { $_[0]->set('short_desc', $_[1]); }
|
||||||
|
sub set_url { $_[0]->set('bug_file_loc', $_[1]); }
|
||||||
|
|
||||||
########################
|
########################
|
||||||
# "Add/Remove" Methods #
|
# "Add/Remove" Methods #
|
||||||
|
|
|
@ -196,6 +196,10 @@ sub set {
|
||||||
if (exists $validators{$field}) {
|
if (exists $validators{$field}) {
|
||||||
my $validator = $validators{$field};
|
my $validator = $validators{$field};
|
||||||
$value = $self->$validator($value, $field);
|
$value = $self->$validator($value, $field);
|
||||||
|
|
||||||
|
if ($self->can('_set_global_validator')) {
|
||||||
|
$self->_set_global_validator($value, $field);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->{$field} = $value;
|
$self->{$field} = $value;
|
||||||
|
@ -650,6 +654,12 @@ if it exists. Subclasses should use this function
|
||||||
to implement the various C<set_> mutators for their different
|
to implement the various C<set_> mutators for their different
|
||||||
fields.
|
fields.
|
||||||
|
|
||||||
|
If your class defines a method called C<_set_global_validator>,
|
||||||
|
C<set> will call it with C<($value, $field)> as arguments, after running
|
||||||
|
the validator for this particular field. C<_set_global_validator> does not
|
||||||
|
return anything.
|
||||||
|
|
||||||
|
|
||||||
See L</VALIDATORS> for more information.
|
See L</VALIDATORS> for more information.
|
||||||
|
|
||||||
=item B<Params>
|
=item B<Params>
|
||||||
|
|
|
@ -446,18 +446,29 @@ if (defined $cgi->param('id')) {
|
||||||
scalar $cgi->param('version')));
|
scalar $cgi->param('version')));
|
||||||
$cgi->param('target_milestone', $bug->_check_target_milestone($prod,
|
$cgi->param('target_milestone', $bug->_check_target_milestone($prod,
|
||||||
scalar $cgi->param('target_milestone')));
|
scalar $cgi->param('target_milestone')));
|
||||||
$cgi->param('rep_platform',
|
}
|
||||||
$bug->_check_rep_platform($cgi->param('rep_platform')));
|
|
||||||
$cgi->param('op_sys',
|
my %methods = (
|
||||||
$bug->_check_op_sys($cgi->param('op_sys')));
|
bug_severity => 'set_severity',
|
||||||
$cgi->param('priority',
|
rep_platform => 'set_platform',
|
||||||
$bug->_check_priority($cgi->param('priority')));
|
short_desc => 'set_summary',
|
||||||
$cgi->param('bug_severity',
|
bug_file_loc => 'set_url',
|
||||||
$bug->_check_bug_severity($cgi->param('bug_severity')));
|
);
|
||||||
$cgi->param('bug_file_loc',
|
foreach my $b (@bug_objects) {
|
||||||
$bug->_check_bug_file_loc($cgi->param('bug_file_loc')));
|
foreach my $field_name (qw(op_sys rep_platform priority bug_severity
|
||||||
$cgi->param('short_desc',
|
bug_file_loc status_whiteboard short_desc))
|
||||||
$bug->_check_short_desc($cgi->param('short_desc')));
|
{
|
||||||
|
# We only update the field if it's defined and it's not set
|
||||||
|
# to dontchange.
|
||||||
|
if ( defined $cgi->param($field_name)
|
||||||
|
&& (!$cgi->param('dontchange')
|
||||||
|
|| $cgi->param($field_name) ne $cgi->param('dontchange')) )
|
||||||
|
{
|
||||||
|
my $method = $methods{$field_name};
|
||||||
|
$method ||= "set_" . $field_name;
|
||||||
|
$b->$method($cgi->param($field_name));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my $action = trim($cgi->param('action') || '');
|
my $action = trim($cgi->param('action') || '');
|
||||||
|
@ -559,9 +570,7 @@ sub DoComma {
|
||||||
$::comma = ",";
|
$::comma = ",";
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach my $field ("rep_platform", "priority", "bug_severity",
|
foreach my $field ("version", "target_milestone") {
|
||||||
"bug_file_loc", "short_desc", "version", "op_sys",
|
|
||||||
"target_milestone", "status_whiteboard") {
|
|
||||||
if (defined $cgi->param($field)) {
|
if (defined $cgi->param($field)) {
|
||||||
if (!$cgi->param('dontchange')
|
if (!$cgi->param('dontchange')
|
||||||
|| $cgi->param($field) ne $cgi->param('dontchange')) {
|
|| $cgi->param($field) ne $cgi->param('dontchange')) {
|
||||||
|
@ -1192,37 +1201,34 @@ foreach my $id (@idlist) {
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
|
||||||
# Start updating the relevant database entries
|
|
||||||
#
|
|
||||||
|
|
||||||
$timestamp = $dbh->selectrow_array(q{SELECT NOW()});
|
|
||||||
|
|
||||||
my $work_time;
|
my $work_time;
|
||||||
if (Bugzilla->user->in_group(Bugzilla->params->{'timetrackinggroup'})) {
|
if (Bugzilla->user->in_group(Bugzilla->params->{'timetrackinggroup'})) {
|
||||||
$work_time = $cgi->param('work_time');
|
$work_time = $cgi->param('work_time');
|
||||||
if ($work_time) {
|
|
||||||
# add_comment (called below) can in theory raise an error,
|
|
||||||
# but because we've already validated work_time here it's
|
|
||||||
# safe to log the entry before adding the comment.
|
|
||||||
LogActivityEntry($id, "work_time", "", $work_time,
|
|
||||||
$whoid, $timestamp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($cgi->param('comment') || $work_time || $duplicate) {
|
if ($cgi->param('comment') || $work_time || $duplicate) {
|
||||||
my $type = $duplicate ? CMT_DUPE_OF : CMT_NORMAL;
|
my $type = $duplicate ? CMT_DUPE_OF : CMT_NORMAL;
|
||||||
|
|
||||||
$old_bug_obj->add_comment(scalar($cgi->param('comment')),
|
$bug_objects{$id}->add_comment(scalar($cgi->param('comment')),
|
||||||
{ isprivate => scalar($cgi->param('commentprivacy')),
|
{ isprivate => scalar($cgi->param('commentprivacy')),
|
||||||
work_time => $work_time, type => $type,
|
work_time => $work_time, type => $type,
|
||||||
extra_data => $duplicate});
|
extra_data => $duplicate});
|
||||||
# XXX When update() is used for other things than comments,
|
|
||||||
# this should probably be moved.
|
|
||||||
$old_bug_obj->update($timestamp);
|
|
||||||
$bug_changed = 1;
|
$bug_changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#################################
|
||||||
|
# Start Actual Database Updates #
|
||||||
|
#################################
|
||||||
|
|
||||||
|
$timestamp = $dbh->selectrow_array(q{SELECT NOW()});
|
||||||
|
|
||||||
|
if ($work_time) {
|
||||||
|
LogActivityEntry($id, "work_time", "", $work_time,
|
||||||
|
$whoid, $timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
$bug_objects{$id}->update($timestamp);
|
||||||
|
|
||||||
$bug_objects{$id}->update_keywords($timestamp);
|
$bug_objects{$id}->update_keywords($timestamp);
|
||||||
|
|
||||||
$query .= " WHERE bug_id = ?";
|
$query .= " WHERE bug_id = ?";
|
||||||
|
@ -1387,8 +1393,10 @@ foreach my $id (@idlist) {
|
||||||
$origQaContact = $old;
|
$origQaContact = $old;
|
||||||
}
|
}
|
||||||
|
|
||||||
# update_keywords does this for us already.
|
# Bugzilla::Bug does these for us already.
|
||||||
next if ($col eq 'keywords');
|
next if grep($_ eq $col, qw(keywords op_sys rep_platform priority
|
||||||
|
bug_severity short_desc
|
||||||
|
status_whiteboard bug_file_loc));
|
||||||
|
|
||||||
if ($col eq 'product') {
|
if ($col eq 'product') {
|
||||||
# If some votes have been removed, RemoveVotes() returns
|
# If some votes have been removed, RemoveVotes() returns
|
||||||
|
|
Загрузка…
Ссылка в новой задаче