Skip to main content

OOTS_lib

Python-бібліотека для обміну доказами (evidences) у межах OOTS (Once-Only Technical System) через українську платформу взаємодії Трембіта (X-Road).

Бібліотека покриває три задачі:

  1. Моделі даних — EDMRequest, Person, Evidences та RegRep4-обгортки (RegistryPackageType, ExtrinsicObjectType) із серіалізацією у XML/JSON/PDF.
  2. Транспорт — SOAPTransport для викликів сервісів даних через Трембіту.
  3. Оркестрація стану — читання запиту та даних особи з Redis, формування набору доказів (MakeEvidence) і публікація результату до черги обробки.

Встановлення

pip install oots-lib            # рантайм
pip install "oots-lib[pdf]"     # + генерація PDF (WeasyPrint)
pip install "oots-lib[dev]"     # + ruff, mypy, pytest

Потрібен Python 3.12+ та доступний Redis.

Змінні оточення

Усі змінні читаються під час імпорту модулів через import_env(): якщо обов'язкової змінної немає, імпорт падає з ValueError. Задавайте їх до старту застосунку.

Змінна Обов'язкова Опис
TREMBITA_URL так URL сервера безпеки Трембіти
TREMBITA_CLIENT_ID так Ідентифікатор клієнта X-Road
TREMBITA_CACHE так TTL кешу WSDL, секунди
REDIS_URL так DSN Redis, напр. redis://localhost:6379/0
REDIS_TTL так TTL значень, які пише бібліотека, секунди
REDIS_PREFIX ні ("") Префікс ключів і черг
REDIS_TIMEOUT ні (6) Таймаут BRPOP, секунди
QUEUE_OUTCOMING так Черга, до якої публікуються готові повідомлення та помилки
IF_PREVIEW так true — примусово вимагати preview перед відправкою
COUNTRY так Код країни для ідентифікаторів особи
EXCHANGE_LOGGER_URI так Базовий URL сервісу журналювання транзакцій
EXCHANGE_LOGGER_API_KEY так API-ключ сервісу журналювання

EXCHANGE_LOGGER_URI без https:// призводить до попередження у журналі: API-ключ передавався б у відкритому вигляді.

Швидкий старт

Redis

from oots_lib import initialize_redis, close_redis, get_redis_client

await initialize_redis()          # створює та перевіряє глобальне з'єднання
redis = get_redis_client()        # singleton, той самий екземпляр усюди
...
await close_redis()

Формування доказів

MakeEvidence — базовий клас для успадкування: задайте реквізити органу, що видає доказ, і джерело даних (self.data — модель, похідна від MainBase).

from oots_lib import MakeEvidence, get_redis_client

class MarriageEvidence(MakeEvidence):
    ISSUING_AUTHORITY_ID = "UA:MIN:JUSTICE"
    ISSUING_AUTHORITY_SCHEME = "UA"
    ISSUING_AUTHORITY_NAME = "Міністерство юстиції України"
    CONFORMANT_TO_URL = "https://sr.oots.tech.ec.europa.eu/..."

evidence = MarriageEvidence(message_id, get_redis_client())
await evidence.read_data()        # запит EDM + дані особи з Redis
evidence.data = MarriageRecord()  # джерело документів (MainBase)
await evidence.transform_data()   # PDF / XML / JSON згідно sdg:Format запиту
await evidence.load_data_to_redis()

load_data_to_redis() зберігає Evidences за ключем oots:message:response:evidence:{message_id} і, якщо preview не потрібен, кладе message_id до QUEUE_OUTCOMING.

Виклик сервісу даних

from oots_lib import SOAPTransport

class DocumentsService(SOAPTransport):
    def parsing_response(self, responce: dict) -> list[dict]:
        return responce["GetDocumentsByPersonResult"]["documents"]

service = DocumentsService("GetDocumentsByPerson", conversation_id)
documents = service.response({"person": {"rnokpp": "1234567890"}})

