""" Document Builder - создание JSON и DOCX файлов """ import json import os from docx import Document from config import DOCUMENTS_DIR from utils import logger import parser_bd as pbd # Обязательные поля для модели 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 = pbd.ParsedData(**data) pbd.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(other) 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}")