routers/admin_flows.py: pro Organisation unbestätigte Geräte anzeigen und bestätigen (Bereitstellungsvorlage zuweisen), Enrollment Sessions anlegen/widerrufen. Confirm-Aktion ruft direkt anodes bestehenden resolve-Endpoint auf. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
from fastapi import APIRouter, Depends, Form, Request
|
|
from fastapi.responses import RedirectResponse
|
|
|
|
from anode_client import anode_request
|
|
from auth import require_admin
|
|
from templating import templates
|
|
|
|
|
|
router = APIRouter(prefix="/admin/flows")
|
|
|
|
|
|
@router.get("")
|
|
def index(request: Request, user: dict = Depends(require_admin)):
|
|
result = anode_request("GET", "/api/v1/organizations")
|
|
organizations = result.get("organizations", []) if result.get("success") else []
|
|
|
|
return templates.TemplateResponse(
|
|
request, "admin/flows_index.html", {"user": user, "organizations": organizations}
|
|
)
|
|
|
|
|
|
@router.get("/{organization_id}")
|
|
def organisation_flows(request: Request, organization_id: str, user: dict = Depends(require_admin)):
|
|
orgs_result = anode_request("GET", "/api/v1/organizations")
|
|
organizations = orgs_result.get("organizations", []) if orgs_result.get("success") else []
|
|
organization = next((o for o in organizations if o["id"] == organization_id), None)
|
|
|
|
unassigned_result = anode_request(
|
|
"GET", f"/api/v1/organizations/{organization_id}/devices/unassigned"
|
|
)
|
|
unassigned_devices = unassigned_result.get("devices", []) if unassigned_result.get("success") else []
|
|
|
|
sessions_result = anode_request(
|
|
"GET", f"/api/v1/organizations/{organization_id}/enrollment-sessions"
|
|
)
|
|
enrollment_sessions = sessions_result.get("enrollment_sessions", []) if sessions_result.get("success") else []
|
|
|
|
templates_result = anode_request(
|
|
"GET", f"/api/v1/organizations/{organization_id}/bereitstellungsvorlagen"
|
|
)
|
|
bereitstellungsvorlagen = templates_result.get("bereitstellungsvorlagen", []) if templates_result.get("success") else []
|
|
|
|
return templates.TemplateResponse(
|
|
request,
|
|
"admin/flows_organisation.html",
|
|
{
|
|
"user": user,
|
|
"organization": organization,
|
|
"organization_id": organization_id,
|
|
"unassigned_devices": unassigned_devices,
|
|
"enrollment_sessions": enrollment_sessions,
|
|
"bereitstellungsvorlagen": bereitstellungsvorlagen,
|
|
},
|
|
)
|
|
|
|
|
|
@router.post("/{organization_id}/geraete/{device_id}/bestaetigen")
|
|
def geraet_bestaetigen(
|
|
organization_id: str,
|
|
device_id: str,
|
|
bereitstellungsvorlage_id: str = Form(...),
|
|
user: dict = Depends(require_admin),
|
|
):
|
|
anode_request(
|
|
"POST",
|
|
f"/api/v1/templates/{bereitstellungsvorlage_id}/resolve",
|
|
json={"device_id": device_id},
|
|
)
|
|
|
|
return RedirectResponse(f"/admin/flows/{organization_id}", status_code=303)
|
|
|
|
|
|
@router.post("/{organization_id}/enrollment-sessions")
|
|
def enrollment_session_anlegen(
|
|
organization_id: str,
|
|
bereitstellungsvorlage_id: str = Form(...),
|
|
max_devices: int = Form(...),
|
|
expires_at: str = Form(...),
|
|
user: dict = Depends(require_admin),
|
|
):
|
|
anode_request(
|
|
"POST",
|
|
f"/api/v1/organizations/{organization_id}/enrollment-sessions",
|
|
json={
|
|
"bereitstellungsvorlage_id": bereitstellungsvorlage_id,
|
|
"max_devices": max_devices,
|
|
"expires_at": expires_at,
|
|
},
|
|
)
|
|
|
|
return RedirectResponse(f"/admin/flows/{organization_id}", status_code=303)
|
|
|
|
|
|
@router.post("/{organization_id}/enrollment-sessions/{session_id}/widerrufen")
|
|
def enrollment_session_widerrufen(
|
|
organization_id: str, session_id: str, user: dict = Depends(require_admin)
|
|
):
|
|
anode_request("POST", f"/api/v1/enrollment-sessions/{session_id}/revoke")
|
|
|
|
return RedirectResponse(f"/admin/flows/{organization_id}", status_code=303)
|