Improved ticket selector again. Added precondition attribute for user/org selection.

This commit is contained in:
Martin Edenhofer 2015-10-14 16:33:26 +02:00
parent 51250e786d
commit 8d5f1092f8
13 changed files with 653 additions and 118 deletions

View file

@ -226,67 +226,6 @@ class App.ControllerForm extends App.Controller
if App.UiElement[attribute.tag] if App.UiElement[attribute.tag]
item = App.UiElement[attribute.tag].render(attribute, @params, @) item = App.UiElement[attribute.tag].render(attribute, @params, @)
###
else if key is 'tickets.owner_id' || key is 'tickets.customer_id'
display = 'Owner'
name = 'owner_id'
if key is 'customer_id'
display = 'Customer'
name = 'customer_id'
attribute_config = {
name: attribute.name + '::tickets.' + name
display: display
tag: 'select'
multiple: true
null: false
nulloption: false
relation: 'User'
value: value || null
remove: true
filter: ( all, type ) ->
return all if type isnt 'collection'
all = _.filter( all, (item) ->
return if item.id is 1
return item
)
all.unshift( {
id: ''
name: '--'
} )
all.unshift( {
id: 1
name: '*** not set ***'
} )
all.unshift( {
id: 'current_user.id'
name: '*** current user ***'
} )
all
}
else if key is 'tickets.organization_id'
attribute_config = {
name: attribute.name + '::tickets.organization_id'
display: 'Organization'
tag: 'select'
multiple: true
null: false
nulloption: false
relation: 'Organization'
value: value || null
remove: true
filter: ( all, type ) ->
return all if type isnt 'collection'
all.unshift( {
id: ''
name: '--'
} )
all.unshift( {
id: 'current_user.organization_id'
name: '*** organization of current user ***'
} )
all
}
###
else else
throw "Invalid UiElement.#{attribute.tag}" throw "Invalid UiElement.#{attribute.tag}"

View file

@ -1,17 +1,18 @@
# coffeelint: disable=camel_case_classes # coffeelint: disable=camel_case_classes
class App.UiElement.autocompletion_ajax class App.UiElement.autocompletion_ajax
@render: (attribute, params = {}) -> @render: (attribute, params = {}) ->
if params[attribute.name]
object = App[attribute.relation].find(params[attribute.name]) if params[attribute.name] || attribute.value
object = App[attribute.relation].find(params[attribute.name] || attribute.value)
valueName = object.displayName() valueName = object.displayName()
# selectable search # selectable search
searchableAjaxSelectObject = new App.SearchableAjaxSelect( searchableAjaxSelectObject = new App.SearchableAjaxSelect(
attribute: attribute:
value: params[attribute.name] value: params[attribute.name] || attribute.value
valueName: valueName valueName: valueName
name: attribute.name name: attribute.name
id: params.organization_id id: params.organization_id || attribute.value
placeholder: App.i18n.translateInline('Search...') placeholder: App.i18n.translateInline('Search...')
limt: 10 limt: 10
object: attribute.relation object: attribute.relation

View file

@ -57,7 +57,6 @@ class App.UiElement.ticket_perform_action
) )
# build inital params # build inital params
console.log('initial', params[attribute.name])
if !_.isEmpty(params[attribute.name]) if !_.isEmpty(params[attribute.name])
selectorExists = false selectorExists = false

View file

