File size: 4,042 Bytes
a41986a
 
af6288c
a41986a
af6288c
a41986a
af6288c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68f9b9e
af6288c
68f9b9e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
 
 
 
 
95dae8e
68f9b9e
 
 
95dae8e
68f9b9e
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import sys
from types import ModuleType

# 1. SET ENVIRONMENT FIRST
os.environ["KERAS_BACKEND"] = "torch"
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" # Suppress TF logs

# 2. INLINE MONKEY-PATCH (Absolute priority)
def _patch():
    if "tensorflow" in sys.modules: return
    try:
        import keras
        tf = ModuleType("tensorflow")
        sys.modules["tensorflow"] = tf
        tf.keras = keras
        sys.modules["tensorflow.keras"] = keras
        
        # Essential submodules for 'fer'
        import keras.models, keras.layers
        sys.modules["tensorflow.keras.models"] = keras.models
        sys.modules["tensorflow.keras.layers"] = keras.layers
        
        # Support for 'tensorflow.python.keras'
        tf_py = ModuleType("tensorflow.python")
        sys.modules["tensorflow.python"] = tf_py
        tf_py.keras = keras
        sys.modules["tensorflow.python.keras"] = keras
        print("Inline monkey-patch success.")
    except Exception as e:
        print(f"Inline monkey-patch failed: {e}")

_patch()

# 3. NOW PROCEED WITH OTHER IMPORTS
from fastapi import FastAPI, Request

from fastapi.responses import RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from app.database import engine, Base
from app.routers import auth, dashboard, emotion, activities, diary

# Create Database Tables
Base.metadata.create_all(bind=engine)

app = FastAPI(title="NeuroSense")

# Get base directory (backend root)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
FRONTEND_DIR = os.path.join(os.path.dirname(BASE_DIR), "frontend")

# Ensure necessary directories exist in backend/data
os.makedirs(os.path.join(BASE_DIR, "data/uploads/emotions"), exist_ok=True)
os.makedirs(os.path.join(BASE_DIR, "data/uploads/diary"), exist_ok=True)
os.makedirs(os.path.join(BASE_DIR, "data/reports"), exist_ok=True)

# Mount Static Files (CSS, JS) from frontend folder
app.mount("/static", StaticFiles(directory=os.path.join(FRONTEND_DIR, "static")), name="static")

# Mount Data Folders for viewing (from backend/data)
app.mount("/uploads", StaticFiles(directory=os.path.join(BASE_DIR, "data/uploads")), name="uploads")
app.mount("/reports", StaticFiles(directory=os.path.join(BASE_DIR, "data/reports")), name="reports")

# Templates from frontend/templates
templates = Jinja2Templates(directory=os.path.join(FRONTEND_DIR, "templates"))

# Include Routers
app.include_router(auth.router)
app.include_router(dashboard.router)
app.include_router(emotion.router)
app.include_router(activities.router)
app.include_router(diary.router)

# Page Routes

@app.get("/")
def home_page(request: Request):
    # Root is Dashboard
    return templates.TemplateResponse(request, "dashboard.html", {"request": request})

@app.get("/login")
def login_page(request: Request):
    return templates.TemplateResponse(request, "login.html", {"request": request})

@app.get("/children")
def children_page(request: Request):
    return templates.TemplateResponse(request, "children.html", {"request": request})

@app.get("/emotion-learning")
def emotion_page(request: Request):
    return templates.TemplateResponse(request, "emotion.html", {"request": request})

@app.get("/activities")
def activities_page(request: Request):
    return templates.TemplateResponse(request, "activities.html", {"request": request})

@app.get("/game/{game_name}")
def game_page(request: Request, game_name: str):
    return templates.TemplateResponse(request, "game.html", {"request": request, "game_name": game_name})

@app.get("/dashboard")
def dashboard_redirect(request: Request):
    return RedirectResponse(url="/")

@app.get("/diary")
def diary_page(request: Request):
    return templates.TemplateResponse(request, "diary.html", {"request": request})

@app.get("/quiz")
def quiz_page(request: Request):
    return templates.TemplateResponse(request, "quiz.html", {"request": request})

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)