aboutsummaryrefslogtreecommitdiff
path: root/app/views/packages
diff options
context:
space:
mode:
authorrubenwardy <rw@rubenwardy.com>2019-11-15 23:51:42 +0000
committerrubenwardy <rw@rubenwardy.com>2019-11-15 23:51:42 +0000
commit64f131ae27a7332245b5a4eb8e1e4879d7d99578 (patch)
treea0b4101ca9c2132a072f1586c0df693583c91cf7 /app/views/packages
parent015abe5a2507ad02273bc89953016c386aae4457 (diff)
downloadcheatdb-64f131ae27a7332245b5a4eb8e1e4879d7d99578.tar.xz
Refactor endpoints to use blueprints instead
Diffstat (limited to 'app/views/packages')
-rw-r--r--app/views/packages/__init__.py18
-rw-r--r--app/views/packages/editrequests.py174
-rw-r--r--app/views/packages/packages.py369
-rw-r--r--app/views/packages/releases.py218
-rw-r--r--app/views/packages/screenshots.py105
5 files changed, 0 insertions, 884 deletions
diff --git a/app/views/packages/__init__.py b/app/views/packages/__init__.py
deleted file mode 100644
index 5df5376..0000000
--- a/app/views/packages/__init__.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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 . import packages, screenshots, releases
diff --git a/app/views/packages/editrequests.py b/app/views/packages/editrequests.py
deleted file mode 100644
index 7b52184..0000000
--- a/app/views/packages/editrequests.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# 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 *
-
-from app.utils import *
-
-from flask_wtf import FlaskForm
-from wtforms import *
-from wtforms.validators import *
-from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
-
-from . import PackageForm
-
-
-class EditRequestForm(PackageForm):
- edit_title = StringField("Edit Title", [InputRequired(), Length(1, 100)])
- edit_desc = TextField("Edit Description", [Optional()])
-
-@app.route("/packages/<author>/<name>/requests/new/", methods=["GET","POST"])
-@app.route("/packages/<author>/<name>/requests/<id>/edit/", methods=["GET","POST"])
-@login_required
-@is_package_page
-def create_edit_editrequest_page(package, id=None):
- edited_package = package
-
- erequest = None
- if id is not None:
- erequest = EditRequest.query.get(id)
- if erequest.package != package:
- abort(404)
-
- if not erequest.checkPerm(current_user, Permission.EDIT_EDITREQUEST):
- abort(403)
-
- if erequest.status != 0:
- flash("Can't edit EditRequest, it has already been merged or rejected", "error")
- return redirect(erequest.getURL())
-
- edited_package = Package(package)
- erequest.applyAll(edited_package)
-
- form = EditRequestForm(request.form, obj=edited_package)
- if request.method == "GET":
- deps = edited_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(edited_package.provides)
-
- if request.method == "POST" and form.validate():
- if erequest is None:
- erequest = EditRequest()
- erequest.package = package
- erequest.author = current_user
-
- erequest.title = form["edit_title"].data
- erequest.desc = form["edit_desc"].data
- db.session.add(erequest)
-
- EditRequestChange.query.filter_by(request=erequest).delete()
-
- wasChangeMade = False
- for e in PackagePropertyKey:
- newValue = form[e.name].data
- oldValue = getattr(package, e.name)
-
- newValueComp = newValue
- oldValueComp = oldValue
- if type(newValue) is str:
- newValue = newValue.replace("\r\n", "\n")
- newValueComp = newValue.strip()
- oldValueComp = "" if oldValue is None else oldValue.strip()
-
- if newValueComp != oldValueComp:
- change = EditRequestChange()
- change.request = erequest
- change.key = e
- change.oldValue = e.convert(oldValue)
- change.newValue = e.convert(newValue)
- db.session.add(change)
- wasChangeMade = True
-
- if wasChangeMade:
- msg = "{}: Edit request #{} {}" \
- .format(package.title, erequest.id, "created" if id is None else "edited")
- triggerNotif(package.author, current_user, msg, erequest.getURL())
- triggerNotif(erequest.author, current_user, msg, erequest.getURL())
- db.session.commit()
- return redirect(erequest.getURL())
- else:
- flash("No changes detected", "warning")
- elif erequest is not None:
- form["edit_title"].data = erequest.title
- form["edit_desc"].data = erequest.desc
-
- return render_template("packages/editrequest_create_edit.html", package=package, form=form)
-
-
-@app.route("/packages/<author>/<name>/requests/<id>/")
-@is_package_page
-def view_editrequest_page(package, id):
- erequest = EditRequest.query.get(id)
- if erequest is None or erequest.package != package:
- abort(404)
-
- clearNotifications(erequest.getURL())
- return render_template("packages/editrequest_view.html", package=package, request=erequest)
-
-
-@app.route("/packages/<author>/<name>/requests/<id>/approve/", methods=["POST"])
-@is_package_page
-def approve_editrequest_page(package, id):
- if not package.checkPerm(current_user, Permission.APPROVE_CHANGES):
- flash("You don't have permission to do that.", "error")
- return redirect(package.getDetailsURL())
-
- erequest = EditRequest.query.get(id)
- if erequest is None or erequest.package != package:
- abort(404)
-
- if erequest.status != 0:
- flash("Edit request has already been resolved", "error")
-
- else:
- erequest.status = 1
- erequest.applyAll(package)
-
- msg = "{}: Edit request #{} merged".format(package.title, erequest.id)
- triggerNotif(erequest.author, current_user, msg, erequest.getURL())
- triggerNotif(package.author, current_user, msg, erequest.getURL())
- db.session.commit()
-
- return redirect(package.getDetailsURL())
-
-@app.route("/packages/<author>/<name>/requests/<id>/reject/", methods=["POST"])
-@is_package_page
-def reject_editrequest_page(package, id):
- if not package.checkPerm(current_user, Permission.APPROVE_CHANGES):
- flash("You don't have permission to do that.", "error")
- return redirect(package.getDetailsURL())
-
- erequest = EditRequest.query.get(id)
- if erequest is None or erequest.package != package:
- abort(404)
-
- if erequest.status != 0:
- flash("Edit request has already been resolved", "error")
-
- else:
- erequest.status = 2
-
- msg = "{}: Edit request #{} rejected".format(package.title, erequest.id)
- triggerNotif(erequest.author, current_user, msg, erequest.getURL())
- triggerNotif(package.author, current_user, msg, erequest.getURL())
- db.session.commit()
-
- return redirect(package.getDetailsURL())
diff --git a/app/views/packages/packages.py b/app/views/packages/packages.py
deleted file mode 100644
index 38aacbe..0000000
--- a/app/views/packages/packages.py
+++ /dev/null
@@ -1,369 +0,0 @@
-# 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 render_template, abort, request, redirect, url_for, flash
-from flask_user import current_user
-import flask_menu as menu
-from app import app
-from app.models import *
-from app.querybuilder import QueryBuilder
-from app.tasks.importtasks import importRepoScreenshot
-from app.utils import *
-from flask_wtf import FlaskForm
-from wtforms import *
-from wtforms.validators import *
-from wtforms.ext.sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
-from sqlalchemy import or_
-
-
-@menu.register_menu(app, ".mods", "Mods", order=11, endpoint_arguments_constructor=lambda: { 'type': 'mod' })
-@menu.register_menu(app, ".games", "Games", order=12, endpoint_arguments_constructor=lambda: { 'type': 'game' })
-@menu.register_menu(app, ".txp", "Texture Packs", order=13, endpoint_arguments_constructor=lambda: { 'type': 'txp' })
-@menu.register_menu(app, ".random", "Random", order=14, endpoint_arguments_constructor=lambda: { 'random': '1' })
-@app.route("/packages/")
-def packages_page():
- qb = QueryBuilder(request.args)
- query = qb.buildPackageQuery()
- title = qb.title
-
- if qb.lucky:
- package = query.first()
- if package:
- return redirect(package.getDetailsURL())
-
- topic = qb.buildTopicQuery().first()
- if qb.search and topic:
- return redirect("https://forum.minetest.net/viewtopic.php?t=" + str(topic.topic_id))
-
- page = int(request.args.get("page") or 1)
- num = min(40, int(request.args.get("n") or 100))
- query = query.paginate(page, num, True)
-
- search = request.args.get("q")
- type_name = request.args.get("type")
-
- next_url = url_for("packages_page", type=type_name, q=search, page=query.next_num) \
- if query.has_next else None
- prev_url = url_for("packages_page", type=type_name, q=search, page=query.prev_num) \
- if query.has_prev else None
-
- topics = None
- if qb.search and not query.has_next:
- topics = qb.buildTopicQuery().all()
-
- tags = Tag.query.all()
- return render_template("packages/list.html", \
- title=title, packages=query.items, topics=topics, \
- query=search, tags=tags, type=type_name, \
- next_url=next_url, prev_url=prev_url, page=page, page_max=query.pages, packages_count=query.total)
-
-
-def getReleases(package):
- if package.checkPerm(current_user, Permission.MAKE_RELEASE):
- return package.releases.limit(5)
- else:
- return package.releases.filter_by(approved=True).limit(5)
-
-
-@app.route("/packages/<author>/<name>/")
-@is_package_page
-def package_page(package):
- clearNotifications(package.getDetailsURL())
-
- alternatives = None
- if package.type == PackageType.MOD:
- alternatives = Package.query \
- .filter_by(name=package.name, type=PackageType.MOD, soft_deleted=False) \
- .filter(Package.id != package.id) \
- .order_by(db.desc(Package.score)) \
- .all()
-
-
- show_similar_topics = current_user == package.author or \
- package.checkPerm(current_user, Permission.APPROVE_NEW)
-
- similar_topics = None if not show_similar_topics else \
- ForumTopic.query \
- .filter_by(name=package.name) \
- .filter(ForumTopic.topic_id != package.forums) \
- .filter(~ db.exists().where(Package.forums==ForumTopic.topic_id)) \
- .order_by(db.asc(ForumTopic.name), db.asc(ForumTopic.title)) \
- .all()
-
- releases = getReleases(package)
- requests = [r for r in package.requests if r.status == 0]
-
- review_thread = package.review_thread
- if review_thread is not None and not review_thread.checkPerm(current_user, Permission.SEE_THREAD):
- review_thread = None
-
- topic_error = None
- topic_error_lvl = "warning"
- if not package.approved and package.forums is not None:
- errors = []
- if Package.query.filter_by(forums=package.forums, soft_deleted=False).count() > 1:
- errors.append("<b>Error: Another package already uses this forum topic!</b>")
- topic_error_lvl = "danger"
-
- topic = ForumTopic.query.get(package.forums)
- if topic is not None:
- if topic.author != package.author:
- errors.append("<b>Error: Forum topic author doesn't match package author.</b>")
- topic_error_lvl = "danger"
-
- if topic.wip:
- errors.append("Warning: Forum topic is in WIP section, make sure package meets playability standards.")
- elif package.type != PackageType.TXP:
- errors.append("Warning: Forum topic not found. This may happen if the topic has only just been created.")
-
- topic_error = "<br />".join(errors)
-
-
- threads = Thread.query.filter_by(package_id=package.id)
- if not current_user.is_authenticated:
- threads = threads.filter_by(private=False)
- elif not current_user.rank.atLeast(UserRank.EDITOR) and not current_user == package.author:
- threads = threads.filter(or_(Thread.private == False, Thread.author == current_user))
-
-
- return render_template("packages/view.html", \
- package=package, releases=releases, requests=requests, \
- alternatives=alternatives, similar_topics=similar_topics, \
- review_thread=review_thread, topic_error=topic_error, topic_error_lvl=topic_error_lvl, \
- threads=threads.all())
-
-
-@app.route("/packages/<author>/<name>/download/")
-@is_package_page
-def package_download_page(package):
- release = package.getDownloadRelease()
-
- if release is None:
- if "application/zip" in request.accept_mimetypes and \
- not "text/html" in request.accept_mimetypes:
- return "", 204
- else:
- flash("No download available.", "error")
- return redirect(package.getDetailsURL())
- else:
- PackageRelease.query.filter_by(id=release.id).update({
- "downloads": PackageRelease.downloads + 1
- })
- db.session.commit()
-
- return redirect(release.url, code=302)
-
-
-class PackageForm(FlaskForm):
- name = StringField("Name (Technical)", [InputRequired(), Length(1, 20), Regexp("^[a-z0-9_]", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")])
- title = StringField("Title (Human-readable)", [InputRequired(), Length(3, 50)])
- short_desc = 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.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- media_license = QuerySelectField("Media License", [InputRequired()], query_factory=lambda: License.query.order_by(db.asc(License.name)), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- provides_str = StringField("Provides (mods included in package)", [Optional()])
- 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)
- harddep_str = StringField("Hard Dependencies", [Optional()])
- softdep_str = StringField("Soft Dependencies", [Optional()])
- repo = StringField("VCS Repository URL", [Optional(), URL()], filters = [lambda x: x or None])
- website = StringField("Website URL", [Optional(), URL()], filters = [lambda x: x or None])
- issueTracker = StringField("Issue Tracker URL", [Optional(), URL()], filters = [lambda x: x or None])
- forums = IntegerField("Forum Topic ID", [Optional(), NumberRange(0,999999)])
- submit = SubmitField("Save")
-
-@app.route("/packages/new/", methods=["GET", "POST"])
-@app.route("/packages/<author>/<name>/edit/", methods=["GET", "POST"])
-@login_required
-def create_edit_package_page(author=None, name=None):
- package = None
- form = None
- if author is None:
- form = PackageForm(formdata=request.form)
- author = request.args.get("author")
- if author is None or author == current_user.username:
- author = current_user
- else:
- author = User.query.filter_by(username=author).first()
- if author is None:
- flash("Unable to find that user", "error")
- return redirect(url_for("create_edit_package_page"))
-
- if not author.checkPerm(current_user, Permission.CHANGE_AUTHOR):
- flash("Permission denied", "error")
- return redirect(url_for("create_edit_package_page"))
-
- else:
- package = getPackageByInfo(author, name)
- if not package.checkPerm(current_user, Permission.EDIT_PACKAGE):
- return redirect(package.getDetailsURL())
-
- author = package.author
-
- form = PackageForm(formdata=request.form, obj=package)
-
- # Initial form class from post data and default data
- if request.method == "GET":
- if package is None:
- form.name.data = request.args.get("bname")
- form.title.data = request.args.get("title")
- form.repo.data = request.args.get("repo")
- form.forums.data = request.args.get("forums")
- else:
- 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:
- package = Package.query.filter_by(name=form["name"].data, author_id=author.id).first()
- if package is not None:
- if package.soft_deleted:
- Package.query.filter_by(name=form["name"].data, author_id=author.id).delete()
- else:
- flash("Package already exists!", "error")
- return redirect(url_for("create_edit_package_page"))
-
- package = Package()
- package.author = author
- wasNew = True
-
- elif package.approved and package.name != form.name.data and \
- not package.checkPerm(current_user, Permission.CHANGE_NAME):
- flash("Unable to change package name", "danger")
- return redirect(url_for("create_edit_package_page", author=author, name=name))
-
- else:
- triggerNotif(package.author, current_user,
- "{} edited".format(package.title), package.getDetailsURL())
-
- form.populate_obj(package) # copy to row
-
- if package.type== PackageType.TXP:
- package.license = package.media_license
-
- 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))
-
- db.session.commit() # save
-
- next_url = package.getDetailsURL()
- if wasNew and package.repo is not None:
- task = importRepoScreenshot.delay(package.id)
- next_url = url_for("check_task", id=task.id, r=next_url)
-
- if wasNew and ("WTFPL" in package.license.name or "WTFPL" in package.media_license.name):
- next_url = url_for("flatpage", path="help/wtfpl", r=next_url)
-
- return redirect(next_url)
-
- 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, \
- packages=package_query.all(), \
- mpackages=MetaPackage.query.order_by(db.asc(MetaPackage.name)).all())
-
-@app.route("/packages/<author>/<name>/approve/", methods=["POST"])
-@login_required
-@is_package_page
-def approve_package_page(package):
- if not package.checkPerm(current_user, Permission.APPROVE_NEW):
- flash("You don't have permission to do that.", "error")
-
- elif package.approved:
- flash("Package has already been approved", "error")
-
- else:
- package.approved = True
-
- screenshots = PackageScreenshot.query.filter_by(package=package, approved=False).all()
- for s in screenshots:
- s.approved = True
-
- triggerNotif(package.author, current_user,
- "{} approved".format(package.title), package.getDetailsURL())
- db.session.commit()
-
- return redirect(package.getDetailsURL())
-
-
-@app.route("/packages/<author>/<name>/remove/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def remove_package_page(package):
- if request.method == "GET":
- return render_template("packages/remove.html", package=package)
-
- if "delete" in request.form:
- if not package.checkPerm(current_user, Permission.DELETE_PACKAGE):
- flash("You don't have permission to do that.", "error")
- return redirect(package.getDetailsURL())
-
- package.soft_deleted = True
-
- url = url_for("user_profile_page", username=package.author.username)
- triggerNotif(package.author, current_user,
- "{} deleted".format(package.title), url)
- db.session.commit()
-
- flash("Deleted package", "success")
-
- return redirect(url)
- elif "unapprove" in request.form:
- if not package.checkPerm(current_user, Permission.UNAPPROVE_PACKAGE):
- flash("You don't have permission to do that.", "error")
- return redirect(package.getDetailsURL())
-
- package.approved = False
-
- triggerNotif(package.author, current_user,
- "{} deleted".format(package.title), package.getDetailsURL())
- db.session.commit()
-
- flash("Unapproved package", "success")
-
- return redirect(package.getDetailsURL())
- else:
- abort(400)
diff --git a/app/views/packages/releases.py b/app/views/packages/releases.py
deleted file mode 100644
index 963f903..0000000
--- a/app/views/packages/releases.py
+++ /dev/null
@@ -1,218 +0,0 @@
-# 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 *
-from app.tasks.importtasks import makeVCSRelease
-
-from app.utils import *
-
-from celery import uuid
-from flask_wtf import FlaskForm
-from wtforms import *
-from wtforms.validators import *
-from wtforms.ext.sqlalchemy.fields import QuerySelectField
-
-
-def get_mt_releases(is_max):
- query = MinetestRelease.query.order_by(db.asc(MinetestRelease.id))
- if is_max:
- query = query.limit(query.count() - 1)
- else:
- query = query.filter(MinetestRelease.name != "0.4.17")
-
- return query
-
-
-class CreatePackageReleaseForm(FlaskForm):
- title = StringField("Title", [InputRequired(), Length(1, 30)])
- uploadOpt = RadioField ("Method", choices=[("upload", "File Upload")], default="upload")
- vcsLabel = StringField("VCS Commit Hash, Branch, or Tag", default="master")
- fileUpload = FileField("File Upload")
- min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- submit = SubmitField("Save")
-
-class EditPackageReleaseForm(FlaskForm):
- title = StringField("Title", [InputRequired(), Length(1, 30)])
- url = StringField("URL", [URL])
- task_id = StringField("Task ID", filters = [lambda x: x or None])
- approved = BooleanField("Is Approved")
- min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- submit = SubmitField("Save")
-
-@app.route("/packages/<author>/<name>/releases/new/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def create_release_page(package):
- if not package.checkPerm(current_user, Permission.MAKE_RELEASE):
- return redirect(package.getDetailsURL())
-
- # Initial form class from post data and default data
- form = CreatePackageReleaseForm()
- if package.repo is not None:
- form["uploadOpt"].choices = [("vcs", "From Git Commit or Branch"), ("upload", "File Upload")]
- if request.method != "POST":
- form["uploadOpt"].data = "vcs"
-
- if request.method == "POST" and form.validate():
- if form["uploadOpt"].data == "vcs":
- rel = PackageRelease()
- rel.package = package
- rel.title = form["title"].data
- rel.url = ""
- rel.task_id = uuid()
- rel.min_rel = form["min_rel"].data.getActual()
- rel.max_rel = form["max_rel"].data.getActual()
- db.session.add(rel)
- db.session.commit()
-
- makeVCSRelease.apply_async((rel.id, form["vcsLabel"].data), task_id=rel.task_id)
-
- msg = "{}: Release {} created".format(package.title, rel.title)
- triggerNotif(package.author, current_user, msg, rel.getEditURL())
- db.session.commit()
-
- return redirect(url_for("check_task", id=rel.task_id, r=rel.getEditURL()))
- else:
- uploadedPath = doFileUpload(form.fileUpload.data, "zip", "a zip file")
- if uploadedPath is not None:
- rel = PackageRelease()
- rel.package = package
- rel.title = form["title"].data
- rel.url = uploadedPath
- rel.min_rel = form["min_rel"].data.getActual()
- rel.max_rel = form["max_rel"].data.getActual()
- rel.approve(current_user)
- db.session.add(rel)
- db.session.commit()
-
- msg = "{}: Release {} created".format(package.title, rel.title)
- triggerNotif(package.author, current_user, msg, rel.getEditURL())
- db.session.commit()
- return redirect(package.getDetailsURL())
-
- return render_template("packages/release_new.html", package=package, form=form)
-
-@app.route("/packages/<author>/<name>/releases/<id>/download/")
-@is_package_page
-def download_release_page(package, id):
- release = PackageRelease.query.get(id)
- if release is None or release.package != package:
- abort(404)
-
- if release is None:
- if "application/zip" in request.accept_mimetypes and \
- not "text/html" in request.accept_mimetypes:
- return "", 204
- else:
- flash("No download available.", "error")
- return redirect(package.getDetailsURL())
- else:
- PackageRelease.query.filter_by(id=release.id).update({
- "downloads": PackageRelease.downloads + 1
- })
- db.session.commit()
-
- return redirect(release.url, code=300)
-
-@app.route("/packages/<author>/<name>/releases/<id>/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def edit_release_page(package, id):
- release = PackageRelease.query.get(id)
- if release is None or release.package != package:
- abort(404)
-
- clearNotifications(release.getEditURL())
-
- canEdit = package.checkPerm(current_user, Permission.MAKE_RELEASE)
- canApprove = package.checkPerm(current_user, Permission.APPROVE_RELEASE)
- if not (canEdit or canApprove):
- return redirect(package.getDetailsURL())
-
- # Initial form class from post data and default data
- form = EditPackageReleaseForm(formdata=request.form, obj=release)
- if request.method == "POST" and form.validate():
- wasApproved = release.approved
- if canEdit:
- release.title = form["title"].data
- release.min_rel = form["min_rel"].data.getActual()
- release.max_rel = form["max_rel"].data.getActual()
-
- if package.checkPerm(current_user, Permission.CHANGE_RELEASE_URL):
- release.url = form["url"].data
- release.task_id = form["task_id"].data
- if release.task_id is not None:
- release.task_id = None
-
- if canApprove:
- release.approved = form["approved"].data
- else:
- release.approved = wasApproved
-
- db.session.commit()
- return redirect(package.getDetailsURL())
-
- return render_template("packages/release_edit.html", package=package, release=release, form=form)
-
-
-
-class BulkReleaseForm(FlaskForm):
- set_min = BooleanField("Set Min")
- min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- set_max = BooleanField("Set Max")
- max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()],
- query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
- only_change_none = BooleanField("Only change values previously set as none")
- submit = SubmitField("Update")
-
-
-@app.route("/packages/<author>/<name>/releases/bulk_change/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def bulk_change_release_page(package):
- if not package.checkPerm(current_user, Permission.MAKE_RELEASE):
- return redirect(package.getDetailsURL())
-
- # Initial form class from post data and default data
- form = BulkReleaseForm()
-
- if request.method == "GET":
- form.only_change_none.data = True
- elif request.method == "POST" and form.validate():
- only_change_none = form.only_change_none.data
-
- for release in package.releases.all():
- if form["set_min"].data and (not only_change_none or release.min_rel is None):
- release.min_rel = form["min_rel"].data.getActual()
- if form["set_max"].data and (not only_change_none or release.max_rel is None):
- release.max_rel = form["max_rel"].data.getActual()
-
- db.session.commit()
-
- return redirect(package.getDetailsURL())
-
- return render_template("packages/release_bulk_change.html", package=package, form=form)
diff --git a/app/views/packages/screenshots.py b/app/views/packages/screenshots.py
deleted file mode 100644
index dbb002b..0000000
--- a/app/views/packages/screenshots.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# 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 *
-
-from app.utils import *
-
-from flask_wtf import FlaskForm
-from wtforms import *
-from wtforms.validators import *
-
-
-class CreateScreenshotForm(FlaskForm):
- title = StringField("Title/Caption", [Optional()])
- fileUpload = FileField("File Upload", [InputRequired()])
- submit = SubmitField("Save")
-
-
-class EditScreenshotForm(FlaskForm):
- title = StringField("Title/Caption", [Optional()])
- approved = BooleanField("Is Approved")
- delete = BooleanField("Delete")
- submit = SubmitField("Save")
-
-@app.route("/packages/<author>/<name>/screenshots/new/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def create_screenshot_page(package, id=None):
- if not package.checkPerm(current_user, Permission.ADD_SCREENSHOTS):
- return redirect(package.getDetailsURL())
-
- # Initial form class from post data and default data
- form = CreateScreenshotForm()
- if request.method == "POST" and form.validate():
- uploadedPath = doFileUpload(form.fileUpload.data, "image",
- "a PNG or JPG image file")
- if uploadedPath is not None:
- ss = PackageScreenshot()
- ss.package = package
- ss.title = form["title"].data or "Untitled"
- ss.url = uploadedPath
- ss.approved = package.checkPerm(current_user, Permission.APPROVE_SCREENSHOT)
- db.session.add(ss)
-
- msg = "{}: Screenshot added {}" \
- .format(package.title, ss.title)
- triggerNotif(package.author, current_user, msg, package.getDetailsURL())
- db.session.commit()
- return redirect(package.getDetailsURL())
-
- return render_template("packages/screenshot_new.html", package=package, form=form)
-
-@app.route("/packages/<author>/<name>/screenshots/<id>/edit/", methods=["GET", "POST"])
-@login_required
-@is_package_page
-def edit_screenshot_page(package, id):
- screenshot = PackageScreenshot.query.get(id)
- if screenshot is None or screenshot.package != package:
- abort(404)
-
- canEdit = package.checkPerm(current_user, Permission.ADD_SCREENSHOTS)
- canApprove = package.checkPerm(current_user, Permission.APPROVE_SCREENSHOT)
- if not (canEdit or canApprove):
- return redirect(package.getDetailsURL())
-
- clearNotifications(screenshot.getEditURL())
-
- # Initial form class from post data and default data
- form = EditScreenshotForm(formdata=request.form, obj=screenshot)
- if request.method == "POST" and form.validate():
- if canEdit and form["delete"].data:
- PackageScreenshot.query.filter_by(id=id).delete()
-
- else:
- wasApproved = screenshot.approved
-
- if canEdit:
- screenshot.title = form["title"].data or "Untitled"
-
- if canApprove:
- screenshot.approved = form["approved"].data
- else:
- screenshot.approved = wasApproved
-
- db.session.commit()
- return redirect(package.getDetailsURL())
-
- return render_template("packages/screenshot_edit.html", package=package, screenshot=screenshot, form=form)