sdf
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-09-26 12:22:14 +09:00
parent ca32dc8867
commit 7c22664daf
33 changed files with 3267 additions and 1429 deletions

View File

@@ -1,6 +1,7 @@
from datetime import datetime
from enum import Enum
from typing import List, Optional
from uuid import UUID
from pydantic import BaseModel, Field
@@ -11,6 +12,16 @@ class AlertType(str, Enum):
VIOLENCE = "violence"
HARASSMENT = "harassment"
UNSAFE_AREA = "unsafe_area"
ACCIDENT = "accident"
FIRE = "fire"
NATURAL_DISASTER = "natural_disaster"
class AlertStatus(str, Enum):
ACTIVE = "active"
RESOLVED = "resolved"
CANCELLED = "cancelled"
INVESTIGATING = "investigating"
class ResponseType(str, Enum):
@@ -18,30 +29,45 @@ class ResponseType(str, Enum):
CONTACTED_AUTHORITIES = "contacted_authorities"
SAFE_NOW = "safe_now"
FALSE_ALARM = "false_alarm"
INVESTIGATING = "investigating"
RESOLVED = "resolved"
class EmergencyAlertCreate(BaseModel):
latitude: float = Field(..., ge=-90, le=90)
longitude: float = Field(..., ge=-180, le=180)
latitude: float = Field(..., ge=-90, le=90, description="Latitude coordinate")
longitude: float = Field(..., ge=-180, le=180, description="Longitude coordinate")
alert_type: AlertType = AlertType.GENERAL
message: Optional[str] = Field(None, max_length=500)
address: Optional[str] = Field(None, max_length=500)
message: Optional[str] = Field(None, max_length=500, description="Emergency description")
address: Optional[str] = Field(None, max_length=500, description="Location address")
contact_emergency_services: bool = Field(default=True, description="Contact emergency services automatically")
notify_emergency_contacts: bool = Field(default=True, description="Notify user's emergency contacts")
class EmergencyAlertUpdate(BaseModel):
message: Optional[str] = None
is_resolved: Optional[bool] = None
class EmergencyAlertResponse(BaseModel):
id: int
uuid: str
uuid: UUID
user_id: int
latitude: float
longitude: float
address: Optional[str]
alert_type: str
message: Optional[str]
is_resolved: bool
resolved_at: Optional[datetime]
notified_users_count: int
responded_users_count: int
address: Optional[str] = None
alert_type: AlertType
message: Optional[str] = None
is_resolved: bool = False
resolved_at: Optional[datetime] = None
resolved_notes: Optional[str] = None
notified_users_count: int = 0
responded_users_count: int = 0
created_at: datetime
updated_at: Optional[datetime] = None
# User information
user_name: Optional[str] = None
user_phone: Optional[str] = None
class Config:
from_attributes = True
@@ -49,33 +75,92 @@ class EmergencyAlertResponse(BaseModel):
class EmergencyResponseCreate(BaseModel):
response_type: ResponseType
message: Optional[str] = Field(None, max_length=500)
eta_minutes: Optional[int] = Field(None, ge=0, le=240) # Max 4 hours
message: Optional[str] = Field(None, max_length=500, description="Response message")
eta_minutes: Optional[int] = Field(None, ge=0, le=240, description="Estimated time of arrival in minutes")
class EmergencyResponseResponse(BaseModel):
id: int
alert_id: int
responder_id: int
response_type: str
message: Optional[str]
eta_minutes: Optional[int]
response_type: ResponseType
message: Optional[str] = None
eta_minutes: Optional[int] = None
created_at: datetime
# Responder information
responder_name: Optional[str] = None
responder_phone: Optional[str] = None
class Config:
from_attributes = True
# Report schemas
class EmergencyReportCreate(BaseModel):
latitude: float = Field(..., ge=-90, le=90)
longitude: float = Field(..., ge=-180, le=180)
report_type: str = Field(..., description="Type of emergency report")
description: str = Field(..., min_length=10, max_length=1000)
address: Optional[str] = Field(None, max_length=500)
is_anonymous: bool = Field(default=False)
severity: int = Field(default=3, ge=1, le=5, description="Severity level 1-5")
class EmergencyReportResponse(BaseModel):
id: int
uuid: UUID
user_id: Optional[int] = None
latitude: float
longitude: float
address: Optional[str] = None
report_type: str
description: str
is_anonymous: bool
severity: int
status: str = "pending"
created_at: datetime
class Config:
from_attributes = True
class NearbyUsersResponse(BaseModel):
user_id: int
distance_meters: float
# Statistics schemas
class EmergencyStatistics(BaseModel):
total_alerts: int = 0
active_alerts: int = 0
resolved_alerts: int = 0
total_responders: int = 0
avg_response_time_minutes: float = 0
# Location-based schemas
class NearbyAlertResponse(BaseModel):
id: int
alert_type: str
latitude: float
longitude: float
address: Optional[str] = None
distance_km: float
created_at: datetime
responded_users_count: int = 0
class EmergencyStats(BaseModel):
total_alerts: int
active_alerts: int
resolved_alerts: int
avg_response_time_minutes: Optional[float]
total_responders: int
# Safety check schemas
class SafetyCheckCreate(BaseModel):
message: Optional[str] = Field(None, max_length=200)
location_latitude: Optional[float] = Field(None, ge=-90, le=90)
location_longitude: Optional[float] = Field(None, ge=-180, le=180)
class SafetyCheckResponse(BaseModel):
id: int
uuid: UUID
user_id: int
message: Optional[str] = None
location_latitude: Optional[float] = None
location_longitude: Optional[float] = None
created_at: datetime
class Config:
from_attributes = True