From 64c05aa8b5c9799e3d4fefcd5a52eb32fd773a1c Mon Sep 17 00:00:00 2001 From: Sam Gamble Date: Wed, 18 Sep 2024 17:00:26 +0100 Subject: [PATCH 1/2] Feature for model storage_link endpoint Draft storage link endpoint for models Add v1 model storage links pep --- .../analysis_models/v1_api/serializers.py | 15 +++++++++++++++ .../analysis_models/v1_api/viewsets.py | 19 ++++++++++++++++++- .../analysis_models/v2_api/serializers.py | 16 +++++++++++++++- .../analysis_models/v2_api/viewsets.py | 12 ++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/server/oasisapi/analysis_models/v1_api/serializers.py b/src/server/oasisapi/analysis_models/v1_api/serializers.py index 6e39398c1..b70a77436 100644 --- a/src/server/oasisapi/analysis_models/v1_api/serializers.py +++ b/src/server/oasisapi/analysis_models/v1_api/serializers.py @@ -5,6 +5,7 @@ from ..models import AnalysisModel, SettingsTemplate from ...analyses.models import Analysis +from ...files.models import file_storage_link class AnalysisModelSerializer(serializers.ModelSerializer): @@ -45,6 +46,20 @@ def get_versions(self, instance): return instance.get_absolute_versions_url(request=request, namespace=self.ns) +class AnalysisModelStorageSerializer(serializers.ModelSerializer): + settings_file = serializers.SerializerMethodField() + + class Meta: + model = AnalysisModel + fields = ( + 'settings_file', + ) + + @swagger_serializer_method(serializer_or_field=serializers.CharField) + def get_settings_file(self, instance): + return file_storage_link(instance.resource_file, True) + + class TemplateSerializer(serializers.ModelSerializer): """ Catch-all Analysis settings Template Serializer, intended to be called from a nested ViewSet diff --git a/src/server/oasisapi/analysis_models/v1_api/viewsets.py b/src/server/oasisapi/analysis_models/v1_api/viewsets.py index fd0f382ce..8346c523b 100644 --- a/src/server/oasisapi/analysis_models/v1_api/viewsets.py +++ b/src/server/oasisapi/analysis_models/v1_api/viewsets.py @@ -12,7 +12,13 @@ from rest_framework.settings import api_settings from ..models import AnalysisModel, SettingsTemplate -from .serializers import AnalysisModelSerializer, ModelVersionsSerializer, CreateTemplateSerializer, TemplateSerializer +from .serializers import ( + AnalysisModelSerializer, + AnalysisModelStorageSerializer, + ModelVersionsSerializer, + CreateTemplateSerializer, + TemplateSerializer, +) from ...data_files.v1_api.serializers import DataFileSerializer from ...filters import TimeStampedFilter @@ -192,6 +198,8 @@ def get_serializer_class(self): return DataFileSerializer elif self.action in ['versions']: return ModelVersionsSerializer + elif self.action == 'storage_links': + return AnalysisModelStorageSerializer else: return super(AnalysisModelViewSet, self).get_serializer_class() @@ -234,6 +242,15 @@ def data_files(self, request, pk=None, version=None): df_serializer = DataFileSerializer(df, many=True, context=context) return Response(df_serializer.data) + @action(methods=['get'], detail=True) + def storage_links(self, request, pk=None, version=None): + """ + get: + Gets the analyses storage backed link references, `object keys` or `file paths` + """ + serializer = self.get_serializer(self.get_object()) + return Response(serializer.data) + class ModelSettingsView(viewsets.ModelViewSet): queryset = AnalysisModel.objects.all() diff --git a/src/server/oasisapi/analysis_models/v2_api/serializers.py b/src/server/oasisapi/analysis_models/v2_api/serializers.py index f657184bb..90af0c5ba 100644 --- a/src/server/oasisapi/analysis_models/v2_api/serializers.py +++ b/src/server/oasisapi/analysis_models/v2_api/serializers.py @@ -13,7 +13,7 @@ from ...schemas.serializers import ModelParametersSerializer from django.core.files import File from tempfile import TemporaryFile -from ...files.models import RelatedFile +from ...files.models import RelatedFile, file_storage_link def create_settings_file(data, user): @@ -30,6 +30,20 @@ def create_settings_file(data, user): ) +class AnalysisModelStorageSerializer(serializers.ModelSerializer): + settings_file = serializers.SerializerMethodField() + + class Meta: + model = AnalysisModel + fields = ( + 'settings_file', + ) + + @swagger_serializer_method(serializer_or_field=serializers.CharField) + def get_settings_file(self, instance): + return file_storage_link(instance.resource_file, True) + + class AnalysisModelListSerializer(serializers.Serializer): """ Read Only Model Deserializer for efficiently returning a list of all entries in DB diff --git a/src/server/oasisapi/analysis_models/v2_api/viewsets.py b/src/server/oasisapi/analysis_models/v2_api/viewsets.py index ce05095e4..a9e3d480c 100644 --- a/src/server/oasisapi/analysis_models/v2_api/viewsets.py +++ b/src/server/oasisapi/analysis_models/v2_api/viewsets.py @@ -15,6 +15,7 @@ from .serializers import ( AnalysisModelSerializer, AnalysisModelListSerializer, + AnalysisModelStorageSerializer, ModelVersionsSerializer, CreateTemplateSerializer, TemplateSerializer, @@ -209,6 +210,8 @@ def get_serializer_class(self): return ModelScalingConfigSerializer elif self.action in ['chunking_configuration']: return ModelChunkingConfigSerializer + elif self.action == 'storage_links': + return AnalysisModelStorageSerializer else: return super(AnalysisModelViewSet, self).get_serializer_class() @@ -433,6 +436,15 @@ def data_files(self, request, pk=None, version=None): df_serializer = DataFileSerializer(df, many=True, context=context) return Response(df_serializer.data) + @action(methods=['get'], detail=True) + def storage_links(self, request, pk=None, version=None): + """ + get: + Gets the analyses storage backed link references, `object keys` or `file paths` + """ + serializer = self.get_serializer(self.get_object()) + return Response(serializer.data) + class ModelSettingsView(viewsets.ModelViewSet): queryset = AnalysisModel.objects.all() From 59b0f8cd38f8f08dffb2ff1d48f246eb85be4b0c Mon Sep 17 00:00:00 2001 From: Sam Gamble Date: Wed, 18 Sep 2024 17:14:16 +0100 Subject: [PATCH 2/2] Name clash fix --- src/server/oasisapi/analysis_models/v1_api/serializers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/oasisapi/analysis_models/v1_api/serializers.py b/src/server/oasisapi/analysis_models/v1_api/serializers.py index b70a77436..3161c5857 100644 --- a/src/server/oasisapi/analysis_models/v1_api/serializers.py +++ b/src/server/oasisapi/analysis_models/v1_api/serializers.py @@ -48,8 +48,10 @@ def get_versions(self, instance): class AnalysisModelStorageSerializer(serializers.ModelSerializer): settings_file = serializers.SerializerMethodField() + ns = 'v1-models' class Meta: + ref_name = __qualname__.split('.')[0] + 'V1' model = AnalysisModel fields = ( 'settings_file',