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 a7d2797  Fix a bug with displaying draft candidate releases
a7d2797 is described below

commit a7d2797b7998d81fd919f561f654fa0f2be22bf1
Author: Sean B. Palmer <[email protected]>
AuthorDate: Fri May 30 18:39:06 2025 +0100

    Fix a bug with displaying draft candidate releases
---
 atr/routes/announce.py                      |   1 +
 atr/routes/draft.py                         |  13 ++-
 atr/routes/preview.py                       |   1 +
 atr/routes/revisions.py                     |   5 +-
 atr/templates/voting-selected-revision.html | 172 +++++++++++++++-------------
 5 files changed, 103 insertions(+), 89 deletions(-)

diff --git a/atr/routes/announce.py b/atr/routes/announce.py
index 40b6e10..2f9fef5 100644
--- a/atr/routes/announce.py
+++ b/atr/routes/announce.py
@@ -86,6 +86,7 @@ async def selected(session: routes.CommitterSession, 
project_name: str, version_
     announce_form = await 
_create_announce_form_instance(util.permitted_recipients(session.uid))
     # Hidden fields
     announce_form.preview_name.data = release.name
+    # There must be a revision to announce
     announce_form.preview_revision.data = release.unwrap_revision_number
 
     # Variables used in defaults for subject and body
diff --git a/atr/routes/draft.py b/atr/routes/draft.py
index d5a5739..61b42ee 100644
--- a/atr/routes/draft.py
+++ b/atr/routes/draft.py
@@ -444,12 +444,13 @@ async def view(session: routes.CommitterSession, 
project_name: str, version_name
     release = await session.release(project_name, version_name)
 
     # Convert async generator to list
-    file_stats = [
-        stat
-        async for stat in util.content_list(
-            util.get_unfinished_dir(), project_name, version_name, 
release.unwrap_revision_number
-        )
-    ]
+    revision_number = release.latest_revision_number
+    file_stats = []
+    if revision_number is not None:
+        file_stats = [
+            stat
+            async for stat in util.content_list(util.get_unfinished_dir(), 
project_name, version_name, revision_number)
+        ]
     # Sort the files by FileStat.path
     file_stats.sort(key=lambda fs: fs.path)
 
diff --git a/atr/routes/preview.py b/atr/routes/preview.py
index 8eeb713..a861539 100644
--- a/atr/routes/preview.py
+++ b/atr/routes/preview.py
@@ -150,6 +150,7 @@ async def view(session: routes.CommitterSession, 
project_name: str, version_name
     release = await session.release(project_name, version_name, 
phase=models.ReleasePhase.RELEASE_PREVIEW)
 
     # Convert async generator to list
+    # There must be a revision on a preview
     file_stats = [
         stat
         async for stat in util.content_list(
diff --git a/atr/routes/revisions.py b/atr/routes/revisions.py
index 105f380..eefeb7a 100644
--- a/atr/routes/revisions.py
+++ b/atr/routes/revisions.py
@@ -49,7 +49,10 @@ async def selected(session: routes.CommitterSession, 
project_name: str, version_
     release_dir = util.release_directory_base(release)
 
     # Determine the current revision
-    latest_revision_number = release.unwrap_revision_number
+    latest_revision_number = release.latest_revision_number
+    if latest_revision_number is None:
+        # TODO: Set an error message, and redirect to the release page?
+        ...
 
     # Oldest to newest, to build diffs relative to previous revision
     async with db.session() as data_for_revisions:
diff --git a/atr/templates/voting-selected-revision.html 
b/atr/templates/voting-selected-revision.html
index 31cc06e..43857f9 100644
--- a/atr/templates/voting-selected-revision.html
+++ b/atr/templates/voting-selected-revision.html
@@ -46,101 +46,109 @@
     </div>
   {% endif %}
 
-  {{ forms.errors_summary(form) }}
-  <form method="post"
-        id="vote-initiate-form"
-        class="atr-canary py-4 px-5"
-        action="{{ as_url(routes.voting.selected_revision, 
project_name=release.project.name, version_name=release.version, 
revision=release.unwrap_revision_number) }}"
-        novalidate>
-    {{ form.hidden_tag() }}
-
-    {{ form.release_name }}
-    <div class="mb-4">
-      <div class="row mb-3 pb-3 border-bottom">
-        {{ forms.label(form.mailing_list, col="md3-high") }}
-        <div class="col-md-9">
-          <div class="d-flex gap-4 mb-2">
-            {% for subfield in form.mailing_list %}
-              <div class="form-check">
-                {{ subfield(class_='form-check-input') }}
-                {{ subfield.label(class_='form-check-label') }}
-              </div>
-            {% endfor %}
+  {% set revision_number = release.latest_revision_number %}
+  {% if revision_number %}
+    {{ forms.errors_summary(form) }}
+    <form method="post"
+          id="vote-initiate-form"
+          class="atr-canary py-4 px-5"
+          action="{{ as_url(routes.voting.selected_revision, 
project_name=release.project.name, version_name=release.version, 
revision=revision_number) }}"
+          novalidate>
+      {{ form.hidden_tag() }}
+
+      {{ form.release_name }}
+      <div class="mb-4">
+        <div class="row mb-3 pb-3 border-bottom">
+          {{ forms.label(form.mailing_list, col="md3-high") }}
+          <div class="col-md-9">
+            <div class="d-flex gap-4 mb-2">
+              {% for subfield in form.mailing_list %}
+                <div class="form-check">
+                  {{ subfield(class_='form-check-input') }}
+                  {{ subfield.label(class_='form-check-label') }}
+                </div>
+              {% endfor %}
+            </div>
+            {{ forms.errors(form.mailing_list) }}
+            {{ forms.description(form.mailing_list, classes="form-text 
text-muted") }}
           </div>
-          {{ forms.errors(form.mailing_list) }}
-          {{ forms.description(form.mailing_list, classes="form-text 
text-muted") }}
         </div>
-      </div>
 
-      <div class="row mb-3 pb-3 border-bottom">
-        {{ forms.label(form.vote_duration, col="md3") }}
-        <div class="col-md-9">
-          {{ forms.widget(form.vote_duration, classes="form-select w-75") }}
-          {{ forms.errors(form.vote_duration) }}
-          {{ forms.description(form.vote_duration, classes="form-text 
text-muted") }}
+        <div class="row mb-3 pb-3 border-bottom">
+          {{ forms.label(form.vote_duration, col="md3") }}
+          <div class="col-md-9">
+            {{ forms.widget(form.vote_duration, classes="form-select w-75") }}
+            {{ forms.errors(form.vote_duration) }}
+            {{ forms.description(form.vote_duration, classes="form-text 
text-muted") }}
+          </div>
         </div>
-      </div>
 
-      <div class="row mb-3 pb-3 border-bottom">
-        {{ forms.label(form.subject, col="md3") }}
-        <div class="col-md-9">
-          {{ forms.widget(form.subject, classes="form-control w-75") }}
-          {{ forms.errors(form.subject) }}
+        <div class="row mb-3 pb-3 border-bottom">
+          {{ forms.label(form.subject, col="md3") }}
+          <div class="col-md-9">
+            {{ forms.widget(form.subject, classes="form-control w-75") }}
+            {{ forms.errors(form.subject) }}
+          </div>
         </div>
-      </div>
 
-      <div class="row mb-3 pb-3">
-        {{ forms.label(form.body, col="md3") }}
-        <div class="col-md-9">
-          <ul class="nav nav-tabs" id="emailBodyTab" role="tablist">
-            <li class="nav-item" role="presentation">
-              <button class="nav-link active"
-                      id="edit-body-tab"
-                      data-bs-toggle="tab"
-                      data-bs-target="#edit-body-pane"
-                      type="button"
-                      role="tab"
-                      aria-controls="edit-body-pane"
-                      aria-selected="true">Edit</button>
-            </li>
-            <li class="nav-item" role="presentation">
-              <button class="nav-link"
-                      id="text-preview-body-tab"
-                      data-bs-toggle="tab"
-                      data-bs-target="#text-preview-body-pane"
-                      type="button"
-                      role="tab"
-                      aria-controls="text-preview-body-pane"
-                      aria-selected="false">Text preview</button>
-            </li>
-          </ul>
-          <div class="tab-content" id="emailBodyTabContent">
-            <div class="tab-pane fade show active"
-                 id="edit-body-pane"
-                 role="tabpanel"
-                 aria-labelledby="edit-body-tab">
-              {{ forms.widget(form.body, classes="form-control font-monospace 
mt-2", rows="20") }}
-              {{ forms.errors(form.body) }}
-              {{ forms.description(form.body, classes="form-text text-muted") 
}}
-            </div>
-            <div class="tab-pane fade"
-                 id="text-preview-body-pane"
-                 role="tabpanel"
-                 aria-labelledby="text-preview-body-tab">
-              <pre class="mt-2 p-3 bg-light border rounded font-monospace 
overflow-auto"><code id="text-preview-content">Loading preview...</code></pre>
+        <div class="row mb-3 pb-3">
+          {{ forms.label(form.body, col="md3") }}
+          <div class="col-md-9">
+            <ul class="nav nav-tabs" id="emailBodyTab" role="tablist">
+              <li class="nav-item" role="presentation">
+                <button class="nav-link active"
+                        id="edit-body-tab"
+                        data-bs-toggle="tab"
+                        data-bs-target="#edit-body-pane"
+                        type="button"
+                        role="tab"
+                        aria-controls="edit-body-pane"
+                        aria-selected="true">Edit</button>
+              </li>
+              <li class="nav-item" role="presentation">
+                <button class="nav-link"
+                        id="text-preview-body-tab"
+                        data-bs-toggle="tab"
+                        data-bs-target="#text-preview-body-pane"
+                        type="button"
+                        role="tab"
+                        aria-controls="text-preview-body-pane"
+                        aria-selected="false">Text preview</button>
+              </li>
+            </ul>
+            <div class="tab-content" id="emailBodyTabContent">
+              <div class="tab-pane fade show active"
+                   id="edit-body-pane"
+                   role="tabpanel"
+                   aria-labelledby="edit-body-tab">
+                {{ forms.widget(form.body, classes="form-control 
font-monospace mt-2", rows="20") }}
+                {{ forms.errors(form.body) }}
+                {{ forms.description(form.body, classes="form-text 
text-muted") }}
+              </div>
+              <div class="tab-pane fade"
+                   id="text-preview-body-pane"
+                   role="tabpanel"
+                   aria-labelledby="text-preview-body-tab">
+                <pre class="mt-2 p-3 bg-light border rounded font-monospace 
overflow-auto"><code id="text-preview-content">Loading preview...</code></pre>
+              </div>
             </div>
           </div>
         </div>
-      </div>
 
-    </div>
+      </div>
 
-    <div class="mt-4 col-md-9 offset-md-3 px-1">
-      {{ form.submit(class_='btn btn-primary') }}
-      <a href="{{ as_url(routes.compose.selected, 
project_name=release.project.name, version_name=release.version) }}"
-         class="btn btn-link text-secondary">Cancel</a>
+      <div class="mt-4 col-md-9 offset-md-3 px-1">
+        {{ form.submit(class_='btn btn-primary') }}
+        <a href="{{ as_url(routes.compose.selected, 
project_name=release.project.name, version_name=release.version) }}"
+           class="btn btn-link text-secondary">Cancel</a>
+      </div>
+    </form>
+  {% else %}
+    <div class="p-3 mb-4 bg-danger-subtle border border-danger rounded">
+      <i class="bi bi-exclamation-triangle-fill"></i>
+      <strong>Error:</strong> This release has no revisions. Please create a 
revision first.
     </div>
-  </form>
+  {% endif %}
 {% endblock content %}
 
 {% block javascripts %}


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

Reply via email to