aboutsummaryrefslogtreecommitdiff
path: root/app/views
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2018-05-27 22:55:46 +0100
committerGitHub <noreply@github.com>2018-05-27 22:55:46 +0100
commitd046de8057d42d4653af6d7c6c7ff557319d1bae (patch)
tree0361d8515fa3b3d16b0222a27048158262d76376 /app/views
parente85298d890a3fdaa3ac1919092aa495cf480a61f (diff)
parent05e536b1217633fd612b8ee94360e8afef3c527c (diff)
downloadcheatdb-d046de8057d42d4653af6d7c6c7ff557319d1bae.tar.xz
Merge pull request #78 from minetest/dev
Add meta packages, remove current dependencies
Diffstat (limited to 'app/views')
-rw-r--r--app/views/__init__.py6
-rw-r--r--app/views/admin.py5
-rw-r--r--app/views/meta.py34
-rw-r--r--app/views/packages/__init__.py44
4 files changed, 82 insertions, 7 deletions
diff --git a/app/views/__init__.py b/app/views/__init__.py
index c584bb8..2559969 100644
--- a/app/views/__init__.py
+++ b/app/views/__init__.py
@@ -28,6 +28,10 @@ from urllib.parse import urlparse
cache = SimpleCache()
@app.template_filter()
+def throw(err):
+ raise Exception(err)
+
+@app.template_filter()
def domain(url):
return urlparse(url).netloc
@@ -43,7 +47,7 @@ def home_page():
packages = query.order_by(db.desc(Package.created_at)).limit(15).all()
return render_template("index.html", packages=packages, count=count)
-from . import users, githublogin, packages, sass, tasks, admin, notifications, tagseditor
+from . import users, githublogin, packages, sass, tasks, admin, notifications, tagseditor, meta
@menu.register_menu(app, ".help", "Help", order=19, endpoint_arguments_constructor=lambda: { 'path': 'help' })
@app.route('/<path:path>/')
diff --git a/app/views/admin.py b/app/views/admin.py
index 2320cc6..b1cfed6 100644
--- a/app/views/admin.py
+++ b/app/views/admin.py
@@ -20,7 +20,7 @@ from flask_user import *
from flask.ext import menu
from app import app
from app.models import *
-from app.tasks.importtasks import importRepoScreenshot
+from app.tasks.importtasks import importRepoScreenshot, importAllDependencies
from app.tasks.forumtasks import importUsersFromModList
from flask_wtf import FlaskForm
from wtforms import *
@@ -52,6 +52,9 @@ def admin_page():
package.soft_deleted = False
db.session.commit()
return redirect(url_for("admin_page"))
+ elif action == "importdepends":
+ task = importAllDependencies.delay()
+ return redirect(url_for("check_task", id=task.id, r=url_for("admin_page")))
else:
flash("Unknown action: " + action, "error")
diff --git a/app/views/meta.py b/app/views/meta.py
new file mode 100644
index 0000000..fe1a05a
--- /dev/null
+++ b/app/views/meta.py
@@ -0,0 +1,34 @@
+# Content DB
+# Copyright (C) 2018 rubenwardy
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+
+from flask import *
+from flask_user import *
+from app import app
+from app.models import *
+
+@app.route("/metapackages/")
+def meta_package_list_page():
+ mpackages = MetaPackage.query.order_by(db.desc(MetaPackage.name)).all()
+ return render_template("meta/list.html", mpackages=mpackages)
+
+@app.route("/metapackages/<name>/")
+def meta_package_page(name):
+ mpackage = MetaPackage.query.filter_by(name=name).first()
+ if mpackage is None:
+ abort(404)
+
+ return render_template("meta/view.html", mpackage=mpackage)
diff --git a/app/views/packages/__init__.py b/app/views/packages/__init__.py
index c60d68d..bd090c7 100644
--- a/app/views/packages/__init__.py
+++ b/app/views/packages/__init__.py
@@ -102,13 +102,14 @@ 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)])
+ shortDesc = StringField("Short Description (Plaintext)", [InputRequired(), Length(1,200)])
+ desc = TextAreaField("Long Description (Markdown)", [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)
+ provides_str = StringField("Provides (mods included in package)", [Optional(), Length(0,1000)])
tags = QuerySelectMultipleField('Tags', query_factory=lambda: Tag.query.order_by(db.asc(Tag.name)), get_pk=lambda a: a.id, get_label=lambda a: a.title)
- harddeps = QuerySelectMultipleField('Dependencies', query_factory=lambda: Package.query.filter_by(soft_deleted=False,approved=True).join(User).order_by(db.asc(Package.title), db.asc(User.display_name)), 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.filter_by(soft_deleted=False,approved=True).join(User).order_by(db.asc(Package.title), db.asc(User.display_name)), get_pk=lambda a: a.id, get_label=lambda a: a.title + " by " + a.author.display_name)
+ harddep_str = StringField("Hard Dependencies", [Optional(), Length(0,1000)])
+ softdep_str = StringField("Soft Dependencies", [Optional(), Length(0,1000)])
repo = StringField("Repo URL", [Optional(), URL()])
website = StringField("Website URL", [Optional(), URL()])
issueTracker = StringField("Issue Tracker URL", [Optional(), URL()])
@@ -146,6 +147,12 @@ def create_edit_package_page(author=None, name=None):
form = PackageForm(formdata=request.form, obj=package)
# Initial form class from post data and default data
+ if request.method == "GET" and package is not None:
+ deps = package.dependencies
+ form.harddep_str.data = ",".join([str(x) for x in deps if not x.optional])
+ form.softdep_str.data = ",".join([str(x) for x in deps if x.optional])
+ form.provides_str.data = MetaPackage.ListToSpec(package.provides)
+
if request.method == "POST" and form.validate():
wasNew = False
if not package:
@@ -166,6 +173,27 @@ def create_edit_package_page(author=None, name=None):
form.populate_obj(package) # copy to row
+ mpackage_cache = {}
+ package.provides.clear()
+ mpackages = MetaPackage.SpecToList(form.provides_str.data, mpackage_cache)
+ for m in mpackages:
+ package.provides.append(m)
+
+ Dependency.query.filter_by(depender=package).delete()
+ deps = Dependency.SpecToList(package, form.harddep_str.data, mpackage_cache)
+ for dep in deps:
+ dep.optional = False
+ db.session.add(dep)
+
+ deps = Dependency.SpecToList(package, form.softdep_str.data, mpackage_cache)
+ for dep in deps:
+ dep.optional = True
+ db.session.add(dep)
+
+ if wasNew and package.type == PackageType.MOD and not package.name in mpackage_cache:
+ m = MetaPackage.GetOrCreate(package.name, mpackage_cache)
+ package.provides.append(m)
+
package.tags.clear()
for tag in form.tags.raw_data:
package.tags.append(Tag.query.get(tag))
@@ -178,9 +206,15 @@ def create_edit_package_page(author=None, name=None):
return redirect(package.getDetailsURL())
+ package_query = Package.query.filter_by(approved=True, soft_deleted=False)
+ if package is not None:
+ package_query = package_query.filter(Package.id != package.id)
+
enableWizard = name is None and request.method != "POST"
return render_template("packages/create_edit.html", package=package, \
- form=form, author=author, enable_wizard=enableWizard)
+ form=form, author=author, enable_wizard=enableWizard, \
+ packages=package_query.all(), \
+ mpackages=MetaPackage.query.order_by(db.asc(MetaPackage.name)).all())
@app.route("/packages/<author>/<name>/approve/", methods=["POST"])
@login_required