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-releases.git


The following commit(s) were added to refs/heads/main by this push:
     new b8bfe1d  Move report, resolve, and revisions routes to the new layout
b8bfe1d is described below

commit b8bfe1d46c6dcc749df91e059b158d186ef66da0
Author: Sean B. Palmer <[email protected]>
AuthorDate: Tue Oct 28 15:58:25 2025 +0000

    Move report, resolve, and revisions routes to the new layout
---
 atr/get/__init__.py                            |  6 ++
 atr/{routes => get}/report.py                  |  7 ++-
 atr/get/resolve.py                             | 45 +++++++++++++++
 atr/{routes => get}/revisions.py               | 52 -----------------
 atr/post/__init__.py                           |  4 ++
 atr/{routes => post}/resolve.py                | 78 ++++----------------------
 atr/post/revisions.py                          | 78 ++++++++++++++++++++++++++
 atr/routes/__init__.py                         |  6 --
 atr/shared/__init__.py                         |  2 +
 atr/{post/__init__.py => shared/resolve.py}    | 58 ++++++++++---------
 atr/templates/check-selected-path-table.html   |  6 +-
 atr/templates/check-selected-release-info.html |  8 +--
 atr/templates/finish-selected.html             |  2 +-
 atr/templates/resolve-tabulated.html           |  2 +-
 atr/templates/revisions-selected.html          |  2 +-
 15 files changed, 192 insertions(+), 164 deletions(-)

diff --git a/atr/get/__init__.py b/atr/get/__init__.py
index 3694731..b142cc5 100644
--- a/atr/get/__init__.py
+++ b/atr/get/__init__.py
@@ -36,6 +36,9 @@ import atr.get.projects as projects
 import atr.get.published as published
 import atr.get.ref as ref
 import atr.get.release as release
+import atr.get.report as report
+import atr.get.resolve as resolve
+import atr.get.revisions as revisions
 import atr.get.vote as vote
 
 ROUTES_MODULE: Final[Literal[True]] = True
@@ -58,5 +61,8 @@ __all__ = [
     "published",
     "ref",
     "release",
+    "report",
+    "resolve",
+    "revisions",
     "vote",
 ]
diff --git a/atr/routes/report.py b/atr/get/report.py
similarity index 92%
rename from atr/routes/report.py
rename to atr/get/report.py
index 70b349e..76a88e4 100644
--- a/atr/routes/report.py
+++ b/atr/get/report.py
@@ -21,16 +21,17 @@ import pathlib
 import aiofiles.os
 import asfquart.base as base
 
+import atr.blueprints.get as get
 import atr.forms as forms
 import atr.models.sql as sql
-import atr.route as route
 import atr.storage as storage
 import atr.template as template
 import atr.util as util
+import atr.web as web
 
 
[email protected]("/report/<project_name>/<version_name>/<path:rel_path>")
-async def selected_path(session: route.CommitterSession, project_name: str, 
version_name: str, rel_path: str) -> str:
[email protected]("/report/<project_name>/<version_name>/<path:rel_path>")
+async def selected_path(session: web.Committer, project_name: str, 
version_name: str, rel_path: str) -> str:
     """Show the report for a specific file."""
     await session.check_access(project_name)
 
diff --git a/atr/get/resolve.py b/atr/get/resolve.py
new file mode 100644
index 0000000..1fbbea7
--- /dev/null
+++ b/atr/get/resolve.py
@@ -0,0 +1,45 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+import atr.blueprints.get as get
+import atr.models.sql as sql
+import atr.shared as shared
+import atr.template as template
+import atr.web as web
+
+
[email protected]("/resolve/manual/<project_name>/<version_name>")
+async def manual_selected(session: web.Committer, project_name: str, 
version_name: str) -> str:
+    """Get the manual vote resolution page."""
+    await session.check_access(project_name)
+
+    release = await session.release(
+        project_name,
+        version_name,
+        phase=sql.ReleasePhase.RELEASE_CANDIDATE,
+        with_release_policy=True,
+        with_project_release_policy=True,
+    )
+    if not release.vote_manual:
+        raise RuntimeError("This page is for manual votes only")
+    resolve_form = await shared.resolve.ResolveVoteManualForm.create_form()
+    return await template.render(
+        "resolve-manual.html",
+        release=release,
+        resolve_form=resolve_form,
+    )
diff --git a/atr/routes/revisions.py b/atr/get/revisions.py
similarity index 67%
rename from atr/routes/revisions.py
rename to atr/get/revisions.py
index 872026c..4a7922b 100644
--- a/atr/routes/revisions.py
+++ b/atr/get/revisions.py
@@ -19,19 +19,15 @@ import asyncio
 import pathlib
 
 import aiofiles.os
