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 a625b7c  Add a macro for rendering form inputs
a625b7c is described below

commit a625b7cb64f702b688a67254c8c84e6f03122037
Author: Sean B. Palmer <s...@miscoranda.com>
AuthorDate: Mon May 12 20:34:54 2025 +0100

    Add a macro for rendering form inputs
---
 Makefile                               |  2 +-
 atr/routes/projects.py                 | 13 ++++++++++---
 atr/templates/layouts/base.html        |  1 +
 atr/templates/macros/forms.html        | 29 +++++++++++++++++++++++++++++
 atr/templates/release-policy-form.html | 31 +++++++++++++------------------
 5 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/Makefile b/Makefile
index c88b1e7..6dd33d9 100644
--- a/Makefile
+++ b/Makefile
@@ -73,7 +73,7 @@ serve:
          --keyfile key.pem --certfile cert.pem atr.server:app --debug --reload
 
 serve-local:
-       APP_HOST=127.0.0.1:8080 LOCAL_DEBUG=1 \
+       APP_HOST=127.0.0.1:8080 LOCAL_DEBUG=1 SECRET_KEY=insecure-local-key \
          SSH_HOST=127.0.0.1 $(SCRIPTS)/run hypercorn --bind $(BIND) \
          --keyfile key.pem --certfile cert.pem atr.server:app --debug --reload
 
diff --git a/atr/routes/projects.py b/atr/routes/projects.py
index 672bbd0..f6165a0 100644
--- a/atr/routes/projects.py
+++ b/atr/routes/projects.py
@@ -56,6 +56,7 @@ class ReleasePolicyForm(util.QuartFormTyped):
                 wtforms.validators.InputRequired("Please provide a valid email 
address"),
                 wtforms.validators.Email(),
             ],
+            render_kw={"size": 30},
         ),
         min_entries=1,
     )
@@ -68,9 +69,15 @@ class ReleasePolicyForm(util.QuartFormTyped):
         default=72,
     )
     manual_vote = wtforms.BooleanField("Voting process:")
-    release_checklist = wtforms.StringField("Release checklist:", 
widget=wtforms.widgets.TextArea())
-    start_vote_template = wtforms.StringField("Start vote template:", 
widget=wtforms.widgets.TextArea())
-    announce_release_template = wtforms.StringField("Announce release 
template:", widget=wtforms.widgets.TextArea())
+    release_checklist = wtforms.StringField(
+        "Release checklist:", widget=wtforms.widgets.TextArea(), 
render_kw={"rows": 10}
+    )
+    start_vote_template = wtforms.StringField(
+        "Start vote template:", widget=wtforms.widgets.TextArea(), 
render_kw={"rows": 10}
+    )
+    announce_release_template = wtforms.StringField(
+        "Announce release template:", widget=wtforms.widgets.TextArea(), 
render_kw={"rows": 10}
+    )
     pause_for_rm = wtforms.BooleanField("Pause for RM:")
 
     submit = wtforms.SubmitField("Save")
diff --git a/atr/templates/layouts/base.html b/atr/templates/layouts/base.html
index 2514c46..6074860 100644
--- a/atr/templates/layouts/base.html
+++ b/atr/templates/layouts/base.html
@@ -45,6 +45,7 @@
             {% endif %}
             {% from "macros/flash.html" import render_flash_messages %}
             {{ render_flash_messages() }}
+            {% import 'macros/forms.html' as forms %}
             {% block content %}
             {% endblock content %}
           </main>
diff --git a/atr/templates/macros/forms.html b/atr/templates/macros/forms.html
new file mode 100644
index 0000000..aaaeb67
--- /dev/null
+++ b/atr/templates/macros/forms.html
@@ -0,0 +1,29 @@
+{% macro render_field(field, label=False, class_='form-control') %}
+  {% if label and field.label %}{{ field.label(class="form-label") }}{% endif 
%}
+  {% set field_class = class_ + (' is-invalid' if field.errors else '') %}
+  {{ field(class_=field_class) }}
+  {% if field.errors %}
+    <div class="invalid-feedback">
+      {% for error in field.errors %}
+        {{ error }}
+        {% if not loop.last %}<br />{% endif %}
+      {% endfor %}
+    </div>
+  {% endif %}
+  {% if field.description %}<div class="form-text text-muted">{{ 
field.description }}</div>{% endif %}
+{% endmacro %}
+
+{% macro render_checkbox(field, label=False, class_='form-check-input') %}
+  {% set field_class = class_ + (' is-invalid' if field.errors else '') %}
+  {{ field(class_=field_class) }}
+  {% if label and field.label %}{{ field.label(class="form-check-label") }}{% 
endif %}
+  {% if field.errors %}
+    <div class="invalid-feedback d-block">
+      {% for error in field.errors %}
+        {{ error }}
+        {% if not loop.last %}<br />{% endif %}
+      {% endfor %}
+    </div>
+  {% endif %}
+  {% if field.description %}<div class="form-text text-muted">{{ 
field.description }}</div>{% endif %}
+{% endmacro %}
diff --git a/atr/templates/release-policy-form.html 
b/atr/templates/release-policy-form.html
index b170197..7d38b9f 100644
--- a/atr/templates/release-policy-form.html
+++ b/atr/templates/release-policy-form.html
@@ -1,4 +1,3 @@
-
 <form method="post"
       enctype="multipart/form-data"
       class="atr-canary py-4 px-5"
@@ -17,10 +16,7 @@
     <label for="{{ form.mailto_addresses.entries[0].id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.mailto_addresses.entries[0].label.text }}:</label>
     <div class="col-sm-8">
-      {{ form.mailto_addresses.entries[0](size=30, class_="form-control" + (" 
is-invalid" if form.mailto_addresses[0].errors else "")) }}
-      {% if form.mailto_addresses[0].errors %}
-        {% for error in form.mailto_addresses[0].errors %}<div 
class="invalid-feedback">{{ error }}</div>{% endfor %}
-      {% endif %}
+      {{ forms.render_field(form.mailto_addresses.entries[0]) }}
       <span class="form-text text-muted">Note: This field determines where 
vote and finished release announcement emails are sent. You can set this value 
to your own mailing list, but ATR will currently only let you send to 
<code>user-te...@tooling.apache.org</code>.</span>
     </div>
     <!--
@@ -34,9 +30,10 @@
     <label for="{{ form.manual_vote.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.manual_vote.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.manual_vote(class_="form-check-input") }}
-      <label class="form-check-label">Manual</label>
-      <br />
+      <div class="form-check">
+        {{ forms.render_checkbox(form.manual_vote) }}
+        <label class="form-check-label" for="{{ form.manual_vote.id 
}}">Manual</label>
+      </div>
       <span id="manual_vote-help" class="form-text text-muted">If this is set 
then the vote will be completely manual and following policy is ignored.</span>
     </div>
   </div>
@@ -45,11 +42,8 @@
     <label for="{{ form.min_hours.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.min_hours.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.min_hours(class_="form-control" + (" is-invalid" if 
form.min_hours.errors else "") ) }}
+      {{ forms.render_field(form.min_hours) }}
       <span id="min_hours-help" class="form-text text-muted">The minimum time 
