111 lines
4.0 KiB
Python
111 lines
4.0 KiB
Python
"""
|
||
Application Factory der OIDC Flask Showcase App.
|
||
|
||
Initialisiert Flask, SQLAlchemy und Authlib. Registriert alle Blueprints
|
||
und stellt den CLI-Befehl ``flask seed-db`` bereit.
|
||
|
||
:author: <Vorname Nachname>
|
||
:date: 2026-06-17
|
||
:version: 0.1
|
||
"""
|
||
|
||
import logging
|
||
import click
|
||
from flask import Flask
|
||
|
||
from .config import Config
|
||
from .database import db
|
||
from .auth import oauth, init_oauth
|
||
|
||
logging.basicConfig(level=logging.INFO)
|
||
|
||
|
||
def create_app(config_class=Config):
|
||
app = Flask(__name__)
|
||
app.config.from_object(config_class)
|
||
|
||
db.init_app(app)
|
||
init_oauth(app)
|
||
|
||
from .routes import main
|
||
app.register_blueprint(main)
|
||
|
||
_register_cli(app)
|
||
|
||
return app
|
||
|
||
|
||
def _register_cli(app):
|
||
@app.cli.command("seed-db")
|
||
def seed_db():
|
||
"""Initialisiert das Schema und befüllt die DB mit Testdaten."""
|
||
from datetime import datetime
|
||
from .models import (
|
||
User, Client, Project,
|
||
ProjectMitarbeiterMapping, ProjectKundenMapping, Note,
|
||
)
|
||
|
||
db.drop_all()
|
||
db.create_all()
|
||
|
||
# ------------------------------------------------------------------
|
||
# Zitadel-User-IDs (sub-Werte) eintragen – Anleitung: ZITADEL-SETUP.md Schritt 6
|
||
# Beliebig viele Einträge pro Rolle möglich.
|
||
# Format: (zitadel_sub, email)
|
||
# ------------------------------------------------------------------
|
||
ADMINS = [
|
||
("377858996305921031", "test@oidctest.local"), # Test Admin
|
||
("361726819499508906", "br@runden.de"), # Björn Runden
|
||
]
|
||
MITARBEITER = [
|
||
("377859593088271367", "testmuellerma@oidctest.local"), # Test Müller mitarbeiter
|
||
("377859271703921671", "staff2@oidctest.local"), # test2 staff
|
||
("377859141412062215", "teststaff@oidctest.local"), # test Mitarbeiter
|
||
]
|
||
KUNDEN = [
|
||
("377859426305967111", "testmueller@oidctest.local"), # oidctest kund1 Müller
|
||
]
|
||
|
||
for sub, email in ADMINS:
|
||
db.session.add(User(zitadel_user_id=sub, email=email, global_role="Admin"))
|
||
for sub, email in MITARBEITER:
|
||
db.session.add(User(zitadel_user_id=sub, email=email, global_role="Mitarbeiter"))
|
||
for sub, email in KUNDEN:
|
||
db.session.add(User(zitadel_user_id=sub, email=email, global_role="Kunde"))
|
||
|
||
firma = Client(name="Firma Müller")
|
||
db.session.add(firma)
|
||
db.session.flush()
|
||
|
||
p1 = Project(name="Akquise Landkreis", client_id=firma.id)
|
||
p2 = Project(name="Akquise Bundesstaat", client_id=firma.id)
|
||
p3 = Project(name="Spezielle Produktpalette", client_id=firma.id)
|
||
db.session.add_all([p1, p2, p3])
|
||
db.session.flush()
|
||
|
||
# Alle Mitarbeiter → Projekte 1 + 2 (nicht 3 → Failure-Test-Button)
|
||
for sub, _ in MITARBEITER:
|
||
db.session.add(ProjectMitarbeiterMapping(user_id=sub, project_id=p1.id))
|
||
db.session.add(ProjectMitarbeiterMapping(user_id=sub, project_id=p2.id))
|
||
|
||
# Alle Kunden → Projekt 1 (nicht 2 + 3 → Failure-Test-Button)
|
||
for sub, _ in KUNDEN:
|
||
db.session.add(ProjectKundenMapping(user_id=sub, project_id=p1.id))
|
||
|
||
# Beispielnotizen werden dem ersten Mitarbeiter zugeordnet
|
||
ma_sub = MITARBEITER[0][0]
|
||
db.session.add_all([
|
||
Note(text="Erstkontakt aufgenommen.", project_id=p1.id,
|
||
user_id=ma_sub, created_at=datetime.utcnow()),
|
||
Note(text="Angebot versendet.", project_id=p1.id,
|
||
user_id=ma_sub, created_at=datetime.utcnow()),
|
||
Note(text="Folgetermin vereinbart.", project_id=p2.id,
|
||
user_id=ma_sub, created_at=datetime.utcnow()),
|
||
])
|
||
|
||
db.session.commit()
|
||
click.echo("Datenbank initialisiert und mit Testdaten befüllt.")
|
||
click.echo(f" Admins : {[s for s, _ in ADMINS]}")
|
||
click.echo(f" Mitarbeiter : {[s for s, _ in MITARBEITER]}")
|
||
click.echo(f" Kunden : {[s for s, _ in KUNDEN]}")
|