Add additional settings serializer details for OpenAPI schema generation (#4042)

Related to https://github.com/grafana/oncall-private/issues/2540
This commit is contained in:
Matias Bordese 2024-03-11 12:47:15 -03:00 committed by GitHub
parent ff3ff39cf3
commit 3a5d00ad60
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -4,6 +4,7 @@ from collections import OrderedDict
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
from django.db.models import Q from django.db.models import Q
from drf_spectacular.utils import PolymorphicProxySerializer, extend_schema_field
from jinja2 import TemplateSyntaxError from jinja2 import TemplateSyntaxError
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
@ -60,6 +61,24 @@ class IntegrationAlertGroupLabels(typing.TypedDict):
template: str | None template: str | None
AlertReceiveChannelAdditionalSettingsSerializers = (
i.additional_settings_serializer
for i in AlertReceiveChannel._config
if getattr(i, "additional_settings_serializer", None)
)
@extend_schema_field(
PolymorphicProxySerializer(
component_name="AdditionalSettingsField",
serializers=list(AlertReceiveChannelAdditionalSettingsSerializers),
resource_type_field_name=None,
)
)
class AdditionalSettingsField(serializers.DictField):
pass
class CustomLabelSerializer(serializers.Serializer): class CustomLabelSerializer(serializers.Serializer):
"""This serializer is consistent with apps.api.serializers.labels.LabelPairSerializer, but allows null for value ID.""" """This serializer is consistent with apps.api.serializers.labels.LabelPairSerializer, but allows null for value ID."""
@ -252,7 +271,7 @@ class AlertReceiveChannelSerializer(
inbound_email = serializers.CharField(required=False, read_only=True) inbound_email = serializers.CharField(required=False, read_only=True)
is_legacy = serializers.SerializerMethodField() is_legacy = serializers.SerializerMethodField()
alert_group_labels = IntegrationAlertGroupLabelsSerializer(source="*", required=False) alert_group_labels = IntegrationAlertGroupLabelsSerializer(source="*", required=False)
additional_settings = serializers.DictField(allow_null=True, allow_empty=False, required=False, default=None) additional_settings = AdditionalSettingsField(allow_null=True, allow_empty=False, required=False, default=None)
# integration heartbeat is in PREFETCH_RELATED not by mistake. # integration heartbeat is in PREFETCH_RELATED not by mistake.
# With using of select_related ORM builds strange join # With using of select_related ORM builds strange join