Добавление валидации и удаление файла app/test.py

main
Лев 2025-09-01 16:28:26 +05:00
parent ffd2f13643
commit 3f27a551ac
4 changed files with 80 additions and 37 deletions

View File

@ -1,31 +1,37 @@
import working_database import working_database
import parse_saby 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:
""" """
Фуннкция приминмает словарь и парсит его в лист листов. argument:
Каждый лист должен состоять из 6 элементов [{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(): for key_id, value_data in dict_data.items():
if len(value_data) != 5: if len(value_data) != 5: continue
continue result.append([key_id, *value_data])
organ, names, date_from_str, date_to_str, ver = value_data return result
# Парсим даты
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
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() result_dict_data = parse_saby.process_reports_parse()
list_data = parse_data_for_bd(result_dict_data) list_data = parse_data_in_list(result_dict_data)
PushDB = working_database.SimpleDB() list_data_validated = validate_data(list_data)
PushDB.data_transfer_in_database(list_data) working_database.SimpleDB().data_transfer_in_database(list_data_validated)

View File

@ -54,9 +54,9 @@ def parse_date_report(url: str):
return from_date, to_date, version return from_date, to_date, version
def parse_reports(soup:BeautifulSoup, # HTML объект def parse_reports(soup:BeautifulSoup, # HTML объект
report_title:str, # строка ввида: 'report/fns' report_title:str, # Строка ввида: 'report/fns'
url_formats:str, # Строка ввида: 'https://formats.saby.ru' url_formats:str, # Строка ввида: 'https://formats.saby.ru'
name_title:str): # имя тайтла: 'fns' name_title:str): # Имя тайтла: 'fns'
""" """
Достаются все необходимые данные, возвращаются в ввиде словаря: Достаются все необходимые данные, возвращаются в ввиде словаря:
{106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')} {106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}

39
app/validation.py 100644
View File

@ -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

View File

@ -9,7 +9,7 @@ class SimpleDB:
def __init__(self): def __init__(self):
self._create_db_pool_from_vault() self._create_db_pool_from_vault()
self.pool self.pool
init_oracle_client() #init_oracle_client() Если работает нужно убрать!
def _handle_vault_exception(self, e: Exception, message: str): def _handle_vault_exception(self, e: Exception, message: str):
""" """
@ -86,18 +86,16 @@ class SimpleDB:
try: try:
with self.pool.acquire() as connection: with self.pool.acquire() as connection:
with connection.cursor() as cursor: with connection.cursor() as cursor:
for list_argument_bd in list_data: for dict_argument_bd in list_data:
id, organ, names, date_from, date_to, ver = list_argument_bd print("Отправляемые аргрументы: ", dict_argument_bd)
parametrs_list = [id, organ, names, date_to, date_from, ver] print("Типы данных: ", *map(type, dict_argument_bd.values()))
print("Отправляемые аргрументы: ", *parametrs_list)
print("Типы данных: ", list(map(type, parametrs_list)))
cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [ cursor.callproc('P_RK_GOVERNMENT_REPORTS_INSERS', [
id, dict_argument_bd['id'],
organ, dict_argument_bd['organ'],
names, dict_argument_bd['names'],
date_from, dict_argument_bd['date_from'],
date_to, # Может быть None dict_argument_bd['date_to'], # Может быть None
ver, dict_argument_bd['ver'],
]) ])
except Error as e: except Error as e:
raise Error(f'Ошибка при отправке данных в БД: {e}') raise Error(f'Ошибка при отправке данных в БД: {e}')