HeatTransPlan / backend /app /models /project.py
drzg15's picture
Initial code commit with LFS for binaries
c993983
"""
Project state model — exact mirror of save_app_state() / load_app_state()
in data_collection.py. This is the top-level container.
"""
from __future__ import annotations
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
from app.models.process import ProcessNode
class GroupCoordinates(BaseModel):
"""Coordinates and metadata for a process group on the map."""
lat: Optional[Any] = None
lon: Optional[Any] = None
box_scale: Optional[Any] = 1.5
hours: Optional[str] = ""
model_config = {"extra": "allow"}
class ProjectState(BaseModel):
"""
Complete project state. Matches save_app_state() output exactly.
This is what gets serialized to/from JSON files.
"""
timestamp: Optional[str] = None
map_locked: bool = False
map_center: List[float] = [51.707937580921694, 8.772205607882668]
map_zoom: float = 17.5
current_base: str = "OpenStreetMap"
processes: List[ProcessNode] = Field(default_factory=list)
proc_groups: List[List[int]] = Field(default_factory=list)
proc_group_names: List[str] = Field(default_factory=list)
proc_group_expanded: List[bool] = Field(default_factory=list)
proc_group_coordinates: Dict[str, GroupCoordinates] = Field(default_factory=dict)
proc_group_info_expanded: List[bool] = Field(default_factory=list)
# Notes
project_notes: str = ""
# Potential Analysis State
selected_streams: Dict[str, bool] = Field(default_factory=dict)
energy_demands: List[Dict[str, Any]] = Field(default_factory=list)
t_min: float = 10.0
model_config = {"extra": "allow"}