-import aioshutil
 import asfquart.base as base
-import quart
 import sqlalchemy.orm as orm
 import sqlmodel
-import werkzeug.wrappers.response as response
 
 import atr.db as db
 import atr.forms as forms
 import atr.models.schema as schema
 import atr.models.sql as sql
 import atr.route as route
-import atr.storage as storage
 import atr.template as template
 import atr.util as util
 
@@ -92,54 +88,6 @@ async def selected(session: route.CommitterSession, 
project_name: str, version_n
     )
 
 
[email protected]("/revisions/<project_name>/<version_name>", methods=["POST"])
-async def selected_post(session: route.CommitterSession, project_name: str, 
version_name: str) -> response.Response:
-    """Set a specific revision as the latest for a candidate draft or release 
preview."""
-    await session.check_access(project_name)
-
-    # TODO: This is not truly empty, so make a form object for this
-    await util.validate_empty_form()
-    form_data = await quart.request.form
-    selected_revision_number = form_data.get("revision_number")
-    if not selected_revision_number:
-        raise base.ASFQuartException("Missing revision number", errorcode=400)
-
-    async with db.session() as data:
-        release = await session.release(project_name, version_name, 
phase=None, data=data)
-        selected_revision_dir = util.release_directory_base(release) / 
selected_revision_number
-        if release.phase not in {sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT, 
sql.ReleasePhase.RELEASE_PREVIEW}:
-            raise base.ASFQuartException("Cannot set revision for non-draft or 
preview release", errorcode=400)
-
-        selected_revision = await data.revision(release_name=release.name, 
number=selected_revision_number).demand(
-            base.ASFQuartException(f"Revision {selected_revision_number} not 
found", errorcode=404)
-        )
-        if (release.phase == sql.ReleasePhase.RELEASE_PREVIEW) and (
-            selected_revision.phase != sql.ReleasePhase.RELEASE_PREVIEW
-        ):
-            raise base.ASFQuartException(
-                f"Revision {selected_revision_number} is not a preview 
revision", errorcode=400
-            )
-
-    description = f"Copy of revision {selected_revision_number} through web 
interface"
-    async with storage.write(session) as write:
-        wacp = await write.as_project_committee_participant(project_name)
-        async with wacp.revision.create_and_manage(
-            project_name, version_name, session.uid, description=description
-        ) as creating:
-            # TODO: Stop create_and_manage from hard linking the parent first
-            await aioshutil.rmtree(creating.interim_path)  # type: 
ignore[call-arg]
-            await util.create_hard_link_clone(selected_revision_dir, 
creating.interim_path)
-
-        if creating.new is None:
-            raise base.ASFQuartException("Internal error: New revision not 
found", errorcode=500)
-        return await session.redirect(
-            selected,
-            success=f"Copied revision {selected_revision_number} to new latest 
revision, {creating.new.number}",
-            project_name=project_name,
-            version_name=version_name,
-        )
-
-
 class FilesDiff(schema.Strict):
     added: list[pathlib.Path]
     removed: list[pathlib.Path]
diff --git a/atr/post/__init__.py b/atr/post/__init__.py
index 5e2dfe0..5f4d930 100644
--- a/atr/post/__init__.py
+++ b/atr/post/__init__.py
@@ -26,6 +26,8 @@ import atr.post.ignores as ignores
 import atr.post.keys as keys
 import atr.post.preview as preview
 import atr.post.projects as projects
+import atr.post.resolve as resolve
+import atr.post.revisions as revisions
 import atr.post.vote as vote
 
 ROUTES_MODULE: Final[Literal[True]] = True
@@ -40,5 +42,7 @@ __all__ = [
     "keys",
     "preview",
     "projects",
+    "resolve",
+    "revisions",
     "vote",
 ]
diff --git a/atr/routes/resolve.py b/atr/post/resolve.py
similarity index 76%
rename from atr/routes/resolve.py
rename to atr/post/resolve.py
index dd9a6e4..1803de6 100644
--- a/atr/routes/resolve.py
+++ b/atr/post/resolve.py
@@ -20,10 +20,11 @@ import asfquart.base as base
 import quart
 import werkzeug.wrappers.response as response
 
+import atr.blueprints.post as post
 import atr.forms as forms
 import atr.get as get
 import atr.models.sql as sql
-import atr.route as route
+import atr.shared as shared
 import atr.storage as storage
 import atr.tabulate as tabulate
 import atr.template as template
@@ -31,61 +32,8 @@ import atr.util as util
 import atr.web as web
 
 
-class ResolveVoteForm(forms.Typed):
-    """Form for resolving a vote."""
-
-    email_body = forms.textarea("Email body", optional=True, rows=24)
-    vote_result = forms.radio(
-        "Vote result",
-        choices=[
-            ("passed", "Passed"),
-            ("failed", "Failed"),
-        ],
-    )
-    submit = forms.submit("Resolve vote")
-
-
-class ResolveVoteManualForm(forms.Typed):
-    """Form for resolving a vote manually."""
-
-    vote_result = forms.radio(
-        "Vote result",
-        choices=[
-            ("passed", "Passed"),
-            ("failed", "Failed"),
-        ],
-    )
-    vote_thread_url = forms.string("Vote thread URL")
-    vote_result_url = forms.string("Vote result URL")
-    submit = forms.submit("Resolve vote")
-
-
[email protected]("/resolve/manual/<project_name>/<version_name>")
-async def manual_selected(session: route.CommitterSession, project_name: str, 
version_name: str) -> str:
-    """Get the manual vote resolution page."""
-    await session.check_access(project_name)
-
-    release = await session.release(
-        project_name,
-        version_name,
-        phase=sql.ReleasePhase.RELEASE_CANDIDATE,
-        with_release_policy=True,
-        with_project_release_policy=True,
-    )
-    if not release.vote_manual:
-        raise RuntimeError("This page is for manual votes only")
-    resolve_form = await ResolveVoteManualForm.create_form()
-    return await template.render(
-        "resolve-manual.html",
-        release=release,
-        resolve_form=resolve_form,
-    )
-
-
[email protected]("/resolve/manual/<project_name>/<version_name>", 
methods=["POST"])
-async def manual_selected_post(
-    session: route.CommitterSession, project_name: str, version_name: str
-) -> response.Response | str:
[email protected]("/resolve/manual/<project_name>/<version_name>")
+async def manual_selected_post(session: web.Committer, project_name: str, 
version_name: str) -> response.Response | str:
     """Post the manual vote resolution page."""
     await session.check_access(project_name)
     release = await session.release(
@@ -97,10 +45,10 @@ async def manual_selected_post(
     )
     if not release.vote_manual:
         raise RuntimeError("This page is for manual votes only")
-    resolve_form = await ResolveVoteManualForm.create_form()
+    resolve_form = await shared.resolve.ResolveVoteManualForm.create_form()
     if not (await resolve_form.validate_on_submit()):
         return await session.redirect(
-            manual_selected,
+            get.resolve.manual_selected,
             project_name=project_name,
             version_name=version_name,
             error="Invalid form submission.",
@@ -122,14 +70,12 @@ async def manual_selected_post(
     )
 
 
[email protected]("/resolve/submit/<project_name>/<version_name>", 
methods=["POST"])
-async def submit_selected(
-    session: route.CommitterSession, project_name: str, version_name: str
-) -> response.Response | str:
[email protected]("/resolve/submit/<project_name>/<version_name>")
+async def submit_selected(session: web.Committer, project_name: str, 
version_name: str) -> response.Response | str:
     """Resolve a vote."""
     await session.check_access(project_name)
 
-    resolve_form = await ResolveVoteForm.create_form()
+    resolve_form = await shared.resolve.ResolveVoteForm.create_form()
     if not (await resolve_form.validate_on_submit()):
         # TODO: Render the page again with errors
         return await session.redirect(
@@ -164,8 +110,8 @@ async def submit_selected(
     )
 
 
[email protected]("/resolve/tabulated/<project_name>/<version_name>", 
methods=["POST"])
-async def tabulated_selected_post(session: route.CommitterSession, 
project_name: str, version_name: str) -> str:
[email protected]("/resolve/tabulated/<project_name>/<version_name>")
+async def tabulated_selected_post(session: web.Committer, project_name: str, 
version_name: str) -> str:
     """Tabulate votes."""
     await session.check_access(project_name)
     asf_uid = session.uid
@@ -207,7 +153,7 @@ async def tabulated_selected_post(session: 
route.CommitterSession, project_name:
                 details = await tabulate.vote_details(committee, thread_id, 
release)
         else:
             fetch_error = "The vote thread could not yet be found."
-    resolve_form = await ResolveVoteForm.create_form()
+    resolve_form = await shared.resolve.ResolveVoteForm.create_form()
     if (committee is None) or (details is None) or (thread_id is None):
         resolve_form.email_body.render_kw = {"rows": 12}
     else:
diff --git a/atr/post/revisions.py b/atr/post/revisions.py
new file mode 100644
index 0000000..51e0faa
--- /dev/null
+++ b/atr/post/revisions.py
@@ -0,0 +1,78 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+
+import aioshutil
+import asfquart.base as base
+import quart
+import werkzeug.wrappers.response as response
+
+import atr.blueprints.post as post
+import atr.db as db
+import atr.get as get
+import atr.models.sql as sql
+import atr.storage as storage
+import atr.util as util
+import atr.web as web
+
+
[email protected]("/revisions/<project_name>/<version_name>")
+async def selected_post(session: web.Committer, project_name: str, 
version_name: str) -> response.Response:
+    """Set a specific revision as the latest for a candidate draft or release 
preview."""
+    await session.check_access(project_name)
+
+    # TODO: This is not truly empty, so make a form object for this
+    await util.validate_empty_form()
+    form_data = await quart.request.form
+    selected_revision_number = form_data.get("revision_number")
+    if not selected_revision_number:
+        raise base.ASFQuartException("Missing revision number", errorcode=400)
+
+    async with db.session() as data:
+        release = await session.release(project_name, version_name, 
phase=None, data=data)
+        selected_revision_dir = util.release_directory_base(release) / 
selected_revision_number
+        if release.phase not in {sql.ReleasePhase.RELEASE_CANDIDATE_DRAFT, 
sql.ReleasePhase.RELEASE_PREVIEW}:
+            raise base.ASFQuartException("Cannot set revision for non-draft or 
preview release", errorcode=400)
+
+        selected_revision = await data.revision(release_name=release.name, 
number=selected_revision_number).demand(
+            base.ASFQuartException(f"Revision {selected_revision_number} not 
found", errorcode=404)
+        )
+        if (release.phase == sql.ReleasePhase.RELEASE_PREVIEW) and (
+            selected_revision.phase != sql.ReleasePhase.RELEASE_PREVIEW
+        ):
+            raise base.ASFQuartException(
+                f"Revision {selected_revision_number} is not a preview 
revision", errorcode=400
+            )
+
+    description = f"Copy of revision {selected_revision_number} through web 
interface"
+    async with storage.write(session) as write:
+        wacp = await write.as_project_committee_participant(project_name)
+        async with wacp.revision.create_and_manage(
+            project_name, version_name, session.uid, description=description
+        ) as creating:
+            # TODO: Stop create_and_manage from hard linking the parent first
+            await aioshutil.rmtree(creating.interim_path)  # type: 
ignore[call-arg]
+            await util.create_hard_link_clone(selected_revision_dir, 
creating.interim_path)
+
+        if creating.new is None:
+            raise base.ASFQuartException("Internal error: New revision not 
found", errorcode=500)
+        return await session.redirect(
+            get.revisions.selected,
+            success=f"Copied revision {selected_revision_number} to new latest 
revision, {creating.new.number}",
+            project_name=project_name,
+            version_name=version_name,
+        )
diff --git a/atr/routes/__init__.py b/atr/routes/__init__.py
index bec11e9..c4dfc96 100644
--- a/atr/routes/__init__.py
+++ b/atr/routes/__init__.py
@@ -15,9 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 
-import atr.routes.report as report
-import atr.routes.resolve as resolve
-import atr.routes.revisions as revisions
 import atr.routes.root as root
 import atr.routes.sbom as sbom
 import atr.routes.start as start
@@ -27,9 +24,6 @@ import atr.routes.user as user
 import atr.routes.voting as voting
 
 __all__ = [
-    "report",
-    "resolve",
-    "revisions",
     "root",
     "sbom",
     "start",
diff --git a/atr/shared/__init__.py b/atr/shared/__init__.py
index a22b198..e958e06 100644
--- a/atr/shared/__init__.py
+++ b/atr/shared/__init__.py
@@ -32,6 +32,7 @@ import atr.shared.finish as finish
 import atr.shared.ignores as ignores
 import atr.shared.keys as keys
 import atr.shared.projects as projects
+import atr.shared.resolve as resolve
 import atr.shared.vote as vote
 import atr.storage as storage
 import atr.template as template
@@ -186,5 +187,6 @@ __all__ = [
     "ignores",
     "keys",
     "projects",
+    "resolve",
     "vote",
 ]
diff --git a/atr/post/__init__.py b/atr/shared/resolve.py
similarity index 50%
copy from atr/post/__init__.py
copy to atr/shared/resolve.py
index 5e2dfe0..8463a09 100644
--- a/atr/post/__init__.py
+++ b/atr/shared/resolve.py
@@ -15,30 +15,34 @@
 # specific language governing permissions and limitations
 # under the License.
 
-from typing import Final, Literal
-
-import atr.post.announce as announce
-import atr.post.candidate as candidate
-import atr.post.distribution as distribution
-import atr.post.draft as draft
-import atr.post.finish as finish
-import atr.post.ignores as ignores
-import atr.post.keys as keys
-import atr.post.preview as preview
-import atr.post.projects as projects
-import atr.post.vote as vote
-
-ROUTES_MODULE: Final[Literal[True]] = True
-
-__all__ = [
-    "announce",
-    "candidate",
-    "distribution",
-    "draft",
-    "finish",
-    "ignores",
-    "keys",
-    "preview",
-    "projects",
-    "vote",
-]
+
+import atr.forms as forms
+
+
+class ResolveVoteForm(forms.Typed):
+    """Form for resolving a vote."""
+
+    email_body = forms.textarea("Email body", optional=True, rows=24)
+    vote_result = forms.radio(
+        "Vote result",
+        choices=[
+            ("passed", "Passed"),
+            ("failed", "Failed"),
+        ],
+    )
+    submit = forms.submit("Resolve vote")
+
+
+class ResolveVoteManualForm(forms.Typed):
+    """Form for resolving a vote manually."""
+
+    vote_result = forms.radio(
+        "Vote result",
+        choices=[
+            ("passed", "Passed"),
+            ("failed", "Failed"),
+        ],
+    )
+    vote_thread_url = forms.string("Vote thread URL")
+    vote_result_url = forms.string("Vote result URL")
+    submit = forms.submit("Resolve vote")
diff --git a/atr/templates/check-selected-path-table.html 
b/atr/templates/check-selected-path-table.html
index 1134bf9..9f5ed05 100644
--- a/atr/templates/check-selected-path-table.html
+++ b/atr/templates/check-selected-path-table.html
@@ -70,13 +70,13 @@
                    class="btn btn-sm btn-outline-secondary">Show SBOM</a>
               {% endif %}
               {% if has_errors %}
-                <a href="{{ as_url(routes.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
+                <a href="{{ as_url(get.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
                    class="btn btn-sm btn-outline-danger"><i class="bi 
bi-exclamation-triangle me-1"></i> Show {{ info.errors[path]|length }} {{ 
"error" if info.errors[path]|length == 1 else "errors" }}</a>
               {% elif has_warnings %}
-                <a href="{{ as_url(routes.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
+                <a href="{{ as_url(get.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
                    class="btn btn-sm btn-outline-warning">Show {{ 
info.warnings[path]|length }} {{ "warning" if info.warnings[path]|length == 1 
else "warnings" }}</a>
               {% elif info and (path in info.successes) %}
-                <a href="{{ as_url(routes.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
+                <a href="{{ as_url(get.report.selected_path, 
project_name=project_name, version_name=version_name, rel_path=path) }}"
                    class="btn btn-sm btn-outline-success"
                    title="Show report for {{ path }}">Show report</a>
               {% else %}
diff --git a/atr/templates/check-selected-release-info.html 
b/atr/templates/check-selected-release-info.html
index 70804e3..2b055bd 100644
--- a/atr/templates/check-selected-release-info.html
+++ b/atr/templates/check-selected-release-info.html
@@ -25,7 +25,7 @@
         {% if (phase == "release_candidate_draft") and revision_time %}
           <p>
             <strong>Revision:</strong>
-            <a href="{{ as_url(routes.revisions.selected, 
project_name=project_name, version_name=version_name) }}#{{ revision_number }}">
+            <a href="{{ as_url(get.revisions.selected, 
project_name=project_name, version_name=version_name) }}#{{ revision_number }}">
               {{ format_datetime(revision_time) }}
             </a>
             {% if revision_editor %}by {{ revision_editor }}{% endif %}
