From f65a3e7e20fdfe2f136ecdaa228f0784bb56b9ad Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Sun, 8 Feb 2009 19:42:19 +0000 Subject: Bug 371995: Allow the Product field to restrict visibility of custom fields Patch By Max Kanat-Alexander r=LpSolit, a=mkanat --- Bugzilla/Field.pm | 2 +- Bugzilla/Field/Choice.pm | 9 +++++++- Bugzilla/Product.pm | 24 +++++++++++++++++++++- enter_bug.cgi | 4 ++++ .../en/default/admin/custom_fields/cf-js.js.tmpl | 2 +- template/en/default/bug/edit.html.tmpl | 9 ++++---- template/en/default/bug/field.html.tmpl | 12 +++++++---- template/en/default/global/user-error.html.tmpl | 4 ++-- 8 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Bugzilla/Field.pm b/Bugzilla/Field.pm index 91e9bb8b4..1cc89239e 100644 --- a/Bugzilla/Field.pm +++ b/Bugzilla/Field.pm @@ -158,7 +158,7 @@ use constant DEFAULT_FIELDS => ( {name => 'classification', desc => 'Classification', in_new_bugmail => 1, buglist => 1}, {name => 'product', desc => 'Product', in_new_bugmail => 1, - buglist => 1}, + type => FIELD_TYPE_SINGLE_SELECT, buglist => 1}, {name => 'version', desc => 'Version', in_new_bugmail => 1, buglist => 1}, {name => 'rep_platform', desc => 'Platform', in_new_bugmail => 1, diff --git a/Bugzilla/Field/Choice.pm b/Bugzilla/Field/Choice.pm index 9e8fb1235..00fa52f99 100644 --- a/Bugzilla/Field/Choice.pm +++ b/Bugzilla/Field/Choice.pm @@ -62,6 +62,7 @@ use constant VALIDATORS => { use constant CLASS_MAP => { bug_status => 'Bugzilla::Status', + product => 'Bugzilla::Product', }; use constant DEFAULT_MAP => { @@ -189,6 +190,13 @@ sub remove_from_db { ThrowUserError("fieldvalue_still_has_bugs", { field => $self->field, value => $self }); } + $self->_check_if_controller(); + $self->SUPER::remove_from_db(); +} + +# Factored out to make life easier for subclasses. +sub _check_if_controller { + my $self = shift; my $vis_fields = $self->controls_visibility_of_fields; my $values = $self->controlled_values; if (@$vis_fields || @$values) { @@ -196,7 +204,6 @@ sub remove_from_db { { value => $self, fields => [map($_->name, @$vis_fields)], vals => $values }); } - $self->SUPER::remove_from_db(); } diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm index 396aaa346..88292d27e 100644 --- a/Bugzilla/Product.pm +++ b/Bugzilla/Product.pm @@ -31,7 +31,9 @@ use Bugzilla::Install::Requirements; use Bugzilla::Mailer; use Bugzilla::Series; -use base qw(Bugzilla::Object); +# Currently, we only implement enough of the Bugzilla::Field::Choice +# interface to control the visibility of other fields. +use base qw(Bugzilla::Field::Choice); use constant DEFAULT_CLASSIFICATION_ID => 1; @@ -40,6 +42,10 @@ use constant DEFAULT_CLASSIFICATION_ID => 1; ############################### use constant DB_TABLE => 'products'; +# Reset these back to the Bugzilla::Object defaults, instead of the +# Bugzilla::Field::Choice defaults. +use constant NAME_FIELD => 'name'; +use constant LIST_ORDER => 'name'; use constant DB_COLUMNS => qw( id @@ -372,6 +378,8 @@ sub remove_from_db { $dbh->bz_start_transaction(); + $self->_check_if_controller(); + if ($self->bug_count) { if (Bugzilla->params->{'allowbugdeletion'}) { require Bugzilla::Bug; @@ -523,6 +531,20 @@ sub _check_votes { return $votes; } +##################################### +# Implement Bugzilla::Field::Choice # +##################################### + +sub field { + my $invocant = shift; + my $class = ref $invocant || $invocant; + my $cache = Bugzilla->request_cache; + $cache->{"field_$class"} ||= new Bugzilla::Field({ name => 'product' }); + return $cache->{"field_$class"}; +} + +use constant is_default => 0; + ############################### #### Methods #### ############################### diff --git a/enter_bug.cgi b/enter_bug.cgi index ef0314bca..f028187fd 100755 --- a/enter_bug.cgi +++ b/enter_bug.cgi @@ -389,6 +389,10 @@ foreach my $field (@enter_bug_fields) { $vars->{$field->name} = formvalue($field->name); } +# This allows the Field visibility and value controls to work with the +# Product field as a parent. +$default{'product'} = $product->name; + if ($cloned_bug_id) { $default{'component_'} = $cloned_bug->component; diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl index 891f5da76..89a8529ed 100644 --- a/template/en/default/admin/custom_fields/cf-js.js.tmpl +++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl @@ -27,7 +27,7 @@ var select_values = new Array(); [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %] select_values[[% sel_field.id FILTER js %]] = [ [% FOREACH legal_value = sel_field.legal_values %] - [[% legal_value.id FILTER js %], '[% legal_value.name FILTER html %]'][% ',' UNLESS loop.last %] + [[% legal_value.id FILTER js %], '[% legal_value.name FILTER js %]'][% ',' UNLESS loop.last %] [% END %] ]; [% END %] diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index 80c5745fc..527766357 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -369,11 +369,12 @@ [%#############%] [%# PRODUCT #%] [%#############%] + - - : - - [% PROCESS select selname => "product" %] + [% INCLUDE bug/field.html.tmpl + bug = bug, field = select_fields.product, + desc_url = 'describecomponents.cgi', value = bug.product + editable = bug.check_can_change_field('product', 0, 1) %] [%###############%] [%# Component #%] diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl index 04443579e..3ae7302c6 100644 --- a/template/en/default/bug/field.html.tmpl +++ b/template/en/default/bug/field.html.tmpl @@ -30,6 +30,10 @@ # the field value. # no_tds: boolean; if true, don't display the label or the # wrapping for the field. + # desc_url: string; Normally the label of a non-custom field links to + # fields.html. If you want it to link elsewhere, specify the + # relative URL you want to link to, here. Remember to call + # url_quote on any query string arguments. # bug (optional): The current Bugzilla::Bug being displayed, or a hash # with default field values being displayed on a page. #%] @@ -49,13 +53,13 @@ [% IF editable %] ' IF editable %] [% END %] diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 1efee9a5e..570cdc6fe 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -475,8 +475,8 @@ [% ELSIF error == "fieldvalue_is_controller" %] [% title = "Value Controls Other Fields" %] - You cannot delete the '[% value.name FILTER html %]' value for this - field because + You cannot delete the [% value.field.description FILTER html %] + '[% value.name FILTER html %]' because [% IF fields.size %] it controls the visibility of the following fields: [%+ fields.join(', ') FILTER html %]. -- cgit v1.2.3-24-g4f1b