vobiz-python 0.1.0__py3-none-any.whl

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.
Files changed (63) hide show
  1. vobiz/__init__.py +4 -0
  2. vobiz/base.py +237 -0
  3. vobiz/exceptions.py +34 -0
  4. vobiz/resources/__init__.py +12 -0
  5. vobiz/resources/accounts.py +59 -0
  6. vobiz/resources/applications.py +138 -0
  7. vobiz/resources/calls_vobiz.py +206 -0
  8. vobiz/resources/cdrs.py +46 -0
  9. vobiz/resources/credentials.py +104 -0
  10. vobiz/resources/endpoints.py +101 -0
  11. vobiz/resources/ip_access_control_lists.py +100 -0
  12. vobiz/resources/numbers.py +134 -0
  13. vobiz/resources/origination_uris.py +109 -0
  14. vobiz/resources/recordings.py +91 -0
  15. vobiz/resources/sip_trunks.py +99 -0
  16. vobiz/resources/subaccounts.py +101 -0
  17. vobiz/rest/__init__.py +2 -0
  18. vobiz/rest/client.py +277 -0
  19. vobiz/utils/__init__.py +72 -0
  20. vobiz/utils/interactive.py +50 -0
  21. vobiz/utils/jwt.py +97 -0
  22. vobiz/utils/location.py +6 -0
  23. vobiz/utils/signature_v3.py +111 -0
  24. vobiz/utils/template.py +50 -0
  25. vobiz/utils/validators.py +280 -0
  26. vobiz/version.py +2 -0
  27. vobiz/xml/ConferenceElement.py +485 -0
  28. vobiz/xml/DTMFElement.py +41 -0
  29. vobiz/xml/DialElement.py +371 -0
  30. vobiz/xml/MultiPartyCallElement.py +711 -0
  31. vobiz/xml/ResponseElement.py +414 -0
  32. vobiz/xml/VobizXMLElement.py +48 -0
  33. vobiz/xml/__init__.py +31 -0
  34. vobiz/xml/breakElement.py +62 -0
  35. vobiz/xml/contElement.py +190 -0
  36. vobiz/xml/emphasisElement.py +174 -0
  37. vobiz/xml/getDigitsElement.py +294 -0
  38. vobiz/xml/getInputElement.py +369 -0
  39. vobiz/xml/hangupElement.py +57 -0
  40. vobiz/xml/langElement.py +197 -0
  41. vobiz/xml/messageElement.py +115 -0
  42. vobiz/xml/numberElement.py +77 -0
  43. vobiz/xml/pElement.py +164 -0
  44. vobiz/xml/phonemeElement.py +62 -0
  45. vobiz/xml/playElement.py +41 -0
  46. vobiz/xml/preAnswerElement.py +148 -0
  47. vobiz/xml/prosodyElement.py +227 -0
  48. vobiz/xml/recordElement.py +337 -0
  49. vobiz/xml/redirectElement.py +42 -0
  50. vobiz/xml/sElement.py +154 -0
  51. vobiz/xml/sayAsElement.py +61 -0
  52. vobiz/xml/speakElement.py +249 -0
  53. vobiz/xml/streamElement.py +123 -0
  54. vobiz/xml/subElement.py +43 -0
  55. vobiz/xml/userElement.py +79 -0
  56. vobiz/xml/wElement.py +144 -0
  57. vobiz/xml/waitElement.py +93 -0
  58. vobiz/xml/xmlUtils.py +6 -0
  59. vobiz_python-0.1.0.dist-info/METADATA +640 -0
  60. vobiz_python-0.1.0.dist-info/RECORD +63 -0
  61. vobiz_python-0.1.0.dist-info/WHEEL +5 -0
  62. vobiz_python-0.1.0.dist-info/licenses/LICENSE.txt +19 -0
  63. vobiz_python-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,414 @@
