Skip to main content

3s-rnds-client

3s-rnds-client e uma biblioteca Python assincrona para integracao com a RNDS em aplicacoes Django.

Instalacao

pip install 3s-rnds-client

Visao geral

O cliente concentra a infraestrutura comum de:

  • autenticacao CERT e API
  • cache de token RNDS usando o cache configurado do Django
  • transporte HTTP assincrono com httpx
  • retry automatico em falhas transientes
  • organizacao por capacidades de dominio
  • envio e consulta de documentos RIRA (Registro de Informacoes da Regulacao Assistencial)

Uso rapido

from rnds_client import RndsClient


async def buscar_paciente(identificador: str):
    async with await RndsClient.create() as client:
        return await client.pacientes.buscar_pessoa(identificador)

Verificacao

Com as variaveis de ambiente configuradas, RndsClient.create() sem erro ja indica que autenticacao e configuracao estao ok. Para um teste ponta a ponta, chame buscar_pessoa com um CPF (11 digitos) ou CNS conhecido: o retorno e um dict normalizado (nome, cns, cpf, data_nascimento, sexo, ...), ou None se a RNDS nao encontrar a pessoa.

Modo debug

Para diagnosticar problemas de autenticacao e de consumo da API da RNDS, use buscar_pessoa_debug. O metodo imprime no terminal do servidor o passo a passo do processo, incluindo:

  • variaveis e configuracoes relevantes do fluxo
  • identificador normalizado e URL final da busca
  • leitura do cache de token
  • autenticacao API ou CERT
  • headers enviados
  • status e corpo das respostas HTTP
  • retries e payload final formatado

Exemplo de uso:

from rnds_client import RndsClient


async def buscar_paciente_debug(identificador: str):
    async with await RndsClient.create() as client:
        return await client.pacientes.buscar_pessoa_debug(identificador)

Por padrao, buscar_pessoa_debug usa force_refresh_token=True para forcar a autenticacao e exibir o fluxo completo. Se quiser reproduzir o comportamento padrao da biblioteca tentando reutilizar o token em cache, passe force_refresh_token=False.

from rnds_client import RndsClient


async def buscar_paciente_debug_com_cache(identificador: str):
    async with await RndsClient.create() as client:
        return await client.pacientes.buscar_pessoa_debug(
            identificador,
            force_refresh_token=False,
        )

Os logs do modo debug mascaram parcialmente tokens e senha antes de exibi-los.

Alem disso, RndsBaseClient emite logs de nivel DEBUG (logger rnds_client.base_client) com o request e o response de toda chamada a RNDS. Os headers Authorization e X-Authorization-Server sao mascarados como ***.

import logging

logging.getLogger("rnds_client.base_client").setLevel(logging.DEBUG)

Configuracao no Django

O pacote usa o cache padrao do Django para armazenar o token RNDS. Antes de usar o client, garanta que o projeto tenha CACHES configurado.

A biblioteca le estas variaveis do ambiente do processo — defina-as como preferir (.env do seu projeto, secrets de CI, export...):

# RNDS base
RNDS_API_URL=
RNDS_AUTH_TOKEN_URL=
RNDS_CNS_GESTOR=

# Auth CERT
RNDS_CERT=
RNDS_KEY=

# Auth API
RNDS_AUTH_LOGIN_URL=
RNDS_USER=
RNDS_PASSWORD=

# RIRA (so com rnds_client.rira)
RIRA_NAMING_SYSTEM_ID=
RIRA_COMP_PROFILE=
RIRA_SR_PROFILE=
RIRA_APP_PROFILE=
RIRA_COND_PROFILE=
  • RNDS_API_URL e RNDS_AUTH_TOKEN_URL sao sempre obrigatorias. RNDS_CNS_GESTOR e opcional (aceita tambem CNS_SEC_SAUDE, por compatibilidade).
  • Autenticacao: use o bloco CERT (RNDS_CERT, RNDS_KEY) ou o bloco API (RNDS_AUTH_LOGIN_URL, RNDS_USER, RNDS_PASSWORD).
  • Sem RNDS_AUTH_METHOD, o pacote escolhe API quando houver RNDS_USER ou RNDS_PASSWORD; caso contrario, CERT.
  • As RIRA_* so sao lidas se voce usar rnds_client.rira; o que cada uma faz esta em src/rnds_client/rira/README.md.

RIRA (Registro de Informacoes da Regulacao Assistencial)

O modulo rnds_client.rira envia a RNDS o andamento de uma solicitacao regulada: a cada mudanca de status (pending -> booked -> attended, ou returned-to-requester), monta um documento FHIR a partir de um RiraDocumentData e faz um POST.

Configuracao: so as variaveis de ambiente RIRA_* (bloco RIRA da secao Configuracao no Django).

O estado fica com quem chama. Como o modulo nao persiste nada, o consumidor guarda o identificador local da solicitacao e os ids que a RNDS devolve; em cada atualizacao de status, informa qual documento esta sendo substituido (predecessor_composition_id).

Setup, uso, campos e regras: src/rnds_client/rira/README.md.

API publica

O ponto de entrada principal continua sendo RndsClient, com capacidades expostas por dominio:

  • client.pacientes
  • client.estabelecimentos
  • client.rira

Metodos de pacientes:

  • client.pacientes.buscar_pessoa(identificador)
  • client.pacientes.buscar_pessoa_debug(identificador, force_refresh_token=True)

Metodos de RIRA: enviar_rira / consultar_rira, get_documento, deletar_documento, dump_bundle_json — ver src/rnds_client/rira/README.md.

Uso explicito da infraestrutura base:

from httpx import AsyncClient

from rnds_client.base_client import RndsBaseClient
from rnds_client.client import RndsClient
from rnds_client.settings import RndsSettings


