Skip to main content

FHIR field for Plone

Project description

Egg Status Travis Build Status Test Coverage Python Versions Latest Version License

Background (

FHIR (Fast Healthcare Interoperability Resources) is the industry standard for Healthcare system. Our intend to implement FHIR based system using Plone! will make life easier to create, manage content for FHIR resources.

How It Works

This field is working as like other zope.schema field, just add and use it. You will feed the field value as either json string or python dict of FHIR resources through web form or any restapi client. This field has built-in FHIR resource validator and parser.


from import FhirResource
from plone.supermodel import model

class IMyContent(model.Schema):

    resource = FhirResource(
        title=u'your title',
        desciption=u'your desciption',
        resource_type='any fhir resource type[optional]'

The field’s value is the instance of a specilized class FhirResourceValue inside the context, which is kind of proxy class of fhirclient model with additional methods and attributes.


  • Plone restapi support
  • Widget: z3cform support
  • plone.supermodel support
  • plone.rfc822 marshaler field support

Available Field’s Options

This field has got all standard options (i.e title, required, desciption and so on) with additionally options for the purpose of either validation or constraint those are related to FHIR.


Required: No

Default: None

Type: String

The name of FHIR resource can be used as constraint, meaning that we can restricted only accept certain resource. If FHIR json is provided that contains other resource type, would raise validation error. Example: FhirResource(….,resource_type=’Patient’)


Required: No

Default: None

Type: String + full python path (dotted) of the model class.

Like resource_type option, it can be used as constraint, however additionally this option enable us to use custom model class other than fhirclient’s model. Example: FhirResource(….,model=’fhirclient.models.patient.Patient’)


Required: No

Default: None

Type: String + full python path (dotted) of the model class.

Unlike model option, this option has more versatile goal although you can use it for single resource restriction. The advanced usecase like, the field could accept muiltiple resources types those model class implements the provided interface. For example you made a interface called IMedicalService and (Organization, Patient, Practitioner) models those are implementing IMedicalService. So when you provides this option value, actually three types of fhir json can now be accepted by this field. Example: FhirResource(….,model=’’)

Field’s Value API

Field’s value is a specilized class which has reponsibilty to act as proxy of fhirclient model’s class. This class provides some powerful methods.


Originally this method is derived from fhirclient base model, you will always have to use this method during negotiation (although our serializer doing that for you automatically). This method not takes any argument, it returns FHIR json representation of resource.


If you are familar with FHIRPath Patch, this method one of the strongest weapon of this class. Patch applying on any FHIR resources is noting but so easy. This method takes one mandatory argument patch_data and that value should be list of patch items (jsonpatch).


from import FhirResource
from plone.supermodel import model

class ITask(model.Schema):

    resource = FhirResource(
        title=u'your title',
        desciption=u'your desciption',

patch_data = [
  {'op': 'replace', 'path': '/source/display', 'value': 'Patched display'},
  {'op': 'replace', 'path': '/status', 'value': 'Reopen'}


This method returns string representation of fhir resource json value. Normally as_json returns python’s dict type data. This method takes optional prettify argument, by setting this argument True, method will return human/print friendly representation.


There may some situation come, where you will need just pure instance of fhir model, this method serves that purpose. This method returns current fhir resource model’s instance.


from fhirclient.models.task import Task
from import FhirResource
from plone.supermodel import model

class ITask(model.Schema):

    resource = FhirResource(
        title=u'your title',
        desciption=u'your desciption',

task = task_content.resource.foreground_origin()
assert isinstance(task, Task)

Helper API

This package provides some useful functions those could be usable in your codebase.


This function return appropriate fhirclient model class based on provided resource type. On wrong resource type zope.interface.Invalid exception is raisen.


>>> from import resource_type_str_to_fhir_model
>>> task_model_class = resource_type_str_to_fhir_model('Task')


  • indexing: we have plan to support json index like elastic search model. Ofcourse performance will be main issue. bellows are some libraries, I found. You are welcome to suggest me any better library for json search.
  • elastic search support


Install by adding it to your buildout:



eggs =

and then running bin/buildout



1.0.0b1 (2018-03-17)

  • first beta version has been released.

1.0.0a10 (2018-03-12)

  • fix(bug) Issue-3: resource_type constraint don’t raise exception from validator.

1.0.0a9 (2018-03-08)

  • There is no restriction/limit over fhir resources, all available models are supported.

1.0.0a8 (2018-01-22)

1.0.0a7 (2018-01-21)

1.0.0a6 (2018-01-14)

  • missing HealthcareService fhir model is added as supported model.

1.0.0a5 (2018-01-14)

  • Person fhir model added in whitelist.

1.0.0a4 (2018-01-14)

  • IFhirResource.model_interface field type changed to DottedName from InterfaceField.

1.0.0a3 (2017-12-22)

  • FHIR Patch support added. Now patching fhir resource is more easy to manage.
  • plone.supermodel support is confirmed.[nazrulworld]
  • plone.rfc822 marshaler field support.[nazrulworld]

1.0.0a2 (2017-12-10)

  • FhirResourceWidget is made working state. From now it is possible to adapt FhirResourceWidget` with z3c.form [nazrulworld]

1.0.0a1 (2017-12-05)

  • Initial release. [nazrulworld]

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date (37.3 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page