Referencing to issue #178, automatically add links to ticket on ticket split.

This commit is contained in:
Martin Edenhofer 2016-08-23 09:47:06 +02:00
parent 42b45e50c1
commit 4319023ad1
4 changed files with 125 additions and 1 deletions

View file

@ -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

View file

@ -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 = [

View file

@ -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

View 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