From 3f27a551acfa7a7eb026015a8767ea19bf3824d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B2?= Date: Mon, 1 Sep 2025 16:28:26 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20app/test.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/main.py | 52 +++++++++++++++++++++++------------------ app/parse_saby.py | 4 ++-- app/validation.py | 39 +++++++++++++++++++++++++++++++ app/working_database.py | 22 ++++++++--------- 4 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 app/validation.py diff --git a/app/main.py b/app/main.py index c8fa162..65da30f 100644 --- a/app/main.py +++ b/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) diff --git a/app/parse_saby.py b/app/parse_saby.py index e3ab0ee..2bee5d5 100644 --- a/app/parse_saby.py +++ b/app/parse_saby.py @@ -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')} diff --git a/app/validation.py b/app/validation.py new file mode 100644 index 0000000..10129fb --- /dev/null +++ b/app/validation.py @@ -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 \ No newline at end of file diff --git a/app/working_database.py b/app/working_database.py index 3c3a069..8406d1f 100644 --- a/app/working_database.py +++ b/app/working_database.py @@ -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}')