Игнор ошибки при валидации

This commit is contained in:
Григорич 2023-07-18 11:00:36 +03:00
parent f51a3ca403
commit e5794029ab
2 changed files with 16 additions and 4 deletions

View File

@ -4,11 +4,13 @@ import os
import aiohttp import aiohttp
import backoff import backoff
import pydantic.error_wrappers
from environs import load_dotenv from environs import load_dotenv
from models import Abitr from models import Abitr
from settings import ApiConfig, EtlConfig, MiscSettings from settings import ApiConfig, EtlConfig, MiscSettings
from state import State from state import State, BaseStorage
from tg_bot import TgBot
load_dotenv() load_dotenv()
@ -39,7 +41,8 @@ class ApiExtractor:
@backoff.on_exception(backoff.expo, (aiohttp.ClientResponseError, aiohttp.ClientConnectorError, @backoff.on_exception(backoff.expo, (aiohttp.ClientResponseError, aiohttp.ClientConnectorError,
aiohttp.ServerDisconnectedError), base=2, factor=1, aiohttp.ServerDisconnectedError), base=2, factor=1,
max_value=int(misc_settings.max_wait_size), max_tries=None) max_value=int(misc_settings.max_wait_size), max_tries=None)
async def get_extract_data(self, state: State, iblock_id: int, fields: list = None, **kwargs) -> list[Abitr]: async def get_extract_data(self, state: State, iblock_id: int, storage: BaseStorage, fields: list = None,
**kwargs) -> list[Abitr]:
data = { data = {
'iblockId': iblock_id, 'iblockId': iblock_id,
@ -80,7 +83,16 @@ class ApiExtractor:
abitr[key] = res[key]['VALUE'] abitr[key] = res[key]['VALUE']
if abitr['BENEFITS'] == '' or abitr['BENEFITS'] is None: if abitr['BENEFITS'] == '' or abitr['BENEFITS'] is None:
abitr['BENEFITS'] = 8 abitr['BENEFITS'] = 8
abitrs.append(Abitr(**{key: value for key, value in abitr.items()})) try:
abitrs.append(Abitr(**{key: value for key, value in abitr.items()}))
except pydantic.error_wrappers.ValidationError as e:
logging.info(f'Ошибка валидации ID {abitr["ID"]} - {str(e)}')
tgbot = TgBot()
await tgbot.send_notify(f'Ошибка валидации ID {abitr["ID"]} - {str(e)}')
state.set_state(f'iblock_{iblock_id}', abitr["ID"])
storage.save_state(state.local_state)
if len(abitrs) > 0: if len(abitrs) > 0:
logging.info(f'Получено абитуриентов - {len(abitrs)}') logging.info(f'Получено абитуриентов - {len(abitrs)}')
return abitrs return abitrs

View File

@ -30,7 +30,7 @@ async def main():
while True: while True:
for iblock_id in api.iblocks: for iblock_id in api.iblocks:
abitrs = await extractor.get_extract_data(iblock_id=int(iblock_id), state=state) abitrs = await extractor.get_extract_data(iblock_id=int(iblock_id), state=state, storage=storage)
for abitr in abitrs: for abitr in abitrs:
await loader.load_data(state=state, abitr=abitr, storage=storage, iblock_id=int(iblock_id)) await loader.load_data(state=state, abitr=abitr, storage=storage, iblock_id=int(iblock_id))
await asyncio.sleep(10) await asyncio.sleep(10)