to run the vote, in hours. Must be 0 or between 72 and 144 inclusive. If 0, 
then wait until 3 +1 votes and more +1 than -1.</span>
-      {% if form.min_hours.errors %}
-        {% for error in form.min_hours.errors %}<div 
class="invalid-feedback">{{ error }}</div>{% endfor %}
-      {% endif %}
     </div>
   </div>
 
@@ -57,7 +51,7 @@
     <label for="{{ form.release_checklist.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.release_checklist.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.release_checklist(rows=10, class_="form-control") }}
+      {{ forms.render_field(form.release_checklist) }}
       <span id="release_checklist-help" class="form-text text-muted">Markdown 
text describing how to test release candidates.</span>
     </div>
   </div>
@@ -66,7 +60,7 @@
     <label for="{{ form.start_vote_template.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.start_vote_template.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.start_vote_template(rows=10, class_="form-control") }}
+      {{ forms.render_field(form.start_vote_template) }}
       <span id="start_vote_template-help" class="form-text text-muted">Email 
template for messages to start a vote on a release.</span>
     </div>
   </div>
@@ -75,7 +69,7 @@
     <label for="{{ form.announce_release_template.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.announce_release_template.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.announce_release_template(rows=10, class_="form-control") }}
+      {{ forms.render_field(form.announce_release_template) }}
       <span id="announce_release_template-help" class="form-text 
text-muted">Email template for messages to announce a finished release.</span>
     </div>
   </div>
@@ -84,9 +78,10 @@
     <label for="{{ form.pause_for_rm.id }}"
            class="col-sm-3 col-form-label text-sm-end">{{ 
form.pause_for_rm.label.text }}</label>
     <div class="col-sm-8">
-      {{ form.pause_for_rm(class_="form-check-input") }}
-      <label class="form-check-label">Enabled</label>
-      <br />
+      <div class="form-check">
+        {{ forms.render_checkbox(form.pause_for_rm) }}
+        <label class="form-check-label" for="{{ form.pause_for_rm.id 
}}">Enabled</label>
+      </div>
       <span id="pause_for_rm-help" class="form-text text-muted">If enabled, RM 
can confirm manually if the vote has passed.</span>
     </div>
   </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@tooling.apache.org
For additional commands, e-mail: commits-h...@tooling.apache.org

Reply via email to