From f71fc7fde92aef4f215703f4ade48c97484ecbc4 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 28 Apr 2025 11:10:18 +0300 Subject: [PATCH] draft-publication-info --- orm/draft.py | 14 +++++++++++++- resolvers/draft.py | 24 ++++++++++++++++++------ schema/type.graphql | 12 +++++++++--- 3 files changed, 40 insertions(+), 10 deletions(-) diff --git a/orm/draft.py b/orm/draft.py index f3b1f100..71b85057 100644 --- a/orm/draft.py +++ b/orm/draft.py @@ -6,6 +6,7 @@ from sqlalchemy.orm import relationship from orm.author import Author from orm.topic import Topic from services.db import Base +from orm.shout import Shout class DraftTopic(Base): @@ -61,4 +62,15 @@ class Draft(Base): # Связь с Community (если нужна как объект, а не ID) # community = relationship("Community", foreign_keys=[community_id], lazy="joined") - # Пока оставляем community_id как ID \ No newline at end of file + # Пока оставляем community_id как ID + + # Связь с публикацией (один-к-одному или один-к-нулю) + # Загружается через joinedload в резолвере + publication = relationship( + "Shout", + primaryjoin="Draft.id == Shout.draft", + foreign_keys="Shout.draft", + uselist=False, + lazy="noload", # Не грузим по умолчанию, только через options + viewonly=True # Указываем, что это связь только для чтения + ) \ No newline at end of file diff --git a/resolvers/draft.py b/resolvers/draft.py index 57df9330..eac5d906 100644 --- a/resolvers/draft.py +++ b/resolvers/draft.py @@ -74,8 +74,8 @@ async def load_drafts(_, info): """ Загружает все черновики, доступные текущему пользователю. - Предварительно загружает связанные объекты (topics, authors), чтобы избежать - ошибок с отсоединенными объектами при сериализации. + Предварительно загружает связанные объекты (topics, authors, publication), + чтобы избежать ошибок с отсоединенными объектами при сериализации. Returns: dict: Список черновиков или сообщение об ошибке @@ -89,16 +89,17 @@ async def load_drafts(_, info): try: with local_session() as session: - # Предзагружаем authors и topics - drafts = ( + # Предзагружаем authors, topics и связанную publication + drafts_query = ( session.query(Draft) .options( joinedload(Draft.topics), - joinedload(Draft.authors) + joinedload(Draft.authors), + joinedload(Draft.publication) # Загружаем связанную публикацию ) .filter(Draft.authors.any(Author.id == author_id)) - .all() ) + drafts = drafts_query.all() # Преобразуем объекты в словари, пока они в контексте сессии drafts_data = [] @@ -106,6 +107,17 @@ async def load_drafts(_, info): draft_dict = draft.dict() draft_dict["topics"] = [topic.dict() for topic in draft.topics] draft_dict["authors"] = [author.dict() for author in draft.authors] + + # Добавляем информацию о публикации, если она есть + if draft.publication: + draft_dict["publication"] = { + "id": draft.publication.id, + "slug": draft.publication.slug, + "published_at": draft.publication.published_at + } + else: + draft_dict["publication"] = None + drafts_data.append(draft_dict) return {"drafts": drafts_data} diff --git a/schema/type.graphql b/schema/type.graphql index d902d143..d1656826 100644 --- a/schema/type.graphql +++ b/schema/type.graphql @@ -107,6 +107,12 @@ type Shout { score: Float } +type PublicationInfo { + id: Int! + slug: String! + published_at: Int +} + type Draft { id: Int! created_at: Int! @@ -129,9 +135,9 @@ type Draft { deleted_at: Int updated_by: Author deleted_by: Author - authors: [Author] - topics: [Topic] - + authors: [Author]! + topics: [Topic]! + publication: PublicationInfo } type Stat {