]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 456919: Implement Bugzilla::Field::Choice->remove_from_db and have editvalues...
authormkanat%bugzilla.org <>
Fri, 3 Oct 2008 06:37:16 +0000 (06:37 +0000)
committermkanat%bugzilla.org <>
Fri, 3 Oct 2008 06:37:16 +0000 (06:37 +0000)
Patch by Max Kanat-Alexander <mkanat@bugzilla.org> r=bbaetz, a=mkanat

Bugzilla/Field/Choice.pm
Bugzilla/Object.pm
Bugzilla/Status.pm
editvalues.cgi
template/en/default/global/user-error.html.tmpl

index 9db5c5efd6b773478f509f2ec9945fe54ba920aa..a5c5fe6b1f3f59d77f948a962736d8fe3e55f5c5 100644 (file)
@@ -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;
index cde440b957654ee15f63db7ce28eb1ea1d5483ef..532b2c5bcb61a77085fa1db91dc2e7675f5469d6 100644 (file)
@@ -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
index 5654338503e484bda99588d7a563288c2cc1399d..d32b6c35454ae2080bca9c703678e9f721b70616 100644 (file)
@@ -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        ####
 ###############################
index f6a602b55b5445e7e8648893eb4fa6e1b157b4de..2992a5f3de9b65d1aaf5906a3e5b51a4b9a73e33 100755 (executable)
@@ -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';
index c306b692a4b129f81cef0c322c491e3ea8e8ef5a..c1fc9ae0de64d9c4f36707eaf8c8eb14f73a0ac6 100644 (file)
   [% 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" %]
   [% 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" %]