]> git.lizzy.rs Git - cheatdb.git/commitdiff
Add thread watchers
authorrubenwardy <rw@rubenwardy.com>
Mon, 11 Jun 2018 22:38:03 +0000 (23:38 +0100)
committerrubenwardy <rw@rubenwardy.com>
Mon, 11 Jun 2018 22:39:41 +0000 (23:39 +0100)
app/models.py
app/views/threads.py
migrations/versions/de004661c5e1_.py [new file with mode: 0644]

index c76cb258ec163efbd206c9643c04a748417ab356..93f69923c11e2c28b927a48cb7959975182cebc6 100644 (file)
@@ -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
index c975e5fa344e9784c65a5abb7c81f0462aef75e0..a842d5854c44e433c78ac2c80c9ab6e8ab83bc58 100644 (file)
@@ -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 (file)
index 0000000..73b5880
--- /dev/null
@@ -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 ###