KayakoClient 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/kayako_client.rb +1 -0
- data/lib/kayako_client/custom_field.rb +73 -0
- data/lib/kayako_client/http/http_client.rb +1 -0
- data/lib/kayako_client/http/net_http.rb +13 -9
- data/lib/kayako_client/mixins/client.rb +15 -0
- data/lib/kayako_client/mixins/object.rb +4 -0
- data/lib/kayako_client/mixins/ticket_client.rb +12 -0
- data/lib/kayako_client/ticket.rb +1 -0
- data/lib/kayako_client/ticket_custom_field.rb +167 -28
- metadata +6 -5
data/lib/kayako_client.rb
CHANGED
@@ -18,6 +18,7 @@ require 'kayako_client/mixins/user_visibility_api'
|
|
18
18
|
require 'kayako_client/mixins/staff_visibility_api'
|
19
19
|
|
20
20
|
require 'kayako_client/base'
|
21
|
+
require 'kayako_client/custom_field'
|
21
22
|
require 'kayako_client/department'
|
22
23
|
require 'kayako_client/staff'
|
23
24
|
require 'kayako_client/staff_group'
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module KayakoClient
|
2
|
+
|
3
|
+
class CustomFieldOption < KayakoClient::Base
|
4
|
+
supports :all
|
5
|
+
|
6
|
+
property :custom_field_option_id, :integer
|
7
|
+
property :custom_field_id, :integer
|
8
|
+
property :option_value, :string
|
9
|
+
property :display_order, :integer
|
10
|
+
property :is_selected, :boolean
|
11
|
+
property :parent_custom_field_option_id, :integer
|
12
|
+
|
13
|
+
def has_parent_custom_field_option?
|
14
|
+
!parent_custom_field_option_id.nil? && parent_custom_field_option_id > 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.all(custom_field_id, options = {})
|
18
|
+
unless custom_field_id.to_i > 0
|
19
|
+
logger.error "invalid :custom_field_id - #{custom_field_id}" if logger
|
20
|
+
raise ArgumentError, "invalid custom field ID"
|
21
|
+
end
|
22
|
+
super(options.merge(:e => "/#{self.superclass.name.split('::').last}/CustomField/ListOptions/#{custom_field_id.to_i}"))
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
class CustomField < KayakoClient::Base
|
28
|
+
supports :all
|
29
|
+
|
30
|
+
TYPE_TEXT = 1
|
31
|
+
TYPE_TEXT_AREA = 2
|
32
|
+
TYPE_PASSWORD = 3
|
33
|
+
TYPE_CHECKBOX = 4
|
34
|
+
TYPE_RADIO = 5
|
35
|
+
TYPE_SELECT = 6
|
36
|
+
TYPE_MULTI_SELECT = 7
|
37
|
+
TYPE_CUSTOM = 8
|
38
|
+
TYPE_LINKED_SELECT = 9
|
39
|
+
TYPE_DATE = 10
|
40
|
+
TYPE_FILE = 11
|
41
|
+
|
42
|
+
property :custom_field_id, :integer
|
43
|
+
property :field_name, :string
|
44
|
+
property :title, :string
|
45
|
+
property :description, :string
|
46
|
+
property :field_type, :integer, :range => 1..11
|
47
|
+
property :is_required, :boolean
|
48
|
+
property :default_value, :string
|
49
|
+
property :regexp_validate, :string
|
50
|
+
property :custom_field_group_id, :integer
|
51
|
+
property :encrypt_in_db, :boolean
|
52
|
+
property :display_order, :integer
|
53
|
+
property :user_editable, :boolean
|
54
|
+
property :staff_editable, :boolean
|
55
|
+
|
56
|
+
def options
|
57
|
+
if instance_variable_defined?(:@options)
|
58
|
+
instance_variable_get(:@options)
|
59
|
+
elsif !new? && custom_field_id && custom_field_id > 0
|
60
|
+
options = KayakoClient::CustomFieldOption.all(custom_field_id, inherited_options)
|
61
|
+
if options && !options.empty?
|
62
|
+
instance_variable_set(:@options, options)
|
63
|
+
else
|
64
|
+
instance_variable_set(:@options, nil)
|
65
|
+
end
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -7,6 +7,7 @@ module KayakoClient
|
|
7
7
|
|
8
8
|
def initialize(options = {})
|
9
9
|
@client = ::HTTPClient.new
|
10
|
+
@client.ssl_config.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
10
11
|
if options[:host]
|
11
12
|
@client.proxy = "http://#{options[:host]}:#{options[:port] || 80}"
|
12
13
|
@client.set_proxy_auth(options[:user], options[:pass])
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'net/
|
1
|
+
require 'net/https'
|
2
2
|
|
3
3
|
module KayakoClient
|
4
4
|
class NetHTTP
|
@@ -13,8 +13,9 @@ module KayakoClient
|
|
13
13
|
def get(base, params = {})
|
14
14
|
uri = URI.parse(base)
|
15
15
|
log = params.delete(:logger) || logger
|
16
|
-
@client.
|
17
|
-
|
16
|
+
session = @client.new(uri.host, uri.port)
|
17
|
+
session.use_ssl = true if uri.is_a?(URI::HTTPS)
|
18
|
+
resp = session.start do |request|
|
18
19
|
query = url(uri.path, params)
|
19
20
|
log.debug ":get => #{query}" if log
|
20
21
|
request.get(query)
|
@@ -26,8 +27,9 @@ module KayakoClient
|
|
26
27
|
uri = URI.parse(base)
|
27
28
|
e = params.delete(:e)
|
28
29
|
log = params.delete(:logger) || logger
|
29
|
-
@client.
|
30
|
-
|
30
|
+
session = @client.new(uri.host, uri.port)
|
31
|
+
session.use_ssl = true if uri.is_a?(URI::HTTPS)
|
32
|
+
resp = session.start do |request|
|
31
33
|
query = url(uri.path, { :e => e })
|
32
34
|
data = form_data(params)
|
33
35
|
if log
|
@@ -43,8 +45,9 @@ module KayakoClient
|
|
43
45
|
uri = URI.parse(base)
|
44
46
|
e = params.delete(:e)
|
45
47
|
log = params.delete(:logger) || logger
|
46
|
-
@client.
|
47
|
-
|
48
|
+
session = @client.new(uri.host, uri.port)
|
49
|
+
session.use_ssl = true if uri.is_a?(URI::HTTPS)
|
50
|
+
resp = session.start do |request|
|
48
51
|
query = url(uri.path, { :e => e })
|
49
52
|
data = form_data(params)
|
50
53
|
if log
|
@@ -59,8 +62,9 @@ module KayakoClient
|
|
59
62
|
def delete(base, params = {})
|
60
63
|
uri = URI.parse(base)
|
61
64
|
log = params.delete(:logger) || logger
|
62
|
-
@client.
|
63
|
-
|
65
|
+
session = @client.new(uri.host, uri.port)
|
66
|
+
session.use_ssl = true if uri.is_a?(URI::HTTPS)
|
67
|
+
resp = session.start do |request|
|
64
68
|
query = url(uri.path, params)
|
65
69
|
log.debug ":delete => #{query}" if log
|
66
70
|
request.delete(query)
|
@@ -133,6 +133,12 @@ module KayakoClient
|
|
133
133
|
KayakoClient::TicketCustomField.get(ticket, options.merge(inherited_options))
|
134
134
|
end
|
135
135
|
|
136
|
+
def post_ticket_custom_fields(options = {})
|
137
|
+
KayakoClient::TicketCustomField.post(options.merge(inherited_options))
|
138
|
+
end
|
139
|
+
|
140
|
+
alias_method :create_ticket_custom_fields, :post_ticket_custom_fields
|
141
|
+
|
136
142
|
|
137
143
|
def ticket_notes(ticket, options = {})
|
138
144
|
KayakoClient::TicketNote.all(ticket, options.merge(inherited_options))
|
@@ -304,5 +310,14 @@ module KayakoClient
|
|
304
310
|
|
305
311
|
alias_method :destroy_user_organization, :delete_user_organization
|
306
312
|
|
313
|
+
|
314
|
+
def custom_fields(options = {})
|
315
|
+
KayakoClient::CustomField.all(options.merge(inherited_options))
|
316
|
+
end
|
317
|
+
|
318
|
+
def custom_field_options(custom_field_id, options = {})
|
319
|
+
KayakoClient::CustomFieldOption.all(custom_field_id, options.merge(inherited_options))
|
320
|
+
end
|
321
|
+
|
307
322
|
end
|
308
323
|
end
|
@@ -39,6 +39,18 @@ module KayakoClient
|
|
39
39
|
KayakoClient::TicketCustomField.get(id, options.merge(inherited_options)) if id
|
40
40
|
end
|
41
41
|
|
42
|
+
def post_custom_fields(options = {})
|
43
|
+
if id
|
44
|
+
if logger && options[:ticket_id] && options[:ticket_id].to_i != id
|
45
|
+
logger.warn "overwriting :ticket_id"
|
46
|
+
end
|
47
|
+
options[:ticket_id] = id
|
48
|
+
KayakoClient::TicketCustomField.post(options.merge(inherited_options))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
alias_method :create_custom_fields, :post_custom_fields
|
53
|
+
|
42
54
|
|
43
55
|
def notes(options = {})
|
44
56
|
KayakoClient::TicketNote.all(id, options.merge(inherited_options)) if id
|
data/lib/kayako_client/ticket.rb
CHANGED
@@ -92,6 +92,7 @@ module KayakoClient
|
|
92
92
|
property :auto_user_id, :boolean, :new => true
|
93
93
|
property :staff_id, :integer, :new => true
|
94
94
|
property :type, :symbol, :new => true, :in => TICKET_TYPES
|
95
|
+
property :template_group_id, :integer
|
95
96
|
|
96
97
|
property :work_flow, :object, :class => TicketWorkflow
|
97
98
|
property :watcher, [ :object ], :class => TicketWatcher
|
@@ -4,25 +4,25 @@ require 'time'
|
|
4
4
|
module KayakoClient
|
5
5
|
|
6
6
|
class TicketCustomFieldValue < KayakoClient::Tickets
|
7
|
-
embedded
|
8
7
|
|
9
|
-
property :id, :integer
|
10
|
-
property :type, :integer, :range => 1..11
|
11
|
-
property :title, :string
|
12
|
-
property :
|
8
|
+
property :id, :integer, :readonly => true
|
9
|
+
property :type, :integer, :readonly => true, :range => 1..11
|
10
|
+
property :title, :string, :readonly => true
|
11
|
+
property :name, :string, :readonly => true
|
12
|
+
property :file_name, :string, :readonly => true
|
13
13
|
property :contents, :string
|
14
14
|
|
15
15
|
def initialize(*args)
|
16
16
|
super(*args)
|
17
17
|
if defined?(@type)
|
18
|
-
if @type == KayakoClient::
|
18
|
+
if @type == KayakoClient::CustomField::TYPE_FILE
|
19
19
|
self.class.send(:include, KayakoClient::Attachment)
|
20
20
|
if defined?(@contents)
|
21
21
|
logger.debug "decoding base64 :contents" if logger
|
22
22
|
@contents = Base64.decode64(@contents)
|
23
23
|
@contents = Base64.decode64(@contents)
|
24
24
|
end
|
25
|
-
elsif @type == KayakoClient::
|
25
|
+
elsif @type == KayakoClient::CustomField::TYPE_DATE
|
26
26
|
@contents = Time.parse(@contents) if defined?(@contents)
|
27
27
|
end
|
28
28
|
end
|
@@ -31,36 +31,64 @@ module KayakoClient
|
|
31
31
|
end
|
32
32
|
|
33
33
|
class TicketCustomFieldGroup < KayakoClient::Tickets
|
34
|
-
embedded
|
35
34
|
|
36
|
-
property :id, :integer
|
37
|
-
property :title, :string
|
35
|
+
property :id, :integer, :readonly => true
|
36
|
+
property :title, :string, :readonly => true
|
37
|
+
|
38
38
|
property :fields, [ :object ], :class => TicketCustomFieldValue, :get => :field
|
39
39
|
|
40
40
|
end
|
41
41
|
|
42
42
|
class TicketCustomField < KayakoClient::Tickets
|
43
|
-
supports :get
|
44
|
-
|
45
|
-
TYPE_TEXT =
|
46
|
-
TYPE_TEXT_AREA =
|
47
|
-
TYPE_PASSWORD =
|
48
|
-
TYPE_CHECKBOX =
|
49
|
-
TYPE_RADIO =
|
50
|
-
TYPE_SELECT =
|
51
|
-
TYPE_MULTI_SELECT =
|
52
|
-
TYPE_CUSTOM =
|
53
|
-
TYPE_LINKED_SELECT =
|
54
|
-
TYPE_DATE =
|
55
|
-
TYPE_FILE =
|
43
|
+
supports :get, :post
|
44
|
+
|
45
|
+
TYPE_TEXT = KayakoClient::CustomField::TYPE_TEXT
|
46
|
+
TYPE_TEXT_AREA = KayakoClient::CustomField::TYPE_TEXT_AREA
|
47
|
+
TYPE_PASSWORD = KayakoClient::CustomField::TYPE_PASSWORD
|
48
|
+
TYPE_CHECKBOX = KayakoClient::CustomField::TYPE_CHECKBOX
|
49
|
+
TYPE_RADIO = KayakoClient::CustomField::TYPE_RADIO
|
50
|
+
TYPE_SELECT = KayakoClient::CustomField::TYPE_SELECT
|
51
|
+
TYPE_MULTI_SELECT = KayakoClient::CustomField::TYPE_MULTI_SELECT
|
52
|
+
TYPE_CUSTOM = KayakoClient::CustomField::TYPE_CUSTOM
|
53
|
+
TYPE_LINKED_SELECT = KayakoClient::CustomField::TYPE_LINKED_SELECT
|
54
|
+
TYPE_DATE = KayakoClient::CustomField::TYPE_DATE
|
55
|
+
TYPE_FILE = KayakoClient::CustomField::TYPE_FILE
|
56
|
+
|
57
|
+
attr_accessor :ticket_id
|
56
58
|
|
57
59
|
property :groups, [ :object ], :class => TicketCustomFieldGroup, :get => :group
|
58
60
|
|
59
61
|
# NOTE: when a new field is added returns (for old tickets):
|
60
62
|
# [Notice]: Undefined offset: 11 (api/class.Controller_TicketCustomField.php:279)
|
61
63
|
|
64
|
+
def initialize(*args)
|
65
|
+
properties = {}
|
66
|
+
if args.last.is_a?(Hash)
|
67
|
+
args.last.keys.each do |property|
|
68
|
+
if property.is_a?(String)
|
69
|
+
properties[property] = args.last.delete(property)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
if args.last.has_key?(:ticket_id)
|
73
|
+
self.ticket_id = args.last.delete(:ticket_id)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
super
|
77
|
+
if properties.size > 0
|
78
|
+
properties.each do |property, value|
|
79
|
+
self[property] = value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
62
84
|
def empty?
|
63
|
-
|
85
|
+
if groups && groups.size > 0
|
86
|
+
false
|
87
|
+
elsif defined?(@new_group) && @new_group.size > 0
|
88
|
+
false
|
89
|
+
else
|
90
|
+
true
|
91
|
+
end
|
64
92
|
end
|
65
93
|
|
66
94
|
def custom_field(name)
|
@@ -85,8 +113,27 @@ module KayakoClient
|
|
85
113
|
end
|
86
114
|
end
|
87
115
|
end
|
116
|
+
@groups.each do |group|
|
117
|
+
next unless group.fields && !group.fields.empty?
|
118
|
+
group.fields.each do |field|
|
119
|
+
if field.name == name
|
120
|
+
return field.contents
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
88
124
|
end
|
89
125
|
end
|
126
|
+
|
127
|
+
if defined?(@new_group) && @new_group.size > 0
|
128
|
+
if name.is_a?(String)
|
129
|
+
@new_group.each do |field|
|
130
|
+
if field.name == name
|
131
|
+
return field.contents
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
90
137
|
nil
|
91
138
|
end
|
92
139
|
|
@@ -97,12 +144,104 @@ module KayakoClient
|
|
97
144
|
|
98
145
|
def each(&block)
|
99
146
|
if defined?(@groups) && @groups.size > 0
|
100
|
-
@
|
101
|
-
|
102
|
-
|
147
|
+
@groups.each do |group|
|
148
|
+
group.fields.each(&block)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
if defined?(@new_group) && @new_group.size > 0
|
153
|
+
@new_group.each(&block)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def []=(name, value)
|
158
|
+
if defined?(@groups) && @groups.size > 0
|
159
|
+
if name.is_a?(Numeric)
|
160
|
+
if name.to_i > 0
|
161
|
+
@groups.each do |group|
|
162
|
+
next unless group.fields && !group.fields.empty?
|
163
|
+
group.fields.each do |field|
|
164
|
+
if field.id == name.to_i
|
165
|
+
field.contents = value.to_s
|
166
|
+
return field.contents
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
raise ArgumentError, "use custom field name"
|
171
|
+
else
|
172
|
+
raise ArgumentError, "invalid custom field ID"
|
173
|
+
end
|
174
|
+
elsif name.is_a?(String)
|
175
|
+
@groups.each do |group|
|
176
|
+
next unless group.fields && !group.fields.empty?
|
177
|
+
group.fields.each do |field|
|
178
|
+
if field.title == name
|
179
|
+
field.contents = value.to_s
|
180
|
+
return field.contents
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
@groups.each do |group|
|
185
|
+
next unless group.fields && !group.fields.empty?
|
186
|
+
group.fields.each do |field|
|
187
|
+
if field.name == name
|
188
|
+
field.contents = value.to_s
|
189
|
+
return field.contents
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
103
193
|
end
|
104
|
-
@custom_fields.each(&block) unless @custom_fields.empty?
|
105
194
|
end
|
195
|
+
|
196
|
+
if name =~ %r{^[a-z0-9]{12}$}
|
197
|
+
@new_group ||= []
|
198
|
+
@new_group << TicketCustomFieldValue.new(:name => name.to_s, :contents => value.to_s)
|
199
|
+
return value.to_s
|
200
|
+
end
|
201
|
+
|
202
|
+
super
|
203
|
+
end
|
204
|
+
|
205
|
+
def post
|
206
|
+
raise RuntimeError, "client not configured" unless configured?
|
207
|
+
raise RuntimeError, "missing ticket ID" unless ticket_id.to_i > 0
|
208
|
+
params = {}
|
209
|
+
each do |field|
|
210
|
+
params[field.name] = field.contents
|
211
|
+
end
|
212
|
+
random = self.class.salt
|
213
|
+
e = "#{self.class.path}/#{ticket_id.to_i}"
|
214
|
+
response = client.post(api_url, params.merge(:e => e,
|
215
|
+
:apikey => api_key,
|
216
|
+
:salt => random,
|
217
|
+
:signature => self.class.signature(random, secret_key)))
|
218
|
+
if response.is_a?(KayakoClient::HTTPOK)
|
219
|
+
if logger
|
220
|
+
logger.debug "Response:"
|
221
|
+
logger.debug response.body
|
222
|
+
end
|
223
|
+
payload = xml_backend.new(response.body, { :logger => logger })
|
224
|
+
clean
|
225
|
+
import(payload.to_hash)
|
226
|
+
loaded!
|
227
|
+
logger.info ":post successful" if logger
|
228
|
+
true
|
229
|
+
else
|
230
|
+
unless response.is_a?(Hash)
|
231
|
+
logger.error "Response: #{response.status} #{response.body}" if logger
|
232
|
+
raise StandardError, "server returned #{response.status}: #{response.body}"
|
233
|
+
end
|
234
|
+
false
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
def self.get(*args)
|
239
|
+
object = super
|
240
|
+
if object && object.respond_to?(:ticket_id=)
|
241
|
+
object.ticket_id = args[0]
|
242
|
+
object.loaded!
|
243
|
+
end
|
244
|
+
object
|
106
245
|
end
|
107
246
|
|
108
247
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: KayakoClient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 2
|
10
|
+
version: 1.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kayako
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-03-16 00:00:00 Z
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Kayako's official Ruby interface library for the REST API.
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- lib/kayako_client/user.rb
|
66
66
|
- lib/kayako_client/user_group.rb
|
67
67
|
- lib/kayako_client/user_organization.rb
|
68
|
+
- lib/kayako_client/custom_field.rb
|
68
69
|
homepage: http://forge.kayako.com/projects/kayako-ruby-api-library
|
69
70
|
licenses: []
|
70
71
|
|
@@ -94,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
95
|
requirements: []
|
95
96
|
|
96
97
|
rubyforge_project:
|
97
|
-
rubygems_version: 1.8.
|
98
|
+
rubygems_version: 1.8.15
|
98
99
|
signing_key:
|
99
100
|
specification_version: 3
|
100
101
|
summary: Kayako official Ruby REST API library.
|