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 fd7cd5f  Allow a release to be marked as announced, and add associated 
browser tests
fd7cd5f is described below

commit fd7cd5fcdfdd26770e3a84a0a073d7f33cbe80b3
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Apr 14 15:14:34 2025 +0100

    Allow a release to be marked as announced, and add associated browser tests
---
 atr/routes/release.py       | 21 +++++++++++++++++++++
 atr/templates/releases.html | 13 +++++++++++--
 playwright/test.py          | 25 +++++++++++++++++++------
 3 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/atr/routes/release.py b/atr/routes/release.py
index 8e8b890..89ec6dd 100644
--- a/atr/routes/release.py
+++ b/atr/routes/release.py
@@ -95,6 +95,27 @@ async def releases(session: routes.CommitterSession) -> str:
     )
 
 
[email protected]("/release/mark-announced/<project_name>/<version_name>", 
methods=["POST"])
+async def mark_announced(session: routes.CommitterSession, project_name: str, 
version_name: str) -> response.Response:
+    """Mark a release as announced."""
+    async with db.session() as data:
+        release_name = models.release_name(project_name, version_name)
+        release = await data.release(name=release_name, _project=True).get()
+
+        if not release:
+            return await session.redirect(releases, error=f"Release 
{release_name} not found.")
+
+        if release.phase != models.ReleasePhase.RELEASE_BEFORE_ANNOUNCEMENT:
+            return await session.redirect(
+                releases, error=f"Release {release_name} is not in the 'before 
announcement' phase."
+            )
+
+        release.phase = models.ReleasePhase.RELEASE_AFTER_ANNOUNCEMENT
+        await data.commit()
+
+    return await session.redirect(releases, success=f"Release {release_name} 
marked as announced.")
+
+
 @routes.committer("/release/view/<project_name>/<version_name>")
 async def view(session: routes.CommitterSession, project_name: str, 
version_name: str) -> response.Response | str:
     """View all the files in the rsync upload directory for a release."""
diff --git a/atr/templates/releases.html b/atr/templates/releases.html
index 44abaef..e922aec 100644
--- a/atr/templates/releases.html
+++ b/atr/templates/releases.html
@@ -30,14 +30,23 @@
     {% for release in releases %}
       <div class="card mb-3 bg-light">
         <div class="card-body">
-          <h3 class="card-title mb-2">{{ release.committee.display_name }}</h3>
+          <h3 class="card-title mb-2">{{ release.project.display_name }} {{ 
release.version }}</h3>
           <div class="d-flex flex-wrap gap-3 pb-3 mb-2 border-bottom 
text-secondary fs-6">
-            <span class="release-meta-item">Version: {{ release.version 
}}</span>
             <span class="release-meta-item">Stage: {{ 
release.stage.value.upper() }}</span>
             <span class="release-meta-item">Phase: {{ 
release.phase.value.upper() }}</span>
             <span class="release-meta-item">Created: {{ 
release.created.strftime("%Y-%m-%d %H:%M:%S UTC") }}</span>
           </div>
           <div class="d-flex gap-3 align-items-center pt-2">
+            {% if release.phase.value.upper() == "RELEASE_BEFORE_ANNOUNCEMENT" 
%}
+              <form method="post"
+                    action="{{ as_url(routes.release.mark_announced, 
project_name=release.project.name, version_name=release.version) }}"
+                    class="d-inline-block m-0">
+                <button class="btn btn-primary"
+                        title="Mark {{ release.project.display_name }} {{ 
release.version }} as announced">
+                  Mark as announced
+                </button>
+              </form>
+            {% endif %}
             <a class="btn btn-outline-primary"
                href="{{ as_url(routes.release.view, 
project_name=release.project.name, version_name=release.version) }}">View 
files</a>
           </div>
diff --git a/playwright/test.py b/playwright/test.py
index 236f8d2..d4a2cf5 100644
--- a/playwright/test.py
+++ b/playwright/test.py
@@ -328,15 +328,28 @@ def test_lifecycle_07_promote_preview(page: 
sync_api.Page) -> None:
 def test_lifecycle_08_release_exists(page: sync_api.Page) -> None:
     logging.info("Checking for release tooling-0.1 on the /releases page")
 
-    release_card_locator = page.locator('div.card:has(h3:has-text("tooling"))')
+    release_card_locator = page.locator('div.card:has(h3:has-text("Apache 
Tooling 0.1"))')
     sync_api.expect(release_card_locator).to_be_visible()
-    logging.info("Found card for project tooling")
+    logging.info("Found card for tooling-0.1 release")
+    logging.info("Release tooling-0.1 confirmed exists on /releases page")
 
-    version_locator = 
release_card_locator.locator('span.release-meta-item:has-text("Version: 0.1")')
-    sync_api.expect(version_locator).to_be_visible()
-    logging.info("Found version 0.1 within the tooling project card")
+    logging.info("Locating the announcement marking button for tooling-0.1")
+    mark_announced_button_locator = page.locator('button[title="Mark Apache 
Tooling 0.1 as announced"]')
+    sync_api.expect(mark_announced_button_locator).to_be_visible()
 
-    logging.info("Release tooling-0.1 confirmed exists on /releases page")
+    logging.info("Activating the button to mark the release as announced")
+    mark_announced_button_locator.click()
+
+    logging.info("Waiting for navigation back to /releases after marking as 
announced")
+    wait_for_path(page, "/releases")
+    logging.info("Navigation back to /releases completed successfully")
+
+    logging.info("Verifying release tooling-0.1 phase is now 
RELEASE_AFTER_ANNOUNCEMENT")
+    release_card_locator = page.locator('div.card:has(h3:has-text("Apache 
Tooling 0.1"))')
+    sync_api.expect(release_card_locator).to_be_visible()
+    phase_locator = 
release_card_locator.locator('span.release-meta-item:has-text("Phase: 
RELEASE_AFTER_ANNOUNCEMENT")')
+    sync_api.expect(phase_locator).to_be_visible()
+    logging.info("Phase confirmed as RELEASE_AFTER_ANNOUNCEMENT")
 
 
 def test_login(page: sync_api.Page, credentials: Credentials) -> None:


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to