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

1""" 

2Session management models 

3""" 

4from datetime import datetime 

5from typing import Optional, List 

6from pydantic import BaseModel, Field 

7from uuid import UUID 

8 

9 

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 

23 

24 

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 

35 

36 

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 

51 

52 

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 

60 

61 

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 

69 

70 

71class SessionListResponse(BaseModel): 

72 """Response for session list""" 

73 sessions: List[RecordingSessionWithDetails] 

74 total: int 

75 page: int 

76 per_page: int 

77 

78 

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