Bedre sync
This commit is contained in:
@@ -88,6 +88,7 @@ CREATE TABLE IF NOT EXISTS dance_levels (
|
||||
);
|
||||
|
||||
-- Danse
|
||||
-- Dans + niveau + koreograf er unik kombination
|
||||
CREATE TABLE IF NOT EXISTS dances (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
name TEXT NOT NULL,
|
||||
@@ -98,7 +99,7 @@ CREATE TABLE IF NOT EXISTS dances (
|
||||
notes TEXT NOT NULL DEFAULT '',
|
||||
use_count INTEGER NOT NULL DEFAULT 1,
|
||||
source TEXT NOT NULL DEFAULT 'local',
|
||||
UNIQUE(name, level_id)
|
||||
UNIQUE(name, level_id, choreographer)
|
||||
);
|
||||
|
||||
-- Sang-dans tags
|
||||
@@ -582,4 +583,111 @@ def upsert_dance_levels(levels: list[dict]):
|
||||
ON CONFLICT(name) DO UPDATE SET
|
||||
sort_order=excluded.sort_order,
|
||||
description=excluded.description
|
||||
""", lvl)
|
||||
""", lvl)
|
||||
|
||||
# ── Dans-søgning (til DancePickerDialog) ─────────────────────────────────────
|
||||
|
||||
def get_dance_suggestions(prefix: str = "", limit: int = 20) -> list:
|
||||
"""Hent dans-forslag med niveau og koreograf til autoudfyld."""
|
||||
with get_db() as conn:
|
||||
pattern = f"{prefix}%"
|
||||
return conn.execute("""
|
||||
SELECT d.id, d.name, d.level_id, dl.name as level_name,
|
||||
d.choreographer, d.use_count
|
||||
FROM dances d
|
||||
LEFT JOIN dance_levels dl ON dl.id = d.level_id
|
||||
WHERE d.name LIKE ? COLLATE NOCASE
|
||||
ORDER BY d.use_count DESC, d.name
|
||||
LIMIT ?
|
||||
""", (pattern, limit)).fetchall()
|
||||
|
||||
|
||||
def get_choreographer_suggestions(prefix: str = "", limit: int = 15) -> list[str]:
|
||||
"""Hent koreograf-navne til autoudfyld."""
|
||||
with get_db() as conn:
|
||||
pattern = f"{prefix}%"
|
||||
rows = conn.execute("""
|
||||
SELECT DISTINCT choreographer FROM dances
|
||||
WHERE choreographer != '' AND choreographer LIKE ? COLLATE NOCASE
|
||||
ORDER BY choreographer
|
||||
LIMIT ?
|
||||
""", (pattern, limit)).fetchall()
|
||||
return [r["choreographer"] for r in rows]
|
||||
|
||||
# ── Dans-søgning (til DancePickerDialog og DanceInfoDialog) ──────────────────
|
||||
|
||||
def get_dance_suggestions(prefix: str = "", limit: int = 20) -> list:
|
||||
"""Hent dans-forslag med niveau og koreograf til autoudfyld."""
|
||||
with get_db() as conn:
|
||||
pattern = f"{prefix}%"
|
||||
return conn.execute("""
|
||||
SELECT d.id, d.name, d.level_id, dl.name as level_name,
|
||||
d.choreographer, d.use_count
|
||||
FROM dances d
|
||||
LEFT JOIN dance_levels dl ON dl.id = d.level_id
|
||||
WHERE d.name LIKE ? COLLATE NOCASE
|
||||
ORDER BY d.use_count DESC, d.name
|
||||
LIMIT ?
|
||||
""", (pattern, limit)).fetchall()
|
||||
|
||||
|
||||
def get_choreographer_suggestions(prefix: str = "", limit: int = 15) -> list[str]:
|
||||
"""Hent koreograf-navne til autoudfyld."""
|
||||
with get_db() as conn:
|
||||
pattern = f"{prefix}%"
|
||||
rows = conn.execute("""
|
||||
SELECT DISTINCT choreographer FROM dances
|
||||
WHERE choreographer != '' AND choreographer LIKE ? COLLATE NOCASE
|
||||
ORDER BY choreographer
|
||||
LIMIT ?
|
||||
""", (pattern, limit)).fetchall()
|
||||
return [r["choreographer"] for r in rows]
|
||||
|
||||
|
||||
def get_dances_for_song(song_id: str) -> list:
|
||||
"""Hent alle danse tagget på en sang med niveau og koreograf."""
|
||||
with get_db() as conn:
|
||||
return conn.execute("""
|
||||
SELECT d.id, d.name, dl.name as level_name, d.choreographer,
|
||||
d.video_url, d.stepsheet_url, d.notes, sd.dance_order
|
||||
FROM song_dances sd
|
||||
JOIN dances d ON d.id = sd.dance_id
|
||||
LEFT JOIN dance_levels dl ON dl.id = d.level_id
|
||||
WHERE sd.song_id = ?
|
||||
ORDER BY sd.dance_order
|
||||
""", (song_id,)).fetchall()
|
||||
|
||||
|
||||
def get_alt_dances_for_song(song_id: str) -> list:
|
||||
"""Hent alle alternativ-danse tagget på en sang."""
|
||||
with get_db() as conn:
|
||||
return conn.execute("""
|
||||
SELECT d.id, d.name, dl.name as level_name, d.choreographer,
|
||||
d.video_url, d.stepsheet_url, sad.note
|
||||
FROM song_alt_dances sad
|
||||
JOIN dances d ON d.id = sad.dance_id
|
||||
LEFT JOIN dance_levels dl ON dl.id = d.level_id
|
||||
WHERE sad.song_id = ?
|
||||
ORDER BY d.name
|
||||
""", (song_id,)).fetchall()
|
||||
|
||||
def get_or_create_dance(name: str, level_id: int | None, conn,
|
||||
choreographer: str = "") -> int:
|
||||
"""
|
||||
Find eller opret dans. Returnerer dance_id.
|
||||
Dans + niveau + koreograf er unik kombination.
|
||||
"""
|
||||
choreo = choreographer or ""
|
||||
existing = conn.execute(
|
||||
"SELECT id FROM dances WHERE name=? "
|
||||
"AND (level_id=? OR (level_id IS NULL AND ? IS NULL)) "
|
||||
"AND choreographer=?",
|
||||
(name, level_id, level_id, choreo)
|
||||
).fetchone()
|
||||
if existing:
|
||||
return existing["id"]
|
||||
cur = conn.execute(
|
||||
"INSERT INTO dances (name, level_id, choreographer) VALUES (?,?,?)",
|
||||
(name, level_id, choreo)
|
||||
)
|
||||
return cur.lastrowid
|
||||
Reference in New Issue
Block a user