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):