]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 466178 - Add an INTEGER custom field type
authorSimon Green <sgreen@redhat.com>
Wed, 26 Feb 2014 22:33:45 +0000 (08:33 +1000)
committerSimon Green <sgreen@redhat.com>
Wed, 26 Feb 2014 22:33:45 +0000 (08:33 +1000)
r=glob, a=justdave

Bugzilla/Bug.pm
Bugzilla/Constants.pm
Bugzilla/Field.pm
template/en/default/bug/field.html.tmpl
template/en/default/global/field-descs.none.tmpl
template/en/default/global/user-error.html.tmpl

index dd22426bbd0e9bbc249d8aa047cd42c7c89c3c78..a6347cb2ee29f4d028d34809769547fdfe0a3094 100644 (file)
@@ -158,6 +158,9 @@ sub VALIDATORS {
         elsif ($field->type == FIELD_TYPE_TEXTAREA) {
             $validator = \&_check_textarea_field;
         }
+        elsif ($field->type == FIELD_TYPE_INTEGER) {
+            $validator = \&_check_integer_field;
+        }
         else {
             $validator = \&_check_default_field;
         }
@@ -2110,6 +2113,27 @@ sub _check_textarea_field {
     return $text;
 }
 
+sub _check_integer_field {
+    my ($invocant, $value, $field) = @_;
+    $value = defined($value) ? trim($value) : '';
+
+    if ($value eq '') {
+        return 0;
+    }
+
+    my $orig_value = $value;
+    if (!detaint_signed($value)) {
+        ThrowUserError("number_not_integer",
+                       {field => $field, num => $orig_value});
+    }
+    elsif ($value > MAX_INT_32) {
+        ThrowUserError("number_too_large",
+                       {field => $field, num => $orig_value, max_num => MAX_INT_32});
+    }
+
+    return $value;
+}
+
 sub _check_relationship_loop {
     # Generates a dependency tree for a given bug.  Calls itself recursively
     # to generate sub-trees for the bug's dependencies.
index 7154d45361841661297bfaec9226951f4014ca9e..a296e2e25182b90c2c0f3469024862551ebbed96 100644 (file)
@@ -111,8 +111,9 @@ use Memoize;
     FIELD_TYPE_BUG_ID
     FIELD_TYPE_BUG_URLS
     FIELD_TYPE_KEYWORDS
+    FIELD_TYPE_INTEGER
     FIELD_TYPE_HIGHEST_PLUS_ONE
-    
+
     EMPTY_DATETIME_REGEX
 
     ABNORMAL_SELECTS
@@ -398,9 +399,10 @@ use constant FIELD_TYPE_BUG_ID  => 6;
 use constant FIELD_TYPE_BUG_URLS => 7;
 use constant FIELD_TYPE_KEYWORDS => 8;
 use constant FIELD_TYPE_DATE => 9;
+use constant FIELD_TYPE_INTEGER => 10;
 # Add new field types above this line, and change the below value in the
 # obvious fashion
-use constant FIELD_TYPE_HIGHEST_PLUS_ONE => 10;
+use constant FIELD_TYPE_HIGHEST_PLUS_ONE => 11;
 
 use constant EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/; 
 
index dce16f83b9d89afc6140353300989ba4cba7e914..fd71cc3213353f232d9271d95f30f6bf85610192 100644 (file)
@@ -153,6 +153,7 @@ use constant SQL_DEFINITIONS => {
     FIELD_TYPE_DATETIME,      { TYPE => 'DATETIME'   },
     FIELD_TYPE_DATE,          { TYPE => 'DATE'       },
     FIELD_TYPE_BUG_ID,        { TYPE => 'INT3'       },
+    FIELD_TYPE_INTEGER,       { TYPE => 'INT4',  NOTNULL => 1, DEFAULT => 0 },
 };
 
 # Field definitions for the fields that ship with Bugzilla.
index 0ef19c1c43cb83ca82d0eec02e2c6bb85017ba8c..f8612eebbf60c5dfbbeb7c885889c1d04ebbc8b1 100644 (file)
 [% Hook.process('start_field_column') %]
 [% IF editable %]
   [% SWITCH field.type %]
-    [% CASE constants.FIELD_TYPE_FREETEXT %]
+    [% CASE [ constants.FIELD_TYPE_FREETEXT
+              constants.FIELD_TYPE_INTEGER ] %]
         <input id="[% field.name FILTER html %]" class="text_input"
                name="[% field.name FILTER html %]"
                value="[% value FILTER html %]" size="40"
                maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
+               [% ' pattern="\d+"' IF field.type == constants.FIELD_TYPE_INTEGER %]
                [% ' aria-required="true"' IF field.is_mandatory %]>
     [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
       [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %]
index 34c4dc9eda3a75d655e00eba8cafa039c227b946..2afabd0c66d2b2405f1cc075af5cc05981207cec 100644 (file)
@@ -41,6 +41,7 @@
 
 [% field_types = { ${constants.FIELD_TYPE_UNKNOWN}       => "Unknown Type",
                    ${constants.FIELD_TYPE_FREETEXT}      => "Free Text",
+                   ${constants.FIELD_TYPE_INTEGER}       => "Integer",
                    ${constants.FIELD_TYPE_SINGLE_SELECT} => "Drop Down",
                    ${constants.FIELD_TYPE_MULTI_SELECT}  => "Multiple-Selection Box",
                    ${constants.FIELD_TYPE_TEXTAREA}      => "Large Text Box",
index d7648320cdf836f4f192d2e7119c0d388ec5bfa0..11d4f8ad1dd9734223e11d8ad34fc05fd6f94e6e 100644 (file)
     Either no products have been defined to enter [% terms.bugs %] against or you have not
     been given access to any.
 
+  [% ELSIF error == "number_not_integer" %]
+    [% title = "Integer Value Required" %]
+    The value '[% num FILTER html %]' in the
+    <em>[% field_descs.$field FILTER html %]</em> field
+    is not an integer value (i.e. a whole number).
+
   [% ELSIF error == "number_not_numeric" %]
     [% title = "Numeric Value Required" %]
     The value '[% num FILTER html %]' in the