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]