Skip to main content

Modern Python client for the QGenda REST API

Project description

qgendapy

Modern Python client for the QGenda REST API.

Documentation: GitHub Pages Docs

Thank you to JP Jorissen for laying the foundation for this library.

Features

  • Full API coverage -- 160+ methods across 24 resource groups
  • Sync + Async -- QGendaClient and AsyncQGendaClient with identical APIs
  • Resource-namespaced -- client.schedule.list(), client.staff.get(key), client.credentialing.workflows()
  • Typed models -- Dataclass responses with automatic PascalCase-to-snake_case mapping
  • OData builder -- OData().select("Name").filter("IsActive eq true")
  • 3-tier config -- Explicit args > environment variables > INI file
  • Drop-in compat -- Migration module for legacy python-qgenda users

Installation

pip install qgendapy

Quick Start

from qgendapy import QGendaClient, OData

client = QGendaClient(
    email="you@hospital.org",
    password="your-password",
    company_key="your-company-key",
)

# Get this week's schedule
schedule = client.schedule.list(start_date="2024-01-15", end_date="2024-01-21")
for entry in schedule:
    print(f"{entry.staff_f_name} {entry.staff_l_name}: {entry.task_name}")

# OData filtering
odata = OData().select("FirstName", "LastName").filter("IsActive eq true")
staff = client.staff.list(odata=odata)

Configuration

# Environment variables
export QGENDA_EMAIL="you@hospital.org"
export QGENDA_PASSWORD="your-password"
export QGENDA_COMPANY_KEY="your-company-key"
# Then just:
client = QGendaClient()

Legacy QGENDA_CONF_FILE INI format is also supported.

Related-entity loading: includes= vs OData $expand

QGenda offers two ways to ask for related entities, and they aren't interchangeable:

  • OData $expand (client.staff.list(expand="Tags") or odata=OData().expand("Tags")) targets nav properties on the OData DTO. On QGenda's production endpoints these often return null for non-admin service accounts, even when the data exists.
  • QGenda's own includes= query parameter is a separate, non-OData selector that returns rich nested categories. It works under non-admin scope on schedule-style endpoints — this is the preferred way to read tag/specialty data attached to schedule entries.
# Pull every Call 1 shift on a given day, with Primary Specialty,
# Sub Specialty, Staff Type, and Skill Set tags inline:
resp = client.schedule.list(
    start_date="2026-05-22",
    end_date="2026-05-22",
    includes="StaffTags",
    odata=OData().filter("TaskName eq 'Call 1'"),
)
for entry in resp:
    if entry.staff_tags:
        for cat in entry.staff_tags:
            print(cat.category_name, [t["Name"] for t in (cat.tags or [])])

Allowed values, observed in the wild (cross-check against your QGenda deployment):

Endpoint Valid includes= values
/schedule StaffTags, TaskTags, LocationTags
/openshifts TaskTags, LocationTags
/task Profiles, Tags, TaskShifts
/staffmember Skillset, Tags, Profiles (verify per deployment)
/dailycase Task, Supervisors, DirectProviders
/patientencounter StandardFields, PatientInformation

Async

from qgendapy import AsyncQGendaClient

async with AsyncQGendaClient() as client:
    schedule = await client.schedule.list(start_date="2024-01-15")

Migrating from python-qgenda

# Change one import:
# from qgenda.api.client import QGendaClient
from qgendapy.compat import QGendaClient

# Everything else works the same
client = QGendaClient(username="...", password="...", company_key="...")
client.authenticate()
resp = client.get_schedule(start_date="2024-01-15")
data = resp.json()

See docs/migration.md for the full migration guide.

Resources

Resource Attribute Methods
Schedule client.schedule list, audit_log, open_shifts, rotations
Staff client.staff list, get, create, update, tags, skillsets, profiles, pay_modifiers, ...
Staff Type client.staff_type list
Task client.task list, create, update, locations, tags, shifts
Facility client.facility list, get, create, update, delete, staff, tags, tasks, ...
Time Event client.time_event list, create, update, delete
Daily Case client.daily_case list, create, update, delete
Request client.request list, approved
Request Limit client.request_limit CRUD + staff_quotas, task_shifts
Daily Ops client.daily configurations, rooms, patient_encounters, capacity
Credentialing client.credentialing contacts, locations, providers, privileges, records, workflows, ...
Notification client.notification CRUD + contacts
User client.user list, get, non_scheduled
+ 11 more pay, tags, profiles, company, organization, ...

Acknowledgments

Inspired by python-qgenda by JP Jorissen.

License

MIT

Project details


Download files

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

Source Distribution

qgendapy-0.3.0.tar.gz (81.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qgendapy-0.3.0-py3-none-any.whl (42.2 kB view details)

Uploaded Python 3

File details

Details for the file qgendapy-0.3.0.tar.gz.

File metadata

  • Download URL: qgendapy-0.3.0.tar.gz
  • Upload date:
  • Size: 81.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qgendapy-0.3.0.tar.gz
Algorithm Hash digest
SHA256 75c70284a0159af1be76059a273621dd671d56205dd9e53efb7656c772ba68ce
MD5 5111711222a113d0cbc47a5744db8364
BLAKE2b-256 a3d38d11d6b5ba4d0fe5407712040ec2ca929e5a01ad5afef587b5547b6e12dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for qgendapy-0.3.0.tar.gz:

Publisher: publish.yml on lancereinsmith/qgendapy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qgendapy-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: qgendapy-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 42.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qgendapy-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d13c7f8e1b053781a7099fd45dffd3e51a057d0cc1051abd0c736b7c0486e6d9
MD5 e541b70826380bf839de857b8f17d3e2
BLAKE2b-256 4f2e4265fab043b316dfd9af376e3aaf08294e9c7d5a659967fb0d39fce6c637

See more details on using hashes here.

Provenance

The following attestation bundles were made for qgendapy-0.3.0-py3-none-any.whl:

Publisher: publish.yml on lancereinsmith/qgendapy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page