From 6b0c071c7e42bf178dc1b56370118a22114f9b57 Mon Sep 17 00:00:00 2001 From: william Date: Fri, 3 Jan 2025 09:51:10 +1100 Subject: [PATCH 1/4] deployable api schema --- .../metadata-manager/app/settings/base.py | 33 ++++++++++++++++ .../metadata-manager/app/settings/local.py | 38 ------------------- .../stacks/metadata-manager/app/urls/base.py | 5 +++ .../stacks/metadata-manager/app/urls/local.py | 7 +--- .../deploy/construct/lambda-api/index.ts | 14 ++++++- .../sequence_run_manager/urls/base.py | 5 +++ .../sequence_run_manager/urls/local.py | 7 +--- .../workflow_manager/urls/base.py | 5 +++ .../workflow_manager/urls/local.py | 7 +--- 9 files changed, 64 insertions(+), 57 deletions(-) diff --git a/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py b/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py index d4d39e474..082a4262f 100644 --- a/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py +++ b/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py @@ -31,6 +31,7 @@ "app", "aws_xray_sdk.ext.django", 'simple_history', + "drf_spectacular", ] MIDDLEWARE = [ @@ -164,3 +165,35 @@ # turn off xray more generally and, you can overwrite with env var AWS_XRAY_SDK_ENABLED=true at runtime aws_xray_sdk.global_sdk_config.set_sdk_enabled(False) + +REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' +SPECTACULAR_SETTINGS = { + 'TITLE': 'Metadata Manager API', + 'DESCRIPTION': 'The Metadata Manager API for UMCCR.', + 'VERSION': '0.0.1', + 'SERVE_INCLUDE_SCHEMA': False, + 'SECURITY': [ + { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + } + ], + 'CONTACT': { + 'name': 'UMCCR', + 'email': 'services@umccr.org' + }, + "LICENSE": { + "name": "MIT License", + }, + "EXTERNAL_DOCS": { + "description": "Terms of service", + "url": "https://umccr.org/", + }, + 'CAMELIZE_NAMES': True, + 'POSTPROCESSING_HOOKS': [ + 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', + 'drf_spectacular.hooks.postprocess_schema_enums' + ], + 'SCHEMA_PATH_PREFIX': f'/api/{API_VERSION}/', +} diff --git a/lib/workload/stateless/stacks/metadata-manager/app/settings/local.py b/lib/workload/stateless/stacks/metadata-manager/app/settings/local.py index 744bac72f..c0e8e4300 100644 --- a/lib/workload/stateless/stacks/metadata-manager/app/settings/local.py +++ b/lib/workload/stateless/stacks/metadata-manager/app/settings/local.py @@ -24,50 +24,12 @@ INSTALLED_APPS += ( "django_extensions", - "drf_spectacular", ) ROOT_URLCONF = "app.urls.local" RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = sys.maxsize -REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' - -SPECTACULAR_SETTINGS = { - 'TITLE': 'Metadata Manager API', - 'DESCRIPTION': 'The Metadata Manager API for UMCCR.', - 'VERSION': '0.0.1', - 'SERVE_INCLUDE_SCHEMA': False, - 'SECURITY': [ - { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT", - } - ], - 'CONTACT': { - 'name': 'UMCCR', - 'email': 'services@umccr.org' - }, - "LICENSE": { - "name": "MIT License", - }, - "EXTERNAL_DOCS": { - "description": "Terms of service", - "url": "https://umccr.org/", - }, - 'CAMELIZE_NAMES': True, - 'POSTPROCESSING_HOOKS': [ - 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', - 'drf_spectacular.hooks.postprocess_schema_enums' - ], - 'SCHEMA_PATH_PREFIX': f'/api/{API_VERSION}/', -} - -REDOC_SETTINGS = { - "LAZY_RENDERING": False, -} - LOGGING = { 'version': 1, 'disable_existing_loggers': False, diff --git a/lib/workload/stateless/stacks/metadata-manager/app/urls/base.py b/lib/workload/stateless/stacks/metadata-manager/app/urls/base.py index 8dfa807b8..ef64488a2 100644 --- a/lib/workload/stateless/stacks/metadata-manager/app/urls/base.py +++ b/lib/workload/stateless/stacks/metadata-manager/app/urls/base.py @@ -1,4 +1,6 @@ from django.urls import path, include +from django.urls import path +from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView from app.routers import OptionalSlashDefaultRouter from app.viewsets import LibraryViewSet, SubjectViewSet, SampleViewSet, ProjectViewSet, ContactViewSet, \ @@ -20,6 +22,9 @@ urlpatterns = [ path(f"{api_base}", include(router.urls)), + path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), + path('schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), + name='swagger-ui'), ] handler500 = "rest_framework.exceptions.server_error" diff --git a/lib/workload/stateless/stacks/metadata-manager/app/urls/local.py b/lib/workload/stateless/stacks/metadata-manager/app/urls/local.py index f5798ba09..568629afc 100644 --- a/lib/workload/stateless/stacks/metadata-manager/app/urls/local.py +++ b/lib/workload/stateless/stacks/metadata-manager/app/urls/local.py @@ -1,10 +1,5 @@ -from django.urls import path -from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView - from .base import urlpatterns as base_urlpatterns urlpatterns = base_urlpatterns + [ - path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), - path('swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), - name='swagger-ui'), + # Some URL that only exists in the local environment ] diff --git a/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts b/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts index 688284db0..96876292c 100644 --- a/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts +++ b/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts @@ -1,7 +1,12 @@ import { Construct } from 'constructs'; import { Duration } from 'aws-cdk-lib'; import { Function } from 'aws-cdk-lib/aws-lambda'; -import { HttpMethod, HttpRoute, HttpRouteKey } from 'aws-cdk-lib/aws-apigatewayv2'; +import { + HttpMethod, + HttpNoneAuthorizer, + HttpRoute, + HttpRouteKey, +} from 'aws-cdk-lib/aws-apigatewayv2'; import { PythonFunction, PythonFunctionProps } from '@aws-cdk/aws-lambda-python-alpha'; import { ISecret } from 'aws-cdk-lib/aws-secretsmanager'; import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'; @@ -60,6 +65,13 @@ export class LambdaAPIConstruct extends Construct { // add some integration to the http api gw const apiIntegration = new HttpLambdaIntegration('ApiLambdaIntegration', this.lambda); + new HttpRoute(this, 'GetSchemaHttpRoute', { + httpApi: apiGW.httpApi, + integration: apiIntegration, + authorizer: new HttpNoneAuthorizer(), // No auth needed for schema + routeKey: HttpRouteKey.with(`/api/${this.API_VERSION}/schema/{PROXY+}`, HttpMethod.GET), + }); + new HttpRoute(this, 'GetHttpRoute', { httpApi: apiGW.httpApi, integration: apiIntegration, diff --git a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/base.py b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/base.py index 97b385c3b..ff4c8fd6f 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/base.py +++ b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/base.py @@ -1,4 +1,6 @@ from django.urls import path, include +from django.urls import path +from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView from sequence_run_manager.routers import OptionalSlashDefaultRouter from sequence_run_manager.viewsets.sequence import SequenceViewSet @@ -18,6 +20,9 @@ urlpatterns = [ path(f"{api_base}", include(router.urls)), + path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), + path('schema/swagger-ui/', + SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), ] handler500 = "rest_framework.exceptions.server_error" diff --git a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/local.py b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/local.py index 562934128..568629afc 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/local.py +++ b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/urls/local.py @@ -1,10 +1,5 @@ -from django.urls import path -from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView - from .base import urlpatterns as base_urlpatterns urlpatterns = base_urlpatterns + [ - path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), - path('swagger-ui/', - SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), + # Some URL that only exists in the local environment ] diff --git a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/base.py b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/base.py index 937bc24ba..e5f5e682b 100644 --- a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/base.py +++ b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/base.py @@ -1,4 +1,6 @@ from django.urls import path, include +from django.urls import path +from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView from workflow_manager.routers import OptionalSlashDefaultRouter from workflow_manager.viewsets.analysis import AnalysisViewSet @@ -49,6 +51,9 @@ urlpatterns = [ path(f"{api_base}", include(router.urls)), + path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), + path('schema/swagger-ui/', + SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), ] handler500 = "rest_framework.exceptions.server_error" diff --git a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/local.py b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/local.py index 562934128..568629afc 100644 --- a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/local.py +++ b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/urls/local.py @@ -1,10 +1,5 @@ -from django.urls import path -from drf_spectacular.views import SpectacularJSONAPIView, SpectacularSwaggerView - from .base import urlpatterns as base_urlpatterns urlpatterns = base_urlpatterns + [ - path('schema/openapi.json', SpectacularJSONAPIView.as_view(), name='schema'), - path('swagger-ui/', - SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), + # Some URL that only exists in the local environment ] From b5892a1b97d8c9207608e67c5a79d47d0258b85f Mon Sep 17 00:00:00 2001 From: william Date: Fri, 3 Jan 2025 10:57:25 +1100 Subject: [PATCH 2/4] Fix Swagger Auth --- .../stacks/metadata-manager/app/settings/base.py | 3 +++ .../deploy/construct/lambda-api/index.ts | 3 ++- .../stacks/sequence-run-manager/deploy/stack.ts | 15 ++++++++++++++- .../sequence_run_manager/settings/base.py | 3 +++ .../stacks/workflow-manager/deploy/stack.ts | 15 ++++++++++++++- .../workflow_manager/settings/base.py | 3 +++ 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py b/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py index 082a4262f..4a731b149 100644 --- a/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py +++ b/lib/workload/stateless/stacks/metadata-manager/app/settings/base.py @@ -147,6 +147,9 @@ "JSON_UNDERSCOREIZE": { 'no_underscore_before_number': True, }, + "DEFAULT_AUTHENTICATION_CLASSES": [ + "rest_framework.authentication.TokenAuthentication", + ], } CORS_ORIGIN_ALLOW_ALL = True diff --git a/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts b/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts index 96876292c..59ad22895 100644 --- a/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts +++ b/lib/workload/stateless/stacks/metadata-manager/deploy/construct/lambda-api/index.ts @@ -65,11 +65,12 @@ export class LambdaAPIConstruct extends Construct { // add some integration to the http api gw const apiIntegration = new HttpLambdaIntegration('ApiLambdaIntegration', this.lambda); + // Routes for API schemas new HttpRoute(this, 'GetSchemaHttpRoute', { httpApi: apiGW.httpApi, integration: apiIntegration, authorizer: new HttpNoneAuthorizer(), // No auth needed for schema - routeKey: HttpRouteKey.with(`/api/${this.API_VERSION}/schema/{PROXY+}`, HttpMethod.GET), + routeKey: HttpRouteKey.with(`/schema/{PROXY+}`, HttpMethod.GET), }); new HttpRoute(this, 'GetHttpRoute', { diff --git a/lib/workload/stateless/stacks/sequence-run-manager/deploy/stack.ts b/lib/workload/stateless/stacks/sequence-run-manager/deploy/stack.ts index a3b0d8c56..7a17f5e92 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/deploy/stack.ts +++ b/lib/workload/stateless/stacks/sequence-run-manager/deploy/stack.ts @@ -7,7 +7,12 @@ import { EventBus, IEventBus, Rule } from 'aws-cdk-lib/aws-events'; import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets'; import { PythonFunction, PythonLayerVersion } from '@aws-cdk/aws-lambda-python-alpha'; import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'; -import { HttpMethod, HttpRoute, HttpRouteKey } from 'aws-cdk-lib/aws-apigatewayv2'; +import { + HttpMethod, + HttpNoneAuthorizer, + HttpRoute, + HttpRouteKey, +} from 'aws-cdk-lib/aws-apigatewayv2'; import { ManagedPolicy, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { ApiGatewayConstruct, ApiGatewayConstructProps } from '../../../../components/api-gateway'; import { Architecture } from 'aws-cdk-lib/aws-lambda'; @@ -118,6 +123,14 @@ export class SequenceRunManagerStack extends Stack { const apiIntegration = new HttpLambdaIntegration('ApiIntegration', apiFn); + // Routes for API schemas + new HttpRoute(this, 'GetSchemaHttpRoute', { + httpApi: srmApi.httpApi, + integration: apiIntegration, + authorizer: new HttpNoneAuthorizer(), // No auth needed for schema + routeKey: HttpRouteKey.with(`/schema/{PROXY+}`, HttpMethod.GET), + }); + new HttpRoute(this, 'GetHttpRoute', { httpApi: httpApi, integration: apiIntegration, diff --git a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py index cfd038914..01778d98d 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py +++ b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py @@ -143,6 +143,9 @@ "JSON_UNDERSCOREIZE": { 'no_underscore_before_number': True, }, + "DEFAULT_AUTHENTICATION_CLASSES": [ + "rest_framework.authentication.TokenAuthentication", + ], } CORS_ORIGIN_ALLOW_ALL = True diff --git a/lib/workload/stateless/stacks/workflow-manager/deploy/stack.ts b/lib/workload/stateless/stacks/workflow-manager/deploy/stack.ts index a6b3a5808..11edf277e 100644 --- a/lib/workload/stateless/stacks/workflow-manager/deploy/stack.ts +++ b/lib/workload/stateless/stacks/workflow-manager/deploy/stack.ts @@ -13,7 +13,12 @@ import { } from 'aws-cdk-lib'; import { PythonFunction, PythonLayerVersion } from '@aws-cdk/aws-lambda-python-alpha'; import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'; -import { HttpMethod, HttpRoute, HttpRouteKey } from 'aws-cdk-lib/aws-apigatewayv2'; +import { + HttpMethod, + HttpNoneAuthorizer, + HttpRoute, + HttpRouteKey, +} from 'aws-cdk-lib/aws-apigatewayv2'; import { PostgresManagerStack } from '../../../../stateful/stacks/postgres-manager/deploy/stack'; import { ManagedPolicy, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { ApiGatewayConstruct, ApiGatewayConstructProps } from '../../../../components/api-gateway'; @@ -124,6 +129,14 @@ export class WorkflowManagerStack extends Stack { const apiIntegration = new HttpLambdaIntegration('ApiIntegration', apiFn); + // Routes for API schemas + new HttpRoute(this, 'GetSchemaHttpRoute', { + httpApi: wfmApi.httpApi, + integration: apiIntegration, + authorizer: new HttpNoneAuthorizer(), // No auth needed for schema + routeKey: HttpRouteKey.with(`/schema/{PROXY+}`, HttpMethod.GET), + }); + new HttpRoute(this, 'GetHttpRoute', { httpApi: httpApi, integration: apiIntegration, diff --git a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py index 5bd21bb62..f4d952a3c 100644 --- a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py +++ b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py @@ -143,6 +143,9 @@ "JSON_UNDERSCOREIZE": { 'no_underscore_before_number': True, }, + "DEFAULT_AUTHENTICATION_CLASSES": [ + "rest_framework.authentication.TokenAuthentication", + ], } CORS_ORIGIN_ALLOW_ALL = True From d2d63ecc646bf35771c5a335fc72f89babd6033e Mon Sep 17 00:00:00 2001 From: william Date: Fri, 3 Jan 2025 11:18:12 +1100 Subject: [PATCH 3/4] update django skel --- skel/django-api/deploy/stack.ts | 10 +++++- skel/django-api/project_name/settings/base.py | 33 +++++++++++++++++++ .../django-api/project_name/settings/local.py | 28 ---------------- 3 files changed, 42 insertions(+), 29 deletions(-) diff --git a/skel/django-api/deploy/stack.ts b/skel/django-api/deploy/stack.ts index e44ecb36f..4c38ef103 100644 --- a/skel/django-api/deploy/stack.ts +++ b/skel/django-api/deploy/stack.ts @@ -8,7 +8,7 @@ import { EventBus, IEventBus, Rule } from 'aws-cdk-lib/aws-events'; import { aws_events_targets, aws_lambda, aws_secretsmanager, Duration, Stack, StackProps } from 'aws-cdk-lib'; import { PythonFunction, PythonLayerVersion } from '@aws-cdk/aws-lambda-python-alpha'; import { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations'; -import { HttpMethod, HttpRoute, HttpRouteKey } from 'aws-cdk-lib/aws-apigatewayv2'; +import { HttpMethod, HttpNoneAuthorizer, HttpRoute, HttpRouteKey } from 'aws-cdk-lib/aws-apigatewayv2'; import { PostgresManagerStack } from '../../../lib/workload/stateful/stacks/postgres-manager/deploy/stack'; import { ManagedPolicy, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam'; import { ApiGatewayConstruct, ApiGatewayConstructProps } from '../../../lib/workload/components/api-gateway'; @@ -117,6 +117,14 @@ export class ProjectNameStack extends Stack { // FIXME change construct name const apiIntegration = new HttpLambdaIntegration('ApiIntegration', apiFn); + // Routes for API schemas + new HttpRoute(this, 'GetSchemaHttpRoute', { + httpApi: srmApi.httpApi, + integration: apiIntegration, + authorizer: new HttpNoneAuthorizer(), // No auth needed for schema + routeKey: HttpRouteKey.with(`/schema/{PROXY+}`, HttpMethod.GET), + }); + new HttpRoute(this, 'GetHttpRoute', { httpApi: httpApi, integration: apiIntegration, diff --git a/skel/django-api/project_name/settings/base.py b/skel/django-api/project_name/settings/base.py index 263c9f21f..6faa81410 100644 --- a/skel/django-api/project_name/settings/base.py +++ b/skel/django-api/project_name/settings/base.py @@ -143,6 +143,9 @@ "JSON_UNDERSCOREIZE": { 'no_underscore_before_number': True, }, + "DEFAULT_AUTHENTICATION_CLASSES": [ + "rest_framework.authentication.TokenAuthentication", + ], } CORS_ORIGIN_ALLOW_ALL = True @@ -161,3 +164,33 @@ # turn off xray more generally and, you can overwrite with env var AWS_XRAY_SDK_ENABLED=true at runtime aws_xray_sdk.global_sdk_config.set_sdk_enabled(False) + + +# --- drf-spectacular settings + +REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' + +SPECTACULAR_SETTINGS = { + 'TITLE': 'UMCCR OrcaBus {{project_name}} API', + 'DESCRIPTION': 'UMCCR OrcaBus {{project_name}} API', + 'VERSION': API_VERSION, + 'SERVE_INCLUDE_SCHEMA': False, + 'SECURITY': [ + { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + } + ], + 'CONTACT': { + 'name': 'UMCCR', + 'email': 'services@umccr.org' + }, + "LICENSE": { + "name": "MIT License", + }, + "EXTERNAL_DOCS": { + "description": "Terms of service", + "url": "https://umccr.org/", + }, +} diff --git a/skel/django-api/project_name/settings/local.py b/skel/django-api/project_name/settings/local.py index 15453b54d..066eebd1e 100644 --- a/skel/django-api/project_name/settings/local.py +++ b/skel/django-api/project_name/settings/local.py @@ -30,31 +30,3 @@ RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = sys.maxsize -# --- drf-spectacular settings - -REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' - -SPECTACULAR_SETTINGS = { - 'TITLE': 'UMCCR OrcaBus {{project_name}} API', - 'DESCRIPTION': 'UMCCR OrcaBus {{project_name}} API', - 'VERSION': API_VERSION, - 'SERVE_INCLUDE_SCHEMA': False, - 'SECURITY': [ - { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT", - } - ], - 'CONTACT': { - 'name': 'UMCCR', - 'email': 'services@umccr.org' - }, - "LICENSE": { - "name": "MIT License", - }, - "EXTERNAL_DOCS": { - "description": "Terms of service", - "url": "https://umccr.org/", - }, -} From 75714a2745d5f74e5a1d74fc13007e90ac0a64b7 Mon Sep 17 00:00:00 2001 From: william Date: Fri, 3 Jan 2025 13:16:00 +1100 Subject: [PATCH 4/4] update setting --- .../sequence_run_manager/settings/base.py | 35 ++++++++++++++++++ .../sequence_run_manager/settings/local.py | 34 ------------------ .../workflow_manager/settings/base.py | 36 +++++++++++++++++++ .../workflow_manager/settings/local.py | 35 ------------------ skel/django-api/project_name/settings/base.py | 1 + .../django-api/project_name/settings/local.py | 1 - 6 files changed, 72 insertions(+), 70 deletions(-) diff --git a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py index 01778d98d..5561d9337 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py +++ b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/base.py @@ -30,6 +30,7 @@ "rest_framework", "sequence_run_manager", "aws_xray_sdk.ext.django", + "drf_spectacular", ] MIDDLEWARE = [ @@ -164,3 +165,37 @@ # turn off xray more generally and, you can overwrite with env var AWS_XRAY_SDK_ENABLED=true at runtime aws_xray_sdk.global_sdk_config.set_sdk_enabled(False) + +# --- drf-spectacular settings + +REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' + +SPECTACULAR_SETTINGS = { + 'TITLE': 'UMCCR OrcaBus sequence_run_manager API', + 'DESCRIPTION': 'UMCCR OrcaBus sequence_run_manager API', + 'VERSION': API_VERSION, + 'SERVE_INCLUDE_SCHEMA': False, + 'SECURITY': [ + { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + } + ], + 'CONTACT': { + 'name': 'UMCCR', + 'email': 'services@umccr.org' + }, + "LICENSE": { + "name": "MIT License", + }, + "EXTERNAL_DOCS": { + "description": "Terms of service", + "url": "https://umccr.org/", + }, + 'CAMELIZE_NAMES': True, + 'POSTPROCESSING_HOOKS': [ + 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', + 'drf_spectacular.hooks.postprocess_schema_enums' + ], +} diff --git a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/local.py b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/local.py index 1d5c462ad..4f579ff08 100644 --- a/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/local.py +++ b/lib/workload/stateless/stacks/sequence-run-manager/sequence_run_manager/settings/local.py @@ -23,43 +23,9 @@ INSTALLED_APPS += ( "django_extensions", - "drf_spectacular", ) ROOT_URLCONF = "sequence_run_manager.urls.local" RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = sys.maxsize -# --- drf-spectacular settings - -REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' - -SPECTACULAR_SETTINGS = { - 'TITLE': 'UMCCR OrcaBus sequence_run_manager API', - 'DESCRIPTION': 'UMCCR OrcaBus sequence_run_manager API', - 'VERSION': API_VERSION, - 'SERVE_INCLUDE_SCHEMA': False, - 'SECURITY': [ - { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT", - } - ], - 'CONTACT': { - 'name': 'UMCCR', - 'email': 'services@umccr.org' - }, - "LICENSE": { - "name": "MIT License", - }, - "EXTERNAL_DOCS": { - "description": "Terms of service", - "url": "https://umccr.org/", - }, - 'CAMELIZE_NAMES': True, - 'POSTPROCESSING_HOOKS': [ - 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', - 'drf_spectacular.hooks.postprocess_schema_enums' - ], -} diff --git a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py index f4d952a3c..9eecd7abe 100644 --- a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py +++ b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/base.py @@ -30,6 +30,7 @@ "rest_framework", "workflow_manager", "aws_xray_sdk.ext.django", + "drf_spectacular", ] MIDDLEWARE = [ @@ -164,3 +165,38 @@ # turn off xray more generally and, you can overwrite with env var AWS_XRAY_SDK_ENABLED=true at runtime aws_xray_sdk.global_sdk_config.set_sdk_enabled(False) + +# --- drf-spectacular settings + +REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' + +SPECTACULAR_SETTINGS = { + 'TITLE': 'UMCCR OrcaBus workflow_manager API', + 'DESCRIPTION': 'UMCCR OrcaBus workflow_manager API', + 'VERSION': API_VERSION, + 'SERVE_INCLUDE_SCHEMA': False, + 'SECURITY': [ + { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + } + ], + 'CONTACT': { + 'name': 'UMCCR', + 'email': 'services@umccr.org' + }, + "LICENSE": { + "name": "MIT License", + }, + "EXTERNAL_DOCS": { + "description": "Terms of service", + "url": "https://umccr.org/", + }, + 'CAMELIZE_NAMES': True, + 'POSTPROCESSING_HOOKS': [ + 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', + 'drf_spectacular.hooks.postprocess_schema_enums' + ], + 'SCHEMA_PATH_PREFIX': f'/api/{API_VERSION}/', +} diff --git a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/local.py b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/local.py index 4cfdfd3c2..bad6020b7 100644 --- a/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/local.py +++ b/lib/workload/stateless/stacks/workflow-manager/workflow_manager/settings/local.py @@ -23,44 +23,9 @@ INSTALLED_APPS += ( "django_extensions", - "drf_spectacular", ) ROOT_URLCONF = "workflow_manager.urls.local" RUNSERVER_PLUS_PRINT_SQL_TRUNCATE = sys.maxsize -# --- drf-spectacular settings - -REST_FRAMEWORK['DEFAULT_SCHEMA_CLASS'] = 'drf_spectacular.openapi.AutoSchema' - -SPECTACULAR_SETTINGS = { - 'TITLE': 'UMCCR OrcaBus workflow_manager API', - 'DESCRIPTION': 'UMCCR OrcaBus workflow_manager API', - 'VERSION': API_VERSION, - 'SERVE_INCLUDE_SCHEMA': False, - 'SECURITY': [ - { - "type": "http", - "scheme": "bearer", - "bearerFormat": "JWT", - } - ], - 'CONTACT': { - 'name': 'UMCCR', - 'email': 'services@umccr.org' - }, - "LICENSE": { - "name": "MIT License", - }, - "EXTERNAL_DOCS": { - "description": "Terms of service", - "url": "https://umccr.org/", - }, - 'CAMELIZE_NAMES': True, - 'POSTPROCESSING_HOOKS': [ - 'drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields', - 'drf_spectacular.hooks.postprocess_schema_enums' - ], - 'SCHEMA_PATH_PREFIX': f'/api/{API_VERSION}/', -} diff --git a/skel/django-api/project_name/settings/base.py b/skel/django-api/project_name/settings/base.py index 6faa81410..07c13c580 100644 --- a/skel/django-api/project_name/settings/base.py +++ b/skel/django-api/project_name/settings/base.py @@ -30,6 +30,7 @@ "rest_framework", "{{project_name}}", "aws_xray_sdk.ext.django", + "drf_spectacular", ] MIDDLEWARE = [ diff --git a/skel/django-api/project_name/settings/local.py b/skel/django-api/project_name/settings/local.py index 066eebd1e..055de99e4 100644 --- a/skel/django-api/project_name/settings/local.py +++ b/skel/django-api/project_name/settings/local.py @@ -23,7 +23,6 @@ INSTALLED_APPS += ( "django_extensions", - "drf_spectacular", ) ROOT_URLCONF = "{{project_name}}.urls.local"