Bug 801664 - Add DATE type for custom fields. r=LpSolit.
git-svn-id: svn://10.0.0.236/trunk@264616 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
d7fb30d846
commit
57271ffebb
@ -1 +1 @@
|
||||
8543
|
||||
8544
|
||||
@ -146,6 +146,9 @@ sub VALIDATORS {
|
||||
elsif ($field->type == FIELD_TYPE_DATETIME) {
|
||||
$validator = \&_check_datetime_field;
|
||||
}
|
||||
elsif ($field->type == FIELD_TYPE_DATE) {
|
||||
$validator = \&_check_date_field;
|
||||
}
|
||||
elsif ($field->type == FIELD_TYPE_FREETEXT) {
|
||||
$validator = \&_check_freetext_field;
|
||||
}
|
||||
@ -233,7 +236,9 @@ use constant NUMERIC_COLUMNS => qw(
|
||||
);
|
||||
|
||||
sub DATE_COLUMNS {
|
||||
my @fields = @{ Bugzilla->fields({ type => FIELD_TYPE_DATETIME }) };
|
||||
my @fields = (@{ Bugzilla->fields({ type => [FIELD_TYPE_DATETIME,
|
||||
FIELD_TYPE_DATE] })
|
||||
});
|
||||
return map { $_->name } @fields;
|
||||
}
|
||||
|
||||
@ -1983,8 +1988,13 @@ sub _check_field_is_mandatory {
|
||||
}
|
||||
}
|
||||
|
||||
sub _check_date_field {
|
||||
my ($invocant, $date) = @_;
|
||||
return _check_datetime_field($invocant, $date, 1);
|
||||
}
|
||||
|
||||
sub _check_datetime_field {
|
||||
my ($invocant, $date_time) = @_;
|
||||
my ($invocant, $date_time, $date_only) = @_;
|
||||
|
||||
# Empty datetimes are empty strings or strings only containing
|
||||
# 0's, whitespace, and punctuation.
|
||||
@ -1998,6 +2008,10 @@ sub _check_datetime_field {
|
||||
ThrowUserError('illegal_date', { date => $date,
|
||||
format => 'YYYY-MM-DD' });
|
||||
}
|
||||
if ($time && $date_only) {
|
||||
ThrowUserError('illegal_date', { date => $date_time,
|
||||
format => 'YYYY-MM-DD' });
|
||||
}
|
||||
if ($time && !validate_time($time)) {
|
||||
ThrowUserError('illegal_time', { 'time' => $time,
|
||||
format => 'HH:MM:SS' });
|
||||
|
||||
@ -104,10 +104,12 @@ use Memoize;
|
||||
FIELD_TYPE_MULTI_SELECT
|
||||
FIELD_TYPE_TEXTAREA
|
||||
FIELD_TYPE_DATETIME
|
||||
FIELD_TYPE_DATE
|
||||
FIELD_TYPE_BUG_ID
|
||||
FIELD_TYPE_BUG_URLS
|
||||
FIELD_TYPE_KEYWORDS
|
||||
|
||||
FIELD_TYPE_HIGHEST_PLUS_ONE
|
||||
|
||||
EMPTY_DATETIME_REGEX
|
||||
|
||||
ABNORMAL_SELECTS
|
||||
@ -385,6 +387,10 @@ use constant FIELD_TYPE_DATETIME => 5;
|
||||
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;
|
||||
# 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 EMPTY_DATETIME_REGEX => qr/^[0\-:\sA-Za-z]+$/;
|
||||
|
||||
|
||||
@ -106,7 +106,7 @@ sub _initialize {
|
||||
LONGBLOB => 'longblob',
|
||||
|
||||
DATETIME => 'datetime',
|
||||
|
||||
DATE => 'date',
|
||||
};
|
||||
|
||||
$self->_adjust_schema;
|
||||
|
||||
@ -56,7 +56,7 @@ sub _initialize {
|
||||
LONGBLOB => 'blob',
|
||||
|
||||
DATETIME => 'date',
|
||||
|
||||
DATE => 'date',
|
||||
};
|
||||
|
||||
$self->_adjust_schema;
|
||||
|
||||
@ -66,7 +66,7 @@ sub _initialize {
|
||||
LONGBLOB => 'bytea',
|
||||
|
||||
DATETIME => 'timestamp(0) without time zone',
|
||||
|
||||
DATE => 'date',
|
||||
};
|
||||
|
||||
$self->_adjust_schema;
|
||||
|
||||
@ -46,6 +46,7 @@ sub _initialize {
|
||||
LONGBLOB => 'blob',
|
||||
|
||||
DATETIME => 'DATETIME',
|
||||
DATE => 'DATETIME',
|
||||
};
|
||||
|
||||
$self->_adjust_schema;
|
||||
|
||||
@ -151,6 +151,7 @@ use constant SQL_DEFINITIONS => {
|
||||
FIELD_TYPE_TEXTAREA, { TYPE => 'MEDIUMTEXT',
|
||||
NOTNULL => 1, DEFAULT => "''"},
|
||||
FIELD_TYPE_DATETIME, { TYPE => 'DATETIME' },
|
||||
FIELD_TYPE_DATE, { TYPE => 'DATE' },
|
||||
FIELD_TYPE_BUG_ID, { TYPE => 'INT3' },
|
||||
};
|
||||
|
||||
@ -349,9 +350,7 @@ sub _check_sortkey {
|
||||
sub _check_type {
|
||||
my ($invocant, $type, undef, $params) = @_;
|
||||
my $saved_type = $type;
|
||||
# The constant here should be updated every time a new,
|
||||
# higher field type is added.
|
||||
(detaint_natural($type) && $type <= FIELD_TYPE_KEYWORDS)
|
||||
(detaint_natural($type) && $type < FIELD_TYPE_HIGHEST_PLUS_ONE)
|
||||
|| ThrowCodeError('invalid_customfield_type', { type => $saved_type });
|
||||
|
||||
my $custom = blessed($invocant) ? $invocant->custom : $params->{custom};
|
||||
@ -952,7 +951,10 @@ sub remove_from_db {
|
||||
}
|
||||
else {
|
||||
$bugs_query = "SELECT COUNT(*) FROM bugs WHERE $name IS NOT NULL";
|
||||
if ($self->type != FIELD_TYPE_BUG_ID && $self->type != FIELD_TYPE_DATETIME) {
|
||||
if ($self->type != FIELD_TYPE_BUG_ID
|
||||
&& $self->type != FIELD_TYPE_DATE
|
||||
&& $self->type != FIELD_TYPE_DATETIME)
|
||||
{
|
||||
$bugs_query .= " AND $name != ''";
|
||||
}
|
||||
# Ignore the default single select value
|
||||
|
||||
@ -447,8 +447,11 @@ sub translate_value {
|
||||
}
|
||||
|
||||
my $field_obj = $self->bug_fields->{$field};
|
||||
if ($field eq 'creation_ts' or $field eq 'delta_ts'
|
||||
or ($field_obj and $field_obj->type == FIELD_TYPE_DATETIME))
|
||||
if ($field eq 'creation_ts'
|
||||
or $field eq 'delta_ts'
|
||||
or ($field_obj and
|
||||
($field_obj->type == FIELD_TYPE_DATETIME
|
||||
or $field_obj->type == FIELD_TYPE_DATE)))
|
||||
{
|
||||
$value = trim($value);
|
||||
return undef if !$value;
|
||||
|
||||
@ -108,6 +108,7 @@ use Storable qw(dclone);
|
||||
|
||||
# When doing searches, NULL datetimes are treated as this date.
|
||||
use constant EMPTY_DATETIME => '1970-01-01 00:00:00';
|
||||
use constant EMPTY_DATE => '1970-01-01';
|
||||
|
||||
# This is the regex for real numbers from Regexp::Common, modified to be
|
||||
# more readable.
|
||||
@ -310,6 +311,7 @@ use constant OPERATOR_FIELD_OVERRIDE => {
|
||||
FIELD_TYPE_FREETEXT, { _non_changed => \&_nullable },
|
||||
FIELD_TYPE_BUG_ID, { _non_changed => \&_nullable_int },
|
||||
FIELD_TYPE_DATETIME, { _non_changed => \&_nullable_datetime },
|
||||
FIELD_TYPE_DATE, { _non_changed => \&_nullable_date },
|
||||
FIELD_TYPE_TEXTAREA, { _non_changed => \&_nullable },
|
||||
FIELD_TYPE_MULTI_SELECT, MULTI_SELECT_OVERRIDE,
|
||||
FIELD_TYPE_BUG_URLS, MULTI_SELECT_OVERRIDE,
|
||||
@ -2511,6 +2513,13 @@ sub _nullable_datetime {
|
||||
$args->{full_field} = "COALESCE($field, $empty)";
|
||||
}
|
||||
|
||||
sub _nullable_date {
|
||||
my ($self, $args) = @_;
|
||||
my $field = $args->{full_field};
|
||||
my $empty = Bugzilla->dbh->quote(EMPTY_DATE);
|
||||
$args->{full_field} = "COALESCE($field, $empty)";
|
||||
}
|
||||
|
||||
sub _deadline {
|
||||
my ($self, $args) = @_;
|
||||
my $field = $args->{full_field};
|
||||
|
||||
@ -929,7 +929,9 @@ sub _bug_to_hash {
|
||||
if ($field->type == FIELD_TYPE_BUG_ID) {
|
||||
$item{$name} = $self->type('int', $bug->$name);
|
||||
}
|
||||
elsif ($field->type == FIELD_TYPE_DATETIME) {
|
||||
elsif ($field->type == FIELD_TYPE_DATETIME
|
||||
|| $field->type == FIELD_TYPE_DATE)
|
||||
{
|
||||
$item{$name} = $self->type('dateTime', $bug->$name);
|
||||
}
|
||||
elsif ($field->type == FIELD_TYPE_MULTI_SELECT) {
|
||||
|
||||
@ -1023,6 +1023,15 @@ sub process_bug {
|
||||
push(@query, $custom_field);
|
||||
push(@values, $value);
|
||||
}
|
||||
} elsif ($field->type == FIELD_TYPE_DATE) {
|
||||
eval { $value = Bugzilla::Bug->_check_date_field($value); };
|
||||
if ($@) {
|
||||
$err .= "Skipping illegal value \"$value\" in $custom_field.\n" ;
|
||||
}
|
||||
else {
|
||||
push(@query, $custom_field);
|
||||
push(@values, $value);
|
||||
}
|
||||
} else {
|
||||
$err .= "Type of custom field $custom_field is an unhandled FIELD_TYPE: " .
|
||||
$field->type . "\n";
|
||||
|
||||
@ -41,8 +41,9 @@
|
||||
value="[% value FILTER html %]" size="40"
|
||||
maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
|
||||
[% ' aria-required="true"' IF field.is_mandatory %]>
|
||||
[% CASE constants.FIELD_TYPE_DATETIME %]
|
||||
<input name="[% field.name FILTER html %]" size="20"
|
||||
[% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
|
||||
[% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %]
|
||||
<input name="[% field.name FILTER html %]" size="[% size FILTER none %]"
|
||||
id="[% field.name FILTER html %]"
|
||||
value="[% value FILTER html %]"
|
||||
[% ' aria-required="true"' IF field.is_mandatory %]
|
||||
|
||||
@ -43,6 +43,7 @@
|
||||
${constants.FIELD_TYPE_MULTI_SELECT} => "Multiple-Selection Box",
|
||||
${constants.FIELD_TYPE_TEXTAREA} => "Large Text Box",
|
||||
${constants.FIELD_TYPE_DATETIME} => "Date/Time",
|
||||
${constants.FIELD_TYPE_DATE} => "Date",
|
||||
${constants.FIELD_TYPE_BUG_ID} => "$terms.Bug ID",
|
||||
} %]
|
||||
|
||||
|
||||
@ -52,7 +52,7 @@
|
||||
YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
|
||||
'[% field.name FILTER js %]_autocomplete');
|
||||
</script>
|
||||
[% CASE constants.FIELD_TYPE_DATETIME %]
|
||||
[% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %]
|
||||
[% INCLUDE "bug/field-label.html.tmpl"
|
||||
field = field
|
||||
tag_name = "span"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user