diff --git a/dandi/metadata.py b/dandi/metadata.py index 7ca864ba3..663b00db4 100644 --- a/dandi/metadata.py +++ b/dandi/metadata.py @@ -231,8 +231,6 @@ def extract_anatomy(metadata): def extract_model(modelcls, metadata, **kwargs): m = modelcls.unvalidated() for field in m.__fields__.keys(): - if modelcls == models.BioSample and field == "wasDerivedFrom": - continue value = kwargs.get(field, extract_field(field, metadata)) if value is not Ellipsis: setattr(m, field, value) @@ -253,9 +251,23 @@ def func(metadata): return func -extract_wasDerivedFrom = extract_model_list( - models.BioSample, "identifier", "tissue_sample_id" -) +def extract_wasDerivedFrom(metadata): + derived_from = None + for field, sample_name in [ + ("tissue_sample_id", "tissuesample"), + ("slice_id", "slice"), + ("cell_id", "cell"), + ]: + if metadata.get(field) is not None: + derived_from = [ + models.BioSample( + identifier=metadata[field], + wasDerivedFrom=derived_from, + sampleType=models.SampleType(name=sample_name), + ) + ] + return derived_from + extract_wasAttributedTo = extract_model_list( models.Participant, "identifier", "subject_id" diff --git a/dandi/tests/test_metadata.py b/dandi/tests/test_metadata.py index 65b16fc91..40a2134cf 100644 --- a/dandi/tests/test_metadata.py +++ b/dandi/tests/test_metadata.py @@ -132,8 +132,32 @@ def test_metadata2asset(schema_dir): }, "wasDerivedFrom": [ { - "identifier": "tissue03", - "schemaKey": "BioSample" + "identifier": "cell01", + "schemaKey": "BioSample", + "sampleType": { + "name": "cell", + "schemaKey": "SampleType" + }, + "wasDerivedFrom": [ + { + "identifier": "slice02", + "schemaKey": "BioSample", + "sampleType": { + "name": "slice", + "schemaKey": "SampleType" + }, + "wasDerivedFrom": [ + { + "identifier": "tissue03", + "schemaKey": "BioSample", + "sampleType": { + "name": "tissuesample", + "schemaKey": "SampleType" + } + } + ] + } + ] } ], "wasAttributedTo": [ @@ -213,7 +237,11 @@ def test_metadata2asset_simple1(schema_dir): }, "wasDerivedFrom": [ { - "identifier": "tissue42" + "identifier": "tissue42", + "sampleType": { + "name": "tissuesample", + "schemaKey": "SampleType" + } } ], "wasGeneratedBy": [