summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Rogers <kar@cray.com>2010-07-05 23:49:52 +0200
committerMax Kanat-Alexander <mkanat@bugzilla.org>2010-07-05 23:49:52 +0200
commitbcab6fcb10aa88683490bef03c607173f9c0b063 (patch)
treea7ed63d95f2cdce804e79e9869d813fda121a06a
parent65528cc7177689bee757fd26510bbb2a10954931 (diff)
downloadbugzilla-bcab6fcb10aa88683490bef03c607173f9c0b063.tar.gz
bugzilla-bcab6fcb10aa88683490bef03c607173f9c0b063.tar.xz
Bug 514618: Allow restricting the visibility and values of fields by
classification. r=mkanat, r=timello, a=mkanat
-rw-r--r--Bugzilla/Bug.pm4
-rw-r--r--Bugzilla/Classification.pm11
-rw-r--r--Bugzilla/Constants.pm1
-rw-r--r--Bugzilla/Field.pm2
-rw-r--r--Bugzilla/Field/Choice.pm1
-rw-r--r--Bugzilla/Product.pm16
-rwxr-xr-xenter_bug.cgi3
-rw-r--r--js/field.js14
-rw-r--r--template/en/default/bug/edit.html.tmpl23
-rw-r--r--template/en/default/bug/field-events.js.tmpl3
10 files changed, 74 insertions, 4 deletions
diff --git a/Bugzilla/Bug.pm b/Bugzilla/Bug.pm
index ea8e4bc3d..23a92b080 100644
--- a/Bugzilla/Bug.pm
+++ b/Bugzilla/Bug.pm
@@ -3415,9 +3415,13 @@ sub choices {
if (!grep($_->name eq $self->product_obj->name, @products)) {
unshift(@products, $self->product_obj);
}
+ my %class_ids = map { $_->classification_id => 1 } @products;
+ my $classifications =
+ Bugzilla::Classification->new_from_list([keys %class_ids]);
my %choices = (
bug_status => $self->statuses_available,
+ classification => $classifications,
product => \@products,
component => $self->product_obj->components,
version => $self->product_obj->versions,
diff --git a/Bugzilla/Classification.pm b/Bugzilla/Classification.pm
index c7cda11be..88ec4eb3b 100644
--- a/Bugzilla/Classification.pm
+++ b/Bugzilla/Classification.pm
@@ -20,11 +20,12 @@ use strict;
package Bugzilla::Classification;
use Bugzilla::Constants;
+use Bugzilla::Field;
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::Product;
-use base qw(Bugzilla::Object);
+use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object);
###############################
#### Initialization ####
@@ -111,6 +112,14 @@ sub _check_sortkey {
return $sortkey;
}
+#####################################
+# Implement Bugzilla::Field::Choice #
+#####################################
+
+use constant FIELD_NAME => 'classification';
+use constant is_default => 0;
+use constant is_active => 1;
+
###############################
#### Methods ####
###############################
diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm
index a003ce739..9c2a3e353 100644
--- a/Bugzilla/Constants.pm
+++ b/Bugzilla/Constants.pm
@@ -403,6 +403,7 @@ use constant EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/;
# See the POD for Bugzilla::Field/is_abnormal to see why these are listed
# here.
use constant ABNORMAL_SELECTS => qw(
+ classification
product
component
);
diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm
index 15b494762..76bb1d41e 100644
--- a/Bugzilla/Field.pm
+++ b/Bugzilla/Field.pm
@@ -166,7 +166,7 @@ use constant DEFAULT_FIELDS => (
{name => 'short_desc', desc => 'Summary', in_new_bugmail => 1,
is_mandatory => 1, buglist => 1},
{name => 'classification', desc => 'Classification', in_new_bugmail => 1,
- buglist => 1},
+ type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'product', desc => 'Product', in_new_bugmail => 1,
type => FIELD_TYPE_SINGLE_SELECT, buglist => 1},
{name => 'version', desc => 'Version', in_new_bugmail => 1,
diff --git a/Bugzilla/Field/Choice.pm b/Bugzilla/Field/Choice.pm
index 0c44134ef..773dbd4ce 100644
--- a/Bugzilla/Field/Choice.pm
+++ b/Bugzilla/Field/Choice.pm
@@ -64,6 +64,7 @@ use constant VALIDATORS => {
use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status',
+ classification => 'Bugzilla::Classification',
component => 'Bugzilla::Component',
product => 'Bugzilla::Product',
};
diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm
index 514649763..80e1752e6 100644
--- a/Bugzilla/Product.pm
+++ b/Bugzilla/Product.pm
@@ -791,6 +791,13 @@ sub flag_types {
return $self->{'flag_types'};
}
+sub classification {
+ my $self = shift;
+ $self->{'classification'} ||=
+ new Bugzilla::Classification($self->classification_id);
+ return $self->{'classification'};
+}
+
###############################
#### Accessors ######
###############################
@@ -853,6 +860,7 @@ Bugzilla::Product - Bugzilla product class.
my $bug_ids = $product->bug_ids();
my $has_access = $product->user_has_access($user);
my $flag_types = $product->flag_types();
+ my $classification = $product->classification();
my $id = $product->id;
my $name = $product->name;
@@ -1021,6 +1029,14 @@ a group is valid in a particular product.)
Returns: Two references to an array of flagtype objects.
+=item C<classification()>
+
+ Description: Returns the classification the product belongs to.
+
+ Params: none.
+
+ Returns: A Bugzilla::Classification object.
+
=back
=head1 SUBROUTINES
diff --git a/enter_bug.cgi b/enter_bug.cgi
index 4aa6a29d9..64b239628 100755
--- a/enter_bug.cgi
+++ b/enter_bug.cgi
@@ -416,7 +416,8 @@ foreach my $field (@enter_bug_fields) {
}
# This allows the Field visibility and value controls to work with the
-# Product field as a parent.
+# Classification and Product fields as a parent.
+$default{'classification'} = $product->classification->name;
$default{'product'} = $product->name;
if ($cloned_bug_id) {
diff --git a/js/field.js b/js/field.js
index 20485bcc8..0ca59918a 100644
--- a/js/field.js
+++ b/js/field.js
@@ -375,6 +375,20 @@ function updateCommentTagControl(checkbox, form) {
}
/**
+ * Reset the value of the classification field and fire an event change
+ * on it. Called when the product changes, in case the classification
+ * field (which is hidden) controls the visibility of any other fields.
+ */
+function setClassification() {
+ var classification = document.getElementById('classification');
+ var product = document.getElementById('product');
+ var selected_product = product.value;
+ var select_classification = all_classifications[selected_product];
+ classification.value = select_classification;
+ bz_fireEvent(classification, 'change');
+}
+
+/**
* Says that a field should only be displayed when another field has
* a certain value. May only be called after the controller has already
* been added to the DOM.
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index 5520e7699..0a558ecc1 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -128,6 +128,15 @@
[% END %]
+ /* Index all classifications so we can keep track of the classification
+ * for the selected product, which could control field visibility.
+ */
+ var all_classifications = new Array([% bug.choices.product.size %]);
+ [%- FOREACH product = bug.choices.product %]
+ all_classifications['[% product.name FILTER js %]'] = '
+ [%- product.classification.name FILTER js %]';
+ [%- END %]
+
//-->
</script>
@@ -319,7 +328,6 @@
[%#############%]
[%# PRODUCT #%]
[%#############%]
-
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product,
@@ -327,6 +335,19 @@
desc_url = 'describecomponents.cgi', value = bug.product
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
+
+ [%# Classification is here so that it can be used in value controllers
+ # and visibility controllers. It comes after product because
+ # it uses some javascript that depends on the existence of the
+ # product field.
+ #%]
+ <tr class="bz_default_hidden">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug field = bug_fields.classification
+ override_legal_values = bug.choices.classification
+ value = bug.classification
+ editable = bug.check_can_change_field('product', 0, 1) %]
+ </tr>
[%###############%]
[%# Component #%]
[%###############%]
diff --git a/template/en/default/bug/field-events.js.tmpl b/template/en/default/bug/field-events.js.tmpl
index 763687e06..f9e0ea93d 100644
--- a/template/en/default/bug/field-events.js.tmpl
+++ b/template/en/default/bug/field-events.js.tmpl
@@ -39,3 +39,6 @@
[% legal_value.id FILTER js %]);
[% END %]
[% END %]
+[% IF field.name == 'classification' %]
+ YAHOO.util.Event.on('product', 'change', setClassification);
+[% END %]