patchcenter/app/dependencies.py
Admin MPCZ c2f3d669eb Mode Demo/Reel au login + base patchcenter_demo
- Choix Production/Demo sur la page de login
- Base patchcenter_demo avec schema identique + 10 serveurs mpcz
- Le mode est stocke dans le JWT token
- La session DB bascule automatiquement selon le mode
2026-04-10 19:39:35 +02:00

78 lines
2.0 KiB
Python

"""Dependances communes pour les routers"""
from fastapi import Request
from sqlalchemy import text
from .auth import decode_token
from .database import SessionLocal, SessionLocalDemo
def get_db(request: Request = None):
"""Retourne la session DB selon le mode (demo/reel) stocke dans le cookie JWT."""
demo = False
if request:
user = get_current_user(request)
if user and user.get("mode") == "demo":
demo = True
factory = SessionLocalDemo if demo else SessionLocal
db = factory()
try:
yield db
finally:
db.close()
def get_db_for_login(demo: bool = False):
"""Session DB pour le login (avant que le cookie existe)."""
factory = SessionLocalDemo if demo else SessionLocal
db = factory()
try:
yield db
finally:
db.close()
def get_current_user(request: Request):
"""Extrait l'utilisateur du cookie JWT"""
token = request.cookies.get("access_token")
if not token:
return None
return decode_token(token)
def get_user_perms(db, user):
"""Charge les permissions depuis la base pour un user.
Retourne un dict {module: level} ex: {'servers': 'admin', 'campaigns': 'edit'}"""
if not user:
return {}
uid = user.get("uid")
if not uid:
return {}
rows = db.execute(text(
"SELECT module, level FROM user_permissions WHERE user_id = :uid"
), {"uid": uid}).fetchall()
return {r.module: r.level for r in rows}
def can_view(perms, module):
"""L'utilisateur peut-il voir ce module ?"""
return module in perms
def can_edit(perms, module):
"""L'utilisateur peut-il editer ce module ?"""
return perms.get(module) in ("edit", "admin")
def can_admin(perms, module):
"""L'utilisateur a-t-il les droits admin sur ce module ?"""
return perms.get(module) == "admin"
def base_context(request, db, user):
"""Context de base pour tous les templates (user + perms)"""
perms = get_user_perms(db, user)
return {
"request": request,
"user": user,
"perms": perms,
}