Intègre un chat IA capable de manipuler la scène via les mêmes fonctions que l'éditeur manuel (objets, variables, déclencheurs, images générées), avec conversations multiples par écran façon Claude. Corrige au passage le rafraîchissement pjax hors-ordre, l'onglet IA/déclencheurs vide après sélection d'un objet, la comparaison de booléens dans les conditions, et le blocage du glisser-déposer hors du cadre caméra après un redimensionnement de fond par l'IA. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
47 lines
2.0 KiB
Python
47 lines
2.0 KiB
Python
import os
|
|
import secrets
|
|
|
|
from dotenv import load_dotenv
|
|
from flask import Flask
|
|
|
|
# Charge .env AVANT tout le reste (voir .env.example) — ce module est le
|
|
# tout premier import interne de app.py, donc les variables sont posées
|
|
# avant qu'un `import db`/`auth` ne les résolve à l'import (ex.
|
|
# db/constants.py::PROJECTS_DIR). Ne remplace JAMAIS une variable déjà
|
|
# présente dans os.environ (comportement par défaut de load_dotenv) —
|
|
# tests/conftest.py, qui pose ses propres variables en Python avant tout
|
|
# import, reste donc isolé d'un .env local même s'il en existe un sur le
|
|
# poste. Aucun effet en production (pas de fichier .env sur le serveur,
|
|
# les variables y sont posées directement sur l'hôte/le conteneur).
|
|
load_dotenv()
|
|
|
|
_BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
_TEMPLATE_FOLDER = os.path.join(_BASE_DIR, "templates")
|
|
_STATIC_FOLDER = os.path.join(_BASE_DIR, "static")
|
|
|
|
app = Flask(__name__, template_folder=_TEMPLATE_FOLDER, static_folder=_STATIC_FOLDER)
|
|
|
|
|
|
def _load_or_create_secret_key():
|
|
"""Nécessaire dès qu'une session Flask (flask.session) est utilisée —
|
|
ici pour se souvenir de qui est connecté (auth/). Généré une seule
|
|
fois et PERSISTÉ dans un fichier (jamais en dur dans le code, jamais
|
|
commité — voir .gitignore, data/) : sans ça, chaque redémarrage du
|
|
serveur changerait la clé et déconnecterait tout le monde. Le chemin
|
|
est overridable (FORGE_SECRET_KEY_PATH) pour que les tests utilisent
|
|
un fichier temporaire, jamais celui du poste réel."""
|
|
path = os.environ.get("FORGE_SECRET_KEY_PATH") or os.path.join(_BASE_DIR, "data", "secret_key")
|
|
if os.path.isfile(path):
|
|
with open(path, "r", encoding="utf-8") as f:
|
|
key = f.read().strip()
|
|
if key:
|
|
return key
|
|
key = secrets.token_hex(32)
|
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
with open(path, "w", encoding="utf-8") as f:
|
|
f.write(key)
|
|
return key
|
|
|
|
|
|
app.secret_key = _load_or_create_secret_key()
|