From 2ae164df78fb9ac8d10bb43085e1347df37a4186 Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Thu, 26 Aug 2021 09:36:41 +0200 Subject: [PATCH] *: cleanup api schema warnings Signed-off-by: Jens Langhammer --- authentik/core/api/applications.py | 20 ++----- authentik/core/api/utils.py | 16 ++++-- authentik/flows/api/flows.py | 23 ++++---- authentik/providers/oauth2/api/provider.py | 14 ++--- authentik/providers/saml/api.py | 6 +-- schema.yml | 52 ++++++++++--------- web/src/pages/applications/ApplicationForm.ts | 2 +- web/src/pages/flows/FlowForm.ts | 2 +- 8 files changed, 68 insertions(+), 67 deletions(-) diff --git a/authentik/core/api/applications.py b/authentik/core/api/applications.py index 02c19844f..e9b77db73 100644 --- a/authentik/core/api/applications.py +++ b/authentik/core/api/applications.py @@ -4,14 +4,9 @@ from django.db.models import QuerySet from django.http.response import HttpResponseBadRequest from django.shortcuts import get_object_or_404 from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import ( - OpenApiParameter, - OpenApiResponse, - extend_schema, - inline_serializer, -) +from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema from rest_framework.decorators import action -from rest_framework.fields import BooleanField, CharField, FileField, ReadOnlyField +from rest_framework.fields import ReadOnlyField from rest_framework.parsers import MultiPartParser from rest_framework.request import Request from rest_framework.response import Response @@ -24,6 +19,7 @@ from authentik.admin.api.metrics import CoordinateSerializer, get_events_per_1h from authentik.api.decorators import permission_required from authentik.core.api.providers import ProviderSerializer from authentik.core.api.used_by import UsedByMixin +from authentik.core.api.utils import FilePathSerializer, FileUploadSerializer from authentik.core.models import Application, User from authentik.events.models import EventAction from authentik.policies.api.exec import PolicyTestResultSerializer @@ -180,13 +176,7 @@ class ApplicationViewSet(UsedByMixin, ModelViewSet): @permission_required("authentik_core.change_application") @extend_schema( request={ - "multipart/form-data": inline_serializer( - "SetIcon", - fields={ - "file": FileField(required=False), - "clear": BooleanField(default=False), - }, - ) + "multipart/form-data": FileUploadSerializer, }, responses={ 200: OpenApiResponse(description="Success"), @@ -218,7 +208,7 @@ class ApplicationViewSet(UsedByMixin, ModelViewSet): @permission_required("authentik_core.change_application") @extend_schema( - request=inline_serializer("SetIconURL", fields={"url": CharField()}), + request=FilePathSerializer, responses={ 200: OpenApiResponse(description="Success"), 400: OpenApiResponse(description="Bad request"), diff --git a/authentik/core/api/utils.py b/authentik/core/api/utils.py index 1ebd8eea0..2703d3c70 100644 --- a/authentik/core/api/utils.py +++ b/authentik/core/api/utils.py @@ -2,7 +2,7 @@ from typing import Any from django.db.models import Model -from rest_framework.fields import CharField, IntegerField +from rest_framework.fields import BooleanField, CharField, FileField, IntegerField from rest_framework.serializers import Serializer, SerializerMethodField, ValidationError @@ -22,8 +22,18 @@ class PassiveSerializer(Serializer): def update(self, instance: Model, validated_data: dict) -> Model: # pragma: no cover return Model() - class Meta: - model = Model + +class FileUploadSerializer(PassiveSerializer): + """Serializer to upload file""" + + file = FileField(required=False) + clear = BooleanField(default=False) + + +class FilePathSerializer(PassiveSerializer): + """Serializer to upload file""" + + url = CharField() class MetaNameSerializer(PassiveSerializer): diff --git a/authentik/flows/api/flows.py b/authentik/flows/api/flows.py index d6ebd4e83..602cc4654 100644 --- a/authentik/flows/api/flows.py +++ b/authentik/flows/api/flows.py @@ -7,10 +7,10 @@ from django.http.response import HttpResponseBadRequest, JsonResponse from django.urls import reverse from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes -from drf_spectacular.utils import OpenApiResponse, extend_schema, inline_serializer +from drf_spectacular.utils import OpenApiResponse, extend_schema from guardian.shortcuts import get_objects_for_user from rest_framework.decorators import action -from rest_framework.fields import BooleanField, FileField, ReadOnlyField +from rest_framework.fields import ReadOnlyField from rest_framework.parsers import MultiPartParser from rest_framework.request import Request from rest_framework.response import Response @@ -20,7 +20,12 @@ from structlog.stdlib import get_logger from authentik.api.decorators import permission_required from authentik.core.api.used_by import UsedByMixin -from authentik.core.api.utils import CacheSerializer, LinkSerializer +from authentik.core.api.utils import ( + CacheSerializer, + FilePathSerializer, + FileUploadSerializer, + LinkSerializer, +) from authentik.flows.exceptions import FlowNonApplicableException from authentik.flows.models import Flow from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER, FlowPlanner, cache_key @@ -147,7 +152,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet): ], ) @extend_schema( - request={"multipart/form-data": inline_serializer("SetIcon", fields={"file": FileField()})}, + request={"multipart/form-data": FileUploadSerializer}, responses={ 204: OpenApiResponse(description="Successfully imported flow"), 400: OpenApiResponse(description="Bad request"), @@ -259,13 +264,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet): @permission_required("authentik_flows.change_flow") @extend_schema( request={ - "multipart/form-data": inline_serializer( - "SetIcon", - fields={ - "file": FileField(required=False), - "clear": BooleanField(default=False), - }, - ) + "multipart/form-data": FileUploadSerializer, }, responses={ 200: OpenApiResponse(description="Success"), @@ -301,7 +300,7 @@ class FlowViewSet(UsedByMixin, ModelViewSet): @permission_required("authentik_core.change_application") @extend_schema( - request=inline_serializer("SetIconURL", fields={"url": CharField()}), + request=FilePathSerializer, responses={ 200: OpenApiResponse(description="Success"), 400: OpenApiResponse(description="Bad request"), diff --git a/authentik/providers/oauth2/api/provider.py b/authentik/providers/oauth2/api/provider.py index d5e68b619..3b75d0418 100644 --- a/authentik/providers/oauth2/api/provider.py +++ b/authentik/providers/oauth2/api/provider.py @@ -3,7 +3,7 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import OpenApiResponse, extend_schema from rest_framework.decorators import action -from rest_framework.fields import ReadOnlyField +from rest_framework.fields import CharField from rest_framework.generics import get_object_or_404 from rest_framework.request import Request from rest_framework.response import Response @@ -49,12 +49,12 @@ class OAuth2ProviderSerializer(ProviderSerializer): class OAuth2ProviderSetupURLs(PassiveSerializer): """OAuth2 Provider Metadata serializer""" - issuer = ReadOnlyField() - authorize = ReadOnlyField() - token = ReadOnlyField() - user_info = ReadOnlyField() - provider_info = ReadOnlyField() - logout = ReadOnlyField() + issuer = CharField(read_only=True) + authorize = CharField(read_only=True) + token = CharField(read_only=True) + user_info = CharField(read_only=True) + provider_info = CharField(read_only=True) + logout = CharField(read_only=True) class OAuth2ProviderViewSet(UsedByMixin, ModelViewSet): diff --git a/authentik/providers/saml/api.py b/authentik/providers/saml/api.py index 8d8f2e978..e89fd7077 100644 --- a/authentik/providers/saml/api.py +++ b/authentik/providers/saml/api.py @@ -11,7 +11,7 @@ from django_filters.filterset import FilterSet from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import OpenApiParameter, OpenApiResponse, extend_schema from rest_framework.decorators import action -from rest_framework.fields import CharField, FileField, ReadOnlyField, SerializerMethodField +from rest_framework.fields import CharField, FileField, SerializerMethodField from rest_framework.parsers import MultiPartParser from rest_framework.permissions import AllowAny from rest_framework.relations import SlugRelatedField @@ -70,8 +70,8 @@ class SAMLProviderSerializer(ProviderSerializer): class SAMLMetadataSerializer(PassiveSerializer): """SAML Provider Metadata serializer""" - metadata = ReadOnlyField() - download_url = ReadOnlyField(required=False) + metadata = CharField(read_only=True) + download_url = CharField(read_only=True, required=False) class SAMLProviderImportSerializer(PassiveSerializer): diff --git a/schema.yml b/schema.yml index d9af69eb0..011414f90 100644 --- a/schema.yml +++ b/schema.yml @@ -1710,7 +1710,7 @@ paths: content: multipart/form-data: schema: - $ref: '#/components/schemas/SetIconRequest' + $ref: '#/components/schemas/FileUploadRequest' security: - authentik: [] - cookieAuth: [] @@ -1738,13 +1738,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' application/x-www-form-urlencoded: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' multipart/form-data: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' required: true security: - authentik: [] @@ -5492,7 +5492,7 @@ paths: content: multipart/form-data: schema: - $ref: '#/components/schemas/SetIconRequest' + $ref: '#/components/schemas/FileUploadRequest' security: - authentik: [] - cookieAuth: [] @@ -5520,13 +5520,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' application/x-www-form-urlencoded: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' multipart/form-data: schema: - $ref: '#/components/schemas/SetIconURLRequest' + $ref: '#/components/schemas/FilePathRequest' required: true security: - authentik: [] @@ -5613,7 +5613,7 @@ paths: content: multipart/form-data: schema: - $ref: '#/components/schemas/SetIconRequest' + $ref: '#/components/schemas/FileUploadRequest' security: - authentik: [] - cookieAuth: [] @@ -21583,6 +21583,24 @@ components: type: string required: - expression + FilePathRequest: + type: object + description: Serializer to upload file + properties: + url: + type: string + required: + - url + FileUploadRequest: + type: object + description: Serializer to upload file + properties: + file: + type: string + format: binary + clear: + type: boolean + default: false Flow: type: object description: Flow Serializer @@ -29582,22 +29600,6 @@ components: $ref: '#/components/schemas/UserSelf' required: - user - SetIconRequest: - type: object - properties: - file: - type: string - format: binary - clear: - type: boolean - default: false - SetIconURLRequest: - type: object - properties: - url: - type: string - required: - - url SeverityEnum: enum: - notice diff --git a/web/src/pages/applications/ApplicationForm.ts b/web/src/pages/applications/ApplicationForm.ts index e7aab90a5..daee9c30d 100644 --- a/web/src/pages/applications/ApplicationForm.ts +++ b/web/src/pages/applications/ApplicationForm.ts @@ -76,7 +76,7 @@ export class ApplicationForm extends ModelForm { return writeOp.then((app) => { return new CoreApi(DEFAULT_CONFIG).coreApplicationsSetIconUrlCreate({ slug: app.slug, - setIconURLRequest: { + filePathRequest: { url: data.metaIcon || "", }, }); diff --git a/web/src/pages/flows/FlowForm.ts b/web/src/pages/flows/FlowForm.ts index f7d1222df..a2d8c4993 100644 --- a/web/src/pages/flows/FlowForm.ts +++ b/web/src/pages/flows/FlowForm.ts @@ -62,7 +62,7 @@ export class FlowForm extends ModelForm { return writeOp.then((app) => { return new FlowsApi(DEFAULT_CONFIG).flowsInstancesSetBackgroundUrlCreate({ slug: app.slug, - setIconURLRequest: { + filePathRequest: { url: data.background || "", }, });