Feature: Tierarzt-Bewertungen — Sterne-Rating pro Praxis mit Detail-Modal (SW by-v700)

This commit is contained in:
rene 2026-05-04 21:02:49 +02:00
parent c5030024b0
commit 40de0f38aa
5 changed files with 461 additions and 5 deletions

View file

@ -573,6 +573,9 @@ def _migrate(conn_factory):
("users", "password_reset_expires", "TEXT"),
# Fell-Typ für personalisierte Wetter-Hinweise
("dogs", "fell_typ", "TEXT"), # kurz|mittel|lang|drahtaar|doppel|nackt
# Tierarzt-Bewertungen: Durchschnitt + Anzahl am Tierarzt-Datensatz
("tieraerzte", "avg_rating", "REAL DEFAULT 0"),
("tieraerzte", "anz_bewertungen", "INTEGER DEFAULT 0"),
]
with conn_factory() as conn:
for table, column, col_type in migrations:
@ -1983,3 +1986,75 @@ def _migrate(conn_factory):
);
CREATE INDEX IF NOT EXISTS idx_recurring_user ON recurring_expenses(user_id, aktiv);
""")
# ---- Tierarzt-Bewertungen ----
conn.executescript("""
CREATE TABLE IF NOT EXISTS tierarzt_bewertungen (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tierarzt_id INTEGER NOT NULL REFERENCES tieraerzte(id) ON DELETE CASCADE,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
gesamt INTEGER NOT NULL CHECK(gesamt BETWEEN 1 AND 5),
wartezeit INTEGER CHECK(wartezeit BETWEEN 1 AND 5),
freundlichkeit INTEGER CHECK(freundlichkeit BETWEEN 1 AND 5),
kompetenz INTEGER CHECK(kompetenz BETWEEN 1 AND 5),
text TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(tierarzt_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_tierarzt_bew_arzt
ON tierarzt_bewertungen(tierarzt_id);
""")
# ---- Feature: Foto-Challenge der Woche ----
conn.executescript("""
CREATE TABLE IF NOT EXISTS foto_challenge (
id INTEGER PRIMARY KEY AUTOINCREMENT,
thema TEXT NOT NULL,
beschreibung TEXT,
start_date TEXT NOT NULL,
end_date TEXT NOT NULL,
created_by INTEGER REFERENCES users(id),
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS challenge_submissions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
challenge_id INTEGER REFERENCES foto_challenge(id) ON DELETE CASCADE,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
dog_id INTEGER REFERENCES dogs(id) ON DELETE SET NULL,
foto_url TEXT NOT NULL,
caption TEXT,
votes INTEGER DEFAULT 0,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(challenge_id, user_id)
);
CREATE TABLE IF NOT EXISTS challenge_votes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
submission_id INTEGER REFERENCES challenge_submissions(id) ON DELETE CASCADE,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(submission_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_challenge_sub_chal
ON challenge_submissions(challenge_id, created_at DESC);
""")
logger.info("Migration: Foto-Challenge-Tabellen bereit.")
# ---- Feature: Gassi-Zeiten-Pool ----
conn.executescript("""
CREATE TABLE IF NOT EXISTS gassi_zeiten (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
dog_id INTEGER REFERENCES dogs(id) ON DELETE SET NULL,
wochentage TEXT NOT NULL,
uhrzeit TEXT NOT NULL,
ort_name TEXT,
lat REAL,
lon REAL,
radius_m INTEGER DEFAULT 500,
notiz TEXT,
aktiv INTEGER DEFAULT 1,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_gassi_zeiten_user
ON gassi_zeiten(user_id, aktiv);
""")
logger.info("Migration: Gassi-Zeiten-Tabelle bereit.")