Skip to main content

The Thalamus project provides a RESTful API hub to all the GNU Health Federation nodes. The main functions are:

  1. Message server: A concentrator and message relay from and to the participating nodes in the GNU Health Federation and the GNU Health Information System (PgSQL). Some of the participating nodes include the GNU Health HMIS, MyGNUHealth mobile PHR application, laboratories, research institutions and civil offices.

  2. Authentication Server: Thalamus also serves as an authentication and authorization server to interact with the GNUHealth Information System

Thalamus is part of the GNU Health project, but it is a self contained, independent server that can be used in different health related scenarios.

Installation

Thalamus is pip-installable:

$ pip3 install --upgrade --user thalamus

Technology

RESTful API: Thalamus uses a REST (Representional State Transfer) architectural style, powered by Flask technology

Thalamus will perform CRUD (Create, Read, Update, Delete) operations. They will be achived via the following methods upon resources and their instances.

  • GET : Read

  • POST : Create

  • PATCH : Update

  • DELETE : Delete.

The DELETE operations will be minimal.

JSON: The information will be encoded in JSON format.

Resources

Some resources and end-points are:

  • People (/people)

  • Pages of Life (/pols)

  • DomiciliaryUnits (/domiciliary-units)

  • PersonalDocs (/personal_docs)

Running Thalamus from a WSGI Container

In production settings, for performance reasons you should use a HTTP server. We have chosen uWSGI , but you can use any WSGI server. We have also included the configuration file for Gunicorn if you prefer it instead of uWSGI.

For example, you can run the Thalamus application from uWSGI as follows. The default configuration file uses secure (SSL) connections:

$ uwsgi --ini etc/thalamus_uwsgi.ini

For development, ff you want to run it directly from the Flask Werkzeug server,:

$ python3 ./thalamus.py

Examples

Command-line, using httpie

Retrieve the demographic information of person:

$ http --verify no --auth ARGBUE111FAV:freedom https://federation.gnuhealth.org:8443/people/ESPGNU777ORG

Yields to:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: close
Content-Length: 547
Content-Type: application/json
Date: Thu, 30 Jul 2020 12:01:37 GMT
Server: gunicorn/20.0.0

{
    "_id": "ESPGNU777ORG",
    "active": true,
    "dob": "1990-10-04",
    "education": "tertiary",
    "ethnicity": "latino",
    "gender": "f",
    "id": "ESPGNU777ORG",
    "lastname": "Betz",
    "marital_status": "married",
    "modification_info": {
        "node": "SPAIN-LASPALMAS-GNUSOLIDARIO-GRAL_HOSPITAL",
        "timestamp": "2018-11-06 19:24:43.662846",
        "user": "ITAPYT999HON"
    },
    "name": "Ana",
    "password": "$2b$12$cjrKVGYEKUwCmVDCtEnwcegcrmECTmeBz526AAD/ZqMGPWFpHJ4FW",
    "profession": "teacher",
    "roles": [
        "end_user"
    ]
}

Retrieve the demographics information globally:

$ http --verify no --auth ARGBUE111FAV:freedom https://federation.gnuhealth.org:8443/people

Yields to:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Connection: close
Content-Length: 2715
Content-Type: application/json
Date: Mon, 20 Jul 2020 18:03:24 GMT
Server: gunicorn/20.0.0

[
[
    {
        "active": true,
        "dob": "1984-10-05",
        "education": "tertiary",
        "ethnicity": "latino",
        "gender": "f",
        "id": "ITAPYT999HON",
        "lastname": "Cordara",
        "marital_status": "married",
        "name": "Cameron",
        "password": "$2b$12$Y9rX7PoTHRXhTO1H78Tan.8mVmyayGAUIveiYxu2Qeo0ZDRvJQ8/2",
        "profession": "teacher",
        "roles": [
            "end_user",
            "health_professional"
        ]
    }
],
[
    {
        "creation_info": {
            "node": "SPAIN-LASPALMAS-GNUSOLIDARIO-GRAL_HOSPITAL",
            "timestamp": "2019-11-20 10:39:21.162731",
            "user": "ITAPYT999HON"
        },
        "dob": "1999-10-12",
        "gender": "m",
        "id": "DEUMOP095IDI",
        "lastname": "Dillinger",
        "name": "John Doe",
        "roles": [
            "end_user"
        ]
    }
],


[
    {
        "active": true,
        "dob": "2008-10-12",
        "education": "tertiary",
        "ethnicity": "latino",
        "gender": "f",
        "id": "ARGBUE111FAV",
        "lastname": "Root",
        "marital_status": "married",
        "name": "Admin",
        "password": "$2b$12$McKDNgArdHKbUssD1fj64ecpdbJGMIt29ns7DGvqzqIT26W0dtJzi",
        "profession": "System Administrator",
        "roles": [
            "root"
        ]
    }
],
[
    {
        "_id": "ESPGNU777ORG",
        "active": true,
        "dob": "1990-10-04",
        "education": "tertiary",
        "ethnicity": "latino",
        "gender": "f",
        "id": "ESPGNU777ORG",
        "lastname": "Betz",
        "marital_status": "married",
        "modification_info": {
            "node": "SPAIN-LASPALMAS-GNUSOLIDARIO-GRAL_HOSPITAL",
            "timestamp": "2018-11-06 19:24:43.662846",
            "user": "ITAPYT999HON"
        },
        "name": "Ana",
        "password": "$2b$12$cjrKVGYEKUwCmVDCtEnwcegcrmECTmeBz526AAD/ZqMGPWFpHJ4FW",
        "profession": "teacher",
        "roles": [
            "end_user"
        ]
    }
],
]

