diff options
author | Byron Jones <bjones@mozilla.com> | 2013-07-24 10:18:47 +0200 |
---|---|---|
committer | Byron Jones <bjones@mozilla.com> | 2013-07-24 10:18:47 +0200 |
commit | 7585e73d0dddc9693e7b86fe39e14808d46048b1 (patch) | |
tree | 6c23dc5cf01719f2c889ded3bd4ddb52d35f8452 | |
parent | 3f1ae2270b7e6c95a222c09bbced49402c4637fc (diff) | |
download | bugzilla-7585e73d0dddc9693e7b86fe39e14808d46048b1.tar.gz bugzilla-7585e73d0dddc9693e7b86fe39e14808d46048b1.tar.xz |
Bug 533878: Allow relative date searches involving date/time custom fields
r=LpSolit, a=sgreen
-rw-r--r-- | Bugzilla/Search.pm | 54 | ||||
-rw-r--r-- | t/011pod.t | 1 |
2 files changed, 37 insertions, 18 deletions
diff --git a/Bugzilla/Search.pm b/Bugzilla/Search.pm index 7205f09c5..beca95ae1 100644 --- a/Bugzilla/Search.pm +++ b/Bugzilla/Search.pm @@ -322,20 +322,31 @@ use constant OPERATOR_FIELD_OVERRIDE => { # These are fields where special action is taken depending on the # *value* passed in to the chart, sometimes. -use constant SPECIAL_PARSING => { - # Pronoun Fields (Ones that can accept %user%, etc.) - assigned_to => \&_contact_pronoun, - cc => \&_contact_pronoun, - commenter => \&_contact_pronoun, - qa_contact => \&_contact_pronoun, - reporter => \&_contact_pronoun, - 'setters.login_name' => \&_contact_pronoun, - 'requestees.login_name' => \&_contact_pronoun, - - # Date Fields that accept the 1d, 1w, 1m, 1y, etc. format. - creation_ts => \&_timestamp_translate, - deadline => \&_timestamp_translate, - delta_ts => \&_timestamp_translate, +# This is a sub because custom fields are dynamic +sub SPECIAL_PARSING { + my $map = { + # Pronoun Fields (Ones that can accept %user%, etc.) + assigned_to => \&_contact_pronoun, + cc => \&_contact_pronoun, + commenter => \&_contact_pronoun, + qa_contact => \&_contact_pronoun, + reporter => \&_contact_pronoun, + 'setters.login_name' => \&_contact_pronoun, + 'requestees.login_name' => \&_contact_pronoun, + + # Date Fields that accept the 1d, 1w, 1m, 1y, etc. format. + creation_ts => \&_datetime_translate, + deadline => \&_date_translate, + delta_ts => \&_datetime_translate, + }; + foreach my $field (Bugzilla->active_custom_fields) { + if ($field->type == FIELD_TYPE_DATETIME) { + $map->{$field->name} = \&_datetime_translate; + } elsif ($field->type == FIELD_TYPE_DATE) { + $map->{$field->name} = \&_date_translate; + } + } + return $map; }; # Information about fields that represent "users", used by _user_nonchanged. @@ -2083,22 +2094,29 @@ sub _word_terms { ##################################### sub _timestamp_translate { - my ($self, $args) = @_; + my ($self, $ignore_time, $args) = @_; my $value = $args->{value}; my $dbh = Bugzilla->dbh; return if $value !~ /^(?:[\+\-]?\d+[hdwmy]s?|now)$/i; - # By default, the time is appended to the date, which we don't want - # for deadlines. $value = SqlifyDate($value); - if ($args->{field} eq 'deadline') { + # By default, the time is appended to the date, which we don't always want. + if ($ignore_time) { ($value) = split(/\s/, $value); } $args->{value} = $value; $args->{quoted} = $dbh->quote($value); } +sub _datetime_translate { + return shift->_timestamp_translate(0, @_); +} + +sub _date_translate { + return shift->_timestamp_translate(1, @_); +} + sub SqlifyDate { my ($str) = @_; my $fmt = "%Y-%m-%d %H:%M:%S"; diff --git a/t/011pod.t b/t/011pod.t index 92474d553..0ddd3059d 100644 --- a/t/011pod.t +++ b/t/011pod.t @@ -31,6 +31,7 @@ use constant SUB_WHITELIST => ( 'Bugzilla::Flag' => qr/^(?:(force_)?retarget|force_cleanup)$/, 'Bugzilla::FlagType' => qr/^sqlify_criteria$/, 'Bugzilla::JobQueue' => qr/(?:^work_once|subprocess_worker)$/, + 'Bugzilla::Search' => qr/^SPECIAL_PARSING$/, ); # These modules do not need to be documented, generally because they |