Skip to content

Commit 194e8ac

Browse files
Неправильная обработка результата списочного метода в call
Fixes #173
1 parent b7bc2bd commit 194e8ac

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

fast_bitrix24/mult_request.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from asyncio import FIRST_COMPLETED, ensure_future, wait
2+
from beartype.typing import Dict, List, Union
23

34
from more_itertools import chunked
45
from tqdm import tqdm
@@ -20,7 +21,7 @@ def __init__(
2021
self.real_start = real_start
2122
self.mute = mute
2223

23-
self.results = []
24+
self.results = None
2425
self.task_iterator = self.generate_a_task()
2526
self.tasks = set()
2627

@@ -44,10 +45,10 @@ def generate_a_task(self):
4445
for batch in batches:
4546
yield ensure_future(self.srh.single_request("batch", batch))
4647

47-
def batch_command_label(self, i, item):
48+
def batch_command_label(self, i: int, item) -> str:
4849
return f"cmd{i:010}"
4950

50-
async def run(self):
51+
async def run(self) -> Union[Dict, List]:
5152
self.top_up_tasks()
5253

5354
with self.get_pbar() as pbar:
@@ -64,7 +65,7 @@ async def run(self):
6465

6566
return self.results
6667

67-
def top_up_tasks(self):
68+
def top_up_tasks(self) -> None:
6869
"""Добавляем в self.tasks столько задач, сколько свободных слотов для
6970
запросов есть сейчас в self.srh."""
7071

@@ -75,7 +76,7 @@ def top_up_tasks(self):
7576
except StopIteration:
7677
break
7778

78-
def process_done_tasks(self, done) -> int:
79+
def process_done_tasks(self, done: list) -> int:
7980
"""Извлечь результаты из списка законченных задач
8081
и вернуть кол-во извлеченных элементов."""
8182

@@ -84,7 +85,9 @@ def process_done_tasks(self, done) -> int:
8485
batch_response = done_task.result()
8586
extracted = ServerResponseParser(batch_response).extract_results()
8687

87-
if isinstance(extracted, list):
88+
if self.results is None:
89+
self.results = extracted
90+
elif isinstance(extracted, list):
8891
self.results.extend(extracted)
8992
elif isinstance(extracted, dict):
9093
self.results.update(extracted)
@@ -120,7 +123,6 @@ class MultipleServerRequestHandlerPreserveIDs(MultipleServerRequestHandler):
120123
def __init__(self, bitrix, method, item_list, ID_field):
121124
super().__init__(bitrix, method, item_list)
122125
self.ID_field = ID_field
123-
self.results = {}
124126

125127
def batch_command_label(self, i, item):
126128
return item[self.ID_field]

fast_bitrix24/user_request.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,13 @@ async def run(self):
241241
if is_single_item:
242242
self.item_list = [self.item_list]
243243

244-
results = tuple((await super().run()).values())
244+
raw_results = await super().run()
245+
246+
if isinstance(raw_results, dict):
247+
results = tuple(raw_results.values())
248+
else:
249+
# бывают случаи, чт возвращается список
250+
results = raw_results
245251

246252
return results[0] if is_single_item else results
247253

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
response = {
2+
"result": {
3+
"result": {"order0000000000": []},
4+
"result_error": [],
5+
"result_total": {"order0000000000": 0},
6+
"result_next": [],
7+
"result_time": {
8+
"order0000000000": {
9+
"start": 1654094027.205917,
10+
"finish": 1654094027.270924,
11+
"duration": 0.06500720977783203,
12+
"processing": 0.06493496894836426,
13+
"date_start": "2022-06-01T17:33:47+03:00",
14+
"date_finish": "2022-06-01T17:33:47+03:00",
15+
"operating": 0,
16+
}
17+
},
18+
},
19+
"time": {
20+
"start": 1654094027.096381,
21+
"finish": 1654094027.27095,
22+
"duration": 0.17456912994384766,
23+
"processing": 0.06515002250671387,
24+
"date_start": "2022-06-01T17:33:47+03:00",
25+
"date_finish": "2022-06-01T17:33:47+03:00",
26+
"operating": 0,
27+
},
28+
}

tests/test_server_responses.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,14 @@ def test_call_several_success(bx_dummy):
6565
assert isinstance(results, tuple)
6666
assert len(results) == 3
6767
assert isinstance(results[0], dict)
68+
69+
70+
def test_call_list_empty(bx_dummy):
71+
from tests.real_responses.batch_list_empty import response
72+
73+
bx_dummy.srh = MockSRH(response)
74+
results = bx_dummy.call(
75+
"crm.lead.list", ({"filter": {"PHONE": "+0000877578564"}, "select": ["ID"]},)
76+
)
77+
assert isinstance(results, list)
78+
assert len(results) == 0

0 commit comments

Comments
 (0)