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]

Reply via email to