save topics

This commit is contained in:
bniwredyc 2023-05-11 13:03:14 +02:00
parent cbb64af17f
commit 96cf3e26c0
2 changed files with 55 additions and 5 deletions

View File

@ -1,6 +1,7 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from sqlalchemy import and_ from sqlalchemy import and_
from sqlalchemy.orm import joinedload
from auth.authenticate import login_required from auth.authenticate import login_required
from auth.credentials import AuthCredentials from auth.credentials import AuthCredentials
@ -97,7 +98,10 @@ async def update_shout(_, info, shout_id, shout_input=None, publish=False):
auth: AuthCredentials = info.context["request"].auth auth: AuthCredentials = info.context["request"].auth
with local_session() as session: with local_session() as session:
shout = session.query(Shout).filter(Shout.id == shout_id).first() shout = session.query(Shout).options(
joinedload(Shout.authors),
joinedload(Shout.topics),
).filter(Shout.id == shout_id).first()
if not shout: if not shout:
return {"error": "shout not found"} return {"error": "shout not found"}
@ -108,6 +112,51 @@ async def update_shout(_, info, shout_id, shout_input=None, publish=False):
updated = False updated = False
if shout_input is not None: if shout_input is not None:
topics_input = shout_input["topics"]
del shout_input["topics"]
new_topics_to_link = []
new_topics = [topic_input for topic_input in topics_input if topic_input["id"] < 0]
for new_topic in new_topics:
del new_topic["id"]
created_new_topic = Topic.create(**new_topic)
session.add(created_new_topic)
new_topics_to_link.append(created_new_topic)
if len(new_topics) > 0:
session.commit()
for new_topic_to_link in new_topics_to_link:
created_unlinked_topic = ShoutTopic.create(shout=shout.id, topic=new_topic_to_link.id)
session.add(created_unlinked_topic)
existing_topics_input = [topic_input for topic_input in topics_input if topic_input.get("id", 0) > 0]
existing_topic_to_link_ids = [existing_topic_input["id"] for existing_topic_input in existing_topics_input
if existing_topic_input["id"] not in [topic.id for topic in shout.topics]]
for existing_topic_to_link_id in existing_topic_to_link_ids:
created_unlinked_topic = ShoutTopic.create(shout=shout.id, topic=existing_topic_to_link_id)
session.add(created_unlinked_topic)
topic_to_unlink_ids = [topic.id for topic in shout.topics
if topic.id not in [topic_input["id"] for topic_input in existing_topics_input]]
shout_topics_to_remove = session.query(ShoutTopic).filter(
and_(
ShoutTopic.shout == shout.id,
ShoutTopic.topic.in_(topic_to_unlink_ids)
)
)
for shout_topic_to_remove in shout_topics_to_remove:
session.delete(shout_topic_to_remove)
shout_input["mainTopic"] = shout_input["mainTopic"]["slug"]
if shout_input["mainTopic"] == '':
del shout_input["mainTopic"]
shout.update(shout_input) shout.update(shout_input)
updated = True updated = True

View File

@ -99,9 +99,9 @@ input ShoutInput {
title: String title: String
body: String body: String
authors: [String] authors: [String]
topics: [String] topics: [TopicInput]
community: Int community: Int
mainTopic: String mainTopic: TopicInput
subtitle: String subtitle: String
cover: String cover: String
} }
@ -116,8 +116,9 @@ input ProfileInput {
} }
input TopicInput { input TopicInput {
id: Int,
slug: String! slug: String!
community: String! # community: String!
title: String title: String
body: String body: String
pic: String pic: String
@ -480,7 +481,7 @@ type Topic {
title: String title: String
body: String body: String
pic: String pic: String
community: Community! # community: Community!
stat: TopicStat stat: TopicStat
oid: String oid: String
} }