Написан класс получения данных из хранилища
This commit is contained in:
parent
5068bb47b3
commit
173598f9ab
72
extractor.py
Normal file
72
extractor.py
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import aiohttp
|
||||||
|
import backoff
|
||||||
|
from environs import load_dotenv
|
||||||
|
|
||||||
|
from models import Abitr
|
||||||
|
from settings import ApiConfig
|
||||||
|
from state import State
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
class ApiExtractor:
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.api_config = ApiConfig()
|
||||||
|
self.headers = {"Authorization-Token": self.api_config.token}
|
||||||
|
self.fields = ["ID", "IBLOCK_ID", "NAME", "CODE", "SECTION_ID"]
|
||||||
|
|
||||||
|
@backoff.on_exception(backoff.expo, (aiohttp.ClientResponseError, aiohttp.ClientConnectorError), base=2, factor=1,
|
||||||
|
max_value=5, max_tries=None)
|
||||||
|
async def get_extract_data(self, state: State, iblock_id: int, fields: list = None, **kwargs) -> list[Abitr]:
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'iblockId': iblock_id,
|
||||||
|
'order': json.dumps({'ID': 'ASC'}, ensure_ascii=False)
|
||||||
|
}
|
||||||
|
if fields is not None:
|
||||||
|
data['fields'] = json.dumps(self.fields + fields, ensure_ascii=False)
|
||||||
|
else:
|
||||||
|
data['fields'] = json.dumps(self.fields + ["PROPERTY_*"], ensure_ascii=False)
|
||||||
|
|
||||||
|
min_id = state.get_state(f'iblock_{iblock_id}') or 0
|
||||||
|
data['bitrFilter'] = json.dumps({'>ID': str(min_id)}, ensure_ascii=False)
|
||||||
|
abitrs = []
|
||||||
|
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.get(f'{self.api_config.host}/getnativeiblockelementslist', headers=self.headers,
|
||||||
|
data=data) as resp:
|
||||||
|
|
||||||
|
results = json.loads(await resp.text())
|
||||||
|
if len(results) > 0:
|
||||||
|
logging.info(f'Получение абитуриентов ID > {min_id}. Iblock - {iblock_id}')
|
||||||
|
for result in results:
|
||||||
|
data = {
|
||||||
|
'elementId': result,
|
||||||
|
}
|
||||||
|
async with session.get(f'{self.api_config.host}/getiblockelement/', headers=self.headers,
|
||||||
|
data=data) as resp:
|
||||||
|
res = json.loads(await resp.text())
|
||||||
|
res = res[str(result)]
|
||||||
|
class_attrs = vars(Abitr)['__annotations__']
|
||||||
|
try:
|
||||||
|
class_attrs.pop('ID')
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
abitr = {}
|
||||||
|
abitr['ID'] = res['ID']
|
||||||
|
for key, value in class_attrs.items():
|
||||||
|
if key in res:
|
||||||
|
abitr[key] = res[key]['VALUE']
|
||||||
|
if res['BENEFITS']['VALUE'] != '-' or res['BENEFITS2']['VALUE'] != '-':
|
||||||
|
if res['BENEFITS']['VALUE'] != '-':
|
||||||
|
abitr['BENEFITS'] = res['BENEFITS']['VALUE']
|
||||||
|
abitr['PRIVILEGES_QUESTION'] = 2
|
||||||
|
if res['BENEFITS2']['VALUE'] != '-':
|
||||||
|
abitr['BENEFITS'] = res['BENEFITS2']['VALUE']
|
||||||
|
abitr['PRIVILEGES_QUESTION'] = 1
|
||||||
|
abitrs.append(Abitr(**{key: value for key, value in abitr.items()}))
|
||||||
|
if len(abitrs) > 0:
|
||||||
|
logging.info(f'Получено абитуриентов - {len(abitrs)}')
|
||||||
|
return abitrs
|
Loading…
Reference in New Issue
Block a user