@ -85,7 +85,6 @@ class App.UiElement.ticket_selector
) )
# build inital params # build inital params
console.log('initial', params[attribute.name])
if !_.isEmpty(params[attribute.name]) if !_.isEmpty(params[attribute.name])
selectorExists = false selectorExists = false
@ -166,7 +165,6 @@ class App.UiElement.ticket_selector
) )
@buildValue: (elementFull, elementRow, groupAndAttribute, elements, value, operator, attribute) -> @buildValue: (elementFull, elementRow, groupAndAttribute, elements, value, operator, attribute) ->
console.log('buildValue', elementFull, elementRow, groupAndAttribute, elements, value, operator, attribute)
# do nothing if item already exists # do nothing if item already exists
operator = elementRow.find('.js-operator option:selected').attr('value') operator = elementRow.find('.js-operator option:selected').attr('value')
@ -176,9 +174,16 @@ class App.UiElement.ticket_selector
attributeConfig = elements[groupAndAttribute] attributeConfig = elements[groupAndAttribute]
config = _.clone(attributeConfig) config = _.clone(attributeConfig)
# force to use auto compition on user lookup # force to use auto complition on user lookup
config.preCondition = false
if config.relation is 'User' if config.relation is 'User'
config.preCondition = 'user'
config.tag = 'user_autocompletion' config.tag = 'user_autocompletion'
if config.relation is 'Organization'
config.tag = 'autocompletion_ajax'
config.preCondition = 'org'
@buildPreCondition(config, elementFull, elementRow, groupAndAttribute, attribute)
# render ui element # render ui element
item = '' item = ''
@ -204,6 +209,47 @@ class App.UiElement.ticket_selector
elementRow.find('.js-value').html(item) elementRow.find('.js-value').html(item)
@buildPreCondition: (config, elementFull, elementRow, groupAndAttribute, attribute) ->
if !config.preCondition
elementRow.find('.js-preCondition').addClass('hide')
return
name = "#{attribute.name}::#{groupAndAttribute}::pre_condition"
preConditionCurrent = elementRow.find('.js-preCondition option:selected').attr('value')
if !preCondition && attribute.value && attribute.value[groupAndAttribute]
preCondition = attribute.value[groupAndAttribute].pre_condition
selection = $("<select class=\"form-control\" name=\"#{name}\" ></select>")
options = {}
if config.preCondition is 'user'
options =
'set': App.i18n.translateInline('set')
'current_user.id': App.i18n.translateInline('current user')
'specific': App.i18n.translateInline('specific user')
else if config.preCondition is 'org'
options =
'set': App.i18n.translateInline('set')
'current_user.organization_id': App.i18n.translateInline('current user organization')
'specific': App.i18n.translateInline('specific organization')
for key, value of options
selected = preConditionCurrent
if key is preCondition
selected = 'selected="selected"'
selection.append("<option value=\"#{key}\" #{selected}>#{App.i18n.translateInline(value)}</option>")
elementRow.find('.js-preCondition').removeClass('hide')
elementRow.find('.js-preCondition select').replaceWith(selection)
toggle = ->
preCondition = elementRow.find('.js-preCondition option:selected').attr('value')
if preCondition is 'specific'
elementRow.find('.js-value').removeClass('hide')
else
elementRow.find('.js-value').addClass('hide')
toggle()
elementRow.find('.js-preCondition select').bind('change', (e) =>
toggle()
)
@buildAttributeSelector: (groups, elements) -> @buildAttributeSelector: (groups, elements) ->
selection = $('<select class="form-control"></select>') selection = $('<select class="form-control"></select>')
for groupKey, groupMeta of groups for groupKey, groupMeta of groups

View file

@ -5,7 +5,7 @@ class App.UserOrganizationAutocompletion extends App.Controller
'click .js-organization': 'showOrganizationMembers' 'click .js-organization': 'showOrganizationMembers'
'click .js-back': 'hideOrganizationMembers' 'click .js-back': 'hideOrganizationMembers'
'click .js-user': 'selectUser' 'click .js-user': 'selectUser'
'click .js-user-new': 'newUser' 'click .js-userNew': 'newUser'
'focus input': 'open' 'focus input': 'open'
constructor: (params) -> constructor: (params) ->
@ -17,6 +17,10 @@ class App.UserOrganizationAutocompletion extends App.Controller
@attribute.source = @apiPath + '/search/user-organization' @attribute.source = @apiPath + '/search/user-organization'
@build() @build()
# set current value
if @attribute.value
@setUser(@attribute.value)
element: => element: =>
@el @el

View file

@ -12,6 +12,12 @@
<%- @Icon('arrow-down', 'dropdown-arrow') %> <%- @Icon('arrow-down', 'dropdown-arrow') %>
</div> </div>
</div> </div>
<div class="controls">
<div class="u-positionOrigin js-preCondition">
<select></select>
<%- @Icon('arrow-down', 'dropdown-arrow') %>
</div>
</div>
<div class="controls js-value horizontal"></div> <div class="controls js-value horizontal"></div>
</div> </div>
<div class="filter-controls"> <div class="filter-controls">

View file