Кожна помилка транспорту завершується виключенням (див. обробку помилок); успішний виклик додатково журналюється до сервісу обміну через ToLogger.

Схема ключів Redis

Ключі формує oots_lib.redis_keys.Keys, щоб схема не дублювалась у застосунках:

Метод Шаблон ключа
get_request_edm oots:message:request:edm:{conversation_id}
get_request_person oots:message:request:person:{conversation_id}
get_request_as4 oots:message:request:as4:{conversation_id}
get_request_preview oots:message:request:preview:{conversation_id}
get_response_evidence oots:message:response:evidence:{conversation_id}
get_response_edm oots:message:response:edm:{conversation_id}
get_response_exp oots:message:response:exp:{conversation_id}
get_evidence_type oots:evidencetype:{evidence_type_id}

REDIS_PREFIX додається до ключа автоматично на рівні UseRedisAsync.

Структура проєкту

oots_lib/
├── Transport.py        SOAPTransport — виклики сервісів даних через Трембіту
├── import_env.py       читання обов'язкових змінних оточення
├── redis_keys.py       централізована схема ключів Redis
├── libs/
│   ├── MakeEvidence.py     формування набору доказів з даних у Redis
│   ├── UseRedis.py         асинхронний клієнт Redis, черги, прапори
│   ├── exception.py        EDMException + публікація помилки до Redis/черги
│   ├── exceptions.py       SOAP-помилки OOTS у вигляді XML
│   ├── EvidanceMetadata.py метадані доказу (isAbout, distribution, ...)
│   ├── CreatePDF.py        XSLT → HTML → PDF (WeasyPrint)
│   ├── xml_safety.py       безпечний парсинг XML (без DTD/entities)
│   └── NS.py               XML-простори імен
└── models/
    ├── Base.py             Base/MainBase: XML, JSON, dict, PDF
    ├── Person.py           Person, Identifier + збереження у Redis
    ├── RequestEDM.py       EDMRequest + збереження у Redis
    └── ResponseEvidences.py Evidences та RegRep4-структури

Публічні імена експортуються з oots_lib через ліниві імпорти, тому from oots_lib import Person не тягне за собою weasyprint чи клієнт X-Road.

Розробка

pip install -e ".[dev]"
ruff check .
mypy . --ignore-missing-imports
pytest

CI (.github/workflows/ci-security-quality.yml) додатково виконує Gitleaks (пошук секретів) і Trivy (сканування файлової системи). Публікація до PyPI — .github/workflows/python-publish.yml через Trusted Publishing (OIDC).

Metadata

Release files for oots-lib 0.1.6

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

Source distribution (sdist)

Source distribution for oots-lib 0.1.6
File Size Uploaded
oots_lib-0.1.6.tar.gz 55.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oots-lib 0.1.6
File Interpreter ABI Platform
oots_lib-0.1.6-py3-none-any.whl Python 3 none any Details

Total release size: 98.9 kB

Release files / oots_lib-0.1.6.tar.gz

Download URL oots_lib-0.1.6.tar.gz
Size 55.3 kB
Tags Source
SHA-256 checksum
How to use checksums
c64c0aa0b4d92c6f8c1bb50bb8a937487e0d5ef7da922ab99f7441e5ea0fceb7
BLAKE2b-256 checksum
How to use checksums
8666c2642f136d46f195c25aeb8a9fe0ed624cc2639e627069b87927fc032975
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / oots_lib-0.1.6-py3-none-any.whl

Download URL oots_lib-0.1.6-py3-none-any.whl
Size 43.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
39eeaaa6d8f3ecb5949bb72532eb737ebe4a1d238f52c25459f22043318484b2
BLAKE2b-256 checksum
How to use checksums
0d93f0e9389e69db5f454163146c0c09bd76d03d9d6d17ebe0455620b78aae65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.12

2 release files

0.1.11

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

This release

0.1.6 This release

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release 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