diff options
| author | rubenwardy <rw@rubenwardy.com> | 2018-05-21 22:20:28 +0100 |
|---|---|---|
| committer | rubenwardy <rw@rubenwardy.com> | 2018-05-21 22:20:28 +0100 |
| commit | acad90c3123a3a879c8d5cda040a4702114d19b0 (patch) | |
| tree | d60b4044f99a0e3060a83c98cbf578ab1e03141a /app | |
| parent | 47432ea7e4e7abda7021e3e125d6347fbe6534e0 (diff) | |
| download | cheatdb-acad90c3123a3a879c8d5cda040a4702114d19b0.tar.xz | |
Add dependency support
Diffstat (limited to 'app')
| -rw-r--r-- | app/models.py | 35 | ||||
| -rw-r--r-- | app/scss/components.scss | 4 | ||||
| -rw-r--r-- | app/templates/packages/create_edit.html | 2 | ||||
| -rw-r--r-- | app/templates/packages/view.html | 35 | ||||
| -rw-r--r-- | app/views/packages.py | 26 |
5 files changed, 83 insertions, 19 deletions
diff --git a/app/models.py b/app/models.py index f3ab06a..f632b7c 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)) + + harddeps = db.relationship("Package", + secondary=harddeps, + primaryjoin=id==harddeps.c.package_id, + secondaryjoin=id==harddeps.c.dependency_id, + backref="dependents") - tags = db.relationship('Tag', secondary=tags, lazy='subquery', - backref=db.backref('packages', lazy=True)) + 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 e205b4c..da7ca63 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 1bd7ee6..68f4333 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") }} <div class="pkg_wiz_1"> <p>Enter the repo URL for the package. diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html index 808e176..d6cb8ca 100644 --- a/app/templates/packages/view.html +++ b/app/templates/packages/view.html @@ -118,6 +118,41 @@ {% endfor %} </ul> + <table class="table-topalign"> + <tr> + <td> + <h3>Dependencies</h3> + <ul> + {% for p in package.harddeps %} + <li><a href="{{ p.getDetailsURL() }}">{{ p.title }}</a> by {{ p.author.display_name }}</li> + {% else %} + {% if not package.softdeps %} + <li>No dependencies.</li> + {% endif %} + {% endfor %} + {% for p in package.softdeps %} + <li><a href="{{ p.getDetailsURL() }}">{{ p.title }}</a> by {{ p.author.display_name }} [optional]</li> + {% endfor %} + </ul> + </td> + <td> + <h3>Required by</h3> + <ul> + {% for p in package.dependents %} + <li><a href="{{ p.getDetailsURL() }}">{{ p.title }}</a> by {{ p.author.display_name }}</li> + {% else %} + {% if not package.softdependents %} + <li>No dependents.</li> + {% endif %} + {% endfor %} + {% for p in package.softdependents %} + <li><a href="{{ p.getDetailsURL() }}">{{ p.title }}</a> by {{ p.author.display_name }} [optional]</li> + {% endfor %} + </ul> + </td> + </tr> + </table> + {% if current_user.is_authenticated or requests %} <h3>Edit Requests</h3> diff --git a/app/views/packages.py b/app/views/packages.py index 087a83f..c7af289 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/<author>/<name>/edit/", methods=["GET", "POST"]) |
