From 6d9513f1b2bc40a5d8e50f1110d6a24bbb13cd75 Mon Sep 17 00:00:00 2001 From: Untone Date: Sat, 26 Apr 2025 15:57:51 +0300 Subject: [PATCH] reaction-by-fix4 --- resolvers/draft.py | 51 ++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/resolvers/draft.py b/resolvers/draft.py index 0f40afa9..a8256e3f 100644 --- a/resolvers/draft.py +++ b/resolvers/draft.py @@ -64,21 +64,32 @@ async def load_drafts(_, info): if not user_id or not author_id: return {"error": "User ID and author ID are required"} - with local_session() as session: - # Предзагружаем authors и topics, т.к. они lazy='select' в модели - # created_by, updated_by, deleted_by загрузятся автоматически (lazy='joined') - drafts = ( - session.query(Draft) - .options( - joinedload(Draft.topics), - joinedload(Draft.authors) + try: + with local_session() as session: + # Предзагружаем authors и topics + drafts = ( + session.query(Draft) + .options( + joinedload(Draft.topics), + joinedload(Draft.authors) + ) + # Фильтруем по ID автора (создатель или соавтор) + .filter(or_(Draft.authors.any(Author.id == author_id), Draft.created_by == author_id)) + .all() ) - # Фильтруем по ID автора (создатель или соавтор) - .filter(or_(Draft.authors.any(Author.id == author_id), Draft.created_by == author_id)) - .all() - ) - return {"drafts": drafts} + # Преобразуем объекты в словари, пока они в контексте сессии + drafts_data = [] + for draft in drafts: + draft_dict = draft.dict() + draft_dict["topics"] = [topic.dict() for topic in draft.topics] + draft_dict["authors"] = [author.dict() for author in draft.authors] + drafts_data.append(draft_dict) + + return {"drafts": drafts_data} + except Exception as e: + logger.error(f"Failed to load drafts: {e}", exc_info=True) + return {"error": f"Failed to load drafts: {str(e)}"} @mutation.field("create_draft") @@ -272,17 +283,17 @@ async def publish_draft(_, info, draft_id: int): try: with local_session() as session: - shout_id = session.query(Draft.shout).filter(Draft.id == draft_id).first() - shout = session.query(Shout).filter(Shout.id == shout_id).first() - if not shout: - return {"error": "Shout not found"} - was_published = shout.published_at is not None - draft = session.query(Draft).where(Draft.id == shout.draft).first() + # Сначала находим черновик + draft = session.query(Draft).filter(Draft.id == draft_id).first() if not draft: return {"error": "Draft not found"} - # Находим черновик если не передан + + # Ищем существующий shout для этого черновика + shout = session.query(Shout).filter(Shout.draft == draft_id).first() + was_published = shout.published_at if shout else None if not shout: + # Создаем новый shout если не существует shout = create_shout_from_draft(session, draft, author_id) else: # Обновляем существующую публикацию