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]