Initial prototype for theme song booth
This commit is contained in:
commit
c16d48ee32
16 changed files with 898 additions and 0 deletions
94
models.py
Normal file
94
models.py
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
import sqlite3
|
||||
import secrets
|
||||
from datetime import datetime, timezone
|
||||
from flask import current_app, g
|
||||
|
||||
SCHEMA = """
|
||||
CREATE TABLE IF NOT EXISTS requests (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
name TEXT NOT NULL,
|
||||
email TEXT NOT NULL,
|
||||
hobbies TEXT,
|
||||
notable_facts TEXT,
|
||||
style_genre TEXT,
|
||||
extra_requests TEXT,
|
||||
status TEXT DEFAULT 'pending',
|
||||
suno_style TEXT,
|
||||
suno_lyrics TEXT,
|
||||
song_a_path TEXT,
|
||||
song_b_path TEXT,
|
||||
customer_approved TEXT DEFAULT 'none',
|
||||
approval_notified_at TIMESTAMP,
|
||||
preview_sent_at TIMESTAMP,
|
||||
delivery_sent_at TIMESTAMP,
|
||||
square_payment_ref TEXT,
|
||||
admin_alert_email TEXT,
|
||||
player_token TEXT NOT NULL UNIQUE,
|
||||
revision_note TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_requests_status ON requests(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_requests_token ON requests(player_token);
|
||||
"""
|
||||
|
||||
def get_db():
|
||||
if 'db' not in g:
|
||||
g.db = sqlite3.connect(current_app.config['DATABASE'])
|
||||
g.db.row_factory = sqlite3.Row
|
||||
return g.db
|
||||
|
||||
def close_db(e=None):
|
||||
db = g.pop('db', None)
|
||||
if db is not None:
|
||||
db.close()
|
||||
|
||||
def init_db():
|
||||
db = sqlite3.connect(current_app.config['DATABASE'])
|
||||
db.executescript(SCHEMA)
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
def new_token():
|
||||
return secrets.token_urlsafe(32)
|
||||
|
||||
def now_utc():
|
||||
return datetime.now(timezone.utc).isoformat()
|
||||
|
||||
def create_request(name, email, hobbies, notable_facts, style_genre, extra_requests):
|
||||
db = get_db()
|
||||
cur = db.execute(
|
||||
"""INSERT INTO requests
|
||||
(name, email, hobbies, notable_facts, style_genre, extra_requests, player_token)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
||||
(name, email, hobbies, notable_facts, style_genre, extra_requests, new_token())
|
||||
)
|
||||
db.commit()
|
||||
return cur.lastrowid
|
||||
|
||||
def get_request_by_id(request_id):
|
||||
db = get_db()
|
||||
row = db.execute('SELECT * FROM requests WHERE id = ?', (request_id,)).fetchone()
|
||||
return dict(row) if row else None
|
||||
|
||||
def get_request_by_token(token):
|
||||
db = get_db()
|
||||
row = db.execute('SELECT * FROM requests WHERE player_token = ?', (token,)).fetchone()
|
||||
return dict(row) if row else None
|
||||
|
||||
def list_requests(status=None):
|
||||
db = get_db()
|
||||
if status:
|
||||
rows = db.execute('SELECT * FROM requests WHERE status = ? ORDER BY created_at DESC', (status,)).fetchall()
|
||||
else:
|
||||
rows = db.execute('SELECT * FROM requests ORDER BY created_at DESC').fetchall()
|
||||
return [dict(r) for r in rows]
|
||||
|
||||
def update_request(request_id, **fields):
|
||||
if not fields:
|
||||
return
|
||||
db = get_db()
|
||||
cols = ', '.join(f'{k} = ?' for k in fields)
|
||||
vals = list(fields.values()) + [request_id]
|
||||
db.execute(f'UPDATE requests SET {cols} WHERE id = ?', vals)
|
||||
db.commit()
|
||||
Reference in a new issue