From 1389cf450cafe7d476228303e875305350b0ad6d Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 4 May 2021 03:15:26 +0100 Subject: [PATCH] Unify package edit UI --- app/blueprints/packages/__init__.py | 36 +++++++++++ app/blueprints/packages/packages.py | 12 ++-- app/blueprints/packages/releases.py | 19 ++++-- app/blueprints/packages/screenshots.py | 5 +- app/models/packages.py | 4 ++ app/templates/macros/releases.html | 51 ++++++++++++++++ app/templates/packages/create_edit.html | 26 ++++---- app/templates/packages/edit_maintainers.html | 6 +- app/templates/packages/package_base.html | 40 ++++++++++++ app/templates/packages/release_edit.html | 5 +- app/templates/packages/releases_list.html | 38 ++++++++++++ app/templates/packages/remove.html | 13 ++-- app/templates/packages/screenshots.html | 7 +-- app/templates/packages/view.html | 64 ++------------------ 14 files changed, 223 insertions(+), 103 deletions(-) create mode 100644 app/templates/macros/releases.html create mode 100644 app/templates/packages/package_base.html create mode 100644 app/templates/packages/releases_list.html diff --git a/app/blueprints/packages/__init__.py b/app/blueprints/packages/__init__.py index c279653..9b709c5 100644 --- a/app/blueprints/packages/__init__.py +++ b/app/blueprints/packages/__init__.py @@ -16,6 +16,42 @@ from flask import Blueprint +from app.models import User, Package, Permission + bp = Blueprint("packages", __name__) + +def get_package_tabs(user: User, package: Package): + if package is None or not package.checkPerm(user, Permission.EDIT_PACKAGE): + return [] + + return [ + { + "id": "edit", + "title": "Edit Details", + "url": package.getEditURL() + }, + { + "id": "releases", + "title": "Releases", + "url": package.getReleaseListURL() + }, + { + "id": "screenshots", + "title": "Screenshots", + "url": package.getEditScreenshotsURL() + }, + { + "id": "maintainers", + "title": "Maintainers", + "url": package.getEditMaintainersURL() + }, + { + "id": "remove", + "title": "Remove", + "url": package.getRemoveURL() + } + ] + + from . import packages, screenshots, releases, reviews diff --git a/app/blueprints/packages/packages.py b/app/blueprints/packages/packages.py index 94d2f75..3d282f5 100644 --- a/app/blueprints/packages/packages.py +++ b/app/blueprints/packages/packages.py @@ -32,7 +32,7 @@ from app.querybuilder import QueryBuilder from app.rediscache import has_key, set_key from app.tasks.importtasks import importRepoScreenshot, checkZipRelease from app.utils import * -from . import bp +from . import bp, get_package_tabs from ...logic.LogicError import LogicError from ...logic.packages import do_edit_package @@ -339,7 +339,8 @@ def create_edit(author=None, name=None): 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()) + mpackages=MetaPackage.query.order_by(db.asc(MetaPackage.name)).all(), + tabs=get_package_tabs(current_user, package), current_tab="edit") @bp.route("/packages///state/", methods=["POST"]) @@ -388,7 +389,8 @@ def move_to_state(package): @is_package_page def remove(package): if request.method == "GET": - return render_template("packages/remove.html", package=package) + return render_template("packages/remove.html", package=package, + tabs=get_package_tabs(current_user, package), current_tab="remove") if "delete" in request.form: if not package.checkPerm(current_user, Permission.DELETE_PACKAGE): @@ -478,8 +480,8 @@ def edit_maintainers(package): users = User.query.filter(User.rank >= UserRank.NEW_MEMBER).order_by(db.asc(User.username)).all() - return render_template("packages/edit_maintainers.html", - package=package, form=form, users=users) + return render_template("packages/edit_maintainers.html", package=package, form=form, + users=users, tabs=get_package_tabs(current_user, package), current_tab="maintainers") @bp.route("/packages///remove-self-maintainer/", methods=["POST"]) diff --git a/app/blueprints/packages/releases.py b/app/blueprints/packages/releases.py index fbc1de4..f771c7d 100644 --- a/app/blueprints/packages/releases.py +++ b/app/blueprints/packages/releases.py @@ -26,7 +26,15 @@ from app.logic.releases import do_create_vcs_release, LogicError, do_create_zip_ from app.rediscache import has_key, set_key, make_download_key from app.tasks.importtasks import check_update_config from app.utils import * -from . import bp +from . import bp, get_package_tabs + + +@bp.route("/packages///releases/", methods=["GET", "POST"]) +@is_package_page +def list_releases(package): + return render_template("packages/releases_list.html", + package=package, + tabs=get_package_tabs(current_user, package), current_tab="releases") def get_mt_releases(is_max): @@ -61,6 +69,7 @@ class EditPackageReleaseForm(FlaskForm): query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name) submit = SubmitField("Save") + @bp.route("/packages///releases/new/", methods=["GET", "POST"]) @login_required @is_package_page @@ -162,7 +171,7 @@ def edit_release(package, id): release.approved = False db.session.commit() - return redirect(package.getDetailsURL()) + return redirect(package.getReleaseListURL()) return render_template("packages/release_edit.html", package=package, release=release, form=form) @@ -202,7 +211,7 @@ def bulk_change_release(package): db.session.commit() - return redirect(package.getDetailsURL()) + return redirect(package.getReleaseListURL()) return render_template("packages/release_bulk_change.html", package=package, form=form) @@ -216,7 +225,7 @@ def delete_release(package, id): abort(404) if not release.checkPerm(current_user, Permission.DELETE_RELEASE): - return redirect(release.getEditURL()) + return redirect(release.getReleaseListURL()) db.session.delete(release) db.session.commit() @@ -296,7 +305,7 @@ def update_config(package): flash("Now, please create an initial release", "success") return redirect(package.getCreateReleaseURL()) - return redirect(package.getDetailsURL()) + return redirect(package.getReleaseListURL()) return render_template("packages/update_config.html", package=package, form=form) diff --git a/app/blueprints/packages/screenshots.py b/app/blueprints/packages/screenshots.py index 56999d2..7228617 100644 --- a/app/blueprints/packages/screenshots.py +++ b/app/blueprints/packages/screenshots.py @@ -23,7 +23,7 @@ from wtforms.ext.sqlalchemy.fields import QuerySelectField from wtforms.validators import * from app.utils import * -from . import bp +from . import bp, get_package_tabs from app.logic.LogicError import LogicError from app.logic.screenshots import do_create_screenshot, do_order_screenshots @@ -71,7 +71,8 @@ def screenshots(package): form.populate_obj(package) db.session.commit() - return render_template("packages/screenshots.html", package=package, form=form) + return render_template("packages/screenshots.html", package=package, form=form, + tabs=get_package_tabs(current_user, package), current_tab="screenshots") @bp.route("/packages///screenshots/new/", methods=["GET", "POST"]) diff --git a/app/models/packages.py b/app/models/packages.py index 0a77311..fe439a7 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -482,6 +482,10 @@ class Package(db.Model): return url_for("packages.create_edit", author=self.author.username, name=self.name) + def getReleaseListURL(self): + return url_for("packages.list_releases", + author=self.author.username, name=self.name) + def getSetStateURL(self, state): if type(state) == str: state = PackageState[state] diff --git a/app/templates/macros/releases.html b/app/templates/macros/releases.html new file mode 100644 index 0000000..97a9c21 --- /dev/null +++ b/app/templates/macros/releases.html @@ -0,0 +1,51 @@ +{% macro render_releases(releases, package, current_user) -%} + {% for rel in releases %} + {% if rel.approved or package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE") %} +
  • + {% if package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE") %} + Edit + {% if not rel.task_id and not rel.approved and rel.checkPerm(current_user, "APPROVE_RELEASE") %} + / Approve + {% endif %} + + {% endif %} + + {% if not rel.approved %}{% endif %} + + + {{ rel.title }} + + + + {% if rel.min_rel and rel.max_rel %} + [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}] + {% elif rel.min_rel %} + [MT {{ rel.min_rel.name }}+] + {% elif rel.max_rel %} + [MT ≤{{ rel.max_rel.name }}] + {% endif %} + + +
    + + + {% if rel.commit_hash %} + [{{ rel.commit_hash | truncate(5, end='') }}] + {% endif %} + + created {{ rel.releaseDate | date }}. + + {% if (package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE")) and rel.task_id %} + Importing... + {% elif not rel.approved %} + Waiting for approval. + {% endif %} + + {% if not rel.approved %}
    {% endif %} + +
  • + {% endif %} + {% else %} +
  • No releases available.
  • + {% endfor %} +{% endmacro %} diff --git a/app/templates/packages/create_edit.html b/app/templates/packages/create_edit.html index 1dc5704..c9797cf 100644 --- a/app/templates/packages/create_edit.html +++ b/app/templates/packages/create_edit.html @@ -1,9 +1,13 @@ -{% extends "base.html" %} +{% extends "packages/package_base.html" %} {% block title %} - {{ package.title or "Create Package" }} - {% if not package and author != current_user %} - for {{ author.display_name }} + {% if package %} + {{ _("Edit - %(title)s", title=package.title) }} + {% if not package and author != current_user %} + for {{ author.display_name }} + {% endif %} + {% else %} + {{ _("Create Package") }} {% endif %} {% endblock %} @@ -21,15 +25,13 @@ {% endblock %} {% block content %} -

    {{ _("Create Package") }}

    + {% if not package %} +
    + {{ _("View") }} -
    - {{ _("View") }} - - {{ _("Have you read the Package Inclusion Policy and Guidance yet?") }} -
    - - {% if package %} + {{ _("Have you read the Package Inclusion Policy and Guidance yet?") }} +
    + {% else %}
    {{ _("Read more") }} diff --git a/app/templates/packages/edit_maintainers.html b/app/templates/packages/edit_maintainers.html index db9a997..c865910 100644 --- a/app/templates/packages/edit_maintainers.html +++ b/app/templates/packages/edit_maintainers.html @@ -1,14 +1,12 @@ -{% extends "base.html" %} +{% extends "packages/package_base.html" %} {% block title %} {{ _("Edit Maintainers") }} {% endblock %} -{% from "macros/forms.html" import render_submit_field, render_field %} {% block content %} -

    {{ _("Edit Maintainers") }}

    - + {% from "macros/forms.html" import render_submit_field, render_field %}

    {{ _("Maintainers are given write access to the package.") }} {{ _("Depending on their rank, they will be able to edit the package, create releases and screenshots, and read private threads.") }} diff --git a/app/templates/packages/package_base.html b/app/templates/packages/package_base.html new file mode 100644 index 0000000..18b39fc --- /dev/null +++ b/app/templates/packages/package_base.html @@ -0,0 +1,40 @@ +{% extends "base.html" %} + +{% block container %} + {% if tabs %} +

    + {% endif %} + + {% if tabs %} +
    + {{ self.content() }} +
    + {% else %} +
    +

    {{ self.title() }}

    + + {{ self.content() }} +
    + {% endif %} +{% endblock %} diff --git a/app/templates/packages/release_edit.html b/app/templates/packages/release_edit.html index a32f5db..031e9c2 100644 --- a/app/templates/packages/release_edit.html +++ b/app/templates/packages/release_edit.html @@ -1,11 +1,10 @@ -{% extends "base.html" %} +{% extends "packages/package_base.html" %} {% block title %} - Edit release | {{ package.title }} + Edit release - {{ package.title }} {% endblock %} {% block content %} -

    {{ _("Edit Release") }}

    {% from "macros/forms.html" import render_field, render_submit_field, render_checkbox_field %}
    {{ form.hidden_tag() }} diff --git a/app/templates/packages/releases_list.html b/app/templates/packages/releases_list.html new file mode 100644 index 0000000..3398a7c --- /dev/null +++ b/app/templates/packages/releases_list.html @@ -0,0 +1,38 @@ +{% extends "packages/package_base.html" %} + +{% block title %} + {{ _("Releases - %(title)s", title=package.title) }} +{% endblock %} + +{% block content %} +

    + {% if package.update_config %} + + + {{ _("Update settings") }} + + {% elif package.repo %} + + + {{ _("Set up automatic releases") }} + + {% endif %} + + + + Bulk update + + + + + Create + +

    + +

    {{ _("Releases") }}

    + +
      + {% from "macros/releases.html" import render_releases %} + {{ render_releases(package.releases, package, current_user) }} +
    +{% endblock %} diff --git a/app/templates/packages/remove.html b/app/templates/packages/remove.html index 3eff33e..f8394f8 100644 --- a/app/templates/packages/remove.html +++ b/app/templates/packages/remove.html @@ -1,14 +1,12 @@ -{% extends "base.html" %} +{% extends "packages/package_base.html" %} {% block title %} -Delete | {{ package.title }} +Remove {{ package.title }} {% endblock %} {% block content %} - -

    Remove {{ package.title }}

    - -
    + +

    Remove {{ package.title }}

    In order to avoid data loss, you cannot permanently delete packages. You can remove them from ContentDB, which will cause them to not be @@ -32,6 +30,5 @@ Delete | {{ package.title }} {% if package.approved %} {% endif %} -

    -
    + {% endblock %} diff --git a/app/templates/packages/screenshots.html b/app/templates/packages/screenshots.html index 906a7ab..f9fa44e 100644 --- a/app/templates/packages/screenshots.html +++ b/app/templates/packages/screenshots.html @@ -1,14 +1,13 @@ -{% extends "base.html" %} +{% extends "packages/package_base.html" %} {% block title %} - Screenshots | {{ package.title }} + Screenshots - {{ package.title }} {% endblock %} {% block content %} -

    {{ package.title }}

    - {% if package.checkPerm(current_user, "ADD_SCREENSHOTS") %} + {{ _("Add Image") }} {% endif %} diff --git a/app/templates/packages/view.html b/app/templates/packages/view.html index 0227516..dfeebcd 100644 --- a/app/templates/packages/view.html +++ b/app/templates/packages/view.html @@ -446,70 +446,14 @@

    {% if package.checkPerm(current_user, "MAKE_RELEASE") %} - + {% endif %} - {{ _("Releases") }} + {{ _("Releases") }}

      - {% for rel in releases %} - {% if rel.approved or package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE") %} -
    • - - {% if package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE") %} - Edit - {% if not rel.task_id and not rel.approved and rel.checkPerm(current_user, "APPROVE_RELEASE") %} - / Approve - {% endif %} - - {% endif %} - - {% if not rel.approved %}{% endif %} - - - {{ rel.title }} - - - - {% if rel.min_rel and rel.max_rel %} - [MT {{ rel.min_rel.name }}-{{ rel.max_rel.name }}] - {% elif rel.min_rel %} - [MT {{ rel.min_rel.name }}+] - {% elif rel.max_rel %} - [MT ≤{{ rel.max_rel.name }}] - {% endif %} - - -
      - - - {% if rel.commit_hash %} - [{{ rel.commit_hash | truncate(5, end='') }}] - {% endif %} - - created {{ rel.releaseDate | date }}. - - {% if (package.checkPerm(current_user, "MAKE_RELEASE") or rel.checkPerm(current_user, "APPROVE_RELEASE")) and rel.task_id %} - Importing... - {% elif not rel.approved %} - Waiting for approval. - {% endif %} - - {% if not rel.approved %}
      {% endif %} - -
    • - {% endif %} - {% else %} -
    • No releases available.
    • - {% endfor %} + {% from "macros/releases.html" import render_releases %} + {{ render_releases(releases, package, current_user) }}
    -

    {% if package.approved and package.checkPerm(current_user, "CREATE_THREAD") %}