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 b8d8184 Refactor the release policy form code to make room for tag
forms
b8d8184 is described below
commit b8d818495565562a252d82043559c89f370bee3b
Author: Sean B. Palmer <[email protected]>
AuthorDate: Fri May 30 14:28:33 2025 +0100
Refactor the release policy form code to make room for tag forms
---
atr/routes/projects.py | 121 +++++++++++++++++++++-------------------
atr/templates/project-view.html | 70 +++++++++++------------
2 files changed, 100 insertions(+), 91 deletions(-)
diff --git a/atr/routes/projects.py b/atr/routes/projects.py
index 5574235..84676e1 100644
--- a/atr/routes/projects.py
+++ b/atr/routes/projects.py
@@ -211,7 +211,7 @@ async def select(session: routes.CommitterSession) -> str:
@routes.committer("/projects/<name>", methods=["GET", "POST"])
async def view(session: routes.CommitterSession, name: str) ->
response.Response | str:
- form = None
+ policy_form = None
can_edit_policy = False
async with db.session() as data:
project = await data.project(name=name,
_committee_public_signing_keys=True, _release_policy=True).demand(
@@ -222,62 +222,71 @@ async def view(session: routes.CommitterSession, name:
str) -> response.Response
can_edit_policy = user.is_committee_member(project.committee,
session.uid) or user.is_admin(session.uid)
if can_edit_policy:
- if quart.request.method == "POST":
- form = await ReleasePolicyForm.create_form(data=await
quart.request.form)
- if await form.validate_on_submit():
- release_policy = project.release_policy
- if release_policy is None:
- release_policy = models.ReleasePolicy(project=project)
- project.release_policy = release_policy
- data.add(release_policy)
-
- release_policy.mailto_addresses =
[util.unwrap(form.mailto_addresses.entries[0].data)]
- release_policy.manual_vote =
util.unwrap(form.manual_vote.data)
- release_policy.release_checklist =
util.unwrap(form.release_checklist.data)
- _set_default_fields(form, project, release_policy)
-
- release_policy.pause_for_rm =
util.unwrap(form.pause_for_rm.data)
- await data.commit()
- await quart.flash("Release policy updated successfully.",
"success")
- return quart.redirect(util.as_url(view, name=project.name))
-
- if form is None:
- form = await ReleasePolicyForm.create_form()
- form.project_name.data = project.name
- if project.policy_mailto_addresses:
- form.mailto_addresses.entries[0].data =
project.policy_mailto_addresses[0]
- else:
- form.mailto_addresses.entries[0].data =
f"dev@{project.name}.apache.org"
- form.min_hours.data = project.policy_min_hours
- form.manual_vote.data = project.policy_manual_vote
- form.release_checklist.data = project.policy_release_checklist
- form.start_vote_template.data =
project.policy_start_vote_template
- form.announce_release_template.data =
project.policy_announce_release_template
- form.pause_for_rm.data = project.policy_pause_for_rm
-
- # Set the hashes and value of the current defaults
- form.default_start_vote_template_hash.data =
util.compute_sha3_256(
- project.policy_start_vote_default.encode()
- )
- form.default_announce_release_template_hash.data =
util.compute_sha3_256(
- project.policy_announce_release_default.encode()
- )
- form.default_min_hours_value_at_render.data =
str(project.policy_default_min_hours)
-
- return await template.render(
- "project-view.html",
- project=project,
- algorithms=routes.algorithms,
- candidate_drafts=await project.candidate_drafts,
- candidates=await project.candidates,
- previews=await project.previews,
- full_releases=await project.full_releases,
- number_of_release_files=util.number_of_release_files,
- now=datetime.datetime.now(datetime.UTC),
- empty_form=await util.EmptyForm.create_form(),
- form=form,
- can_edit_policy=can_edit_policy,
+ edited, policy_form = await _edit_policy(data, policy_form,
project)
+ if edited is True:
+ await quart.flash("Release policy updated successfully.",
"success")
+ return quart.redirect(util.as_url(view, name=project.name))
+
+ return await template.render(
+ "project-view.html",
+ project=project,
+ algorithms=routes.algorithms,
+ candidate_drafts=await project.candidate_drafts,
+ candidates=await project.candidates,
+ previews=await project.previews,
+ full_releases=await project.full_releases,
+ number_of_release_files=util.number_of_release_files,
+ now=datetime.datetime.now(datetime.UTC),
+ empty_form=await util.EmptyForm.create_form(),
+ policy_form=policy_form,
+ can_edit_policy=can_edit_policy,
+ )
+
+
+async def _edit_policy(
+ data: db.Session, policy_form: ReleasePolicyForm | None, project:
models.Project
+) -> tuple[bool, ReleasePolicyForm | None]:
+ if quart.request.method == "POST":
+ policy_form = await ReleasePolicyForm.create_form(data=await
quart.request.form)
+ if await policy_form.validate_on_submit():
+ release_policy = project.release_policy
+ if release_policy is None:
+ release_policy = models.ReleasePolicy(project=project)
+ project.release_policy = release_policy
+ data.add(release_policy)
+
+ release_policy.mailto_addresses =
[util.unwrap(policy_form.mailto_addresses.entries[0].data)]
+ release_policy.manual_vote =
util.unwrap(policy_form.manual_vote.data)
+ release_policy.release_checklist =
util.unwrap(policy_form.release_checklist.data)
+ _set_default_fields(policy_form, project, release_policy)
+
+ release_policy.pause_for_rm =
util.unwrap(policy_form.pause_for_rm.data)
+ await data.commit()
+ return True, None
+
+ if policy_form is None:
+ policy_form = await ReleasePolicyForm.create_form()
+ policy_form.project_name.data = project.name
+ if project.policy_mailto_addresses:
+ policy_form.mailto_addresses.entries[0].data =
project.policy_mailto_addresses[0]
+ else:
+ policy_form.mailto_addresses.entries[0].data =
f"dev@{project.name}.apache.org"
+ policy_form.min_hours.data = project.policy_min_hours
+ policy_form.manual_vote.data = project.policy_manual_vote
+ policy_form.release_checklist.data = project.policy_release_checklist
+ policy_form.start_vote_template.data =
project.policy_start_vote_template
+ policy_form.announce_release_template.data =
project.policy_announce_release_template
+ policy_form.pause_for_rm.data = project.policy_pause_for_rm
+
+ # Set the hashes and value of the current defaults
+ policy_form.default_start_vote_template_hash.data =
util.compute_sha3_256(
+ project.policy_start_vote_default.encode()
+ )
+ policy_form.default_announce_release_template_hash.data =
util.compute_sha3_256(
+ project.policy_announce_release_default.encode()
)
+ policy_form.default_min_hours_value_at_render.data =
str(project.policy_default_min_hours)
+ return False, policy_form
async def _add_project(form: AddFormProtocol, asf_id: str) ->
response.Response:
diff --git a/atr/templates/project-view.html b/atr/templates/project-view.html
index 81fa53e..1a75a4f 100644
--- a/atr/templates/project-view.html
+++ b/atr/templates/project-view.html
@@ -59,86 +59,86 @@
<h3 class="mb-0">Release policy</h3>
</div>
<div class="card-body">
- {% if can_edit_policy and form %}
+ {% if can_edit_policy and policy_form %}
<form method="post"
action="{{ as_url(routes.projects.view, name=project.name) }}"
class="atr-canary py-4 px-5"
novalidate>
- {{ form.hidden_tag() if form.hidden_tag }}
- {{ form.project_name(value=project.name) }}
- {{ form.default_start_vote_template_hash() }}
- {{ form.default_announce_release_template_hash() }}
- {{ form.default_min_hours_value_at_render() }}
+ {{ policy_form.hidden_tag() if policy_form.hidden_tag }}
+ {{ policy_form.project_name(value=project.name) }}
+ {{ policy_form.default_start_vote_template_hash() }}
+ {{ policy_form.default_announce_release_template_hash() }}
+ {{ policy_form.default_min_hours_value_at_render() }}
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.mailto_addresses.entries[0], col="md3") }}
+ {{ forms.label(policy_form.mailto_addresses.entries[0], col="md3")
}}
<div class="col-sm-8">
- {{ forms.widget(form.mailto_addresses.entries[0]) }}
- {{ forms.errors(form.mailto_addresses.entries[0]) }}
- {{ forms.description(form.mailto_addresses.entries[0]) }}
+ {{ forms.widget(policy_form.mailto_addresses.entries[0]) }}
+ {{ forms.errors(policy_form.mailto_addresses.entries[0]) }}
+ {{ forms.description(policy_form.mailto_addresses.entries[0]) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.manual_vote, col="md3-high") }}
+ {{ forms.label(policy_form.manual_vote, col="md3-high") }}
<div class="col-sm-8">
<div class="form-check">
- {{ forms.widget(form.manual_vote, classes="form-check-input",
boolean_label="Enable") }}
- {{ forms.errors(form.manual_vote, classes="invalid-feedback
d-block") }}
+ {{ forms.widget(policy_form.manual_vote,
classes="form-check-input", boolean_label="Enable") }}
+ {{ forms.errors(policy_form.manual_vote,
classes="invalid-feedback d-block") }}
</div>
- {{ forms.description(form.manual_vote) }}
+ {{ forms.description(policy_form.manual_vote) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.min_hours, col="md3") }}
+ {{ forms.label(policy_form.min_hours, col="md3") }}
<div class="col-sm-8">
- {{ forms.widget(form.min_hours) }}
- {{ forms.errors(form.min_hours) }}
- {{ forms.description(form.min_hours) }}
+ {{ forms.widget(policy_form.min_hours) }}
+ {{ forms.errors(policy_form.min_hours) }}
+ {{ forms.description(policy_form.min_hours) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.release_checklist, col="md3") }}
+ {{ forms.label(policy_form.release_checklist, col="md3") }}
<div class="col-sm-8">
- {{ forms.widget(form.release_checklist, rows="10",
classes="form-control font-monospace") }}
- {{ forms.errors(form.release_checklist) }}
- {{ forms.description(form.release_checklist) }}
+ {{ forms.widget(policy_form.release_checklist, rows="10",
classes="form-control font-monospace") }}
+ {{ forms.errors(policy_form.release_checklist) }}
+ {{ forms.description(policy_form.release_checklist) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.start_vote_template, col="md3") }}
+ {{ forms.label(policy_form.start_vote_template, col="md3") }}
<div class="col-sm-8">
- {{ forms.widget(form.start_vote_template, rows="10",
classes="form-control font-monospace") }}
- {{ forms.errors(form.start_vote_template) }}
- {{ forms.description(form.start_vote_template) }}
+ {{ forms.widget(policy_form.start_vote_template, rows="10",
classes="form-control font-monospace") }}
+ {{ forms.errors(policy_form.start_vote_template) }}
+ {{ forms.description(policy_form.start_vote_template) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.announce_release_template, col="md3") }}
+ {{ forms.label(policy_form.announce_release_template, col="md3") }}
<div class="col-sm-8">
- {{ forms.widget(form.announce_release_template, rows="10",
classes="form-control font-monospace") }}
- {{ forms.errors(form.announce_release_template) }}
- {{ forms.description(form.announce_release_template) }}
+ {{ forms.widget(policy_form.announce_release_template,
rows="10", classes="form-control font-monospace") }}
+ {{ forms.errors(policy_form.announce_release_template) }}
+ {{ forms.description(policy_form.announce_release_template) }}
</div>
</div>
<div class="mb-3 pb-3 row border-bottom">
- {{ forms.label(form.pause_for_rm, col="md3-high") }}
+ {{ forms.label(policy_form.pause_for_rm, col="md3-high") }}
<div class="col-sm-8">
<div class="form-check">
- {{ forms.widget(form.pause_for_rm, classes="form-check-input",
boolean_label="Enable") }}
- {{ forms.errors(form.pause_for_rm, classes="invalid-feedback
d-block") }}
+ {{ forms.widget(policy_form.pause_for_rm,
classes="form-check-input", boolean_label="Enable") }}
+ {{ forms.errors(policy_form.pause_for_rm,
classes="invalid-feedback d-block") }}
</div>
- {{ forms.description(form.pause_for_rm) }}
+ {{ forms.description(policy_form.pause_for_rm) }}
</div>
</div>
<div class="row">
- <div class="col-sm-9 offset-sm-3">{{ form.submit(class_="btn
btn-primary mt-2") }}</div>
+ <div class="col-sm-9 offset-sm-3">{{
policy_form.submit(class_="btn btn-primary mt-2") }}</div>
</div>
</form>
{% elif project.release_policy or project.name %}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]