diff --git a/steering/schema.py b/steering/schema.py index d607d104e9812b92c8d313370096d0204ae6349c..e2c85a9552ed9e78941473567bf53b95399b936f 100644 --- a/steering/schema.py +++ b/steering/schema.py @@ -1,5 +1,7 @@ from typing import Iterable, Tuple +from django.contrib.auth.models import Permission + def _generate_choices_description(choices: Iterable[Tuple[str, str]]): def _gen(): @@ -53,3 +55,21 @@ def fix_schedule_pk_type(result, generator, request, public): parameter["schema"]["type"] = "integer" break return result + + +def _get_all_relevant_permission_names(): + for perm in Permission.objects.all(): + action, module_name, model_name = perm.natural_key() + if module_name not in {"program", "steering", "auth"}: + # we’re only interested in some permissions + continue + yield f"{module_name}.{action}" + + +def add_permission_type_to_schema(result, *args, **kwargs): + result["components"]["schemas"]["AnyPermission"] = { + "description": "Permissions used by steering.", + "enum": sorted(_get_all_relevant_permission_names()), + "type": "string", + } + return result diff --git a/steering/settings.py b/steering/settings.py index b3d9acbf153066a9447601289c9f650de8b27183..0ce92c81427bdee795ec5f6f739a3f63284f84b7 100644 --- a/steering/settings.py +++ b/steering/settings.py @@ -104,6 +104,7 @@ SPECTACULAR_SETTINGS = { "drf_spectacular.hooks.postprocess_schema_enums", "steering.schema.add_enum_documentation", "steering.schema.fix_schedule_pk_type", + "steering.schema.add_permission_type_to_schema", "drf_spectacular.contrib.djangorestframework_camel_case.camelize_serializer_fields", ], "VERSION": "1.0.0",