This is an automated email from the ASF dual-hosted git repository.
sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git
The following commit(s) were added to refs/heads/main by this push:
new 2e62338 Add links to completed releases for each project on the entry
page
2e62338 is described below
commit 2e6233847e56918c502d5b1982c35031f29d9c06
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Apr 21 20:12:04 2025 +0100
Add links to completed releases for each project on the entry page
---
atr/routes/release.py | 20 +++++++++++++
atr/routes/root.py | 19 ++++++++----
atr/templates/index-committer.html | 9 +++++-
atr/templates/releases-completed.html | 56 +++++++++++++++++++++++++++++++++++
4 files changed, 98 insertions(+), 6 deletions(-)
diff --git a/atr/routes/release.py b/atr/routes/release.py
index 05071f1..7a0de6b 100644
--- a/atr/routes/release.py
+++ b/atr/routes/release.py
@@ -83,6 +83,26 @@ async def bulk_status(session: routes.CommitterSession,
task_id: int) -> str | r
return await quart.render_template("release-bulk.html", task=task,
release=release, TaskStatus=models.TaskStatus)
[email protected]("/releases/completed/<project_name>")
+async def completed(session: routes.CommitterSession, project_name: str) ->
str:
+ """View all completed releases for a project."""
+ async with db.session() as data:
+ project = await data.project(name=project_name).demand(
+ base.ASFQuartException(f"Project {project_name} not found",
errorcode=404)
+ )
+
+ releases = await data.release(
+ project_id=project.id,
+ phase=models.ReleasePhase.RELEASE,
+ _committee=True,
+ _packages=True,
+ ).all()
+
+ return await quart.render_template(
+ "releases-completed.html", releases=releases,
format_datetime=routes.format_datetime
+ )
+
+
@routes.committer("/releases")
async def releases(session: routes.CommitterSession) -> str:
"""View all releases."""
diff --git a/atr/routes/root.py b/atr/routes/root.py
index 052c88a..64a23ac 100644
--- a/atr/routes/root.py
+++ b/atr/routes/root.py
@@ -65,15 +65,24 @@ async def index() -> response.Response | str:
)
result = await data.execute(stmt)
active_releases = result.scalars().all()
+ completed_releases = (
+ len(await data.release(phase=models.ReleasePhase.RELEASE,
project_id=project.id).all()) > 0
+ )
if active_releases:
- projects_with_releases.append({"project": project,
"active_releases": active_releases})
+ projects_with_releases.append(
+ {
+ "project": project,
+ "active_releases": active_releases,
+ "completed_releases": completed_releases,
+ }
+ )
else:
- projects_without_releases.append(project)
+ projects_without_releases.append(
+ {"project": project, "active_releases": [],
"completed_releases": completed_releases}
+ )
- all_projects = projects_with_releases + [
- {"project": p, "active_releases": []} for p in
projects_without_releases
- ]
+ all_projects = projects_with_releases + projects_without_releases
def sort_key(item: dict) -> str:
project = item["project"]
diff --git a/atr/templates/index-committer.html
b/atr/templates/index-committer.html
index 0b4e3ac..3a9ef06 100644
--- a/atr/templates/index-committer.html
+++ b/atr/templates/index-committer.html
@@ -77,6 +77,7 @@
{% for item in all_projects %}
{% set project = item.project %}
{% set active_releases = item.active_releases %}
+ {% set completed_releases = item.completed_releases %}
{% set project_id = project.name|slugify %}
{% set display_name_cleaned = project.display_name %}
@@ -105,7 +106,13 @@
<a href="{{ as_url(routes.projects.view, name=project.name) }}"
class="text-decoration-none me-2">About this project</a>
<span class="text-muted me-2">/</span>
- <a href="{{ as_url(routes.projects.add) }}"
class="text-decoration-none">Create a sub-project</a>
+ <a href="{{ as_url(routes.projects.add) }}"
+ class="text-decoration-none me-2">Create a sub-project</a>
+ {% if completed_releases %}
+ <span class="text-muted me-2">/</span>
+ <a href="{{ as_url(routes.release.completed,
project_name=project.name) }}"
+ class="text-decoration-none">Show completed releases</a>
+ {% endif %}
</p>
<div class="d-flex flex-wrap gap-3">
diff --git a/atr/templates/releases-completed.html
b/atr/templates/releases-completed.html
new file mode 100644
index 0000000..1547747
--- /dev/null
+++ b/atr/templates/releases-completed.html
@@ -0,0 +1,56 @@
+{% extends "layouts/base.html" %}
+
+{% block title %}
+ Completed releases of {{ project_display_name }} ~ ATR
+{% endblock title %}
+
+{% block description %}
+ All of the completed releases of {{ project_display_name }} on ATR.
+{% endblock description %}
+
+{% block content %}
+ {% set project_name = releases[0].project.name if releases else "" %}
+ {% set project_display_name = releases[0].project.display_name if releases
else "Unknown project" %}
+
+ <nav aria-label="breadcrumb" class="mb-5">
+ <ol class="breadcrumb">
+ <li class="breadcrumb-item">
+ <a href="{{ as_url(routes.root.index) }}">ATR</a>
+ </li>
+ {% if project_name %}
+ <li class="breadcrumb-item">
+ <a href="{{ as_url(routes.projects.view, name=project_name) }}">{{
project_display_name }}</a>
+ </li>
+ {% endif %}
+ <li class="breadcrumb-item active" aria-current="page">Completed
releases</li>
+ </ol>
+ </nav>
+
+ <h1>Completed releases of {{ project_display_name }}</h1>
+
+ {% if releases %}
+ <p class="mb-4">The following releases have been completed and published
for this project.</p>
+ <div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
+ {% for release in releases %}
+ <div class="col">
+ <div class="card h-100 shadow-sm">
+ <div class="card-body d-flex flex-column">
+ <strong class="card-title fs-5">{{ release.version }}</strong>
+ <p class="card-text text-muted">Released on {{
format_datetime(release.created) }}</p>
+ <div class="mt-auto">
+ <a href="{{ as_url(routes.release.view,
project_name=release.project.name, version_name=release.version) }}"
+ class="btn btn-outline-primary w-100">
+ <i class="fas fa-folder-open me-1"></i> View release files
+ </a>
+ </div>
+ </div>
+ </div>
+ </div>
+ {% endfor %}
+ </div>
+ {% else %}
+ <div class="alert alert-info mt-4" role="alert">
+ <i class="fas fa-info-circle me-2"></i>There are no completed releases
recorded for {{ project_display_name }}.
+ </div>
+ {% endif %}
+{% endblock content %}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]