draft-shout-link-fix
This commit is contained in:
@@ -51,7 +51,8 @@ def create_draft_dict(draft: Draft) -> dict[str, Any]:
|
||||
"deleted_at": draft.deleted_at,
|
||||
"updated_by": draft.updated_by,
|
||||
"deleted_by": draft.deleted_by,
|
||||
"shout": draft.shout,
|
||||
# добавляется вручную в каждой мутации
|
||||
# "shout": draft.shout,
|
||||
# Явно загружаем связи, чтобы избежать null значений
|
||||
"authors": [
|
||||
{"id": a.id, "name": a.name, "slug": a.slug, "pic": getattr(a, "pic", None)} for a in (draft.authors or [])
|
||||
@@ -142,13 +143,25 @@ async def load_drafts(_: None, info: GraphQLResolveInfo) -> dict[str, Any]:
|
||||
)
|
||||
drafts = drafts_query.all()
|
||||
|
||||
# Преобразуем объекты в словари, пока они в контексте сессии
|
||||
# 🔍 Преобразуем объекты в словари, пока они в контексте сессии
|
||||
drafts_data = []
|
||||
for draft in drafts:
|
||||
draft_dict = draft.dict()
|
||||
draft_dict = create_draft_dict(draft)
|
||||
# Всегда возвращаем массив для topics, даже если он пустой
|
||||
draft_dict["topics"] = [topic.dict() for topic in (draft.topics or [])]
|
||||
draft_dict["authors"] = [author.dict() for author in (draft.authors or [])]
|
||||
|
||||
# 🔍 Обрабатываем поле shout правильно
|
||||
if draft.shout:
|
||||
# Загружаем связанный shout если есть
|
||||
shout = session.query(Shout).where(Shout.id == draft.shout).first()
|
||||
if shout:
|
||||
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": shout.published_at}
|
||||
else:
|
||||
draft_dict["shout"] = None
|
||||
else:
|
||||
draft_dict["shout"] = None
|
||||
|
||||
drafts_data.append(draft_dict)
|
||||
|
||||
return {"drafts": drafts_data}
|
||||
@@ -248,7 +261,14 @@ async def create_draft(_: None, info: GraphQLResolveInfo, draft_input: dict[str,
|
||||
session.add(da)
|
||||
|
||||
session.commit()
|
||||
return {"draft": draft}
|
||||
|
||||
# 🔍 Формируем результат с правильным форматом
|
||||
draft_dict = create_draft_dict(draft)
|
||||
|
||||
# 🔍 При создании черновика shout еще не существует
|
||||
draft_dict["shout"] = None
|
||||
|
||||
return {"draft": draft_dict}
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to create draft: {e}", exc_info=True)
|
||||
return {"error": f"Failed to create draft: {e!s}"}
|
||||
@@ -370,13 +390,24 @@ async def update_draft(_: None, info: GraphQLResolveInfo, draft_id: int, draft_i
|
||||
|
||||
session.commit()
|
||||
|
||||
# Преобразуем объект в словарь для ответа
|
||||
draft_dict = draft.dict()
|
||||
# 🔍 Преобразуем объект в словарь для ответа
|
||||
draft_dict = create_draft_dict(draft)
|
||||
draft_dict["topics"] = [topic.dict() for topic in draft.topics]
|
||||
draft_dict["authors"] = [author.dict() for author in draft.authors]
|
||||
# Добавляем объект автора в updated_by
|
||||
draft_dict["updated_by"] = author_dict
|
||||
|
||||
# 🔍 Обрабатываем поле shout правильно
|
||||
if draft.shout:
|
||||
# Загружаем связанный shout если есть
|
||||
shout = session.query(Shout).where(Shout.id == draft.shout).first()
|
||||
if shout:
|
||||
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": shout.published_at}
|
||||
else:
|
||||
draft_dict["shout"] = None
|
||||
else:
|
||||
draft_dict["shout"] = None
|
||||
|
||||
return {"draft": draft_dict}
|
||||
|
||||
except Exception as e:
|
||||
@@ -396,9 +427,14 @@ async def delete_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> dict
|
||||
return {"error": "Draft not found"}
|
||||
if author_id != draft.created_by and draft.authors.where(Author.id == author_id).count() == 0:
|
||||
return {"error": "You are not allowed to delete this draft"}
|
||||
# 🔍 Сохраняем данные черновика перед удалением
|
||||
draft_dict = create_draft_dict(draft)
|
||||
# При удалении shout информация уже не актуальна
|
||||
draft_dict["shout"] = None
|
||||
|
||||
session.delete(draft)
|
||||
session.commit()
|
||||
return {"draft": draft}
|
||||
return {"draft": draft_dict}
|
||||
|
||||
|
||||
@mutation.field("publish_draft")
|
||||
@@ -587,8 +623,8 @@ async def unpublish_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> d
|
||||
# Формируем результат
|
||||
draft_dict = create_draft_dict(draft)
|
||||
|
||||
# Добавляем информацию о публикации
|
||||
draft_dict["shout"] = {"id": shout.id, "slug": shout.slug, "published_at": None}
|
||||
# 🔍 После снятия с публикации, черновик больше не связан с публикацией
|
||||
draft_dict["shout"] = None
|
||||
|
||||
logger.info(f"Successfully unpublished shout #{shout.id} for draft #{draft_id}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user