diff --git a/chord_metadata_service/patients/api_views.py b/chord_metadata_service/patients/api_views.py index c080039b3..2c38d5eac 100644 --- a/chord_metadata_service/patients/api_views.py +++ b/chord_metadata_service/patients/api_views.py @@ -43,7 +43,6 @@ FHIRRenderer, PhenopacketsRenderer, IndividualCSVRenderer, - ARGORenderer, IndividualBentoSearchRenderer, ) from chord_metadata_service.restapi.constants import MODEL_ID_PATTERN @@ -69,9 +68,13 @@ class IndividualViewSet(viewsets.ModelViewSet): """ serializer_class = IndividualSerializer pagination_class = LargeResultsSetPagination - renderer_classes = (*api_settings.DEFAULT_RENDERER_CLASSES, FHIRRenderer, - PhenopacketsRenderer, IndividualCSVRenderer, ARGORenderer, - IndividualBentoSearchRenderer) + renderer_classes = ( + *api_settings.DEFAULT_RENDERER_CLASSES, + FHIRRenderer, + PhenopacketsRenderer, + IndividualCSVRenderer, + IndividualBentoSearchRenderer, + ) filter_backends = [DjangoFilterBackend, filters.OrderingFilter] filterset_class = IndividualFilter ordering_fields = ["id"] @@ -151,9 +154,13 @@ class IndividualBatchViewSet(BatchViewSet): serializer_class = IndividualSerializer pagination_class = BatchResultsSetPagination - renderer_classes = (*api_settings.DEFAULT_RENDERER_CLASSES, FHIRRenderer, - PhenopacketsRenderer, IndividualCSVRenderer, ARGORenderer, - IndividualBentoSearchRenderer) + renderer_classes = ( + *api_settings.DEFAULT_RENDERER_CLASSES, + FHIRRenderer, + PhenopacketsRenderer, + IndividualCSVRenderer, + IndividualBentoSearchRenderer, + ) # Override to infer the renderer based on a `format` argument from the POST request body content_negotiation_class = FormatInPostContentNegotiation diff --git a/chord_metadata_service/patients/serializers.py b/chord_metadata_service/patients/serializers.py index dee7997bf..57e85fb0b 100644 --- a/chord_metadata_service/patients/serializers.py +++ b/chord_metadata_service/patients/serializers.py @@ -1,9 +1,12 @@ from chord_metadata_service.phenopackets.serializers import BiosampleSerializer, SimplePhenopacketSerializer from chord_metadata_service.restapi.serializers import GenericSerializer from chord_metadata_service.restapi.fhir_utils import fhir_patient -from chord_metadata_service.restapi.argo_utils import argo_donor from .models import Individual +__all__ = [ + "IndividualSerializer", +] + class IndividualSerializer(GenericSerializer): biosamples = BiosampleSerializer(read_only=True, many=True, exclude_when_nested=['individual']) @@ -15,6 +18,3 @@ class Meta: # meta info for converting to FHIR fhir_datatype_plural = 'patients' class_converter = fhir_patient - # meta info for converting to ARGO - argo_profile_plural = 'donors' - argo_converter = argo_donor diff --git a/chord_metadata_service/phenopackets/api_views.py b/chord_metadata_service/phenopackets/api_views.py index 37c3ea871..426b68dc8 100644 --- a/chord_metadata_service/phenopackets/api_views.py +++ b/chord_metadata_service/phenopackets/api_views.py @@ -5,9 +5,12 @@ from rest_framework.permissions import AllowAny from rest_framework.response import Response -from chord_metadata_service.restapi.api_renderers import (PhenopacketsRenderer, FHIRRenderer, - BiosamplesCSVRenderer, ARGORenderer, - IndividualBentoSearchRenderer) +from chord_metadata_service.restapi.api_renderers import ( + PhenopacketsRenderer, + FHIRRenderer, + BiosamplesCSVRenderer, + IndividualBentoSearchRenderer, +) from chord_metadata_service.restapi.constants import MODEL_ID_PATTERN from chord_metadata_service.restapi.pagination import LargeResultsSetPagination, BatchResultsSetPagination from chord_metadata_service.restapi.negociation import FormatInPostContentNegotiation @@ -109,9 +112,13 @@ class BiosampleBatchViewSet(ExtendedPhenopacketsModelViewSet): filter_backends = [DjangoFilterBackend] filterset_class = f.BiosampleFilter pagination_class = BatchResultsSetPagination - renderer_classes = (*api_settings.DEFAULT_RENDERER_CLASSES, FHIRRenderer, - PhenopacketsRenderer, BiosamplesCSVRenderer, ARGORenderer, - IndividualBentoSearchRenderer) + renderer_classes = ( + *api_settings.DEFAULT_RENDERER_CLASSES, + FHIRRenderer, + PhenopacketsRenderer, + BiosamplesCSVRenderer, + IndividualBentoSearchRenderer, + ) content_negotiation_class = FormatInPostContentNegotiation def _get_filtered_queryset(self, ids_list=None): diff --git a/chord_metadata_service/restapi/api_renderers.py b/chord_metadata_service/restapi/api_renderers.py index d8a232f9d..0eb31325e 100644 --- a/chord_metadata_service/restapi/api_renderers.py +++ b/chord_metadata_service/restapi/api_renderers.py @@ -12,6 +12,18 @@ from chord_metadata_service.phenopackets.utils import parse_onset from .jsonld_utils import dataset_to_jsonld +__all__ = [ + "FHIRRenderer", + "PhenopacketsRenderer", + "JSONLDDatasetRenderer", + "RDFDatasetRenderer", + "render_age", + "IndividualCSVRenderer", + "BiosamplesCSVRenderer", + "ExperimentCSVRenderer", + "IndividualBentoSearchRenderer", +] + OUTPUT_FORMAT_BENTO_SEARCH_RESULT = "bento_search_result" register('json-ld', Serializer, 'rdflib_jsonld.serializer', 'JsonLDSerializer') @@ -45,26 +57,6 @@ def render(self, data, media_type=None, renderer_context=None): return super(FHIRRenderer, self).render(final_data, media_type, renderer_context) -class ARGORenderer(JSONRenderer): - media_type = 'application/json' - format = 'argo' - - def render(self, data, media_type=None, renderer_context=None): - argo_profile_plural = getattr( - renderer_context.get('view').get_serializer().Meta, - 'argo_profile_plural', 'objects' - ) - class_converter = getattr( - renderer_context.get('view').get_serializer().Meta, - 'argo_converter', 'objects' - ) - if 'results' in data: - final_data = {argo_profile_plural: [class_converter(item) for item in data['results']]} - else: - final_data = class_converter(data) - return super(ARGORenderer, self).render(final_data, media_type, renderer_context) - - class PhenopacketsRenderer(CamelCaseJSONRenderer): media_type = 'application/json' format = 'phenopackets' diff --git a/chord_metadata_service/restapi/argo_utils.py b/chord_metadata_service/restapi/argo_utils.py deleted file mode 100644 index 2683dde22..000000000 --- a/chord_metadata_service/restapi/argo_utils.py +++ /dev/null @@ -1,32 +0,0 @@ -# functions to convert mcode class to argo representation -# there is no official implemetation guide from mCODE or ARGO -# the mappings is an internal document in CanDIG - - -def argo_administrative_gender(value): - """ Converts Phenopackets sex values to mCODE administrative gender values. """ - if value in ["MALE", "FEMALE"]: - return value.title() - elif value in ["OTHER_SEX", "UNKNOWN_SEX"]: - return value.split("_")[0].title() - else: - raise ValueError("The value is not supported.") - - -def argo_donor(obj): - """ - Convert Individual to ARGO Donor. - Takes Katsu patient object and converts its fields to ARGO according to the mapping. - """ - - donor = { - "submitter_donor_id": obj["id"], - "vital_status": obj.get("deceased", False), - "gender": argo_administrative_gender(obj.get("sex", "UNKNOWN_SEX")) - } - # check for not mapped fields in extra_properties - if "extra_properties" in obj and obj["extra_properties"]: - for i in ["cause_of_death", "survival_time", "primary_site"]: - if i in obj["extra_properties"]: - donor[i] = obj["extra_properties"][i] - return donor