@@ -54,7 +54,7 @@
             links
           {% endif %}
         </a>
-        <a href="{{ as_url(routes.revisions.selected, 
project_name=release.project.name, version_name=release.version) }}"
+        <a href="{{ as_url(get.revisions.selected, 
project_name=release.project.name, version_name=release.version) }}"
            title="View revision history"
            class="btn btn-secondary"><i class="bi bi-clock-history me-1"></i> 
Revisions</a>
         {% if revision_number %}
@@ -78,10 +78,10 @@
         <a href="{{ as_url(get.candidate.view, 
project_name=release.project.name, version_name=release.version) }}"
            class="btn btn-secondary"><i class="bi bi-eye me-1"></i> View 
files</a>
         {% if can_resolve and release.vote_manual %}
-          <a href="{{ as_url(routes.resolve.manual_selected, 
project_name=release.project.name, version_name=release.version) }}"
+          <a href="{{ as_url(get.resolve.manual_selected, 
project_name=release.project.name, version_name=release.version) }}"
              class="btn btn-success"><i class="bi bi-clipboard-check 
me-1"></i> Resolve vote</a>
         {% elif can_resolve and hidden_form %}
-          <form action="{{ as_url(routes.resolve.tabulated_selected_post, 
project_name=release.project.name, version_name=release.version) }}"
+          <form action="{{ as_url(post.resolve.tabulated_selected_post, 
project_name=release.project.name, version_name=release.version) }}"
                 method="post"
                 class="mb-0">
             {{ hidden_form.hidden_tag() }}