@ -1,4 +1,4 @@
<li class="recipientList-entry recipientList--new js-user-new" data-user-id="new"> <li class="recipientList-entry recipientList--new js-userNew" data-user-id="new">
<div class="recipientList-iconSpacer"> <div class="recipientList-iconSpacer">
<%- @Icon('plus', 'recipientList-icon') %> <%- @Icon('plus', 'recipientList-icon') %>
</div> </div>

View file

@ -295,7 +295,7 @@ get count of tickets and tickets which match on selector
def self.selectors(selectors, limit = 10, current_user = nil) def self.selectors(selectors, limit = 10, current_user = nil)
fail 'no selectors given' if !selectors fail 'no selectors given' if !selectors
query, bind_params, tables = selector2sql(selectors) query, bind_params, tables = selector2sql(selectors, current_user)
return [] if !query return [] if !query
if !current_user if !current_user
@ -314,7 +314,7 @@ get count of tickets and tickets which match on selector
generate condition query to search for tickets based on condition generate condition query to search for tickets based on condition
query_condition, bind_condition = selector2sql(params[:condition]) query_condition, bind_condition = selector2sql(params[:condition], current_user)
condition example condition example
@ -332,15 +332,31 @@ condition example
range: 'day', # minute|hour|day|month|year range: 'day', # minute|hour|day|month|year
value: '25', value: '25',
}, },
'ticket.owner_id' => {
operator: 'is', # is not
pre_condition: 'current_user.id',
},
'ticket.owner_id' => {
operator: 'is', # is not
pre_condition: 'specific',
value: 4711,
},
} }
=end =end
def self.selector2sql(selectors) def self.selector2sql(selectors, current_user = nil)
current_user_id = UserInfo.current_user_id
if current_user
current_user_id = current_user.id
end
return if !selectors return if !selectors
# remember query and bind params
query = '' query = ''
bind_params = [] bind_params = []
# get tables to join
tables = '' tables = ''
selectors.each {|attribute, selector| selectors.each {|attribute, selector|
selector = attribute.split(/\./) selector = attribute.split(/\./)
@ -364,24 +380,71 @@ condition example
end end
} }
# add conditions
selectors.each {|attribute, selector_raw| selectors.each {|attribute, selector_raw|
if query != ''
query += ' AND ' # validation
end
fail "Invalid selector #{selector_raw.inspect}" if !selector_raw fail "Invalid selector #{selector_raw.inspect}" if !selector_raw
fail "Invalid selector #{selector_raw.inspect}" if !selector_raw.respond_to?(:key?) fail "Invalid selector #{selector_raw.inspect}" if !selector_raw.respond_to?(:key?)
selector = selector_raw.stringify_keys selector = selector_raw.stringify_keys
fail "Invalid selector, operator missing #{selector.inspect}" if !selector['operator'] fail "Invalid selector, operator missing #{selector.inspect}" if !selector['operator']
return nil if selector['value'].nil?
return nil if selector['value'].respond_to?(:empty?) && selector['value'].empty? # validate value / allow empty but only if pre_condition eyists
if selector['value'].nil? || (selector['value'].respond_to?(:empty?) && selector['value'].empty?)
return nil if selector['pre_condition'].nil? || (selector['pre_condition'].respond_to?(:empty?) && selector['pre_condition'].empty?)
end
# validate pre_condition values
return nil if selector['pre_condition'] && selector['pre_condition'] !~ /^(set|current_user\.|specific)/
# get attributes
attributes = attribute.split(/\./) attributes = attribute.split(/\./)
attribute = "#{attributes[0]}s.#{attributes[1]}" attribute = "#{attributes[0]}s.#{attributes[1]}"
if query != ''
query += ' AND '
end
if selector['operator'] == 'is' if selector['operator'] == 'is'
query += "#{attribute} IN (?)" if selector['pre_condition'] == 'set'
bind_params.push selector['value'] if attributes[1] =~ /^(created_by|updated_by|owner|customer|user)_id/
query += "#{attribute} NOT IN (?)"
bind_params.push 1
else
query += "#{attribute} IS NOT NULL"
end
elsif selector['pre_condition'] == 'current_user.id'
fail "Use current_user.id in selector, but no current_user is set #{selector.inspect}" if !current_user_id
query += "#{attribute} IN (?)"
bind_params.push current_user_id
elsif selector['pre_condition'] == 'current_user.organization_id'
fail "Use current_user.id in selector, but no current_user is set #{selector.inspect}" if !current_user_id
query += "#{attribute} IN (?)"
user = User.lookup(id: current_user_id)
bind_params.push user.organization_id
else
query += "#{attribute} IN (?)"
bind_params.push selector['value']
end
elsif selector['operator'] == 'is not' elsif selector['operator'] == 'is not'
query += "#{attribute} NOT IN (?)" if selector['pre_condition'] == 'set'
bind_params.push selector['value'] if attributes[1] =~ /^(created_by|updated_by|owner|customer|user)_id/
query += "#{attribute} IN (?)"
bind_params.push 1
else
query += "#{attribute} IS NULL"
end
elsif selector['pre_condition'] == 'current_user.id'
query += "#{attribute} NOT IN (?)"
bind_params.push current_user_id
elsif selector['pre_condition'] == 'current_user.organization_id'
query += "#{attribute} NOT IN (?)"
user = User.lookup(id: current_user_id)
bind_params.push user.organization_id
else
query += "#{attribute} NOT IN (?)"
bind_params.push selector['value']
end
elsif selector['operator'] == 'contains' elsif selector['operator'] == 'contains'
query += "#{attribute} LIKE (?)" query += "#{attribute} LIKE (?)"
value = "%#{selector['value']}%" value = "%#{selector['value']}%"

View file

@ -69,32 +69,6 @@ returns
overview_selected = overview overview_selected = overview
overview_selected_raw = Marshal.load( Marshal.dump(overview.attributes) ) overview_selected_raw = Marshal.load( Marshal.dump(overview.attributes) )
end end
# replace e.g. 'current_user.id' with current_user.id
overview.condition.each { |attribute, content|
next if !content
next if !content.respond_to?(:key?)
next if !content['value']
next if content['value'].class != String && content['value'].class != Array
if content['value'].class == String
parts = content['value'].split( '.', 2 )
next if !parts[0]
next if !parts[1]
next if parts[0] != 'current_user'
overview.condition[attribute]['value'] = data[:current_user][parts[1].to_sym]
next
end
content['value'].each {|item|
next if item.class != String
parts = item.split('.', 2)
next if !parts[0]
next if !parts[1]
next if parts[0] != 'current_user'
item = data[:current_user][parts[1].to_sym]
}
}
} }
if data[:view] && !overview_selected if data[:view] && !overview_selected
@ -111,7 +85,7 @@ returns
result = [] result = []
overviews.each { |overview| overviews.each { |overview|
query_condition, bind_condition = Ticket.selector2sql(overview.condition) query_condition, bind_condition = Ticket.selector2sql(overview.condition, data[:current_user])
# get count # get count
count = Ticket.where( access_condition ).where( query_condition, *bind_condition ).count() count = Ticket.where( access_condition ).where( query_condition, *bind_condition ).count()
@ -136,7 +110,7 @@ returns
order_by = overview_selected.group_by + '_id, ' + order_by order_by = overview_selected.group_by + '_id, ' + order_by
end end
query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition) query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition, data[:current_user])
tickets = Ticket.select('id') tickets = Ticket.select('id')
.where( access_condition ) .where( access_condition )
@ -160,7 +134,7 @@ returns
# get tickets for overview # get tickets for overview
data[:start_page] ||= 1 data[:start_page] ||= 1
query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition) query_condition, bind_condition = Ticket.selector2sql(overview_selected.condition, data[:current_user])
tickets = Ticket.where( access_condition ) tickets = Ticket.where( access_condition )
.where( query_condition, *bind_condition ) .where( query_condition, *bind_condition )
.order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s ) .order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s )

