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
             ],
         },
     )
Exemple #2
0
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)
Exemple #3
0
 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
Exemple #4
0
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)
Exemple #5
0
 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
Exemple #6
0
    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)
Exemple #7
0
    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)
Exemple #8
0
    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())
Exemple #9
0
    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())
Exemple #10
0
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)
Exemple #11
0
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]
            })
Exemple #12
0
    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())