diff --git a/atr/templates/finish-selected.html 
b/atr/templates/finish-selected.html
index ffe4e92..34794c5 100644
--- a/atr/templates/finish-selected.html
+++ b/atr/templates/finish-selected.html
@@ -81,7 +81,7 @@
           Show files
         </a>
         <a title="Show revisions for {{ release.name }}"
-           href="{{ as_url(routes.revisions.selected, 
project_name=release.project.name, version_name=release.version) }}"
+           href="{{ as_url(get.revisions.selected, 
project_name=release.project.name, version_name=release.version) }}"
            class="btn btn-secondary me-2">
           <i class="bi bi-clock-history"></i>
           Show revisions
diff --git a/atr/templates/resolve-tabulated.html 
b/atr/templates/resolve-tabulated.html
index dc24d14..2d885f4 100644
--- a/atr/templates/resolve-tabulated.html
+++ b/atr/templates/resolve-tabulated.html
@@ -116,7 +116,7 @@
       If, after careful manual review of the information above, you concur 
with the automatically determined outcome of the vote, please enter the 
resolution email body here. Sending this will send the email to a new vote 
result thread, and the vote will be resolved.
     </p>
     <form class="atr-canary py-3 px-4 mb-4 border rounded"
-          action="{{ as_url(routes.resolve.submit_selected, 
project_name=release.project.name, version_name=release.version) }}"
+          action="{{ as_url(post.resolve.submit_selected, 
project_name=release.project.name, version_name=release.version) }}"
           method="post">
       {{ forms.errors_summary(resolve_form) }}
       {{ resolve_form.hidden_tag() }}
diff --git a/atr/templates/revisions-selected.html 
b/atr/templates/revisions-selected.html
index 8ba4049..98e031a 100644
--- a/atr/templates/revisions-selected.html
+++ b/atr/templates/revisions-selected.html
@@ -119,7 +119,7 @@
             <h3 class="fs-6 fw-semibold mt-3 atr-sans">Actions</h3>
             <div class="mt-3">
               <form method="post"
-                    action="{{ as_url(routes.revisions.selected_post, 
project_name=project_name, version_name=version_name) }}">
+                    action="{{ as_url(post.revisions.selected_post, 
project_name=project_name, version_name=version_name) }}">
                 {{ empty_form.hidden_tag() }}
 
                 <input type="hidden" name="revision_number" value="{{ 
revision.number }}" />


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

Reply via email to