157 lines
3.8 KiB
Python
157 lines
3.8 KiB
Python
"""
|
|
Pawprint Data Layer
|
|
|
|
JSON file storage (future: MongoDB)
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from typing import List, Optional
|
|
|
|
# Add parent to path for models import
|
|
import sys
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from models.pydantic import (
|
|
Vein, Nest, Larder, Template, Tool,
|
|
Pulse, Book, Table,
|
|
VeinCollection, NestCollection, LarderCollection,
|
|
TemplateCollection, ToolCollection,
|
|
PulseCollection, BookCollection, TableCollection,
|
|
Status
|
|
)
|
|
|
|
DATA_DIR = Path(__file__).parent.resolve()
|
|
|
|
# Debug: print data dir on import
|
|
print(f"[data] DATA_DIR: {DATA_DIR}")
|
|
print(f"[data] DATA_DIR exists: {DATA_DIR.exists()}")
|
|
print(f"[data] veins.json exists: {(DATA_DIR / 'veins.json').exists()}")
|
|
|
|
|
|
def _load_json(filename: str) -> dict:
|
|
filepath = DATA_DIR / filename
|
|
if filepath.exists():
|
|
with open(filepath) as f:
|
|
data = json.load(f)
|
|
print(f"[data] Loaded {filename}: {len(data.get('items', []))} items")
|
|
return data
|
|
print(f"[data] File not found: {filepath}")
|
|
return {"items": []}
|
|
|
|
|
|
def _save_json(filename: str, data: dict):
|
|
filepath = DATA_DIR / filename
|
|
with open(filepath, 'w') as f:
|
|
json.dump(data, f, indent=2)
|
|
|
|
|
|
# === Loaders ===
|
|
|
|
def get_veins() -> List[Vein]:
|
|
data = _load_json("veins.json")
|
|
return VeinCollection(**data).items
|
|
|
|
|
|
def get_nests() -> List[Nest]:
|
|
data = _load_json("nests.json")
|
|
return NestCollection(**data).items
|
|
|
|
|
|
def get_larders() -> List[Larder]:
|
|
data = _load_json("larders.json")
|
|
return LarderCollection(**data).items
|
|
|
|
|
|
def get_templates() -> List[Template]:
|
|
data = _load_json("templates.json")
|
|
return TemplateCollection(**data).items
|
|
|
|
|
|
def get_tools() -> List[Tool]:
|
|
data = _load_json("tools.json")
|
|
return ToolCollection(**data).items
|
|
|
|
|
|
def get_cabinets() -> list:
|
|
"""Load cabinets (simple dict, no pydantic yet)."""
|
|
data = _load_json("cabinets.json")
|
|
return data.get("items", [])
|
|
|
|
|
|
def get_monitors() -> list:
|
|
"""Load monitors (simple dict, no pydantic yet)."""
|
|
data = _load_json("monitors.json")
|
|
return data.get("items", [])
|
|
|
|
|
|
def get_pulses() -> List[Pulse]:
|
|
data = _load_json("pulses.json")
|
|
return PulseCollection(**data).items
|
|
|
|
|
|
def get_books() -> List[Book]:
|
|
data = _load_json("books.json")
|
|
return BookCollection(**data).items
|
|
|
|
|
|
def get_tables() -> List[Table]:
|
|
data = _load_json("tables.json")
|
|
return TableCollection(**data).items
|
|
|
|
|
|
# === Helpers ===
|
|
|
|
def get_vein(name: str) -> Optional[Vein]:
|
|
for v in get_veins():
|
|
if v.name == name:
|
|
return v
|
|
return None
|
|
|
|
|
|
def get_nest(name: str) -> Optional[Nest]:
|
|
for n in get_nests():
|
|
if n.name == name:
|
|
return n
|
|
return None
|
|
|
|
|
|
def get_larder(name: str) -> Optional[Larder]:
|
|
for l in get_larders():
|
|
if l.name == name:
|
|
return l
|
|
return None
|
|
|
|
|
|
# === For frontend rendering ===
|
|
|
|
def get_artery_data() -> dict:
|
|
"""Data for artery frontend."""
|
|
return {
|
|
"veins": [v.model_dump() for v in get_veins()],
|
|
"nests": [n.model_dump() for n in get_nests()],
|
|
"larders": [l.model_dump() for l in get_larders()],
|
|
"pulses": [p.model_dump() for p in get_pulses()],
|
|
}
|
|
|
|
|
|
def get_album_data() -> dict:
|
|
"""Data for album frontend."""
|
|
return {
|
|
"templates": [t.model_dump() for t in get_templates()],
|
|
"larders": [l.model_dump() for l in get_larders()],
|
|
"books": [b.model_dump() for b in get_books()],
|
|
}
|
|
|
|
|
|
def get_ward_data() -> dict:
|
|
"""Data for ward frontend."""
|
|
return {
|
|
"tools": [t.model_dump() for t in get_tools()],
|
|
"monitors": get_monitors(),
|
|
"cabinets": get_cabinets(),
|
|
"nests": [n.model_dump() for n in get_nests()],
|
|
"larders": [l.model_dump() for l in get_larders()],
|
|
"tables": [t.model_dump() for t in get_tables()],
|
|
}
|