ソースを参照

Merge branch 'ZoneAreaDefinition_API'

Settings_GUI_API
root 3週間前
コミット
3d64609191
8個のファイルの変更115行の追加0行の削除
  1. バイナリ
      logica_reslevis/__pycache__/config.cpython-313.pyc
  2. バイナリ
      logica_reslevis/__pycache__/zone_area_definition.cpython-313.pyc
  3. +1
    -0
      logica_reslevis/config.py
  4. +72
    -0
      logica_reslevis/zone_area_definition.py
  5. バイナリ
      routes/__pycache__/reslevis.cpython-313.pyc
  6. +31
    -0
      routes/reslevis.py
  7. バイナリ
      schemas/__pycache__/reslevis.cpython-313.pyc
  8. +11
    -0
      schemas/reslevis.py

バイナリ
logica_reslevis/__pycache__/config.cpython-313.pyc ファイルの表示


バイナリ
logica_reslevis/__pycache__/zone_area_definition.cpython-313.pyc ファイルの表示


+ 1
- 0
logica_reslevis/config.py ファイルの表示

@@ -18,6 +18,7 @@ GATEWAY_JSON_PATH = DATA_DIR / "gateway_list.json"
BUILDING_JSON_PATH = DATA_DIR / "building.json"
FLOOR_JSON_PATH = DATA_DIR / "floors.json"
ZONE_JSON_PATH = DATA_DIR / "zone_list.json"
ZONE_AREA_DEFINITION_JSON_PATH = DATA_DIR / "zone_area_definition.json"
TRACKER_JSON_PATH = DATA_DIR / "tracker_conf.json"
OPERATOR_JSON_PATH = DATA_DIR / "oper_conf.json"
SUBJECT_JSON_PATH = DATA_DIR / "subject.json"


+ 72
- 0
logica_reslevis/zone_area_definition.py ファイルの表示

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

from fastapi.encoders import jsonable_encoder

from schemas.reslevis import ZoneAreaDefinitionItem
from .config import ZONE_AREA_DEFINITION_JSON_PATH
from .gateway import _LockedFile, _atomic_write, _norm_str


class ZoneAreaDefinitionJsonRepository:
def __init__(self, json_path: str = ZONE_AREA_DEFINITION_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 _index_by_uuid(self, rows: List[Dict[str, Any]], item_uuid: str) -> Optional[int]:
target = _norm_str(item_uuid)
for idx, row in enumerate(rows):
if _norm_str(row.get("UUID")) == target:
return idx
return None

def list(self, item_uuid: Optional[str] = None) -> List[Dict[str, Any]]:
rows = self._read_all()
if item_uuid:
idx = self._index_by_uuid(rows, item_uuid)
return [rows[idx]] if idx is not None else []
return rows

def add(self, item: ZoneAreaDefinitionItem) -> None:
rows = self._read_all()
obj = jsonable_encoder(item)
obj_uuid = _norm_str(obj.get("UUID"))

if self._index_by_uuid(rows, obj_uuid) is not None:
raise ValueError(f"ZoneAreaDefinition con UUID '{obj_uuid}' già presente")

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

def update(self, item: ZoneAreaDefinitionItem) -> None:
rows = self._read_all()
obj = jsonable_encoder(item)
obj_uuid = _norm_str(obj.get("UUID"))

idx = self._index_by_uuid(rows, obj_uuid)
if idx is None:
raise ValueError(f"ZoneAreaDefinition con UUID '{obj_uuid}' non trovato")

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

def remove(self, item_uuid: str) -> None:
rows = self._read_all()
idx = self._index_by_uuid(rows, item_uuid)
if idx is None:
raise ValueError(f"ZoneAreaDefinition con UUID '{item_uuid}' non trovato")

del rows[idx]
self._write_all(rows)

バイナリ
routes/__pycache__/reslevis.cpython-313.pyc ファイルの表示


+ 31
- 0
routes/reslevis.py ファイルの表示

@@ -11,6 +11,7 @@ from schemas.reslevis import (
BuildingItem,
FloorItem,
ZoneItem,
ZoneAreaDefinitionItem,
GatewayItem,
TrackerItem,
OperatorItem,
@@ -26,6 +27,7 @@ from logica_reslevis.gateway import GatewayJsonRepository
from logica_reslevis.building import BuildingJsonRepository
from logica_reslevis.floor import FloorJsonRepository
from logica_reslevis.zone import ZoneJsonRepository
from logica_reslevis.zone_area_definition import ZoneAreaDefinitionJsonRepository
from logica_reslevis.tracker import TrackerJsonRepository
from logica_reslevis.operator import OperatorJsonRepository
from logica_reslevis.setting import SettingJsonRepository
@@ -74,6 +76,7 @@ gateway_repo = GatewayJsonRepository()
building_repo = BuildingJsonRepository()
floor_repo = FloorJsonRepository()
zone_repo = ZoneJsonRepository()
zone_area_definition_repo = ZoneAreaDefinitionJsonRepository()
tracker_repo = TrackerJsonRepository()
operator_repo = OperatorJsonRepository()
subject_repo = SubjectJsonRepository()
@@ -306,6 +309,34 @@ def removeZone(zone_id: str):
return {"message": "OK"}


@router.get(
"/getZoneAreaDefinitions",
response_model=List[ZoneAreaDefinitionItem],
tags=["Reslevis"],
dependencies=[Depends(get_current_user)],
)
def getZoneAreaDefinitions(UUID: str | None = None):
return zone_area_definition_repo.list(UUID)


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


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


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


@router.get(
"/getTrackers",
response_model=List[TrackerItem],


バイナリ
schemas/__pycache__/reslevis.cpython-313.pyc ファイルの表示


+ 11
- 0
schemas/reslevis.py ファイルの表示

@@ -29,6 +29,17 @@ class ZoneItem(BaseModel):
floor: Optional[UUID] = None
building: Optional[UUID] = None


class ZoneAreaPointItem(BaseModel):
x: float
y: float


class ZoneAreaDefinitionItem(BaseModel):
UUID: UUID
ZoneUUID: UUID
points: List[ZoneAreaPointItem]

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


読み込み中…
キャンセル
保存