View file

@ -0,0 +1,226 @@
class UpdateOverview5 < ActiveRecord::Migration
def up
# return if it's a new setup
return if !Setting.find_by(name: 'system_init_done')
UserInfo.current_user_id = 1
overview_role = Role.where( name: 'Agent' ).first
Overview.create_or_update(
name: 'My assigned Tickets',
link: 'my_assigned',
prio: 1000,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [ 1, 2, 3, 7 ],
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
},
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',
},
)
Overview.create_or_update(
name: 'My pending reached Tickets',
link: 'my_pending_reached',
prio: 1010,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: 3,
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
'ticket.pending_time' => {
operator: 'within next (relative)',
value: 0,
range: 'minute',
},
},
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',
},
)
Overview.create_or_update(
name: 'Unassigned & Open Tickets',
link: 'all_unassigned',
prio: 1020,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [1, 2, 3],
},
'ticket.owner_id' => {
operator: 'is',
value: 1,
},
},
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',
},
)
Overview.create_or_update(
name: 'All Open Tickets',
link: 'all_open',
prio: 1030,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [1, 2, 3],
},
},
order: {
by: 'created_at',
direction: 'ASC',
},
view: {
d: %w(title customer group state owner created_at),
s: %w(title customer group state owner created_at),
m: %w(number title customer group state owner created_at),
view_mode_default: 's',
},
)
Overview.create_or_update(
name: 'All pending reached Tickets',
link: 'all_pending_reached',
prio: 1035,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [3],
},
'ticket.pending_time' => {
operator: 'within next (relative)',
value: 0,
range: 'minute',
},
},
order: {
by: 'created_at',
direction: 'ASC',
},
view: {
d: %w(title customer group owner created_at),
s: %w(title customer group owner created_at),
m: %w(number title customer group owner created_at),
view_mode_default: 's',
},
)
Overview.create_or_update(
name: 'Escalated Tickets',
link: 'all_escalated',
prio: 1040,
role_id: overview_role.id,
condition: {
'ticket.escalation_time' => {
operator: 'within next (relative)',
value: '10',
range: 'minute',
},
},
order: {
by: 'escalation_time',
direction: 'ASC',
},
view: {
d: %w(title customer group owner escalation_time),
s: %w(title customer group owner escalation_time),
m: %w(number title customer group owner escalation_time),
view_mode_default: 's',
},
)
overview_role = Role.where( name: 'Customer' ).first
Overview.create_or_update(
name: 'My Tickets',
link: 'my_tickets',
prio: 1000,
role_id: overview_role.id,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [ 1, 2, 3, 4, 6, 7 ],
},
'ticket.customer_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
},
order: {
by: 'created_at',
direction: 'DESC',
},
view: {
d: %w(title customer state created_at),
s: %w(number title state created_at),
m: %w(number title state created_at),
view_mode_default: 's',
},
)
Overview.create_or_update(
name: 'My Organization Tickets',
link: 'my_organization_tickets',
prio: 1100,
role_id: overview_role.id,
organization_shared: true,
condition: {
'ticket.state_id' => {
operator: 'is',
value: [ 1, 2, 3, 4, 6, 7 ],
},
'ticket.organization_id' => {
operator: 'is',
pre_condition: 'current_user.organization_id',
},
},
order: {
by: 'created_at',
direction: 'DESC',
},
view: {
d: %w(title customer state created_at),
s: %w(number title customer state created_at),
m: %w(number title customer state created_at),
view_mode_default: 's',
},
)
end
end

