summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Bugzilla/Classification.pm25
-rw-r--r--Bugzilla/User.pm16
-rwxr-xr-xeditclassifications.cgi104
-rw-r--r--template/en/default/global/messages.html.tmpl22
4 files changed, 55 insertions, 112 deletions
diff --git a/Bugzilla/Classification.pm b/Bugzilla/Classification.pm
index 2eb253aa7..7c362bc45 100644
--- a/Bugzilla/Classification.pm
+++ b/Bugzilla/Classification.pm
@@ -30,6 +30,7 @@ use base qw(Bugzilla::Object);
###############################
use constant DB_TABLE => 'classifications';
+use constant LIST_ORDER => 'sortkey, name';
use constant DB_COLUMNS => qw(
id
@@ -55,6 +56,26 @@ use constant VALIDATORS => {
};
###############################
+#### Constructors #####
+###############################
+sub remove_from_db {
+ my $self = shift;
+ my $dbh = Bugzilla->dbh;
+
+ ThrowUserError("classification_not_deletable") if ($self->id == 1);
+
+ $dbh->bz_start_transaction();
+ # Reclassify products to the default classification, if needed.
+ $dbh->do("UPDATE products SET classification_id = 1
+ WHERE classification_id = ?", undef, $self->id);
+
+ $dbh->do("DELETE FROM classifications WHERE id = ?", undef, $self->id);
+
+ $dbh->bz_commit_transaction();
+
+}
+
+###############################
#### Validators ####
###############################
@@ -93,6 +114,10 @@ sub _check_sortkey {
#### Methods ####
###############################
+sub set_name { $_[0]->set('name', $_[1]); }
+sub set_description { $_[0]->set('description', $_[1]); }
+sub set_sortkey { $_[0]->set('sortkey', $_[1]); }
+
sub product_count {
my $self = shift;
my $dbh = Bugzilla->dbh;
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index 5c4c8621c..0c0f45bc0 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -682,20 +682,12 @@ sub get_selectable_products {
sub get_selectable_classifications {
my ($self) = @_;
- if (defined $self->{selectable_classifications}) {
- return $self->{selectable_classifications};
- }
-
- my $products = $self->get_selectable_products;
+ if (!defined $self->{selectable_classifications}) {
+ my $products = $self->get_selectable_products;
+ my %class_ids = map { $_->classification_id => 1 } @$products;
- my $class;
- foreach my $product (@$products) {
- $class->{$product->classification_id} ||=
- new Bugzilla::Classification($product->classification_id);
+ $self->{selectable_classifications} = Bugzilla::Classification->new_from_list([keys %class_ids]);
}
- my @sorted_class = sort {$a->sortkey <=> $b->sortkey
- || lc($a->name) cmp lc($b->name)} (values %$class);
- $self->{selectable_classifications} = \@sorted_class;
return $self->{selectable_classifications};
}
diff --git a/editclassifications.cgi b/editclassifications.cgi
index f2a91a68e..61b014c8d 100755
--- a/editclassifications.cgi
+++ b/editclassifications.cgi
@@ -100,34 +100,15 @@ if ($action eq 'add') {
if ($action eq 'new') {
check_token_data($token, 'add_classification');
- $class_name || ThrowUserError("classification_not_specified");
-
my $classification =
- new Bugzilla::Classification({name => $class_name});
-
- if ($classification) {
- ThrowUserError("classification_already_exists",
- { name => $classification->name });
- }
-
- my $description = trim($cgi->param('description') || '');
-
- my $sortkey = trim($cgi->param('sortkey') || 0);
- my $stored_sortkey = $sortkey;
- detaint_natural($sortkey)
- || ThrowUserError('classification_invalid_sortkey', {'sortkey' => $stored_sortkey});
-
- trick_taint($description);
- trick_taint($class_name);
-
- # Add the new classification.
- $dbh->do("INSERT INTO classifications (name, description, sortkey)
- VALUES (?, ?, ?)", undef, ($class_name, $description, $sortkey));
+ Bugzilla::Classification->create({name => $class_name,
+ description => scalar $cgi->param('description'),
+ sortkey => scalar $cgi->param('sortkey')});
delete_token($token);
$vars->{'message'} = 'classification_created';
- $vars->{'classification'} = new Bugzilla::Classification({name => $class_name});
+ $vars->{'classification'} = $classification;
$vars->{'classifications'} = [Bugzilla::Classification->get_all];
$vars->{'token'} = issue_session_token('reclassify_classifications');
LoadTemplate('reclassify');
@@ -165,27 +146,11 @@ if ($action eq 'delete') {
check_token_data($token, 'delete_classification');
my $classification = Bugzilla::Classification->check($class_name);
-
- if ($classification->id == 1) {
- ThrowUserError("classification_not_deletable");
- }
-
- # lock the tables before we start to change everything:
- $dbh->bz_start_transaction();
-
- # update products just in case
- $dbh->do("UPDATE products SET classification_id = 1
- WHERE classification_id = ?", undef, $classification->id);
-
- # delete
- $dbh->do("DELETE FROM classifications WHERE id = ?", undef,
- $classification->id);
-
- $dbh->bz_commit_transaction();
+ $classification->remove_from_db;
+ delete_token($token);
$vars->{'message'} = 'classification_deleted';
- $vars->{'classification'} = $class_name;
- delete_token($token);
+ $vars->{'classification'} = $classification;
LoadTemplate('select');
}
@@ -196,7 +161,6 @@ if ($action eq 'delete') {
#
if ($action eq 'edit') {
-
my $classification = Bugzilla::Classification->check($class_name);
$vars->{'classification'} = $classification;
@@ -212,57 +176,19 @@ if ($action eq 'edit') {
if ($action eq 'update') {
check_token_data($token, 'edit_classification');
- $class_name || ThrowUserError("classification_not_specified");
-
my $class_old_name = trim($cgi->param('classificationold') || '');
+ my $classification = Bugzilla::Classification->check($class_old_name);
- my $class_old = Bugzilla::Classification->check($class_old_name);
-
- my $description = trim($cgi->param('description') || '');
-
- my $sortkey = trim($cgi->param('sortkey') || 0);
- my $stored_sortkey = $sortkey;
- detaint_natural($sortkey)
- || ThrowUserError('classification_invalid_sortkey', {'sortkey' => $stored_sortkey});
-
- $dbh->bz_start_transaction();
-
- if ($class_name ne $class_old->name) {
-
- my $class = new Bugzilla::Classification({name => $class_name});
- if ($class) {
- ThrowUserError("classification_already_exists",
- { name => $class->name });
- }
- trick_taint($class_name);
- $dbh->do("UPDATE classifications SET name = ? WHERE id = ?",
- undef, ($class_name, $class_old->id));
-
- $vars->{'updated_classification'} = 1;
- }
+ $classification->set_name($class_name);
+ $classification->set_description(scalar $cgi->param('description'));
+ $classification->set_sortkey(scalar $cgi->param('sortkey'));
- if ($description ne $class_old->description) {
- trick_taint($description);
- $dbh->do("UPDATE classifications SET description = ?
- WHERE id = ?", undef,
- ($description, $class_old->id));
-
- $vars->{'updated_description'} = 1;
- }
-
- if ($sortkey ne $class_old->sortkey) {
- $dbh->do("UPDATE classifications SET sortkey = ?
- WHERE id = ?", undef,
- ($sortkey, $class_old->id));
-
- $vars->{'updated_sortkey'} = 1;
- }
-
- $dbh->bz_commit_transaction();
+ my $changes = $classification->update;
+ delete_token($token);
$vars->{'message'} = 'classification_updated';
- $vars->{'classification'} = $class_name;
- delete_token($token);
+ $vars->{'classification'} = $classification;
+ $vars->{'changes'} = $changes;
LoadTemplate('select');
}
diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl
index 5e2eaef00..f72acff1a 100644
--- a/template/en/default/global/messages.html.tmpl
+++ b/template/en/default/global/messages.html.tmpl
@@ -186,26 +186,26 @@
[% ELSIF message_tag == "classification_deleted" %]
[% title = "Classification Deleted" %]
- The <em>[% classification FILTER html %]</em> classification has been deleted.
+ The <em>[% classification.name FILTER html %]</em> classification has been deleted.
[% ELSIF message_tag == "classification_updated" %]
- [% IF updated_classification || updated_description || updated_sortkey %]
- [% title = "Classification Updated" %]
- Changes to the <em>[% classification FILTER html %]</em> classification
+ [% title = "Classification Updated" %]
+ [% IF changes.keys.size %]
+ Changes to the <em>[% classification.name FILTER html %]</em> classification
have been saved:
<ul>
- [% IF updated_classification %]
- <li>Classification name updated</li>
+ [% IF changes.name.defined %]
+ <li>Name updated to '[% classification.name FILTER html %]'</li>
[% END %]
- [% IF updated_description %]
- <li>Description updated</li>
+ [% IF changes.description.defined %]
+ <li>Description updated to '[% classification.description FILTER html %]'</li>
[% END %]
- [% IF updated_sortkey %]
- <li>Sortkey updated</li>
+ [% IF changes.sortkey.defined %]
+ <li>Sortkey updated to '[% classification.sortkey FILTER html %]'</li>
[% END %]
</ul>
[% ELSE %]
- No changes made to <em>[% classification FILTER html %]</em>.
+ No changes made to <em>[% classification.name FILTER html %]</em>.
[% END %]
[% ELSIF message_tag == "component_created" %]