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]

Reply via email to