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

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 backoff
import pydantic.error_wrappers
from environs import load_dotenv
from models import Abitr
from settings import ApiConfig, EtlConfig, MiscSettings
from state import State
from state import State, BaseStorage
from tg_bot import TgBot
load_dotenv()
@ -39,7 +41,8 @@ class ApiExtractor:
@backoff.on_exception(backoff.expo, (aiohttp.ClientResponseError, aiohttp.ClientConnectorError,
aiohttp.ServerDisconnectedError), base=2, factor=1,
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 = {
'iblockId': iblock_id,
@ -80,7 +83,16 @@ class ApiExtractor:
abitr[key] = res[key]['VALUE']
if abitr['BENEFITS'] == '' or abitr['BENEFITS'] is None:
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:
logging.info(f'Получено абитуриентов - {len(abitrs)}')
return abitrs

View File

@ -30,7 +30,7 @@ async def main():
while True:
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:
await loader.load_data(state=state, abitr=abitr, storage=storage, iblock_id=int(iblock_id))
await asyncio.sleep(10)