From 1bcda48d3c4ace662c3613dc8238449e847bb8d7 Mon Sep 17 00:00:00 2001 From: Alexey Leshchenko <60138889+leshchenko1979@users.noreply.github.com> Date: Tue, 22 Sep 2020 14:56:02 +0300 Subject: [PATCH] correct_urlencode (#62) --- fast_bitrix24/mult_request.py | 6 +++--- fast_bitrix24/srh.py | 2 +- fast_bitrix24/utils.py | 31 ------------------------------- setup.py | 5 +++-- tests/test_.py | 17 +++++++++++++++-- 5 files changed, 22 insertions(+), 39 deletions(-) diff --git a/fast_bitrix24/mult_request.py b/fast_bitrix24/mult_request.py index 37a9fa5..af1b934 100644 --- a/fast_bitrix24/mult_request.py +++ b/fast_bitrix24/mult_request.py @@ -1,8 +1,7 @@ import more_itertools -import asyncio +import php import itertools -from .utils import convert_dict_to_bitrix_url from .srh import BITRIX_MAX_BATCH_SIZE from .server_response import ServerResponse @@ -26,12 +25,13 @@ async def run(self): def prepare_batches(self): batch_size = BITRIX_MAX_BATCH_SIZE + builder = php.Php() batches = [{ 'halt': 0, 'cmd': { self.batch_command_label(i, item): - f'{self.method}?{convert_dict_to_bitrix_url(item)}' + f'{self.method}?{builder.http_build_query(item)}' for i, item in enumerate(next_batch) }} for next_batch in more_itertools.chunked(self.item_list, batch_size) diff --git a/fast_bitrix24/srh.py b/fast_bitrix24/srh.py index 0262c42..7eb851b 100644 --- a/fast_bitrix24/srh.py +++ b/fast_bitrix24/srh.py @@ -5,7 +5,7 @@ from tqdm import tqdm from .server_response import ServerResponse -from .utils import convert_dict_to_bitrix_url, _url_valid +from .utils import _url_valid BITRIX_POOL_SIZE = 50 BITRIX_RPS = 2.0 diff --git a/fast_bitrix24/utils.py b/fast_bitrix24/utils.py index ff96f1d..4e6e0b5 100644 --- a/fast_bitrix24/utils.py +++ b/fast_bitrix24/utils.py @@ -14,37 +14,6 @@ def _url_valid(url): return False -def convert_dict_to_bitrix_url(data): - parents = list() - pairs = list() - - def renderKey(parents): - depth, outStr = 0, '' - for x in parents: - s = "[%s]" if (depth > 0 or isinstance(x, int)) and x!='[]' else "%s" - outStr += s % str(x) - depth += 1 - return outStr - - def r_urlencode(data): - if any(isinstance(data, t) for t in [list, tuple, set]): - data = list(data) - for i in range(len(data)): - parents.append('[]') - r_urlencode(data[i]) - parents.pop() - elif isinstance(data, dict): - for key, value in data.items(): - parents.append(key) - r_urlencode(value) - parents.pop() - else: - pairs.append((renderKey(parents), str(data))) - - return pairs - return urllib.parse.urlencode(r_urlencode(data)) - - def _merge_dict(d1, d2): d3 = d1.copy() if d2: diff --git a/setup.py b/setup.py index 62a5dbd..418ecfd 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="fast_bitrix24", - version="0.4.3", + version="0.4.4", author="Alexey Leshchenko", author_email="leshchenko@gmail.com", description="API wrapper для быстрого получения данных от Битрикс24 через REST API. Параллельные запросы к серверу, упаковка запросов в батчи, контроль скорости запросов.", @@ -26,7 +26,8 @@ 'aiohttp', 'asyncio', 'tqdm', - 'more_itertools' + 'more_itertools', + 'php' ], license="MIT" ) \ No newline at end of file diff --git a/tests/test_.py b/tests/test_.py index 0e6f2de..a2d82a4 100644 --- a/tests/test_.py +++ b/tests/test_.py @@ -21,9 +21,10 @@ def delete_all_leads(get_test): @pytest.fixture(scope='session') -def create_1000_leads(get_test): +def create_1000_leads(get_test, delete_all_leads): b = get_test + delete_all_leads with slow(1.2): lead_nos = b.call('crm.lead.add', [{ 'fields': { @@ -51,7 +52,6 @@ def test_simple_add_lead(self, get_test): def test_simple_get_all(self, get_test, delete_all_leads, create_1000_leads): b = get_test - delete_all_leads create_1000_leads leads = b.get_all('crm.lead.list') @@ -59,6 +59,19 @@ def test_simple_get_all(self, get_test, delete_all_leads, create_1000_leads): assert len(leads) == 1000 + def test_get_all_params(self, get_test, create_1000_leads): + b = get_test + create_1000_leads + + fields = ['ID', 'NAME'] + + leads = b.get_all('crm.lead.list', { + 'select': fields + }) + + assert len(fields) == len(leads[0]) + + class TestLongRequests: def test_long_task_description(self, get_test):