Group genre dropdowns into non-selectable optgroup sections

- Load grouped genre list (music_genres_grouped.txt) with section headings
- Render headings as <optgroup> labels (visible, not selectable)
- Add Disney under CHILDREN'S & HOLIDAY (was missing from grouped file)
- Bump version to 0.9.3
This commit is contained in:
Troll (Hermes Agent) 2026-09-20 16:11:42 +00:00
parent 07e92a522a
commit 868b59077f
7 changed files with 360 additions and 21 deletions

14
app.py
View file

@ -60,7 +60,7 @@ from models import SCHEMA, get_requests_by_email, log_revision, list_revision_hi
# Helpers (extracted from app.py to keep the route file manageable)
from helpers import (
MUSIC_GENRES, DECADES, parse_style_genre, build_style_genre,
GENRE_GROUPS, DECADES, parse_style_genre, build_style_genre,
is_admin, require_admin, admin_password_ok, is_valid_email,
allowed_file, upload_path, save_upload,
apply_mp3_tags,
@ -186,13 +186,13 @@ def request_form():
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
return render_template('request.html', form=request.form, decades=DECADES, genre_groups=GENRE_GROUPS), 400
if not decade:
flash('Please select a decade.', 'error')
return render_template('request.html', form=request.form, decades=DECADES, genres=MUSIC_GENRES), 400
return render_template('request.html', form=request.form, decades=DECADES, genre_groups=GENRE_GROUPS), 400
if not basic_style:
flash('Please select a basic style.', 'error')
return render_template('request.html', form=request.form, decades=DECADES, genres=MUSIC_GENRES), 400
return render_template('request.html', form=request.form, decades=DECADES, genre_groups=GENRE_GROUPS), 400
form_data = {
'name': request.form.get('name', '').strip(),
'email': request.form.get('email', '').strip().lower(),
@ -206,7 +206,7 @@ def request_form():
}
if not is_valid_email(form_data['email']):
flash('Please enter a valid email address.', 'error')
return render_template('request.html', form=form_data, decades=DECADES, genres=MUSIC_GENRES), 400
return render_template('request.html', form=form_data, decades=DECADES, genre_groups=GENRE_GROUPS), 400
rid = create_request(**form_data)
# Notify operator via ntfy when a new request comes in.
@ -251,7 +251,7 @@ def request_form():
flash('Your request has been submitted! Check your email soon.', 'success')
return redirect(url_for('thanks', rid=rid))
return render_template('request.html', form=None, decades=DECADES, genres=MUSIC_GENRES)
return render_template('request.html', form=None, decades=DECADES, genre_groups=GENRE_GROUPS)
@app.route('/api/ping', methods=['GET'])
@ -1521,7 +1521,7 @@ def admin_request(rid):
req=req,
style_parts=parse_style_genre(req.get('style_genre')),
decades=DECADES,
genres=MUSIC_GENRES,
genre_groups=GENRE_GROUPS,
statuses=STATUS_LABELS,
file_exists=file_exists,
basename=basename,