为fhirpath提供Plone动力的供应商
项目描述
背景(collective.fhirpath)
fhirpath在Plone中的实现,包含基本电池,可直接使用。
安装
通过将其添加到您的buildout中安装collective.fhirpath
[buildout] ... eggs += collective.fhirpath
然后运行bin/buildout
在Plone控制面板的插件设置中,安装collective.fhirpath。
工作原理
``FhirResource`` fhir字段
请确保正确使用此专用字段,根据plone.app.fhirfield文档。
使字段可索引
一个名为FhirFieldIndex的专用Catalog PluginIndexes可用,您将像使用其他目录索引一样使用它。
示例
<?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设置
请确保Elasticsearch已按照collective.elasticsearch文档进行配置。
用法
- FHIR搜索:
>>> 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搜索:
>>> 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查询:
>>> 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__ == "Organization"
>>> 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
使用FHIRModelServiceMixin
为了更好的性能优化,您应该使用FHIRModelServiceMixin来高效地响应FHIRModel,FhirFieldValue对象。
示例1
>>> from plone.restapi.services import Service >>> from collective.fhirpath.utils import FHIRModelServiceMixin >>> class MyFHIRGetService(FHIRModelServiceMixin, Service): .... """ """ .... def reply(self): .... # do return bellow's types of data .... # could be ``dict`` type data .... # could be instance of ``FHIRAbstractModel`` derrived class. .... # could be instance of ``plone.app.fhirfield.FhirResourceValue`` derrived class. .... # or self.reply_no_content()
配置
本产品提供三个基于Plone注册表的记录:fhirpath.es.index.mapping.nested_fields.limit、fhirpath.es.index.mapping.depth.limit、fhirpath.es.index.mapping.total_fields.limit。这些与ElasticSearch索引映射设置相关,如果您了解它,则可以从Plone控制面板(注册表)中进行修改。
文档
完整用户文档可以在“docs”文件夹中找到,也可以在https://collective-fhirpath.readthedocs.io/在线查看
贡献
支持
如果您遇到问题,请通过以下方式告知我们:Md Nazrul Islam <email2nazrul@gmail.com>
许可协议
该项目采用GPLv2许可。
REST客户端示例
获取单个资源,这里我们通过ID获取Patient资源。
示例(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>
通过状态条件搜索Observation,任何截至2017年12月之前或早于2017年1月的观察结果。
示例(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>
通过REST API添加FHIR资源
示例(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
更新(PATCH)FHIR资源,当前激活的Patient将被停用。
示例(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>
贡献者
Md Nazrul Islam,email2nazrul@gmail.com(作者)
变更日志
0.8.0 (2022-06-13)
新功能
针对collective.elasticsearch上的问题issue#91,添加了一个补丁。
0.7.6 (2021-05-04)
最低的fhir.resources版本现在是6.1.0,最低的collective.elasticsearch版本现在是3.0.5
0.7.5 (2020-12-17)
最低的fhir.resources版本现在是6.0.0,请参阅其关联更改https://pypi.ac.cn/project/fhir.resources/6.0.0/
最低的fhirpath``version 是现在 ``0.10.5,请参阅其关联的改进和错误修复https://pypi.ac.cn/project/fhirpath/0.10.4/
最低要求的plone.app.fhirfield``version 是现在 ``4.2.0,请参阅其关联的改进和错误修复https://pypi.ac.cn/project/plone.app.fhirfield/4.2.0/
0.7.4 (2020-11-19)
最低要求的fhirpath版本现在是0.10.4(请参阅其更改日志)并添加了兼容性。
0.7.3 (2020-10-24)
创建了一个新的辅助函数json_body,它使用orjson反序列化器。
FHIRModelServiceMixin现在具有更高的性能优化。
0.7.2 (2020-10-06)
在基于ZCatalog的搜索中启用以dict选项返回Bundle响应。
0.7.1 (2020-10-05)
fhirpath``minimum version 已更新,包括最低的fhir.resources版本6.0.0b5。
使用orjson序列化器改进了FHIRModelServiceMixin。
0.7.0 (2020-09-25)
改进
支持从fhirpath 0.8.0的所有功能。
Elasticsearch映射JSON文件已更新。
修复
utils.FHIRModelServiceMixin 现在可以处理响应中的 list 类型数据。
0.6.1 (2020-09-09)
plone.app.fhirfield:default`` 已添加到依赖中,因此无需单独安装 ``plone.app.fhirfield.
0.6.0 (2020-09-09)
改进
FHIRModelServiceMixin 类现在在 utils 模块下可用,可以与您的 plone.restapi 服务一起使用,以以最佳效率响应类型为 FhirModel 即 pydantic 的 BaseModel 或 plone.app.fhirfield.FhirFieldValue 对象。
0.5.0 (2020-08-18)
改进
通过 fhir.resources 和 fhirpath 支持革命性的版本,我们可能需要对现有的代码库进行一些重构,因为这些破坏性更改,请参阅 fhir.resources、plone.app.fhirfield 和 fhirpath 中的更改。
恢复对 Python 版本 3.6 的支持
基于 plone 注册表的三个配置(fhirpath.es.index.mapping.nested_fields.limit、fhirpath.es.index.mapping.depth.limit、fhirpath.es.index.mapping.total_fields.limit)现在可用。
0.4.0 (2020-05-15)
破坏性更改
作为支持最新的 fhirpath 版本(从 0.6.1)的一部分,删除了高于 3.7.0 的 Python 版本。
ElasticsearchEngineFactory.__call__ 的参数名称 fhir_version 已更改为 fhir_release。
0.3.0 (2019-11-10)
改进
添加了 ZCatalog 特有的 fhir 搜索功能,您将从中获得 ZCatalog 的 brain 功能。
FhirFieldIndex 命名为 PluginIndex 现在可用。
FHIR STU3`` 和 ``R4 搜索映射现在可用。
其他改进,使其能够在生产项目中使用(当然没有保证。)
0.2.0 (2019-09-16)
第一个工作版本,有很多改进。
0.1.0 (2019-09-06)
初始发布。 [nazrulworld]
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。
源分发
构建分发
collective.fhirpath-0.8.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d58b20f440774b8de287b6ea6d7b13d973822b022977aaf795844b489a4100bf |
|
MD5 | f63313f6e4a707907213356d6509f5d0 |
|
BLAKE2b-256 | 1a96ef8bab4177fbb5306473aaf46585506d1631e830be7fe9b03bf925759f89 |
哈希 用于 collective.fhirpath-0.8.0-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c1116eba802d866c5a67ae4e457a1199dd7188ff1efd2e7f4b97fb8c5c0dc103 |
|
MD5 | b2a49682679f75ed9669d0734e5417ff |
|
BLAKE2b-256 | 304297b93a00d08f1fd84e46d2addf4b169b2e9f234b578cf9ac460cc335aea9 |