Referencing to issue #178, automatically add links to ticket on ticket split.
This commit is contained in:
parent
42b45e50c1
commit
4319023ad1
4 changed files with 125 additions and 1 deletions
|
@ -377,6 +377,12 @@ class App.TicketCreate extends App.Controller
|
||||||
if params.group_id
|
if params.group_id
|
||||||
group = App.Group.find(params.group_id)
|
group = App.Group.find(params.group_id)
|
||||||
|
|
||||||
|
# add linked objects if ticket got splited
|
||||||
|
if @ticket_id
|
||||||
|
params['links'] =
|
||||||
|
Ticket:
|
||||||
|
child: [@ticket_id]
|
||||||
|
|
||||||
# allow cc only on email tickets
|
# allow cc only on email tickets
|
||||||
if @currentChannel() isnt 'email-out'
|
if @currentChannel() isnt 'email-out'
|
||||||
delete params.cc
|
delete params.cc
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
class App.Ticket extends App.Model
|
class App.Ticket extends App.Model
|
||||||
@configure 'Ticket', 'number', 'title', 'group_id', 'owner_id', 'customer_id', 'state_id', 'priority_id', 'article', 'tags', 'updated_at'
|
@configure 'Ticket', 'number', 'title', 'group_id', 'owner_id', 'customer_id', 'state_id', 'priority_id', 'article', 'tags', 'links', 'updated_at'
|
||||||
@extend Spine.Model.Ajax
|
@extend Spine.Model.Ajax
|
||||||
@url: @apiPath + '/tickets'
|
@url: @apiPath + '/tickets'
|
||||||
@configure_attributes = [
|
@configure_attributes = [
|
||||||
|
|
|
@ -134,6 +134,33 @@ class TicketsController < ApplicationController
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# create links (e. g. in case of ticket split)
|
||||||
|
# links: {
|
||||||
|
# Ticket: {
|
||||||
|
# parent: [ticket_id1, ticket_id2, ...]
|
||||||
|
# normal: [ticket_id1, ticket_id2, ...]
|
||||||
|
# child: [ticket_id1, ticket_id2, ...]
|
||||||
|
# },
|
||||||
|
# }
|
||||||
|
if params[:links]
|
||||||
|
raise 'Invalid link structure' if params[:links].to_h.class != Hash
|
||||||
|
params[:links].each { |target_object, link_types_with_object_ids|
|
||||||
|
raise 'Invalid link structure (Object)' if link_types_with_object_ids.to_h.class != Hash
|
||||||
|
link_types_with_object_ids.each { |link_type, object_ids|
|
||||||
|
raise 'Invalid link structure (Object->LinkType)' if object_ids.class != Array
|
||||||
|
object_ids.each { |local_object_id|
|
||||||
|
link = Link.add(
|
||||||
|
link_type: link_type,
|
||||||
|
link_object_target: target_object,
|
||||||
|
link_object_target_value: local_object_id,
|
||||||
|
link_object_source: 'Ticket',
|
||||||
|
link_object_source_value: ticket.id,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
render json: ticket, status: :created
|
render json: ticket, status: :created
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
91
test/controllers/tickets_controller_test.rb
Normal file
91
test/controllers/tickets_controller_test.rb
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class TicketsControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
setup do
|
||||||
|
|
||||||
|
# set accept header
|
||||||
|
@headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
|
||||||
|
|
||||||
|
# create agent
|
||||||
|
roles = Role.where(name: %w(Admin Agent))
|
||||||
|
groups = Group.all
|
||||||
|
|
||||||
|
UserInfo.current_user_id = 1
|
||||||
|
@admin = User.create_or_update(
|
||||||
|
login: 'tickets-admin',
|
||||||
|
firstname: 'Tickets',
|
||||||
|
lastname: 'Admin',
|
||||||
|
email: 'tickets-admin@example.com',
|
||||||
|
password: 'adminpw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
groups: groups,
|
||||||
|
)
|
||||||
|
|
||||||
|
# create agent
|
||||||
|
roles = Role.where(name: 'Agent')
|
||||||
|
@agent = User.create_or_update(
|
||||||
|
login: 'tickets-agent@example.com',
|
||||||
|
firstname: 'Tickets',
|
||||||
|
lastname: 'Agent',
|
||||||
|
email: 'tickets-agent@example.com',
|
||||||
|
password: 'agentpw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
groups: groups,
|
||||||
|
)
|
||||||
|
|
||||||
|
# create customer without org
|
||||||
|
roles = Role.where(name: 'Customer')
|
||||||
|
@customer_without_org = User.create_or_update(
|
||||||
|
login: 'tickets-customer1@example.com',
|
||||||
|
firstname: 'Tickets',
|
||||||
|
lastname: 'Customer1',
|
||||||
|
email: 'tickets-customer1@example.com',
|
||||||
|
password: 'customer1pw',
|
||||||
|
active: true,
|
||||||
|
roles: roles,
|
||||||
|
)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
test '01 ticket create with agent' do
|
||||||
|
|
||||||
|
credentials = ActionController::HttpAuthentication::Basic.encode_credentials('tickets-agent@example.com', 'agentpw')
|
||||||
|
|
||||||
|
params = {
|
||||||
|
title: 'a new ticket #1',
|
||||||
|
state: 'new',
|
||||||
|
priority: '2 normal',
|
||||||
|
group: 'Users',
|
||||||
|
customer: 'tickets-customer1@example.com',
|
||||||
|
article: {
|
||||||
|
content_type: 'text/plain', # or text/html
|
||||||
|
body: 'some body',
|
||||||
|
sender: 'Customer',
|
||||||
|
type: 'note',
|
||||||
|
},
|
||||||
|
links: {
|
||||||
|
Ticket: {
|
||||||
|
parent: [1],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post '/api/v1/tickets', params.to_json, @headers.merge('Authorization' => credentials)
|
||||||
|
|
||||||
|
assert_response(201)
|
||||||
|
result = JSON.parse(@response.body)
|
||||||
|
assert_equal(Hash, result.class)
|
||||||
|
assert_equal(Ticket::State.lookup(name: 'new').id, result['state_id'])
|
||||||
|
assert_equal('a new ticket #1', result['title'])
|
||||||
|
|
||||||
|
links = Link.list(
|
||||||
|
link_object: 'Ticket',
|
||||||
|
link_object_value: result['id'],
|
||||||
|
)
|
||||||
|
p links.inspect
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in a new issue