Coverage for app\routers\calibration.py: 32%
73 statements
« prev ^ index » next coverage.py v7.3.2, created at 2026-01-15 13:39 +0300
« prev ^ index » next coverage.py v7.3.2, created at 2026-01-15 13:39 +0300
1from typing import List
2from fastapi import APIRouter, Depends, HTTPException
3from sqlalchemy.orm import Session
4from ..db import SessionLocal, CalibrationZone, CameraBinding, School
5from ..schemas import calibration as schemas
6from ..deps import get_db
8router = APIRouter()
10# Zones
11@router.post("/zones", response_model=schemas.CalibrationZone)
12def create_zone(zone: schemas.CalibrationZoneCreate, db: Session = Depends(get_db)):
13 # Verify school exists
14 school = db.query(School).filter(School.id == zone.school_id).first()
15 if not school:
16 raise HTTPException(status_code=404, detail="School not found")
18 db_zone = CalibrationZone(
19 school_id=zone.school_id,
20 name=zone.name,
21 type=zone.type,
22 points=[p.model_dump() for p in zone.points],
23 metadata_json=zone.metadata_json
24 )
25 db.add(db_zone)
26 db.commit()
27 db.refresh(db_zone)
28 return db_zone
30@router.get("/zones/school/{school_id}", response_model=List[schemas.CalibrationZone])
31def list_zones_by_school(school_id: str, db: Session = Depends(get_db)):
32 return db.query(CalibrationZone).filter(CalibrationZone.school_id == school_id).all()
34@router.get("/zones/{zone_id}", response_model=schemas.CalibrationZone)
35def get_zone(zone_id: str, db: Session = Depends(get_db)):
36 zone = db.query(CalibrationZone).filter(CalibrationZone.id == zone_id).first()
37 if not zone:
38 raise HTTPException(status_code=404, detail="Zone not found")
39 return zone
41@router.put("/zones/{zone_id}", response_model=schemas.CalibrationZone)
42def update_zone(zone_id: str, zone_update: schemas.CalibrationZoneUpdate, db: Session = Depends(get_db)):
43 db_zone = db.query(CalibrationZone).filter(CalibrationZone.id == zone_id).first()
44 if not db_zone:
45 raise HTTPException(status_code=404, detail="Zone not found")
47 if zone_update.name is not None:
48 db_zone.name = zone_update.name
49 if zone_update.type is not None:
50 db_zone.type = zone_update.type
51 if zone_update.points is not None:
52 db_zone.points = [p.model_dump() for p in zone_update.points]
53 if zone_update.metadata_json is not None:
54 db_zone.metadata_json = zone_update.metadata_json
56 db.commit()
57 db.refresh(db_zone)
58 return db_zone
60@router.delete("/zones/{zone_id}")
61def delete_zone(zone_id: str, db: Session = Depends(get_db)):
62 db_zone = db.query(CalibrationZone).filter(CalibrationZone.id == zone_id).first()
63 if not db_zone:
64 raise HTTPException(status_code=404, detail="Zone not found")
66 db.delete(db_zone)
67 db.commit()
68 return {"status": "deleted"}
70# Camera Bindings
71@router.post("/bindings", response_model=schemas.CameraBinding)
72def create_binding(binding: schemas.CameraBindingCreate, db: Session = Depends(get_db)):
73 # Verify zone exists
74 zone = db.query(CalibrationZone).filter(CalibrationZone.id == binding.zone_id).first()
75 if not zone:
76 raise HTTPException(status_code=404, detail="Zone not found")
78 # Fix common typo
79 if binding.stream_url and binding.stream_url.startswith("rstp://"):
80 binding.stream_url = binding.stream_url.replace("rstp://", "rtsp://", 1)
82 db_binding = CameraBinding(
83 zone_id=binding.zone_id,
84 camera_id=binding.camera_id,
85 stream_url=binding.stream_url,
86 status=binding.status
87 )
88 db.add(db_binding)
89 db.commit()
90 db.refresh(db_binding)
91 return db_binding
93@router.get("/bindings/zone/{zone_id}", response_model=List[schemas.CameraBinding])
94def list_bindings_by_zone(zone_id: str, db: Session = Depends(get_db)):
95 return db.query(CameraBinding).filter(CameraBinding.zone_id == zone_id).all()
97@router.delete("/bindings/{binding_id}")
98def delete_binding(binding_id: str, db: Session = Depends(get_db)):
99 db_binding = db.query(CameraBinding).filter(CameraBinding.id == binding_id).first()
100 if not db_binding:
101 raise HTTPException(status_code=404, detail="Binding not found")
103 db.delete(db_binding)
104 db.commit()
105 return {"status": "deleted"}