Skip to content

Commit 1eb34c8

Browse files
Akop KesheshyanAkop Kesheshyan
authored andcommitted
fix bugs with params transformation
1 parent 13de7ce commit 1eb34c8

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-6
lines changed

bitrix24/bitrix24.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,38 @@ def __init__(self, domain, timeout=60):
3131
self.domain = self._prepare_domain(domain)
3232
self.timeout = timeout
3333

34-
def _prepare_domain(string):
34+
def _prepare_domain(self, string):
3535
"""Normalize user passed domain to a valid one."""
3636
o = urlparse(string)
3737
user_id, code = o.path.split('/')[2:4]
3838
return "{0}://{1}/rest/{2}/{3}".format(o.scheme, o.netloc, user_id, code)
3939

40-
def _prepare_params(self, params, prev = ''):
40+
def _prepare_params(self, params, prev=''):
4141
"""Transforms list of params to a valid bitrix array."""
42+
ret = ''
4243
if isinstance(params, dict):
43-
ret = ''
4444
for key, value in params.items():
4545
if isinstance(value, dict):
4646
if prev:
4747
key = "{0}[{1}]".format(prev, key)
4848
ret += self._prepare_params(value, key)
4949
elif (isinstance(value, list) or isinstance(value, tuple)) and len(value) > 0:
5050
for offset, val in enumerate(value):
51-
ret += "{0}[{1}][{2}]={3}&".format(prev, key, offset, val)
51+
if isinstance(val, dict):
52+
ret += self._prepare_params(
53+
val, "{0}[{1}][{2}]".format(prev, key, offset))
54+
else:
55+
if prev:
56+
ret += "{0}[{1}][{2}]={3}&".format(
57+
prev, key, offset, val)
58+
else:
59+
ret += "{0}[{1}]={2}&".format(key, offset, val)
5260
else:
5361
if prev:
5462
ret += "{0}[{1}]={2}&".format(prev, key, value)
5563
else:
5664
ret += "{0}={1}&".format(key, value)
57-
return ret
65+
return ret
5866

5967
def callMethod(self, method, **params):
6068
"""Calls a REST method with specified parameters.
@@ -79,7 +87,7 @@ def callMethod(self, method, **params):
7987
# Looks like we need to wait until expires limitation time by Bitrix24 API
8088
sleep(2)
8189
return self.callMethod(method, **params)
82-
90+
8391
if 'error' in r:
8492
raise BitrixError(r)
8593
if 'start' not in params:

tests/test_bitrix24.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,55 @@ def test_call_non_exists_method(self):
2727
self.b24.callMethod('hello.world')
2828

2929

30+
class ParamsPreparationTest(unittest.TestCase):
31+
32+
def setUp(self):
33+
self.b24 = Bitrix24('http://example.bitrix24.com/rest/1/123456789')
34+
35+
def test_one_level(self):
36+
params = {"fruit": "apple"}
37+
param_string = self.b24._prepare_params(params)
38+
self.assertEqual(param_string, "fruit=apple&")
39+
40+
def test_one_level_several_items(self):
41+
params = {"fruit": "apple", "vegetable":"broccoli"}
42+
param_string = self.b24._prepare_params(params)
43+
self.assertEqual(param_string, "fruit=apple&vegetable=broccoli&")
44+
45+
def test_multi_level(self):
46+
params = {"fruit": {"citrus":"lemon"}}
47+
param_string = self.b24._prepare_params(params)
48+
self.assertEqual(param_string, "fruit[citrus]=lemon&")
49+
50+
def test_multi_level_deep(self):
51+
params = {"root": {"level 1":{"level 2":{"level 3":"value"}}}}
52+
param_string = self.b24._prepare_params(params)
53+
self.assertEqual(param_string, "root[level 1][level 2][level 3]=value&")
54+
55+
def test_list_dict_mixed(self):
56+
params = {"root":{"level 1":[{"list_dict 1": "value 1"}, {"list_dict 2": "value 2"}]}}
57+
param_string = self.b24._prepare_params(params)
58+
self.assertEqual(param_string, "root[level 1][0][list_dict 1]=value 1&root[level 1][1][list_dict 2]=value 2&")
59+
60+
def test_multi_level_several_items(self):
61+
params = {"fruit": {"citrus":"lemon", "sweet": "apple"}}
62+
param_string = self.b24._prepare_params(params)
63+
self.assertEqual(param_string, "fruit[citrus]=lemon&fruit[sweet]=apple&")
64+
65+
def test_list(self):
66+
params = {"fruit": ["lemon", "apple"]}
67+
param_string = self.b24._prepare_params(params)
68+
self.assertEqual(param_string, "fruit[0]=lemon&fruit[1]=apple&")
69+
70+
def test_tuple(self):
71+
params = {"fruit": ("lemon", "apple")}
72+
param_string = self.b24._prepare_params(params)
73+
self.assertEqual(param_string, "fruit[0]=lemon&fruit[1]=apple&")
74+
75+
def test_string(self):
76+
param_string = self.b24._prepare_params('')
77+
self.assertEqual(param_string, "")
78+
79+
3080
if __name__ == '__main__':
3181
unittest.main()

0 commit comments

Comments
 (0)