nasim-raj-laskar commited on
Commit
af286ff
·
1 Parent(s): c95b8c6
Dockerfile CHANGED
@@ -13,4 +13,4 @@ COPY --chown=user ./requirements.txt requirements.txt
13
  RUN pip install --no-cache-dir --upgrade -r requirements.txt
14
 
15
  COPY --chown=user . /app
16
- CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "7860"]
 
13
  RUN pip install --no-cache-dir --upgrade -r requirements.txt
14
 
15
  COPY --chown=user . /app
16
+ CMD ["python", "start_dashboard.py"]
config.yaml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ output:
2
+ sessions_dir: "sessions"
dashboard.yaml CHANGED
@@ -1,6 +1,6 @@
1
  server:
2
- host: "127.0.0.1"
3
- port: 8050
4
  debug: false
5
 
6
  theme:
 
1
  server:
2
+ host: "0.0.0.0"
3
+ port: 7860
4
  debug: false
5
 
6
  theme:
requirements.txt CHANGED
@@ -1 +1,5 @@
1
- plot
 
 
 
 
 
1
+ dash
2
+ pandas
3
+ plotly
4
+ pyarrow
5
+ pyyaml
src/dash_callbacks.py CHANGED
@@ -1,3 +1,4 @@
 
1
  from dash import ClientsideFunction, Input, Output, State, dcc, no_update #type: ignore
2
  from .dash_data import load_session
3
  from .dash_figures import multiline, track_map
@@ -14,10 +15,13 @@ def register_callbacks(app, cfg: dict):
14
  if not session:
15
  return ""
16
  _, info = load_session(sessions_dir, session)
17
- track = info["track"]
18
  if info.get("track_configuration"):
19
- track += f" ({info['track_configuration']})"
20
- return f"Car: {info['car']} | Track: {track} | Max RPM: {info['max_rpm']} | Fuel: {info['max_fuel_kg']} kg"
 
 
 
21
 
22
  # show/hide the two content areas based on active tab
23
  @app.callback(
 
1
+ import html
2
  from dash import ClientsideFunction, Input, Output, State, dcc, no_update #type: ignore
3
  from .dash_data import load_session
4
  from .dash_figures import multiline, track_map
 
15
  if not session:
16
  return ""
17
  _, info = load_session(sessions_dir, session)
18
+ track = html.escape(info["track"])
19
  if info.get("track_configuration"):
20
+ track += f" ({html.escape(info['track_configuration'])})"
21
+ car = html.escape(str(info['car']))
22
+ max_rpm = html.escape(str(info['max_rpm']))
23
+ max_fuel = html.escape(str(info['max_fuel_kg']))
24
+ return f"Car: {car} | Track: {track} | Max RPM: {max_rpm} | Fuel: {max_fuel} kg"
25
 
26
  # show/hide the two content areas based on active tab
27
  @app.callback(
src/dash_data.py CHANGED
@@ -12,7 +12,10 @@ def list_sessions(sessions_dir: str) -> list[str]:
12
 
13
 
14
  def load_session(sessions_dir: str, name: str) -> tuple[pd.DataFrame, dict]:
15
- base = Path(sessions_dir) / name
 
 
 
16
  df = pd.read_parquet(base / "telemetry.parquet")
17
  df["t"] = df["timestamp"] - df["timestamp"].iloc[0]
18
  info = json.loads((base / "session_info.json").read_text())
 
12
 
13
 
14
  def load_session(sessions_dir: str, name: str) -> tuple[pd.DataFrame, dict]:
15
+ base = Path(sessions_dir).resolve() / Path(name).name
16
+ if not str(base).startswith(str(Path(sessions_dir).resolve())):
17
+ raise ValueError(f"Invalid session: {name}")
18
+ base = base
19
  df = pd.read_parquet(base / "telemetry.parquet")
20
  df["t"] = df["timestamp"] - df["timestamp"].iloc[0]
21
  info = json.loads((base / "session_info.json").read_text())