diff --git a/resolvers/editor.py b/resolvers/editor.py index 880c0982..fd5c1d5e 100644 --- a/resolvers/editor.py +++ b/resolvers/editor.py @@ -141,6 +141,21 @@ async def update_shout(_, info, shout_id, shout_input=None, publish=False): shout_input["updated_at"] = current_time # Set updated_at as Unix timestamp Shout.update(shout, shout_input) session.add(shout) + + # main topic + # TODO: test main_topic update + if "main_topic" in shout_input: + old_main_topic = session.query(ShoutTopic).filter(and_(ShoutTopic.shout == shout.id, ShoutTopic.main == True)).first() + main_topic = session.query(Topic).filter(Topic.slug == shout_input["main_topic"]).first() + new_main_topic = session.query(ShoutTopic).filter(and_(ShoutTopic.shout == shout.id, ShoutTopic.topic == main_topic.id)).first() + if old_main_topic is not new_main_topic: + old_main_topic.main = False + new_main_topic.main = True + session.add(old_main_topic) + session.add(new_main_topic) + + session.commit() + if publish: if shout.visibility is ShoutVisibility.AUTHORS.value: shout_dict = shout.dict() diff --git a/resolvers/reader.py b/resolvers/reader.py index 05980350..1d612430 100644 --- a/resolvers/reader.py +++ b/resolvers/reader.py @@ -100,11 +100,7 @@ async def get_shout(_, _info, slug=None, shout_id=None): for author in shout.authors: if author.id == author_caption.author: author.caption = author_caption.caption - - shout.main_topic = session.query(ShoutTopics.topic_slug).filter( - ShoutTopics.shout_id == shout.id, - ShoutTopics.main == True - ).first() + shout.main_topic = session.query(Topic.slug).join(ShoutTopic, and_(ShoutTopic.topic == Topic.id, ShoutTopic.shout == shout.id, ShoutTopic.main == True)).first() return shout except Exception: raise HTTPException(status_code=404, detail=f"shout {slug or shout_id} not found") @@ -163,11 +159,7 @@ async def load_shouts_by(_, _info, options): shouts = [] with local_session() as session: for [shout, reacted_stat, commented_stat, rating_stat, _last_comment] in session.execute(q).unique(): - # Query the ShoutTopics table for the main topic - shout.main_topic = session.query(ShoutTopics.topic_slug).filter( - ShoutTopics.shout_id == shout.id, - ShoutTopics.main == True - ).first() + shout.main_topic = session.query(Topic.slug).join(ShoutTopic, and_(ShoutTopic.topic == Topic.id, ShoutTopic.shout == shout.id, ShoutTopic.main == True)).first() shout.stat = { "viewed": await ViewedStorage.get_shout(shout.slug), "reacted": reacted_stat, @@ -257,10 +249,7 @@ async def load_shouts_feed(_, info, options): shouts = [] for [shout, reacted_stat, commented_stat, rating_stat, _last_comment] in session.execute(q).unique(): - shout.main_topic = session.query(ShoutTopics.topic_slug).filter( - ShoutTopics.shout_id == shout.id, - ShoutTopics.main == True - ).first() + shout.main_topic = session.query(Topic.slug).join(ShoutTopic, and_(ShoutTopic.topic == Topic.id, ShoutTopic.shout == shout.id, ShoutTopic.main == True)).first() shout.stat = { "viewed": await ViewedStorage.get_shout(shout.slug), "reacted": reacted_stat,