Commit f65a3e7e authored by mkanat%bugzilla.org's avatar mkanat%bugzilla.org

Bug 371995: Allow the Product field to restrict visibility of custom fields

Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat
parent 88463d2b
...@@ -158,7 +158,7 @@ use constant DEFAULT_FIELDS => ( ...@@ -158,7 +158,7 @@ use constant DEFAULT_FIELDS => (
{name => 'classification', desc => 'Classification', in_new_bugmail => 1, {name => 'classification', desc => 'Classification', in_new_bugmail => 1,
buglist => 1}, buglist => 1},
{name => 'product', desc => 'Product', in_new_bugmail => 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, {name => 'version', desc => 'Version', in_new_bugmail => 1,
buglist => 1}, buglist => 1},
{name => 'rep_platform', desc => 'Platform', in_new_bugmail => 1, {name => 'rep_platform', desc => 'Platform', in_new_bugmail => 1,
......
...@@ -62,6 +62,7 @@ use constant VALIDATORS => { ...@@ -62,6 +62,7 @@ use constant VALIDATORS => {
use constant CLASS_MAP => { use constant CLASS_MAP => {
bug_status => 'Bugzilla::Status', bug_status => 'Bugzilla::Status',
product => 'Bugzilla::Product',
}; };
use constant DEFAULT_MAP => { use constant DEFAULT_MAP => {
...@@ -189,6 +190,13 @@ sub remove_from_db { ...@@ -189,6 +190,13 @@ sub remove_from_db {
ThrowUserError("fieldvalue_still_has_bugs", ThrowUserError("fieldvalue_still_has_bugs",
{ field => $self->field, value => $self }); { 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 $vis_fields = $self->controls_visibility_of_fields;
my $values = $self->controlled_values; my $values = $self->controlled_values;
if (@$vis_fields || @$values) { if (@$vis_fields || @$values) {
...@@ -196,7 +204,6 @@ sub remove_from_db { ...@@ -196,7 +204,6 @@ sub remove_from_db {
{ value => $self, fields => [map($_->name, @$vis_fields)], { value => $self, fields => [map($_->name, @$vis_fields)],
vals => $values }); vals => $values });
} }
$self->SUPER::remove_from_db();
} }
......
...@@ -31,7 +31,9 @@ use Bugzilla::Install::Requirements; ...@@ -31,7 +31,9 @@ use Bugzilla::Install::Requirements;
use Bugzilla::Mailer; use Bugzilla::Mailer;
use Bugzilla::Series; 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; use constant DEFAULT_CLASSIFICATION_ID => 1;
...@@ -40,6 +42,10 @@ use constant DEFAULT_CLASSIFICATION_ID => 1; ...@@ -40,6 +42,10 @@ use constant DEFAULT_CLASSIFICATION_ID => 1;
############################### ###############################
use constant DB_TABLE => 'products'; 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( use constant DB_COLUMNS => qw(
id id
...@@ -372,6 +378,8 @@ sub remove_from_db { ...@@ -372,6 +378,8 @@ sub remove_from_db {
$dbh->bz_start_transaction(); $dbh->bz_start_transaction();
$self->_check_if_controller();
if ($self->bug_count) { if ($self->bug_count) {
if (Bugzilla->params->{'allowbugdeletion'}) { if (Bugzilla->params->{'allowbugdeletion'}) {
require Bugzilla::Bug; require Bugzilla::Bug;
...@@ -523,6 +531,20 @@ sub _check_votes { ...@@ -523,6 +531,20 @@ sub _check_votes {
return $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 #### #### Methods ####
############################### ###############################
......
...@@ -389,6 +389,10 @@ foreach my $field (@enter_bug_fields) { ...@@ -389,6 +389,10 @@ foreach my $field (@enter_bug_fields) {
$vars->{$field->name} = formvalue($field->name); $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) { if ($cloned_bug_id) {
$default{'component_'} = $cloned_bug->component; $default{'component_'} = $cloned_bug->component;
......
...@@ -27,7 +27,7 @@ var select_values = new Array(); ...@@ -27,7 +27,7 @@ var select_values = new Array();
[% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %] [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
select_values[[% sel_field.id FILTER js %]] = [ select_values[[% sel_field.id FILTER js %]] = [
[% FOREACH legal_value = sel_field.legal_values %] [% 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 %]
]; ];
[% END %] [% END %]
......
...@@ -369,11 +369,12 @@ ...@@ -369,11 +369,12 @@
[%#############%] [%#############%]
[%# PRODUCT #%] [%# PRODUCT #%]
[%#############%] [%#############%]
<tr> <tr>
<td class="field_label"> [% INCLUDE bug/field.html.tmpl
<label for="product" accesskey="p"><b><u>P</u>roduct</b></label>: bug = bug, field = select_fields.product,
</td> desc_url = 'describecomponents.cgi', value = bug.product
[% PROCESS select selname => "product" %] editable = bug.check_can_change_field('product', 0, 1) %]
</tr> </tr>
[%###############%] [%###############%]
[%# Component #%] [%# Component #%]
......
...@@ -30,6 +30,10 @@ ...@@ -30,6 +30,10 @@
# the field value. # the field value.
# no_tds: boolean; if true, don't display the label <th> or the # no_tds: boolean; if true, don't display the label <th> or the
# wrapping <td> for the field. # wrapping <td> 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 # bug (optional): The current Bugzilla::Bug being displayed, or a hash
# with default field values being displayed on a page. # with default field values being displayed on a page.
#%] #%]
...@@ -49,13 +53,13 @@ ...@@ -49,13 +53,13 @@
[% IF editable %] [% IF editable %]
<label for="[% field.name FILTER html %]"> <label for="[% field.name FILTER html %]">
[% END %] [% END %]
[% IF !field.custom %] [% IF desc_url %]
<a href="[% desc_url FILTER html %]">
[% ELSIF !field.custom %]
<a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]"> <a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]">
[% END -%] [% END -%]
[% field_descs.${field.name} FILTER html %]: [% field_descs.${field.name} FILTER html %]:
[%- IF !field.custom %] [%- '</a>' IF (!field.custom || desc_url) %]
</a>
[% END %]
[% '</label>' IF editable %] [% '</label>' IF editable %]
</th> </th>
[% END %] [% END %]
......
...@@ -475,8 +475,8 @@ ...@@ -475,8 +475,8 @@
[% ELSIF error == "fieldvalue_is_controller" %] [% ELSIF error == "fieldvalue_is_controller" %]
[% title = "Value Controls Other Fields" %] [% title = "Value Controls Other Fields" %]
You cannot delete the '[% value.name FILTER html %]' value for this You cannot delete the [% value.field.description FILTER html %]
field because '[% value.name FILTER html %]' because
[% IF fields.size %] [% IF fields.size %]
it controls the visibility of the following fields: it controls the visibility of the following fields:
[%+ fields.join(', ') FILTER html %]. [%+ fields.join(', ') FILTER html %].
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment