This commit is contained in:
2026-06-20 06:41:40 -04:00
parent 044ce40e69
commit 733e9b426f
9 changed files with 471 additions and 86 deletions
+52 -10
View File
@@ -7,6 +7,7 @@ from sqlalchemy.orm import Session
from app.api.deps import get_current_operator_user, get_current_read_user, get_db
from app.core.email import email_service
from app.core.config import settings
from app.core.frz import swansea_frz_geojson
from app.core.utils import get_client_ip
from app.crud.crud_drone_request import drone_request as crud_drone_request
from app.crud.crud_journal import journal as crud_journal
@@ -56,6 +57,43 @@ async def _send_drone_email(drone_request, subject: str, message: str):
)
async def _send_drone_submitted_email(drone_request):
await email_service.send_email(
to_email=drone_request.email,
subject=f"Drone flight request received {drone_request.reference_number}",
template_name="drone_request_submitted.html",
template_vars={
"name": drone_request.operator_name,
"reference_number": drone_request.reference_number,
"status": drone_request.status.value,
"takeoff_time": drone_request.estimated_takeoff_at.strftime("%Y-%m-%d %H:%M"),
"completion_time": drone_request.estimated_completion_at.strftime("%Y-%m-%d %H:%M"),
"location": drone_request.location_description or f"{drone_request.location_latitude}, {drone_request.location_longitude}",
"maximum_elevation_ft_amsl": drone_request.maximum_elevation_ft_amsl,
"edit_url": f"{settings.base_url}/drone-request.html?token={drone_request.public_token}" if drone_request.public_token else None,
},
)
async def _send_drone_approved_email(drone_request, message: Optional[str] = None):
await email_service.send_email(
to_email=drone_request.email,
subject=f"Drone request {drone_request.reference_number} APPROVED",
template_name="drone_request_approved.html",
template_vars={
"name": drone_request.operator_name,
"reference_number": drone_request.reference_number,
"status": drone_request.status.value,
"message": message,
"takeoff_time": drone_request.estimated_takeoff_at.strftime("%Y-%m-%d %H:%M"),
"completion_time": drone_request.estimated_completion_at.strftime("%Y-%m-%d %H:%M"),
"location": drone_request.location_description or f"{drone_request.location_latitude}, {drone_request.location_longitude}",
"maximum_elevation_ft_amsl": drone_request.maximum_elevation_ft_amsl,
"edit_url": f"{settings.base_url}/drone-request.html?token={drone_request.public_token}" if drone_request.public_token else None,
},
)
@router.get("/", response_model=List[DroneRequest])
async def get_drone_requests(
skip: int = 0,
@@ -92,11 +130,7 @@ async def create_public_drone_request(
)
await _broadcast(request, "drone_request_created", drone_request)
await _send_drone_email(
drone_request,
f"Drone flight request received {drone_request.reference_number}",
"We have received your drone flight request. We will email you when the approval status changes or if we need more information.",
)
await _send_drone_submitted_email(drone_request)
return drone_request
@@ -172,6 +206,11 @@ async def cancel_drone_request_public(
return cancelled_request
@router.get("/frz")
async def get_swansea_drone_frz():
return swansea_frz_geojson()
@router.get("/{request_id}", response_model=DroneRequest)
async def get_drone_request(
request_id: int,
@@ -230,11 +269,14 @@ async def update_drone_request_status(
await _broadcast(request, "drone_request_status_update", drone_request)
message = status_update.comment or f"Your drone flight request status is now {drone_request.status.value}."
await _send_drone_email(
drone_request,
f"Drone request {drone_request.reference_number} {drone_request.status.value}",
message,
)
if drone_request.status == DroneRequestStatus.APPROVED:
await _send_drone_approved_email(drone_request, status_update.comment)
else:
await _send_drone_email(
drone_request,
f"Drone request {drone_request.reference_number} {drone_request.status.value}",
message,
)
return drone_request