""" Flask CLI-Befehle zur Datenbank-Initialisierung und zum Reset. Befehle (aufgerufen via Flask CLI): flask --app wsgi:app init-db -- Schema + Musterdaten anlegen flask --app wsgi:app reset-db -- alles bis auf SysAdmin löschen init-db ist idempotent: bereits vorhandene Rollen/Kunden werden nicht doppelt angelegt. reset-db fragt standardmäßig zur Bestätigung; mit --yes wird die Abfrage übersprungen. :author: Mistral Vibe :date: 2026-09-02 :version: 1.0 """ import click from flask import Flask from db import dbapp, dbauth def register_cli_commands(app: Flask): """Registriert die CLI-Befehle init-db und reset-db auf der Flask-App.""" @app.cli.command("init-db") def init_db(): """Initialisiert die Datenbanken und legt Musterdaten an.""" click.echo("Initialisiere auth.db ...") from auth.model import checkdb as auth_checkdb auth_checkdb.checkupdates() _seed_app_roles() click.echo("Initialisiere kbp_crm.db ...") from crm.model import checkdb as crm_checkdb crm_checkdb.checkupdates() _seed_muster_kunden() click.echo("Fertig.") @app.cli.command("reset-db") @click.option("--yes", is_flag=True, help="Bestätigungsabfrage überspringen") def reset_db(yes): """Setzt die Datenbanken zurück, behält den SysAdmin.""" if not yes: click.confirm( "Wirklich alle Daten löschen? Der SysAdmin bleibt erhalten.", abort=True, ) click.echo("Setze kbp_crm.db zurück ...") _reset_appdb() click.echo("Setze auth.db zurück (SysAdmin bleibt) ...") _reset_authdb() _seed_app_roles() click.echo("Fertig.") def _seed_app_roles(): """ Legt die App-Rollen Mitarbeiter und KundenManager idempotent an und ordnet sie der ersten Application zu. AppAdmin existiert bereits (wird in auth/model/checkdb._db_V01_01 angelegt). """ from auth.model import Application, Role session = dbauth.session application = Application.query.first() rollen = [ ("User", "Mitarbeiter"), ("KundenManager", "Kunden-Manager"), ] for roleid, rolename in rollen: role = Role.query.filter(Role.roleid == roleid).first() if role is None: role = Role() role.roleid = roleid role.name = rolename session.add(role) if application is not None and role not in application.roles: application.roles.append(role) session.commit() def _seed_muster_kunden(): """ Legt die drei Muster-Kunden an, falls die kunden-Tabelle noch leer ist. """ from crm.model import Kunde session = dbapp.session if session.query(Kunde).count() > 0: return muster = [ Kunde(name="Musterfirma GmbH", strasse="Musterstraße 1", plz="12345", ort="Musterstadt", land="Deutschland"), Kunde(name="Beispiel AG", strasse="Beispielweg 2", plz="54321", ort="Beispielstadt", land="Deutschland"), Kunde(name="Test Unternehmen", strasse="Testallee 3", plz="67890", ort="Testdorf", land="Österreich"), ] for kunde in muster: session.add(kunde) session.commit() def _reset_appdb(): """ Setzt die CRM-Datenbank zurück: alle Tabellen löschen und neu anlegen (Schema + Systeminfo, keine Musterdaten). """ from crm.model import checkdb as crm_checkdb dbapp.drop_all(bind_key="appdb") dbapp.session.remove() crm_checkdb.checkupdates() def _reset_authdb(): """ Setzt die Auth-Datenbank zurück: alle Tabellen löschen und neu anlegen. Dadurch entsteht der frische Initialzustand mit SysAdmin-User, SysAdmin- und AppAdmin-Rolle sowie der Application (entspricht auth/model/checkdb._db_V01_01). """ from auth.model import checkdb as auth_checkdb dbauth.drop_all(bind_key="auth") dbauth.session.remove() auth_checkdb.checkupdates()