diff --git a/app/blueprints/admin/actions.py b/app/blueprints/admin/actions.py index 2a14737..68762b9 100644 --- a/app/blueprints/admin/actions.py +++ b/app/blueprints/admin/actions.py @@ -93,7 +93,7 @@ def reimport_packages(): @action("Import forum topic list") def import_topic_list(): task = importTopicList.delay() - return redirect(url_for("tasks.check", id=task.id, r=url_for("todo.topics"))) + return redirect(url_for("tasks.check", id=task.id, r=url_for("admin.admin_page"))) @action("Import appstream from flathub") def import_from_flathub(): diff --git a/app/blueprints/admin/versioneditor.py b/app/blueprints/admin/versioneditor.py index b3063b4..cafe304 100644 --- a/app/blueprints/admin/versioneditor.py +++ b/app/blueprints/admin/versioneditor.py @@ -22,42 +22,42 @@ from wtforms.validators import InputRequired, Length from app.utils import rank_required from . import bp -from ...models import UserRank, MinetestRelease, db +from ...models import UserRank, db -@bp.route("/versions/") -@rank_required(UserRank.MODERATOR) -def version_list(): - return render_template("admin/versions/list.html", versions=MinetestRelease.query.order_by(db.asc(MinetestRelease.id)).all()) +# @bp.route("/versions/") +# @rank_required(UserRank.MODERATOR) +# def version_list(): +# return render_template("admin/versions/list.html", versions=MinetestRelease.query.order_by(db.asc(MinetestRelease.id)).all()) -class VersionForm(FlaskForm): - name = StringField("Name", [InputRequired(), Length(3, 100)]) - protocol = IntegerField("Protocol") - submit = SubmitField("Save") +# class VersionForm(FlaskForm): +# name = StringField("Name", [InputRequired(), Length(3, 100)]) +# protocol = IntegerField("Protocol") +# submit = SubmitField("Save") -@bp.route("/versions/new/", methods=["GET", "POST"]) -@bp.route("/versions//edit/", methods=["GET", "POST"]) -@rank_required(UserRank.MODERATOR) -def create_edit_version(name=None): - version = None - if name is not None: - version = MinetestRelease.query.filter_by(name=name).first() - if version is None: - abort(404) +# @bp.route("/versions/new/", methods=["GET", "POST"]) +# @bp.route("/versions//edit/", methods=["GET", "POST"]) +# @rank_required(UserRank.MODERATOR) +# def create_edit_version(name=None): +# version = None +# if name is not None: +# version = MinetestRelease.query.filter_by(name=name).first() +# if version is None: +# abort(404) - form = VersionForm(formdata=request.form, obj=version) - if form.validate_on_submit(): - if version is None: - version = MinetestRelease(form.name.data) - db.session.add(version) - flash("Created version " + form.name.data, "success") - else: - flash("Updated version " + form.name.data, "success") +# form = VersionForm(formdata=request.form, obj=version) +# if form.validate_on_submit(): +# if version is None: +# version = MinetestRelease(form.name.data) +# db.session.add(version) +# flash("Created version " + form.name.data, "success") +# else: +# flash("Updated version " + form.name.data, "success") - form.populate_obj(version) - db.session.commit() - return redirect(url_for("admin.version_list")) +# form.populate_obj(version) +# db.session.commit() +# return redirect(url_for("admin.version_list")) - return render_template("admin/versions/edit.html", version=version, form=form) +# return render_template("admin/versions/edit.html", version=version, form=form) diff --git a/app/blueprints/api/endpoints.py b/app/blueprints/api/endpoints.py index 2aaabf5..428b3b3 100644 --- a/app/blueprints/api/endpoints.py +++ b/app/blueprints/api/endpoints.py @@ -26,7 +26,7 @@ from sqlalchemy.sql.expression import func from app import csrf from app.markdown import render_markdown from app.models import Tag, PackageState, PackageType, Package, db, PackageRelease, Permission, ForumTopic, \ - MinetestRelease, APIToken, PackageScreenshot, License, ContentWarning, User, PackageReview, Thread + APIToken, PackageScreenshot, License, ContentWarning, User, PackageReview, Thread from app.querybuilder import QueryBuilder from app.utils import is_package_page, get_int_or_abort, url_set_query, abs_url, isYes from . import bp @@ -521,20 +521,20 @@ def welcome_v1(): }) -@bp.route("/api/minetest_versions/") -@cors_allowed -def versions(): - protocol_version = request.args.get("protocol_version") - engine_version = request.args.get("engine_version") - if protocol_version or engine_version: - rel = MinetestRelease.get(engine_version, get_int_or_abort(protocol_version)) - if rel is None: - error(404, "No releases found") +# @bp.route("/api/minetest_versions/") +# @cors_allowed +# def versions(): +# protocol_version = request.args.get("protocol_version") +# engine_version = request.args.get("engine_version") +# if protocol_version or engine_version: +# rel = MinetestRelease.get(engine_version, get_int_or_abort(protocol_version)) +# if rel is None: +# error(404, "No releases found") - return jsonify(rel.getAsDictionary()) +# return jsonify(rel.getAsDictionary()) - return jsonify([rel.getAsDictionary() \ - for rel in MinetestRelease.query.all() if rel.getActual() is not None]) +# return jsonify([rel.getAsDictionary() \ +# for rel in MinetestRelease.query.all() if rel.getActual() is not None]) @bp.route("/api/dependencies/") diff --git a/app/blueprints/api/support.py b/app/blueprints/api/support.py index 32a86fb..b1053e0 100644 --- a/app/blueprints/api/support.py +++ b/app/blueprints/api/support.py @@ -20,7 +20,7 @@ from flask import jsonify, abort, make_response, url_for, current_app from app.logic.packages import do_edit_package from app.logic.releases import LogicError, do_create_vcs_release, do_create_zip_release from app.logic.screenshots import do_create_screenshot, do_order_screenshots, do_set_cover_image -from app.models import APIToken, Package, MinetestRelease, PackageScreenshot +from app.models import APIToken, Package, PackageScreenshot def error(code: int, msg: str): @@ -38,7 +38,7 @@ def guard(f): def api_create_vcs_release(token: APIToken, package: Package, title: str, ref: str, - min_v: MinetestRelease = None, max_v: MinetestRelease = None, reason="API"): + min_v = None, max_v = None, reason="API"): if not token.canOperateOnPackage(package): error(403, "API token does not have access to the package") @@ -54,7 +54,7 @@ def api_create_vcs_release(token: APIToken, package: Package, title: str, ref: s def api_create_zip_release(token: APIToken, package: Package, title: str, file, - min_v: MinetestRelease = None, max_v: MinetestRelease = None, reason="API", commit_hash:str=None): + min_v = None, max_v = None, reason="API", commit_hash:str=None): if not token.canOperateOnPackage(package): error(403, "API token does not have access to the package") diff --git a/app/blueprints/packages/releases.py b/app/blueprints/packages/releases.py index f17ad20..7732a86 100644 --- a/app/blueprints/packages/releases.py +++ b/app/blueprints/packages/releases.py @@ -38,14 +38,14 @@ def list_releases(package): tabs=get_package_tabs(current_user, package), current_tab="releases") -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") +# 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 +# return query class CreatePackageReleaseForm(FlaskForm): @@ -167,15 +167,15 @@ def edit_release(package, id): -class BulkReleaseForm(FlaskForm): - set_min = BooleanField(lazy_gettext("Set Min")) - min_rel = QuerySelectField(lazy_gettext("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(lazy_gettext("Set Max")) - max_rel = QuerySelectField(lazy_gettext("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(lazy_gettext("Only change values previously set as none")) - submit = SubmitField(lazy_gettext("Update")) +# class BulkReleaseForm(FlaskForm): +# set_min = BooleanField(lazy_gettext("Set Min")) +# min_rel = QuerySelectField(lazy_gettext("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(lazy_gettext("Set Max")) +# max_rel = QuerySelectField(lazy_gettext("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(lazy_gettext("Only change values previously set as none")) +# submit = SubmitField(lazy_gettext("Update")) @bp.route("/packages///releases/bulk_change/", methods=["GET", "POST"]) diff --git a/app/default_data.py b/app/default_data.py index 897e126..9d5cd80 100644 --- a/app/default_data.py +++ b/app/default_data.py @@ -32,6 +32,20 @@ def populate(session): appstream_user.rank = UserRank.BOT session.add(appstream_user) + featured = Tag("featured") + featured.is_protected = True + + # These tags replace "package types" + game_tag = Tag("Game") + game_tag.is_toplevel = True + tool_tag = Tag("Tool") + tool_tag.is_toplevel = True + mod_tag = Tag("Mod") + mod_tag.is_toplevel = True + session.add(featured) + session.add(game_tag) + session.add(tool_tag) + session.add(mod_tag) tags = {} for tag in [ @@ -52,7 +66,7 @@ def populate(session): row = Tag(tag) tags[row.name] = row session.add(row) - + tags["featured"] = featured licenses = {} for license in ["GPLv2.1", "GPLv3", "LGPLv2.1", "LGPLv3", "AGPLv2.1", "AGPLv3", "Apache", "BSD 3-Clause", "BSD 2-Clause", "CC0", "CC-BY-SA", @@ -71,9 +85,9 @@ def populate_test_data(session): licenses = { x.name : x for x in License.query.all() } tags = { x.name : x for x in Tag.query.all() } admin_user = User.query.filter_by(rank=UserRank.ADMIN).first() - v4 = MinetestRelease.query.filter_by(protocol=32).first() - v50 = MinetestRelease.query.filter_by(protocol=37).first() - v51 = MinetestRelease.query.filter_by(protocol=38).first() + # v4 = MinetestRelease.query.filter_by(protocol=32).first() + # v50 = MinetestRelease.query.filter_by(protocol=37).first() + # v51 = MinetestRelease.query.filter_by(protocol=38).first() ez = User("Shara") ez.github_username = "Ezhh" diff --git a/app/logic/releases.py b/app/logic/releases.py index f477b22..492b6c0 100644 --- a/app/logic/releases.py +++ b/app/logic/releases.py @@ -22,7 +22,7 @@ from flask_babel import lazy_gettext from app.logic.LogicError import LogicError from app.logic.uploads import upload_file -from app.models import PackageRelease, db, Permission, User, Package, MinetestRelease +from app.models import PackageRelease, db, Permission, User, Package from app.tasks.importtasks import makeVCSRelease, checkZipRelease from app.utils import AuditSeverity, addAuditLog, nonEmptyOrNone @@ -38,7 +38,7 @@ def check_can_create_release(user: User, package: Package): def do_create_vcs_release(user: User, package: Package, title: str, ref: str, - min_v: MinetestRelease = None, max_v: MinetestRelease = None, reason: str = None): + min_v = None, max_v = None, reason: str = None): check_can_create_release(user, package) rel = PackageRelease() @@ -46,8 +46,6 @@ def do_create_vcs_release(user: User, package: Package, title: str, ref: str, rel.title = title rel.url = "" rel.task_id = uuid() - rel.min_rel = min_v - rel.max_rel = max_v db.session.add(rel) if reason is None: @@ -64,7 +62,7 @@ def do_create_vcs_release(user: User, package: Package, title: str, ref: str, def do_create_zip_release(user: User, package: Package, title: str, file, - min_v: MinetestRelease = None, max_v: MinetestRelease = None, reason: str = None, + min_v = None, max_v = None, reason: str = None, commit_hash: str = None): check_can_create_release(user, package) @@ -81,8 +79,7 @@ def do_create_zip_release(user: User, package: Package, title: str, file, rel.url = uploaded_url rel.task_id = uuid() rel.commit_hash = commit_hash - rel.min_rel = min_v - rel.max_rel = max_v + db.session.add(rel) if reason is None: diff --git a/app/models/packages.py b/app/models/packages.py index 326a8cf..85a8308 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -23,7 +23,7 @@ from flask_babel import lazy_gettext from flask_sqlalchemy import BaseQuery from sqlalchemy_searchable import SearchQueryMixin from sqlalchemy_utils.types import TSVectorType - +from app.markdown import render_markdown from . import db from .users import Permission, UserRank, User from .. import app @@ -376,6 +376,8 @@ class Package(db.Model): title = db.Column(db.Unicode(100), nullable=False) short_desc = db.Column(db.Unicode(200), nullable=False) desc = db.Column(db.UnicodeText, nullable=True) + build_desc = db.Column(db.UnicodeText, nullable=True) + install_desc = db.Column(db.UnicodeText, nullable=True) type = db.Column(db.Enum(PackageType), nullable=False) created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow) approved_at = db.Column(db.DateTime, nullable=True, default=None) @@ -636,9 +638,7 @@ class Package(db.Model): def getDownloadRelease(self, version=None): for rel in self.releases: - if rel.approved and (version is None or - ((rel.min_rel is None or rel.min_rel_id <= version.id) and - (rel.max_rel is None or rel.max_rel_id >= version.id))): + if rel.approved: return rel return None @@ -765,7 +765,6 @@ class Package(db.Model): review_scores = [ 100 * r.asSign() for r in self.reviews ] self.score = self.score_downloads + sum(review_scores) - class MetaPackage(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), unique=True, nullable=False) @@ -848,6 +847,7 @@ class Tag(db.Model): textColor = db.Column(db.String(6), nullable=False) views = db.Column(db.Integer, nullable=False, default=0) is_protected = db.Column(db.Boolean, nullable=False, default=False) + is_toplevel = db.Column(db.Boolean, nullable=False, default=False) packages = db.relationship("Package", back_populates="tags", secondary=Tags) @@ -867,50 +867,51 @@ class Tag(db.Model): "title": self.title, "description": description, "is_protected": self.is_protected, + "is_toplevel": self.is_toplevel, "views": self.views, } -class MinetestRelease(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100), unique=True, nullable=False) - protocol = db.Column(db.Integer, nullable=False, default=0) +# class MinetestRelease(db.Model): +# id = db.Column(db.Integer, primary_key=True) +# name = db.Column(db.String(100), unique=True, nullable=False) +# protocol = db.Column(db.Integer, nullable=False, default=0) - def __init__(self, name=None, protocol=0): - self.name = name - self.protocol = protocol +# def __init__(self, name=None, protocol=0): +# self.name = name +# self.protocol = protocol - def getActual(self): - return None if self.name == "None" else self +# def getActual(self): +# return None if self.name == "None" else self - def getAsDictionary(self): - return { - "name": self.name, - "protocol_version": self.protocol, - "is_dev": "-dev" in self.name, - } +# def getAsDictionary(self): +# return { +# "name": self.name, +# "protocol_version": self.protocol, +# "is_dev": "-dev" in self.name, +# } - @classmethod - def get(cls, version, protocol_num): - if version: - parts = version.strip().split(".") - if len(parts) >= 2: - major_minor = parts[0] + "." + parts[1] - query = MinetestRelease.query.filter(MinetestRelease.name.like("{}%".format(major_minor))) - if protocol_num: - query = query.filter_by(protocol=protocol_num) +# @classmethod +# def get(cls, version, protocol_num): +# if version: +# parts = version.strip().split(".") +# if len(parts) >= 2: +# major_minor = parts[0] + "." + parts[1] +# query = MinetestRelease.query.filter(MinetestRelease.name.like("{}%".format(major_minor))) +# if protocol_num: +# query = query.filter_by(protocol=protocol_num) - release = query.one_or_none() - if release: - return release +# release = query.one_or_none() +# if release: +# return release - if protocol_num: - # Find the closest matching release - return MinetestRelease.query.order_by(db.desc(MinetestRelease.protocol), - db.desc(MinetestRelease.id)) \ - .filter(MinetestRelease.protocol <= protocol_num).first() +# if protocol_num: +# # Find the closest matching release +# return MinetestRelease.query.order_by(db.desc(MinetestRelease.protocol), +# db.desc(MinetestRelease.id)) \ +# .filter(MinetestRelease.protocol <= protocol_num).first() - return None +# return None class PackageRelease(db.Model): @@ -927,11 +928,12 @@ class PackageRelease(db.Model): commit_hash = db.Column(db.String(41), nullable=True, default=None) downloads = db.Column(db.Integer, nullable=False, default=0) - min_rel_id = db.Column(db.Integer, db.ForeignKey("minetest_release.id"), nullable=True, server_default=None) - min_rel = db.relationship("MinetestRelease", foreign_keys=[min_rel_id]) + channel = db.Column(db.String(200), nullable=False, default="") + # min_rel_id = db.Column(db.Integer, db.ForeignKey("minetest_release.id"), nullable=True, server_default=None) + # min_rel = db.relationship("MinetestRelease", foreign_keys=[min_rel_id]) - max_rel_id = db.Column(db.Integer, db.ForeignKey("minetest_release.id"), nullable=True, server_default=None) - max_rel = db.relationship("MinetestRelease", foreign_keys=[max_rel_id]) + # max_rel_id = db.Column(db.Integer, db.ForeignKey("minetest_release.id"), nullable=True, server_default=None) + # max_rel = db.relationship("MinetestRelease", foreign_keys=[max_rel_id]) # If the release is approved, then the task_id must be null and the url must be present CK_approval_valid = db.CheckConstraint("not approved OR (task_id IS NULL AND (url = '') IS NOT FALSE)") @@ -948,8 +950,9 @@ class PackageRelease(db.Model): "release_date": self.releaseDate.isoformat(), "commit": self.commit_hash, "downloads": self.downloads, - "min_minetest_version": self.min_rel and self.min_rel.getAsDictionary(), - "max_minetest_version": self.max_rel and self.max_rel.getAsDictionary(), + "channel": self.channel, + # "min_minetest_version": self.min_rel and self.min_rel.getAsDictionary(), + # "max_minetest_version": self.max_rel and self.max_rel.getAsDictionary(), } def getLongAsDictionary(self): @@ -960,8 +963,9 @@ class PackageRelease(db.Model): "release_date": self.releaseDate.isoformat(), "commit": self.commit_hash, "downloads": self.downloads, - "min_minetest_version": self.min_rel and self.min_rel.getAsDictionary(), - "max_minetest_version": self.max_rel and self.max_rel.getAsDictionary(), + # "min_minetest_version": self.min_rel and self.min_rel.getAsDictionary(), + # "max_minetest_version": self.max_rel and self.max_rel.getAsDictionary(), + "channel": self.channel, "package": self.package.getAsDictionaryKey() } diff --git a/app/querybuilder.py b/app/querybuilder.py index baae977..1022aca 100644 --- a/app/querybuilder.py +++ b/app/querybuilder.py @@ -3,7 +3,7 @@ from sqlalchemy import or_ from sqlalchemy.orm import subqueryload from sqlalchemy.sql.expression import func -from .models import db, PackageType, Package, ForumTopic, License, MinetestRelease, PackageRelease, User, Tag, \ +from .models import db, PackageType, Package, ForumTopic, License, PackageRelease, User, Tag, \ ContentWarning, PackageState, PackageDevState from .utils import isYes, get_int_or_abort @@ -61,11 +61,11 @@ class QueryBuilder: self.author = args.get("author") protocol_version = get_int_or_abort(args.get("protocol_version")) - minetest_version = args.get("engine_version") - if protocol_version or minetest_version: - self.version = MinetestRelease.get(minetest_version, protocol_version) - else: - self.version = None + # minetest_version = args.get("engine_version") + # if protocol_version or minetest_version: + # self.version = MinetestRelease.get(minetest_version, protocol_version) + # else: + self.version = None self.show_discarded = isYes(args.get("show_discarded")) self.show_added = args.get("show_added") diff --git a/app/tasks/__init__.py b/app/tasks/__init__.py index 98b44d6..f651cfa 100644 --- a/app/tasks/__init__.py +++ b/app/tasks/__init__.py @@ -78,10 +78,10 @@ CELERYBEAT_SCHEDULE = { 'task': 'app.tasks.importtasks.check_for_updates', 'schedule': crontab(minute=10, hour=1), # 0110 }, - 'send_pending_notifications': { - 'task': 'app.tasks.emails.send_pending_notifications', - 'schedule': crontab(minute='*/5'), # every 5 minutes - }, + # 'send_pending_notifications': { + # 'task': 'app.tasks.emails.send_pending_notifications', + # 'schedule': crontab(minute='*/5'), # every 5 minutes + # }, 'send_notification_digests': { 'task': 'app.tasks.emails.send_pending_digests', 'schedule': crontab(minute=0, hour=14), # 1400 diff --git a/app/tasks/appstreamtasks.py b/app/tasks/appstreamtasks.py index f848ead..e8dedc3 100644 --- a/app/tasks/appstreamtasks.py +++ b/app/tasks/appstreamtasks.py @@ -66,7 +66,7 @@ def importFromFlathub(): admin_user.rank = UserRank.ADMIN session.add(admin_user) - + featured = Tag.query.filter_by(name="featured").first() for app in apps: screenshots = getScreenshots(app) urls = get_urls(app) @@ -97,6 +97,11 @@ def importFromFlathub(): print("adding tag: ", row.name) session.add(row) game1.tags.append(tags[category.lower()]) + + # this short list seems like a reasonable set of initial "featured" games + if app.get_id() in alwaysAccept: + game1.tags.append(featured) + game1.license = licenses[license] game1.media_license = licenses["MIT"] game1.author = admin_user @@ -111,6 +116,10 @@ def importFromFlathub(): game1.forums = 12835 game1.short_desc = "" or app.get_comment() game1.desc = app.get_description() + game1.install_desc = "Make sure to follow the [setup guide](https://flatpak.org/setup/) before installing. \n" + game1.install_desc += f"\n```\nflatpak install flathub {app.get_id()}\n```\n" + game1.install_desc += "Run: \n" + game1.install_desc += f"\n```\nflatpak run {app.get_id()}\n```\n" session.add(game1) install_url = f"https://dl.flathub.org/repo/appstream/{app.get_id()}.flatpakref" diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py index 9903655..0b2187a 100644 --- a/app/tasks/importtasks.py +++ b/app/tasks/importtasks.py @@ -113,12 +113,12 @@ def postReleaseCheckUpdate(self, release: PackageRelease, path): resolver = GameSupportResolver() resolver.update(package) - # Update min/max - if tree.meta.get("min_minetest_version"): - release.min_rel = MinetestRelease.get(tree.meta["min_minetest_version"], None) + # # Update min/max + # if tree.meta.get("min_minetest_version"): + # release.min_rel = MinetestRelease.get(tree.meta["min_minetest_version"], None) - if tree.meta.get("max_minetest_version"): - release.max_rel = MinetestRelease.get(tree.meta["max_minetest_version"], None) + # if tree.meta.get("max_minetest_version"): + # release.max_rel = MinetestRelease.get(tree.meta["max_minetest_version"], None) try: with open(os.path.join(tree.baseDir, ".cdb.json"), "r") as f: diff --git a/app/templates/admin/list.html b/app/templates/admin/list.html index 83337c9..bdf4ebb 100644 --- a/app/templates/admin/list.html +++ b/app/templates/admin/list.html @@ -11,7 +11,6 @@ User list Tag Editor License Editor - Version Editor Warning Editor Send bulk email Send bulk notification diff --git a/app/templates/admin/versions/edit.html b/app/templates/admin/versions/edit.html index fb83f33..5cb6467 100644 --- a/app/templates/admin/versions/edit.html +++ b/app/templates/admin/versions/edit.html @@ -1,23 +1,2 @@ {% extends "base.html" %} -{% block title %} - {% if version %} - Edit {{ version.name }} - {% else %} - New Minetest Version - {% endif %} -{% endblock %} - -{% block content %} - New Version - Back to list - - {% from "macros/forms.html" import render_field, render_submit_field %} -
- {{ form.hidden_tag() }} - - {{ render_field(form.name) }} - {{ render_field(form.protocol) }} - {{ render_submit_field(form.submit) }} -
-{% endblock %} diff --git a/app/templates/base.html b/app/templates/base.html index fe8eded..3be58ec 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -24,13 +24,13 @@