64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
"""API voor het plugin-framework: modules opvragen en aan/uit zetten."""
|
|
from rest_framework import status
|
|
from rest_framework.decorators import api_view, permission_classes
|
|
from rest_framework.response import Response
|
|
|
|
from core.audit import audit_log
|
|
from core.permissions import AdminRolePermission
|
|
|
|
from .models import AuditEvent
|
|
from . import services
|
|
|
|
|
|
@api_view(["GET"])
|
|
def module_list(request):
|
|
"""Alle modules met metadata en actuele aan/uit-status."""
|
|
services.sync_states()
|
|
return Response(services.describe_all())
|
|
|
|
|
|
@api_view(["POST"])
|
|
@permission_classes([AdminRolePermission])
|
|
def module_set_state(request, key: str):
|
|
"""Zet één module aan of uit (alleen beheerders). Body: {"enabled": true|false}."""
|
|
enabled = request.data.get("enabled")
|
|
# Expliciet een echte boolean eisen: bool("false") zou True zijn.
|
|
if not isinstance(enabled, bool):
|
|
return Response(
|
|
{"detail": "Veld 'enabled' moet true of false zijn."},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
try:
|
|
services.set_enabled(key, enabled)
|
|
except services.ModuleError as exc:
|
|
return Response({"detail": str(exc)}, status=status.HTTP_400_BAD_REQUEST)
|
|
audit_log(request, "module_set_state", f"Module:{key}", {"enabled": enabled})
|
|
return Response(services.describe_all())
|
|
|
|
|
|
@api_view(["GET"])
|
|
@permission_classes([AdminRolePermission])
|
|
def audit_log_list(request):
|
|
qs = AuditEvent.objects.all()
|
|
action = request.query_params.get("action")
|
|
actor = request.query_params.get("actor")
|
|
if action:
|
|
qs = qs.filter(action__icontains=action)
|
|
if actor:
|
|
qs = qs.filter(actor__icontains=actor)
|
|
try:
|
|
limit = min(max(int(request.query_params.get("limit", 100)), 1), 500)
|
|
except ValueError:
|
|
limit = 100
|
|
return Response([
|
|
{
|
|
"id": event.id,
|
|
"created_at": event.created_at,
|
|
"actor": event.actor,
|
|
"action": event.action,
|
|
"target": event.target,
|
|
"ip_address": event.ip_address,
|
|
"extra": event.extra,
|
|
}
|
|
for event in qs[:limit]
|
|
])
|