Fixes #2371 - Zammad misses "weeks" for relative time events
This commit is contained in:
parent
250d0bbd5e
commit
a6bbce9070
5 changed files with 91 additions and 90 deletions
|
@ -5,8 +5,10 @@ class App.UiElement.time_range
|
||||||
minute: __('Minute(s)')
|
minute: __('Minute(s)')
|
||||||
hour: __('Hour(s)')
|
hour: __('Hour(s)')
|
||||||
day: __('Day(s)')
|
day: __('Day(s)')
|
||||||
|
week: __('Week(s)'),
|
||||||
month: __('Month(s)')
|
month: __('Month(s)')
|
||||||
year: __('Year(s)')
|
year: __('Year(s)')
|
||||||
|
|
||||||
for key, value of ranges
|
for key, value of ranges
|
||||||
ranges[key] = App.i18n.translateInline(value)
|
ranges[key] = App.i18n.translateInline(value)
|
||||||
|
|
||||||
|
@ -17,6 +19,7 @@ class App.UiElement.time_range
|
||||||
minute: [1..120]
|
minute: [1..120]
|
||||||
hour: [1..48]
|
hour: [1..48]
|
||||||
day: [1..31]
|
day: [1..31]
|
||||||
|
week: [1..53]
|
||||||
month: [1..12]
|
month: [1..12]
|
||||||
year: [1..20]
|
year: [1..20]
|
||||||
|
|
||||||
|
|
|
@ -846,113 +846,29 @@ condition example
|
||||||
bind_params.push selector['value']
|
bind_params.push selector['value']
|
||||||
elsif selector['operator'] == 'within last (relative)'
|
elsif selector['operator'] == 'within last (relative)'
|
||||||
query += "#{attribute} BETWEEN ? AND ?"
|
query += "#{attribute} BETWEEN ? AND ?"
|
||||||
time = nil
|
time = range(selector).ago
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.ago
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.ago
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.ago
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.ago
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.ago
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
bind_params.push Time.zone.now
|
bind_params.push Time.zone.now
|
||||||
elsif selector['operator'] == 'within next (relative)'
|
elsif selector['operator'] == 'within next (relative)'
|
||||||
query += "#{attribute} BETWEEN ? AND ?"
|
query += "#{attribute} BETWEEN ? AND ?"
|
||||||
time = nil
|
time = range(selector).from_now
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.from_now
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.from_now
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.from_now
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.from_now
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.from_now
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push Time.zone.now
|
bind_params.push Time.zone.now
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
elsif selector['operator'] == 'before (relative)'
|
elsif selector['operator'] == 'before (relative)'
|
||||||
query += "#{attribute} <= ?"
|
query += "#{attribute} <= ?"
|
||||||
time = nil
|
time = range(selector).ago
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.ago
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.ago
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.ago
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.ago
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.ago
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
elsif selector['operator'] == 'after (relative)'
|
elsif selector['operator'] == 'after (relative)'
|
||||||
query += "#{attribute} >= ?"
|
query += "#{attribute} >= ?"
|
||||||
time = nil
|
time = range(selector).from_now
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.from_now
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.from_now
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.from_now
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.from_now
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.from_now
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
elsif selector['operator'] == 'till (relative)'
|
elsif selector['operator'] == 'till (relative)'
|
||||||
query += "#{attribute} <= ?"
|
query += "#{attribute} <= ?"
|
||||||
time = nil
|
time = range(selector).from_now
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.from_now
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.from_now
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.from_now
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.from_now
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.from_now
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
elsif selector['operator'] == 'from (relative)'
|
elsif selector['operator'] == 'from (relative)'
|
||||||
query += "#{attribute} >= ?"
|
query += "#{attribute} >= ?"
|
||||||
time = nil
|
time = range(selector).ago
|
||||||
case selector['range']
|
|
||||||
when 'minute'
|
|
||||||
time = selector['value'].to_i.minutes.ago
|
|
||||||
when 'hour'
|
|
||||||
time = selector['value'].to_i.hours.ago
|
|
||||||
when 'day'
|
|
||||||
time = selector['value'].to_i.days.ago
|
|
||||||
when 'month'
|
|
||||||
time = selector['value'].to_i.months.ago
|
|
||||||
when 'year'
|
|
||||||
time = selector['value'].to_i.years.ago
|
|
||||||
else
|
|
||||||
raise "Unknown selector attributes '#{selector.inspect}'"
|
|
||||||
end
|
|
||||||
bind_params.push time
|
bind_params.push time
|
||||||
else
|
else
|
||||||
raise "Invalid operator '#{selector['operator']}' for '#{selector['value'].inspect}'"
|
raise "Invalid operator '#{selector['operator']}' for '#{selector['value'].inspect}'"
|
||||||
|
@ -1349,6 +1265,12 @@ perform active triggers on ticket
|
||||||
[true, ticket, local_options]
|
[true, ticket, local_options]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.range(selector)
|
||||||
|
selector['value'].to_i.send(selector['range'].pluralize)
|
||||||
|
rescue
|
||||||
|
raise 'unknown selector'
|
||||||
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
get all email references headers of a ticket, to exclude some, parse it as array into method
|
get all email references headers of a ticket, to exclude some, parse it as array into method
|
||||||
|
@ -1883,4 +1805,5 @@ result
|
||||||
# blocked for 60 full days
|
# blocked for 60 full days
|
||||||
(user.preferences[:mail_delivery_failed_data].to_date - Time.zone.now.to_date).to_i + 61
|
(user.preferences[:mail_delivery_failed_data].to_date - Time.zone.now.to_date).to_i + 61
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -10318,6 +10318,10 @@ msgstr ""
|
||||||
msgid "Week"
|
msgid "Week"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: app/assets/javascripts/app/controllers/_ui_element/time_range.coffee
|
||||||
|
msgid "Week(s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee
|
#: app/assets/javascripts/app/controllers/_profile/linked_accounts.coffee
|
||||||
msgid "Weibo"
|
msgid "Weibo"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
69
spec/models/ticket/selector_2_sql_examples.rb
Normal file
69
spec/models/ticket/selector_2_sql_examples.rb
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.shared_examples 'TicketSelector2Sql' do
|
||||||
|
context 'when relative time range is selected in ticket selector' do
|
||||||
|
def get_condition(operator, range)
|
||||||
|
{
|
||||||
|
'ticket.created_at' => {
|
||||||
|
operator: operator,
|
||||||
|
range: range, # minute|hour|day|month|
|
||||||
|
value: '10',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
freeze_time
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is within last relative' do
|
||||||
|
condition = get_condition('within last (relative)', 'minute')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([10.minutes.ago, Time.zone.now])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is within next relative' do
|
||||||
|
condition = get_condition('within next (relative)', 'hour')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([Time.zone.now, 10.hours.from_now])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is before (relative)' do
|
||||||
|
condition = get_condition('before (relative)', 'day')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([10.days.ago])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is after (relative)' do
|
||||||
|
condition = get_condition('after (relative)', 'week')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([10.weeks.from_now])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is till (relative)' do
|
||||||
|
condition = get_condition('till (relative)', 'month')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([10.months.from_now])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'calculates proper time interval, when operator is from (relative)' do
|
||||||
|
condition = get_condition('from (relative)', 'year')
|
||||||
|
|
||||||
|
_, bind_params = Ticket.selector2sql(condition)
|
||||||
|
|
||||||
|
expect(bind_params).to eq([10.years.ago])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -17,6 +17,7 @@ require 'models/ticket/escalation_examples'
|
||||||
require 'models/ticket/resets_pending_time_seconds_examples'
|
require 'models/ticket/resets_pending_time_seconds_examples'
|
||||||
require 'models/ticket/sets_close_time_examples'
|
require 'models/ticket/sets_close_time_examples'
|
||||||
require 'models/ticket/sets_last_owner_update_time_examples'
|
require 'models/ticket/sets_last_owner_update_time_examples'
|
||||||
|
require 'models/ticket/selector_2_sql_examples'
|
||||||
|
|
||||||
RSpec.describe Ticket, type: :model do
|
RSpec.describe Ticket, type: :model do
|
||||||
subject(:ticket) { create(:ticket) }
|
subject(:ticket) { create(:ticket) }
|
||||||
|
@ -37,6 +38,7 @@ RSpec.describe Ticket, type: :model do
|
||||||
it_behaves_like 'TicketResetsPendingTimeSeconds'
|
it_behaves_like 'TicketResetsPendingTimeSeconds'
|
||||||
it_behaves_like 'TicketSetsCloseTime'
|
it_behaves_like 'TicketSetsCloseTime'
|
||||||
it_behaves_like 'TicketSetsLastOwnerUpdateTime'
|
it_behaves_like 'TicketSetsLastOwnerUpdateTime'
|
||||||
|
it_behaves_like 'TicketSelector2Sql'
|
||||||
|
|
||||||
describe 'Class methods:' do
|
describe 'Class methods:' do
|
||||||
describe '.selectors' do
|
describe '.selectors' do
|
||||||
|
|
Loading…
Reference in a new issue