Plone powered provider for fhirpath
Project description
Background (collective.fhirpath)
fhirpath implementation in Plone, essential battery included, ready to use.
Installation
Install collective.fhirpath by adding it to your buildout:
[buildout] ... eggs += collective.fhirpath
and then running bin/buildout
From Plone controlpanel in the addon settings, install collective.fhirpath.
How It Works
``FhirResource`` the fhirfield
Make sure this specialized field is used properly according to plone.app.fhirfield documentation.
Make field indexable
A specilized Catalog PluginIndexes is named FhirFieldIndex is available, you will use it as like other catalog indexes.
Example:
<?xml version="1.0"?> <object name="portal_catalog" meta_type="Plone Catalog Tool"> <index name="organization_resource" meta_type="FhirFieldIndex"> <indexed_attr value="organization_resource"/> </index> </object>
Elasticsearch settings
Make sure elasticsearch has been configured accourding to collective.elasticsearch docs.
Usages
- FHIR Search::
>>> from fhirpath.interfaces import IElasticsearchEngineFactory >>> from fhirpath.interfaces import IFhirSearch >>> from fhirpath.interfaces import ISearchContextFactory >>> from plone import api >>> from collective.elasticsearch.es import ElasticSearchCatalog >>> from zope.component import queryMultiAdapter
>>> es_catalog = ElasticSearchCatalog(api.portal.get_tool("portal_catalog")) >>> factory = queryMultiAdapter( .... (es_catalog,), IElasticsearchEngineFactory .... ) >>> engine = factory(fhir_release="STU3") >>> search_context = queryMultiAdapter((engine,), ISearchContextFactory)( .... resource_type, unrestricted=False) >>> search_factory = queryMultiAdapter((search_context,), IFhirSearch)
>>> params = ( .... ("_profile", "http://hl7.org/fhir/Organization"), .... ("identifier", "urn:oid:2.16.528.1|91654"), .... ("type", "http://hl7.org/fhir/organization-type|prov"), .... ("address-postalcode", "9100 AA"), .... ("address", "Den Burg"), .... ) >>> bundle = search_factory(params) >>> len(bundle.entry) 2 >>> # with query string. >>> # query_string = self.request["QUERY_STRING] >>> query_string = "_profile=http://hl7.org/fhir/Organization&identifier=urn:oid:2.16.528.1|91654&type=http://hl7.org/fhir/organization-type|prov&address-postalcode=9100+AA" >>> bundle = search_factory(query_string=query_string) >>> len(bundle.entry) 2
- ZCatlog FHIR Search::
>>> from collective.fhirpath.interfaces import IZCatalogFhirSearch >>> zcatalog_factory = queryMultiAdapter((search_context,), IZCatalogFhirSearch)
>>> # with query string. >>> # query_string = self.request["QUERY_STRING] >>> query_string = "_profile=http://hl7.org/fhir/Organization&identifier=urn:oid:2.16.528.1|91654&type=http://hl7.org/fhir/organization-type|prov&address-postalcode=9100+AA" >>> brains = zcatalog_factory(query_string=query_string) >>> len(brains) 2
- FHIR Query::
>>> from fhirpath.interfaces import IElasticsearchEngineFactory >>> from fhirpath.interfaces import IFhirSearch >>> from fhirpath.interfaces import ISearchContextFactory >>> from plone import api >>> from collective.elasticsearch.es import ElasticSearchCatalog >>> from zope.component import queryMultiAdapter >>> from fhirpath.query import Q_ >>> from fhirpath.fql import T_ >>> from fhirpath.fql import sort_ >>> from fhirpath.enums import SortOrderType
>>> es_catalog = ElasticSearchCatalog(api.portal.get_tool("portal_catalog")) >>> factory = queryMultiAdapter( .... (es_catalog,), IElasticsearchEngineFactory .... ) >>> engine = factory(fhir_release="STU3") >>> query_builder = Q_(resource="Organization", engine=engine) .... query_builder = query_builder.where( .... T_("Organization.meta.profile", "http://hl7.org/fhir/Organization") .... ).sort(sort_("Organization.meta.lastUpdated", SortOrderType.DESC))
>>> result = query_builder(async_result=False, unrestricted=True).fetchall() >>> result.header.total 2 >>> query_result = query_builder(async_result=False, unrestricted=True) >>> for resource in query_result: .... count += 1 .... assert resource.__class__.__name__ == "OrganizationModel"
>>> query_builder = Q_(resource="Organization", engine=engine) >>> query_builder = query_builder.where(T_("Organization.id", "f001")) >>> result_query = query_builder(async_result=False, unrestricted=True) >>> resource = result_query.single() >>> resource is not None True
>>> query_builder = Q_(resource="Organization", engine=engine) >>> query_builder = query_builder.where( .... T_("Organization.meta.profile", "http://hl7.org/fhir/Organization") .... ) >>> result_query = builder(async_result=False, unrestricted=True) >>> result = result_query.first() >>> isinstance(result, result_query._query.get_from()[0][1]) True
Documentation
Full documentation for end users can be found in the “docs” folder, and is also available online at https://collective-fhirpath.readthedocs.io/
Contribute
Issue Tracker: https://github.com/nazrulworld/collective.fhirpath/issues
Source Code: https://github.com/nazrulworld/collective.fhirpath
Documentation: https://collective-fhirpath.readthedocs.io/
Support
If you are having issues, please let us know at: Md Nazrul Islam<email2nazrul@gmail.com>
License
The project is licensed under the GPLv2.
REST Client Examples
Getting single resource, here we are getting Patient resource by ID.
Example(1):
>>> response = admin_session.get('/@fhir/Patient/19c5245f-89a8-49f8-b244-666b32adb92e') >>> response.status_code 200 <BLANKLINE> >>> response.json()['resourceType'] == 'Patient' True <BLANKLINE> >>> response = admin_session.get('/@fhir/Patient/19c5245f-fake-id') >>> response.status_code 404 <BLANKLINE>
Search Observation by Patient reference with status condition. Any observation until December 2017 and earlier than January 2017.
Example(2):
>>> response = admin_session.get('/@fhir/Observation?patient=Patient/19c5245f-89a8-49f8-b244-666b32adb92e&status=final&_lastUpdated=lt2017-12-31T00%3A00%3A00%2B00%3A00&_lastUpdated=gt2017-01-01T00%3A00%3A00%2B00%3A00') >>> response.status_code 200 >>> response.json()["total"] 1 <BLANKLINE>
Add FHIR Resource through REST API
Example(3):
>>> import os >>> import json >>> import uuid >>> import DateTime >>> import time >>> with open(os.path.join(FIXTURE_PATH, 'Patient.json'), 'r') as f: ... fhir_json = json.load(f) >>> fhir_json['id'] = str(uuid.uuid4()) >>> fhir_json['name'][0]['text'] = 'Another Patient' >>> response = admin_session.post('/@fhir/Patient', json=fhir_json) >>> response.status_code 201 >>> time.sleep(1) >>> response = admin_session.get('/@fhir/Patient?active=true') >>> response.json()["total"] 2
Update (PATCH) FHIR Resource the Patient is currently activated, we will deactive.
Example(4):
>>> patch = [{'op': 'replace', 'path': '/active', 'value': False}] >>> response = admin_session.patch('/@fhir/Patient/19c5245f-89a8-49f8-b244-666b32adb92e', json={'patch': patch}) >>> response.status_code 204 <BLANKLINE>
Contributors
Md Nazrul Islam, email2nazrul@gmail.com (author)
Changelog
0.4.0 (2020-05-15)
Breakings
As a part of supporting latest fhirpath version (from 0.6.1), drop python version later than 3.7.0.
ElasticsearchEngineFactory.__call__’s argument name fhir_version changed to fhir_release.
0.3.0 (2019-11-10)
Improvements
ZCatalog featured fhir search added, from which you will get ZCatalog´s brain feature.
FhirFieldIndex named PluginIndex is now available.
FHIR STU3``and ``R4 search mapping is now available.
Others improvements that make able to use in production project (of course without guarantee.)
0.2.0 (2019-09-16)
first working versions, with lots of improvements.
0.1.0 (2019-09-06)
Initial release. [nazrulworld]
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for collective.fhirpath-0.4.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8b80ae51d6d3a5f9bc1c4312513aef1806d3698c333ed53707c1fb4048ea2867 |
|
MD5 | d179209af670a7fc9e53a14f68d1eb96 |
|
BLAKE2b-256 | c8c0cb063381c306fccb555ab7e5cd9011a0114db57a20b53f44a1d4256f07d0 |
Hashes for collective.fhirpath-0.4.0-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4ae3335e294ccc965d99e5f15e352bc7e8dd1d318e1c610477926d5791ebbd43 |
|
MD5 | 83c572715a14e1d3ab69454dbedcff7f |
|
BLAKE2b-256 | 209a22e9eb2c69a78cc63dec0f988b401754490af8410b917563d952d2ecbce5 |