All checks were successful
continuous-integration/drone/push Build is passing
105 lines
4.5 KiB
Python
105 lines
4.5 KiB
Python
"""
|
||
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)
|
||
|
||
# Проверяем наличие обязательных полей от GPT
|
||
# missing_fields = [f for f in REQUIRED_FIELDS if not data.get(f)]
|
||
# if missing_fields:
|
||
# print(f"Ответ GPT не содержит обязательных полей: {missing_fields} для URL: {url}")
|
||
# logger.warning(f"Ответ GPT не содержит обязательных полей: {missing_fields} для URL: {url}")
|
||
# print(f"Полученные данные: {data}")
|
||
# return
|
||
|
||
# Нормализация типов: 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 = 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}")
|