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

This commit is contained in:
Untone 2025-04-26 16:13:07 +03:00
parent b66e347c91
commit dfbdfba2f0

View File

@ -24,6 +24,28 @@ from services.search import search_service
from utils.logger import root_logger as logger from utils.logger import root_logger as logger
def create_shout_from_draft(session, draft, author_id): def create_shout_from_draft(session, draft, author_id):
"""
Создаёт новый объект публикации (Shout) на основе черновика.
Args:
session: SQLAlchemy сессия (не используется, для совместимости)
draft (Draft): Объект черновика
author_id (int): ID автора публикации
Returns:
Shout: Новый объект публикации (не сохранённый в базе)
Пример:
>>> from orm.draft import Draft
>>> draft = Draft(id=1, title='Заголовок', body='Текст', slug='slug', created_by=1)
>>> shout = create_shout_from_draft(None, draft, 1)
>>> shout.title
'Заголовок'
>>> shout.body
'Текст'
>>> shout.created_by
1
"""
# Создаем новую публикацию # Создаем новую публикацию
shout = Shout( shout = Shout(
body=draft.body, body=draft.body,
@ -328,6 +350,7 @@ async def publish_draft(_, info, draft_id: int):
if not shout: if not shout:
# Создаем новый shout если не существует # Создаем новый shout если не существует
shout = create_shout_from_draft(session, draft, author_id) shout = create_shout_from_draft(session, draft, author_id)
shout.published_at = now
else: else:
# Обновляем существующую публикацию # Обновляем существующую публикацию
shout.draft = draft.id shout.draft = draft.id
@ -342,34 +365,37 @@ async def publish_draft(_, info, draft_id: int):
shout.media = draft.media shout.media = draft.media
shout.lang = draft.lang shout.lang = draft.lang
shout.seo = draft.seo shout.seo = draft.seo
draft.updated_at = now
shout.updated_at = now shout.updated_at = now
# Устанавливаем published_at только если была ранее снята с публикации # Устанавливаем published_at только если была ранее снята с публикации
if not was_published: if not was_published:
shout.published_at = now shout.published_at = now
# Обрабатываем связи с авторами # Сохраняем shout перед созданием связей
if ( session.add(shout)
not session.query(ShoutAuthor) session.flush()
.filter(and_(ShoutAuthor.shout == shout.id, ShoutAuthor.author == author_id))
.first()
):
sa = ShoutAuthor(shout=shout.id, author=author_id)
session.add(sa)
# Обрабатываем темы # Очищаем существующие связи
session.query(ShoutAuthor).filter(ShoutAuthor.shout == shout.id).delete()
session.query(ShoutTopic).filter(ShoutTopic.shout == shout.id).delete()
# Добавляем автора
sa = ShoutAuthor(shout=shout.id, author=author_id)
session.add(sa)
# Добавляем темы если есть
if draft.topics: if draft.topics:
for topic in draft.topics: for topic in draft.topics:
st = ShoutTopic( st = ShoutTopic(
topic=topic.id, shout=shout.id, main=topic.main if hasattr(topic, "main") else False topic=topic.id,
shout=shout.id,
main=topic.main if hasattr(topic, "main") else False
) )
session.add(st) session.add(st)
session.add(shout) # Обновляем черновик
draft.updated_at = now
session.add(draft) session.add(draft)
session.flush()
# Инвалидируем кэш только если это новая публикация или была снята с публикации # Инвалидируем кэш только если это новая публикация или была снята с публикации
if not was_published: if not was_published: