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 5db6a14 Migrate the remaining use of the previous code to start a vote
5db6a14 is described below
commit 5db6a14d8ad3ae695661035a35cd1e3d8f40e747
Author: Sean B. Palmer <[email protected]>
AuthorDate: Fri Sep 5 16:47:01 2025 +0100
Migrate the remaining use of the previous code to start a vote
---
atr/routes/resolve.py | 33 ++++++++++++++------------
atr/routes/voting.py | 64 ---------------------------------------------------
2 files changed, 18 insertions(+), 79 deletions(-)
diff --git a/atr/routes/resolve.py b/atr/routes/resolve.py
index 2e56625..0705112 100644
--- a/atr/routes/resolve.py
+++ b/atr/routes/resolve.py
@@ -29,7 +29,7 @@ import atr.routes as routes
import atr.routes.compose as compose
import atr.routes.finish as finish
import atr.routes.vote as vote
-import atr.routes.voting as voting
+import atr.storage as storage
import atr.tabulate as tabulate
import atr.tasks.message as message
import atr.template as template
@@ -332,20 +332,23 @@ async def _resolve_vote(
revision_number = release.latest_revision_number
if revision_number is None:
raise ValueError("Release has no revision number")
- await voting.start_vote(
- email_to=incubator_vote_address,
- permitted_recipients=[incubator_vote_address],
- project_name=release.project.name,
- version_name=release.version,
- selected_revision_number=revision_number,
- session=session,
-
vote_duration_choice=latest_vote_task.task_args["vote_duration"],
- subject_data=f"[VOTE] Release {release.project.display_name}
{release.version}",
- body_data=await
construct.start_vote_default(release.project.name),
- data=data,
- release=release,
- promote=False,
- )
+ if release.committee is None:
+ raise ValueError("Project has no committee")
+ async with
storage.write_as_committee_member(release.committee.name) as wacm:
+ await wacm.vote.start(
+ email_to=incubator_vote_address,
+ permitted_recipients=[incubator_vote_address],
+ project_name=release.project.name,
+ version_name=release.version,
+ selected_revision_number=revision_number,
+ asf_uid=session.uid,
+ asf_fullname=session.fullname,
+
vote_duration_choice=latest_vote_task.task_args["vote_duration"],
+ subject_data=f"[VOTE] Release
{release.project.display_name} {release.version}",
+ body_data=await
construct.start_vote_default(release.project.name),
+ release=release,
+ promote=False,
+ )
success_message = "Project PPMC vote marked as passed, and
Incubator PMC vote automatically started"
elif vote_result == "passed":
release.phase = sql.ReleasePhase.RELEASE_PREVIEW
diff --git a/atr/routes/voting.py b/atr/routes/voting.py
index 66b119a..7691814 100644
--- a/atr/routes/voting.py
+++ b/atr/routes/voting.py
@@ -33,7 +33,6 @@ import atr.routes.compose as compose
import atr.routes.root as root
import atr.routes.vote as vote
import atr.storage as storage
-import atr.tasks.vote as tasks_vote
import atr.template as template
import atr.user as user
import atr.util as util
@@ -112,69 +111,6 @@ async def selected_revision(
)
-async def start_vote(
- email_to: str,
- permitted_recipients: list[str],
- project_name: str,
- version_name: str,
- selected_revision_number: str,
- session: routes.CommitterSession,
- vote_duration_choice: int,
- subject_data: str,
- body_data: str,
- data: db.Session,
- release: sql.Release,
- promote: bool = True,
-) -> response.Response | str:
- if email_to not in permitted_recipients:
- # This will be checked again by tasks/vote.py for extra safety
- log.info(f"Invalid mailing list choice: {email_to} not in
{permitted_recipients}")
- raise base.ASFQuartException("Invalid mailing list choice",
errorcode=400)
-
- if promote is True:
- # This verifies the state and sets the phase to RELEASE_CANDIDATE
- error = await interaction.promote_release(data, release.name,
selected_revision_number, vote_manual=False)
- if error:
- return await session.redirect(root.index, error=error)
-
- # TODO: We also need to store the duration of the vote
- # We can't allow resolution of the vote until the duration has elapsed
- # But we allow the user to specify in the form
- # And yet we also have ReleasePolicy.min_hours
- # Presumably this sets the default, and the form takes precedence?
- # ReleasePolicy.min_hours can also be 0, though
-
- # Create a task for vote initiation
- task = sql.Task(
- status=sql.TaskStatus.QUEUED,
- task_type=sql.TaskType.VOTE_INITIATE,
- task_args=tasks_vote.Initiate(
- release_name=release.name,
- email_to=email_to,
- vote_duration=vote_duration_choice,
- initiator_id=session.uid,
- initiator_fullname=session.fullname,
- subject=subject_data,
- body=body_data,
- ).model_dump(),
- asf_uid=util.unwrap(session.uid),
- project_name=project_name,
- version_name=version_name,
- )
- data.add(task)
- await data.commit()
-
- # TODO: We should log all outgoing email and the session so that users can
confirm
- # And can be warned if there was a failure
- # (The message should be shown on the vote resolution page)
- return await session.redirect(
- vote.selected,
- success=f"The vote announcement email will soon be sent to
{email_to}.",
- project_name=project_name,
- version_name=version_name,
- )
-
-
async def start_vote_manual(
release: sql.Release,
selected_revision_number: str,
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]