]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 371995: Allow the Product field to restrict visibility of custom fields
authormkanat%bugzilla.org <>
Sun, 8 Feb 2009 19:42:19 +0000 (19:42 +0000)
committermkanat%bugzilla.org <>
Sun, 8 Feb 2009 19:42:19 +0000 (19:42 +0000)
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=LpSolit, a=mkanat

Bugzilla/Field.pm
Bugzilla/Field/Choice.pm
Bugzilla/Product.pm
enter_bug.cgi
template/en/default/admin/custom_fields/cf-js.js.tmpl
template/en/default/bug/edit.html.tmpl
template/en/default/bug/field.html.tmpl
template/en/default/global/user-error.html.tmpl

index 91e9bb8b40a5351850681445ce7f73df6e577629..1cc89239e62b1e53b216e6fb6cf9b10305f2c26f 100644 (file)
@@ -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,
index 9e8fb123581e3032f74814dd12077c1b23a51dee..00fa52f9930d486f3ccf4888c1e6aef45403f9db 100644 (file)
@@ -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();
 }
 
 
index 396aaa346704b9ac1a670d745100cee0a3993627..88292d27e1af8629cb9508d44ad0106ce83124f6 100644 (file)
@@ -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         ####
 ###############################
index ef0314bcafaf4669cf67ab95e259db5a77b618f6..f028187fd8075e21ab26217b2c5035f087242ccf 100755 (executable)
@@ -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;
index 891f5da7641782cab6e7f012af181b6435254dc4..89a8529ed66fe861429677f5e62ed43000646394 100644 (file)
@@ -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 %]
index 80c5745fcef6a103313227ea5d12c5af74f0e24d..527766357a436254f13b30343c8f8616bd7c1944 100644 (file)
     [%#############%]
     [%#  PRODUCT  #%]
     [%#############%]
+    
     <tr>
-      <td class="field_label">
-        <label for="product" accesskey="p"><b><u>P</u>roduct</b></label>:
-      </td>
-      [% 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) %]
     </tr>
     [%###############%]    
     [%#  Component  #%]
index 04443579eb138b966df11ad42d26d899e0ca8344..3ae7302c6db7d326585c9dfe288d5637fbe46b37 100644 (file)
   #               the field value.
   #   no_tds: boolean; if true, don't display the label <th> or the 
   #           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 
   #                   with default field values being displayed on a page.
   #%]
     [% IF editable %]
       <label for="[% field.name FILTER html %]">
     [% 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 %]">
       [% END -%]
         [% field_descs.${field.name} FILTER html %]:
-      [%- IF !field.custom %]
-        </a>
-      [% END %]
+      [%- '</a>' IF (!field.custom || desc_url) %]
     [% '</label>' IF editable %]
   </th>
 [% END %]
index 1efee9a5e5549cdaefab6c6dca05b2e42cd9b9a5..570cdc6fec764d24db47f5ca166853e055d57e47 100644 (file)
 
   [% 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 %].