View file

@ -1615,7 +1615,7 @@ Overview.create_if_not_exists(
}, },
'ticket.owner_id' => { 'ticket.owner_id' => {
operator: 'is', operator: 'is',
value: 'current_user.id', pre_condition: 'current_user.id',
}, },
}, },
order: { order: {
@ -1642,7 +1642,7 @@ Overview.create_if_not_exists(
}, },
'ticket.owner_id' => { 'ticket.owner_id' => {
operator: 'is', operator: 'is',
value: 'current_user.id', pre_condition: 'current_user.id',
}, },
'ticket.pending_time' => { 'ticket.pending_time' => {
operator: 'within next (relative)', operator: 'within next (relative)',
@ -1777,7 +1777,7 @@ Overview.create_if_not_exists(
}, },
'ticket.customer_id' => { 'ticket.customer_id' => {
operator: 'is', operator: 'is',
value: 'current_user.id', pre_condition: 'current_user.id',
}, },
}, },
order: { order: {
@ -1804,7 +1804,7 @@ Overview.create_if_not_exists(
}, },
'ticket.organization_id' => { 'ticket.organization_id' => {
operator: 'is', operator: 'is',
value: 'current_user.organization_id', pre_condition: 'current_user.organization_id',
}, },
}, },
order: { order: {

View file

@ -2,7 +2,7 @@
// form // form
test( 'form checks', function() { test( 'form checks', function() {
App.TicketPriority.refresh( [ App.TicketPriority.refresh([
{ {
id: 1, id: 1,
name: '1 low', name: '1 low',
@ -31,7 +31,28 @@ test( 'form checks', function() {
active: true, active: true,
created_at: '2014-06-10T10:17:54.000Z', created_at: '2014-06-10T10:17:54.000Z',
}, },
] ) ])
App.User.refresh([
{
id: 47,
login: 'bod@example.com',
email: 'bod@example.com',
firstname: 'Bob',
lastname: 'Smith',
active: true,
created_at: '2014-06-10T11:17:34.000Z',
},
])
App.Organization.refresh([
{
id: 12,
name: 'Org 1',
active: true,
created_at: '2014-06-10T11:19:34.000Z',
},
])
$('#forms').append('<hr><h1>form time check</h1><form id="form1"></form>') $('#forms').append('<hr><h1>form time check</h1><form id="form1"></form>')
@ -98,6 +119,16 @@ test( 'form checks', function() {
operator: 'before (absolute)', operator: 'before (absolute)',
value: '2015-09-20T03:41:00.000Z', value: '2015-09-20T03:41:00.000Z',
}, },
'ticket.organization_id': {
operator: 'is not',
pre_condition: 'specific',
value: 12,
},
'ticket.owner_id': {
operator: 'is',
pre_condition: 'specific',
value: 47,
},
}, },
executions: { executions: {
'ticket.title': { 'ticket.title': {
@ -143,6 +174,17 @@ test( 'form checks', function() {
operator: 'before (absolute)', operator: 'before (absolute)',
value: '2015-09-20T03:41:00.000Z', value: '2015-09-20T03:41:00.000Z',
}, },
'ticket.organization_id': {
operator: 'is not',
pre_condition: 'specific',
value: '12',
},
'ticket.owner_id': {
operator: 'is',
pre_condition: 'specific',
value: '47',
value_completion: 'Bob Smith <bod@example.com>',
},
}, },
executions: { executions: {
'ticket.title': { 'ticket.title': {
@ -270,6 +312,17 @@ test( 'form checks', function() {
operator: 'before (absolute)', operator: 'before (absolute)',
value: '2015-09-20T03:41:00.000Z', value: '2015-09-20T03:41:00.000Z',
}, },
'ticket.organization_id': {
operator: 'is not',
pre_condition: 'specific',
value: '12',
},
'ticket.owner_id': {
operator: 'is',
pre_condition: 'specific',
value: '47',
value_completion: 'Bob Smith <bod@example.com>',
},
}, },
executions: { executions: {
'ticket.priority_id': { 'ticket.priority_id': {

View file

@ -621,6 +621,230 @@ class TicketSelectorTest < ActiveSupport::TestCase
ticket_count, tickets = Ticket.selectors(condition, 10, customer2) ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 ) assert_equal( ticket_count, 0 )
# with owner/customer/org
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'specific',
value: agent1.id,
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'set',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.owner_id' => {
operator: 'is not',
pre_condition: 'set',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 1 )
UserInfo.current_user_id = agent1.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
UserInfo.current_user_id = agent2.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.owner_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
UserInfo.current_user_id = customer1.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.customer_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 1 )
UserInfo.current_user_id = customer2.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.customer_id' => {
operator: 'is',
pre_condition: 'current_user.id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 1 )
UserInfo.current_user_id = customer1.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.organization_id' => {
operator: 'is',
pre_condition: 'current_user.organization_id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
UserInfo.current_user_id = customer2.id
condition = {
'ticket.group_id' => {
operator: 'is',
value: group.id,
},
'ticket.organization_id' => {
operator: 'is',
pre_condition: 'current_user.organization_id',
},
}
ticket_count, tickets = Ticket.selectors(condition, 10, agent1)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, agent2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer1)
assert_equal( ticket_count, 1 )
ticket_count, tickets = Ticket.selectors(condition, 10, customer2)
assert_equal( ticket_count, 0 )
ticket_count, tickets = Ticket.selectors(condition, 10)
assert_equal( ticket_count, 0 )
end end
end end