Using Python requests:

>>> import requests
>>> person = requests.get('https://localhost:8443/people/ESPGNU777ORG', auth=('ITAPYT999HON', 'gnusolidario'), verify=False)
>>> person.json()
  {'_id': 'ESPGNU777ORG', 'active': True, 'biological_sex': 'female','dob': 'Fri, 04 Oct 1985 13:05:00 GMT',
  'education': 'tertiary', 'ethnicity': 'latino', 'gender': 'female', 'lastname': 'Betz', 'marital_status': 'married',
  'name': 'Ana', 'password': '$2b$12$cjrKVGYEKUwCmVDCtEnwcegcrmECTmeBz526AAD/ZqMGPWFpHJ4FW', 'profession': 'teacher',
  'roles': ['end_user']}

Note on roles The demo user “ITAPYT999HON” is a health professional (health_professional role), so she has global access to demographic information.

The user “ARGBUE111FAV”, password “freedom”. This is the “root” user for the demo database.

Check the roles.cfg file for examples information about roles and ACLs.

Development

Thalamus is part of the GNU Health project.

The development will be done on GNU Savannah, using the Mercurial repository.

Tasks, bugs and mailing lists will be on health-dev@gnu.org , for development.

General questions can be done on health@gnu.org mailing list.

Homepage

https://www.gnuhealth.org

Release Cycle

Thalamus, as other GNU Health components, will follow its own release process.

Documentation

The Thalamus documentation will be at the corresponding chapter in the GNU Health Wikibook

https://en.wikibooks.org/wiki/GNU_Health

Author:

Luis Falcon <falcon@gnuhealth.org>

Metadata

Release files for thalamus 0.9.15

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for thalamus 0.9.15
File Size Uploaded
thalamus-0.9.15.tar.gz 50.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for thalamus 0.9.15
File Interpreter ABI Platform
thalamus-0.9.15-py3-none-any.whl Python 3 none any Details

Total release size: 100.5 kB

Release files / thalamus-0.9.15.tar.gz

Download URL thalamus-0.9.15.tar.gz
Size 50.3 kB
Tags Source
SHA-256 checksum
How to use checksums
3a67743c7322fcc4257647a22eed2d5d3ae846de6f29702b4af7b336bdd4faf4
BLAKE2b-256 checksum
How to use checksums
6100b59e0f2462f4796aed1014bfc2c78afdc66a10e25619ad69e8d36f0f7a84
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.12.2

Release files / thalamus-0.9.15-py3-none-any.whl

Download URL thalamus-0.9.15-py3-none-any.whl
Size 50.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f9d00e08497e708e159e14f5c20f628391141d16d7af80154f033ec2d9acebdd
BLAKE2b-256 checksum
How to use checksums
dad2df8cd3fdb47f5b3c83d0f252f1b2caca6135f515934123cfa808d642c90c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.12.2

Release history Release notifications | RSS feed

0.9.18

2 release files

0.9.16

2 release files

This release

0.9.15 This release

2 release files

0.9.14

1 release file

0.9.13

1 release file

0.9.12

1 release file

0.9.11

1 release file

0.9.10

1 release file

0.9.9

1 release file

0.9.8

2 release files

0.9.7

2 release files

0.9.6

1 release file

0.9.5

1 release file

0.9.4

1 release file

0.9.3

1 release file

0.9.2

1 release file

0.9.1

1 release file

0.9.0

1 release file

0.0.9

2 release files

0.0.8

2 release files

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page