Source code for prozorro_sale.tools.utils

from math import floor


[docs]def aiohttp_apps_iterator(app): """ Iterating aiohttp Sub Application Args: app: aiohttp Application Returns: yield iterator """ for subapp in app._subapps: for subsubapp in aiohttp_apps_iterator(subapp): yield subsubapp yield app
[docs]def math_round(value, decimals=2) -> (float, int): """Custom round method. Args: value (Any): Bool, Int, Float or Str converted to Float value. decimals (int): Coma separated decimals. Returns: value (float): Rounded value. Examples: native method >>> round(950.025, 2) 950.02 >>> round(950.026, 2) 950.03 custom method >>> math_round(950.025, 2) 950.03 >>> math_round(950.026, 2) 950.03 >>> math_round(250, -2) 200 >>> math_round('950.026', 2) 950.03 >>> math_round('Some_string', 2) 'Some_string' """ if isinstance(value, bool): return int(value) if isinstance(value, int): return round(value, decimals) try: value = float(value) except Exception: ... else: increment = 0.5 if decimals is None: value = floor(value + increment) elif decimals >= 0: multiplier = 10 ** decimals value_multiplier = value * multiplier decimal_part = str(value_multiplier).split('.')[1] if decimal_part.startswith('499'): increment = 0.6 value = floor(value_multiplier + increment) / multiplier else: value = round(value, decimals) return value
[docs]def is_resp_start_send(request): """ Check start send response Args: request: Returns: """ if payload_writer := getattr(request, '_payload_writer', None): return getattr(payload_writer, 'output_size', 0) != 0 or getattr(payload_writer, '_eof')
[docs]async def close_not_complited_response(request): """ Close response Args: request: Returns: """ if is_resp_start_send(request): await request._payload_writer.write_eof()