Files
parser/services/document_builder.py
Игорь Бандурист 83020c3124
All checks were successful
continuous-integration/drone/push Build is passing
исправляю ошибки
2026-05-07 18:58:18 +10:00

98 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Document Builder - создание JSON и DOCX файлов
"""
import json
import os
from docx import Document
from config import DOCUMENTS_DIR
from utils import logger
import work_parser as wp
# Обязательные поля для модели ParsedData
REQUIRED_FIELDS = [
'title', 'category', 'translation_text', 'short_text'
]
def update_bd_and_create_document(
response_text: str,
article_date: str,
url: str,
parsed_at: str,
original_text: str,
other: str
) -> None:
"""
Обрабатывает ответ от GPT, сохраняет в БД и создаёт DOCX документ
"""
if not response_text:
print(f"Пустой ответ от GPT для URL: {url}")
logger.info(f"Пустой ответ от GPT для URL: {url}")
return
try:
clean_response = response_text.strip().replace('```json', '').replace('```', '').strip()
data = json.loads(clean_response)
# Нормализация типов: category может приходить как list, а ожидается str
if isinstance(data.get('category'), list):
data['category'] = ', '.join(data['category'])
if data['category']:
# Добавляем системные поля
data['article_date'] = article_date
data['url'] = url
data['parsed_at'] = parsed_at
data['original_text'] = original_text
data['status'] = False
data['viewed'] = False
data['tematik'] = False
data['svodka'] = False
data['donesenie'] = False
data['bilutene'] = False
data['other'] = other
# Сохранение в БД через pbd
parsed_data = wp.ParsedData(**data)
wp.save_parsed_data_to_db(parsed_data)
print("Данные успешно сохранены в БД")
# Создание DOCX документа
# path_day = parsed_at.split()[0].replace('-', '/')
path_day = article_date.split()[0]
documents_path = os.path.join(DOCUMENTS_DIR, path_day)
if not os.path.exists(documents_path):
os.makedirs(documents_path)
print(f"Создана папка: {documents_path}")
doc = Document()
doc.add_heading('Ссылка на статью', level=1)
doc.add_paragraph(url)
doc.add_heading('Дата и время', level=1)
doc.add_paragraph(article_date)
doc.add_heading('Обнаруженные тематики текста', level=1)
doc.add_paragraph(data["category"])
doc.add_heading('Заголовок', level=1)
doc.add_paragraph(data["title"])
doc.add_heading('Краткий пересказ', level=1)
doc.add_paragraph(data["short_text"])
doc.add_heading('Переведенный текст статьи в газете', level=1)
doc.add_paragraph(data["translation_text"])
doc.add_heading('Оригинальный текст', level=1)
doc.add_paragraph(original_text)
doc_name = f"{data['title']}.docx"
doc_path = os.path.join(documents_path, doc_name)
doc.save(doc_path)
print(f"Сохранен документ: {doc_path}")
except json.JSONDecodeError as ex:
print(f"Ошибка парсинга JSON от GPT для URL {url}: {ex}")
print(f"Сырой ответ: {response_text[:500]}")
logger.error(f"JSON decode error для {url}: {ex}")
except Exception as ex:
print(f"Ошибка при обработке ответа GPT для URL {url}: {ex}")
print(f"Сырой ответ: {response_text[:500]}")
logger.error(f"Ошибка при обработке ответа GPT для {url}: {ex}")