Add vocal gender preference to customer request form and admin view
This commit is contained in:
parent
0f6b68cf5d
commit
5b6012aa3d
4 changed files with 32 additions and 8 deletions
5
app.py
5
app.py
|
|
@ -177,6 +177,7 @@ def request_form():
|
||||||
notable_facts=request.form.get('notable_facts', '').strip(),
|
notable_facts=request.form.get('notable_facts', '').strip(),
|
||||||
style_genre=request.form.get('style_genre', '').strip(),
|
style_genre=request.form.get('style_genre', '').strip(),
|
||||||
extra_requests=request.form.get('extra_requests', '').strip(),
|
extra_requests=request.form.get('extra_requests', '').strip(),
|
||||||
|
vocal_gender=request.form.get('vocal_gender', '').strip(),
|
||||||
)
|
)
|
||||||
flash('Your request has been submitted! Check your email soon.', 'success')
|
flash('Your request has been submitted! Check your email soon.', 'success')
|
||||||
return redirect(url_for('thanks', rid=rid))
|
return redirect(url_for('thanks', rid=rid))
|
||||||
|
|
@ -504,10 +505,10 @@ def admin_settings():
|
||||||
# Health check: verify expected columns exist.
|
# Health check: verify expected columns exist.
|
||||||
expected_cols = {
|
expected_cols = {
|
||||||
'id', 'created_at', 'name', 'email', 'hobbies', 'notable_facts',
|
'id', 'created_at', 'name', 'email', 'hobbies', 'notable_facts',
|
||||||
'style_genre', 'extra_requests', 'status', 'suno_title', 'suno_style',
|
'style_genre', 'extra_requests', 'vocal_gender', 'status', 'suno_title', 'suno_style',
|
||||||
'suno_lyrics', 'song_a_path', 'song_b_path', 'customer_approved',
|
'suno_lyrics', 'song_a_path', 'song_b_path', 'customer_approved',
|
||||||
'approval_notified_at', 'preview_sent_at', 'delivery_sent_at',
|
'approval_notified_at', 'preview_sent_at', 'delivery_sent_at',
|
||||||
'square_payment_ref', 'admin_alert_email', 'player_token', 'revision_note'
|
'square_payment_ref', 'admin_alert_email', 'player_token', 'revision_note', 'revision_count'
|
||||||
}
|
}
|
||||||
health = {'ok': True, 'missing_columns': [], 'message': 'Database schema looks good.'}
|
health = {'ok': True, 'missing_columns': [], 'message': 'Database schema looks good.'}
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS requests (
|
||||||
suno_lyrics TEXT,
|
suno_lyrics TEXT,
|
||||||
song_a_path TEXT,
|
song_a_path TEXT,
|
||||||
song_b_path TEXT,
|
song_b_path TEXT,
|
||||||
|
vocal_gender TEXT,
|
||||||
customer_approved TEXT DEFAULT 'none',
|
customer_approved TEXT DEFAULT 'none',
|
||||||
approval_notified_at TIMESTAMP,
|
approval_notified_at TIMESTAMP,
|
||||||
preview_sent_at TIMESTAMP,
|
preview_sent_at TIMESTAMP,
|
||||||
|
|
@ -83,7 +84,7 @@ def now_utc():
|
||||||
return datetime.now(timezone.utc).isoformat()
|
return datetime.now(timezone.utc).isoformat()
|
||||||
|
|
||||||
|
|
||||||
def create_request(name, email, hobbies, notable_facts, style_genre, extra_requests):
|
def create_request(name, email, hobbies, notable_facts, style_genre, extra_requests, vocal_gender=None):
|
||||||
"""
|
"""
|
||||||
Insert a new customer request.
|
Insert a new customer request.
|
||||||
Returns the auto-generated request id.
|
Returns the auto-generated request id.
|
||||||
|
|
@ -91,9 +92,9 @@ def create_request(name, email, hobbies, notable_facts, style_genre, extra_reque
|
||||||
db = get_db()
|
db = get_db()
|
||||||
cur = db.execute(
|
cur = db.execute(
|
||||||
"""INSERT INTO requests
|
"""INSERT INTO requests
|
||||||
(name, email, hobbies, notable_facts, style_genre, extra_requests, player_token)
|
(name, email, hobbies, notable_facts, style_genre, extra_requests, vocal_gender, player_token)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)""",
|
||||||
(name, email, hobbies, notable_facts, style_genre, extra_requests, new_token())
|
(name, email, hobbies, notable_facts, style_genre, extra_requests, vocal_gender, new_token())
|
||||||
)
|
)
|
||||||
db.commit()
|
db.commit()
|
||||||
return cur.lastrowid
|
return cur.lastrowid
|
||||||
|
|
|
||||||
|
|
@ -140,6 +140,7 @@
|
||||||
<p><strong>Hobbies:</strong><br>{{ req.hobbies or '-' }}</p>
|
<p><strong>Hobbies:</strong><br>{{ req.hobbies or '-' }}</p>
|
||||||
<p><strong>Notable facts:</strong><br>{{ req.notable_facts or '-' }}</p>
|
<p><strong>Notable facts:</strong><br>{{ req.notable_facts or '-' }}</p>
|
||||||
<p><strong>Style / genre:</strong><br>{{ req.style_genre or '-' }}</p>
|
<p><strong>Style / genre:</strong><br>{{ req.style_genre or '-' }}</p>
|
||||||
|
<p><strong>Preferred singer voice / gender:</strong><br>{{ req.vocal_gender or 'No preference' }}</p>
|
||||||
<p><strong>Extra requests:</strong><br>{{ req.extra_requests or '-' }}</p>
|
<p><strong>Extra requests:</strong><br>{{ req.extra_requests or '-' }}</p>
|
||||||
|
|
||||||
{% if req.revision_note %}
|
{% if req.revision_note %}
|
||||||
|
|
@ -305,9 +306,10 @@
|
||||||
hobbies: {{ req.hobbies | tojson }},
|
hobbies: {{ req.hobbies | tojson }},
|
||||||
notable_facts: {{ req.notable_facts | tojson }},
|
notable_facts: {{ req.notable_facts | tojson }},
|
||||||
style_genre: {{ req.style_genre | tojson }},
|
style_genre: {{ req.style_genre | tojson }},
|
||||||
|
vocal_gender: {{ req.vocal_gender | tojson }},
|
||||||
extra_requests: {{ req.extra_requests | tojson }}
|
extra_requests: {{ req.extra_requests | tojson }}
|
||||||
};
|
};
|
||||||
const text = `Please write a Suno Custom Mode prompt for this customer. Suggest a song title too.\n\nCustomer data:\nName: ${data.name}\nHobbies: ${data.hobbies || '-'}\nNotable facts: ${data.notable_facts || '-'}\nStyle / genre: ${data.style_genre || '-'}\nExtra requests: ${data.extra_requests || '-'}\n\nReply with exactly this format:\n\nTitle: [suggested title]\n\nStyle:\n[the style description here]\n\nLyrics:\n[the lyrics here, with metatags]`;
|
const text = `Please write a Suno Custom Mode prompt for this customer. Suggest a song title too.\n\nCustomer data:\nName: ${data.name}\nHobbies: ${data.hobbies || '-'}\nNotable facts: ${data.notable_facts || '-'}\nStyle / genre: ${data.style_genre || '-'}\nPreferred singer voice / gender: ${data.vocal_gender || 'No preference'}\nExtra requests: ${data.extra_requests || '-'}\n\nReply with exactly this format:\n\nTitle: [suggested title]\n\nStyle:\n[the style description here]\n\nLyrics:\n[the lyrics here, with metatags]`;
|
||||||
navigator.clipboard.writeText(text).then(() => alert("Copied! Paste Hermes response into the Title, Style, and Lyrics fields."));
|
navigator.clipboard.writeText(text).then(() => alert("Copied! Paste Hermes response into the Title, Style, and Lyrics fields."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,17 @@
|
||||||
font:inherit;
|
font:inherit;
|
||||||
margin-top:.25rem;
|
margin-top:.25rem;
|
||||||
}
|
}
|
||||||
input:focus,textarea:focus{
|
select{
|
||||||
|
width:100%;
|
||||||
|
padding:.7rem;
|
||||||
|
border-radius:.5rem;
|
||||||
|
border:1px solid #374151;
|
||||||
|
background:#111827;
|
||||||
|
color:#f3f4f6;
|
||||||
|
font:inherit;
|
||||||
|
margin-top:.25rem;
|
||||||
|
}
|
||||||
|
input:focus,textarea:focus,select:focus{
|
||||||
outline:none;
|
outline:none;
|
||||||
border-color:#60a5fa;
|
border-color:#60a5fa;
|
||||||
box-shadow:0 0 0 3px rgba(96,165,250,.2);
|
box-shadow:0 0 0 3px rgba(96,165,250,.2);
|
||||||
|
|
@ -122,6 +132,16 @@
|
||||||
<label for="style_genre">Style / genre / mood</label>
|
<label for="style_genre">Style / genre / mood</label>
|
||||||
<input type="text" id="style_genre" name="style_genre" placeholder="e.g. 80s power ballad, cinematic orchestral, lo-fi synthwave">
|
<input type="text" id="style_genre" name="style_genre" placeholder="e.g. 80s power ballad, cinematic orchestral, lo-fi synthwave">
|
||||||
|
|
||||||
|
<label for="vocal_gender">Preferred singer voice / gender</label>
|
||||||
|
<select id="vocal_gender" name="vocal_gender">
|
||||||
|
<option value="" selected>No preference</option>
|
||||||
|
<option value="female">Female</option>
|
||||||
|
<option value="male">Male</option>
|
||||||
|
<option value="non-binary">Non-binary / Gender-neutral</option>
|
||||||
|
<option value="androgynous">Androgynous</option>
|
||||||
|
<option value="other">Other (mention in Extra Requests)</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
<label for="extra_requests">Anything else you want in the song?</label>
|
<label for="extra_requests">Anything else you want in the song?</label>
|
||||||
<textarea id="extra_requests" name="extra_requests" placeholder="Specific lyrics, vibe, clean/explicit, vocal gender..."></textarea>
|
<textarea id="extra_requests" name="extra_requests" placeholder="Specific lyrics, vibe, clean/explicit, vocal gender..."></textarea>
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue