+ watchers = db.relationship("User", secondary=watchers, lazy="subquery", \
+ backref=db.backref("watching", lazy=True))
+
+
+ def getSubscribeURL(self):
+ return url_for("thread_subscribe_page",
+ id=self.id)
+
+ def getUnsubscribeURL(self):
+ return url_for("thread_unsubscribe_page",
+ id=self.id)
+
+ def checkPerm(self, user, perm):
+ if not user.is_authenticated:
+ return not self.private
+
+ if type(perm) == str:
+ perm = Permission[perm]
+ elif type(perm) != Permission:
+ raise Exception("Unknown permission given to Thread.checkPerm()")
+
+ isOwner = user == self.author or (self.package is not None and self.package.author == user)
+
+ if perm == Permission.SEE_THREAD:
+ return not self.private or isOwner or user.rank.atLeast(UserRank.EDITOR)
+
+ else:
+ raise Exception("Permission {} is not related to threads".format(perm.name))
+
+class ThreadReply(db.Model):
+ id = db.Column(db.Integer, primary_key=True)
+ thread_id = db.Column(db.Integer, db.ForeignKey("thread.id"), nullable=False)
+ comment = db.Column(db.String(500), nullable=False)
+ author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
+ created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
+
+
+REPO_BLACKLIST = [".zip", "mediafire.com", "dropbox.com", "weebly.com", \
+ "minetest.net", "dropboxusercontent.com", "4shared.com", \
+ "digitalaudioconcepts.com", "hg.intevation.org", "www.wtfpl.net", \
+ "imageshack.com", "imgur.com"]
+
+class ForumTopic(db.Model):