Bug 456919: Implement Bugzilla::Field::Choice->remove_from_db and have editvalues.cgi use it
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=bbaetz, a=mkanat git-svn-id: svn://10.0.0.236/trunk@254511 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -170,12 +170,52 @@ sub update {
|
||||
return $changes;
|
||||
}
|
||||
|
||||
sub remove_from_db {
|
||||
my $self = shift;
|
||||
if ($self->is_default) {
|
||||
ThrowUserError('fieldvalue_is_default',
|
||||
{ field => $self->field, value => $self->name,
|
||||
param_name => $self->DEFAULT_MAP->{$self->field->name},
|
||||
});
|
||||
}
|
||||
if ($self->is_static) {
|
||||
ThrowUserError('fieldvalue_not_deletable',
|
||||
{ field => $self->field, value => $self->name });
|
||||
}
|
||||
if ($self->bug_count) {
|
||||
ThrowUserError("fieldvalue_still_has_bugs",
|
||||
{ field => $self->field, value => $self->name,
|
||||
count => $self->bug_count });
|
||||
}
|
||||
$self->SUPER::remove_from_db();
|
||||
}
|
||||
|
||||
|
||||
#############
|
||||
# Accessors #
|
||||
#############
|
||||
|
||||
sub sortkey { return $_[0]->{'sortkey'}; }
|
||||
|
||||
sub bug_count {
|
||||
my $self = shift;
|
||||
return $self->{bug_count} if defined $self->{bug_count};
|
||||
my $dbh = Bugzilla->dbh;
|
||||
my $fname = $self->field->name;
|
||||
my $count;
|
||||
if ($self->field->type == FIELD_TYPE_MULTI_SELECT) {
|
||||
$count = $dbh->selectrow_array("SELECT COUNT(*) FROM bug_$fname
|
||||
WHERE value = ?", undef, $self->name);
|
||||
}
|
||||
else {
|
||||
$count = $dbh->selectrow_array("SELECT COUNT(*) FROM bugs
|
||||
WHERE $fname = ?",
|
||||
undef, $self->name);
|
||||
}
|
||||
$self->{bug_count} = $count;
|
||||
return $count;
|
||||
}
|
||||
|
||||
sub field {
|
||||
my $invocant = shift;
|
||||
my $class = ref $invocant || $invocant;
|
||||
|
||||
@@ -290,6 +290,15 @@ sub update {
|
||||
return \%changes;
|
||||
}
|
||||
|
||||
sub remove_from_db {
|
||||
my $self = shift;
|
||||
my $table = $self->DB_TABLE;
|
||||
my $id_field = $self->ID_FIELD;
|
||||
Bugzilla->dbh->do("DELETE FROM $table WHERE $id_field = ?",
|
||||
undef, $self->id);
|
||||
undef $self;
|
||||
}
|
||||
|
||||
###############################
|
||||
#### Subroutines ######
|
||||
###############################
|
||||
@@ -726,6 +735,12 @@ C<update>.)
|
||||
|
||||
=back
|
||||
|
||||
=item C<remove_from_db>
|
||||
|
||||
Removes this object from the database. Will throw an error if you can't
|
||||
remove it for some reason. The object will then be destroyed, as it is
|
||||
not safe to use the object after it has been removed from the database.
|
||||
|
||||
=back
|
||||
|
||||
=head2 Subclass Helpers
|
||||
|
||||
@@ -73,6 +73,18 @@ sub create {
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub remove_from_db {
|
||||
my $self = shift;
|
||||
my $dbh = Bugzilla->dbh;
|
||||
my $id = $self->id;
|
||||
$dbh->bz_start_transaction();
|
||||
$self->SUPER::remove_from_db();
|
||||
$dbh->do('DELETE FROM status_workflow
|
||||
WHERE old_status = ? OR new_status = ?',
|
||||
undef, $id, $id);
|
||||
$dbh->bz_commit_transaction();
|
||||
}
|
||||
|
||||
###############################
|
||||
##### Accessors ####
|
||||
###############################
|
||||
|
||||
@@ -265,58 +265,10 @@ if ($action eq 'del') {
|
||||
#
|
||||
if ($action eq 'delete') {
|
||||
check_token_data($token, 'delete_field_value');
|
||||
ValueMustExist($field, $value);
|
||||
my $value_obj = Bugzilla::Field::Choice->type($field)->check($value);
|
||||
$vars->{'value'} = $value_obj->name;
|
||||
$value_obj->remove_from_db();
|
||||
|
||||
$vars->{'value'} = $value;
|
||||
$vars->{'param_name'} = $defaults{$field};
|
||||
|
||||
if (defined $defaults{$field}
|
||||
&& ($value eq Bugzilla->params->{$defaults{$field}}))
|
||||
{
|
||||
ThrowUserError('fieldvalue_is_default', $vars);
|
||||
}
|
||||
# If the value cannot be deleted, throw an error.
|
||||
if (lsearch($static{$field}, $value) >= 0) {
|
||||
ThrowUserError('fieldvalue_not_deletable', $vars);
|
||||
}
|
||||
|
||||
trick_taint($value);
|
||||
|
||||
$dbh->bz_start_transaction();
|
||||
|
||||
# Check if there are any bugs that still have this value.
|
||||
my $bug_count;
|
||||
if ($field_obj->type != FIELD_TYPE_MULTI_SELECT) {
|
||||
$bug_count =
|
||||
$dbh->selectrow_array("SELECT COUNT(*) FROM bugs WHERE $field = ?",
|
||||
undef, $value);
|
||||
}
|
||||
else {
|
||||
$bug_count =
|
||||
$dbh->selectrow_array("SELECT COUNT(*) FROM bug_$field WHERE value = ?",
|
||||
undef, $value);
|
||||
}
|
||||
|
||||
|
||||
if ($bug_count) {
|
||||
# You tried to delete a field that bugs are still using.
|
||||
# You can't just delete the bugs. That's ridiculous.
|
||||
ThrowUserError("fieldvalue_still_has_bugs",
|
||||
{ field => $field, value => $value,
|
||||
count => $bug_count });
|
||||
}
|
||||
|
||||
if ($field eq 'bug_status') {
|
||||
my $status_id = $dbh->selectrow_arrayref('SELECT id FROM bug_status
|
||||
WHERE value = ?', undef, $value);
|
||||
$dbh->do('DELETE FROM status_workflow
|
||||
WHERE old_status = ? OR new_status = ?',
|
||||
undef, ($status_id, $status_id));
|
||||
}
|
||||
|
||||
$dbh->do("DELETE FROM $field WHERE value = ?", undef, $value);
|
||||
|
||||
$dbh->bz_commit_transaction();
|
||||
delete_token($token);
|
||||
|
||||
$vars->{'message'} = 'field_value_deleted';
|
||||
|
||||
@@ -463,7 +463,8 @@
|
||||
[% ELSIF error == "fieldvalue_not_deletable" %]
|
||||
[% title = "Field Value Not Deletable" %]
|
||||
The value '[% value FILTER html %]' cannot be removed because
|
||||
it plays some special role for the '[% field.description FILTER html %]' field.
|
||||
it plays some special role for the '[% field.description FILTER html %]'
|
||||
field.
|
||||
|
||||
[% ELSIF error == "fieldvalue_not_specified" %]
|
||||
[% title = "Field Value Not Specified" %]
|
||||
@@ -484,7 +485,7 @@
|
||||
[% ELSIF error == "fieldvalue_still_has_bugs" %]
|
||||
[% title = "You Cannot Delete This Field Value" %]
|
||||
You cannot delete the value '[% value FILTER html %]' from the
|
||||
'[% field FILTER html %]' field, because there are still
|
||||
[% field.description FILTER html %] field, because there are still
|
||||
[%+ count FILTER html %] [%+ terms.bugs %] using it.
|
||||
|
||||
[% ELSIF error == "fieldvalue_undefined" %]
|
||||
|
||||
Reference in New Issue
Block a user