Skip to content

Commit 5a8978f

Browse files
Исправить результаты get_by_ID(), если метод возвращает список (#204)
1 parent 15e2b2f commit 5a8978f

File tree

5 files changed

+262
-13
lines changed

5 files changed

+262
-13
lines changed

fast_bitrix24/mult_request.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@
1111

1212
class MultipleServerRequestHandler:
1313
def __init__(
14-
self, bitrix, method, item_list, real_len=None, real_start=0, mute=False
14+
self,
15+
bitrix,
16+
method,
17+
item_list,
18+
real_len=None,
19+
real_start=0,
20+
mute=False,
21+
get_by_ID=False,
1522
):
1623
self.bitrix = bitrix
1724
self.srh: ServerRequestHandler = bitrix.srh
@@ -20,6 +27,7 @@ def __init__(
2027
self.real_len = real_len
2128
self.real_start = real_start
2229
self.mute = mute
30+
self.get_by_ID = get_by_ID
2331

2432
self.results = None
2533
self.task_iterator = self.generate_a_task()
@@ -82,8 +90,9 @@ def process_done_tasks(self, done: list) -> int:
8290

8391
extracted_len = 0
8492
for done_task in done:
85-
batch_response = done_task.result()
86-
extracted = ServerResponseParser(batch_response).extract_results()
93+
extracted = ServerResponseParser(
94+
done_task.result(), self.get_by_ID
95+
).extract_results()
8796

8897
if self.results is None:
8998
self.results = extracted
@@ -120,8 +129,8 @@ def update(*args):
120129

121130

122131
class MultipleServerRequestHandlerPreserveIDs(MultipleServerRequestHandler):
123-
def __init__(self, bitrix, method, item_list, ID_field):
124-
super().__init__(bitrix, method, item_list)
132+
def __init__(self, bitrix, method, item_list, ID_field, get_by_ID):
133+
super().__init__(bitrix, method, item_list, get_by_ID=get_by_ID)
125134
self.ID_field = ID_field
126135

127136
def batch_command_label(self, i, item):

fast_bitrix24/server_response.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import contextlib
21
from itertools import chain
32

43
from beartype.typing import Dict, List, Union
@@ -9,8 +8,9 @@ class ErrorInServerResponseException(Exception):
98

109

1110
class ServerResponseParser:
12-
def __init__(self, response: dict):
11+
def __init__(self, response: dict, get_by_ID: bool = False):
1312
self.response = response
13+
self.get_by_ID = get_by_ID
1414

1515
def more_results_expected(self) -> bool:
1616
return self.total and self.total > 50 and self.total != len(self.result)
@@ -42,11 +42,14 @@ def extract_results(self) -> Union[Dict, List[Dict]]:
4242
"""
4343
self.raise_for_errors()
4444

45-
if self.is_batch():
46-
return self.extract_from_batch_response(self.result["result"])
47-
else:
45+
if not self.is_batch():
4846
return self.extract_from_single_response(self.result)
4947

48+
if self.get_by_ID:
49+
return self.extract_from_single_response(self.result["result"])
50+
else:
51+
return self.extract_from_batch_response(self.result["result"])
52+
5053
def raise_for_errors(self):
5154
errors = self.extract_errors()
5255
if errors:

fast_bitrix24/user_request.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,11 @@ async def run(self) -> dict:
211211
self.prepare_item_list()
212212

213213
results = await MultipleServerRequestHandlerPreserveIDs(
214-
self.bitrix, self.method, self.item_list, ID_field=self.ID_field_name
214+
self.bitrix,
215+
self.method,
216+
self.item_list,
217+
ID_field=self.ID_field_name,
218+
get_by_ID=True,
215219
).run()
216220

217221
return results
@@ -248,12 +252,20 @@ async def run(self):
248252
if is_single_item:
249253
self.item_list = [self.item_list]
250254

251-
raw_results = await super().run()
255+
self.prepare_item_list()
256+
257+
raw_results = await MultipleServerRequestHandlerPreserveIDs(
258+
self.bitrix,
259+
self.method,
260+
self.item_list,
261+
ID_field=self.ID_field_name,
262+
get_by_ID=False,
263+
).run()
252264

253265
if isinstance(raw_results, dict):
254266
results = tuple(raw_results.values())
255267
else:
256-
# бывают случаи, чт возвращается список
268+
# бывают случаи, что возвращается список
257269
results = raw_results
258270

259271
return results[0] if is_single_item else results
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
request = {
2+
"method": "batch",
3+
"params": {
4+
"halt": 0,
5+
"cmd": {
6+
"2": "crm.dealcategory.stage.list?ID=2&",
7+
"4": "crm.dealcategory.stage.list?ID=4&",
8+
"8": "crm.dealcategory.stage.list?ID=8&",
9+
0: "crm.dealcategory.stage.list?ID=0&",
10+
},
11+
},
12+
}
13+
14+
response = {
15+
"result": {
16+
"result": {
17+
"2": [
18+
{"NAME": "Сбор документов", "SORT": 10, "STATUS_ID": "C2:NEW"},
19+
{
20+
"NAME": "Ожидание оплаты судебных расходов",
21+
"SORT": 20,
22+
"STATUS_ID": "C2:PREPARATION",
23+
},
24+
{
25+
"NAME": "Подготовка искового заявления",
26+
"SORT": 30,
27+
"STATUS_ID": "C2:PREPAYMENT_INVOICE",
28+
},
29+
{"NAME": "Согласование с АУ", "SORT": 40, "STATUS_ID": "C2:UC_LAFJPE"},
30+
{
31+
"NAME": "Подача заявления в суд",
32+
"SORT": 50,
33+
"STATUS_ID": "C2:EXECUTING",
34+
},
35+
{
36+
"NAME": "Ожидание даты заседания",
37+
"SORT": 60,
38+
"STATUS_ID": "C2:FINAL_INVOICE",
39+
},
40+
{"NAME": "Ожидание суда", "SORT": 70, "STATUS_ID": "C2:1"},
41+
{"NAME": "Суд отложен", "SORT": 80, "STATUS_ID": "C2:2"},
42+
{
43+
"NAME": "Реструктуризация долга",
44+
"SORT": 90,
45+
"STATUS_ID": "C2:UC_KFEKZL",
46+
},
47+
{
48+
"NAME": "Реализация имущества",
49+
"SORT": 100,
50+
"STATUS_ID": "C2:UC_XW9GZN",
51+
},
52+
{"NAME": "Долги списаны", "SORT": 110, "STATUS_ID": "C2:WON"},
53+
{"NAME": "Ушел к конкурентам", "SORT": 120, "STATUS_ID": "C2:LOSE"},
54+
{"NAME": "Не может собрать СИ", "SORT": 130, "STATUS_ID": "C2:APOLOGY"},
55+
{
56+
"NAME": "Отговорили друзья/родственники",
57+
"SORT": 140,
58+
"STATUS_ID": "C2:3",
59+
},
60+
{"NAME": "Не выходит на связь", "SORT": 150, "STATUS_ID": "C2:4"},
61+
{
62+
"NAME": "Расторгли мы, так как не платит",
63+
"SORT": 160,
64+
"STATUS_ID": "C2:5",
65+
},
66+
],
67+
"4": [
68+
{"NAME": "1 оплата получена", "SORT": 10, "STATUS_ID": "C4:NEW"},
69+
{
70+
"NAME": "2 оплата получена",
71+
"SORT": 20,
72+
"STATUS_ID": "C4:PREPARATION",
73+
},
74+
{
75+
"NAME": "3 оплата получена",
76+
"SORT": 30,
77+
"STATUS_ID": "C4:PREPAYMENT_INVOICE",
78+
},
79+
{"NAME": "4 оплата получена", "SORT": 40, "STATUS_ID": "C4:EXECUTING"},
80+
{
81+
"NAME": "5 оплата получена",
82+
"SORT": 50,
83+
"STATUS_ID": "C4:FINAL_INVOICE",
84+
},
85+
{"NAME": "6 оплата получена", "SORT": 60, "STATUS_ID": "C4:1"},
86+
{"NAME": "7 оплата получена", "SORT": 70, "STATUS_ID": "C4:2"},
87+
{"NAME": "8 оплата получена", "SORT": 80, "STATUS_ID": "C4:3"},
88+
{"NAME": "9 оплата получена", "SORT": 90, "STATUS_ID": "C4:4"},
89+
{"NAME": "10 оплата получена", "SORT": 100, "STATUS_ID": "C4:5"},
90+
{"NAME": "11 оплата получена", "SORT": 110, "STATUS_ID": "C4:6"},
91+
{"NAME": "12 оплата получена", "SORT": 120, "STATUS_ID": "C4:7"},
92+
{"NAME": "Заморожен", "SORT": 130, "STATUS_ID": "C4:8"},
93+
{"NAME": "Клиент на расторжении", "SORT": 140, "STATUS_ID": "C4:9"},
94+
{"NAME": "Сделка успешна", "SORT": 150, "STATUS_ID": "C4:WON"},
95+
{"NAME": "Ушел к конкурентам", "SORT": 160, "STATUS_ID": "C4:LOSE"},
96+
{"NAME": "Не может собрать СИ", "SORT": 170, "STATUS_ID": "C4:APOLOGY"},
97+
{
98+
"NAME": "Отговорили друзья/родственники",
99+
"SORT": 180,
100+
"STATUS_ID": "C4:10",
101+
},
102+
{"NAME": "Не выходит на связь", "SORT": 190, "STATUS_ID": "C4:11"},
103+
{
104+
"NAME": "Расторгли мы, так как не платит",
105+
"SORT": 200,
106+
"STATUS_ID": "C4:12",
107+
},
108+
],
109+
"8": [
110+
{"NAME": "В работе", "SORT": 10, "STATUS_ID": "C8:NEW"},
111+
{
112+
"NAME": "Встреча назначена",
113+
"SORT": 20,
114+
"STATUS_ID": "C8:PREPARATION",
115+
},
116+
{
117+
"NAME": "Встреча состоялась",
118+
"SORT": 30,
119+
"STATUS_ID": "C8:PREPAYMENT_INVOICE",
120+
},
121+
{"NAME": "Договор подписан", "SORT": 40, "STATUS_ID": "C8:EXECUTING"},
122+
{
123+
"NAME": "Получен аванс 3000 р",
124+
"SORT": 50,
125+
"STATUS_ID": "C8:FINAL_INVOICE",
126+
},
127+
{"NAME": "Первая оплата получена", "SORT": 60, "STATUS_ID": "C8:WON"},
128+
{"NAME": "Сделка провалена", "SORT": 70, "STATUS_ID": "C8:LOSE"},
129+
{
130+
"NAME": "Анализ причины провала",
131+
"SORT": 80,
132+
"STATUS_ID": "C8:APOLOGY",
133+
},
134+
],
135+
"0": [
136+
{"NAME": "В работе", "SORT": 10, "STATUS_ID": "NEW"},
137+
{"NAME": "Встреча назначена", "SORT": 20, "STATUS_ID": "PREPARATION"},
138+
{
139+
"NAME": "Встреча состоялась",
140+
"SORT": 30,
141+
"STATUS_ID": "PREPAYMENT_INVOICE",
142+
},
143+
{"NAME": "Договор подписан", "SORT": 40, "STATUS_ID": "EXECUTING"},
144+
{
145+
"NAME": "Предоплата получена",
146+
"SORT": 50,
147+
"STATUS_ID": "FINAL_INVOICE",
148+
},
149+
{"NAME": "Сделка успешна", "SORT": 60, "STATUS_ID": "WON"},
150+
{"NAME": "Маленький долг", "SORT": 70, "STATUS_ID": "LOSE"},
151+
{"NAME": "Залог", "SORT": 80, "STATUS_ID": "APOLOGY"},
152+
{"NAME": "Безвыходная реструктуризация", "SORT": 90, "STATUS_ID": "1"},
153+
{"NAME": "Не готов выводить имущество", "SORT": 100, "STATUS_ID": "2"},
154+
{"NAME": "Ушел к конкурентам", "SORT": 110, "STATUS_ID": "3"},
155+
{"NAME": "Перестал выходить на связь", "SORT": 120, "STATUS_ID": "4"},
156+
{"NAME": "Дорого/Нечем платить", "SORT": 130, "STATUS_ID": "5"},
157+
{"NAME": "Услуга стала не актуальна", "SORT": 140, "STATUS_ID": "7"},
158+
{"NAME": "Иное", "SORT": 150, "STATUS_ID": "8"},
159+
],
160+
},
161+
"result_error": [],
162+
"result_total": [],
163+
"result_next": [],
164+
"result_time": {
165+
"2": {
166+
"start": 1664084858.135664,
167+
"finish": 1664084858.14109,
168+
"duration": 0.005425930023193359,
169+
"processing": 0.004722118377685547,
170+
"date_start": "2022-09-25T08:47:38+03:00",
171+
"date_finish": "2022-09-25T08:47:38+03:00",
172+
"operating_reset_at": 1664085458,
173+
"operating": 0,
174+
},
175+
"4": {
176+
"start": 1664084858.144238,
177+
"finish": 1664084858.146933,
178+
"duration": 0.0026950836181640625,
179+
"processing": 0.0006778240203857422,
180+
"date_start": "2022-09-25T08:47:38+03:00",
181+
"date_finish": "2022-09-25T08:47:38+03:00",
182+
"operating_reset_at": 1664085458,
183+
"operating": 0,
184+
},
185+
"8": {
186+
"start": 1664084858.149546,
187+
"finish": 1664084858.150478,
188+
"duration": 0.0009319782257080078,
189+
"processing": 0.0004899501800537109,
190+
"date_start": "2022-09-25T08:47:38+03:00",
191+
"date_finish": "2022-09-25T08:47:38+03:00",
192+
"operating_reset_at": 1664085458,
193+
"operating": 0,
194+
},
195+
"0": {
196+
"start": 1664084858.151295,
197+
"finish": 1664084858.152226,
198+
"duration": 0.0009310245513916016,
199+
"processing": 0.0004949569702148438,
200+
"date_start": "2022-09-25T08:47:38+03:00",
201+
"date_finish": "2022-09-25T08:47:38+03:00",
202+
"operating_reset_at": 1664085458,
203+
"operating": 0,
204+
},
205+
},
206+
},
207+
"time": {
208+
"start": 1664084858.105772,
209+
"finish": 1664084858.153013,
210+
"duration": 0.0472409725189209,
211+
"processing": 0.017410993576049805,
212+
"date_start": "2022-09-25T08:47:38+03:00",
213+
"date_finish": "2022-09-25T08:47:38+03:00",
214+
"operating_reset_at": 1664085458,
215+
"operating": 0,
216+
},
217+
}

tests/test_server_responses.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,11 @@ def test_get_all_tasks(bx_dummy):
174174
)
175175
assert isinstance(results, list)
176176
assert len(results) == 1570
177+
178+
179+
def test_crm_dealcategory_stage_list(bx_dummy):
180+
from tests.real_responses.crm_dealcategory_stage_list import response
181+
182+
bx_dummy.srh = MockSRH(response)
183+
results = bx_dummy.get_by_ID("crm.dealcategory.stage.list", ["2", "4", "8", 0])
184+
assert isinstance(results, dict)

0 commit comments

Comments
 (0)