mirror of
https://github.com/minetest/contentdb.git
synced 2025-01-03 03:37:28 +01:00
Use explicit back references in Database
This commit is contained in:
parent
d8f33a4111
commit
b28732ee74
@ -268,6 +268,5 @@ title: Ranks and Permissions
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
||||||
1. User must be the author of the EditRequest.
|
|
||||||
2. Target user cannot be an admin.
|
2. Target user cannot be an admin.
|
||||||
3. Cannot set user to a higher rank than themselves.
|
3. Cannot set user to a higher rank than themselves.
|
||||||
|
165
app/models.py
165
app/models.py
@ -36,7 +36,7 @@ migrate = Migrate(app, db)
|
|||||||
make_searchable(db.metadata)
|
make_searchable(db.metadata)
|
||||||
|
|
||||||
|
|
||||||
class ArticleQuery(BaseQuery, SearchQueryMixin):
|
class PackageQuery(BaseQuery, SearchQueryMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
@ -90,7 +90,6 @@ class Permission(enum.Enum):
|
|||||||
CHANGE_USERNAMES = "CHANGE_USERNAMES"
|
CHANGE_USERNAMES = "CHANGE_USERNAMES"
|
||||||
CHANGE_RANK = "CHANGE_RANK"
|
CHANGE_RANK = "CHANGE_RANK"
|
||||||
CHANGE_EMAIL = "CHANGE_EMAIL"
|
CHANGE_EMAIL = "CHANGE_EMAIL"
|
||||||
EDIT_EDITREQUEST = "EDIT_EDITREQUEST"
|
|
||||||
SEE_THREAD = "SEE_THREAD"
|
SEE_THREAD = "SEE_THREAD"
|
||||||
CREATE_THREAD = "CREATE_THREAD"
|
CREATE_THREAD = "CREATE_THREAD"
|
||||||
COMMENT_THREAD = "COMMENT_THREAD"
|
COMMENT_THREAD = "COMMENT_THREAD"
|
||||||
@ -171,11 +170,11 @@ class User(db.Model, UserMixin):
|
|||||||
|
|
||||||
notification_preferences = db.relationship("UserNotificationPreferences", uselist=False, back_populates="user")
|
notification_preferences = db.relationship("UserNotificationPreferences", uselist=False, back_populates="user")
|
||||||
|
|
||||||
packages = db.relationship("Package", backref=db.backref("author", lazy="joined"), lazy="dynamic")
|
packages = db.relationship("Package", back_populates="author", lazy="dynamic")
|
||||||
requests = db.relationship("EditRequest", backref="author", lazy="dynamic")
|
reviews = db.relationship("PackageReview", back_populates="author", order_by=db.desc("review_created_at"))
|
||||||
threads = db.relationship("Thread", backref="author", lazy="dynamic")
|
tokens = db.relationship("APIToken", back_populates="owner", lazy="dynamic")
|
||||||
tokens = db.relationship("APIToken", backref="owner", lazy="dynamic")
|
threads = db.relationship("Thread", back_populates="author", lazy="dynamic")
|
||||||
replies = db.relationship("ThreadReply", backref="author", lazy="dynamic")
|
replies = db.relationship("ThreadReply", back_populates="author", lazy="dynamic")
|
||||||
|
|
||||||
def __init__(self, username=None, active=False, email=None, password=None):
|
def __init__(self, username=None, active=False, email=None, password=None):
|
||||||
self.username = username
|
self.username = username
|
||||||
@ -586,11 +585,18 @@ maintainers = db.Table("maintainers",
|
|||||||
|
|
||||||
class Dependency(db.Model):
|
class Dependency(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
depender_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
depender_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
||||||
|
depender = db.relationship("Package", foreign_keys=[depender_id])
|
||||||
|
|
||||||
package_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
package_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
||||||
package = db.relationship("Package", foreign_keys=[package_id])
|
package = db.relationship("Package", foreign_keys=[package_id])
|
||||||
|
|
||||||
meta_package_id = db.Column(db.Integer, db.ForeignKey("meta_package.id"), nullable=True)
|
meta_package_id = db.Column(db.Integer, db.ForeignKey("meta_package.id"), nullable=True)
|
||||||
|
meta_package = db.relationship("MetaPackage", foreign_keys=[meta_package_id])
|
||||||
|
|
||||||
optional = db.Column(db.Boolean, nullable=False, default=False)
|
optional = db.Column(db.Boolean, nullable=False, default=False)
|
||||||
|
|
||||||
__table_args__ = (db.UniqueConstraint("depender_id", "package_id", "meta_package_id", name="_dependency_uc"), )
|
__table_args__ = (db.UniqueConstraint("depender_id", "package_id", "meta_package_id", name="_dependency_uc"), )
|
||||||
|
|
||||||
def __init__(self, depender=None, package=None, meta=None, optional=False):
|
def __init__(self, depender=None, package=None, meta=None, optional=False):
|
||||||
@ -661,12 +667,14 @@ class Dependency(db.Model):
|
|||||||
|
|
||||||
|
|
||||||
class Package(db.Model):
|
class Package(db.Model):
|
||||||
query_class = ArticleQuery
|
query_class = PackageQuery
|
||||||
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
# Basic details
|
# Basic details
|
||||||
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
|
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
|
||||||
|
author = db.relationship("User", back_populates="packages", foreign_keys=[author_id])
|
||||||
|
|
||||||
name = db.Column(db.Unicode(100), nullable=False)
|
name = db.Column(db.Unicode(100), nullable=False)
|
||||||
title = db.Column(db.Unicode(100), nullable=False)
|
title = db.Column(db.Unicode(100), nullable=False)
|
||||||
short_desc = db.Column(db.Unicode(200), nullable=False)
|
short_desc = db.Column(db.Unicode(200), nullable=False)
|
||||||
@ -706,27 +714,27 @@ class Package(db.Model):
|
|||||||
|
|
||||||
provides = db.relationship("MetaPackage",
|
provides = db.relationship("MetaPackage",
|
||||||
secondary=provides, lazy="select", order_by=db.asc("name"),
|
secondary=provides, lazy="select", order_by=db.asc("name"),
|
||||||
backref=db.backref("packages", lazy="dynamic", order_by=db.desc("score")))
|
back_populates="packages")
|
||||||
|
|
||||||
dependencies = db.relationship("Dependency", backref="depender", lazy="dynamic", foreign_keys=[Dependency.depender_id])
|
dependencies = db.relationship("Dependency", back_populates="depender", lazy="dynamic", foreign_keys=[Dependency.depender_id])
|
||||||
|
|
||||||
tags = db.relationship("Tag", secondary=Tags, lazy="select",
|
tags = db.relationship("Tag", secondary=Tags, lazy="select",
|
||||||
backref=db.backref("packages", lazy=True))
|
back_populates="packages")
|
||||||
|
|
||||||
content_warnings = db.relationship("ContentWarning", secondary=ContentWarnings, lazy="select",
|
content_warnings = db.relationship("ContentWarning", secondary=ContentWarnings, lazy="select",
|
||||||
backref=db.backref("packages", lazy=True))
|
back_populates="packages")
|
||||||
|
|
||||||
releases = db.relationship("PackageRelease", backref="package",
|
releases = db.relationship("PackageRelease", back_populates="package",
|
||||||
lazy="dynamic", order_by=db.desc("package_release_releaseDate"))
|
lazy="dynamic", order_by=db.desc("package_release_releaseDate"))
|
||||||
|
|
||||||
screenshots = db.relationship("PackageScreenshot", backref="package",
|
screenshots = db.relationship("PackageScreenshot", back_populates="package",
|
||||||
lazy="dynamic", order_by=db.asc("package_screenshot_order"))
|
lazy="dynamic", order_by=db.asc("package_screenshot_order"))
|
||||||
|
|
||||||
requests = db.relationship("EditRequest", backref="package",
|
|
||||||
lazy="dynamic")
|
|
||||||
|
|
||||||
maintainers = db.relationship("User", secondary=maintainers, lazy="subquery")
|
maintainers = db.relationship("User", secondary=maintainers, lazy="subquery")
|
||||||
|
|
||||||
|
threads = db.relationship("Thread", back_populates="package", order_by=db.desc("thread_created_at"), foreign_keys="Thread.package_id")
|
||||||
|
reviews = db.relationship("PackageReview", back_populates="package", order_by=db.desc("review_created_at"))
|
||||||
|
|
||||||
def __init__(self, package=None):
|
def __init__(self, package=None):
|
||||||
if package is None:
|
if package is None:
|
||||||
return
|
return
|
||||||
@ -899,10 +907,6 @@ class Package(db.Model):
|
|||||||
return url_for("packages.create_release",
|
return url_for("packages.create_release",
|
||||||
author=self.author.username, name=self.name)
|
author=self.author.username, name=self.name)
|
||||||
|
|
||||||
def getCreateEditRequestURL(self):
|
|
||||||
return url_for("create_edit_editrequest_page",
|
|
||||||
author=self.author.username, name=self.name)
|
|
||||||
|
|
||||||
def getBulkReleaseURL(self):
|
def getBulkReleaseURL(self):
|
||||||
return url_for("packages.bulk_change_release",
|
return url_for("packages.bulk_change_release",
|
||||||
author=self.author.username, name=self.name)
|
author=self.author.username, name=self.name)
|
||||||
@ -1061,7 +1065,8 @@ class Package(db.Model):
|
|||||||
class MetaPackage(db.Model):
|
class MetaPackage(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
name = db.Column(db.String(100), unique=True, nullable=False)
|
name = db.Column(db.String(100), unique=True, nullable=False)
|
||||||
dependencies = db.relationship("Dependency", backref="meta_package", lazy="dynamic")
|
dependencies = db.relationship("Dependency", back_populates="meta_package", lazy="dynamic")
|
||||||
|
packages = db.relationship("Package", back_populates="provides", secondary=provides)
|
||||||
|
|
||||||
mp_name_valid = db.CheckConstraint("name ~* '^[a-z0-9_]+$'")
|
mp_name_valid = db.CheckConstraint("name ~* '^[a-z0-9_]+$'")
|
||||||
|
|
||||||
@ -1115,6 +1120,8 @@ class ContentWarning(db.Model):
|
|||||||
title = db.Column(db.String(100), nullable=False)
|
title = db.Column(db.String(100), nullable=False)
|
||||||
description = db.Column(db.String(500), nullable=False)
|
description = db.Column(db.String(500), nullable=False)
|
||||||
|
|
||||||
|
packages = db.relationship("Package", back_populates="content_warnings", secondary=ContentWarnings)
|
||||||
|
|
||||||
def __init__(self, title, description=""):
|
def __init__(self, title, description=""):
|
||||||
self.title = title
|
self.title = title
|
||||||
self.description = description
|
self.description = description
|
||||||
@ -1133,6 +1140,8 @@ class Tag(db.Model):
|
|||||||
textColor = db.Column(db.String(6), nullable=False)
|
textColor = db.Column(db.String(6), nullable=False)
|
||||||
views = db.Column(db.Integer, nullable=False, default=0)
|
views = db.Column(db.Integer, nullable=False, default=0)
|
||||||
|
|
||||||
|
packages = db.relationship("Package", back_populates="tags", secondary=Tags)
|
||||||
|
|
||||||
def __init__(self, title, backgroundColor="000000", textColor="ffffff"):
|
def __init__(self, title, backgroundColor="000000", textColor="ffffff"):
|
||||||
self.title = title
|
self.title = title
|
||||||
self.backgroundColor = backgroundColor
|
self.backgroundColor = backgroundColor
|
||||||
@ -1179,6 +1188,8 @@ class PackageRelease(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
package_id = db.Column(db.Integer, db.ForeignKey("package.id"))
|
package_id = db.Column(db.Integer, db.ForeignKey("package.id"))
|
||||||
|
package = db.relationship("Package", back_populates="releases", foreign_keys=[package_id])
|
||||||
|
|
||||||
title = db.Column(db.String(100), nullable=False)
|
title = db.Column(db.String(100), nullable=False)
|
||||||
releaseDate = db.Column(db.DateTime, nullable=False)
|
releaseDate = db.Column(db.DateTime, nullable=False)
|
||||||
url = db.Column(db.String(200), nullable=False)
|
url = db.Column(db.String(200), nullable=False)
|
||||||
@ -1271,7 +1282,10 @@ class PackageRelease(db.Model):
|
|||||||
|
|
||||||
class PackageScreenshot(db.Model):
|
class PackageScreenshot(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
package_id = db.Column(db.Integer, db.ForeignKey("package.id"))
|
package_id = db.Column(db.Integer, db.ForeignKey("package.id"))
|
||||||
|
package = db.relationship("Package", back_populates="screenshots", foreign_keys=[package_id])
|
||||||
|
|
||||||
order = db.Column(db.Integer, nullable=False, default=0)
|
order = db.Column(db.Integer, nullable=False, default=0)
|
||||||
title = db.Column(db.String(100), nullable=False)
|
title = db.Column(db.String(100), nullable=False)
|
||||||
url = db.Column(db.String(100), nullable=False)
|
url = db.Column(db.String(100), nullable=False)
|
||||||
@ -1299,7 +1313,7 @@ class APIToken(db.Model):
|
|||||||
|
|
||||||
name = db.Column(db.String(100), nullable=False)
|
name = db.Column(db.String(100), nullable=False)
|
||||||
owner_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
owner_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
||||||
# owner is created using backref
|
owner = db.relationship("User", back_populates="tokens", foreign_keys=[owner_id])
|
||||||
|
|
||||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||||
|
|
||||||
@ -1313,94 +1327,6 @@ class APIToken(db.Model):
|
|||||||
return package.author == self.owner
|
return package.author == self.owner
|
||||||
|
|
||||||
|
|
||||||
class EditRequest(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
|
|
||||||
package_id = db.Column(db.Integer, db.ForeignKey("package.id"))
|
|
||||||
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
|
|
||||||
|
|
||||||
title = db.Column(db.String(100), nullable=False)
|
|
||||||
desc = db.Column(db.String(1000), nullable=True)
|
|
||||||
|
|
||||||
# 0 - open
|
|
||||||
# 1 - merged
|
|
||||||
# 2 - rejected
|
|
||||||
status = db.Column(db.Integer, nullable=False, default=0)
|
|
||||||
|
|
||||||
changes = db.relationship("EditRequestChange", backref="request",
|
|
||||||
lazy="dynamic")
|
|
||||||
|
|
||||||
def getURL(self):
|
|
||||||
return url_for("view_editrequest_page",
|
|
||||||
author=self.package.author.username,
|
|
||||||
name=self.package.name,
|
|
||||||
id=self.id)
|
|
||||||
|
|
||||||
def getApproveURL(self):
|
|
||||||
return url_for("approve_editrequest_page",
|
|
||||||
author=self.package.author.username,
|
|
||||||
name=self.package.name,
|
|
||||||
id=self.id)
|
|
||||||
|
|
||||||
def getRejectURL(self):
|
|
||||||
return url_for("reject_editrequest_page",
|
|
||||||
author=self.package.author.username,
|
|
||||||
name=self.package.name,
|
|
||||||
id=self.id)
|
|
||||||
|
|
||||||
def getEditURL(self):
|
|
||||||
return url_for("create_edit_editrequest_page",
|
|
||||||
author=self.package.author.username,
|
|
||||||
name=self.package.name,
|
|
||||||
id=self.id)
|
|
||||||
|
|
||||||
def applyAll(self, package):
|
|
||||||
for change in self.changes:
|
|
||||||
change.apply(package)
|
|
||||||
|
|
||||||
|
|
||||||
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 EditRequest.checkPerm()")
|
|
||||||
|
|
||||||
isOwner = user == self.author
|
|
||||||
|
|
||||||
# Members can edit their own packages, and editors can edit any packages
|
|
||||||
if perm == Permission.EDIT_EDITREQUEST:
|
|
||||||
return isOwner or user.rank.atLeast(UserRank.EDITOR)
|
|
||||||
|
|
||||||
else:
|
|
||||||
raise Exception("Permission {} is not related to packages".format(perm.name))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class EditRequestChange(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
|
|
||||||
request_id = db.Column(db.Integer, db.ForeignKey("edit_request.id"))
|
|
||||||
key = db.Column(db.Enum(PackagePropertyKey), nullable=False)
|
|
||||||
|
|
||||||
# TODO: make diff instead
|
|
||||||
oldValue = db.Column(db.Text, nullable=True)
|
|
||||||
newValue = db.Column(db.Text, nullable=True)
|
|
||||||
|
|
||||||
def apply(self, package):
|
|
||||||
if self.key == PackagePropertyKey.tags:
|
|
||||||
package.tags.clear()
|
|
||||||
for tagTitle in self.newValue.split(","):
|
|
||||||
tag = Tag.query.filter_by(title=tagTitle.strip()).first()
|
|
||||||
package.tags.append(tag)
|
|
||||||
|
|
||||||
else:
|
|
||||||
setattr(package, self.key.name, self.newValue)
|
|
||||||
|
|
||||||
|
|
||||||
watchers = db.Table("watchers",
|
watchers = db.Table("watchers",
|
||||||
db.Column("user_id", db.Integer, db.ForeignKey("user.id"), primary_key=True),
|
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)
|
db.Column("thread_id", db.Integer, db.ForeignKey("thread.id"), primary_key=True)
|
||||||
@ -1416,6 +1342,8 @@ class Thread(db.Model):
|
|||||||
review = db.relationship("PackageReview", foreign_keys=[review_id])
|
review = db.relationship("PackageReview", foreign_keys=[review_id])
|
||||||
|
|
||||||
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
||||||
|
author = db.relationship("User", back_populates="threads", foreign_keys=[author_id])
|
||||||
|
|
||||||
title = db.Column(db.String(100), nullable=False)
|
title = db.Column(db.String(100), nullable=False)
|
||||||
private = db.Column(db.Boolean, server_default="0", nullable=False)
|
private = db.Column(db.Boolean, server_default="0", nullable=False)
|
||||||
|
|
||||||
@ -1423,11 +1351,10 @@ class Thread(db.Model):
|
|||||||
|
|
||||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||||
|
|
||||||
replies = db.relationship("ThreadReply", backref="thread", lazy="dynamic",
|
replies = db.relationship("ThreadReply", back_populates="thread", lazy="dynamic",
|
||||||
order_by=db.asc("thread_reply_id"))
|
order_by=db.asc("thread_reply_id"))
|
||||||
|
|
||||||
watchers = db.relationship("User", secondary=watchers, lazy="subquery",
|
watchers = db.relationship("User", secondary=watchers, lazy="subquery", backref="watching")
|
||||||
backref=db.backref("watching", lazy=True))
|
|
||||||
|
|
||||||
def getViewURL(self):
|
def getViewURL(self):
|
||||||
return url_for("threads.view", id=self.id)
|
return url_for("threads.view", id=self.id)
|
||||||
@ -1467,9 +1394,15 @@ class Thread(db.Model):
|
|||||||
|
|
||||||
class ThreadReply(db.Model):
|
class ThreadReply(db.Model):
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
thread_id = db.Column(db.Integer, db.ForeignKey("thread.id"), nullable=False)
|
thread_id = db.Column(db.Integer, db.ForeignKey("thread.id"), nullable=False)
|
||||||
|
thread = db.relationship("Thread", back_populates="replies", foreign_keys=[thread_id])
|
||||||
|
|
||||||
comment = db.Column(db.String(2000), nullable=False)
|
comment = db.Column(db.String(2000), nullable=False)
|
||||||
|
|
||||||
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
||||||
|
author = db.relationship("User", back_populates="replies", foreign_keys=[author_id])
|
||||||
|
|
||||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||||
|
|
||||||
def checkPerm(self, user, perm):
|
def checkPerm(self, user, perm):
|
||||||
@ -1495,12 +1428,12 @@ class PackageReview(db.Model):
|
|||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
|
||||||
package_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
package_id = db.Column(db.Integer, db.ForeignKey("package.id"), nullable=True)
|
||||||
package = db.relationship("Package", foreign_keys=[package_id], backref=db.backref("reviews", lazy=True))
|
package = db.relationship("Package", foreign_keys=[package_id], back_populates="reviews")
|
||||||
|
|
||||||
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
|
||||||
|
|
||||||
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
author_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
|
||||||
author = db.relationship("User", foreign_keys=[author_id], backref=db.backref("reviews", lazy=True))
|
author = db.relationship("User", foreign_keys=[author_id], back_populates="reviews")
|
||||||
|
|
||||||
recommends = db.Column(db.Boolean, nullable=False)
|
recommends = db.Column(db.Boolean, nullable=False)
|
||||||
|
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block title %}
|
|
||||||
{{ package.title or "Edit Request" }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
{% from "macros/forms.html" import render_field, render_submit_field, form_includes, render_multiselect_field, render_mpackage_field, render_deps_field, package_lists %}
|
|
||||||
{{ form_includes() }}
|
|
||||||
{{ package_lists() }}
|
|
||||||
|
|
||||||
<form method="POST" action="">
|
|
||||||
{{ form.hidden_tag() }}
|
|
||||||
|
|
||||||
<h2 class="pkg_meta">Package</h2>
|
|
||||||
|
|
||||||
{{ render_field(form.type) }}
|
|
||||||
{{ render_field(form.name) }}
|
|
||||||
{{ render_field(form.title) }}
|
|
||||||
{{ render_field(form.short_desc) }}
|
|
||||||
{{ render_field(form.desc) }}
|
|
||||||
{{ render_multiselect_field(form.tags) }}
|
|
||||||
|
|
||||||
<h2 class="not_txp">Dependency Info</h2>
|
|
||||||
|
|
||||||
{{ render_mpackage_field(form.provides_str, class_="not_txp", placeholder="Comma separated list") }}
|
|
||||||
{{ render_deps_field(form.harddep_str, class_="not_txp not_game", placeholder="Comma separated list") }}
|
|
||||||
{{ render_deps_field(form.softdep_str, class_="not_txp not_game", placeholder="Comma separated list") }}
|
|
||||||
|
|
||||||
{{ render_field(form.license) }}
|
|
||||||
{{ render_field(form.media_license) }}
|
|
||||||
{{ render_field(form.repo) }}
|
|
||||||
{{ render_field(form.website) }}
|
|
||||||
{{ render_field(form.issueTracker) }}
|
|
||||||
{{ render_field(form.forums) }}
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
{{ render_field(form.edit_title) }}
|
|
||||||
{{ render_field(form.edit_desc) }}
|
|
||||||
{{ render_submit_field(form.submit) }}
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<script src="/static/package_edit.js"></script>
|
|
||||||
{% endblock %}
|
|
@ -1,65 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
|
|
||||||
{% block title %}
|
|
||||||
{{ request.title }} - {{ package.title }}
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<h1>{{ request.title }} by {{ request.author.display_name }}</h1>
|
|
||||||
<p>
|
|
||||||
{% if request.status != 1 and request.status != 2 and request.checkPerm(current_user, 'EDIT_EDITREQUEST') %}
|
|
||||||
<a href="{{ request.getEditURL() }}">Edit</a> |
|
|
||||||
{% endif %}
|
|
||||||
Package: <a href="{{ package.getDetailsURL() }}">{{ package.title }}</a>
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
{% if request.desc %}
|
|
||||||
{{ request.desc }}
|
|
||||||
{% else %}
|
|
||||||
<i>No description given</i>
|
|
||||||
{% endif %}
|
|
||||||
</p>
|
|
||||||
{% if request.status == 1 %}
|
|
||||||
<div class="box box_grey alert alert-success">
|
|
||||||
This edit request was merged.
|
|
||||||
</div>
|
|
||||||
{% elif request.status == 2 %}
|
|
||||||
<div class="box box_grey alert alert-danger">
|
|
||||||
This edit request was rejected.
|
|
||||||
</div>
|
|
||||||
{% elif package.checkPerm(current_user, "APPROVE_CHANGES") %}
|
|
||||||
<div class="box box_grey alert">
|
|
||||||
Request can be merged.
|
|
||||||
|
|
||||||
<div class="alert_right">
|
|
||||||
<form method="post" action="{{ request.getApproveURL() }}">
|
|
||||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
|
|
||||||
<input type="submit" value="Approve and Apply" />
|
|
||||||
</form>
|
|
||||||
<form method="post" action="{{ request.getRejectURL() }}">
|
|
||||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
|
|
||||||
<input type="submit" value="Reject" />
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<table class="fancyTable t-mll">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Property</th>
|
|
||||||
<th>Old</th>
|
|
||||||
<th>New</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for change in request.changes %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ change.key.value }}</td>
|
|
||||||
<td>{{ change.oldValue }}</td>
|
|
||||||
<td>{{ change.newValue }}</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
{% endblock %}
|
|
@ -166,9 +166,6 @@
|
|||||||
{% if package.checkPerm(current_user, "EDIT_PACKAGE") %}
|
{% if package.checkPerm(current_user, "EDIT_PACKAGE") %}
|
||||||
<a class="btn btn-primary btn-sm ml-1" href="{{ package.getEditURL() }}"><i class="fas fa-edit"></i></a>
|
<a class="btn btn-primary btn-sm ml-1" href="{{ package.getEditURL() }}"><i class="fas fa-edit"></i></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{# {% if current_user.is_authenticated %}
|
|
||||||
<a class="btn btn-primary btn-sm ml-1" href="{{ package.getCreateEditRequestURL() }}">Suggest Changes</a>
|
|
||||||
{% endif %} #}
|
|
||||||
{% if package.checkPerm(current_user, "DELETE_PACKAGE") or package.checkPerm(current_user, "UNAPPROVE_PACKAGE") %}
|
{% if package.checkPerm(current_user, "DELETE_PACKAGE") or package.checkPerm(current_user, "UNAPPROVE_PACKAGE") %}
|
||||||
<a class="btn btn-danger btn-sm ml-1" href="{{ package.getRemoveURL() }}"><i class="fas fa-trash"></i></a>
|
<a class="btn btn-danger btn-sm ml-1" href="{{ package.getRemoveURL() }}"><i class="fas fa-trash"></i></a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -433,24 +430,6 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{{ render_reviews(package.reviews, current_user) }}
|
{{ render_reviews(package.reviews, current_user) }}
|
||||||
|
|
||||||
{#
|
|
||||||
{% if current_user.is_authenticated or requests %}
|
|
||||||
<h3>Edit Requests</h3>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
{% for r in requests %}
|
|
||||||
<li>
|
|
||||||
<a href="{{ r.getURL() }}">{{ r.title }}</a>
|
|
||||||
by
|
|
||||||
<a href="{{ url_for('users.profile', username=r.author.username) }}">{{ r.author.display_name }}</a>
|
|
||||||
</li>
|
|
||||||
{% else %}
|
|
||||||
<li>No edit requests have been made.</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% endif %}
|
|
||||||
#}
|
|
||||||
|
|
||||||
{% if alternatives %}
|
{% if alternatives %}
|
||||||
<h3>Related</h3>
|
<h3>Related</h3>
|
||||||
|
|
||||||
|
49
migrations/versions/c1ea65e2b492_.py
Normal file
49
migrations/versions/c1ea65e2b492_.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: c1ea65e2b492
|
||||||
|
Revises: e1bf78a597a2
|
||||||
|
Create Date: 2020-12-09 18:34:13.345064
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
from sqlalchemy.dialects import postgresql
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'c1ea65e2b492'
|
||||||
|
down_revision = 'e1bf78a597a2'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table('edit_request_change')
|
||||||
|
op.drop_table('edit_request')
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.create_table('edit_request',
|
||||||
|
sa.Column('id', sa.INTEGER(), server_default=sa.text("nextval('edit_request_id_seq'::regclass)"), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('package_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('author_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('title', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
|
||||||
|
sa.Column('desc', sa.VARCHAR(length=1000), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('status', sa.INTEGER(), autoincrement=False, nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['author_id'], ['user.id'], name='edit_request_author_id_fkey'),
|
||||||
|
sa.ForeignKeyConstraint(['package_id'], ['package.id'], name='edit_request_package_id_fkey'),
|
||||||
|
sa.PrimaryKeyConstraint('id', name='edit_request_pkey'),
|
||||||
|
postgresql_ignore_search_path=False
|
||||||
|
)
|
||||||
|
op.create_table('edit_request_change',
|
||||||
|
sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
|
||||||
|
sa.Column('request_id', sa.INTEGER(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('key', postgresql.ENUM('name', 'title', 'shortDesc', 'desc', 'type', 'license', 'tags', 'repo', 'website', 'issueTracker', 'forums', 'harddeps', 'softdeps', name='packagepropertykey'), autoincrement=False, nullable=False),
|
||||||
|
sa.Column('oldValue', sa.TEXT(), autoincrement=False, nullable=True),
|
||||||
|
sa.Column('newValue', sa.TEXT(), autoincrement=False, nullable=True),
|
||||||
|
sa.ForeignKeyConstraint(['request_id'], ['edit_request.id'], name='edit_request_change_request_id_fkey'),
|
||||||
|
sa.PrimaryKeyConstraint('id', name='edit_request_change_pkey')
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
Loading…
Reference in New Issue
Block a user