diff --git a/orm/__init__.py b/orm/__init__.py index 29570ed6..aac4e1ac 100644 --- a/orm/__init__.py +++ b/orm/__init__.py @@ -4,7 +4,7 @@ from orm.user import User from orm.message import Message from orm.topic import Topic from orm.notification import Notification -from orm.shout import Shout, ShoutAuthor +from orm.shout import Shout, ShoutAuthor, ShoutTopic from orm.base import Base, engine __all__ = ["User", "Role", "Operation", "Permission", "Message", "Shout", "Topic", "Notification"] diff --git a/orm/base.py b/orm/base.py index 6ae1db7d..4df84b58 100644 --- a/orm/base.py +++ b/orm/base.py @@ -51,6 +51,12 @@ class Base(declarative_base()): session.commit() return self + def update(self, input): + column_names = self.__table__.columns.keys() + for (name, value) in input.items(): + if name in column_names: + setattr(self, name, value) + def dict(self) -> Dict[str, Any]: column_names = self.__table__.columns.keys() return {c: getattr(self, c) for c in column_names} diff --git a/orm/shout.py b/orm/shout.py index a4304bb1..6810d2d6 100644 --- a/orm/shout.py +++ b/orm/shout.py @@ -12,11 +12,12 @@ class ShoutAuthor(Base): shout = Column(ForeignKey('shout.id'), primary_key = True) user = Column(ForeignKey('user.id'), primary_key = True) -ShoutTopics = Table('shout_topics', - Base.metadata, - Column('shout', Integer, ForeignKey('shout.id')), - Column('topic', Integer, ForeignKey('topic.id')) -) +class ShoutTopic(Base): + __tablename__ = 'shout_topic' + + id = None + shout = Column(ForeignKey('shout.id'), primary_key = True) + topic = Column(ForeignKey('topic.id'), primary_key = True) class ShoutRatings(Base): __tablename__ = "user_ratings" @@ -47,7 +48,7 @@ class Shout(Base): subtitle: str = Column(String, nullable = True) layout: str = Column(String, nullable = True) authors = relationship(lambda: User, secondary=ShoutAuthor.__tablename__) # NOTE: multiple authors - topics = relationship(lambda: Topic, secondary=ShoutTopics) + topics = relationship(lambda: Topic, secondary=ShoutTopic.__tablename__) rating: int = Column(Integer, nullable=True, comment="Rating") ratings = relationship(ShoutRatings, foreign_keys=ShoutRatings.shout_id) old_id: str = Column(String, nullable = True) diff --git a/resolvers/zine.py b/resolvers/zine.py index 25016c70..fd01875a 100644 --- a/resolvers/zine.py +++ b/resolvers/zine.py @@ -1,4 +1,4 @@ -from orm import Shout, ShoutAuthor, User, Community, Resource +from orm import Shout, ShoutAuthor, ShoutTopic, User, Community, Resource from orm.base import local_session from resolvers.base import mutation, query @@ -8,6 +8,7 @@ from settings import SHOUTS_REPO import subprocess import asyncio +from datetime import datetime from pathlib import Path @@ -108,16 +109,17 @@ async def update_shout(_, info, id, input): auth = info.context["request"].auth user_id = auth.user_id - with local_session() as session: - user = session.query(User).filter(User.id == user_id).first() - shout = session.query(Shout).filter(Shout.id == id).first() + session = local_session() + user = session.query(User).filter(User.id == user_id).first() + shout = session.query(Shout).filter(Shout.id == id).first() if not shout: return { "error" : "shout not found" } - if shout.authors[0] != user_id: + authors = [author.id for author in shout.authors] + if not user_id in authors: scopes = auth.scopes print(scopes) if not Resource.shout_id in scopes: @@ -125,14 +127,15 @@ async def update_shout(_, info, id, input): "error" : "access denied" } - shout.body = input["body"], - shout.replyTo = input.get("replyTo"), - shout.versionOf = input.get("versionOf"), - shout.tags = input.get("tags"), - shout.topics = input.get("topics") + shout.update(input) + shout.updatedAt = datetime.now() + session.commit() + session.close() - with local_session() as session: - session.commit() + for topic in input.get("topics"): + ShoutTopic.create( + shout = shout.id, + topic = topic) task = GitTask( input, diff --git a/schema.graphql b/schema.graphql index 3a0ed1f7..6bfb7c25 100644 --- a/schema.graphql +++ b/schema.graphql @@ -27,7 +27,7 @@ input ShoutInput { body: String! replyTo: String # another shout tags: [String] # actual values - topics: [String] # topic-slugs + topics: [Int] title: String subtitle: String versionOf: String