1111"""
1212import requests
1313from time import sleep
14+ from urllib .parse import urlparse
1415from .exceptions import BitrixError
1516
1617
@@ -27,20 +28,48 @@ class Bitrix24(object):
2728 """
2829
2930 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 )
3136 self .timeout = timeout
3237
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' )
3542
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
4473
4574 def callMethod (self , method , ** params ):
4675 """Calls a REST method with specified parameters.
@@ -65,12 +94,12 @@ def callMethod(self, method, **params):
6594 # Looks like we need to wait until expires limitation time by Bitrix24 API
6695 sleep (2 )
6796 return self .callMethod (method , ** params )
68-
97+
6998 if 'error' in r :
7099 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
75104 return r ['result' ] + self .callMethod (method , ** params )
76105 return r ['result' ]
0 commit comments