Follow up for issue #2171 - Overview not showing unassigned tickets "if not defined" (e. g. for owner but also for select or input fields).
This commit is contained in:
parent
1306ca16a9
commit
cc326ad93b
3 changed files with 350 additions and 5 deletions
|
@ -465,7 +465,7 @@ condition example
|
||||||
value: '2015-10-17T06:00:00.000Z',
|
value: '2015-10-17T06:00:00.000Z',
|
||||||
},
|
},
|
||||||
'ticket.created_at' => {
|
'ticket.created_at' => {
|
||||||
operator: 'within next (relative)', # before,within,in,after
|
operator: 'within next (relative)', # within next, within last, after, before
|
||||||
range: 'day', # minute|hour|day|month|year
|
range: 'day', # minute|hour|day|month|year
|
||||||
value: '25',
|
value: '25',
|
||||||
},
|
},
|
||||||
|
@ -544,9 +544,12 @@ condition example
|
||||||
raise "Invalid selector #{selector_raw.inspect}" if !selector_raw.respond_to?(:key?)
|
raise "Invalid selector #{selector_raw.inspect}" if !selector_raw.respond_to?(:key?)
|
||||||
selector = selector_raw.stringify_keys
|
selector = selector_raw.stringify_keys
|
||||||
raise "Invalid selector, operator missing #{selector.inspect}" if !selector['operator']
|
raise "Invalid selector, operator missing #{selector.inspect}" if !selector['operator']
|
||||||
|
raise "Invalid selector, operator #{selector['operator']} is invalid #{selector.inspect}" if selector['operator'] !~ /^(is|is\snot|contains|contains\s(not|all|one|all\snot|one\snot)|(after|before)\s\(absolute\)|(within\snext|within\slast|after|before)\s\(relative\))$/
|
||||||
|
|
||||||
# validate value / allow blank but only if pre_condition exists and is not specific
|
# validate value / allow blank but only if pre_condition exists and is not specific
|
||||||
if !selector.key?('value') || ((selector['value'].class == String || selector['value'].class == Array) && (selector['value'].respond_to?(:blank?) && selector['value'].blank?))
|
if !selector.key?('value') ||
|
||||||
|
(selector['value'].class == Array && selector['value'].respond_to?(:blank?) && selector['value'].blank?) ||
|
||||||
|
(selector['operator'] =~ /^contains/ && selector['value'].respond_to?(:blank?) && selector['value'].blank?)
|
||||||
return nil if selector['pre_condition'].nil?
|
return nil if selector['pre_condition'].nil?
|
||||||
return nil if selector['pre_condition'].respond_to?(:blank?) && selector['pre_condition'].blank?
|
return nil if selector['pre_condition'].respond_to?(:blank?) && selector['pre_condition'].blank?
|
||||||
return nil if selector['pre_condition'] == 'specific'
|
return nil if selector['pre_condition'] == 'specific'
|
||||||
|
@ -598,10 +601,18 @@ condition example
|
||||||
if selector['value'].nil?
|
if selector['value'].nil?
|
||||||
query += "#{attribute} IS NULL"
|
query += "#{attribute} IS NULL"
|
||||||
else
|
else
|
||||||
query += "#{attribute} IN (?)"
|
|
||||||
if attributes[1] == 'out_of_office_replacement_id'
|
if attributes[1] == 'out_of_office_replacement_id'
|
||||||
|
query += "#{attribute} IN (?)"
|
||||||
bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id)
|
bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id)
|
||||||
else
|
else
|
||||||
|
if selector['value'].class != Array
|
||||||
|
selector['value'] = [selector['value']]
|
||||||
|
end
|
||||||
|
query += if selector['value'].include?('')
|
||||||
|
"(#{attribute} IN (?) OR #{attribute} IS NULL)"
|
||||||
|
else
|
||||||
|
"#{attribute} IN (?)"
|
||||||
|
end
|
||||||
bind_params.push selector['value']
|
bind_params.push selector['value']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -631,10 +642,18 @@ condition example
|
||||||
if selector['value'].nil?
|
if selector['value'].nil?
|
||||||
query += "#{attribute} IS NOT NULL"
|
query += "#{attribute} IS NOT NULL"
|
||||||
else
|
else
|
||||||
query += "(#{attribute} IS NULL OR #{attribute} NOT IN (?))"
|
|
||||||
if attributes[1] == 'out_of_office_replacement_id'
|
if attributes[1] == 'out_of_office_replacement_id'
|
||||||
bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id)
|
bind_params.push User.find(selector['value']).out_of_office_agent_of.pluck(:id)
|
||||||
|
query += "(#{attribute} IS NULL OR #{attribute} NOT IN (?))"
|
||||||
else
|
else
|
||||||
|
if selector['value'].class != Array
|
||||||
|
selector['value'] = [selector['value']]
|
||||||
|
end
|
||||||
|
query += if selector['value'].include?('')
|
||||||
|
"(#{attribute} IS NOT NULL AND #{attribute} NOT IN (?))"
|
||||||
|
else
|
||||||
|
"(#{attribute} IS NULL OR #{attribute} NOT IN (?))"
|
||||||
|
end
|
||||||
bind_params.push selector['value']
|
bind_params.push selector['value']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -913,4 +913,331 @@ class ObjectManagerTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test 'overview any owner / no owner is set' do
|
||||||
|
|
||||||
|
group = Group.create!(
|
||||||
|
name: 'OverviewTest',
|
||||||
|
updated_at: '2015-02-05 16:37:00',
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
roles = Role.where(name: 'Agent')
|
||||||
|
agent1 = User.create!(
|
||||||
|
login: 'ticket-overview-agent1@example.com',
|
||||||
|
firstname: 'Overview',
|
||||||
|
lastname: 'Agent1',
|
||||||
|
email: 'ticket-overview-agent1@example.com',
|
||||||
|
password: 'agentpw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
groups: [group],
|
||||||
|
updated_at: '2015-02-05 16:37:00',
|
||||||
|
updated_by_id: 1,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
attribute1 = ObjectManager::Attribute.add(
|
||||||
|
object: 'Ticket',
|
||||||
|
name: 'watcher',
|
||||||
|
display: 'watcher',
|
||||||
|
data_type: 'select',
|
||||||
|
data_option: {
|
||||||
|
default: '',
|
||||||
|
maxlength: 200,
|
||||||
|
type: 'text',
|
||||||
|
null: true,
|
||||||
|
options: {
|
||||||
|
aa: 'agent a',
|
||||||
|
bb: 'agent b',
|
||||||
|
cc: 'agent c',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
active: true,
|
||||||
|
screens: {},
|
||||||
|
position: 20,
|
||||||
|
created_by_id: 1,
|
||||||
|
updated_by_id: 1,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(true, ObjectManager::Attribute.pending_migration?)
|
||||||
|
assert_equal(1, ObjectManager::Attribute.migrations.count)
|
||||||
|
|
||||||
|
assert(ObjectManager::Attribute.migration_execute)
|
||||||
|
|
||||||
|
Ticket.destroy_all
|
||||||
|
Overview.destroy_all
|
||||||
|
|
||||||
|
UserInfo.current_user_id = 1
|
||||||
|
overview_role = Role.find_by(name: 'Agent')
|
||||||
|
overview1 = Overview.create!(
|
||||||
|
name: 'not watched',
|
||||||
|
prio: 1000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is',
|
||||||
|
value: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview2 = Overview.create!(
|
||||||
|
name: 'not watched by somebody',
|
||||||
|
prio: 2000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is not',
|
||||||
|
value: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview3 = Overview.create!(
|
||||||
|
name: 'not watched as array',
|
||||||
|
prio: 3000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is',
|
||||||
|
value: [''],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview4 = Overview.create!(
|
||||||
|
name: 'not watched by somebody as array',
|
||||||
|
prio: 4000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is not',
|
||||||
|
value: [''],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview5 = Overview.create!(
|
||||||
|
name: 'watched by aa',
|
||||||
|
prio: 5000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is',
|
||||||
|
value: 'aa',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview6 = Overview.create!(
|
||||||
|
name: 'not watched by aa',
|
||||||
|
prio: 6000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is not',
|
||||||
|
value: 'aa',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview7 = Overview.create!(
|
||||||
|
name: 'watched by aa array',
|
||||||
|
prio: 7000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is',
|
||||||
|
value: ['aa'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
overview8 = Overview.create!(
|
||||||
|
name: 'not watched by aa array',
|
||||||
|
prio: 8000,
|
||||||
|
role_ids: [overview_role.id],
|
||||||
|
condition: {
|
||||||
|
'ticket.watcher' => {
|
||||||
|
operator: 'is not',
|
||||||
|
value: ['aa'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
order: {
|
||||||
|
by: 'created_at',
|
||||||
|
direction: 'ASC',
|
||||||
|
},
|
||||||
|
view: {
|
||||||
|
d: %w[title customer group created_at],
|
||||||
|
s: %w[title customer group created_at],
|
||||||
|
m: %w[number title customer group created_at],
|
||||||
|
view_mode_default: 's',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
ticket1 = Ticket.create!(
|
||||||
|
title: 'overview test 1',
|
||||||
|
group: Group.lookup(name: 'OverviewTest'),
|
||||||
|
customer_id: 2,
|
||||||
|
owner_id: 1,
|
||||||
|
watcher: '',
|
||||||
|
state: Ticket::State.lookup(name: 'new'),
|
||||||
|
priority: Ticket::Priority.lookup(name: '2 normal'),
|
||||||
|
)
|
||||||
|
|
||||||
|
travel 2.seconds
|
||||||
|
ticket2 = Ticket.create!(
|
||||||
|
title: 'overview test 2',
|
||||||
|
group: Group.lookup(name: 'OverviewTest'),
|
||||||
|
customer_id: 2,
|
||||||
|
owner_id: nil,
|
||||||
|
watcher: nil,
|
||||||
|
state: Ticket::State.lookup(name: 'new'),
|
||||||
|
priority: Ticket::Priority.lookup(name: '2 normal'),
|
||||||
|
)
|
||||||
|
|
||||||
|
travel 2.seconds
|
||||||
|
ticket3 = Ticket.create!(
|
||||||
|
title: 'overview test 3',
|
||||||
|
group: Group.lookup(name: 'OverviewTest'),
|
||||||
|
customer_id: 2,
|
||||||
|
owner_id: agent1.id,
|
||||||
|
watcher: 'aa',
|
||||||
|
state: Ticket::State.lookup(name: 'new'),
|
||||||
|
priority: Ticket::Priority.lookup(name: '2 normal'),
|
||||||
|
)
|
||||||
|
|
||||||
|
result = Ticket::Overviews.index(agent1)
|
||||||
|
assert_equal(result[0][:overview][:id], overview1.id)
|
||||||
|
assert_equal(result[0][:overview][:name], 'not watched')
|
||||||
|
assert_equal(result[0][:overview][:view], 'not_watched')
|
||||||
|
assert_equal(result[0][:tickets].class, Array)
|
||||||
|
assert_equal(result[0][:tickets][0][:id], ticket1.id)
|
||||||
|
assert_equal(result[0][:tickets][1][:id], ticket2.id)
|
||||||
|
assert_equal(result[0][:count], 2)
|
||||||
|
|
||||||
|
assert_equal(result[1][:overview][:id], overview2.id)
|
||||||
|
assert_equal(result[1][:overview][:name], 'not watched by somebody')
|
||||||
|
assert_equal(result[1][:overview][:view], 'not_watched_by_somebody')
|
||||||
|
assert_equal(result[1][:tickets].class, Array)
|
||||||
|
assert_equal(result[1][:tickets][0][:id], ticket3.id)
|
||||||
|
assert_equal(result[1][:count], 1)
|
||||||
|
|
||||||
|
assert_equal(result[2][:overview][:id], overview3.id)
|
||||||
|
assert_equal(result[2][:overview][:name], 'not watched as array')
|
||||||
|
assert_equal(result[2][:overview][:view], 'not_watched_as_array')
|
||||||
|
assert_equal(result[2][:tickets].class, Array)
|
||||||
|
assert_equal(result[2][:tickets][0][:id], ticket1.id)
|
||||||
|
assert_equal(result[2][:tickets][1][:id], ticket2.id)
|
||||||
|
assert_equal(result[2][:count], 2)
|
||||||
|
|
||||||
|
assert_equal(result[3][:overview][:id], overview4.id)
|
||||||
|
assert_equal(result[3][:overview][:name], 'not watched by somebody as array')
|
||||||
|
assert_equal(result[3][:overview][:view], 'not_watched_by_somebody_as_array')
|
||||||
|
assert_equal(result[3][:tickets].class, Array)
|
||||||
|
assert_equal(result[3][:tickets][0][:id], ticket3.id)
|
||||||
|
assert_equal(result[3][:count], 1)
|
||||||
|
|
||||||
|
assert_equal(result[4][:overview][:id], overview5.id)
|
||||||
|
assert_equal(result[4][:overview][:name], 'watched by aa')
|
||||||
|
assert_equal(result[4][:overview][:view], 'watched_by_aa')
|
||||||
|
assert_equal(result[4][:tickets].class, Array)
|
||||||
|
assert_equal(result[4][:tickets][0][:id], ticket3.id)
|
||||||
|
assert_equal(result[4][:count], 1)
|
||||||
|
|
||||||
|
assert_equal(result[5][:overview][:id], overview6.id)
|
||||||
|
assert_equal(result[5][:overview][:name], 'not watched by aa')
|
||||||
|
assert_equal(result[5][:overview][:view], 'not_watched_by_aa')
|
||||||
|
assert_equal(result[5][:tickets].class, Array)
|
||||||
|
assert_equal(result[5][:tickets][0][:id], ticket1.id)
|
||||||
|
assert_equal(result[5][:tickets][1][:id], ticket2.id)
|
||||||
|
assert_equal(result[5][:count], 2)
|
||||||
|
|
||||||
|
assert_equal(result[6][:overview][:id], overview7.id)
|
||||||
|
assert_equal(result[6][:overview][:name], 'watched by aa array')
|
||||||
|
assert_equal(result[6][:overview][:view], 'watched_by_aa_array')
|
||||||
|
assert_equal(result[6][:tickets].class, Array)
|
||||||
|
assert_equal(result[6][:tickets][0][:id], ticket3.id)
|
||||||
|
assert_equal(result[6][:count], 1)
|
||||||
|
|
||||||
|
assert_equal(result[7][:overview][:id], overview8.id)
|
||||||
|
assert_equal(result[7][:overview][:name], 'not watched by aa array')
|
||||||
|
assert_equal(result[7][:overview][:view], 'not_watched_by_aa_array')
|
||||||
|
assert_equal(result[7][:tickets].class, Array)
|
||||||
|
assert_equal(result[7][:tickets][0][:id], ticket1.id)
|
||||||
|
assert_equal(result[7][:tickets][1][:id], ticket2.id)
|
||||||
|
assert_equal(result[7][:count], 2)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -207,7 +207,6 @@ class TicketSelectorTest < ActiveSupport::TestCase
|
||||||
},
|
},
|
||||||
'ticket.state_id' => {
|
'ticket.state_id' => {
|
||||||
operator: 'is',
|
operator: 'is',
|
||||||
value: '',
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue