diff --git a/app/models.py b/app/models.py
index f3ab06a4..f632b7c0 100644
--- a/app/models.py
+++ b/app/models.py
@@ -218,13 +218,23 @@ class PackagePropertyKey(enum.Enum):
def convert(self, value):
if self == PackagePropertyKey.tags:
- return ','.join([t.title for t in value])
+ return ",".join([t.title for t in value])
else:
return str(value)
-tags = db.Table('tags',
- db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'), primary_key=True),
- db.Column('package_id', db.Integer, db.ForeignKey('package.id'), primary_key=True)
+tags = db.Table("tags",
+ db.Column("tag_id", db.Integer, db.ForeignKey("tag.id"), primary_key=True),
+ db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
+)
+
+harddeps = db.Table("harddeps",
+ db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True),
+ db.Column("dependency_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
+)
+
+softdeps = db.Table("softdeps",
+ db.Column("package_id", db.Integer, db.ForeignKey("package.id"), primary_key=True),
+ db.Column("dependency_id", db.Integer, db.ForeignKey("package.id"), primary_key=True)
)
class Package(db.Model):
@@ -248,9 +258,20 @@ class Package(db.Model):
issueTracker = db.Column(db.String(200), nullable=True)
forums = db.Column(db.Integer, nullable=False)
+ tags = db.relationship("Tag", secondary=tags, lazy="subquery",
+ backref=db.backref("packages", lazy=True))
- tags = db.relationship('Tag', secondary=tags, lazy='subquery',
- backref=db.backref('packages', lazy=True))
+ harddeps = db.relationship("Package",
+ secondary=harddeps,
+ primaryjoin=id==harddeps.c.package_id,
+ secondaryjoin=id==harddeps.c.dependency_id,
+ backref="dependents")
+
+ softdeps = db.relationship("Package",
+ secondary=softdeps,
+ primaryjoin=id==softdeps.c.package_id,
+ secondaryjoin=id==softdeps.c.dependency_id,
+ backref="softdependents")
releases = db.relationship("PackageRelease", backref="package",
lazy="dynamic", order_by=db.desc("package_release_releaseDate"))
@@ -357,7 +378,7 @@ class Tag(db.Model):
self.textColor = textColor
import re
- regex = re.compile('[^a-z_]')
+ regex = re.compile("[^a-z_]")
self.name = regex.sub("", self.title.lower().replace(" ", "_"))
class PackageRelease(db.Model):
diff --git a/app/scss/components.scss b/app/scss/components.scss
index e205b4c4..da7ca636 100644
--- a/app/scss/components.scss
+++ b/app/scss/components.scss
@@ -374,3 +374,7 @@ table.fancyTable tfoot td {
background: #444;
text-decoration: none;
}
+
+.table-topalign td {
+ vertical-align: top;
+}
diff --git a/app/templates/packages/create_edit.html b/app/templates/packages/create_edit.html
index 1bd7ee61..68f43336 100644
--- a/app/templates/packages/create_edit.html
+++ b/app/templates/packages/create_edit.html
@@ -21,6 +21,8 @@
{{ render_field(form.type, class_="pkg_meta") }}
{{ render_field(form.license, class_="pkg_meta") }}
{{ render_field(form.tags, class_="pkg_meta") }}
+ {{ render_field(form.harddeps, class_="pkg_meta") }}
+ {{ render_field(form.softdeps, class_="pkg_meta") }}
Enter the repo URL for the package.
diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html
index 808e1767..d6cb8ca2 100644
--- a/app/templates/packages/view.html
+++ b/app/templates/packages/view.html
@@ -118,6 +118,41 @@
{% endfor %}
+
+
+
+ Dependencies
+
+ {% for p in package.harddeps %}
+ - {{ p.title }} by {{ p.author.display_name }}
+ {% else %}
+ {% if not package.softdeps %}
+ - No dependencies.
+ {% endif %}
+ {% endfor %}
+ {% for p in package.softdeps %}
+ - {{ p.title }} by {{ p.author.display_name }} [optional]
+ {% endfor %}
+
+ |
+
+ Required by
+
+ {% for p in package.dependents %}
+ - {{ p.title }} by {{ p.author.display_name }}
+ {% else %}
+ {% if not package.softdependents %}
+ - No dependents.
+ {% endif %}
+ {% endfor %}
+ {% for p in package.softdependents %}
+ - {{ p.title }} by {{ p.author.display_name }} [optional]
+ {% endfor %}
+
+ |
+
+
+
{% if current_user.is_authenticated or requests %}
Edit Requests
diff --git a/app/views/packages.py b/app/views/packages.py
index 087a83fe..c7af2898 100644
--- a/app/views/packages.py
+++ b/app/views/packages.py
@@ -118,18 +118,20 @@ def package_download_page(package):
class PackageForm(FlaskForm):
- name = StringField("Name", [InputRequired(), Length(1, 20), Regexp("^[a-z0-9_]", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")])
- title = StringField("Title", [InputRequired(), Length(3, 50)])
- shortDesc = StringField("Short Description", [InputRequired(), Length(1,200)])
- desc = TextAreaField("Long Description", [Optional(), Length(0,10000)])
- type = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
- license = QuerySelectField("License", [InputRequired()], query_factory=lambda: License.query, get_pk=lambda a: a.id, get_label=lambda a: a.name)
- tags = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query, get_pk=lambda a: a.id, get_label=lambda a: a.title)
- repo = StringField("Repo URL", [Optional(), URL()])
- website = StringField("Website URL", [Optional(), URL()])
- issueTracker = StringField("Issue Tracker URL", [Optional(), URL()])
- forums = IntegerField("Forum Topic ID", [InputRequired(), NumberRange(0,999999)])
- submit = SubmitField("Save")
+ name = StringField("Name", [InputRequired(), Length(1, 20), Regexp("^[a-z0-9_]", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")])
+ title = StringField("Title", [InputRequired(), Length(3, 50)])
+ shortDesc = StringField("Short Description", [InputRequired(), Length(1,200)])
+ desc = TextAreaField("Long Description", [Optional(), Length(0,10000)])
+ type = SelectField("Type", [InputRequired()], choices=PackageType.choices(), coerce=PackageType.coerce, default=PackageType.MOD)
+ license = QuerySelectField("License", [InputRequired()], query_factory=lambda: License.query, get_pk=lambda a: a.id, get_label=lambda a: a.name)
+ tags = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query, get_pk=lambda a: a.id, get_label=lambda a: a.title)
+ harddeps = QuerySelectMultipleField('Dependencies', query_factory=lambda: Package.query, get_pk=lambda a: a.id, get_label=lambda a: a.title + " by " + a.author.display_name)
+ softdeps = QuerySelectMultipleField('Soft Dependencies', query_factory=lambda: Package.query, get_pk=lambda a: a.id, get_label=lambda a: a.title + " by " + a.author.display_name)
+ repo = StringField("Repo URL", [Optional(), URL()])
+ website = StringField("Website URL", [Optional(), URL()])
+ issueTracker = StringField("Issue Tracker URL", [Optional(), URL()])
+ forums = IntegerField("Forum Topic ID", [InputRequired(), NumberRange(0,999999)])
+ submit = SubmitField("Save")
@app.route("/packages/new/", methods=["GET", "POST"])
@app.route("/packages/
//edit/", methods=["GET", "POST"])
diff --git a/setup.py b/setup.py
index 7c40aa30..149ab069 100644
--- a/setup.py
+++ b/setup.py
@@ -52,11 +52,6 @@ if not os.path.isfile("db.sqlite"):
jeija.github_username = "Jeija"
db.session.add(jeija)
- sam = User("fillthisinlater")
- sam.github_username = "fillthisinlater"
- sam.rank = UserRank.EDITOR
- db.session.add(sam)
-
tags = {}
for tag in ["Inventory", "Mapgen", "Building", \
"Mobs and NPCs", "Tools", "Player effects", \
@@ -235,7 +230,7 @@ No warranty is provided, express or implied, for any part of the project.
mod = Package()
mod.approved = True
mod.name = "handholds"
- mod.title = "Mountain Climbing"
+ mod.title = "Handholds"
mod.license = licenses["MIT"]
mod.type = PackageType.MOD
mod.author = ez
@@ -283,6 +278,7 @@ No warranty is provided, express or implied, for any part of the project.
mod.forums = 2960
mod.shortDesc = "Adds lots of food and an API to manage ingredients"
mod.desc = "This is the long desc"
+ food = mod
db.session.add(mod)
mod = Package()
@@ -291,6 +287,7 @@ No warranty is provided, express or implied, for any part of the project.
mod.title = "Sweet Foods"
mod.license = licenses["CC0"]
mod.type = PackageType.MOD
+ mod.harddeps.append(food)
mod.author = ruben
mod.tags.append(tags["player_effects"])
mod.repo = "https://github.com/rubenwardy/food_sweet/"