1
+ from vobiz.xml import (ConferenceElement, DialElement, DTMFElement,
2
+ GetDigitsElement, GetInputElement, HangupElement,
3
+ MessageElement, PlayElement, VobizXMLElement,
4
+ PreAnswerElement, RecordElement, RedirectElement,
5
+ SpeakElement, WaitElement, MultiPartyCallElement
6
+ )
7
+
8
+
9
+ class ResponseElement(VobizXMLElement):
10
+ _name = 'Response'
11
+ _nestable = [
12
+ 'Conference',
13
+ 'Dial',
14
+ 'DTMF',
15
+ 'GetDigits',
16
+ 'GetInput',
17
+ 'Hangup',
18
+ 'Message',
19
+ 'Play',
20
+ 'PreAnswer',
21
+ 'Record',
22
+ 'Redirect',
23
+ 'Speak',
24
+ 'Wait',
25
+ 'MultiPartyCall',
26
+ 'Stream'
27
+ ]
28
+
29
+ def add_conference(
30
+ self,
31
+ content,
32
+ muted=None,
33
+ enter_sound=None,
34
+ exit_sound=None,
35
+ start_conference_on_enter=None,
36
+ end_conference_on_exit=None,
37
+ stay_alone=None,
38
+ wait_sound=None,
39
+ max_members=None,
40
+ record=None,
41
+ record_file_format=None,
42
+ time_limit=None,
43
+ hangup_on_star=None,
44
+ action=None,
45
+ method=None,
46
+ callback_url=None,
47
+ callback_method=None,
48
+ digits_match=None,
49
+ floor_event=None,
50
+ redirect=None,
51
+ relay_dtmf=None,
52
+ ):
53
+ self.add(
54
+ ConferenceElement(
55
+ content=content,
56
+ muted=muted,
57
+ enter_sound=enter_sound,
58
+ exit_sound=exit_sound,
59
+ start_conference_on_enter=start_conference_on_enter,
60
+ end_conference_on_exit=end_conference_on_exit,
61
+ stay_alone=stay_alone,
62
+ wait_sound=wait_sound,
63
+ max_members=max_members,
64
+ record=record,
65
+ record_file_format=record_file_format,
66
+ time_limit=time_limit,
67
+ hangup_on_star=hangup_on_star,
68
+ action=action,
69
+ method=method,
70
+ callback_url=callback_url,
71
+ callback_method=callback_method,
72
+ digits_match=digits_match,
73
+ floor_event=floor_event,
74
+ redirect=redirect,
75
+ relay_dtmf=relay_dtmf,
76
+ ))
77
+ return self
78
+
79
+ def add_dial(
80
+ self,
81
+ action=None,
82
+ method=None,
83
+ hangup_on_star=None,
84
+ time_limit=None,
85
+ timeout=None,
86
+ caller_id=None,
87
+ caller_name=None,
88
+ confirm_sound=None,
89
+ confirm_key=None,
90
+ dial_music=None,
91
+ callback_url=None,
92
+ callback_method=None,
93
+ redirect=None,
94
+ digits_match=None,
95
+ digits_match_b_leg=None,
96
+ sip_headers=None,
97
+ ):
98
+ self.add(
99
+ DialElement(
100
+ action=action,
101
+ method=method,
102
+ hangup_on_star=hangup_on_star,
103
+ time_limit=time_limit,
104
+ timeout=timeout,
105
+ caller_id=caller_id,
106
+ caller_name=caller_name,
107
+ confirm_sound=confirm_sound,
108
+ confirm_key=confirm_key,
109
+ dial_music=dial_music,
110
+ callback_url=callback_url,
111
+ callback_method=callback_method,
112
+ redirect=redirect,
113
+ digits_match=digits_match,
114
+ digits_match_b_leg=digits_match_b_leg,
115
+ sip_headers=sip_headers,
116
+ ))
117
+ return self
118
+
119
+ def add_dtmf(
120
+ self,
121
+ content,
122
+ async_=None,
123
+ ):
124
+ self.add(DTMFElement(
125
+ content=content,
126
+ async_=async_,
127
+ ))
128
+ return self
129
+
130
+ def add_get_digits(
131
+ self,
132
+ action=None,
133
+ method=None,
134
+ timeout=None,
135
+ digit_timeout=None,
136
+ finish_on_key=None,
137
+ num_digits=None,
138
+ retries=None,
139
+ redirect=None,
140
+ play_beep=None,
141
+ valid_digits=None,
142
+ invalid_digits_sound=None,
143
+ log=None,
144
+ ):
145
+ self.add(
146
+ GetDigitsElement(
147
+ action=action,
148
+ method=method,
149
+ timeout=timeout,
150
+ digit_timeout=digit_timeout,
151
+ finish_on_key=finish_on_key,
152
+ num_digits=num_digits,
153
+ retries=retries,
154
+ redirect=redirect,
155
+ play_beep=play_beep,
156
+ valid_digits=valid_digits,
157
+ invalid_digits_sound=invalid_digits_sound,
158
+ log=log,
159
+ ))
160
+ return self
161
+
162
+ def add_get_input(
163
+ self,
164
+ action=None,
165
+ method=None,
166
+ input_type=None,
167
+ execution_timeout=None,
168
+ digit_end_timeout=None,
169
+ speech_end_timeout=None,
170
+ finish_on_key=None,
171
+ num_digits=None,
172
+ speech_model=None,
173
+ hints=None,
174
+ language=None,
175
+ interim_speech_results_callback=None,
176
+ interim_speech_results_callback_method=None,
177
+ log=None,
178
+ redirect=None,
179
+ profanity_filter=None,
180
+ ):
181
+ self.add(
182
+ GetInputElement(
183
+ action=action,
184
+ method=method,
185
+ input_type=input_type,
186
+ execution_timeout=execution_timeout,
187
+ digit_end_timeout=digit_end_timeout,
188
+ speech_end_timeout=speech_end_timeout,
189
+ finish_on_key=finish_on_key,
190
+ num_digits=num_digits,
191
+ speech_model=speech_model,
192
+ hints=hints,
193
+ language=language,
194
+ interim_speech_results_callback=interim_speech_results_callback,
195
+ interim_speech_results_callback_method=interim_speech_results_callback_method,
196
+ log=log,
197
+ redirect=redirect,
198
+ profanity_filter=profanity_filter,
199
+ ))
200
+ return self
201
+
202
+ def add_hangup(
203
+ self,
204
+ reason=None,
205
+ schedule=None,
206
+ ):
207
+ self.add(HangupElement(
208
+ reason=reason,
209
+ schedule=schedule,
210
+ ))
211
+ return self
212
+
213
+ def add_message(
214
+ self,
215
+ content,
216
+ src=None,
217
+ dst=None,
218
+ type=None,
219
+ callback_url=None,
220
+ callback_method=None,
221
+ ):
222
+ self.add(
223
+ MessageElement(
224
+ content=content,
225
+ src=src,
226
+ dst=dst,
227
+ type=type,
228
+ callback_url=callback_url,
229
+ callback_method=callback_method,
230
+ ))
231
+ return self
232
+
233
+ def add_play(
234
+ self,
235
+ content,
236
+ loop=None,
237
+ ):
238
+ self.add(PlayElement(
239
+ content=content,
240
+ loop=loop,
241
+ ))
242
+ return self
243
+
244
+ def add_pre_answer(self, ):
245
+ self.add(PreAnswerElement())
246
+ return self
247
+
248
+ def add_record(
249
+ self,
250
+ action=None,
251
+ method=None,
252
+ file_format=None,
253
+ redirect=None,
254
+ timeout=None,
255
+ max_length=None,
256
+ play_beep=None,
257
+ finish_on_key=None,
258
+ record_session=None,
259
+ start_on_dial_answer=None,
260
+ transcription_type=None,
261
+ transcription_url=None,
262
+ transcription_report_type=None,
263
+ transcription_method=None,
264
+ callback_url=None,
265
+ callback_method=None,
266
+ ):
267
+ self.add(
268
+ RecordElement(
269
+ action=action,
270
+ method=method,
271
+ file_format=file_format,
272
+ redirect=redirect,
273
+ timeout=timeout,
274
+ max_length=max_length,
275
+ play_beep=play_beep,
276
+ finish_on_key=finish_on_key,
277
+ record_session=record_session,
278
+ start_on_dial_answer=start_on_dial_answer,
279
+ transcription_type=transcription_type,
280
+ transcription_url=transcription_url,
281
+ transcription_report_type=transcription_report_type,
282
+ transcription_method=transcription_method,
283
+ callback_url=callback_url,
284
+ callback_method=callback_method,
285
+ ))
286
+ return self
287
+
288
+ def add_redirect(
289
+ self,
290
+ content,
291
+ method=None,
292
+ ):
293
+ self.add(RedirectElement(
294
+ content=content,
295
+ method=method,
296
+ ))
297
+ return self
298
+
299
+ def add_speak(
300
+ self,
301
+ content,
302
+ voice=None,
303
+ language=None,
304
+ loop=None,
305
+ ):
306
+ self.add(
307
+ SpeakElement(
308
+ content=content,
309
+ voice=voice,
310
+ language=language,
311
+ loop=loop,
312
+ ))
313
+ return self
314
+
315
+ def add_wait(
316
+ self,
317
+ length=None,
318
+ silence=None,
319
+ min_silence=None,
320
+ beep=None,
321
+ ):
322
+ self.add(
323
+ WaitElement(
324
+ length=length,
325
+ silence=silence,
326
+ min_silence=min_silence,
327
+ beep=beep,
328
+ ))
329
+ return self
330
+
331
+ def add_multi_party_call(self,
332
+ content,
333
+ role,
334
+ max_duration=14400,
335
+ max_participants=10,
336
+ wait_music_url=None,
337
+ wait_music_method="GET",
338
+ wait_time=None,
339
+ agent_hold_music_url=None,
340
+ agent_hold_music_method='GET',
341
+ customer_hold_music_url=None,
342
+ customer_hold_music_method='GET',
343
+ recording_callback_url=None,
344
+ recording_callback_method='GET',
345
+ status_callback_url=None,
346
+ status_callback_method='GET',
347
+ on_exit_action_url=None,
348
+ on_exit_action_method='POST',
349
+ record=False,
350
+ record_file_format='mp3',
351
+ status_callback_events='mpc-state-changes,participant-state-changes',
352
+ stay_alone=False,
353
+ coach_mode=True,
354
+ mute=False,
355
+ hold=False,
356
+ start_mpc_on_enter=True,
357
+ end_mpc_on_exit=False,
358
+ relay_dtmf_inputs=False,
359
+ enter_sound='beep:1',
360
+ enter_sound_method='GET',
361
+ exit_sound='beep:2',
362
+ exit_sound_method='GET',
363
+ start_recording_audio=None,
364
+ start_recording_audio_method='GET',
365
+ stop_recording_audio=None,
366
+ stop_recording_audio_method='GET',
367
+ transcript=False,
368
+ transcription_url=None
369
+ ):
370
+ self.add(
371
+ MultiPartyCallElement(
372
+ content=content,
373
+ role=role,
374
+ max_duration=max_duration,
375
+ max_participants=max_participants,
376
+ wait_music_url=wait_music_url,
377
+ wait_music_method=wait_music_method,
378
+ wait_time=wait_time,
379
+ agent_hold_music_url=agent_hold_music_url,
380
+ agent_hold_music_method=agent_hold_music_method,
381
+ customer_hold_music_url=customer_hold_music_url,
382
+ customer_hold_music_method=customer_hold_music_method,
383
+ record=record,
384
+ record_file_format=record_file_format,
385
+ recording_callback_url=recording_callback_url,
386
+ recording_callback_method=recording_callback_method,
387
+ status_callback_events=status_callback_events,
388
+ status_callback_url=status_callback_url,
389
+ status_callback_method=status_callback_method,
390
+ stay_alone=stay_alone,
391
+ coach_mode=coach_mode,
392
+ mute=mute,
393
+ hold=hold,
394
+ start_mpc_on_enter=start_mpc_on_enter,
395
+ end_mpc_on_exit=end_mpc_on_exit,
396
+ enter_sound=enter_sound,
397
+ enter_sound_method=enter_sound_method,
398
+ exit_sound=exit_sound,
399
+ exit_sound_method=exit_sound_method,
400
+ on_exit_action_url=on_exit_action_url,
401
+ on_exit_action_method=on_exit_action_method,
402
+ relay_dtmf_inputs=relay_dtmf_inputs,
403
+ start_recording_audio=start_recording_audio,
404
+ start_recording_audio_method=start_recording_audio_method,
405
+ stop_recording_audio=stop_recording_audio,
406
+ stop_recording_audio_method=stop_recording_audio_method,
407
+ transcript=transcript,
408
+ transcription_url=transcription_url
409
+ )
410
+ )
411
+ return self
412
+
413
+ def to_dict(self):
414
+ return {}
@@ -0,0 +1,48 @@
1
+ from lxml import etree
2
+ from vobiz.exceptions import VobizXMLError
3
+
4
+
5
+ class VobizXMLElement(object):
6
+ def __init__(self):
7
+ self.content = ''
8
+ self.children = []
9
+
10
+ def add(self, element):
11
+ if not isinstance(element, VobizXMLElement):
12
+ raise VobizXMLError('element must be a VobizXMLElement')
13
+
14
+ if element._name not in self._nestable:
15
+ raise VobizXMLError(
16
+ '{} is not nestable in {} (allowed: {})'.format(
17
+ element._name, self._name, self._nestable))
18
+ self.children.append(element)
19
+ return self
20
+
21
+ def continue_speak(self, body=None):
22
+ return body.replace('<cont>', ' ').replace('</cont>', ' ')
23
+
24
+ def to_string(self, pretty=True):
25
+ s = self.continue_speak(etree.tostring(self._to_element(), pretty_print=pretty, encoding='unicode'))
26
+
27
+ if not isinstance(s, str):
28
+ s = s.encode('utf-8')
29
+ return s
30
+
31
+ def _to_element(self, parent=None):
32
+ e = etree.SubElement(
33
+ parent, self._name,
34
+ **self.to_dict()) if parent is not None else etree.Element(
35
+ self._name, **self.to_dict())
36
+ if self.content:
37
+ try:
38
+ if False:
39
+ e.text = self.content.decode()
40
+ elif isinstance(self.content, bytes):
41
+ e.text = self.content.decode()
42
+ else:
43
+ e.text = self.content
44
+ except:
45
+ e.text = self.content
46
+ for child in self.children:
47
+ child._to_element(parent=e)
48
+ return e
vobiz/xml/__init__.py ADDED
@@ -0,0 +1,31 @@
1
+ from .xmlUtils import map_type
2
+ from .VobizXMLElement import VobizXMLElement
3
+ from .ConferenceElement import ConferenceElement
4
+ from .DTMFElement import DTMFElement
5
+ from .MultiPartyCallElement import MultiPartyCallElement
6
+ from .hangupElement import HangupElement
7
+ from .messageElement import MessageElement
8
+ from .numberElement import NumberElement
9
+ from .playElement import PlayElement
10
+ from .waitElement import WaitElement
11
+ from .recordElement import RecordElement
12
+ from .redirectElement import RedirectElement
13
+ from .userElement import UserElement
14
+ from .breakElement import BreakElement
15
+ from .langElement import LangElement
16
+ from .emphasisElement import EmphasisElement
17
+ from .speakElement import SpeakElement
18
+ from .getDigitsElement import GetDigitsElement
19
+ from .getInputElement import GetInputElement
20
+ from .preAnswerElement import PreAnswerElement
21
+ from .DialElement import DialElement
22
+ from .ResponseElement import ResponseElement
23
+ from .pElement import PElement
24
+ from .phonemeElement import PhonemeElement
25
+ from .prosodyElement import ProsodyElement
26
+ from .sElement import SElement
27
+ from .sayAsElement import SayAsElement
28
+ from .subElement import SubElement
29
+ from .wElement import WElement
30
+ from .contElement import ContElement
31
+ from .streamElement import StreamElement
@@ -0,0 +1,62 @@
1
+ from vobiz.utils.validators import *
2
+ from vobiz.xml import VobizXMLElement, map_type
3
+
4
+
5
+ class BreakElement(VobizXMLElement):
6
+ _name = 'break'
7
+ _nestable = []
8
+
9
+ @property
10
+ def strength(self):
11
+ return self.__strength
12
+
13
+ @strength.setter
14
+ def strength(self, value):
15
+ self.__strength = str(
16
+ value) if value is not None else None
17
+
18
+ @validate_args(
19
+ value=[of_type(str)],
20
+ )
21
+ def set_strength(self, value):
22
+ self.strength = value
23
+ return self
24
+
25
+ @property
26
+ def time(self):
27
+ return self.__time
28
+
29
+ @time.setter
30
+ def time(self, value):
31
+ self.__time = str(
32
+ value) if value is not None else None
33
+
34
+ @validate_args(
35
+ value=[of_type(str)],
36
+ )
37
+ def set_time(self, value):
38
+ self.time = value
39
+ return self
40
+
41
+ def __init__(
42
+ self,
43
+ content=None,
44
+ strength=None,
45
+ time=None,
46
+ ):
47
+
48
+ super(BreakElement, self).__init__()
49
+ self.content = content
50
+ self.strength = strength
51
+ self.time = time
52
+
53
+ def to_dict(self):
54
+ d = {
55
+ 'strength': self.strength,
56
+ 'time': self.time,
57
+ }
58
+
59
+ return {
60
+ k: str(map_type(v))
61
+ for k, v in d.items() if v is not None
62
+ }