From db09b8eb8410f3a5c4558304ea575604c6ef4cfc Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sat, 30 Jan 2021 22:58:55 +0000 Subject: [PATCH] Add ability to bulk create releases for outdated packages --- app/blueprints/todo/__init__.py | 51 +++++++++++++++++++++++++++++++-- app/models/packages.py | 10 +++++-- app/templates/todo/user.html | 7 ++++- 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/app/blueprints/todo/__init__.py b/app/blueprints/todo/__init__.py index a6ff862..885faa8 100644 --- a/app/blueprints/todo/__init__.py +++ b/app/blueprints/todo/__init__.py @@ -14,14 +14,15 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from celery import uuid from flask import * from flask_login import current_user, login_required from sqlalchemy import or_ -from sqlalchemy.sql.operators import is_ from app.models import * from app.querybuilder import QueryBuilder -from app.utils import get_int_or_abort +from app.utils import get_int_or_abort, addNotification, addAuditLog +from app.tasks.importtasks import makeVCSRelease bp = Blueprint("todo", __name__) @@ -176,6 +177,52 @@ def view_user(username=None): needs_tags=needs_tags, topics_to_add=topics_to_add) +@bp.route("/users//update-configs/apply-all/", methods=["POST"]) +@login_required +def apply_all_updates(username): + user: User = User.query.filter_by(username=username).first() + if not user: + abort(404) + + if current_user != user and not current_user.rank.atLeast(UserRank.EDITOR): + abort(403) + + outdated_packages = user.maintained_packages \ + .filter(Package.state != PackageState.DELETED, + Package.update_config.has(PackageUpdateConfig.outdated_at.isnot(None))) \ + .order_by(db.asc(Package.title)).all() + + for package in outdated_packages: + if not package.checkPerm(current_user, Permission.MAKE_RELEASE): + continue + + if package.releases.filter(or_(PackageRelease.task_id.isnot(None), + PackageRelease.commit_hash==package.update_config.last_commit)).count(): + continue + + title = package.update_config.get_title() + ref = package.update_config.get_ref() + + rel = PackageRelease() + rel.package = package + rel.title = title + rel.url = "" + rel.task_id = uuid() + db.session.add(rel) + db.session.commit() + + makeVCSRelease.apply_async((rel.id, ref), + task_id=rel.task_id) + + msg = "Created release {} (Applied all Git Update Config)".format(rel.title) + addNotification(package.maintainers, current_user, NotificationType.PACKAGE_EDIT, msg, + rel.getEditURL(), package) + addAuditLog(AuditSeverity.NORMAL, current_user, msg, package.getDetailsURL(), package) + db.session.commit() + + return redirect(url_for("todo.view_user", username=username)) + + @bp.route("/todo/outdated/") @login_required def outdated(): diff --git a/app/models/packages.py b/app/models/packages.py index f51b0a9..ccdd6cf 100644 --- a/app/models/packages.py +++ b/app/models/packages.py @@ -995,7 +995,11 @@ class PackageUpdateConfig(db.Model): else: return "New tag {} found on the Git repo.".format(self.last_tag) + def get_title(self): + return self.last_tag or self.outdated_at.strftime("%Y-%m-%d") + + def get_ref(self): + return self.last_tag or self.last_commit + def get_create_release_url(self): - title = self.last_tag or self.outdated_at.strftime("%Y-%m-%d") - ref = self.last_tag or self.last_commit - return self.package.getCreateReleaseURL(title=title, ref=ref) + return self.package.getCreateReleaseURL(title=self.get_title(), ref=self.get_ref()) diff --git a/app/templates/todo/user.html b/app/templates/todo/user.html index feb5edd..eaa9747 100644 --- a/app/templates/todo/user.html +++ b/app/templates/todo/user.html @@ -31,9 +31,14 @@ {% endfor %} - Help See all Update Settings + {% if outdated_packages %} +
+ + +
+ {% endif %}

{{ _("Potentially Outdated Packages") }}

{{ _("New: Git Update Detection has been set up on all packages to send notifications.") }}