""" 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 data['download'] = False # Сохранение в БД через 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}")