def __init__(self, validation_errors): OperationOutcome.__init__( self, resource={ "resourceType": "OperationOutcome", "issue": [ # TODO: check how to proper map Constraint to OperationOutcome issue { "severity": e["severity"], "code": e["key"], "diagnostics": e["human"], } for e in validation_errors ], }, )
def resolve_expression(_operation, request): try: env = request["resource"]["env"] expression = request["resource"]["expression"] except KeyError as e: raise OperationOutcome(str(e)) resolved_expression = resolve_string_template(expression, env) return web.json_response(resolved_expression)
async def is_valid(self, raise_exception=False): data = await self.client._do_request('post', '{0}/$validate'.format( self.resource_type), data=self.serialize()) if any(issue['severity'] in ['fatal', 'error'] for issue in data['issue']): if raise_exception: raise OperationOutcome(data) return False return True
async def get_questionnaire_context(_operation, request): try: env = parameter_to_env(request["resource"]) except Exception as e: raise OperationOutcome(str(e)) try: questionnaire_data = env["Questionnaire"] except Exception as e: error = "`Questionnaire` parameter is required" if str( e) == "'Questionnaire'" else str(e) raise OperationOutcome(error) questionnaire = sdk.client.resource("Questionnaire", **questionnaire_data) client = sdk.client if questionnaire.get( 'runOnBehalfOfRoot') else get_user_sdk_client(request) await load_source_queries(client, questionnaire, env) return web.json_response(env)
async def is_valid(self, raise_exception=False): data = await self.client._do_request("post", "{0}/$validate".format( self.resource_type), data=self.serialize()) if any(issue["severity"] in ["fatal", "error"] for issue in data["issue"]): if raise_exception: raise OperationOutcome(resource=data) return False return True
def _do_request(self, method, path, data=None, params=None): headers = self._build_request_headers() url = self._build_request_url(path, params) r = requests.request(method, url, json=data, headers=headers) if 200 <= r.status_code < 300: return (json.loads(r.content.decode(), object_hook=AttrDict) if r.content else None) if r.status_code == 404 or r.status_code == 410: raise ResourceNotFound(r.content.decode()) data = r.content.decode() try: parsed_data = json.loads(data) if parsed_data["resourceType"] == "OperationOutcome": raise OperationOutcome(resource=parsed_data) raise OperationOutcome(reason=data) except (KeyError, JSONDecodeError): raise OperationOutcome(reason=data)
async def _do_request(self, method, path, data=None, params=None): headers = self._build_request_headers() url = self._build_request_url(path, params) async with aiohttp.request(method, url, json=data, headers=headers) as r: if 200 <= r.status < 300: data = await r.text() return json.loads(data, object_hook=AttrDict) if r.status == 404 or r.status == 410: raise ResourceNotFound(await r.text()) data = await r.text() try: parsed_data = json.loads(data) if parsed_data["resourceType"] == "OperationOutcome": raise OperationOutcome(resource=parsed_data) raise OperationOutcome(reason=data) except (KeyError, JSONDecodeError): raise OperationOutcome(reason=data)
async def _do_request(self, method, path, data=None, params=None): headers = self._build_request_headers() url = self._build_request_url(path, params) async with aiohttp.request(method, url, json=data, headers=headers) as r: if 200 <= r.status < 300: data = await r.text() return json.loads(data, object_hook=AttrDict) if r.status == 404 or r.status == 410: raise ResourceNotFound(await r.text()) raise OperationOutcome(await r.text())
def _do_request(self, method, path, data=None, params=None): headers = self._build_request_headers() url = self._build_request_url(path, params) r = requests.request(method, url, json=data, headers=headers) if 200 <= r.status_code < 300: return json.loads(r.content.decode(), object_hook=AttrDict) if r.content else None if r.status_code == 404 or r.status_code == 410: raise ResourceNotFound(r.content.decode()) raise OperationOutcome(r.content.decode())
async def extract_questionnaire(operation, request): resource = request["resource"] if resource["resourceType"] == "QuestionnaireResponse": questionnaire_response = sdk.client.resource("QuestionnaireResponse", **request["resource"]) questionnaire = (await sdk.client.resources("Questionnaire").search( id=questionnaire_response["questionnaire"]).get()) elif resource["resourceType"] == "Parameters": env = parameter_to_env(request["resource"]) questionnaire = sdk.client.resource("Questionnaire", **env["questionnaire"]) questionnaire_response = sdk.client.resource( "QuestionnaireResponse", **env["questionnaire_response"]) else: questionnaire = sdk.client.resource("Questionnaire", **env["questionnaire"]) raise OperationOutcome("Wrong parameters") return await extract(questionnaire, questionnaire_response)
def validate_request(request_validator, request): errors = list(request_validator.iter_errors(request)) if errors: raise OperationOutcome( resource={ "resourceType": "OperationOutcome", "text": { "status": "generated", "div": "Invalid request" }, "issue": [{ "severity": "fatal", "code": "invalid", "expression": [".".join([str(x) for x in ve.absolute_path])], "diagnostics": ve.message, } for ve in errors] })
def _do_request(self, method, path, data=None, params=None): headers = self._build_request_headers() url = self._build_request_url(path, params) r = requests.request(method, url, json=data, headers=headers) if 200 <= r.status_code < 300: if r.content: return json.loads(r.content.decode(), object_hook=AttrDict) else: if data is None: return None location = r.headers.get('Location', '') paths = location.split( '{}/'.format(data.get('resourceType', 'Unk')), 1) id = 'unknown' version = 1 if len(paths) > 1: array = paths[1].split('/') id = array[0] version = array[-1] last_updated = r.headers.get('Last-Modified') if last_updated is not None: last_updated = datetime.strptime( last_updated, "%a, %d %b %Y %H:%M:%S %Z").strftime( '%Y-%m-%d %H:%M:%S.%fZ') return { 'id': id, 'meta': { 'version': version, 'lastUpdated': last_updated } } if r.status_code == 404 or r.status_code == 410: raise ResourceNotFound(r.content.decode()) raise OperationOutcome(r.content.decode())