diff options
Diffstat (limited to 'app/models.py')
-rw-r--r-- | app/models.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/app/models.py b/app/models.py index 78bba43..df1e5a1 100644 --- a/app/models.py +++ b/app/models.py @@ -78,6 +78,7 @@ class Permission(enum.Enum): CHANGE_AUTHOR = "CHANGE_AUTHOR" CHANGE_NAME = "CHANGE_NAME" MAKE_RELEASE = "MAKE_RELEASE" + DELETE_RELEASE = "DELETE_RELEASE" ADD_SCREENSHOTS = "ADD_SCREENSHOTS" APPROVE_SCREENSHOT = "APPROVE_SCREENSHOT" APPROVE_RELEASE = "APPROVE_RELEASE" @@ -741,6 +742,12 @@ class PackageRelease(db.Model): name=self.package.name, id=self.id) + def getDeleteURL(self): + return url_for("packages.delete_release", + author=self.package.author.username, + name=self.package.name, + id=self.id) + def getDownloadURL(self): return url_for("packages.download_release", author=self.package.author.username, @@ -761,6 +768,36 @@ class PackageRelease(db.Model): self.approved = True return True + def checkPerm(self, user, perm): + if not user.is_authenticated: + return False + + if type(perm) == str: + perm = Permission[perm] + elif type(perm) != Permission: + raise Exception("Unknown permission given to PackageRelease.checkPerm()") + + isOwner = user == self.package.author + + if perm == Permission.DELETE_RELEASE: + if user.rank.atLeast(UserRank.ADMIN): + return True + + if not (isOwner or user.rank.atLeast(UserRank.EDITOR)): + return False + + if not self.package.approved: + return True + + count = PackageRelease.query \ + .filter_by(package_id=self.package_id) \ + .filter(PackageRelease.id > self.id) \ + .count() + + return count > 0 + else: + raise Exception("Permission {} is not related to releases".format(perm.name)) + class PackageReview(db.Model): id = db.Column(db.Integer, primary_key=True) |