From b03fc56082401474044c7f92f8786164ca0508a4 Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Fri, 3 Oct 2008 06:37:16 +0000 Subject: Bug 456919: Implement Bugzilla::Field::Choice->remove_from_db and have editvalues.cgi use it Patch by Max Kanat-Alexander r=bbaetz, a=mkanat --- Bugzilla/Field/Choice.pm | 40 ++++++++++++++++++ Bugzilla/Object.pm | 15 +++++++ Bugzilla/Status.pm | 12 ++++++ editvalues.cgi | 54 ++----------------------- template/en/default/global/user-error.html.tmpl | 5 ++- 5 files changed, 73 insertions(+), 53 deletions(-) diff --git a/Bugzilla/Field/Choice.pm b/Bugzilla/Field/Choice.pm index 9db5c5efd..a5c5fe6b1 100644 --- a/Bugzilla/Field/Choice.pm +++ b/Bugzilla/Field/Choice.pm @@ -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; diff --git a/Bugzilla/Object.pm b/Bugzilla/Object.pm index cde440b95..532b2c5bc 100644 --- a/Bugzilla/Object.pm +++ b/Bugzilla/Object.pm @@ -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.) =back +=item C + +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 diff --git a/Bugzilla/Status.pm b/Bugzilla/Status.pm index 565433850..d32b6c354 100644 --- a/Bugzilla/Status.pm +++ b/Bugzilla/Status.pm @@ -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 #### ############################### diff --git a/editvalues.cgi b/editvalues.cgi index f6a602b55..2992a5f3d 100755 --- a/editvalues.cgi +++ b/editvalues.cgi @@ -265,58 +265,10 @@ if ($action eq 'del') { # if ($action eq 'delete') { check_token_data($token, 'delete_field_value'); - ValueMustExist($field, $value); - - $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); + my $value_obj = Bugzilla::Field::Choice->type($field)->check($value); + $vars->{'value'} = $value_obj->name; + $value_obj->remove_from_db(); - $dbh->bz_commit_transaction(); delete_token($token); $vars->{'message'} = 'field_value_deleted'; diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index c306b692a..c1fc9ae0d 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -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" %] -- cgit v1.2.3-24-g4f1b