Skip to content

Inconsistency between extension attributes for SDTM and CRF specializations #280

Description

@lexjansen

In the latest USDM JSON file there is an inconsistency between the reference to the SDTM dataset specialization and the CRF specialization.
Where the SDTM reference lists the endpoint to the latest version of the specialization:
/mdr/specializations/sdtm/datasetspecializations/{specialization}
the CRF reference lists a specifiic package:
/mdr/specializations/crf/packages/{package}/specializations/{specialization}
Example:

"id": "BiomedicalConcept_20",
"extensionAttributes": [
  {
    "id": "ExtensionAttribute_9",
    "url": "http://www.cdisc.org/usdm/extensions/specializations/sdtm",
    "valueString": "/mdr/specializations/sdtm/datasetspecializations/TEMP",
    "instanceType": "ExtensionAttribute"
  },
  {
    "id": "ExtensionAttribute_145",
    "url": "http://www.cdisc.org/usdm/extensions/specializations/crf",
    "valueString": "/mdr/specializations/crf/packages/2026-06-30/specializations/TEMP_DENORMALIZED",
    "instanceType": "ExtensionAttribute"
  }
],

The reason for this inconsistency is because in src/soa_builder/web/app.py different endpoints are being used.
SDTM:
{base_prefix}/mdr/specializations/datasetspecializations?biomedicalconcept={code}
or
{base_prefix}/mdr/specializations/sdtm/datasetspecializations

CRF first finds the latest package:
{base_prefix}/mdr/specializations/crf/packages
and then gets the CRF list:
{base_prefix}/mdr/specializations/crf/packages/{package}/specializations
The list of returned CRF specializations will have the packagedate in the endpoint.

CRF can use the same endpoint as SDTM:
{base_prefix}/mdr/specializations/datasetspecializations?biomedicalconcept={code}
It will return both SDTM and CRF specializations:

{
  "_links": {
    "datasetSpecializations": {
      "sdtm": [
        {
          "href": "/mdr/specializations/sdtm/datasetspecializations/AE",
          "title": "Adverse Event Free Text Format",
          "type": "SDTM Dataset Specialization"
        },
    ...
      ],
      "crf": [
        {
          "href": "/mdr/specializations/crf/specializations/AE_DENORMALIZED",
          "title": "Adverse Event Free Text Format (Denormalized)",
          "type": "CRF Specialization"
        },
    ...
      ]
    },
    "self": {
      "href": "/mdr/specializations/datasetspecializations?biomedicalconcept=C179175",
      "title": "Dataset Specializations that specialize a Biomedical Concept",
      "type": "Dataset Specializations List"
    },
    "parentBiomedicalConcept": {
      "href": "/mdr/bc/biomedicalconcepts/C179175",
      "title": "Solicited Adverse Event",
      "type": "Biomedical Concept"
    }
  },
  "name": "Dataset Specializations (latest version)",
  "label": "Dataset Specializations List"
}

And for the list of latest versions of CRF, use:
{base_prefix}/mdr/specializations/crf/specializations

This would the result in:

"id": "BiomedicalConcept_20",
"extensionAttributes": [
  {
    "id": "ExtensionAttribute_9",
    "url": "http://www.cdisc.org/usdm/extensions/specializations/sdtm",
    "valueString": "/mdr/specializations/sdtm/datasetspecializations/TEMP",
    "instanceType": "ExtensionAttribute"
  },
  {
    "id": "ExtensionAttribute_145",
    "url": "http://www.cdisc.org/usdm/extensions/specializations/crf",
    "valueString": "/mdr/specializations/crf/specializations/TEMP_DENORMALIZED",
    "instanceType": "ExtensionAttribute"
  }
],

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions