def fhir_condition(obj): """ Converts Disease to FHIR Condition. """ condition = cond.Condition() condition.id = str(obj['id']) condition.code = fhir_codeable_concept(obj['term']) # subject is required by Pheno-FHIR mapping Guide and by FHIR, set to 'unknown' condition.subject = fhirreference.FHIRReference() condition.subject.reference = 'unknown' condition.extension = [] # only adds disease-onset if it's ontology term # NOTE it is required element by Pheno-FHIR mapping guide but not Phenopackets if check_disease_onset(obj): onset_extension = extension.Extension() onset_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['disease']['onset'] onset_extension.valueCodeableConcept = fhir_codeable_concept( obj['onset']['age']) condition.extension.append(onset_extension) if 'disease_stage' in obj.keys(): for item in obj['disease_stage']: disease_stage_extension = extension.Extension() disease_stage_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'disease']['disease_stage'] disease_stage_extension.valueCodeableConcept = fhir_codeable_concept( item) condition.extension.append(disease_stage_extension) return condition.as_json()
def individual_to_fhir(obj): """Converts Individual to FHIR Patient. :param obj: Individual json :return: FHIR Patient json """ # first validate if phenopackets object is well-formed schema_path = os.path.join(SCHEMA_PATH, 'individual_schema.json') try: validate_schema(schema_path, obj) except jsonschema.exceptions.ValidationError: raise Exception("The individual object is not valid.") patient = p.Patient() patient.id = obj['id'] patient.birthDate = fhirdate.FHIRDate(obj.get('dateOfBirth', None)) patient.gender = obj.get('sex', None) patient.active = obj.get('active', None) patient.deceasedBoolean = obj.get('deceased', None) patient.extension = list() # age if 'age' in obj: age_extension = age_to_fhir( obj, PHENOPACKETS_ON_FHIR_MAPPING['individual']['age'], 'age') patient.extension.append(age_extension) # karyotypic_sex if 'karyotypicSex' in obj: karyotypic_sex_extension = extension.Extension() karyotypic_sex_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'individual']['karyotypicSex']['url'] karyotypic_sex_extension.valueCodeableConcept = codeableconcept.CodeableConcept( ) karyotypic_sex_extension.valueCodeableConcept.coding = list() coding = c.Coding() coding.display = obj.get('karyotypicSex', None) coding.code = obj.get('karyotypicSex', None) coding.system = PHENOPACKETS_ON_FHIR_MAPPING['individual'][ 'karyotypicSex']['system'] karyotypic_sex_extension.valueCodeableConcept.coding.append(coding) patient.extension.append(karyotypic_sex_extension) # taxonomy if 'taxonomy' in obj: taxonomy_extension = extension.Extension() taxonomy_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][ 'taxonomy'] taxonomy_extension.valueCodeableConcept = codeableconcept.CodeableConcept( ) taxonomy_extension.valueCodeableConcept.coding = list() coding = c.Coding() coding.display = obj.get('taxonomy', None).get('label', None) coding.code = obj.get('taxonomy', None).get('id', None) taxonomy_extension.valueCodeableConcept.coding.append(coding) patient.extension.append(taxonomy_extension) return patient.as_json()
def fhir_document_reference(obj): """ Converts HTS file to FHIR DocumentReference. """ doc_ref = documentreference.DocumentReference() doc_ref.type = fhir_codeable_concept({ "label": obj['hts_format'], "id": obj['hts_format'] }) # GA4GH requires status with the fixed value doc_ref.status = PHENOPACKETS_ON_FHIR_MAPPING['hts_file']['status'] doc_ref.content = [] doc_content = documentreference.DocumentReferenceContent() doc_content.attachment = attachment.Attachment() doc_content.attachment.url = obj['uri'] if 'description' in obj.keys(): doc_content.attachment.title = obj.get('description', None) doc_ref.content.append(doc_content) doc_ref.indexed = fhirdate.FHIRDate() # check what date it should be - when it's retrieved or created doc_ref.indexed.date = datetime.now() doc_ref.extension = [] genome_assembly = extension.Extension() genome_assembly.url = PHENOPACKETS_ON_FHIR_MAPPING['hts_file'][ 'genome_assembly'] genome_assembly.valueString = obj['genome_assembly'] doc_ref.extension.append(genome_assembly) return doc_ref.as_json()
def hts_file_to_fhir(obj): """Converts HTS file to FHIR DocumentReference. :param obj: HTS file json :return: FHIR DocumentReference json """ schema_path = os.path.join(SCHEMA_PATH, 'hts_file_schema.json') try: validate_schema(schema_path, obj) except jsonschema.exceptions.ValidationError: raise Exception("The hts file object is not valid.") doc_ref = documentreference.DocumentReference() doc_ref.type = fhir_codeable_concept({ "label": obj['htsFormat'], "id": obj['htsFormat'] }) # GA4GH requires status with the fixed value doc_ref.status = PHENOPACKETS_ON_FHIR_MAPPING['htsFile']['status'] doc_ref.content = [] doc_content = documentreference.DocumentReferenceContent() doc_content.attachment = attachment.Attachment() doc_content.attachment.url = obj['uri'] if 'description' in obj: doc_content.attachment.title = obj['description'] doc_ref.content.append(doc_content) doc_ref.indexed = fhirdate.FHIRDate() doc_ref.indexed.date = datetime.now() doc_ref.extension = [] genome_assembly = extension.Extension() genome_assembly.url = PHENOPACKETS_ON_FHIR_MAPPING['htsFile'][ 'genomeAssembly'] genome_assembly.valueString = obj['genomeAssembly'] doc_ref.extension.append(genome_assembly) return doc_ref.as_json()
def get_responseperiod_x(start,end): responseperiod_x = Ext.Extension() responseperiod_x.url = 'http://fhir.org/guides/argonaut-questionnaire/StructureDefinition/extension-responsePeriod' responseperiod_x.valuePeriod = P.Period() responseperiod_x.valuePeriod.start = FD.FHIRDate(start) responseperiod_x.valuePeriod.end = FD.FHIRDate(end) return responseperiod_x
def QuestionnaireExtension(questionnaire=questionnaire.Questionnaire): from fhirclient.models import extension extension = extension.Extension() extension.url = 'http://hl7.org/fhir/StructureDefinition/servicerequest-questionnaireRequest' reference = fhirreference.FHIRReference() reference.reference = f'Questionnaire/{questionnaire.id}' extension.valueReference = reference return extension
def fhir_specimen(obj): """ Converts biosample to FHIR Specimen. """ specimen = s.Specimen() specimen.identifier = [] # id identifier = fhir_indentifier.Identifier() identifier.value = obj['id'] specimen.identifier.append(identifier) # individual - subject property in FHIR is mandatory for a specimen specimen.subject = fhirreference.FHIRReference() specimen.subject.reference = obj.get('individual', 'unknown') # sampled_tissue specimen.type = codeableconcept.CodeableConcept() specimen.type.coding = [] coding = c.Coding() coding.code = obj['sampled_tissue']['id'] coding.display = obj['sampled_tissue']['label'] specimen.type.coding.append(coding) # description if 'description' in obj.keys(): specimen.note = [] annotation = a.Annotation() annotation.text = obj.get('description', None) specimen.note.append(annotation) # procedure specimen.collection = s.SpecimenCollection() specimen.collection.method = fhir_codeable_concept( obj['procedure']['code']) if 'body_site' in obj['procedure'].keys(): specimen.collection.bodySite = fhir_codeable_concept( obj['procedure']['body_site']) # Note on taxonomy from phenopackets specs: # Individuals already contain a taxonomy attribute so this attribute is not needed. # extensions specimen.extension = [] # individual_age_at_collection if 'individual_age_at_collection' in obj.keys(): ind_age_at_collection_extension = fhir_age( obj, PHENOPACKETS_ON_FHIR_MAPPING['biosample'] ['individual_age_at_collection'], 'individual_age_at_collection') specimen.extension.append(ind_age_at_collection_extension) concept_extensions = codeable_concepts_fields([ 'histological_diagnosis', 'tumor_progression', 'tumor_grade', 'diagnostic_markers' ], 'biosample', obj) for concept in concept_extensions: specimen.extension.append(concept) if 'is_control_sample' in obj.keys(): control_extension = extension.Extension() control_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['biosample'][ 'is_control_sample'] control_extension.valueBoolean = obj['is_control_sample'] specimen.extension.append(control_extension) # TODO 2m extensions - references return specimen.as_json()
def fhir_patient(obj): """ Converts Individual to FHIR Patient. """ patient = p.Patient() patient.id = obj['id'] patient.birthDate = fhirdate.FHIRDate(obj.get('date_of_birth', None)) patient.gender = obj.get('sex', None) patient.active = obj.get('active', None) patient.deceasedBoolean = obj.get('deceased', None) patient.extension = list() # age if 'age' in obj.keys(): age_extension = fhir_age( obj, PHENOPACKETS_ON_FHIR_MAPPING['individual']['age'], 'age') patient.extension.append(age_extension) # karyotypic_sex karyotypic_sex_extension = extension.Extension() karyotypic_sex_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][ 'karyotypic_sex']['url'] karyotypic_sex_extension.valueCodeableConcept = codeableconcept.CodeableConcept( ) karyotypic_sex_extension.valueCodeableConcept.coding = list() coding = c.Coding() coding.display = obj.get('karyotypic_sex', None) coding.code = obj.get('karyotypic_sex', None) coding.system = PHENOPACKETS_ON_FHIR_MAPPING['individual'][ 'karyotypic_sex']['system'] karyotypic_sex_extension.valueCodeableConcept.coding.append(coding) patient.extension.append(karyotypic_sex_extension) # taxonomy if 'taxonomy' in obj.keys(): taxonomy_extension = extension.Extension() taxonomy_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['individual'][ 'taxonomy'] taxonomy_extension.valueCodeableConcept = codeableconcept.CodeableConcept( ) taxonomy_extension.valueCodeableConcept.coding = list() coding = c.Coding() coding.display = obj.get('taxonomy', None).get('label', None) coding.code = obj.get('taxonomy', None).get('id', None) taxonomy_extension.valueCodeableConcept.coding.append(coding) patient.extension.append(taxonomy_extension) return patient.as_json()
def to_fhir(self) -> extension.Extension: fhir_extension = extension.Extension() fhir_extension.url = self.extension_url fhir_coding = coding.Coding() fhir_coding.system = self.system fhir_coding.code = self.code fhir_coding.display = self.display fhir_extension.valueCoding = fhir_coding return fhir_extension
def to_fhir(self) -> extension.Extension: ingredient_extension = extension.Extension() ingredient_extension.url = self.url extension_coding = coding.Coding() extension_coding.system = self.coding_system extension_coding.code = self.coding_code extension_coding.display = self.coding_display ingredient_extension.valueCoding = extension_coding return ingredient_extension
def codeable_concepts_fields(field_list, profile, obj): """ Converts a list of fields to FHIR CodeableConcepts and returns a list of extensions. """ concept_extensions = [] for field in field_list: if field in obj.keys(): codeable_concepts_extension = extension.Extension() codeable_concepts_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[ profile][field] codeable_concepts_extension.valueCodeableConcept = fhir_codeable_concept( obj[field]) concept_extensions.append(codeable_concepts_extension) return concept_extensions
def disease_to_fhir(obj): """Converts Disease to FHIR Condition. :param obj: Disease json :return: FHIR Condition json """ schema_path = os.path.join(SCHEMA_PATH, 'disease_schema.json') try: validate_schema(schema_path, obj) except jsonschema.exceptions.ValidationError: raise Exception("The disease object is not valid.") condition = cond.Condition() if 'id' in obj: condition.id = str(obj['id']) condition.code = fhir_codeable_concept(obj['term']) # subject is required by Pheno-FHIR mapping Guide and by FHIR, set to 'unknown' condition.subject = fhirreference.FHIRReference() condition.subject.reference = 'unknown' condition.extension = [] # only adds disease-onset if it's ontology term # NOTE it is required element by Phenopackets IG but not Phenopackets # what do to if it's AGE string? if check_disease_onset(obj): onset_extension = extension.Extension() onset_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['disease']['onset'] onset_extension.valueCodeableConcept = fhir_codeable_concept( obj['onset']['age']) condition.extension.append(onset_extension) if 'diseaseStage' in obj: for item in obj['diseaseStage']: disease_stage_extension = extension.Extension() disease_stage_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'disease']['disease_stage'] disease_stage_extension.valueCodeableConcept = fhir_codeable_concept( item) condition.extension.append(disease_stage_extension) return condition.as_json()
def fhir_age(obj, mapping, field): """ Generic function to convert Age or AgeRange to FHIR Age. """ age_extension = extension.Extension() age_extension.url = mapping if isinstance(obj[field]['age'], dict): age_extension.valueRange = range.Range() age_extension.valueRange.low = quantity.Quantity() age_extension.valueRange.low.unit = obj[field]['age']['start']['age'] age_extension.valueRange.high = quantity.Quantity() age_extension.valueRange.high.unit = obj[field]['age']['end']['age'] else: age_extension.valueAge = age.Age() age_extension.valueAge.unit = obj[field]['age'] return age_extension
def fhir_age(obj, mapping, field): """ Generic function to convert Age or AgeRange to FHIR Age. """ age_extension = extension.Extension() age_extension.url = mapping if "start" in obj[field]: # Is an age range age_extension.valueRange = range_.Range() age_extension.valueRange.low = quantity.Quantity() age_extension.valueRange.low.unit = obj[field]['start']['age'] age_extension.valueRange.high = quantity.Quantity() age_extension.valueRange.high.unit = obj[field]['end']['age'] else: # Is a precise age age_extension.valueAge = age.Age() age_extension.valueAge.unit = obj[field]['age'] return age_extension
def codeable_concepts_fields(field_list, profile, obj): """Converts a list of fields to FHIR CodeableConcepts and returns a list of extensions. :param field_list: fields to convert to codeable concepts :param profile: name of an object in phenopackets mappings :param obj: object to which fields belong to :return: list of extensions """ concept_extensions = [] for field in field_list: if field in obj: codeable_concepts_extension = extension.Extension() codeable_concepts_extension.url = PHENOPACKETS_ON_FHIR_MAPPING[ profile][field] codeable_concepts_extension.valueCodeableConcept = fhir_codeable_concept( obj[field]) concept_extensions.append(codeable_concepts_extension) return concept_extensions
def age_to_fhir(obj, mapping, field): """Generic function to convert Phenopackets Age or AgeRange to FHIR Age. :param obj: object to which field Age or AgeRange belongs to :param mapping: mapping from PHENOPACKETS_ON_FHIR :param field: name of the field that stores age :return: age extension object """ age_extension = extension.Extension() age_extension.url = mapping if isinstance(obj[field]['age'], dict): age_extension.valueRange = range.Range() age_extension.valueRange.low = quantity.Quantity() age_extension.valueRange.low.unit = obj[field]['age']['start']['age'] age_extension.valueRange.high = quantity.Quantity() age_extension.valueRange.high.unit = obj[field]['age']['end']['age'] else: age_extension.valueAge = age.Age() age_extension.valueAge.unit = obj[field]['age'] return age_extension
def getextension(url, valuetype, value): # fhirextension ext = Ext.Extension({'url': url, valuetype: value}) return (ext) # note this returning as a list!! TODO fix this
def biosample_to_fhir(obj): """Converts Biosample to FHIR Specimen. :param obj: Biosample json :return: FHIR Specimen json """ schema_path = os.path.join(SCHEMA_PATH, 'biosample_schema.json') try: validate_schema(schema_path, obj) except jsonschema.exceptions.ValidationError: raise Exception("The biosample object is not valid.") specimen = s.Specimen() specimen.identifier = [] # id identifier = fhir_indentifier.Identifier() identifier.value = obj['id'] specimen.identifier.append(identifier) # individual - subject property in FHIR is mandatory for a specimen specimen.subject = fhirreference.FHIRReference() specimen.subject.reference = obj.get('individual', 'unknown') # sampled_tissue specimen.type = codeableconcept.CodeableConcept() specimen.type.coding = [] coding = c.Coding() coding.code = obj['sampledTissue']['id'] coding.display = obj['sampledTissue']['label'] specimen.type.coding.append(coding) # description if 'description' in obj: specimen.note = [] annotation = a.Annotation() annotation.text = obj.get('description', None) specimen.note.append(annotation) # procedure specimen.collection = s.SpecimenCollection() specimen.collection.method = fhir_codeable_concept( obj['procedure']['code']) if 'bodySite' in obj['procedure']: specimen.collection.bodySite = fhir_codeable_concept( obj['procedure']['bodySite']) # Note on taxonomy from phenopackets specs: # Individuals already contain a taxonomy attribute so this attribute is not needed. # extensions specimen.extension = [] # individual_age_at_collection if 'individualAgeAtCollection' in obj: ind_age_at_collection_extension = age_to_fhir( obj, PHENOPACKETS_ON_FHIR_MAPPING['biosample'] ['individualAgeAtCollection'], 'individualAgeAtCollection') specimen.extension.append(ind_age_at_collection_extension) concept_extensions = codeable_concepts_fields([ 'histologicalDiagnosis', 'tumorProgression', 'tumorGrade', 'diagnosticMarkers' ], 'biosample', obj) for concept in concept_extensions: specimen.extension.append(concept) if 'isControlSample' in obj: control_extension = extension.Extension() control_extension.url = PHENOPACKETS_ON_FHIR_MAPPING['biosample'][ 'isControlSample'] control_extension.valueBoolean = obj['isControlSample'] specimen.extension.append(control_extension) # TODO 2m extensions - references return specimen.as_json()
def fhir_observation(obj): """ Converts phenotypic feature to FHIR Observation. """ observation = obs.Observation() if 'description' in obj.keys(): observation.note = [] annotation = a.Annotation() annotation.text = obj.get('description', None) observation.note.append(annotation) observation.code = fhir_codeable_concept(obj['type']) # required by FHIR specs but omitted by phenopackets, for now set for unknown observation.status = 'unknown' if 'negated' in obj.keys(): observation.interpretation = fhir_codeable_concept({ "label": "Positive", "id": "POS" }) else: observation.interpretation = fhir_codeable_concept({ "label": "Negative", "id": "NEG" }) observation.extension = [] concept_extensions = codeable_concepts_fields( ['severity', 'modifier', 'onset'], 'phenotypic_feature', obj) for c in concept_extensions: observation.extension.append(c) if 'evidence' in obj.keys(): evidence = extension.Extension() evidence.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypic_feature'][ 'evidence']['url'] evidence.extension = [] evidence_code = extension.Extension() evidence_code.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypic_feature'][ 'evidence']['evidence_code'] evidence_code.valueCodeableConcept = fhir_codeable_concept( obj['evidence']['evidence_code']) evidence.extension.append(evidence_code) if 'reference' in obj['evidence'].keys(): evidence_reference = extension.Extension() evidence_reference.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'external_reference']['url'] evidence_reference.extension = [] evidence_reference_id = extension.Extension() evidence_reference_id.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'external_reference']['id_url'] # GA$GH guide requires valueURL but there is no such property evidence_reference_id.valueUri = obj['evidence']['reference']['id'] evidence_reference.extension.append(evidence_reference_id) if 'description' in obj['evidence']['reference'].keys(): evidence_reference_desc = extension.Extension() evidence_reference_desc.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'external_reference']['description_url'] evidence_reference_desc.valueString = obj['evidence'][ 'reference'].get('description', None) evidence_reference.extension.append(evidence_reference_desc) evidence.extension.append(evidence_reference) observation.extension.append(evidence) if 'biosample' in obj.keys(): observation.specimen = fhirreference.FHIRReference() observation.specimen.reference = obj.get('biosample', None) return observation.as_json()
def to_fhir(self) -> extension.Extension: fhir_extension = extension.Extension() fhir_extension.url = self.extention_url fhir_extension.valueDateTime = self.recorded_datetime.to_fhir() return fhir_extension
def phenotypic_feature_to_fhir(obj): """Converts Phenotypic feature to FHIR Observation. :param obj: PhenotypicFeature json :return: FHIR Observation json """ schema_path = os.path.join(SCHEMA_PATH, 'phenotypic_feature_schema.json') try: validate_schema(schema_path, obj) except jsonschema.exceptions.ValidationError: raise Exception("The phenotypic feature object is not valid.") observation = obs.Observation() if 'description' in obj: observation.note = [] annotation = a.Annotation() annotation.text = obj.get('description', None) observation.note.append(annotation) observation.code = fhir_codeable_concept(obj['type']) # required by FHIR specs but omitted by phenopackets, for now set for unknown observation.status = 'unknown' if 'negated' in obj: observation.interpretation = fhir_codeable_concept({ "label": "Positive", "id": "POS" }) else: observation.interpretation = fhir_codeable_concept({ "label": "Negative", "id": "NEG" }) observation.extension = [] concept_extensions = codeable_concepts_fields( ['severity', 'modifier', 'onset'], 'phenotypicFeature', obj) for c in concept_extensions: observation.extension.append(c) if 'evidence' in obj: evidence = extension.Extension() evidence.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypicFeature'][ 'evidence']['url'] evidence.extension = [] evidence_code = extension.Extension() evidence_code.url = PHENOPACKETS_ON_FHIR_MAPPING['phenotypicFeature'][ 'evidence']['evidenceCode'] evidence_code.valueCodeableConcept = fhir_codeable_concept( obj['evidence']['evidenceCode']) evidence.extension.append(evidence_code) if 'reference' in obj['evidence']: evidence_reference = extension.Extension() evidence_reference.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'externalReference']['url'] evidence_reference.extension = [] evidence_reference_id = extension.Extension() evidence_reference_id.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'externalReference']['idUrl'] evidence_reference_id.valueUri = obj['evidence']['reference']['id'] evidence_reference.extension.append(evidence_reference_id) if 'description' in obj['evidence']['reference']: evidence_reference_desc = extension.Extension() evidence_reference_desc.url = PHENOPACKETS_ON_FHIR_MAPPING[ 'externalReference']['descriptionUrl'] evidence_reference_desc.valueString = obj['evidence'][ 'reference'].get('description', None) evidence_reference.extension.append(evidence_reference_desc) evidence.extension.append(evidence_reference) observation.extension.append(evidence) if 'biosample' in obj: observation.specimen = fhirreference.FHIRReference() observation.specimen.reference = obj.get('biosample', None) return observation.as_json()
def create_fhir_object(self): """ Generate a fhirclient.Patient class object and store in the protected attribute _fhir :return: None """ # Patient object must be persistent to generate FHIR attributes ins = inspect(self) if ins.persistent: # Initialize Patient resource fhir_pt = fhir_patient.Patient() # Set resource logical identifier fhir_pt.id = self.get_url() # Build and assign Meta resource for Patient object fhir_meta = meta.Meta() fhir_meta.lastUpdated = fhir_gen_datetime(value=self.updated_at, error_out=False, to_date=False) fhir_meta.versionId = str(self.version_number) fhir_meta.profile = ['http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient'] fhir_pt.meta = fhir_meta # Patient name represented as HumanName resource fhir_pt.name = [] fhir_pt.name.append(fhir_gen_humanname(use='usual', first_name=self.first_name, last_name=self.last_name, middle_name=self.middle_name, suffix=self.suffix, prefix=self.prefix)) # Display MRN as identifier codeable concept = Patient.identifier.codeableconcept.coding # Initialize Identifier resource id_mrn = identifier.Identifier() id_mrn.use = 'usual' id_mrn.system = 'http://unkani.com' id_mrn.value = str(self.uuid) # Initialize CodeableConcept resource mrn_cc = codeableconcept.CodeableConcept() mrn_cc.text = 'Medical Record Number' # Initialize Coding resource mrn_coding = coding.Coding() mrn_coding.system = 'http://hl7.org/fhir/v2/0203' mrn_coding.code = 'MR' mrn_coding.display = 'Medical Record Number' # Assign Coding resource to CodeableConcept mrn_cc.coding = [mrn_coding] # Assign CodeableConcept to Identifier id_mrn.type = mrn_cc # Assign CodeableConcept to Patient fhir_pt.identifier = [id_mrn] # Display SSN as identifier codeable concept = Patient.identifier.codeableconcept.coding if self.ssn: # Initialize Identifier resource id_ssn = identifier.Identifier() id_ssn.use = 'usual' id_ssn.system = 'http://hl7.org/fhir/sid/us-ssn' id_ssn.value = self.ssn # Initialize CodeableConcept resource ssn_cc = codeableconcept.CodeableConcept() ssn_cc.text = 'Social Security Number' # Initialize Coding resource ssn_coding = coding.Coding() ssn_coding.system = 'http://hl7.org/fhir/v2/0203' ssn_coding.code = 'SS' ssn_coding.display = 'Social Security Number' # Assign Coding resource to CodeableConcept ssn_cc.coding = [ssn_coding] # Assign CodeableConcept to Identifier id_ssn.type = ssn_cc # Assign CodeableConcept to Patient fhir_pt.identifier.append(id_ssn) if self.marital_status: marital_status_cc = codeableconcept.CodeableConcept() marital_status_url = 'http://hl7.org/fhir/ValueSet/marital-status' marital_status_concept = ValueSet.get_valueset_concept(marital_status_url, self.marital_status) if marital_status_concept: marital_status_cc.text = getattr(marital_status_concept, 'display') marital_status_coding = coding.Coding() marital_status_coding.code = self.marital_status marital_status_coding.system = marital_status_url marital_status_coding.display = marital_status_cc.text marital_status_cc.coding = [marital_status_coding] fhir_pt.maritalStatus = marital_status_cc if self.race: ext_race = extension.Extension() ext_race.url = 'http://hl7.org/fhir/StructureDefinition/us-core-race' race_url = 'http://hl7.org/fhir/us/core/ValueSet/omb-race-category' cc_race = codeableconcept.CodeableConcept() race_concept = ValueSet.get_valueset_concept(race_url, self.race) if race_concept: cc_race.text = getattr(race_concept, 'display') coding_race = coding.Coding() coding_race.system = race_url coding_race.code = self.race coding_race.display = cc_race.text cc_race.coding = [coding_race] ext_race.valueCodeableConcept = cc_race try: fhir_pt.extension.append(ext_race) except AttributeError: fhir_pt.extension = [ext_race] if self.ethnicity: ext_ethnicity = extension.Extension() ext_ethnicity.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity' cc_ethnicity = codeableconcept.CodeableConcept() cc_ethnicity.text = ethnicity_dict.get(self.ethnicity)[0].capitalize() coding_ethnicity = coding.Coding() coding_ethnicity.system = 'http://hl7.org/fhir/us/core/ValueSet/omb-ethnicity-category' coding_ethnicity.code = self.race coding_ethnicity.display = cc_ethnicity.text cc_ethnicity.coding = [coding_ethnicity] ext_ethnicity.valueCodeableConcept = cc_ethnicity try: fhir_pt.extension.append(ext_ethnicity) except AttributeError: fhir_pt.extension = [ext_ethnicity] if self.sex: sex_dict = {"administrativeGender": {"M": "male", "F": "female", "u": "unknown", "o": "other"}, "usCoreBirthSex": {"M": "M", "F": "F", "U": "UNK", "O": "UNK"}} fhir_pt.gender = sex_dict['administrativeGender'][str(self.sex).upper()] ext_birth_sex = extension.Extension() ext_birth_sex.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex' ext_birth_sex.valueCode = sex_dict['usCoreBirthSex'][str(self.sex).upper()] try: fhir_pt.extension.append(ext_birth_sex) except AttributeError: fhir_pt.extension = [ext_birth_sex] if self.dob: fhir_pt.birthDate = fhir_gen_datetime(value=self.dob, to_date=True) fhir_pt.active = self.active fhir_pt.deceasedBoolean = self.deceased if self.deceased_date: fhir_pt.deceasedDateTime = fhir_gen_datetime(value=self.deceased_date, to_date=False) if self.preferred_language: fhir_comm = fhir_patient.PatientCommunication() fhir_comm.preferred = True fhir_lang_cc = codeableconcept.CodeableConcept() fhir_lang_coding = coding.Coding() fhir_lang_coding.code = self.preferred_language fhir_lang_url = 'http://hl7.org/fhir/ValueSet/languages' fhir_lang_coding.system = fhir_lang_url fhir_lang_concept = ValueSet.get_valueset_concept(fhir_lang_url, self.preferred_language) if fhir_lang_concept: fhir_lang_coding.display = fhir_lang_concept.display fhir_lang_cc.text = fhir_lang_coding.display fhir_lang_cc.coding = [fhir_lang_coding] fhir_comm.language = fhir_lang_cc fhir_pt.communication = [fhir_comm] contact_point_list = [] phone_list = self.phone_numbers.all() if phone_list: for ph in phone_list: contact_point_list.append(ph.fhir) email_list = self.email_addresses.all() if email_list: for em in email_list: contact_point_list.append(em.fhir) if contact_point_list: fhir_pt.telecom = contact_point_list address_list = self.addresses.all() if address_list: fhir_pt.address = [] for addr in address_list: fhir_pt.address.append(addr.fhir) xhtml = render_template('fhir/patient.html', fhir_patient=fhir_pt, patient=self) fhir_pt.text = narrative.Narrative() fhir_pt.text.status = 'generated' fhir_pt.text.div = xhtml self._fhir = fhir_pt
def _generate_patient_fhir_object(self): """Creates a test patient using fhirclient.models.""" Patient = p.Patient() HumanName = hn.HumanName() HumanName.family = [self.name_last] HumanName.given = [self.name_first] Patient.name = [HumanName] Patient.gender = self.gender birthDay = fd.FHIRDate() birthDay.date = self.bday Patient.birthDate = birthDay Address = a.Address() Address.country = 'USA' Address.postalCode = self.zipcode Address.state = self.state Address.city = self.city Address.line = [f'{self.address_number} {self.address_street}'] Address.use = 'home' Address.type = 'postal' Patient.active = True Patient.address = [Address] PatientCommunication = p.PatientCommunication() PatientCommunication.language = self._create_FHIRCodeableConcept( 'en-US', 'urn:ietf:bcp:47', 'English') # PatientCommunication.language = self._create_FHIRCodeableConcept('en-US','http://hl7.org/fhir/ValueSet/languages','English') PatientCommunication.preferred = True Patient.communication = [PatientCommunication] race = e.Extension() race.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-race' us_core = e.Extension() us_core.url = 'ombCategory' us_core.valueCoding = self._create_FHIRCoding( self.race_code, 'urn:oid:2.16.840.1.113883.6.238', self.race_description) race_detailed = e.Extension() race_detailed.url = 'detailed' race_detailed.valueCoding = self._create_FHIRCoding( self.race_code, 'urn:oid:2.16.840.1.113883.6.238', self.race_description) race_text = e.Extension() race_text.url = 'text' race_text.valueString = self.race_description race.extension = [us_core, race_detailed, race_text] ethnicity = e.Extension() ethnicity.url = 'http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity' us_core = e.Extension() us_core.url = 'ombCategory' us_core.valueCoding = self._create_FHIRCoding( self.ethnicity_code, 'urn:oid:2.16.840.1.113883.6.238', self.ethnicity_description) ethnicity_text = e.Extension() ethnicity_text.url = 'text' ethnicity_text.valueString = self.ethnicity_description ethnicity.extension = [us_core, ethnicity_text] Patient.extension = [race, ethnicity] Patient.managingOrganization = self._create_FHIRReference( self.Organization) self._validate(Patient) self.response = self.post_resource(Patient) Patient.id = self._extract_id() self.Patient = Patient print(self)