telerivet 1.4.0 → 1.5.0
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.
- checksums.yaml +5 -5
- data/lib/telerivet.rb +3 -3
- data/lib/telerivet/airtimetransaction.rb +139 -0
- data/lib/telerivet/broadcast.rb +42 -2
- data/lib/telerivet/contact.rb +38 -13
- data/lib/telerivet/datatable.rb +76 -7
- data/lib/telerivet/group.rb +17 -17
- data/lib/telerivet/label.rb +7 -3
- data/lib/telerivet/message.rb +72 -2
- data/lib/telerivet/organization.rb +1 -1
- data/lib/telerivet/phone.rb +7 -3
- data/lib/telerivet/project.rb +595 -92
- data/lib/telerivet/scheduledmessage.rb +22 -1
- data/lib/telerivet/service.rb +40 -9
- data/lib/telerivet/task.rb +151 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4e063e2ce507f6d45b86d12c584475887c050c3d439863d91d545b0ba331e823
|
4
|
+
data.tar.gz: d8040eb663854c7df190aa8f49984d9854687238532b6278af53dea6ebc77250
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da5e09e1c639a5e1bd3b704214c4a276d62469e6ae0853d71cbe4b9dc2a2aacbb1f58d5e5bcbf1093e5cbf24a7a99abcf30d029883aca055d4b41ae9f3a7f8ff
|
7
|
+
data.tar.gz: 4ad80ced036f9d8810e3e7f693443247740791ed4097b26ce179c2c2ef0ca06986b41942fde40401ea8989df19591f84834439efb74900f9bb57ec7f939d8f25
|
data/lib/telerivet.rb
CHANGED
@@ -9,7 +9,7 @@ module Telerivet
|
|
9
9
|
class API
|
10
10
|
attr_reader :num_requests
|
11
11
|
|
12
|
-
@@client_version = '1.
|
12
|
+
@@client_version = '1.5.0'
|
13
13
|
|
14
14
|
#
|
15
15
|
# Initializes a client handle to the Telerivet REST API.
|
@@ -153,7 +153,7 @@ class API
|
|
153
153
|
# * Default: asc
|
154
154
|
#
|
155
155
|
# - page_size (int)
|
156
|
-
# * Number of results returned per page (max
|
156
|
+
# * Number of results returned per page (max 500)
|
157
157
|
# * Default: 50
|
158
158
|
#
|
159
159
|
# - offset (int)
|
@@ -222,7 +222,7 @@ class API
|
|
222
222
|
# * Default: asc
|
223
223
|
#
|
224
224
|
# - page_size (int)
|
225
|
-
# * Number of results returned per page (max
|
225
|
+
# * Number of results returned per page (max 500)
|
226
226
|
# * Default: 50
|
227
227
|
#
|
228
228
|
# - offset (int)
|
@@ -0,0 +1,139 @@
|
|
1
|
+
|
2
|
+
module Telerivet
|
3
|
+
|
4
|
+
#
|
5
|
+
# Represents a transaction where airtime is sent to a mobile phone number.
|
6
|
+
#
|
7
|
+
# To send airtime, first [create a Custom Actions service to send a particular amount of
|
8
|
+
# airtime](/dashboard/add_service?subtype_id=main.service.rules.contact&action_id=main.rule.sendairtime),
|
9
|
+
# then trigger the service using [service.invoke](#Service.invoke),
|
10
|
+
# [project.sendBroadcast](#Project.sendBroadcast), or
|
11
|
+
# [project.scheduleMessage](#Project.scheduleMessage).
|
12
|
+
#
|
13
|
+
# Fields:
|
14
|
+
#
|
15
|
+
# - id
|
16
|
+
# * ID of the airtime transaction
|
17
|
+
# * Read-only
|
18
|
+
#
|
19
|
+
# - to_number
|
20
|
+
# * Destination phone number in international format (no leading +)
|
21
|
+
# * Read-only
|
22
|
+
#
|
23
|
+
# - operator_name
|
24
|
+
# * Operator name
|
25
|
+
# * Read-only
|
26
|
+
#
|
27
|
+
# - country
|
28
|
+
# * Country code
|
29
|
+
# * Read-only
|
30
|
+
#
|
31
|
+
# - status
|
32
|
+
# * Current status of airtime transaction (`successful`, `failed`, `cancelled`,
|
33
|
+
# `queued`, `pending_approval`, or `pending_payment`)
|
34
|
+
# * Read-only
|
35
|
+
#
|
36
|
+
# - status_text
|
37
|
+
# * Error or success message returned by airtime provider, if available
|
38
|
+
# * Read-only
|
39
|
+
#
|
40
|
+
# - value
|
41
|
+
# * Value of airtime sent to destination phone number, in units of value_currency
|
42
|
+
# * Read-only
|
43
|
+
#
|
44
|
+
# - value_currency
|
45
|
+
# * Currency code of price
|
46
|
+
# * Read-only
|
47
|
+
#
|
48
|
+
# - price
|
49
|
+
# * Price charged for airtime transaction, in units of price_currency
|
50
|
+
# * Read-only
|
51
|
+
#
|
52
|
+
# - price_currency
|
53
|
+
# * Currency code of price
|
54
|
+
# * Read-only
|
55
|
+
#
|
56
|
+
# - contact_id
|
57
|
+
# * ID of the contact the airtime was sent to
|
58
|
+
# * Read-only
|
59
|
+
#
|
60
|
+
# - service_id
|
61
|
+
# * ID of the service that sent the airtime
|
62
|
+
# * Read-only
|
63
|
+
#
|
64
|
+
# - project_id
|
65
|
+
# * ID of the project that the airtime transaction belongs to
|
66
|
+
# * Read-only
|
67
|
+
#
|
68
|
+
# - external_id
|
69
|
+
# * The ID of this transaction from an external airtime gateway provider, if available.
|
70
|
+
# * Read-only
|
71
|
+
#
|
72
|
+
# - vars (Hash)
|
73
|
+
# * Custom variables stored for this transaction
|
74
|
+
# * Updatable via API
|
75
|
+
#
|
76
|
+
class AirtimeTransaction < Entity
|
77
|
+
def id
|
78
|
+
get('id')
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_number
|
82
|
+
get('to_number')
|
83
|
+
end
|
84
|
+
|
85
|
+
def operator_name
|
86
|
+
get('operator_name')
|
87
|
+
end
|
88
|
+
|
89
|
+
def country
|
90
|
+
get('country')
|
91
|
+
end
|
92
|
+
|
93
|
+
def status
|
94
|
+
get('status')
|
95
|
+
end
|
96
|
+
|
97
|
+
def status_text
|
98
|
+
get('status_text')
|
99
|
+
end
|
100
|
+
|
101
|
+
def value
|
102
|
+
get('value')
|
103
|
+
end
|
104
|
+
|
105
|
+
def value_currency
|
106
|
+
get('value_currency')
|
107
|
+
end
|
108
|
+
|
109
|
+
def price
|
110
|
+
get('price')
|
111
|
+
end
|
112
|
+
|
113
|
+
def price_currency
|
114
|
+
get('price_currency')
|
115
|
+
end
|
116
|
+
|
117
|
+
def contact_id
|
118
|
+
get('contact_id')
|
119
|
+
end
|
120
|
+
|
121
|
+
def service_id
|
122
|
+
get('service_id')
|
123
|
+
end
|
124
|
+
|
125
|
+
def project_id
|
126
|
+
get('project_id')
|
127
|
+
end
|
128
|
+
|
129
|
+
def external_id
|
130
|
+
get('external_id')
|
131
|
+
end
|
132
|
+
|
133
|
+
def get_base_api_path()
|
134
|
+
"/projects/#{get('project_id')}/airtime_transactions/#{get('id')}"
|
135
|
+
end
|
136
|
+
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
data/lib/telerivet/broadcast.rb
CHANGED
@@ -75,7 +75,7 @@ module Telerivet
|
|
75
75
|
#
|
76
76
|
# - message_type
|
77
77
|
# * Type of message sent from this broadcast
|
78
|
-
# * Allowed values: sms, mms, ussd, call
|
78
|
+
# * Allowed values: sms, mms, ussd, call, service
|
79
79
|
# * Read-only
|
80
80
|
#
|
81
81
|
# - content (string)
|
@@ -109,7 +109,7 @@ module Telerivet
|
|
109
109
|
#
|
110
110
|
# - source
|
111
111
|
# * How the message originated within Telerivet
|
112
|
-
# * Allowed values: phone, provider, web, api, service, webhook, scheduled
|
112
|
+
# * Allowed values: phone, provider, web, api, service, webhook, scheduled, integration
|
113
113
|
# * Read-only
|
114
114
|
#
|
115
115
|
# - simulated (bool)
|
@@ -117,10 +117,29 @@ module Telerivet
|
|
117
117
|
# sent to or received by a real phone)
|
118
118
|
# * Read-only
|
119
119
|
#
|
120
|
+
# - track_clicks (boolean)
|
121
|
+
# * If true, URLs in the message content will automatically be replaced with unique
|
122
|
+
# short URLs.
|
123
|
+
# * Read-only
|
124
|
+
#
|
125
|
+
# - clicked_count (int)
|
126
|
+
# * The number of messages in this broadcast containing short links that were clicked.
|
127
|
+
# At most one click per message is counted. If track_clicks is false, this property will
|
128
|
+
# be null.
|
129
|
+
# * Read-only
|
130
|
+
#
|
120
131
|
# - label_ids (array)
|
121
132
|
# * List of IDs of labels applied to all messages in the broadcast
|
122
133
|
# * Read-only
|
123
134
|
#
|
135
|
+
# - media (array)
|
136
|
+
# * For text messages containing media files, this is an array of objects with the
|
137
|
+
# properties `url`, `type` (MIME type), `filename`, and `size` (file size in bytes).
|
138
|
+
# Unknown properties are null. This property is undefined for messages that do not
|
139
|
+
# contain media files. Note: For files uploaded via the Telerivet web app, the URL is
|
140
|
+
# temporary and may not be valid for more than 1 day.
|
141
|
+
# * Read-only
|
142
|
+
#
|
124
143
|
# - vars (Hash)
|
125
144
|
# * Custom variables stored for this broadcast
|
126
145
|
# * Read-only
|
@@ -147,6 +166,11 @@ module Telerivet
|
|
147
166
|
# * ID of the phone or route used to send the broadcast (if applicable)
|
148
167
|
# * Read-only
|
149
168
|
#
|
169
|
+
# - service_id (string, max 34 characters)
|
170
|
+
# * The service associated with this broadcast (for voice calls, the service defines the
|
171
|
+
# call flow)
|
172
|
+
# * Read-only
|
173
|
+
#
|
150
174
|
# - user_id (string, max 34 characters)
|
151
175
|
# * ID of the Telerivet user who sent the broadcast (if applicable)
|
152
176
|
# * Read-only
|
@@ -242,10 +266,22 @@ class Broadcast < Entity
|
|
242
266
|
get('simulated')
|
243
267
|
end
|
244
268
|
|
269
|
+
def track_clicks
|
270
|
+
get('track_clicks')
|
271
|
+
end
|
272
|
+
|
273
|
+
def clicked_count
|
274
|
+
get('clicked_count')
|
275
|
+
end
|
276
|
+
|
245
277
|
def label_ids
|
246
278
|
get('label_ids')
|
247
279
|
end
|
248
280
|
|
281
|
+
def media
|
282
|
+
get('media')
|
283
|
+
end
|
284
|
+
|
249
285
|
def price
|
250
286
|
get('price')
|
251
287
|
end
|
@@ -266,6 +302,10 @@ class Broadcast < Entity
|
|
266
302
|
get('route_id')
|
267
303
|
end
|
268
304
|
|
305
|
+
def service_id
|
306
|
+
get('service_id')
|
307
|
+
end
|
308
|
+
|
269
309
|
def user_id
|
270
310
|
get('user_id')
|
271
311
|
end
|
data/lib/telerivet/contact.rb
CHANGED
@@ -19,10 +19,19 @@ module Telerivet
|
|
19
19
|
# * Time the contact was added in Telerivet
|
20
20
|
# * Read-only
|
21
21
|
#
|
22
|
+
# - time_updated (UNIX timestamp)
|
23
|
+
# * Time the contact was last updated in Telerivet
|
24
|
+
# * Read-only
|
25
|
+
#
|
22
26
|
# - send_blocked (bool)
|
23
27
|
# * True if Telerivet is blocked from sending messages to this contact
|
24
28
|
# * Updatable via API
|
25
29
|
#
|
30
|
+
# - conversation_status
|
31
|
+
# * Current status of the conversation with this contact
|
32
|
+
# * Allowed values: closed, active, handled
|
33
|
+
# * Updatable via API
|
34
|
+
#
|
26
35
|
# - last_message_time (UNIX timestamp)
|
27
36
|
# * Last time the contact sent or received a message (null if no messages have been sent
|
28
37
|
# or received)
|
@@ -125,11 +134,12 @@ class Contact < Entity
|
|
125
134
|
#
|
126
135
|
# - message_type
|
127
136
|
# * Filter messages by message_type
|
128
|
-
# * Allowed values: sms, mms, ussd, call
|
137
|
+
# * Allowed values: sms, mms, ussd, call, service
|
129
138
|
#
|
130
139
|
# - source
|
131
140
|
# * Filter messages by source
|
132
|
-
# * Allowed values: phone, provider, web, api, service, webhook, scheduled
|
141
|
+
# * Allowed values: phone, provider, web, api, service, webhook, scheduled,
|
142
|
+
# integration
|
133
143
|
#
|
134
144
|
# - starred (bool)
|
135
145
|
# * Filter messages by starred/unstarred
|
@@ -157,6 +167,9 @@ class Contact < Entity
|
|
157
167
|
# - broadcast_id
|
158
168
|
# * ID of the broadcast containing the message
|
159
169
|
#
|
170
|
+
# - scheduled_id
|
171
|
+
# * ID of the scheduled message that created this message
|
172
|
+
#
|
160
173
|
# - sort
|
161
174
|
# * Sort the results based on a field
|
162
175
|
# * Allowed values: default
|
@@ -168,7 +181,7 @@ class Contact < Entity
|
|
168
181
|
# * Default: asc
|
169
182
|
#
|
170
183
|
# - page_size (int)
|
171
|
-
# * Number of results returned per page (max
|
184
|
+
# * Number of results returned per page (max 500)
|
172
185
|
# * Default: 50
|
173
186
|
#
|
174
187
|
# - offset (int)
|
@@ -208,7 +221,7 @@ class Contact < Entity
|
|
208
221
|
# * Default: asc
|
209
222
|
#
|
210
223
|
# - page_size (int)
|
211
|
-
# * Number of results returned per page (max
|
224
|
+
# * Number of results returned per page (max 500)
|
212
225
|
# * Default: 50
|
213
226
|
#
|
214
227
|
# - offset (int)
|
@@ -232,7 +245,7 @@ class Contact < Entity
|
|
232
245
|
#
|
233
246
|
# - message_type
|
234
247
|
# * Filter scheduled messages by message_type
|
235
|
-
# * Allowed values: sms, mms, ussd, call
|
248
|
+
# * Allowed values: sms, mms, ussd, call, service
|
236
249
|
#
|
237
250
|
# - time_created (UNIX timestamp)
|
238
251
|
# * Filter scheduled messages by time_created
|
@@ -240,8 +253,8 @@ class Contact < Entity
|
|
240
253
|
#
|
241
254
|
# - next_time (UNIX timestamp)
|
242
255
|
# * Filter scheduled messages by next_time
|
243
|
-
# * Allowed modifiers: next_time[
|
244
|
-
# next_time[
|
256
|
+
# * Allowed modifiers: next_time[ne], next_time[min], next_time[max],
|
257
|
+
# next_time[exists]
|
245
258
|
#
|
246
259
|
# - sort
|
247
260
|
# * Sort the results based on a field
|
@@ -254,7 +267,7 @@ class Contact < Entity
|
|
254
267
|
# * Default: asc
|
255
268
|
#
|
256
269
|
# - page_size (int)
|
257
|
-
# * Number of results returned per page (max
|
270
|
+
# * Number of results returned per page (max 500)
|
258
271
|
# * Default: 50
|
259
272
|
#
|
260
273
|
# - offset (int)
|
@@ -290,7 +303,7 @@ class Contact < Entity
|
|
290
303
|
# * Default: asc
|
291
304
|
#
|
292
305
|
# - page_size (int)
|
293
|
-
# * Number of results returned per page (max
|
306
|
+
# * Number of results returned per page (max 500)
|
294
307
|
# * Default: 50
|
295
308
|
#
|
296
309
|
# - offset (int)
|
@@ -318,9 +331,9 @@ class Contact < Entity
|
|
318
331
|
#
|
319
332
|
# - vars (Hash)
|
320
333
|
# * Filter states by value of a custom variable (e.g. vars[email], vars[foo], etc.)
|
321
|
-
# * Allowed modifiers: vars[foo][
|
322
|
-
# vars[foo][
|
323
|
-
# vars[foo][
|
334
|
+
# * Allowed modifiers: vars[foo][ne], vars[foo][prefix], vars[foo][not_prefix],
|
335
|
+
# vars[foo][gte], vars[foo][gt], vars[foo][lt], vars[foo][lte], vars[foo][min],
|
336
|
+
# vars[foo][max], vars[foo][exists]
|
324
337
|
#
|
325
338
|
# - sort
|
326
339
|
# * Sort the results based on a field
|
@@ -333,7 +346,7 @@ class Contact < Entity
|
|
333
346
|
# * Default: asc
|
334
347
|
#
|
335
348
|
# - page_size (int)
|
336
|
-
# * Number of results returned per page (max
|
349
|
+
# * Number of results returned per page (max 500)
|
337
350
|
# * Default: 50
|
338
351
|
#
|
339
352
|
# - offset (int)
|
@@ -386,6 +399,10 @@ class Contact < Entity
|
|
386
399
|
get('time_created')
|
387
400
|
end
|
388
401
|
|
402
|
+
def time_updated
|
403
|
+
get('time_updated')
|
404
|
+
end
|
405
|
+
|
389
406
|
def send_blocked
|
390
407
|
get('send_blocked')
|
391
408
|
end
|
@@ -394,6 +411,14 @@ class Contact < Entity
|
|
394
411
|
set('send_blocked', value)
|
395
412
|
end
|
396
413
|
|
414
|
+
def conversation_status
|
415
|
+
get('conversation_status')
|
416
|
+
end
|
417
|
+
|
418
|
+
def conversation_status=(value)
|
419
|
+
set('conversation_status', value)
|
420
|
+
end
|
421
|
+
|
397
422
|
def last_message_time
|
398
423
|
get('last_message_time')
|
399
424
|
end
|
data/lib/telerivet/datatable.rb
CHANGED
@@ -22,9 +22,22 @@ module Telerivet
|
|
22
22
|
# * Updatable via API
|
23
23
|
#
|
24
24
|
# - num_rows (int)
|
25
|
-
# * Number of rows in the table
|
25
|
+
# * Number of rows in the table. For performance reasons, this number may sometimes be
|
26
|
+
# out-of-date.
|
26
27
|
# * Read-only
|
27
28
|
#
|
29
|
+
# - show_add_row (bool)
|
30
|
+
# * Whether to allow adding or importing rows via the web app
|
31
|
+
# * Updatable via API
|
32
|
+
#
|
33
|
+
# - show_stats (bool)
|
34
|
+
# * Whether to show row statistics in the web app
|
35
|
+
# * Updatable via API
|
36
|
+
#
|
37
|
+
# - show_contact_columns (bool)
|
38
|
+
# * Whether to show 'Contact Name' and 'Phone Number' columns in the web app
|
39
|
+
# * Updatable via API
|
40
|
+
#
|
28
41
|
# - vars (Hash)
|
29
42
|
# * Custom variables stored for this data table
|
30
43
|
# * Updatable via API
|
@@ -49,9 +62,9 @@ class DataTable < Entity
|
|
49
62
|
#
|
50
63
|
# - vars (Hash)
|
51
64
|
# * Filter data rows by value of a custom variable (e.g. vars[q1], vars[foo], etc.)
|
52
|
-
# * Allowed modifiers: vars[foo][
|
53
|
-
# vars[foo][
|
54
|
-
# vars[foo][
|
65
|
+
# * Allowed modifiers: vars[foo][ne], vars[foo][prefix], vars[foo][not_prefix],
|
66
|
+
# vars[foo][gte], vars[foo][gt], vars[foo][lt], vars[foo][lte], vars[foo][min],
|
67
|
+
# vars[foo][max], vars[foo][exists]
|
55
68
|
#
|
56
69
|
# - sort
|
57
70
|
# * Sort the results based on a field
|
@@ -64,7 +77,7 @@ class DataTable < Entity
|
|
64
77
|
# * Default: asc
|
65
78
|
#
|
66
79
|
# - page_size (int)
|
67
|
-
# * Number of results returned per page (max
|
80
|
+
# * Number of results returned per page (max 500)
|
68
81
|
# * Default: 50
|
69
82
|
#
|
70
83
|
# - offset (int)
|
@@ -136,8 +149,9 @@ class DataTable < Entity
|
|
136
149
|
|
137
150
|
#
|
138
151
|
# Gets a list of all fields (columns) defined for this data table. The return value is an
|
139
|
-
# array of objects with the properties 'name'
|
140
|
-
# created any time a DataRow's 'vars' property is
|
152
|
+
# array of objects with the properties 'name', 'variable', 'type', 'order', 'readonly', and
|
153
|
+
# 'lookup_key'. (Fields are automatically created any time a DataRow's 'vars' property is
|
154
|
+
# updated.)
|
141
155
|
#
|
142
156
|
# Returns:
|
143
157
|
# array
|
@@ -146,6 +160,37 @@ class DataTable < Entity
|
|
146
160
|
return @api.do_request("GET", get_base_api_path() + "/fields")
|
147
161
|
end
|
148
162
|
|
163
|
+
#
|
164
|
+
# Allows customizing how a field (column) is displayed in the Telerivet web app.
|
165
|
+
#
|
166
|
+
# Arguments:
|
167
|
+
# - variable
|
168
|
+
# * The variable name of the field to create or update.
|
169
|
+
# * Required
|
170
|
+
#
|
171
|
+
# - options (Hash)
|
172
|
+
#
|
173
|
+
# - name (string, max 64 characters)
|
174
|
+
# * Display name for the field
|
175
|
+
#
|
176
|
+
# - type (string)
|
177
|
+
# * Field type
|
178
|
+
# * Allowed values: text, long_text, number, boolean, email, url, audio, phone_number,
|
179
|
+
# date, date_time, groups, route, select, buttons, contact
|
180
|
+
#
|
181
|
+
# - order (int)
|
182
|
+
# * Order in which to display the field
|
183
|
+
#
|
184
|
+
# - readonly (bool)
|
185
|
+
# * Set to true to prevent editing the field in the Telerivet web app
|
186
|
+
#
|
187
|
+
# Returns:
|
188
|
+
# object
|
189
|
+
#
|
190
|
+
def set_field_metadata(variable, options = nil)
|
191
|
+
return @api.do_request("POST", get_base_api_path() + "/fields/#{variable}", options)
|
192
|
+
end
|
193
|
+
|
149
194
|
#
|
150
195
|
# Returns the number of rows for each value of a given variable. This can be used to get the
|
151
196
|
# total number of responses for each choice in a poll, without making a separate query for
|
@@ -194,6 +239,30 @@ class DataTable < Entity
|
|
194
239
|
get('num_rows')
|
195
240
|
end
|
196
241
|
|
242
|
+
def show_add_row
|
243
|
+
get('show_add_row')
|
244
|
+
end
|
245
|
+
|
246
|
+
def show_add_row=(value)
|
247
|
+
set('show_add_row', value)
|
248
|
+
end
|
249
|
+
|
250
|
+
def show_stats
|
251
|
+
get('show_stats')
|
252
|
+
end
|
253
|
+
|
254
|
+
def show_stats=(value)
|
255
|
+
set('show_stats', value)
|
256
|
+
end
|
257
|
+
|
258
|
+
def show_contact_columns
|
259
|
+
get('show_contact_columns')
|
260
|
+
end
|
261
|
+
|
262
|
+
def show_contact_columns=(value)
|
263
|
+
set('show_contact_columns', value)
|
264
|
+
end
|
265
|
+
|
197
266
|
def project_id
|
198
267
|
get('project_id')
|
199
268
|
end
|