From ee8415b9d8cb001ffe194c23e25b72af407d889e Mon Sep 17 00:00:00 2001 From: juuso-j <68938778+juuso-j@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:22:21 +0300 Subject: [PATCH] Fix translated fields in OpenAPI docs --- services/api.py | 53 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/services/api.py b/services/api.py index e0785557..49303bde 100644 --- a/services/api.py +++ b/services/api.py @@ -15,7 +15,11 @@ from django.utils import timezone, translation from django.utils.module_loading import import_string from django_filters.rest_framework import DjangoFilterBackend -from drf_spectacular.utils import extend_schema +from drf_spectacular.utils import ( + extend_schema, + extend_schema_field, + extend_schema_serializer, +) from modeltranslation.translator import NotRegistered, translator from mptt.utils import drilldown_tree_for_node from munigeo import api as munigeo_api @@ -92,6 +96,17 @@ def register_view(klass, name, basename=None): logger = logging.getLogger(__name__) +class TranslationsSerializer(serializers.Serializer): + fi = serializers.CharField(required=False) + sv = serializers.CharField(required=False) + en = serializers.CharField(required=False) + + +@extend_schema_field(TranslationsSerializer) +class TranslationsField(serializers.CharField): + pass + + class MPTTModelSerializer(serializers.ModelSerializer): def __init__(self, *args, **kwargs): super(MPTTModelSerializer, self).__init__(*args, **kwargs) @@ -210,6 +225,13 @@ def to_representation(self, obj): return ret +class ServicesTranslatedModelSerializer(TranslatedModelSerializer): + def __init__(self, *args, **kwargs): + super(ServicesTranslatedModelSerializer, self).__init__(*args, **kwargs) + for field_name in self.translated_fields: + self.fields[field_name] = TranslationsField() + + def root_services(services): tree_ids = set(s.tree_id for s in services) return map( @@ -274,7 +296,7 @@ def to_representation(self, obj): class DepartmentSerializer( - TranslatedModelSerializer, MPTTModelSerializer, JSONAPISerializer + ServicesTranslatedModelSerializer, MPTTModelSerializer, JSONAPISerializer ): id = serializers.SerializerMethodField("get_uuid") parent = serializers.SerializerMethodField() @@ -296,7 +318,7 @@ def get_parent(self, obj): class ServiceNodeSerializer( - TranslatedModelSerializer, MPTTModelSerializer, JSONAPISerializer + ServicesTranslatedModelSerializer, MPTTModelSerializer, JSONAPISerializer ): children = serializers.PrimaryKeyRelatedField(many=True, read_only=True) @@ -350,7 +372,7 @@ class Meta: ) -class ServiceSerializer(TranslatedModelSerializer, JSONAPISerializer): +class ServiceSerializer(ServicesTranslatedModelSerializer, JSONAPISerializer): def to_representation(self, obj): ret = super(ServiceSerializer, self).to_representation(obj) ret["unit_count"] = {"municipality": {}} @@ -392,7 +414,7 @@ class Meta: fields = ["name", "root_service_node"] -class ServiceDetailsSerializer(TranslatedModelSerializer, JSONAPISerializer): +class ServiceDetailsSerializer(ServicesTranslatedModelSerializer, JSONAPISerializer): def to_representation(self, obj): ret = super(ServiceDetailsSerializer, self).to_representation(obj) service_data = RelatedServiceSerializer(obj.service).data @@ -496,7 +518,9 @@ def choicefield_string(choices, key, obj): return None -class UnitConnectionSerializer(TranslatedModelSerializer, serializers.ModelSerializer): +class UnitConnectionSerializer( + ServicesTranslatedModelSerializer, serializers.ModelSerializer +): section_type = serializers.SerializerMethodField() class Meta: @@ -515,7 +539,9 @@ class UnitConnectionViewSet(viewsets.ReadOnlyModelViewSet): register_view(UnitConnectionViewSet, "unit_connection") -class UnitEntranceSerializer(TranslatedModelSerializer, munigeo_api.GeoModelSerializer): +class UnitEntranceSerializer( + ServicesTranslatedModelSerializer, munigeo_api.GeoModelSerializer +): location = serializers.SerializerMethodField() class Meta: @@ -526,7 +552,11 @@ def get_location(self, obj): return munigeo_api.geom_to_json(obj.location, self.srs) -class UnitEntranceViewSet(munigeo_api.GeoModelAPIView, viewsets.ReadOnlyModelViewSet): +class UnitEntranceViewSet( + ServicesTranslatedModelSerializer, + munigeo_api.GeoModelAPIView, + viewsets.ReadOnlyModelViewSet, +): queryset = UnitEntrance.objects.all() serializer_class = UnitEntranceSerializer @@ -613,7 +643,7 @@ def get_queryset(self): class UnitSerializer( - TranslatedModelSerializer, munigeo_api.GeoModelSerializer, JSONAPISerializer + ServicesTranslatedModelSerializer, munigeo_api.GeoModelSerializer, JSONAPISerializer ): connections = UnitConnectionSerializer(many=True) entrances = UnitEntranceSerializer(many=True) @@ -1170,6 +1200,7 @@ def list(self, request, *args, **kwargs): ) +@extend_schema_serializer(deprecate_fields=["service_point_id"]) class AdministrativeDivisionSerializer(munigeo_api.AdministrativeDivisionSerializer): def to_representation(self, obj): ret = super(AdministrativeDivisionSerializer, self).to_representation(obj) @@ -1277,7 +1308,7 @@ class PostalCodeAreaViewSet(munigeo_api.PostalCodeAreaViewSet): register_view(PostalCodeAreaViewSet, "postalcodearea") -class AnnouncementSerializer(TranslatedModelSerializer, JSONAPISerializer): +class AnnouncementSerializer(ServicesTranslatedModelSerializer, JSONAPISerializer): class Meta: model = Announcement exclude = ["id", "active"] @@ -1291,7 +1322,7 @@ class AnnouncementViewSet(viewsets.ReadOnlyModelViewSet): register_view(AnnouncementViewSet, "announcement") -class ErrorMessageSerializer(TranslatedModelSerializer, JSONAPISerializer): +class ErrorMessageSerializer(ServicesTranslatedModelSerializer, JSONAPISerializer): class Meta: model = ErrorMessage exclude = ["id", "active"]