Add required pronouns dropdown and fix admin vocal gender selector

- Added a required Pronouns dropdown to /request and /admin/request:
  He/Him/His, She/Her/Hers, They/Them/Their.
- Moved Email to the top of the customer request form; Pronouns sit just below Name.
- Added  column to the requests schema with automatic migration.
- Stored pronouns are included in confirmation emails and Hermes prompt copy.
- Fixed /admin/request so Preferred singer voice / gender is a dropdown
  matching the customer form instead of a free-text input.
- Updated README to describe pronouns and the structured style selectors.

Bumps version to 0.4.7.
This commit is contained in:
Troll (Hermes Agent) 2026-08-05 17:21:38 +00:00
parent 10ee182558
commit 3f7bbf4b12
6 changed files with 65 additions and 17 deletions

11
app.py
View file

@ -529,6 +529,10 @@ def request_form():
decade = request.form.get('decade', '').strip()
basic_style = request.form.get('basic_style', '').strip()
additional_style = request.form.get('additional_style', '').strip()
pronouns = request.form.get('pronouns', '').strip()
if not pronouns:
flash('Please select your pronouns.', 'error')
return render_template('request.html', form=request.form, decades=DECADES, genres=MUSIC_GENRES), 400
if not decade:
flash('Please select a decade.', 'error')
return render_template('request.html', form=request.form, decades=DECADES, genres=MUSIC_GENRES), 400
@ -538,6 +542,7 @@ def request_form():
form_data = {
'name': request.form.get('name', '').strip(),
'email': request.form.get('email', '').strip().lower(),
'pronouns': pronouns,
'hobbies': request.form.get('hobbies', '').strip(),
'notable_facts': request.form.get('notable_facts', '').strip(),
'style_genre': build_style_genre(decade, basic_style, additional_style),
@ -561,6 +566,7 @@ def request_form():
"Here's what we have on file:",
f"Name: {req['name']}",
f"Email: {req['email']}",
f"Pronouns: {req['pronouns'] or '-'}",
f"Style / genre: {req['style_genre'] or '-'}",
f"Preferred singer voice / gender: {req['vocal_gender'] or 'No preference'}",
f"Hobbies: {req['hobbies'] or '-'}",
@ -1070,9 +1076,13 @@ def admin_request(rid):
elif action == 'update_customer_info':
new_email = request.form.get('email', '').strip().lower()
pronouns = request.form.get('pronouns', '').strip()
if not is_valid_email(new_email):
flash('Please enter a valid email address.', 'error')
return redirect(url_for('admin_request', rid=rid))
if not pronouns:
flash('Pronouns are required.', 'error')
return redirect(url_for('admin_request', rid=rid))
style_genre = build_style_genre(
request.form.get('decade', '').strip(),
request.form.get('basic_style', '').strip(),
@ -1081,6 +1091,7 @@ def admin_request(rid):
update_request(rid,
email=new_email,
name=request.form.get('name', '').strip(),
pronouns=pronouns,
hobbies=request.form.get('hobbies', '').strip(),
notable_facts=request.form.get('notable_facts', '').strip(),
style_genre=style_genre,