From 0f0f8136cf0563c44569caeb350119478c3a1aa7 Mon Sep 17 00:00:00 2001 From: Alexey Leshchenko Date: Sun, 24 Mar 2024 01:27:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=D1=81=D1=87=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=D1=8B=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D0=B2=20=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=87=D0=B5=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Теперь можно использовать 'limit' c `get_all()`, но выдается предупреждение * Внутри батчей учитывать время выполнения для каждого метода раздельно * Предупреждение, если пользователь загружает все поля --- API.md | 2 +- fast_bitrix24/srh.py | 16 +++++++++++++--- fast_bitrix24/user_request.py | 23 +++++++++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/API.md b/API.md index ba4ac3f..6060366 100644 --- a/API.md +++ b/API.md @@ -31,7 +31,7 @@ #### Параметры * `method: str` - метод REST API для запроса к серверу. -* `params: dict` - параметры для передачи методу. Используется именно тот формат, который указан в документации к REST API Битрикс24. `get_all()` не поддерживает параметры `start`, `limit` и `order`. +* `params: dict` - параметры для передачи методу. Используется именно тот формат, который указан в документации к REST API Битрикс24. `get_all()` не поддерживает параметры `start` и `order`. Возвращает полный список сущностей, имеющихся на сервере, согласно заданным методу и параметрам. diff --git a/fast_bitrix24/srh.py b/fast_bitrix24/srh.py index b463af3..0e936c6 100644 --- a/fast_bitrix24/srh.py +++ b/fast_bitrix24/srh.py @@ -163,9 +163,7 @@ async def request_attempt(self, method, params=None) -> dict: logger.debug("Response: %s", json) - request_run_time = json["time"]["operating"] - self.method_throttlers[method].add_request_record(request_run_time) - self.leaky_bucket_throttler.add_request_record() + self.add_throttler_records(method, params, json) return json @@ -175,6 +173,18 @@ async def request_attempt(self, method, params=None) -> dict: raise + def add_throttler_records(self, method, params: dict, json: dict): + if "result_time" in json: + for cmd_name, cmd_url in params["cmd"].items(): + item_method = cmd_url.split("?")[0] + item_time = json["result_time"][cmd_name] + self.method_throttlers[item_method].add_request_record(item_time) + else: + request_run_time = json["time"]["operating"] + self.method_throttlers[method].add_request_record(request_run_time) + + self.leaky_bucket_throttler.add_request_record() + def success(self): """Увеличить счетчик удачных попыток.""" diff --git a/fast_bitrix24/user_request.py b/fast_bitrix24/user_request.py index eba82d4..e3a8bce 100644 --- a/fast_bitrix24/user_request.py +++ b/fast_bitrix24/user_request.py @@ -113,8 +113,8 @@ async def run(self): class GetAllUserRequest(UserRequestAbstract): @icontract.require( lambda self: not self.st_params - or set(self.st_params.keys()).isdisjoint({"START", "LIMIT", "ORDER"}), - "get_all() doesn't support parameters " "'start', 'limit' or 'order'", + or set(self.st_params.keys()).isdisjoint({"START", "ORDER"}), + "get_all() doesn't support parameters 'start' or 'order'", ) @icontract.require( lambda self: not self.st_method.startswith("tasks.elapseditem."), @@ -131,6 +131,25 @@ def check_special_limitations(self): stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES), ) + if self.st_params and "LIMIT" in self.st_params: + warnings.warn( + "Bitrix servers don't seem to support the 'LIMIT' parameter.", + UserWarning, + stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES), + ) + + if ( + self.st_params + and "SELECT" in self.st_params + and "*" in self.st_params["SELECT"] + ): + warnings.warn( + "You are selecting all fields. Beware that this is time-consuming and " + "may lead to penalties from the Bitrix server.", + UserWarning, + stacklevel=get_warning_stack_level(TOP_MOST_LIBRARY_MODULES), + ) + return True async def run(self):