diff --git a/authentik/blueprints/api.py b/authentik/blueprints/api.py index 97e610114..7f6e153e3 100644 --- a/authentik/blueprints/api.py +++ b/authentik/blueprints/api.py @@ -1,6 +1,4 @@ """Serializer mixin for managed models""" -from dataclasses import asdict - from drf_spectacular.utils import extend_schema, inline_serializer from rest_framework.decorators import action from rest_framework.fields import CharField, DateTimeField, JSONField @@ -12,10 +10,9 @@ from rest_framework.viewsets import ModelViewSet from authentik.api.decorators import permission_required from authentik.blueprints.models import BlueprintInstance -from authentik.blueprints.v1.tasks import BlueprintFile, apply_blueprint, blueprints_find +from authentik.blueprints.v1.tasks import apply_blueprint, blueprints_find_dict from authentik.core.api.used_by import UsedByMixin from authentik.core.api.utils import PassiveSerializer -from authentik.events.utils import sanitize_dict class ManagedSerializer: @@ -85,8 +82,8 @@ class BlueprintInstanceViewSet(UsedByMixin, ModelViewSet): @action(detail=False, pagination_class=None, filter_backends=[]) def available(self, request: Request) -> Response: """Get blueprints""" - files: list[BlueprintFile] = blueprints_find.delay().get() - return Response([sanitize_dict(asdict(file)) for file in files]) + files: list[dict] = blueprints_find_dict.delay().get() + return Response(files) @permission_required("authentik_blueprints.view_blueprintinstance") @extend_schema( diff --git a/authentik/blueprints/v1/tasks.py b/authentik/blueprints/v1/tasks.py index a36fb0ed3..4b7b41af8 100644 --- a/authentik/blueprints/v1/tasks.py +++ b/authentik/blueprints/v1/tasks.py @@ -21,6 +21,7 @@ from authentik.events.monitored_tasks import ( TaskResultStatus, prefill_task, ) +from authentik.events.utils import sanitize_dict from authentik.lib.config import CONFIG from authentik.root.celery import CELERY_APP @@ -39,6 +40,14 @@ class BlueprintFile: @CELERY_APP.task( throws=(DatabaseError, ProgrammingError, InternalError), ) +def blueprints_find_dict(): + """Find blueprints as `blueprints_find` does, but return a safe dict""" + blueprints = [] + for blueprint in blueprints_find(): + blueprints.append(sanitize_dict(asdict(blueprint))) + return blueprints + + def blueprints_find(): """Find blueprints and return valid ones""" blueprints = []