### 📦 Added - **Автоматическое определение главного топика**: Система автоматически назначает главный топик при публикации - **Валидация топиков при публикации**: Проверка наличия хотя бы одного топика перед публикацией ### 🏗️ Changed - **Исправлена логика публикации черновиков**: Теперь автоматически устанавливается главный топик при отсутствии - **Обновлена логика создания статей**: Гарантируется наличие главного топика во всех публикациях ### 🐛 Fixed - **Исправлена критическая ошибка с публикацией статей**: Статьи теперь корректно появляются в фидах после публикации - **Гарантирован главный топик**: Все опубликованные статьи теперь обязательно имеют главный топик (`main=True`)
This commit is contained in:
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,5 +1,19 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.9.11] - 2025-08-25
|
||||||
|
|
||||||
|
### 📦 Added
|
||||||
|
- **Автоматическое определение главного топика**: Система автоматически назначает главный топик при публикации
|
||||||
|
- **Валидация топиков при публикации**: Проверка наличия хотя бы одного топика перед публикацией
|
||||||
|
|
||||||
|
### 🏗️ Changed
|
||||||
|
- **Исправлена логика публикации черновиков**: Теперь автоматически устанавливается главный топик при отсутствии
|
||||||
|
- **Обновлена логика создания статей**: Гарантируется наличие главного топика во всех публикациях
|
||||||
|
|
||||||
|
### 🐛 Fixed
|
||||||
|
- **Исправлена критическая ошибка с публикацией статей**: Статьи теперь корректно появляются в фидах после публикации
|
||||||
|
- **Гарантирован главный топик**: Все опубликованные статьи теперь обязательно имеют главный топик (`main=True`)
|
||||||
|
|
||||||
## [0.9.10] - 2025-08-23
|
## [0.9.10] - 2025-08-23
|
||||||
|
|
||||||
### 🐛 Fixed
|
### 🐛 Fixed
|
||||||
|
|||||||
@@ -358,12 +358,17 @@ async def update_draft(_: None, info: GraphQLResolveInfo, draft_id: int, draft_i
|
|||||||
if topic_ids:
|
if topic_ids:
|
||||||
# Очищаем текущие связи
|
# Очищаем текущие связи
|
||||||
session.query(DraftTopic).where(DraftTopic.draft == draft_id).delete()
|
session.query(DraftTopic).where(DraftTopic.draft == draft_id).delete()
|
||||||
|
# 🔍 Если главный топик не указан, делаем первый топик главным
|
||||||
|
if not main_topic_id:
|
||||||
|
main_topic_id = topic_ids[0]
|
||||||
|
logger.info(f"No main topic specified for draft {draft_id}, using first topic {main_topic_id}")
|
||||||
|
|
||||||
# Добавляем новые связи
|
# Добавляем новые связи
|
||||||
for tid in topic_ids:
|
for tid in topic_ids:
|
||||||
dt = DraftTopic(
|
dt = DraftTopic(
|
||||||
draft=draft_id,
|
draft=draft_id,
|
||||||
topic=tid,
|
topic=tid,
|
||||||
main=(tid == main_topic_id) if main_topic_id else False,
|
main=(tid == main_topic_id),
|
||||||
)
|
)
|
||||||
session.add(dt)
|
session.add(dt)
|
||||||
|
|
||||||
@@ -526,10 +531,23 @@ async def publish_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> dic
|
|||||||
session.add(sa)
|
session.add(sa)
|
||||||
|
|
||||||
# Добавляем темы
|
# Добавляем темы
|
||||||
for topic in draft.topics or []:
|
topics_list = draft.topics or []
|
||||||
st = ShoutTopic(topic=topic.id, shout=shout.id, main=topic.main if hasattr(topic, "main") else False)
|
if not topics_list:
|
||||||
|
logger.error(f"Cannot publish draft {draft_id}: no topics assigned")
|
||||||
|
return {"error": "Cannot publish draft: at least one topic is required"}
|
||||||
|
|
||||||
|
# 🔍 Проверяем наличие главного топика
|
||||||
|
has_main_topic = any(getattr(topic, "main", False) for topic in topics_list)
|
||||||
|
|
||||||
|
for i, topic in enumerate(topics_list):
|
||||||
|
# 🩵 Если нет главного топика, делаем первый топик главным
|
||||||
|
is_main = getattr(topic, "main", False) or (not has_main_topic and i == 0)
|
||||||
|
st = ShoutTopic(topic=topic.id, shout=shout.id, main=is_main)
|
||||||
session.add(st)
|
session.add(st)
|
||||||
|
|
||||||
|
if is_main:
|
||||||
|
logger.info(f"Set topic {topic.id} as main topic for shout {shout.id}")
|
||||||
|
|
||||||
# Обновляем черновик ссылкой на опубликованную публикацию
|
# Обновляем черновик ссылкой на опубликованную публикацию
|
||||||
draft.shout = shout.id
|
draft.shout = shout.id
|
||||||
|
|
||||||
|
|||||||
@@ -230,14 +230,23 @@ async def create_shout(_: None, info: GraphQLResolveInfo, inp: dict) -> dict:
|
|||||||
try:
|
try:
|
||||||
logger.debug(f"Linking topics: {[t.slug for t in input_topics]}")
|
logger.debug(f"Linking topics: {[t.slug for t in input_topics]}")
|
||||||
main_topic = inp.get("main_topic")
|
main_topic = inp.get("main_topic")
|
||||||
for topic in input_topics:
|
|
||||||
|
# 🔍 Проверяем наличие главного топика
|
||||||
|
has_main_topic = bool(main_topic and any(t.slug == main_topic for t in input_topics))
|
||||||
|
|
||||||
|
for i, topic in enumerate(input_topics):
|
||||||
|
# 🩵 Если нет главного топика, делаем первый топик главным
|
||||||
|
is_main = (topic.slug == main_topic) if main_topic else (not has_main_topic and i == 0)
|
||||||
st = ShoutTopic(
|
st = ShoutTopic(
|
||||||
topic=topic.id,
|
topic=topic.id,
|
||||||
shout=new_shout.id,
|
shout=new_shout.id,
|
||||||
main=(topic.slug == main_topic) if main_topic else False,
|
main=is_main,
|
||||||
)
|
)
|
||||||
session.add(st)
|
session.add(st)
|
||||||
logger.debug(f"Added topic {topic.slug} {'(main)' if st.main else ''}")
|
logger.debug(f"Added topic {topic.slug} {'(main)' if st.main else ''}")
|
||||||
|
|
||||||
|
if is_main:
|
||||||
|
logger.info(f"Set topic {topic.id} as main topic for shout {new_shout.id}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error linking topics: {e}", exc_info=True)
|
logger.error(f"Error linking topics: {e}", exc_info=True)
|
||||||
return {"error": f"Error linking topics: {e!s}"}
|
return {"error": f"Error linking topics: {e!s}"}
|
||||||
|
|||||||
Reference in New Issue
Block a user