From 68b7a5e922472202599ae598cc490865ef20bbb0 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Mon, 11 Jun 2018 23:38:03 +0100 Subject: [PATCH] Add thread watchers --- app/models.py | 9 +++++++- app/views/threads.py | 19 +++++++++++++++- migrations/versions/de004661c5e1_.py | 34 ++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/de004661c5e1_.py diff --git a/app/models.py b/app/models.py index c76cb25..93f6992 100644 --- a/app/models.py +++ b/app/models.py @@ -92,7 +92,6 @@ class Permission(enum.Enum): else: raise Exception("Non-global permission checked globally. Use Package.checkPerm or User.checkPerm instead.") - class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) @@ -665,6 +664,11 @@ class EditRequestChange(db.Model): setattr(package, self.key.name, self.newValue) +watchers = db.Table("watchers", + db.Column("user_id", db.Integer, db.ForeignKey("user.id"), primary_key=True), + db.Column("thread_id", db.Integer, db.ForeignKey("thread.id"), primary_key=True) +) + class Thread(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -679,6 +683,9 @@ class Thread(db.Model): replies = db.relationship("ThreadReply", backref="thread", lazy="dynamic") + watchers = db.relationship("User", secondary=watchers, lazy="subquery", \ + backref=db.backref("watching", lazy=True)) + def checkPerm(self, user, perm): if not user.is_authenticated: return not self.private diff --git a/app/views/threads.py b/app/views/threads.py index c975e5f..a842d58 100644 --- a/app/views/threads.py +++ b/app/views/threads.py @@ -48,6 +48,20 @@ def thread_page(id): db.session.add(reply) thread.replies.append(reply) + if not current_user in thread.watchers: + thread.watchers.append(current_user) + + msg = None + if thread.package is None: + msg = "New comment on '{}'".format(thread.title) + else: + msg = "New comment on '{}' on package {}".format(thread.title, thread.package.title) + + + for user in thread.watchers: + if user != current_user: + triggerNotif(user, current_user, msg, url_for("thread_page", id=thread.id)) + db.session.commit() return redirect(url_for("thread_page", id=id)) @@ -111,6 +125,10 @@ def new_thread_page(): thread.package = package db.session.add(thread) + thread.watchers.append(current_user) + if package is not None and package.author != current_user: + thread.watchers.append(package.author) + reply = ThreadReply() reply.thread = thread reply.author = current_user @@ -127,7 +145,6 @@ def new_thread_page(): if package is not None: triggerNotif(package.author, current_user, "New thread '{}' on package {}".format(thread.title, package.title), url_for("thread_page", id=thread.id)) - db.session.commit() db.session.commit() diff --git a/migrations/versions/de004661c5e1_.py b/migrations/versions/de004661c5e1_.py new file mode 100644 index 0000000..73b5880 --- /dev/null +++ b/migrations/versions/de004661c5e1_.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: de004661c5e1 +Revises: 605b3d74ada1 +Create Date: 2018-06-11 23:38:38.611039 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'de004661c5e1' +down_revision = '605b3d74ada1' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('watchers', + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('thread_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['thread_id'], ['thread.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), + sa.PrimaryKeyConstraint('user_id', 'thread_id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('watchers') + # ### end Alembic commands ###