draft-publication-info
All checks were successful
Deploy on push / deploy (push) Successful in 46s

This commit is contained in:
Untone 2025-04-28 11:10:18 +03:00
parent ed71405082
commit f71fc7fde9
3 changed files with 40 additions and 10 deletions

View File

@ -6,6 +6,7 @@ from sqlalchemy.orm import relationship
from orm.author import Author from orm.author import Author
from orm.topic import Topic from orm.topic import Topic
from services.db import Base from services.db import Base
from orm.shout import Shout
class DraftTopic(Base): class DraftTopic(Base):
@ -62,3 +63,14 @@ class Draft(Base):
# Связь с Community (если нужна как объект, а не ID) # Связь с Community (если нужна как объект, а не ID)
# community = relationship("Community", foreign_keys=[community_id], lazy="joined") # community = relationship("Community", foreign_keys=[community_id], lazy="joined")
# Пока оставляем community_id как ID # Пока оставляем community_id как ID
# Связь с публикацией (один-к-одному или один-к-нулю)
# Загружается через joinedload в резолвере
publication = relationship(
"Shout",
primaryjoin="Draft.id == Shout.draft",
foreign_keys="Shout.draft",
uselist=False,
lazy="noload", # Не грузим по умолчанию, только через options
viewonly=True # Указываем, что это связь только для чтения
)

View File

@ -74,8 +74,8 @@ async def load_drafts(_, info):
""" """
Загружает все черновики, доступные текущему пользователю. Загружает все черновики, доступные текущему пользователю.
Предварительно загружает связанные объекты (topics, authors), чтобы избежать Предварительно загружает связанные объекты (topics, authors, publication),
ошибок с отсоединенными объектами при сериализации. чтобы избежать ошибок с отсоединенными объектами при сериализации.
Returns: Returns:
dict: Список черновиков или сообщение об ошибке dict: Список черновиков или сообщение об ошибке
@ -89,16 +89,17 @@ async def load_drafts(_, info):
try: try:
with local_session() as session: with local_session() as session:
# Предзагружаем authors и topics # Предзагружаем authors, topics и связанную publication
drafts = ( drafts_query = (
session.query(Draft) session.query(Draft)
.options( .options(
joinedload(Draft.topics), joinedload(Draft.topics),
joinedload(Draft.authors) joinedload(Draft.authors),
joinedload(Draft.publication) # Загружаем связанную публикацию
) )
.filter(Draft.authors.any(Author.id == author_id)) .filter(Draft.authors.any(Author.id == author_id))
.all()
) )
drafts = drafts_query.all()
# Преобразуем объекты в словари, пока они в контексте сессии # Преобразуем объекты в словари, пока они в контексте сессии
drafts_data = [] drafts_data = []
@ -106,6 +107,17 @@ async def load_drafts(_, info):
draft_dict = draft.dict() draft_dict = draft.dict()
draft_dict["topics"] = [topic.dict() for topic in draft.topics] draft_dict["topics"] = [topic.dict() for topic in draft.topics]
draft_dict["authors"] = [author.dict() for author in draft.authors] 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) drafts_data.append(draft_dict)
return {"drafts": drafts_data} return {"drafts": drafts_data}

View File

@ -107,6 +107,12 @@ type Shout {
score: Float score: Float
} }
type PublicationInfo {
id: Int!
slug: String!
published_at: Int
}
type Draft { type Draft {
id: Int! id: Int!
created_at: Int! created_at: Int!
@ -129,9 +135,9 @@ type Draft {
deleted_at: Int deleted_at: Int
updated_by: Author updated_by: Author
deleted_by: Author deleted_by: Author
authors: [Author] authors: [Author]!
topics: [Topic] topics: [Topic]!
publication: PublicationInfo
} }
type Stat { type Stat {