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 878945f  Add hidden field widgets, and make other small form 
improvements
878945f is described below

commit 878945f27101c080a6fd9834f331a54a8a326903
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Nov 10 18:53:02 2025 +0000

    Add hidden field widgets, and make other small form improvements
---
 atr/form.py       | 21 ++++++++++++++++++---
 atr/get/manual.py |  2 +-
 atr/get/test.py   |  8 ++++----
 atr/get/upload.py |  4 ++--
 atr/get/user.py   |  4 ++--
 atr/get/vote.py   |  2 +-
 atr/get/voting.py |  2 +-
 7 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/atr/form.py b/atr/form.py
index 528e139..aa7c153 100644
--- a/atr/form.py
+++ b/atr/form.py
@@ -60,6 +60,7 @@ class Widget(enum.Enum):
     EMAIL = "email"
     FILE = "file"
     FILES = "files"
+    HIDDEN = "hidden"
     NUMBER = "number"
     RADIO = "radio"
     SELECT = "select"
@@ -227,7 +228,7 @@ def _get_flash_error_data() -> dict[str, Any]:
     return {}
 
 
-async def render(
+def render(
     model_cls: type[Form],
     action: str | None = None,
     form_classes: str = ".atr-canary",
@@ -239,11 +240,13 @@ async def render(
     errors: dict[str, list[str]] | None = None,
     use_error_data: bool = True,
     custom: dict[str, htm.Element | htm.VoidElement] | None = None,
+    empty: bool = False,
 ) -> htm.Element:
     if action is None:
         action = quart.request.path
 
     is_empty_form = isinstance(model_cls, type) and issubclass(model_cls, 
Empty)
+    is_empty_form |= empty
     if is_empty_form and (form_classes == ".atr-canary"):
         form_classes = ""
 
@@ -295,8 +298,8 @@ async def render(
     return htm.form(form_classes, action=action, method="post", 
enctype="multipart/form-data")[form_children]
 
 
-async def render_block(block: htm.Block, *args, **kwargs) -> None:
-    rendered = await render(*args, **kwargs)
+def render_block(block: htm.Block, *args, **kwargs) -> None:
+    rendered = render(*args, **kwargs)
     block.append(rendered)
 
 
@@ -519,6 +522,12 @@ def _render_widget(  # noqa: C901
             attrs = {**base_attrs, "multiple": ""}
             widget = htpy.input(type="file", **attrs)
 
+        case Widget.HIDDEN:
+            attrs = {"type": "hidden", "name": field_name, "id": field_name}
+            if field_value is not None:
+                attrs["value"] = str(field_value)
+            widget = htpy.input(**attrs)
+
         case Widget.NUMBER:
             attrs = {**base_attrs, "type": "number"}
             attrs["value"] = "0" if (field_value is None) else str(field_value)
@@ -748,6 +757,12 @@ def _render_row(
         default_value = field_info.default
         return htpy.input(type="hidden", name=DISCRIMINATOR_NAME, 
value=default_value), None
 
+    if widget_type == Widget.HIDDEN:
+        attrs = {"type": "hidden", "name": field_name, "id": field_name}
+        if field_value is not None:
+            attrs["value"] = str(field_value)
+        return htpy.input(**attrs), None
+
     label_text = field_info.description or field_name.replace("_", " ").title()
     is_required = field_info.is_required()
 
diff --git a/atr/get/manual.py b/atr/get/manual.py
index a49b662..6d890f7 100644
--- a/atr/get/manual.py
+++ b/atr/get/manual.py
@@ -92,7 +92,7 @@ async def _render_page(release, revision: str) -> htm.Element:
     ]
 
     cancel_url = util.as_url(compose.selected, 
project_name=release.project.name, version_name=release.version)
-    manual_form = await form.render(
+    manual_form = form.render(
         model_cls=form.Empty,
         submit_label="Start manual vote",
         cancel_url=cancel_url,
diff --git a/atr/get/test.py b/atr/get/test.py
index e24e986..3f3bf80 100644
--- a/atr/get/test.py
+++ b/atr/get/test.py
@@ -30,7 +30,7 @@ import atr.web as web
 
 @get.public("/test/empty")
 async def test_empty(session: web.Committer | None) -> str:
-    empty_form = await form.render(
+    empty_form = form.render(
         model_cls=form.Empty,
         submit_label="Submit empty form",
         action="/test/empty",
@@ -67,13 +67,13 @@ async def test_login(session: web.Committer | None) -> 
web.WerkzeugResponse:
 
 @get.public("/test/multiple")
 async def test_multiple(session: web.Committer | None) -> str:
-    apple_form = await form.render(
+    apple_form = form.render(
         model_cls=shared.test.AppleForm,
         submit_label="Order apples",
         action="/test/multiple",
     )
 
-    banana_form = await form.render(
+    banana_form = form.render(
         model_cls=shared.test.BananaForm,
         submit_label="Order bananas",
         action="/test/multiple",
@@ -102,7 +102,7 @@ async def test_single(session: web.Committer | None) -> str:
         htpy.label(class_="btn btn-outline-danger", for_="vote_2")["-1"],
     ]
 
-    single_form = await form.render(
+    single_form = form.render(
         model_cls=shared.test.SingleForm,
         submit_label="Submit",
         action="/test/single",
diff --git a/atr/get/upload.py b/atr/get/upload.py
index 850391e..8bfa66f 100644
--- a/atr/get/upload.py
+++ b/atr/get/upload.py
@@ -63,7 +63,7 @@ async def selected(session: web.Committer, project_name: str, 
version_name: str)
     block.h2(id="file-upload")["File upload"]
     block.p["Use this form to add files to this candidate draft."]
 
-    await form.render_block(
+    form.render_block(
         block,
         model_cls=shared.upload.AddFilesForm,
         submit_label="Add files",
@@ -80,7 +80,7 @@ async def selected(session: web.Committer, project_name: str, 
version_name: str)
         " page for this draft once the task is queued.",
     ]
 
-    await form.render_block(
+    form.render_block(
         block,
         model_cls=shared.upload.SvnImportForm,
         submit_label="Queue SVN import task",
diff --git a/atr/get/user.py b/atr/get/user.py
index 0a247bf..a28f6aa 100644
--- a/atr/get/user.py
+++ b/atr/get/user.py
@@ -61,7 +61,7 @@ async def cache_get(session: web.Committer) -> str:
 
         block.h3["Delete cache"]
         block.p["Remove your cached session information:"]
-        delete_cache_form = await form.render(
+        delete_cache_form = form.render(
             model_cls=shared.user.DeleteCacheForm,
             submit_label="Delete my cache",
             submit_classes="btn-danger",
@@ -73,7 +73,7 @@ async def cache_get(session: web.Committer) -> str:
 
         block.h3["Cache current session"]
         block.p["Press the button below to cache your current session 
information:"]
-        cache_form = await form.render(
+        cache_form = form.render(
             model_cls=shared.user.CacheUserForm,
             submit_label="Cache me!",
             submit_classes="btn-primary",
diff --git a/atr/get/vote.py b/atr/get/vote.py
index f21c8e8..87bdb32 100644
--- a/atr/get/vote.py
+++ b/atr/get/vote.py
@@ -117,7 +117,7 @@ async def selected(session: web.Committer | None, 
project_name: str, version_nam
             htpy.label(class_="btn btn-outline-danger", 
for_="decision_2")[f"-1 ({potency})"],
         ]
 
-        cast_vote_form = await form.render(
+        cast_vote_form = form.render(
             model_cls=shared.vote.CastVoteForm,
             submit_label="Submit vote",
             form_classes=".atr-canary.py-4.px-5.mb-4.border.rounded",
diff --git a/atr/get/voting.py b/atr/get/voting.py
index b55b543..2dd97de 100644
--- a/atr/get/voting.py
+++ b/atr/get/voting.py
@@ -139,7 +139,7 @@ async def _render_page(
         project_name=release.project.name,
         version_name=release.version,
     )
-    vote_form = await form.render(
+    vote_form = form.render(
         model_cls=shared.voting.StartVotingForm,
         submit_label="Send vote email",
         cancel_url=cancel_url,


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

Reply via email to