Добавление валидации и удаление файла app/test.py
parent
ffd2f13643
commit
3f27a551ac
52
app/main.py
52
app/main.py
|
|
@ -1,31 +1,37 @@
|
|||
import working_database
|
||||
import parse_saby
|
||||
from dateutil import parser
|
||||
from validation import DataValid
|
||||
|
||||
def parse_data_for_bd(dict_data: dict) -> list[list]:
|
||||
def parse_data_in_list(dict_data: dict) -> list:
|
||||
"""
|
||||
Фуннкция приминмает словарь и парсит его в лист листов.
|
||||
Каждый лист должен состоять из 6 элементов
|
||||
argument:
|
||||
[{128513: ('fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03')},
|
||||
{...}]
|
||||
return:
|
||||
[[128513, 'fns', 'Уведомление о налогах для ЕНП', '01.07.22', None, '5.03'],
|
||||
[...]]
|
||||
"""
|
||||
result_list = []
|
||||
result = []
|
||||
for key_id, value_data in dict_data.items():
|
||||
if len(value_data) != 5:
|
||||
continue
|
||||
organ, names, date_from_str, date_to_str, ver = value_data
|
||||
# Парсим даты
|
||||
if date_from_str:
|
||||
date_from = parser.parse(date_from_str).date()
|
||||
else:
|
||||
print(f"Отсутсвует дата: {key_id}: {organ} {names}")
|
||||
continue
|
||||
if date_to_str:
|
||||
date_to = parser.parse(date_to_str).date()
|
||||
else: date_to = None
|
||||
parametrs_list = [int(key_id), organ, names, date_to, date_from, ver]
|
||||
result_list.append(parametrs_list)
|
||||
return result_list
|
||||
if len(value_data) != 5: continue
|
||||
result.append([key_id, *value_data])
|
||||
return result
|
||||
|
||||
def validate_data(list_data: list[list]) -> list:
|
||||
"""
|
||||
Функция принимает список списков, выполняет парсинг и валидацию
|
||||
с пмошью класса DataValid из файла validation.py.
|
||||
Возвращает распршеный валидный список словарей для БД.
|
||||
"""
|
||||
result = []
|
||||
for intem_list in list_data:
|
||||
try:
|
||||
validated_data = DataValid.from_list(intem_list) # Передаем один лист
|
||||
result.append(validated_data.model_dump()) # Добаляем валидный и распаршеный словарь
|
||||
except: continue
|
||||
return result
|
||||
|
||||
result_dict_data = parse_saby.process_reports_parse()
|
||||
list_data = parse_data_for_bd(result_dict_data)
|
||||
PushDB = working_database.SimpleDB()
|
||||
PushDB.data_transfer_in_database(list_data)
|
||||
list_data = parse_data_in_list(result_dict_data)
|
||||
list_data_validated = validate_data(list_data)
|
||||
working_database.SimpleDB().data_transfer_in_database(list_data_validated)
|
||||
|
|
|
|||
|
|
@ -54,9 +54,9 @@ def parse_date_report(url: str):
|
|||
return from_date, to_date, version
|
||||
|
||||
def parse_reports(soup:BeautifulSoup, # HTML объект
|
||||
report_title:str, # строка ввида: 'report/fns'
|
||||
report_title:str, # Строка ввида: 'report/fns'
|
||||
url_formats:str, # Строка ввида: 'https://formats.saby.ru'
|
||||
name_title:str): # имя тайтла: 'fns'
|
||||
name_title:str): # Имя тайтла: 'fns'
|
||||
"""
|
||||
Достаются все необходимые данные, возвращаются в ввиде словаря:
|
||||
{106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
from pydantic import BaseModel, field_validator
|
||||
from datetime import date
|
||||
from dateutil import parser
|
||||
|
||||
class DataValid(BaseModel):
|
||||
id: int
|
||||
organ: str
|
||||
names: str
|
||||
date_from: date
|
||||
date_to: date | None
|
||||
ver: str
|
||||
|
||||
# Дополнительный конструктор для списка
|
||||
@classmethod
|
||||
def from_list(cls, data_list: list):
|
||||
return cls(
|
||||
id=data_list[0],
|
||||
organ=data_list[1],
|
||||
names=data_list[2],
|
||||
date_from=data_list[3],
|
||||
date_to=data_list[4],
|
||||
ver=data_list[5]
|
||||
)
|
||||
|
||||
@field_validator('date_from', mode='before')
|
||||
def parse_date_to(cls, date):
|
||||
if isinstance(date, str):
|
||||
try:
|
||||
return parser.parse(date)
|
||||
except (ValueError, TypeError): return date
|
||||
return date
|
||||
|
||||
@field_validator('date_to', mode='before')
|
||||
def parse_date_from(date):
|
||||
if isinstance(date, str):
|
||||
try:
|
||||
return parser.parse(date)
|
||||
except(ValueError, TypeError): return date
|
||||
return date
|
||||
|
|
@ -9,7 +9,7 @@ class SimpleDB:
|
|||
def __init__(self):
|
||||
self._create_db_pool_from_vault()
|
||||
self.pool
|
||||
init_oracle_client()
|
||||
#init_oracle_client() Если работает нужно убрать!
|
||||
|
||||
def _handle_vault_exception(self, e: Exception, message: str):
|
||||
"""
|
||||
|
|
@ -86,18 +86,16 @@ class SimpleDB:
|
|||
try:
|
||||
with self.pool.acquire() as connection:
|
||||
with connection.cursor() as cursor:
|
||||
for list_argument_bd in list_data:
|
||||
id, organ, names, date_from, date_to, ver = list_argument_bd
|
||||
parametrs_list = [id, organ, names, date_to, date_from, ver]
|
||||
print("Отправляемые аргрументы: ", *parametrs_list)
|
||||
print("Типы данных: ", list(map(type, parametrs_list)))
|
||||
for dict_argument_bd in list_data:
|
||||
print("Отправляемые аргрументы: ", dict_argument_bd)
|
||||
print("Типы данных: ", *map(type, dict_argument_bd.values()))
|
||||
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
|
||||
id,
|
||||
organ,
|
||||
names,
|
||||
date_from,
|
||||
date_to, # Может быть None
|
||||
ver,
|
||||
dict_argument_bd['id'],
|
||||
dict_argument_bd['organ'],
|
||||
dict_argument_bd['names'],
|
||||
dict_argument_bd['date_from'],
|
||||
dict_argument_bd['date_to'], # Может быть None
|
||||
dict_argument_bd['ver'],
|
||||
])
|
||||
except Error as e:
|
||||
raise Error(f'Ошибка при отправке данных в БД: {e}')
|
||||
|
|
|
|||
Loading…
Reference in New Issue