Parcourir la source

API for gui settings

GuiSettingsAPI
Lorenzo Pollutri il y a 1 mois
Parent
révision
62fd7673dc
4 fichiers modifiés avec 114 ajouts et 0 suppressions
  1. +1
    -0
      logica_reslevis/config.py
  2. +72
    -0
      logica_reslevis/setting.py
  3. +31
    -0
      routes/reslevis.py
  4. +10
    -0
      schemas/reslevis.py

+ 1
- 0
logica_reslevis/config.py Voir le fichier

@@ -24,4 +24,5 @@ SUBJECT_JSON_PATH = DATA_DIR / "subject.json"
ALARM_JSON_PATH = DATA_DIR / "active_alarm.json"
TRACK_JSON_PATH = DATA_DIR / "tracks.json"
TRACKER_ZONE_JSON_PATH = DATA_DIR / "tracker_zone.json"
SETTING_JSON_PATH = DATA_DIR / "settings.json"


+ 72
- 0
logica_reslevis/setting.py Voir le fichier

@@ -0,0 +1,72 @@
import json
from typing import List, Dict, Any, Optional

from fastapi.encoders import jsonable_encoder

from schemas.reslevis import SettingItem
from .config import SETTING_JSON_PATH
from .gateway import _LockedFile, _atomic_write, _norm_str, _index_by_id


class SettingJsonRepository:
def __init__(self, json_path: str = SETTING_JSON_PATH):
self.path = json_path

def _read_all(self) -> List[Dict[str, Any]]:
with _LockedFile(self.path, "r") as fp:
try:
fp.seek(0)
data = fp.read().strip()
return json.loads(data) if data else []
except json.JSONDecodeError:
return []

def _write_all(self, rows: List[Dict[str, Any]]) -> None:
payload = json.dumps(rows, ensure_ascii=False, indent=2)
_atomic_write(self.path, payload)

def list(self, search_string: Optional[str] = None) -> List[Dict[str, Any]]:
rows = self._read_all()
if search_string:
s = search_string.lower()
rows = [
r
for r in rows
if any(
isinstance(r.get(k), str) and s in (r.get(k) or "").lower()
for k in ("name", "role", "language")
)
]
return rows

def add(self, item: SettingItem) -> None:
rows = self._read_all()
obj = jsonable_encoder(item)
obj_id = _norm_str(obj.get("id"))

if any(_norm_str(r.get("id")) == obj_id for r in rows):
raise ValueError(f"Setting con id '{obj_id}' gi\u00e0 presente")

rows.append(obj)
self._write_all(rows)

def update(self, item: SettingItem) -> None:
rows = self._read_all()
obj = jsonable_encoder(item)
obj_id = _norm_str(obj.get("id"))

idx = _index_by_id(rows, obj_id)
if idx is None:
raise ValueError(f"Setting con id '{obj_id}' non trovato")

rows[idx] = obj
self._write_all(rows)

def remove(self, setting_id: str) -> None:
rows = self._read_all()
idx = _index_by_id(rows, setting_id)
if idx is None:
raise ValueError(f"Setting con id '{setting_id}' non trovato")

del rows[idx]
self._write_all(rows)

+ 31
- 0
routes/reslevis.py Voir le fichier

@@ -14,6 +14,7 @@ from schemas.reslevis import (
AlarmItem,
TrackItem,
TrackerZoneItem,
SettingItem,
)

from logica_reslevis.gateway import GatewayJsonRepository
@@ -22,6 +23,7 @@ from logica_reslevis.floor import FloorJsonRepository
from logica_reslevis.zone import ZoneJsonRepository
from logica_reslevis.tracker import TrackerJsonRepository
from logica_reslevis.operator import OperatorJsonRepository
from logica_reslevis.setting import SettingJsonRepository
from logica_reslevis.subject import SubjectJsonRepository
from logica_reslevis.alarm import AlarmJsonRepository
from logica_reslevis.track import TrackJsonRepository
@@ -72,6 +74,7 @@ subject_repo = SubjectJsonRepository()
alarm_repo = AlarmJsonRepository()
track_repo = TrackJsonRepository()
tracker_zone_repo = TrackerZoneJsonRepository()
setting_repo = SettingJsonRepository()

def _none_if_empty(v):
return None if v in ("", None, 0, "0") else v
@@ -396,3 +399,31 @@ def updateSubject(item: SubjectItem):
def removeSubject(subject_id: str):
subject_repo.remove(subject_id)
return {"message": "OK"}


@router.get(
"/getSettings",
response_model=List[SettingItem],
tags=["Reslevis"],
dependencies=[Depends(get_current_user)],
)
def getSettings():
return setting_repo.list()


@router.post("/postSetting", tags=["Reslevis"], dependencies=[Depends(get_current_user)])
def postSetting(item: SettingItem):
setting_repo.add(item)
return {"message": "OK"}


@router.put("/updateSetting", tags=["Reslevis"], dependencies=[Depends(get_current_user)])
def updateSetting(item: SettingItem):
setting_repo.update(item)
return {"message": "OK"}


@router.delete("/removeSetting/{setting_id}", tags=["Reslevis"], dependencies=[Depends(get_current_user)])
def removeSetting(setting_id: str):
setting_repo.remove(setting_id)
return {"message": "OK"}

+ 10
- 0
schemas/reslevis.py Voir le fichier

@@ -59,6 +59,16 @@ class TrackerItem(BaseModel):
heartRate: Optional[str] = None
buttonPress: Optional[bool] = None

class SettingItem(BaseModel):
id: str
name: str
role: str
unit: int
update: Optional[int] = None
debug: bool
debugFields: Optional[List[str]] = None
language: str

class OperatorItem(BaseModel):
id: UUID
name: str


Chargement…
Annuler
Enregistrer