44from aiohttp import web
55from fhirpy .lib import AsyncFHIRClient
66
7- from app .converter .fce_to_fhir import from_first_class_extension
8- from app .converter .fhir_to_fce import to_first_class_extension
97from app .sdc .exception import ConstraintCheckOperationOutcome
8+ from app .sdc .getters import get_launch_context
109
1110from ..sdc import (
1211 assemble ,
2524@routes .get ("/Questionnaire/{id}/$assemble" )
2625async def assemble_handler (request : web .BaseRequest ):
2726 client : AsyncFHIRClient = request .app ["client" ]
28- fce_converter_url = getattr (request .app ["settings" ], "FCE_CONVERTER_URL" , None )
2927
3028 questionnaire = (
3129 await client .resources ("Questionnaire" ).search (_id = request .match_info ["id" ]).get ()
3230 )
3331
34- if fce_converter_url :
35- async with aiohttp .ClientSession () as session :
36-
37- async def to_fce (fhir_resource ):
38- async with session .post (
39- f"{ fce_converter_url } /to-fce" , json = dict (fhir_resource )
40- ) as resp :
41- return await resp .json ()
42-
43- fce_questionnaire = await to_fce (dict (questionnaire ))
44- assembled_lazy = await assemble (client , fce_questionnaire , to_fce )
45- assembled = json .loads (json .dumps (assembled_lazy , default = list ))
46-
47- async with session .post (f"{ fce_converter_url } /to-fhir" , json = assembled ) as resp :
48- return web .json_response (await resp .json ())
49-
50- async def get_to_first_class_extension (fhir_resource ):
51- return to_first_class_extension (fhir_resource )
52-
53- assembled_questionnaire_lazy = await assemble (
54- client , to_first_class_extension (questionnaire ), get_to_first_class_extension
55- )
32+ assembled_questionnaire_lazy = await assemble (client , dict (questionnaire ))
5633 assembled_questionnaire = json .loads (json .dumps (assembled_questionnaire_lazy , default = list ))
5734
58- return web .json_response (from_first_class_extension ( assembled_questionnaire ) )
35+ return web .json_response (assembled_questionnaire )
5936
6037
6138@routes .post ("/QuestionnaireResponse/$constraint-check" )
6239async def constraint_check_handler (request : web .BaseRequest ):
6340 client = request .app ["client" ]
6441 env = await parameter_to_env (client , await request .json ())
65- # TODO: I believe there's a bug, it should be in FHIR format
66- env ["Questionnaire" ] = to_first_class_extension (env ["Questionnaire" ])
67- env ["QuestionnaireResponse" ] = to_first_class_extension (env ["QuestionnaireResponse" ])
6842
6943 return web .json_response (await constraint_check (client , env ["Questionnaire" ], env ))
7044
@@ -75,7 +49,7 @@ async def get_questionnaire_context_handler(request: web.BaseRequest):
7549 env = await parameter_to_env (client , await request .json ())
7650
7751 return web .json_response (
78- await get_questionnaire_context (client , to_first_class_extension ( env ["Questionnaire" ]) , env )
52+ await get_questionnaire_context (client , env ["Questionnaire" ], env )
7953 )
8054
8155
@@ -92,7 +66,6 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
9266 )
9367 elif resource ["resourceType" ] == "Parameters" :
9468 env = await parameter_to_env (client , resource )
95- # TODO: Use FHIR spec questionnaire
9669 questionnaire = env .get ("Questionnaire" )
9770 questionnaire_response = env .get ("QuestionnaireResponse" )
9871
@@ -119,14 +92,14 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
11992 ]
12093 )
12194 jute_templates .append (json .loads (template_string ))
122- # TODO: I believe there's a bug, it should be in FHIR
95+
12396 context = {
124- "Questionnaire" : to_first_class_extension ( questionnaire ) ,
125- "QuestionnaireResponse" : to_first_class_extension ( questionnaire_response ) ,
97+ "Questionnaire" : questionnaire ,
98+ "QuestionnaireResponse" : questionnaire_response ,
12699 ** env ,
127100 }
128101
129- await constraint_check (client , to_first_class_extension ( questionnaire ) , context )
102+ await constraint_check (client , questionnaire , context )
130103 extraction_result = await extract (
131104 client , jute_templates , context , get_extract_services (request .app )
132105 )
@@ -137,19 +110,17 @@ async def extract_questionnaire_handler(request: web.BaseRequest):
137110async def extract_questionnaire_instance_operation (request : web .BaseRequest ):
138111 resource = await request .json ()
139112 client = request .app ["client" ]
140- fhir_questionnaire = (
113+ questionnaire = (
141114 await client .resources ("Questionnaire" ).search (_id = request .match_info ["id" ]).get ()
142115 )
143116 jute_templates = []
144117 structure_map_extensions = [
145118 ext
146- for ext in fhir_questionnaire .get ("extension" , [])
119+ for ext in questionnaire .get ("extension" , [])
147120 if ext ["url" ]
148121 == "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-targetStructureMap"
149122 ]
150123
151- questionnaire = to_first_class_extension (fhir_questionnaire )
152-
153124 for structure_map_extension in structure_map_extensions :
154125 structure_map_id = structure_map_extension ["valueCanonical" ].split ("/" )[- 1 ]
155126 structure_map = await client .resources ("StructureMap" ).search (_id = structure_map_id ).get ()
@@ -168,9 +139,8 @@ async def extract_questionnaire_instance_operation(request: web.BaseRequest):
168139
169140 if resource ["resourceType" ] == "QuestionnaireResponse" :
170141 questionnaire_response = client .resource ("QuestionnaireResponse" , ** resource )
171- # TODO: I believe there's a bug, it should be in FHIR
172142 context = {
173- "Questionnaire" : to_first_class_extension ( questionnaire ) ,
143+ "Questionnaire" : questionnaire ,
174144 "QuestionnaireResponse" : questionnaire_response ,
175145 }
176146 await constraint_check (client , questionnaire , context )
@@ -196,8 +166,9 @@ async def extract_questionnaire_instance_operation(request: web.BaseRequest):
196166 questionnaire_response = client .resource (
197167 "QuestionnaireResponse" , ** questionnaire_response_data
198168 )
199- if "launchContext" in questionnaire :
200- validate_context (questionnaire ["launchContext" ], env )
169+ launch_context = get_launch_context (questionnaire .get ("extension" , []))
170+ if launch_context :
171+ validate_context (launch_context , env )
201172 context = {
202173 "QuestionnaireResponse" : questionnaire_response ,
203174 "Questionnaire" : questionnaire ,
@@ -227,7 +198,6 @@ async def populate_questionnaire_handler(request: web.BaseRequest):
227198 env = await parameter_to_env (client , body )
228199 questionnaire_data = env ["Questionnaire" ]
229200 if not questionnaire_data :
230- # TODO: return OperationOutcome
231201 return web .json_response (
232202 {
233203 "error" : "bad_request" ,
0 commit comments