diff --git a/CHANGELOG.md b/CHANGELOG.md index b8bb4354..ef694f67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [0.9.11] - 2025-08-25 + +### πŸ“¦ Added +- **АвтоматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ°**: БистСма автоматичСски Π½Π°Π·Π½Π°Ρ‡Π°Π΅Ρ‚ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ +- **Валидация Ρ‚ΠΎΠΏΠΈΠΊΠΎΠ² ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ**: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° наличия хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ + +### πŸ—οΈ Changed +- **Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π½ΠΎΠ²ΠΈΠΊΠΎΠ²**: Π’Π΅ΠΏΠ΅Ρ€ΡŒ автоматичСски устанавливаСтся Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ ΠΏΡ€ΠΈ отсутствии +- **ОбновлСна Π»ΠΎΠ³ΠΈΠΊΠ° создания статСй**: ГарантируСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΏΠΈΠΊΠ° Π²ΠΎ всСх публикациях + +### πŸ› Fixed +- **Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° критичСская ошибка с ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ статСй**: Π‘Ρ‚Π°Ρ‚ΡŒΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Ρ„ΠΈΠ΄Π°Ρ… послС ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ +- **Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ**: ВсС ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ‚ΠΎΠΏΠΈΠΊ (`main=True`) + ## [0.9.10] - 2025-08-23 ### πŸ› Fixed diff --git a/resolvers/draft.py b/resolvers/draft.py index 01bfa19f..524906d4 100644 --- a/resolvers/draft.py +++ b/resolvers/draft.py @@ -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 diff --git a/resolvers/editor.py b/resolvers/editor.py index b7740d7a..302943a8 100644 --- a/resolvers/editor.py +++ b/resolvers/editor.py @@ -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}"}