async def criar_client_manual():
    settings = RndsSettings.from_environment()
    http_client = AsyncClient(timeout=120.0)
    base_client = RndsBaseClient(settings=settings, http_client=http_client)
    return RndsClient(base_client=base_client)

Clientes HTTP injetados manualmente mantem a configuracao definida pelo consumidor. O cliente criado por RndsClient.create() usa 120 segundos para conexao, leitura, escrita e espera por conexao disponivel.

Tratamento de erros

As excecoes proprias do pacote sao:

  • RndsConfigurationError

  • RndsAuthenticationError

  • Do modulo RIRA, enviar_rira converte qualquer falha em um destes tres erros:

    • ErroRiraTransitorio — timeout, erro de conexao ou HTTP 408/429/5xx; vale re-tentar (traz retry_after quando a RNDS informa).
    • ErroRiraRejeitado — HTTP 4xx funcional ou invariante local violada; re-tentar igual nao resolve.
    • ResultadoRiraIncerto — o POST foi feito mas a resposta se perdeu; concilie por identifier antes de reenviar.

    RndsSubmissionError e RiraValidationError continuam exportadas, mas so aparecem fora do fluxo de enviar_rira (ex.: RiraValidationError sobe como pydantic.ValidationError ao usar dump_bundle_json). Detalhes em Tratamento de erros.

Chamadas HTTP tambem podem propagar erros do httpx.

Versao

Versao atual: 0.3.1 (contrato RIRA stateless — ver docs/rira-evolucao-0.3.0.md).

0.3.1 — correcoes sobre 0.3.0:

  • returned-to-requester: Appointment.status passa a waitlist e ServiceRequest.status a on-hold (regra mira-14 da RNDS).
  • classificar_erro_http: WriteTimeout apos o POST vira ResultadoRiraIncerto; falha de autenticacao nao-HTTP no refresh pos-401 vira ErroRiraRejeitado.
  • extrair_id_rnds: header Location versionado (.../_history/<v>) preserva o id do Bundle.
  • RiraFhirSettings.from_environment: RIRA_NAMING_SYSTEM_ID deixa de ser obrigatorio quando o identifier_system e passado por chamada.

0.3.0:

  • Novo modulo/app rnds_client.rira para envio e consulta de documentos RIRA.
  • Nova dependencia: pydantic>=2.0 (schemas FHIR).
  • RndsBaseClient passa a logar request/response em nivel DEBUG (com headers sensiveis mascarados).
  • Novos simbolos em rnds_client: RiraDocumentData, RiraFhirSettings, RiraValidationError, RndsSubmissionError.
  • rnds_client.__version__ realinhado para 0.2.0.

Ao atualizar de 0.1.x: rode pip install -U 3s-rnds-client (o pydantic vem junto). Quem usa apenas client.pacientes / client.estabelecimentos nao precisa de mais nada; para habilitar o RIRA, siga a secao RIRA.

Desenvolvimento

Ambiente e testes

python -m venv .venv && source .venv/bin/activate
pip install -e .          # instala o pacote + django, httpx, pydantic
python -m unittest discover -s tests -v

A suite usa unittest (nao ha pytest nas dependencias) e nao precisa de DJANGO_SETTINGS_MODULE — nenhum modulo do pacote depende do ORM.

Estrutura do pacote

  • src/rnds_client/ — cliente base: base_client, auth, tokens, settings, parsers, client.
  • src/rnds_client/capabilities/ — uma capability por arquivo (patients.py, establishments.py, rira.py), exposta em RndsClient como client.pacientes / client.estabelecimentos / client.rira.
  • src/rnds_client/<nome>/ — quando a capability tem lógica própria além da chamada HTTP, vira um subpacote com schemas/, services/ e README.md (ver rnds_client.rira). O pacote é stateless — sem models//migrations/.

Versao e publicacao

  • SemVer. version em pyproject.toml e rnds_client.__version__ devem casar.
  • A publicacao no PyPI e automatica no merge do PR em main (.github/workflows/publish.yml).

Download files

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

Source Distribution

3s_rnds_client-0.3.1.tar.gz (30.5 kB view details)

Uploaded Source

Built Distribution

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

3s_rnds_client-0.3.1-py3-none-any.whl (32.3 kB view details)

Uploaded Python 3

File details

Details for the file 3s_rnds_client-0.3.1.tar.gz.

File metadata

  • Download URL: 3s_rnds_client-0.3.1.tar.gz
  • Upload date:
  • Size: 30.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for 3s_rnds_client-0.3.1.tar.gz
Algorithm Hash digest
SHA256 8a5ae58f683633f6e1140d0a3af0ca2f76370045148b96d936e45fd91f5c4736
MD5 589f120bde59cb044b98cf2f83d9d3d0
BLAKE2b-256 ac10b21afc4a43385d788ea3cde5c3abcaa5908ef655c26f52aa1a1be8f3c0b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for 3s_rnds_client-0.3.1.tar.gz:

Publisher: publish.yml on 3S-Saude/3s-rnds-client

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

File details

Details for the file 3s_rnds_client-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: 3s_rnds_client-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 32.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for 3s_rnds_client-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d15ed3c96cd474b85f00efd68458c460c920f9dbf96b095825a29d481cf03180
MD5 4760ea0cf2bdd3a2d7cd792d61319078
BLAKE2b-256 8ddb8dca9185aaa1cb298fd7d360a86977ca4e539bb3c36155d980127e5c35c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for 3s_rnds_client-0.3.1-py3-none-any.whl:

Publisher: publish.yml on 3S-Saude/3s-rnds-client

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

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 files

0.3.0

2 files

0.2.0

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

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