Coverage for services/data-ingestion-web/src/models/session.py: 100%
64 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-25 16:18 +0000
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-25 16:18 +0000
1"""
2Session management models
3"""
4from datetime import datetime
5from typing import Optional, List
6from pydantic import BaseModel, Field
7from uuid import UUID
10class KnownSource(BaseModel):
11 """Known RF source for training"""
12 id: UUID
13 name: str
14 description: Optional[str] = None
15 frequency_hz: int
16 latitude: float
17 longitude: float
18 power_dbm: Optional[float] = None
19 source_type: Optional[str] = None
20 is_validated: bool = False
21 created_at: datetime
22 updated_at: datetime
25class KnownSourceCreate(BaseModel):
26 """Create a new known source"""
27 name: str
28 description: Optional[str] = None
29 frequency_hz: int = Field(..., gt=0, description="Frequency in Hz")
30 latitude: float = Field(..., ge=-90, le=90)
31 longitude: float = Field(..., ge=-180, le=180)
32 power_dbm: Optional[float] = None
33 source_type: Optional[str] = None
34 is_validated: bool = False
37class RecordingSession(BaseModel):
38 """Recording session model"""
39 id: UUID
40 known_source_id: UUID
41 session_name: str
42 session_start: datetime
43 session_end: Optional[datetime] = None
44 duration_seconds: Optional[float] = None
45 celery_task_id: Optional[str] = None
46 status: str # pending, in_progress, completed, failed
47 approval_status: str = "pending" # pending, approved, rejected
48 notes: Optional[str] = None
49 created_at: datetime
50 updated_at: datetime
53class RecordingSessionCreate(BaseModel):
54 """Create a new recording session"""
55 known_source_id: UUID
56 session_name: str
57 frequency_hz: int = Field(..., gt=0, description="Frequency in Hz")
58 duration_seconds: float = Field(..., gt=0, le=3600, description="Duration in seconds (max 1 hour)")
59 notes: Optional[str] = None
62class RecordingSessionWithDetails(RecordingSession):
63 """Recording session with source details"""
64 source_name: str
65 source_frequency: int
66 source_latitude: float
67 source_longitude: float
68 measurements_count: int = 0
71class SessionListResponse(BaseModel):
72 """Response for session list"""
73 sessions: List[RecordingSessionWithDetails]
74 total: int
75 page: int
76 per_page: int
79class SessionAnalytics(BaseModel):
80 """Analytics for sessions"""
81 total_sessions: int
82 completed_sessions: int
83 failed_sessions: int
84 pending_sessions: int
85 success_rate: float
86 total_measurements: int
87 average_duration_seconds: Optional[float] = None
88 average_accuracy_meters: Optional[float] = None