11
11
"""
12
12
import requests
13
13
from time import sleep
14
+ from urllib .parse import urlparse
14
15
from .exceptions import BitrixError
15
16
16
17
@@ -27,20 +28,48 @@ class Bitrix24(object):
27
28
"""
28
29
29
30
def __init__ (self , domain , timeout = 60 ):
30
- self .domain = domain
31
+ """Create Bitrix24 API object
32
+ :param domain: str Bitrix24 webhook domain
33
+ :param timeout: int Timeout for API request in seconds
34
+ """
35
+ self .domain = self ._prepare_domain (domain )
31
36
self .timeout = timeout
32
37
33
- def _prepare_params (self , params ):
34
- """Transforms list of params to a valid bitrix array."""
38
+ def _prepare_domain (self , domain ):
39
+ """Normalize user passed domain to a valid one."""
40
+ if domain == '' or not isinstance (domain , str ):
41
+ raise Exception ('Empty domain' )
35
42
36
- new_params = {}
37
- for index , value in params .items ():
38
- if type (value ) is dict :
39
- for i , v in value .items ():
40
- new_params ['%s[%s]' % (index , i )] = v
41
- else :
42
- new_params [index ] = value
43
- return new_params
43
+ o = urlparse (domain )
44
+ user_id , code = o .path .split ('/' )[2 :4 ]
45
+ return "{0}://{1}/rest/{2}/{3}" .format (o .scheme , o .netloc , user_id , code )
46
+
47
+ def _prepare_params (self , params , prev = '' ):
48
+ """Transforms list of params to a valid bitrix array."""
49
+ ret = ''
50
+ if isinstance (params , dict ):
51
+ for key , value in params .items ():
52
+ if isinstance (value , dict ):
53
+ if prev :
54
+ key = "{0}[{1}]" .format (prev , key )
55
+ ret += self ._prepare_params (value , key )
56
+ elif (isinstance (value , list ) or isinstance (value , tuple )) and len (value ) > 0 :
57
+ for offset , val in enumerate (value ):
58
+ if isinstance (val , dict ):
59
+ ret += self ._prepare_params (
60
+ val , "{0}[{1}][{2}]" .format (prev , key , offset ))
61
+ else :
62
+ if prev :
63
+ ret += "{0}[{1}][{2}]={3}&" .format (
64
+ prev , key , offset , val )
65
+ else :
66
+ ret += "{0}[{1}]={2}&" .format (key , offset , val )
67
+ else :
68
+ if prev :
69
+ ret += "{0}[{1}]={2}&" .format (prev , key , value )
70
+ else :
71
+ ret += "{0}={1}&" .format (key , value )
72
+ return ret
44
73
45
74
def callMethod (self , method , ** params ):
46
75
"""Calls a REST method with specified parameters.
@@ -65,12 +94,12 @@ def callMethod(self, method, **params):
65
94
# Looks like we need to wait until expires limitation time by Bitrix24 API
66
95
sleep (2 )
67
96
return self .callMethod (method , ** params )
68
-
97
+
69
98
if 'error' in r :
70
99
raise BitrixError (r )
71
- if 'page ' not in params :
72
- params ['page ' ] = 1
73
- if 'next' in r and r ['total' ] > ( r [ 'next' ] * params ['page' ]) :
74
- params ['page ' ] += 1
100
+ if 'start ' not in params :
101
+ params ['start ' ] = 0
102
+ if 'next' in r and r ['total' ] > params ['start' ] :
103
+ params ['start ' ] += 50
75
104
return r ['result' ] + self .callMethod (method , ** params )
76
105
return r ['result' ]
0 commit comments