[0.9.11] - 2025-08-25
Some checks failed
Deploy on push / deploy (push) Failing after 3m6s

### 📦 Added
- **Автоматическое определение главного топика**: Система автоматически назначает главный топик при публикации
- **Валидация топиков при публикации**: Проверка наличия хотя бы одного топика перед публикацией

### 🏗️ Changed
- **Исправлена логика публикации черновиков**: Теперь автоматически устанавливается главный топик при отсутствии
- **Обновлена логика создания статей**: Гарантируется наличие главного топика во всех публикациях

### 🐛 Fixed
- **Исправлена критическая ошибка с публикацией статей**: Статьи теперь корректно появляются в фидах после публикации
- **Гарантирован главный топик**: Все опубликованные статьи теперь обязательно имеют главный топик (`main=True`)
This commit is contained in:
2025-08-25 02:30:56 +03:00
parent de94408e04
commit 94af896c2d
3 changed files with 46 additions and 5 deletions

View File

@@ -1,5 +1,19 @@
# Changelog
## [0.9.11] - 2025-08-25
### 📦 Added
- **Автоматическое определение главного топика**: Система автоматически назначает главный топик при публикации
- **Валидация топиков при публикации**: Проверка наличия хотя бы одного топика перед публикацией
### 🏗️ Changed
- **Исправлена логика публикации черновиков**: Теперь автоматически устанавливается главный топик при отсутствии
- **Обновлена логика создания статей**: Гарантируется наличие главного топика во всех публикациях
### 🐛 Fixed
- **Исправлена критическая ошибка с публикацией статей**: Статьи теперь корректно появляются в фидах после публикации
- **Гарантирован главный топик**: Все опубликованные статьи теперь обязательно имеют главный топик (`main=True`)
## [0.9.10] - 2025-08-23
### 🐛 Fixed

View File

@@ -358,12 +358,17 @@ async def update_draft(_: None, info: GraphQLResolveInfo, draft_id: int, draft_i
if topic_ids:
# Очищаем текущие связи
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:
dt = DraftTopic(
draft=draft_id,
topic=tid,
main=(tid == main_topic_id) if main_topic_id else False,
main=(tid == main_topic_id),
)
session.add(dt)
@@ -526,10 +531,23 @@ async def publish_draft(_: None, info: GraphQLResolveInfo, draft_id: int) -> dic
session.add(sa)
# Добавляем темы
for topic in draft.topics or []:
st = ShoutTopic(topic=topic.id, shout=shout.id, main=topic.main if hasattr(topic, "main") else False)
topics_list = draft.topics or []
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)
if is_main:
logger.info(f"Set topic {topic.id} as main topic for shout {shout.id}")
# Обновляем черновик ссылкой на опубликованную публикацию
draft.shout = shout.id

View File

@@ -230,14 +230,23 @@ async def create_shout(_: None, info: GraphQLResolveInfo, inp: dict) -> dict:
try:
logger.debug(f"Linking topics: {[t.slug for t in input_topics]}")
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(
topic=topic.id,
shout=new_shout.id,
main=(topic.slug == main_topic) if main_topic else False,
main=is_main,
)
session.add(st)
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:
logger.error(f"Error linking topics: {e}", exc_info=True)
return {"error": f"Error linking topics: {e!s}"}