Добавление валидации и удаление файла app/test.py
parent
ffd2f13643
commit
3f27a551ac
52
app/main.py
52
app/main.py
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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')}
|
||||||
|
|
|
||||||
|
|
@ -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):
|
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}')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue