From d48161a5690e76a44ba0f0898de7682722d91238 Mon Sep 17 00:00:00 2001
From: "postman[bot]" <211381805+postman[bot]@users.noreply.github.com>
Date: Tue, 14 Jul 2026 05:00:11 +0000
Subject: [PATCH] SDK Updates: v1.0.0
---
.github/workflows/release.yml | 75 +
.manifest.json | 678 +++++---
LICENSE | 2 +-
PyPI_README.md | 20 +-
README.md | 20 +-
documentation/models/AddAnnotationRequest.md | 32 +-
.../models/AddEnvelopeSigningStepsRequest.md | 6 +-
.../models/AddTemplateSigningStepsRequest.md | 6 +-
documentation/models/Annotation.md | 34 +-
documentation/models/AnnotationCheckbox.md | 8 +-
documentation/models/AnnotationDateTime.md | 18 +-
documentation/models/AnnotationFont.md | 10 +-
documentation/models/AnnotationText.md | 16 +-
documentation/models/AttachmentPlaceholder.md | 18 +-
.../AttachmentPlaceholdersPerRecipient.md | 10 +-
documentation/models/CreateEnvelopeRequest.md | 14 +-
documentation/models/CreateWebhookRequest.md | 8 +-
documentation/models/Document.md | 14 +-
documentation/models/Envelope.md | 36 +-
documentation/models/EnvelopeAttachments.md | 8 +-
...ListEnvelopeDocumentAnnotationsResponse.md | 6 +-
.../models/ListEnvelopeDocumentsResponse.md | 6 +-
documentation/models/ListEnvelopesRequest.md | 38 +-
documentation/models/ListEnvelopesResponse.md | 10 +-
.../models/ListTemplateAnnotationsResponse.md | 6 +-
...ListTemplateDocumentAnnotationsResponse.md | 6 +-
.../models/ListTemplateDocumentsResponse.md | 6 +-
documentation/models/ListTemplatesRequest.md | 22 +-
documentation/models/ListTemplatesResponse.md | 10 +-
documentation/models/ListWebhooksRequest.md | 8 +-
documentation/models/ListWebhooksResponse.md | 6 +-
documentation/models/Recipient.md | 16 +-
documentation/models/RecipientVerification.md | 8 +-
...tEnvelopeAttachmentsPlaceholdersRequest.md | 6 +-
.../SetEnvelopeAttachmentsSettingsRequest.md | 6 +-
.../models/SetEnvelopeDynamicFieldsRequest.md | 6 +-
.../models/SetEnvelopeLegalityLevelRequest.md | 6 +-
documentation/models/SigningStep.md | 6 +-
documentation/models/Template.md | 32 +-
documentation/models/TemplateRecipient.md | 14 +-
documentation/models/TemplateSigningStep.md | 6 +-
documentation/models/Webhook.md | 10 +-
documentation/services/SignplusService.md | 90 +-
documentation/snippets/snippets.json | 282 ++++
examples/install.cmd | 2 +-
examples/install.sh | 19 +-
install.cmd | 2 +-
install.sh | 17 +-
prettier.config.js | 41 +
pyproject.toml | 13 +-
src/signplus/models/__init__.py | 271 +++-
src/signplus/models/add_annotation_request.py | 117 +-
.../models/add_envelope_document_request.py | 19 +-
.../add_envelope_signing_steps_request.py | 18 +-
.../models/add_template_document_request.py | 15 +-
.../add_template_signing_steps_request.py | 16 +-
src/signplus/models/annotation.py | 146 +-
src/signplus/models/annotation_checkbox.py | 32 +-
.../models/annotation_checkbox_style.py | 9 +-
src/signplus/models/annotation_date_time.py | 69 +-
.../models/annotation_date_time_format.py | 9 +-
src/signplus/models/annotation_font.py | 38 +-
src/signplus/models/annotation_font_family.py | 9 +-
src/signplus/models/annotation_initials.py | 22 +-
src/signplus/models/annotation_signature.py | 22 +-
src/signplus/models/annotation_text.py | 60 +-
src/signplus/models/annotation_type.py | 9 +-
src/signplus/models/attachment_placeholder.py | 70 +-
.../models/attachment_placeholder_file.py | 41 +-
.../models/attachment_placeholder_request.py | 54 +-
.../attachment_placeholders_per_recipient.py | 34 +-
src/signplus/models/attachment_settings.py | 19 +-
.../create_envelope_from_template_request.py | 41 +-
.../models/create_envelope_request.py | 61 +-
.../models/create_template_request.py | 23 +-
src/signplus/models/create_webhook_request.py | 18 +-
src/signplus/models/document.py | 55 +-
src/signplus/models/dynamic_field.py | 22 +-
src/signplus/models/envelope.py | 139 +-
src/signplus/models/envelope_attachments.py | 28 +-
src/signplus/models/envelope_flow_type.py | 9 +-
.../models/envelope_legality_level.py | 9 +-
src/signplus/models/envelope_notification.py | 39 +-
src/signplus/models/envelope_order_field.py | 9 +-
src/signplus/models/envelope_status.py | 9 +-
..._envelope_document_annotations_response.py | 16 +-
.../list_envelope_documents_response.py | 16 +-
src/signplus/models/list_envelopes_request.py | 136 +-
.../models/list_envelopes_response.py | 36 +-
.../list_template_annotations_response.py | 16 +-
..._template_document_annotations_response.py | 16 +-
.../list_template_documents_response.py | 16 +-
src/signplus/models/list_templates_request.py | 74 +-
.../models/list_templates_response.py | 36 +-
src/signplus/models/list_webhooks_request.py | 25 +-
src/signplus/models/list_webhooks_response.py | 16 +-
src/signplus/models/page.py | 26 +-
src/signplus/models/recipient.py | 57 +-
src/signplus/models/recipient_role.py | 9 +-
src/signplus/models/recipient_verification.py | 38 +-
.../models/recipient_verification_type.py | 9 +-
.../models/rename_envelope_request.py | 17 +-
.../models/rename_template_request.py | 15 +-
...velope_attachments_placeholders_request.py | 16 +-
...t_envelope_attachments_settings_request.py | 14 +-
.../models/set_envelope_comment_request.py | 15 +-
.../set_envelope_dynamic_fields_request.py | 14 +-
.../models/set_envelope_expiration_request.py | 15 +-
.../set_envelope_legality_level_request.py | 21 +-
.../models/set_template_comment_request.py | 15 +-
src/signplus/models/signing_step.py | 18 +-
src/signplus/models/template.py | 121 +-
src/signplus/models/template_order_field.py | 9 +-
src/signplus/models/template_recipient.py | 55 +-
.../models/template_recipient_role.py | 9 +-
src/signplus/models/template_signing_step.py | 18 +-
src/signplus/models/utils/base_error.py | 116 ++
src/signplus/models/utils/base_model.py | 386 ++---
src/signplus/models/utils/cast_models.py | 44 +-
.../models/utils/one_of_base_model.py | 12 +
src/signplus/models/webhook.py | 39 +-
src/signplus/models/webhook_event.py | 9 +-
src/signplus/net/headers/base_header.py | 17 +
.../request_chain/handlers/http_handler.py | 64 +-
.../request_chain/handlers/retry_handler.py | 105 +-
src/signplus/net/sdk_config.py | 63 +
src/signplus/net/transport/api_error.py | 12 +-
src/signplus/net/transport/request.py | 18 +-
src/signplus/net/transport/response.py | 32 +-
src/signplus/net/transport/serializer.py | 25 +-
src/signplus/net/transport/utils.py | 15 +-
src/signplus/sdk.py | 12 +-
src/signplus/services/async_/signplus.py | 433 ++++--
src/signplus/services/signplus.py | 1377 ++++++++++++++---
src/signplus/services/utils/base_service.py | 91 +-
src/signplus/services/utils/validator.py | 41 +-
136 files changed, 4422 insertions(+), 2703 deletions(-)
create mode 100644 .github/workflows/release.yml
create mode 100644 documentation/snippets/snippets.json
create mode 100644 prettier.config.js
create mode 100644 src/signplus/models/utils/base_error.py
create mode 100644 src/signplus/net/sdk_config.py
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..cffc9b9
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,75 @@
+name: Release
+on:
+ push:
+ branches: ['main']
+ paths:
+ - '.github/workflows/release.yml'
+ - 'pyproject.toml'
+ workflow_dispatch:
+
+env:
+ # Package identity is baked in at generation time so the workflow never has to
+ # read package metadata at runtime.
+ SDK_VERSION: '1.0.0'
+ SDK_PACKAGE_NAME: 'signplus-python'
+ RELEASE_TAG: 'v1.0.0'
+
+jobs:
+ release:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - uses: actions/checkout@v4
+ - name: Create tag if it does not exist
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ if gh api "repos/${{ github.repository }}/git/refs/tags/$RELEASE_TAG" >/dev/null 2>&1; then
+ echo "::notice::Tag $RELEASE_TAG already exists, nothing to do"
+ exit 0
+ fi
+ gh api -X POST "repos/${{ github.repository }}/git/refs" \
+ -f ref="refs/tags/$RELEASE_TAG" \
+ -f sha="${{ github.sha }}"
+ echo "::notice::Created tag $RELEASE_TAG at ${{ github.sha }}"
+ - name: Check required publishing secrets
+ id: secrets
+ # Publishing is enabled by default. Secrets cannot be referenced in a
+ # step-level `if:`, so read them into env here and skip the publish steps
+ # (succeeding, not failing) when a required secret is unset or empty.
+ env:
+ PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
+ run: |
+ if [ -n "$PYPI_API_TOKEN" ]; then
+ echo "ok=true" >> "$GITHUB_OUTPUT"
+ else
+ echo "ok=false" >> "$GITHUB_OUTPUT"
+ echo "::notice::PYPI_API_TOKEN is not set; skipping PyPI publishing."
+ fi
+ - uses: actions/setup-python@v5
+ if: steps.secrets.outputs.ok == 'true'
+ with:
+ python-version: '3.x'
+ - name: Build distribution
+ if: steps.secrets.outputs.ok == 'true'
+ run: |
+ python -m pip install --upgrade build
+ python -m build
+ - name: Publish to PyPI
+ if: steps.secrets.outputs.ok == 'true'
+ uses: pypa/gh-action-pypi-publish@release/v1
+ with:
+ password: ${{ secrets.PYPI_API_TOKEN }}
+ # Re-running on an already-published version is a no-op instead of a failure.
+ skip-existing: true
+ - name: Create GitHub release
+ if: steps.secrets.outputs.ok == 'true'
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
+ echo "::notice::Release $RELEASE_TAG already exists"
+ else
+ gh release create "$RELEASE_TAG" --title "$RELEASE_TAG" --generate-notes
+ fi
diff --git a/.manifest.json b/.manifest.json
index 3eda50e..9e3a728 100644
--- a/.manifest.json
+++ b/.manifest.json
@@ -1,24 +1,27 @@
{
- "liblabVersion": "2.25.46",
- "date": "2025-09-17T12:01:31.599Z",
+ "sdkGenVersion": "1.6.0",
+ "date": "2026-07-14T05:00:03.267Z",
"config": {
- "apiId": 2744,
- "sdkName": "signplus",
- "sdkVersion": "1.4.0",
- "languages": ["python"],
- "auth": ["bearer"],
- "docs": [],
- "liblabVersion": "2",
- "deliveryMethods": ["zip"],
- "rawConfig": {
- "sdkName": "signplus",
- "apiVersion": "2.5.0",
- "apiName": "signplus-api",
- "specFilePath": "openapi.yaml",
- "languages": ["csharp", "go", "python", "typescript", "java", "php"],
- "auth": ["bearer"],
- "customizations": {
- "includeOptionalSnippetParameters": true,
+ "sdkVersion": "1.0.0",
+ "auth": [
+ "bearer"
+ ],
+ "apiVersion": "2.5.0",
+ "publishing": {
+ "githubOrg": "alohihq",
+ "releaseBranch": "main"
+ },
+ "languageOptions": {
+ "java": {
+ "githubRepoName": "signplus-java",
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
"authentication": {
"access": {
"prefix": "Bearer"
@@ -26,169 +29,256 @@
},
"devContainer": false,
"generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
"inferServiceNames": false,
+ "groupId": "com.alohi",
+ "artifactId": "signplus",
+ "developers": [
+ {
+ "name": "Alohi SA",
+ "email": "support@alohi.com",
+ "organization": "Alohi SA",
+ "organizationUrl": "https://www.alohi.com"
+ }
+ ]
+ },
+ "typescript": {
+ "githubRepoName": "signplus-typescript",
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
"injectedModels": [],
+ "inferServiceNames": false,
+ "npmOrg": "alohi",
+ "npmName": "signplus-typescript",
+ "httpClient": "axios",
+ "bundle": false,
+ "exportClassDefault": false
+ },
+ "python": {
+ "githubRepoName": "signplus-python",
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
"license": {
"type": "MIT"
},
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
"responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false,
+ "pypiPackageName": "signplus-python",
+ "classifiers": [
+ "Development Status :: 5 - Production/Stable",
+ "License :: OSI Approved :: MIT License",
+ "Topic :: Software Development"
+ ]
+ },
+ "kotlin": {
"retry": {
"enabled": true,
"maxAttempts": 3,
"retryDelay": 150
- }
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false
},
- "languageOptions": {
- "python": {
- "alwaysInitializeOptionals": false,
- "pypiPackageName": "signplus-python",
- "githubRepoName": "signplus-python",
- "ignoreFiles": [],
- "sdkVersion": "1.4.0",
- "liblabVersion": "2",
- "additionalConstructorParameters": []
+ "ruby": {
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
},
- "java": {
- "githubRepoName": "signplus-java",
- "groupId": "com.alohi",
- "artifactId": "signplus",
- "sdkVersion": "2.4.0",
- "liblabVersion": "2",
- "developers": [
- {
- "name": "Alohi SA",
- "email": "support@alohi.com",
- "organization": "Alohi SA",
- "organizationUrl": "https://www.alohi.com"
- }
- ],
- "additionalConstructorParameters": []
+ "license": {
+ "type": "MIT"
},
- "typescript": {
- "bundle": false,
- "exportClassDefault": false,
- "httpClient": "axios",
- "npmName": "signplus-typescript",
- "npmOrg": "alohi",
- "githubRepoName": "signplus-typescript",
- "ignoreFiles": [],
- "sdkVersion": "2.4.0",
- "liblabVersion": "2",
- "additionalConstructorParameters": []
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
},
- "go": {
- "goModuleName": "github.com/alohihq/signplus-go",
- "githubRepoName": "signplus-go",
- "ignoreFiles": [],
- "sdkVersion": "1.4.0",
- "liblabVersion": "2",
- "additionalConstructorParameters": []
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false
+ },
+ "go": {
+ "githubRepoName": "signplus-sharp",
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
},
- "php": {
- "packageName": "alohi/signplus",
- "githubRepoName": "signplus-php",
- "ignoreFiles": [],
- "sdkVersion": "2.4.0",
- "liblabVersion": "2",
- "additionalConstructorParameters": []
+ "license": {
+ "type": "MIT"
},
- "csharp": {
- "packageId": "Alohi.Signplus",
- "githubRepoName": "signplus-sharp",
- "ignoreFiles": [],
- "sdkVersion": "1.4.0",
- "liblabVersion": "2"
- }
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false,
+ "goModuleName": "github.com/alohihq/signplus-go"
},
- "publishing": {
- "githubOrg": "alohihq"
- }
- },
- "liblabConfigVersion": "1.0.0",
- "apiVersion": "2.5.0",
- "apiName": "signplus-api",
- "specFilePath": "openapi.yaml",
- "createDocs": false,
- "languageOptions": {
"csharp": {
"githubRepoName": "signplus-sharp",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "1.4.0",
- "packageId": "Alohi.Signplus"
- },
- "go": {
- "githubRepoName": "signplus-go",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "1.4.0",
- "goModuleName": "github.com/alohihq/signplus-go",
- "additionalConstructorParameters": []
- },
- "java": {
- "githubRepoName": "signplus-java",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "2.4.0",
- "groupId": "com.alohi",
- "artifactId": "signplus",
- "includeKotlinSnippets": false,
- "developers": [
- {
- "name": "Alohi SA",
- "email": "support@alohi.com",
- "organization": "Alohi SA",
- "organizationUrl": "https://www.alohi.com"
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
}
- ],
- "additionalConstructorParameters": []
- },
- "python": {
- "githubRepoName": "signplus-python",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "1.4.0",
- "alwaysInitializeOptionals": false,
- "additionalConstructorParameters": [],
- "pypiPackageName": "signplus-python"
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false,
+ "packageId": "Alohi.Signplus"
},
"php": {
"githubRepoName": "signplus-php",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "2.4.0",
- "additionalConstructorParameters": [],
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false,
"packageName": "alohi/signplus"
},
- "typescript": {
- "githubRepoName": "signplus-typescript",
- "ignoreFiles": [],
- "liblabVersion": "2",
- "renameIllegalModelProperties": true,
- "sdkVersion": "2.4.0",
- "additionalConstructorParameters": [],
- "bundle": false,
- "denoteCommon": false,
- "exportClassDefault": false,
- "generateEnumAs": "enum",
- "httpClient": "axios",
- "npmName": "signplus-typescript",
- "npmOrg": "alohi"
+ "cli": {
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false
+ },
+ "rust": {
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150
+ },
+ "license": {
+ "type": "MIT"
+ },
+ "authentication": {
+ "access": {
+ "prefix": "Bearer"
+ }
+ },
+ "devContainer": false,
+ "generateEnv": true,
+ "responseHeaders": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false
}
},
- "validationsToIgnore": [],
- "publishing": {
- "githubOrg": "alohihq",
- "platform": "github"
+ "customCode": {
+ "trackChanges": true,
+ "conflictStrategy": "mark"
+ },
+ "retry": {
+ "enabled": true,
+ "maxAttempts": 3,
+ "retryDelay": 150,
+ "maxDelay": 5000,
+ "retryDelayJitter": 50,
+ "backOffFactor": 2,
+ "httpMethodsToRetry": [
+ "GET",
+ "POST",
+ "PUT",
+ "DELETE",
+ "PATCH",
+ "HEAD",
+ "OPTIONS"
+ ]
},
- "analytics": {
- "streaming": false,
- "pagination": false
+ "license": {
+ "type": "MIT",
+ "name": "MIT",
+ "url": "https://opensource.org/licenses/MIT",
+ "path": "MIT.ejs"
},
"authentication": {
"access": {
@@ -197,33 +287,24 @@
},
"devContainer": false,
"generateEnv": true,
- "includeOptionalSnippetParameters": true,
- "license": {
- "type": "MIT",
- "name": "MIT",
- "url": "https://opensource.org/licenses/MIT",
- "path": "MIT.ejs"
- },
"responseHeaders": false,
- "buildAllModels": false,
- "retry": {
- "enabled": true,
- "maxAttempts": 3,
- "retryDelay": 150,
- "maxDelay": 5000,
- "retryDelayJitter": 50,
- "backOffFactor": 2,
- "httpCodesToRetry": [408, 429, 500, 502, 503, 504],
- "httpMethodsToRetry": ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]
- },
- "multiTenant": true,
- "includeWatermark": false,
+ "includeOptionalSnippetParameters": true,
+ "injectedModels": [],
+ "inferServiceNames": false,
+ "languages": [
+ "python"
+ ],
+ "deliveryMethods": [
+ "zip"
+ ],
+ "sdkName": "signplus",
"githubRepoName": "signplus-python",
- "ignoreFiles": [],
- "renameIllegalModelProperties": true,
- "alwaysInitializeOptionals": false,
- "additionalConstructorParameters": [],
"pypiPackageName": "signplus-python",
+ "classifiers": [
+ "Development Status :: 5 - Production/Stable",
+ "License :: OSI Approved :: MIT License",
+ "Topic :: Software Development"
+ ],
"language": "python",
"deliveryMethod": "zip",
"hooks": {
@@ -233,14 +314,14 @@
"usesFormData": false,
"environmentVariables": [],
"fileOutput": "/tmp",
- "inferServiceNames": false,
"httpLibrary": {
"name": "axios",
- "packages": {
- "axios": "^1.9.0"
- },
- "languages": ["typescript"]
+ "packages": {},
+ "languages": [
+ "typescript"
+ ]
},
+ "multiTenant": false,
"customQueries": {
"paths": [],
"rawQueries": [],
@@ -250,10 +331,14 @@
"specType": "openapi",
"deprecatedOperations": {
"include": true
+ },
+ "multipleResponses": {
+ "enabled": false
}
},
"files": [
"src/signplus/models/utils/base_model.py",
+ "src/signplus/models/utils/base_error.py",
"src/signplus/models/utils/json_map.py",
"src/signplus/models/__init__.py",
"src/signplus/services/__init__.py",
@@ -262,7 +347,6 @@
"src/signplus/net/__init__.py",
"src/signplus/net/headers/__init__.py",
"src/signplus/net/transport/__init__.py",
- "src/signplus/hooks/__init__.py",
"src/signplus/net/environment/__init__.py",
"src/signplus/net/request_chain/__init__.py",
"src/signplus/net/request_chain/handlers/__init__.py",
@@ -281,7 +365,6 @@
".gitignore",
"src/signplus/models/utils/cast_models.py",
"src/signplus/net/transport/utils.py",
- "src/signplus/hooks/hook.py",
"install.sh",
"install.cmd",
"examples/install.sh",
@@ -292,11 +375,11 @@
"src/signplus/net/request_chain/request_chain.py",
"src/signplus/net/request_chain/handlers/base_handler.py",
"src/signplus/net/request_chain/handlers/http_handler.py",
- "src/signplus/net/request_chain/handlers/hook_handler.py",
"src/signplus/net/request_chain/handlers/retry_handler.py",
"examples/sample.py",
"src/signplus/services/utils/default_headers.py",
"LICENSE",
+ "documentation/snippets/snippets.json",
"documentation/models/CreateEnvelopeRequest.md",
"documentation/models/Envelope.md",
"documentation/models/CreateEnvelopeFromTemplateRequest.md",
@@ -371,19 +454,8 @@
"src/signplus/models/utils/sentinel.py",
".env.example",
"examples/.env.example",
- "src/signplus/models/envelope_legality_level.py",
- "src/signplus/models/envelope_flow_type.py",
- "src/signplus/models/envelope_status.py",
- "src/signplus/models/recipient_role.py",
- "src/signplus/models/recipient_verification_type.py",
- "src/signplus/models/envelope_order_field.py",
- "src/signplus/models/annotation_type.py",
- "src/signplus/models/annotation_font_family.py",
- "src/signplus/models/annotation_date_time_format.py",
- "src/signplus/models/annotation_checkbox_style.py",
- "src/signplus/models/template_recipient_role.py",
- "src/signplus/models/template_order_field.py",
- "src/signplus/models/webhook_event.py",
+ "src/signplus/net/sdk_config.py",
+ ".github/workflows/release.yml",
"src/signplus/models/create_envelope_request.py",
"src/signplus/models/envelope.py",
"src/signplus/models/create_envelope_from_template_request.py",
@@ -420,27 +492,233 @@
"src/signplus/models/webhook.py",
"src/signplus/models/list_webhooks_request.py",
"src/signplus/models/list_webhooks_response.py",
+ "src/signplus/models/envelope_legality_level.py",
+ "src/signplus/models/envelope_flow_type.py",
+ "src/signplus/models/envelope_status.py",
"src/signplus/models/signing_step.py",
"src/signplus/models/recipient.py",
+ "src/signplus/models/recipient_role.py",
"src/signplus/models/recipient_verification.py",
+ "src/signplus/models/recipient_verification_type.py",
"src/signplus/models/page.py",
"src/signplus/models/attachment_settings.py",
"src/signplus/models/attachment_placeholders_per_recipient.py",
"src/signplus/models/attachment_placeholder.py",
"src/signplus/models/attachment_placeholder_file.py",
+ "src/signplus/models/envelope_order_field.py",
"src/signplus/models/dynamic_field.py",
"src/signplus/models/attachment_placeholder_request.py",
+ "src/signplus/models/annotation_type.py",
"src/signplus/models/annotation_signature.py",
"src/signplus/models/annotation_initials.py",
"src/signplus/models/annotation_text.py",
"src/signplus/models/annotation_date_time.py",
"src/signplus/models/annotation_checkbox.py",
"src/signplus/models/annotation_font.py",
+ "src/signplus/models/annotation_font_family.py",
+ "src/signplus/models/annotation_date_time_format.py",
+ "src/signplus/models/annotation_checkbox_style.py",
"src/signplus/models/template_signing_step.py",
"src/signplus/models/template_recipient.py",
+ "src/signplus/models/template_recipient_role.py",
+ "src/signplus/models/template_order_field.py",
+ "src/signplus/models/webhook_event.py",
"README.md",
"PyPI_README.md",
"documentation/services/SignplusService.md",
"src/signplus/services/signplus.py"
- ]
+ ],
+ "fileHashes": {
+ ".env.example": "4fb1ccb01931cc8124c1fd6d88721547b83f2d48bd0ddf29b4827a31983ad12c",
+ ".github/workflows/release.yml": "0abccf6c05ff4b3a47450ce1e134ca56574df8dad6b2563a6f99b1324476604d",
+ ".gitignore": "6bbf1931dedfa978c086f704675227391491eeb602840bea6d83e20394768b77",
+ "LICENSE": "3ec558dc6e9c9355ab4b28c942caa92bf90b0b82c12d7838d2ef92467ad135c1",
+ "PyPI_README.md": "2657a3b598950494ef92413cc1e958cceee997ecdc77f1a6cced0692ca47376b",
+ "README.md": "3968ffc406f0f95de67eefbec77448009d11d447fc1277389dcac760b7228375",
+ "documentation/models/AddAnnotationRequest.md": "2817c038118d15fab503e4e1467c9c6ed18026d3fd5afe391a627c6fa84652d0",
+ "documentation/models/AddEnvelopeDocumentRequest.md": "f893dc1b08ad39935a449443485043d1f1eaa8536353b1b0e5facd2ace71dc1f",
+ "documentation/models/AddEnvelopeSigningStepsRequest.md": "3a1b9130ef80b069204aa1e053dc3383754944ba6b9ee8dadd4774aa9bf71f88",
+ "documentation/models/AddTemplateDocumentRequest.md": "522f4c3cc215071b13ed4974a203ff6cf347ae3e0eb6b489c6d6dc79be3c5455",
+ "documentation/models/AddTemplateSigningStepsRequest.md": "3e72530ab4ce4cebd69bc63bb3d8de71dcffddcfb5c7362e29c9c4b43db9b72d",
+ "documentation/models/Annotation.md": "5198c2349fbb05ed6634bdb0a9ad4595869220311d807faf753f840dcd9d444d",
+ "documentation/models/AnnotationCheckbox.md": "1523e92ac89d43dbb71937a42353c45d06c8ff3f69e246b42aaa3e367bab8698",
+ "documentation/models/AnnotationCheckboxStyle.md": "d76b76c887822c0e0b5fcb1e3637e0240400e0050bb5003eb650163d38b095dd",
+ "documentation/models/AnnotationDateTime.md": "961c811556f138a7243616b2769a040def5fb367e6a92b21131d1f4e4572e2bc",
+ "documentation/models/AnnotationDateTimeFormat.md": "65d59d71b155a3fdf813e714d19f0c1c5ada4575baad57b6b6fc422f9e99e967",
+ "documentation/models/AnnotationFont.md": "d5f44b084293db11f731089d269e4ba36c128df71e1111d25ee12f430f61a974",
+ "documentation/models/AnnotationFontFamily.md": "e0ef7319e76b42e0820214dbebd1f57d7836e7f3870b891f4ecb92c91be29e0e",
+ "documentation/models/AnnotationInitials.md": "e52c1b7b1306a3d436c5d0f0936eea74aed703058719962e95e6b3469b1d37fc",
+ "documentation/models/AnnotationSignature.md": "ef57a0fa403de8a016aa5c7b33c5e638023875c1371f89b554142c985f727a95",
+ "documentation/models/AnnotationText.md": "6ac9fe2c77744510cb9da323dbb6bdb9465e78260a7b757605c3840e7d38fdb8",
+ "documentation/models/AnnotationType.md": "3b566c30379ca0ba1914ebfe1a4621d91eddcdccd2ef78814610617089f4515f",
+ "documentation/models/AttachmentPlaceholder.md": "6658004593d57bc11a9723a0065eda2e5f0f69aa651ea131cf8d1924141ec58c",
+ "documentation/models/AttachmentPlaceholderFile.md": "f796f50d472f698a5b64563a75a64b1ab9b9b1263dfa9d701a93ad5f361b6b2b",
+ "documentation/models/AttachmentPlaceholderRequest.md": "1ce63da28c0fc4c4ce30f9001945525abc2d340622126ae8a6cbee7098cb66c4",
+ "documentation/models/AttachmentPlaceholdersPerRecipient.md": "edc00c19c0c36cb8a125eacd9848d127181dffa1e8bba2d70d8148d1f0988763",
+ "documentation/models/AttachmentSettings.md": "7619cbae5dd5a4edda120ffebbd139faf3ffef75aaa90f9b6ff5033dcc7bd6be",
+ "documentation/models/CreateEnvelopeFromTemplateRequest.md": "5ba6ee826e5195aba1b0f8ec21ca50387720179c26745600352c5ad0c6f6b220",
+ "documentation/models/CreateEnvelopeRequest.md": "757c6a80f16b227a9c0c2fa41f2bfcbd6f78f31d8b8312d4b43445e5ac791a92",
+ "documentation/models/CreateTemplateRequest.md": "8dbad09c6bab7b99d23070f96d2af22cfa1f773724ad199840e06c3d1f1121a4",
+ "documentation/models/CreateWebhookRequest.md": "115fa0ab6b20df29ed80c5396e3509c6a33780aadde1f9f332d0b30701283c5f",
+ "documentation/models/Document.md": "82d339856865d0d515ac7e725f49bcc2b532b65be73d76b9a2af335b7405e085",
+ "documentation/models/DynamicField.md": "5b8d673c9d99df1001abfdad4bc7730e6a9f23babacac42fff03bfe0fcc4584a",
+ "documentation/models/Envelope.md": "06c88dc2ddac54bf79b381b88f2bdef2dedc31466e5964755774b904afc2c563",
+ "documentation/models/EnvelopeAttachments.md": "c3ab34b21e33dfbe3100399e55b4c0eaaf381e4f3dad7f0631f6f4128112eea6",
+ "documentation/models/EnvelopeFlowType.md": "512665810bbd4ea6896b934f31baf0a481c105cde5d9a0f7bc132d7cdd4f1ee5",
+ "documentation/models/EnvelopeLegalityLevel.md": "1dc126869204f2a86312cddab1ccbd3ea991db220403405376da95c4f3a278b3",
+ "documentation/models/EnvelopeNotification.md": "cce533ec5fe62b3d257a7412f1feb2b2da0479805aef66b4329fbfe6cb069a6b",
+ "documentation/models/EnvelopeOrderField.md": "fd97db0c36720a083026d0ae558cc143161ea9dba64ffbbb4576ec1fd575ecac",
+ "documentation/models/EnvelopeStatus.md": "550ca1b1460a33714c23c2d39389fdb23b349ec417d333fba3040ac196d91153",
+ "documentation/models/ListEnvelopeDocumentAnnotationsResponse.md": "266273c9186a2d1011573f970248c4ae20c35f7318486db226a159b2d6df571c",
+ "documentation/models/ListEnvelopeDocumentsResponse.md": "72745eedda76bc2ad4ef9dbe218fa9d56aa5281513bcf26406a8b5eab13625c6",
+ "documentation/models/ListEnvelopesRequest.md": "e2ef9871188c746bca5c290c06da207815b6151617f454c89fb3d0275ebf2942",
+ "documentation/models/ListEnvelopesResponse.md": "453ce930763f6bcd0d62342aa452f2b04a2c2ba28335574bc4515a1867d70504",
+ "documentation/models/ListTemplateAnnotationsResponse.md": "fb0414e35c4326ca670ecef534a09a7ec0c62494cb4c7bda189a74ce97427dc5",
+ "documentation/models/ListTemplateDocumentAnnotationsResponse.md": "bbede728f1e7452b15d053bb2b211910e654a14f0a11dbd722f2959fd86187cc",
+ "documentation/models/ListTemplateDocumentsResponse.md": "074c87e4e04cdeade4636b4265da6857108b50b6241959a72ebd2b601959e9c0",
+ "documentation/models/ListTemplatesRequest.md": "51cb320d5078a0adec7ee66f0ab87e2b6c4eeb483a1807069b961a7491853dac",
+ "documentation/models/ListTemplatesResponse.md": "79aa06ef809a1769c6b534b31b6f426fe70602bdfdbe7c3c333607580ae3e251",
+ "documentation/models/ListWebhooksRequest.md": "8c858ef2c367885126c564c77e8f594bec396f0a5f90dc25e74407d9d41d6251",
+ "documentation/models/ListWebhooksResponse.md": "76d598d17fc111d8a42b18e091f2982700cada1625e805d7f32db5be38849801",
+ "documentation/models/Page.md": "e327eb887b99a62c897219e5f284b5298bbe0f92a90ee15ed11abb2a2196ae1b",
+ "documentation/models/Recipient.md": "c156bfe9ea98292a3000d10324d07c70cd06d785f42494434a68778e7e415801",
+ "documentation/models/RecipientRole.md": "c9c4972ab6577d63e4689b60811c0d33ccb75af83d05aab7d32e749e8e264b2e",
+ "documentation/models/RecipientVerification.md": "5f3f7557488f81361fd0eb2a80ab71f10c3daa6c2d066c07e6c3e43041f435ed",
+ "documentation/models/RecipientVerificationType.md": "b35280eb5c30498853086b40e02d2723c6b99871d502e371bf5f59e14e67b717",
+ "documentation/models/RenameEnvelopeRequest.md": "7f43aa2bac58e39f799b643b2685f15ec6506bb953e08df89e320e0d533771a7",
+ "documentation/models/RenameTemplateRequest.md": "f87a2fc4732b2340038ce8cc7e76a83cbf22b50d0f9991a5a618d3bd50748e9f",
+ "documentation/models/SetEnvelopeAttachmentsPlaceholdersRequest.md": "3b913fb62763e63fe6b008ba95d30e3240b96d1d985f5eae599313489c387206",
+ "documentation/models/SetEnvelopeAttachmentsSettingsRequest.md": "fd716156384b28055ce14bb303fc1b9e1811985d9ae13a8ddb0aec44059920e6",
+ "documentation/models/SetEnvelopeCommentRequest.md": "da9191cbd929c2b37f19d763f2953a73c3133c0d49459b34e50744a44b9f4c15",
+ "documentation/models/SetEnvelopeDynamicFieldsRequest.md": "885af2a3414460fc0fd67726fc695d1dfd1d41ea78341b23e8247e4bdf38b3ff",
+ "documentation/models/SetEnvelopeExpirationRequest.md": "5bc1e8b7a79166903ebd3288e45720d05449cf49c289c41f540ba6c811ede8e0",
+ "documentation/models/SetEnvelopeLegalityLevelRequest.md": "3ce3dcb32cbd60071d7c2c0152716abc19f3cccdd9ba8467e868b563072012bd",
+ "documentation/models/SetTemplateCommentRequest.md": "1e523e39f2ccbec69a10b0cc38f712a1ade69d271d2ac896e407fb8d20ba5d93",
+ "documentation/models/SigningStep.md": "0d9de3a9a283c06b0e25b54250c0f5fc199d5837c976b67daaed1e978b771ad2",
+ "documentation/models/Template.md": "5350593c7c64c71b0576148c6a60bf03989f61c64c19c5c5052e3a3207f59d93",
+ "documentation/models/TemplateOrderField.md": "3333426bae8b580f89e409b98ea64cfd128028de9d59b58c35286bb097f2be42",
+ "documentation/models/TemplateRecipient.md": "2c73908653aaabf7554a7a656496db8784d140c82e7839b8a049173c2a1a2c30",
+ "documentation/models/TemplateRecipientRole.md": "034fabed7d210836585561e8d49f135e4ddf82c60faf00a5066c6665f9ed9a62",
+ "documentation/models/TemplateSigningStep.md": "559c098fb21fbf58def6243315235fe0ea065833c918a80945cda6737319c365",
+ "documentation/models/Webhook.md": "4a5daa2901dc730c9fb949642f42a8e17f373a0d94cc54e9080fc23badda4d6b",
+ "documentation/models/WebhookEvent.md": "1806a70b3ac5c6725b4d8f98b6f0328007ef8769a829a16e2b8d4141c24e724b",
+ "documentation/services/SignplusService.md": "c5c1428d2b2db1d9d5a290917247d573ec6b6a65551b36c98cc868e889b3e16d",
+ "documentation/snippets/snippets.json": "813e31a6a38d7ba42dbd2f79c21a30b0f14fa048f54a18723bfe115a35a5c5a8",
+ "examples/.env.example": "4fb1ccb01931cc8124c1fd6d88721547b83f2d48bd0ddf29b4827a31983ad12c",
+ "examples/install.cmd": "860c94d3749b1220e58b09305c086f382d210fb28cf07d24259412036ede427a",
+ "examples/install.sh": "e8b851b0d25945e31e7b1ccb933a407eef992827b8bfbb7ce7db0f235fdb4685",
+ "examples/sample.py": "7d37e2bcf73987d25707b971cbdb352819f2fa1a9577de75e3f0a58c386a3cd0",
+ "install.cmd": "bfe5bd890c2c7d6910811fbe264e3fa9768e024a2d92a934db7dd1e5825075d5",
+ "install.sh": "c243b0d6a0b98152a15f1876d2bc78662081a7f327a779b9a3d5bfca00a2bff3",
+ "prettier.config.js": "2fe33fda52344779fcf235afa8152cfd356880dc3161da09403dc26231bc72d9",
+ "pyproject.toml": "ed3a39ece3a23ac97f414d756a92ac69e64e1ad4a4a1cc06d61d2fab4f80f42b",
+ "src/signplus/__init__.py": "15d8b55ff02454669db92ad0c5c938051a90adbb1bc18f6f8172cbc73ecd0895",
+ "src/signplus/models/__init__.py": "c325dcf74c19a599816e7c034850dc8d408f9414f94e3a3a5c422acc0cf5022e",
+ "src/signplus/models/add_annotation_request.py": "88ccb707e4504752e1f6ba4d7d1d6c61f2509c6e5b1b9aa44b523562487426ee",
+ "src/signplus/models/add_envelope_document_request.py": "46c7d11eae3c970b001ac5373afec15008a7f940f753f49f87fc1af7562328e7",
+ "src/signplus/models/add_envelope_signing_steps_request.py": "4518e160a1fa85c42f4d005e5e24e8d6c4a63acc2deb3f1f43842d00bd9f5d17",
+ "src/signplus/models/add_template_document_request.py": "f29aed8b455afb6803bb5476adeee3044bf3f8939237667e3e59c6c9044fcbf5",
+ "src/signplus/models/add_template_signing_steps_request.py": "1fe4c87a2bd47faf81f5612d14384213a22a2f5e3c87ddf0d7621db9aff4e78f",
+ "src/signplus/models/annotation.py": "1ff3ecb7bbebde32e4c17624873fdadc30207efbbdf88a483687fbd95c9ca1bf",
+ "src/signplus/models/annotation_checkbox.py": "c513c2fd1e52601c6360e71977e8e625a962f9067beb4cbfe7930bb0187b345c",
+ "src/signplus/models/annotation_checkbox_style.py": "cb70c77fa52a7d963924dcf24b776f7cbc0f2249ee7f52077d8925567e1906fb",
+ "src/signplus/models/annotation_date_time.py": "c4f147806a5a031458f0249c8fa07f67f4f99bedea760698758b21cd4120fd33",
+ "src/signplus/models/annotation_date_time_format.py": "f58158afd7585c4850d8f4a470cc1fa021dedb5a722fc8bc8365179d16c276a7",
+ "src/signplus/models/annotation_font.py": "fcd464a54c2a46d8706d535904a47ab729233199e15984d764e399b7d38aeb37",
+ "src/signplus/models/annotation_font_family.py": "96a11e541c652864d7a22dd1040101be79a97e4b7664ff6cf4d6e5f477f68303",
+ "src/signplus/models/annotation_initials.py": "9606c03125f89dec555600807c746487c577f2771ca343e706bb6ab2de27f4a3",
+ "src/signplus/models/annotation_signature.py": "af8394daed19d2c92e97d05f8193ae54c624e9437401ddd97ac2bc2e48c21cfa",
+ "src/signplus/models/annotation_text.py": "a07911f2c9c550ffd8efe248e87cea07fbda9fa5e683cfb5e5beb2f35bb41441",
+ "src/signplus/models/annotation_type.py": "44933719941c2db4f253faf3dbcca8273d893867e07b4f837ffa7a2a69304c9a",
+ "src/signplus/models/attachment_placeholder.py": "2327cd36080d5cf56d58de772e68a13e05ef672e84863e796fb8188f9b9345cd",
+ "src/signplus/models/attachment_placeholder_file.py": "291ed95c31e96d9a675ac42fc7cbc630e65679d48ffc27aadda595a113147404",
+ "src/signplus/models/attachment_placeholder_request.py": "fe80598b479ee12814d9a4e539676c8bdea818aa6076ad7fb224765dfa502418",
+ "src/signplus/models/attachment_placeholders_per_recipient.py": "fb50df560a07f797d72d64669b448cdfac5407382a80ef45cafc278a0697e2ae",
+ "src/signplus/models/attachment_settings.py": "815e4bd3606faeeb1294574c91c0457528b24f47324d3d6d44c1e81e4e1e5946",
+ "src/signplus/models/create_envelope_from_template_request.py": "7967ab0f033844a94b5538e6d383828093b4ad94e56797da59f308ea033c51f6",
+ "src/signplus/models/create_envelope_request.py": "d2c32d341145fa7111dd45377dd2bc45fb1896152b21a7a459c04c613fdb01fb",
+ "src/signplus/models/create_template_request.py": "8a73ca360b035536a1d951c26b30ef49341f6e8fd5e19b2b0744d8fb241317c9",
+ "src/signplus/models/create_webhook_request.py": "ffb38f6b9c9e53155a4843c6c5b4a40f53cd879262743333911e7464ac65adff",
+ "src/signplus/models/document.py": "cee48588e63f10e33aaa49856f1f4b51dfbbe717e6bd5322752242cbe9320d0d",
+ "src/signplus/models/dynamic_field.py": "5a6a6eabfc8804737be4d0ae4bd1793eea65e84add4ee15474858aa9726d7df1",
+ "src/signplus/models/envelope.py": "0605697b4e0d99c9ccb1715c3ca83e387268b0e7e80b4231f48e6f6cc6188b76",
+ "src/signplus/models/envelope_attachments.py": "25b4121b2df9a37881edd91f967796fbd21016d671af06f30514ae2b1628b6e0",
+ "src/signplus/models/envelope_flow_type.py": "08b58dc00ad3fef47a89e6520568d163c862e911d14335d2c3ed9e073ab31e84",
+ "src/signplus/models/envelope_legality_level.py": "8b1d0147d347ac689c7bb5520fdd2f37e78575acd6d16d30d076a0253c9191d4",
+ "src/signplus/models/envelope_notification.py": "bc4a9e07ed033e2561627c3d88d2e56f775afc3d66f428f2969b4ca8e34285ea",
+ "src/signplus/models/envelope_order_field.py": "e0bbfe7056f548c06638e18476eb343100d82a1b47e1ad7e8560a727831781fc",
+ "src/signplus/models/envelope_status.py": "2cb857746967c426813b4a6d92a47bc9f4517e42b9a61e1debefdd4fe94b1e01",
+ "src/signplus/models/list_envelope_document_annotations_response.py": "d90cd5873ca465adeae214914e4eac8e3f9629220395eb49bb7193c9152bbf3a",
+ "src/signplus/models/list_envelope_documents_response.py": "e41d27bf8bd5dfa01083ee81ab795c11fc1664b5a4884b544c7712c163e86b01",
+ "src/signplus/models/list_envelopes_request.py": "af769cb3e4ac479a45f0bb8530775838562cbd33ca37586277390c7c94030bb6",
+ "src/signplus/models/list_envelopes_response.py": "0fdda02c78f7e6b1df6645c9024e19ec8e1a31ecd8b841f49c503d8bc9a8a477",
+ "src/signplus/models/list_template_annotations_response.py": "df6d4ba439562d9043b4fcc1b043fb1f64ae1360493835d194c32bba5f5c9e71",
+ "src/signplus/models/list_template_document_annotations_response.py": "a41e642506e40d2e3b8986025597736157bec5d2973a42e16d3f6e5fe64db7ba",
+ "src/signplus/models/list_template_documents_response.py": "c341b88bfdadd93a6f84f48af6fdfea1e96d2aa3d538f89ef1f52b62f7769530",
+ "src/signplus/models/list_templates_request.py": "6c4e9488fbe610ddab5921d12d8b8ed643c105941c332bd68d33cfaf29dc809c",
+ "src/signplus/models/list_templates_response.py": "fb53fc3da9ad6613f7e37d7c2633874aee0f0b3e8dfb57aade522081c80e4164",
+ "src/signplus/models/list_webhooks_request.py": "ab3cad015dac30926881999e96fcb6f77860bef581f63d1e345fa99a435fa134",
+ "src/signplus/models/list_webhooks_response.py": "8aa01878dbf333d76d06bd31473e6ec1fcf9c206d2c7662c86301896c1a9cad2",
+ "src/signplus/models/page.py": "318dc6a3402ef709f8fecff4ad3837875622975725b115f09d80de9e9629e60b",
+ "src/signplus/models/recipient.py": "6ca872e7f4649e4a2f2ddbf84f2576fe70d0fefca47fbed70979be97be4f6e40",
+ "src/signplus/models/recipient_role.py": "4a6fe1212932209885ee50c52b776a8cefe9168e0dd98386ee33bd775ddef34c",
+ "src/signplus/models/recipient_verification.py": "16b8763ac8c142c4dfafd67618074f64cb81c09200ce4b53b1707105b6a17c0f",
+ "src/signplus/models/recipient_verification_type.py": "4edfa16b00830aeb5e62d239e905fce9fc0fa7315b65c50dc02a29ada9f06430",
+ "src/signplus/models/rename_envelope_request.py": "2f734bacd901f16a021cdf8acfb8a09d94ad81cc26ff1be9a1832cd0537aa2cd",
+ "src/signplus/models/rename_template_request.py": "37132335d840121da7594cd6d560b7a6f5f7bfbf8e1e0fd921bc8c0e04365021",
+ "src/signplus/models/set_envelope_attachments_placeholders_request.py": "ec479ec3c5a7c84fb32726e1411bf9c73b6abebff06c7fc25b0c04131755c91f",
+ "src/signplus/models/set_envelope_attachments_settings_request.py": "585d9bc066a40069af1a0dc8b51584bac31914d21bbf502d018c7b7836996918",
+ "src/signplus/models/set_envelope_comment_request.py": "5d480d9f33b0d3665bf7b9cb07f0480ab30145d80a707ad4e47c3681f3089e71",
+ "src/signplus/models/set_envelope_dynamic_fields_request.py": "6086a2fe2465e24ce7f2191281b6e295577142d41018528720be23fb42d96498",
+ "src/signplus/models/set_envelope_expiration_request.py": "e0552565a2950f32c0f1ac4350fcd4105d667611a9309e9ea09bfdd5174a4c04",
+ "src/signplus/models/set_envelope_legality_level_request.py": "2826e46a43c5d94a6ff74f5e6d7c1014f93aa73d5f76086026201c4df8b85b11",
+ "src/signplus/models/set_template_comment_request.py": "4fc815d809ac4b2209871d75456621da367f8bd403a56ad1ac5777aee37497ff",
+ "src/signplus/models/signing_step.py": "f16f53a41ab6a495066c579e4ad930237b71116bebbe235f9bab45b7f6b0bdd1",
+ "src/signplus/models/template.py": "a6b845bddad80793d698aa6246f7447cc11cb408ac93a060553f255a4eab0cb7",
+ "src/signplus/models/template_order_field.py": "127c6b0eaa5356e56445cd09442b504ebe2d32904a0f876da8b3b66787e263f5",
+ "src/signplus/models/template_recipient.py": "ab477d0dcb26da0eda7c55f0e3c3c447ad0b6674912941413b2dd67db6b136a2",
+ "src/signplus/models/template_recipient_role.py": "a8a7cd845a6564c6149f8ea1d297a3bcc270dafc493d5d1537722e6fd23f610d",
+ "src/signplus/models/template_signing_step.py": "646122f2ee4b98070e6aa34425914407626206ccfb42c2ab0c6358f2393b17ac",
+ "src/signplus/models/utils/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/models/utils/base_error.py": "dd6e081bb478edba5c93940540ff33ce9880b671b45b90f0f1fc2cc81cce1453",
+ "src/signplus/models/utils/base_model.py": "1cce0012c5389398941ae5549208c115520adbdf1f1e7b4c1f769e9b635c43dd",
+ "src/signplus/models/utils/cast_models.py": "65c2a5043fa0178bee0063c944b74d6e24bcbbc77f13716029d0318ab18a24e6",
+ "src/signplus/models/utils/json_map.py": "14f2b84ad1a0f95098cfc8cbd8dad350995eb4995547d67096fad10b6d08f8c7",
+ "src/signplus/models/utils/one_of_base_model.py": "5c9d51db7bf2671b50ba7281cd73fac0ae899718fec2511a997063e9932549e6",
+ "src/signplus/models/utils/sentinel.py": "e52b9ac51a9898f65230fb009b60a809e72f646c559ca78d615931b0c0dae466",
+ "src/signplus/models/webhook.py": "f0b06f1e2d74e4eedb810d91030e696ad382c6a114c9d4cf0a05db8a0bf43f99",
+ "src/signplus/models/webhook_event.py": "208939855b444e9fd7a8a81f229de7e8a8fe821cad2a65e0bebf2854a63c0aad",
+ "src/signplus/net/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/net/environment/__init__.py": "0c5ed4bcd5c7423b21f2029436abc728a0f5d223e7467344784bd47afd1cdec0",
+ "src/signplus/net/environment/environment.py": "e8085a0378f9b901031d477f4be014a0ebeb0a97820946829b4d73a6422be9bd",
+ "src/signplus/net/headers/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/net/headers/access_token_auth.py": "3eda4da03357b122848f8c3bf4786e21d406c0c67a71a1f208a4c28d0835893a",
+ "src/signplus/net/headers/base_header.py": "0c40412e64e8c34317a13663ddee36137d31b0dbbea38c5eb07ef146f70fe466",
+ "src/signplus/net/request_chain/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/net/request_chain/handlers/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/net/request_chain/handlers/base_handler.py": "5ff9cdc332de0131ce8e4b5052530b28c863eb9f381ece0f145da3b2cbf20fa5",
+ "src/signplus/net/request_chain/handlers/http_handler.py": "66af2b3e886fdc56e2681ddb77eab6c6c030ce87d7c6899ce1688c402125a252",
+ "src/signplus/net/request_chain/handlers/retry_handler.py": "ec6703c6299aaacca84e009a38aed8b8f498b004922154ca3c17fcdbd0208378",
+ "src/signplus/net/request_chain/request_chain.py": "b21ebb0d8f8018887332570ac4610f16e7268dca0b2e73408a724901165bace4",
+ "src/signplus/net/sdk_config.py": "4fde62488a5d16513783f735cd0cef2089edd04e831127c935a070ff17000e58",
+ "src/signplus/net/transport/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/net/transport/api_error.py": "6df36d8aa330fd3b8aca0b34cc525ad4f131e55fe9fffa14e6d690b168400d7b",
+ "src/signplus/net/transport/request.py": "d04b817c76eee3b345c2c97db44223c1475ad55599faaa3cebb2a8b39b026eba",
+ "src/signplus/net/transport/request_error.py": "962c1e627288694eb31644f85474f32a540367c382b34119e74adfc52d7fdf06",
+ "src/signplus/net/transport/response.py": "27b0834b80f907aab8a7d2c91e4e6c6646fdad69ce67eece63c8af8cc8bcc4a1",
+ "src/signplus/net/transport/serializer.py": "57a2a68d059df5a67b2d1f12764203fedf3bb9e9636c84bb0cb8b853659e3b5e",
+ "src/signplus/net/transport/utils.py": "6d6867626c22e1a23a8ca3bad021f66b9f16782409bccb063ac0ff6eb1db98f5",
+ "src/signplus/sdk.py": "d1a8f3d28ef1067b690fae5c9a70bf7868f24e0321049333cec66e86e3ad3394",
+ "src/signplus/sdk_async.py": "9222855f805cee42812148c4b3b1251a13661e64555eec2a89685fab5445750c",
+ "src/signplus/services/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/services/async_/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/services/async_/signplus.py": "f9103c59ba002c44e52c9ab00b1b1db6d37e2ba363caef95a41e41023de04b67",
+ "src/signplus/services/async_/utils/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/services/async_/utils/to_async.py": "2cb85fd85bcfa814b70ca92e47479d3e486e2e48ec266fc74694854f3965c582",
+ "src/signplus/services/signplus.py": "d15fd6380a35299a6676a25e808c76d01aadf3da1eda1b93c54fb3405fbb6375",
+ "src/signplus/services/utils/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "src/signplus/services/utils/base_service.py": "1ce712644adcb265a49ad738ee880366ac3dba37f7a10f78c57cb1191a2aacbd",
+ "src/signplus/services/utils/default_headers.py": "8b2763f889d8da9febef2c1f8d846177aff0faf03e8978e91c0b18d8811bdf6b",
+ "src/signplus/services/utils/validator.py": "dac5d883228f96d6e7ea2665597ad462b6c5d8f3d55aecaaf780f44f9ecd739a"
+ }
}
diff --git a/LICENSE b/LICENSE
index 2be0553..3cef8a0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2025
+Copyright (c) 2026
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/PyPI_README.md b/PyPI_README.md
index 83dd200..7a912a5 100644
--- a/PyPI_README.md
+++ b/PyPI_README.md
@@ -1,13 +1,11 @@
-# Signplus Python SDK 1.4.0
+# Signplus Python SDK 1.0.0
Welcome to the Signplus SDK documentation. This guide will help you get started with integrating and using the Signplus SDK in your project.
-[](https://liblab.com/?utm_source=readme)
-
## Versions
- API version: `2.5.0`
-- SDK version: `1.4.0`
+- SDK version: `1.0.0`
## About the API
@@ -26,13 +24,13 @@ Integrate legally-binding electronic signature to your workflow
- [Models](#models)
- [License](#license)
-## Setup & Configuration
+# Setup & Configuration
-### Supported Language Versions
+## Supported Language Versions
-This SDK is compatible with the following versions: `Python >= 3.7`
+This SDK is compatible with the following versions: `Python >= 3.9`
-### Installation
+## Installation
To get started with the SDK, we recommend installing using `pip`:
@@ -40,6 +38,12 @@ To get started with the SDK, we recommend installing using `pip`:
pip install signplus-python
```
+If you are using Python 3, you can use `pip3` instead:
+
+```bash
+pip3 install signplus-python
+```
+
## Authentication
### Access Token Authentication
diff --git a/README.md b/README.md
index 789fac7..f9c1249 100644
--- a/README.md
+++ b/README.md
@@ -1,13 +1,11 @@
-# Signplus Python SDK 1.4.0
+# Signplus Python SDK 1.0.0
Welcome to the Signplus SDK documentation. This guide will help you get started with integrating and using the Signplus SDK in your project.
-[](https://liblab.com/?utm_source=readme)
-
## Versions
- API version: `2.5.0`
-- SDK version: `1.4.0`
+- SDK version: `1.0.0`
## About the API
@@ -27,13 +25,13 @@ Integrate legally-binding electronic signature to your workflow
- [Models](#models)
- [License](#license)
-## Setup & Configuration
+# Setup & Configuration
-### Supported Language Versions
+## Supported Language Versions
-This SDK is compatible with the following versions: `Python >= 3.7`
+This SDK is compatible with the following versions: `Python >= 3.9`
-### Installation
+## Installation
To get started with the SDK, we recommend installing using `pip`:
@@ -41,6 +39,12 @@ To get started with the SDK, we recommend installing using `pip`:
pip install signplus-python
```
+If you are using Python 3, you can use `pip3` instead:
+
+```bash
+pip3 install signplus-python
+```
+
## Authentication
### Access Token Authentication
diff --git a/documentation/models/AddAnnotationRequest.md b/documentation/models/AddAnnotationRequest.md
index cf21929..56d67c4 100644
--- a/documentation/models/AddAnnotationRequest.md
+++ b/documentation/models/AddAnnotationRequest.md
@@ -2,19 +2,19 @@
**Properties**
-| Name | Type | Required | Description |
-| :----------- | :------------------ | :------- | :---------------------------------------------------------------------------------------------- |
-| document_id | str | ✅ | ID of the document |
-| page | int | ✅ | Page number where the annotation is placed |
-| x | float | ✅ | X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner |
-| y | float | ✅ | Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner |
-| width | float | ✅ | Width of the annotation (in % of the page width from 0 to 100) |
-| height | float | ✅ | Height of the annotation (in % of the page height from 0 to 100) |
-| type\_ | AnnotationType | ✅ | Type of the annotation |
-| recipient_id | str | ❌ | ID of the recipient |
-| required | bool | ❌ | |
-| signature | AnnotationSignature | ❌ | Signature annotation (null if annotation is not a signature) |
-| initials | AnnotationInitials | ❌ | Initials annotation (null if annotation is not initials) |
-| text | AnnotationText | ❌ | Text annotation (null if annotation is not a text) |
-| datetime\_ | AnnotationDateTime | ❌ | Date annotation (null if annotation is not a date) |
-| checkbox | AnnotationCheckbox | ❌ | Checkbox annotation (null if annotation is not a checkbox) |
+| Name | Type | Required | Description |
+| :----------- | :-------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------- |
+| document_id | str | ✅ | ID of the document |
+| page | int | ✅ | Page number where the annotation is placed |
+| x | float | ✅ | X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner |
+| y | float | ✅ | Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner |
+| width | float | ✅ | Width of the annotation (in % of the page width from 0 to 100) |
+| height | float | ✅ | Height of the annotation (in % of the page height from 0 to 100) |
+| type\_ | [AnnotationType](AnnotationType.md) | ✅ | Type of the annotation |
+| recipient_id | str | ❌ | ID of the recipient |
+| required | bool | ❌ | |
+| signature | [AnnotationSignature](AnnotationSignature.md) | ❌ | Signature annotation (null if annotation is not a signature) |
+| initials | [AnnotationInitials](AnnotationInitials.md) | ❌ | Initials annotation (null if annotation is not initials) |
+| text | [AnnotationText](AnnotationText.md) | ❌ | Text annotation (null if annotation is not a text) |
+| datetime\_ | [AnnotationDateTime](AnnotationDateTime.md) | ❌ | Date annotation (null if annotation is not a date) |
+| checkbox | [AnnotationCheckbox](AnnotationCheckbox.md) | ❌ | Checkbox annotation (null if annotation is not a checkbox) |
diff --git a/documentation/models/AddEnvelopeSigningStepsRequest.md b/documentation/models/AddEnvelopeSigningStepsRequest.md
index 5de9bec..0331d2f 100644
--- a/documentation/models/AddEnvelopeSigningStepsRequest.md
+++ b/documentation/models/AddEnvelopeSigningStepsRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------ | :---------------- | :------- | :-------------------- |
-| signing_steps | List[SigningStep] | ❌ | List of signing steps |
+| Name | Type | Required | Description |
+| :------------ | :---------------------------------- | :------- | :-------------------- |
+| signing_steps | List[[SigningStep](SigningStep.md)] | ❌ | List of signing steps |
diff --git a/documentation/models/AddTemplateSigningStepsRequest.md b/documentation/models/AddTemplateSigningStepsRequest.md
index a97f23e..3ba0dc1 100644
--- a/documentation/models/AddTemplateSigningStepsRequest.md
+++ b/documentation/models/AddTemplateSigningStepsRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------ | :------------------------ | :------- | :-------------------- |
-| signing_steps | List[TemplateSigningStep] | ✅ | List of signing steps |
+| Name | Type | Required | Description |
+| :------------ | :-------------------------------------------------- | :------- | :-------------------- |
+| signing_steps | List[[TemplateSigningStep](TemplateSigningStep.md)] | ✅ | List of signing steps |
diff --git a/documentation/models/Annotation.md b/documentation/models/Annotation.md
index 0102e4a..e75e119 100644
--- a/documentation/models/Annotation.md
+++ b/documentation/models/Annotation.md
@@ -2,20 +2,20 @@
**Properties**
-| Name | Type | Required | Description |
-| :----------- | :------------------ | :------- | :---------------------------------------------------------------------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the annotation |
-| recipient_id | str | ❌ | ID of the recipient |
-| document_id | str | ❌ | ID of the document |
-| page | int | ❌ | Page number where the annotation is placed |
-| x | float | ❌ | X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner |
-| y | float | ❌ | Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner |
-| width | float | ❌ | Width of the annotation (in % of the page width from 0 to 100) |
-| height | float | ❌ | Height of the annotation (in % of the page height from 0 to 100) |
-| required | bool | ❌ | Whether the annotation is required |
-| type\_ | AnnotationType | ❌ | Type of the annotation |
-| signature | AnnotationSignature | ❌ | Signature annotation (null if annotation is not a signature) |
-| initials | AnnotationInitials | ❌ | Initials annotation (null if annotation is not initials) |
-| text | AnnotationText | ❌ | Text annotation (null if annotation is not a text) |
-| datetime\_ | AnnotationDateTime | ❌ | Date annotation (null if annotation is not a date) |
-| checkbox | AnnotationCheckbox | ❌ | Checkbox annotation (null if annotation is not a checkbox) |
+| Name | Type | Required | Description |
+| :----------- | :-------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the annotation |
+| recipient_id | str | ❌ | ID of the recipient |
+| document_id | str | ❌ | ID of the document |
+| page | int | ❌ | Page number where the annotation is placed |
+| x | float | ❌ | X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner |
+| y | float | ❌ | Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner |
+| width | float | ❌ | Width of the annotation (in % of the page width from 0 to 100) |
+| height | float | ❌ | Height of the annotation (in % of the page height from 0 to 100) |
+| required | bool | ❌ | Whether the annotation is required |
+| type\_ | [AnnotationType](AnnotationType.md) | ❌ | Type of the annotation |
+| signature | [AnnotationSignature](AnnotationSignature.md) | ❌ | Signature annotation (null if annotation is not a signature) |
+| initials | [AnnotationInitials](AnnotationInitials.md) | ❌ | Initials annotation (null if annotation is not initials) |
+| text | [AnnotationText](AnnotationText.md) | ❌ | Text annotation (null if annotation is not a text) |
+| datetime\_ | [AnnotationDateTime](AnnotationDateTime.md) | ❌ | Date annotation (null if annotation is not a date) |
+| checkbox | [AnnotationCheckbox](AnnotationCheckbox.md) | ❌ | Checkbox annotation (null if annotation is not a checkbox) |
diff --git a/documentation/models/AnnotationCheckbox.md b/documentation/models/AnnotationCheckbox.md
index 4af837f..60e565a 100644
--- a/documentation/models/AnnotationCheckbox.md
+++ b/documentation/models/AnnotationCheckbox.md
@@ -4,7 +4,7 @@ Checkbox annotation (null if annotation is not a checkbox)
**Properties**
-| Name | Type | Required | Description |
-| :------ | :---------------------- | :------- | :------------------------------ |
-| checked | bool | ❌ | Whether the checkbox is checked |
-| style | AnnotationCheckboxStyle | ❌ | Style of the checkbox |
+| Name | Type | Required | Description |
+| :------ | :---------------------------------------------------- | :------- | :------------------------------ |
+| checked | bool | ❌ | Whether the checkbox is checked |
+| style | [AnnotationCheckboxStyle](AnnotationCheckboxStyle.md) | ❌ | Style of the checkbox |
diff --git a/documentation/models/AnnotationDateTime.md b/documentation/models/AnnotationDateTime.md
index 205181e..a064816 100644
--- a/documentation/models/AnnotationDateTime.md
+++ b/documentation/models/AnnotationDateTime.md
@@ -4,12 +4,12 @@ Date annotation (null if annotation is not a date)
**Properties**
-| Name | Type | Required | Description |
-| :-------- | :----------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| size | float | ❌ | Font size of the text in pt |
-| font | AnnotationFont | ❌ | |
-| color | str | ❌ | Color of the text in hex format |
-| auto_fill | bool | ❌ | Whether the date should be automatically filled |
-| timezone | str | ❌ | Timezone of the date |
-| timestamp | int | ❌ | Unix timestamp of the date |
-| format | AnnotationDateTimeFormat | ❌ | Format of the date time (DMY_NUMERIC_SLASH is day/month/year with slashes, MDY_NUMERIC_SLASH is month/day/year with slashes, YMD_NUMERIC_SLASH is year/month/day with slashes, DMY_NUMERIC_DASH_SHORT is day/month/year with dashes, DMY_NUMERIC_DASH is day/month/year with dashes, YMD_NUMERIC_DASH is year/month/day with dashes, MDY_TEXT_DASH_SHORT is month/day/year with dashes, MDY_TEXT_SPACE_SHORT is month/day/year with spaces, MDY_TEXT_SPACE is month/day/year with spaces) |
+| Name | Type | Required | Description |
+| :-------- | :------------------------------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| size | float | ❌ | Font size of the text in pt |
+| font | [AnnotationFont](AnnotationFont.md) | ❌ | |
+| color | str | ❌ | Color of the text in hex format |
+| auto_fill | bool | ❌ | Whether the date should be automatically filled |
+| timezone | str | ❌ | Timezone of the date |
+| timestamp | int | ❌ | Unix timestamp of the date |
+| format | [AnnotationDateTimeFormat](AnnotationDateTimeFormat.md) | ❌ | Format of the date time (DMY_NUMERIC_SLASH is day/month/year with slashes, MDY_NUMERIC_SLASH is month/day/year with slashes, YMD_NUMERIC_SLASH is year/month/day with slashes, DMY_NUMERIC_DASH_SHORT is day/month/year with dashes, DMY_NUMERIC_DASH is day/month/year with dashes, YMD_NUMERIC_DASH is year/month/day with dashes, MDY_TEXT_DASH_SHORT is month/day/year with dashes, MDY_TEXT_SPACE_SHORT is month/day/year with spaces, MDY_TEXT_SPACE is month/day/year with spaces) |
diff --git a/documentation/models/AnnotationFont.md b/documentation/models/AnnotationFont.md
index 3be9df8..3f4f6c7 100644
--- a/documentation/models/AnnotationFont.md
+++ b/documentation/models/AnnotationFont.md
@@ -2,8 +2,8 @@
**Properties**
-| Name | Type | Required | Description |
-| :----- | :------------------- | :------- | :------------------------- |
-| family | AnnotationFontFamily | ❌ | Font family of the text |
-| italic | bool | ❌ | Whether the text is italic |
-| bold | bool | ❌ | Whether the text is bold |
+| Name | Type | Required | Description |
+| :----- | :---------------------------------------------- | :------- | :------------------------- |
+| family | [AnnotationFontFamily](AnnotationFontFamily.md) | ❌ | Font family of the text |
+| italic | bool | ❌ | Whether the text is italic |
+| bold | bool | ❌ | Whether the text is bold |
diff --git a/documentation/models/AnnotationText.md b/documentation/models/AnnotationText.md
index e50f4fd..3dd70eb 100644
--- a/documentation/models/AnnotationText.md
+++ b/documentation/models/AnnotationText.md
@@ -4,11 +4,11 @@ Text annotation (null if annotation is not a text)
**Properties**
-| Name | Type | Required | Description |
-| :----------------- | :------------- | :------- | :--------------------------------- |
-| size | float | ❌ | Font size of the text in pt |
-| color | float | ❌ | Text color in 32bit representation |
-| value | str | ❌ | Text content of the annotation |
-| tooltip | str | ❌ | Tooltip of the annotation |
-| dynamic_field_name | str | ❌ | Name of the dynamic field |
-| font | AnnotationFont | ❌ | |
+| Name | Type | Required | Description |
+| :----------------- | :---------------------------------- | :------- | :--------------------------------- |
+| size | float | ❌ | Font size of the text in pt |
+| color | float | ❌ | Text color in 32bit representation |
+| value | str | ❌ | Text content of the annotation |
+| tooltip | str | ❌ | Tooltip of the annotation |
+| dynamic_field_name | str | ❌ | Name of the dynamic field |
+| font | [AnnotationFont](AnnotationFont.md) | ❌ | |
diff --git a/documentation/models/AttachmentPlaceholder.md b/documentation/models/AttachmentPlaceholder.md
index 0519d12..74caf17 100644
--- a/documentation/models/AttachmentPlaceholder.md
+++ b/documentation/models/AttachmentPlaceholder.md
@@ -2,12 +2,12 @@
**Properties**
-| Name | Type | Required | Description |
-| :----------- | :------------------------------ | :------- | :--------------------------------------------------------- |
-| recipient_id | str | ❌ | ID of the recipient |
-| id\_ | str | ❌ | ID of the attachment placeholder |
-| name | str | ❌ | Name of the attachment placeholder |
-| hint | str | ❌ | Hint of the attachment placeholder |
-| required | bool | ❌ | Whether the attachment placeholder is required |
-| multiple | bool | ❌ | Whether the attachment placeholder can have multiple files |
-| files | List[AttachmentPlaceholderFile] | ❌ | |
+| Name | Type | Required | Description |
+| :----------- | :-------------------------------------------------------------- | :------- | :--------------------------------------------------------- |
+| recipient_id | str | ❌ | ID of the recipient |
+| id\_ | str | ❌ | ID of the attachment placeholder |
+| name | str | ❌ | Name of the attachment placeholder |
+| hint | str | ❌ | Hint of the attachment placeholder |
+| required | bool | ❌ | Whether the attachment placeholder is required |
+| multiple | bool | ❌ | Whether the attachment placeholder can have multiple files |
+| files | List[[AttachmentPlaceholderFile](AttachmentPlaceholderFile.md)] | ❌ | |
diff --git a/documentation/models/AttachmentPlaceholdersPerRecipient.md b/documentation/models/AttachmentPlaceholdersPerRecipient.md
index b8880a3..569a433 100644
--- a/documentation/models/AttachmentPlaceholdersPerRecipient.md
+++ b/documentation/models/AttachmentPlaceholdersPerRecipient.md
@@ -2,8 +2,8 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------- | :-------------------------- | :------- | :-------------------- |
-| recipient_id | str | ❌ | ID of the recipient |
-| recipient_name | str | ❌ | Name of the recipient |
-| placeholders | List[AttachmentPlaceholder] | ❌ | |
+| Name | Type | Required | Description |
+| :------------- | :------------------------------------------------------ | :------- | :-------------------- |
+| recipient_id | str | ❌ | ID of the recipient |
+| recipient_name | str | ❌ | Name of the recipient |
+| placeholders | List[[AttachmentPlaceholder](AttachmentPlaceholder.md)] | ❌ | |
diff --git a/documentation/models/CreateEnvelopeRequest.md b/documentation/models/CreateEnvelopeRequest.md
index 3cb2bdd..5d1166a 100644
--- a/documentation/models/CreateEnvelopeRequest.md
+++ b/documentation/models/CreateEnvelopeRequest.md
@@ -2,10 +2,10 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------- | :-------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | str | ✅ | Name of the envelope |
-| legality_level | EnvelopeLegalityLevel | ✅ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
-| expires_at | int | ❌ | Unix timestamp of the expiration date |
-| comment | str | ❌ | Comment for the envelope |
-| sandbox | bool | ❌ | Whether the envelope is created in sandbox mode |
+| Name | Type | Required | Description |
+| :------------- | :------------------------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| name | str | ✅ | Name of the envelope |
+| legality_level | [EnvelopeLegalityLevel](EnvelopeLegalityLevel.md) | ✅ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
+| expires_at | int | ❌ | Unix timestamp of the expiration date |
+| comment | str | ❌ | Comment for the envelope |
+| sandbox | bool | ❌ | Whether the envelope is created in sandbox mode |
diff --git a/documentation/models/CreateWebhookRequest.md b/documentation/models/CreateWebhookRequest.md
index c92ad94..f40e4ba 100644
--- a/documentation/models/CreateWebhookRequest.md
+++ b/documentation/models/CreateWebhookRequest.md
@@ -2,7 +2,7 @@
**Properties**
-| Name | Type | Required | Description |
-| :----- | :----------- | :------- | :------------------------ |
-| event | WebhookEvent | ✅ | Event of the webhook |
-| target | str | ✅ | URL of the webhook target |
+| Name | Type | Required | Description |
+| :----- | :------------------------------ | :------- | :------------------------ |
+| event | [WebhookEvent](WebhookEvent.md) | ✅ | Event of the webhook |
+| target | str | ✅ | URL of the webhook target |
diff --git a/documentation/models/Document.md b/documentation/models/Document.md
index ae52c8a..7706cbd 100644
--- a/documentation/models/Document.md
+++ b/documentation/models/Document.md
@@ -2,10 +2,10 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------- | :--------- | :------- | :-------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the document |
-| name | str | ❌ | Name of the document |
-| filename | str | ❌ | Filename of the document |
-| page_count | int | ❌ | Number of pages in the document |
-| pages | List[Page] | ❌ | List of pages in the document |
+| Name | Type | Required | Description |
+| :--------- | :-------------------- | :------- | :-------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the document |
+| name | str | ❌ | Name of the document |
+| filename | str | ❌ | Filename of the document |
+| page_count | int | ❌ | Number of pages in the document |
+| pages | List[[Page](Page.md)] | ❌ | List of pages in the document |
diff --git a/documentation/models/Envelope.md b/documentation/models/Envelope.md
index e541221..119d65e 100644
--- a/documentation/models/Envelope.md
+++ b/documentation/models/Envelope.md
@@ -2,21 +2,21 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------- | :-------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the envelope |
-| name | str | ❌ | Name of the envelope |
-| comment | str | ❌ | Comment for the envelope |
-| pages | int | ❌ | Total number of pages in the envelope |
-| flow_type | EnvelopeFlowType | ❌ | Flow type of the envelope (REQUEST_SIGNATURE is a request for signature, SIGN_MYSELF is a self-signing flow) |
-| legality_level | EnvelopeLegalityLevel | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
-| status | EnvelopeStatus | ❌ | Status of the envelope |
-| created_at | int | ❌ | Unix timestamp of the creation date |
-| updated_at | int | ❌ | Unix timestamp of the last modification date |
-| expires_at | int | ❌ | Unix timestamp of the expiration date |
-| num_recipients | int | ❌ | Number of recipients in the envelope |
-| is_duplicable | bool | ❌ | Whether the envelope can be duplicated |
-| signing_steps | List[SigningStep] | ❌ | |
-| documents | List[Document] | ❌ | |
-| notification | EnvelopeNotification | ❌ | |
-| attachments | EnvelopeAttachments | ❌ | |
+| Name | Type | Required | Description |
+| :------------- | :------------------------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the envelope |
+| name | str | ❌ | Name of the envelope |
+| comment | str | ❌ | Comment for the envelope |
+| pages | int | ❌ | Total number of pages in the envelope |
+| flow_type | [EnvelopeFlowType](EnvelopeFlowType.md) | ❌ | Flow type of the envelope (REQUEST_SIGNATURE is a request for signature, SIGN_MYSELF is a self-signing flow) |
+| legality_level | [EnvelopeLegalityLevel](EnvelopeLegalityLevel.md) | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
+| status | [EnvelopeStatus](EnvelopeStatus.md) | ❌ | Status of the envelope |
+| created_at | int | ❌ | Unix timestamp of the creation date |
+| updated_at | int | ❌ | Unix timestamp of the last modification date |
+| expires_at | int | ❌ | Unix timestamp of the expiration date |
+| num_recipients | int | ❌ | Number of recipients in the envelope |
+| is_duplicable | bool | ❌ | Whether the envelope can be duplicated |
+| signing_steps | List[[SigningStep](SigningStep.md)] | ❌ | |
+| documents | List[[Document](Document.md)] | ❌ | |
+| notification | [EnvelopeNotification](EnvelopeNotification.md) | ❌ | |
+| attachments | [EnvelopeAttachments](EnvelopeAttachments.md) | ❌ | |
diff --git a/documentation/models/EnvelopeAttachments.md b/documentation/models/EnvelopeAttachments.md
index c146195..e4f9fa2 100644
--- a/documentation/models/EnvelopeAttachments.md
+++ b/documentation/models/EnvelopeAttachments.md
@@ -2,7 +2,7 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------- | :--------------------------------------- | :------- | :---------- |
-| settings | AttachmentSettings | ❌ | |
-| recipients | List[AttachmentPlaceholdersPerRecipient] | ❌ | |
+| Name | Type | Required | Description |
+| :--------- | :-------------------------------------------------------------------------------- | :------- | :---------- |
+| settings | [AttachmentSettings](AttachmentSettings.md) | ❌ | |
+| recipients | List[[AttachmentPlaceholdersPerRecipient](AttachmentPlaceholdersPerRecipient.md)] | ❌ | |
diff --git a/documentation/models/ListEnvelopeDocumentAnnotationsResponse.md b/documentation/models/ListEnvelopeDocumentAnnotationsResponse.md
index 22b1a4b..85c5bf6 100644
--- a/documentation/models/ListEnvelopeDocumentAnnotationsResponse.md
+++ b/documentation/models/ListEnvelopeDocumentAnnotationsResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------- | :--------------- | :------- | :---------- |
-| annotations | List[Annotation] | ❌ | |
+| Name | Type | Required | Description |
+| :---------- | :-------------------------------- | :------- | :---------- |
+| annotations | List[[Annotation](Annotation.md)] | ❌ | |
diff --git a/documentation/models/ListEnvelopeDocumentsResponse.md b/documentation/models/ListEnvelopeDocumentsResponse.md
index 9ba191c..8a2ff35 100644
--- a/documentation/models/ListEnvelopeDocumentsResponse.md
+++ b/documentation/models/ListEnvelopeDocumentsResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :-------- | :------------- | :------- | :---------- |
-| documents | List[Document] | ❌ | |
+| Name | Type | Required | Description |
+| :-------- | :---------------------------- | :------- | :---------- |
+| documents | List[[Document](Document.md)] | ❌ | |
diff --git a/documentation/models/ListEnvelopesRequest.md b/documentation/models/ListEnvelopesRequest.md
index c69717e..4eae323 100644
--- a/documentation/models/ListEnvelopesRequest.md
+++ b/documentation/models/ListEnvelopesRequest.md
@@ -2,22 +2,22 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------------- | :------------------- | :------- | :------------------------------------------------ |
-| name | str | ❌ | Name of the envelope |
-| tags | List[str] | ❌ | List of tags |
-| comment | str | ❌ | Comment of the envelope |
-| ids | List[str] | ❌ | List of envelope IDs |
-| statuses | List[EnvelopeStatus] | ❌ | List of envelope statuses |
-| folder_ids | List[str] | ❌ | List of folder IDs |
-| only_root_folder | bool | ❌ | Whether to only list envelopes in the root folder |
-| date_from | int | ❌ | Unix timestamp of the start date |
-| date_to | int | ❌ | Unix timestamp of the end date |
-| uid | str | ❌ | Unique identifier of the user |
-| first | int | ❌ | |
-| last | int | ❌ | |
-| after | str | ❌ | |
-| before | str | ❌ | |
-| order_field | EnvelopeOrderField | ❌ | Field to order envelopes by |
-| ascending | bool | ❌ | Whether to order envelopes in ascending order |
-| include_trash | bool | ❌ | Whether to include envelopes in the trash |
+| Name | Type | Required | Description |
+| :--------------- | :------------------------------------------ | :------- | :------------------------------------------------ |
+| name | str | ❌ | Name of the envelope |
+| tags | List[str] | ❌ | List of tags |
+| comment | str | ❌ | Comment of the envelope |
+| ids | List[str] | ❌ | List of envelope IDs |
+| statuses | List[[EnvelopeStatus](EnvelopeStatus.md)] | ❌ | List of envelope statuses |
+| folder_ids | List[str] | ❌ | List of folder IDs |
+| only_root_folder | bool | ❌ | Whether to only list envelopes in the root folder |
+| date_from | int | ❌ | Unix timestamp of the start date |
+| date_to | int | ❌ | Unix timestamp of the end date |
+| uid | str | ❌ | Unique identifier of the user |
+| first | int | ❌ | |
+| last | int | ❌ | |
+| after | str | ❌ | |
+| before | str | ❌ | |
+| order_field | [EnvelopeOrderField](EnvelopeOrderField.md) | ❌ | Field to order envelopes by |
+| ascending | bool | ❌ | Whether to order envelopes in ascending order |
+| include_trash | bool | ❌ | Whether to include envelopes in the trash |
diff --git a/documentation/models/ListEnvelopesResponse.md b/documentation/models/ListEnvelopesResponse.md
index 5821fc7..560d31b 100644
--- a/documentation/models/ListEnvelopesResponse.md
+++ b/documentation/models/ListEnvelopesResponse.md
@@ -2,8 +2,8 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------------- | :------------- | :------- | :------------------------------- |
-| has_next_page | bool | ❌ | Whether there is a next page |
-| has_previous_page | bool | ❌ | Whether there is a previous page |
-| envelopes | List[Envelope] | ❌ | |
+| Name | Type | Required | Description |
+| :---------------- | :---------------------------- | :------- | :------------------------------- |
+| has_next_page | bool | ❌ | Whether there is a next page |
+| has_previous_page | bool | ❌ | Whether there is a previous page |
+| envelopes | List[[Envelope](Envelope.md)] | ❌ | |
diff --git a/documentation/models/ListTemplateAnnotationsResponse.md b/documentation/models/ListTemplateAnnotationsResponse.md
index 04dd084..2178524 100644
--- a/documentation/models/ListTemplateAnnotationsResponse.md
+++ b/documentation/models/ListTemplateAnnotationsResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------- | :--------------- | :------- | :---------- |
-| annotations | List[Annotation] | ❌ | |
+| Name | Type | Required | Description |
+| :---------- | :-------------------------------- | :------- | :---------- |
+| annotations | List[[Annotation](Annotation.md)] | ❌ | |
diff --git a/documentation/models/ListTemplateDocumentAnnotationsResponse.md b/documentation/models/ListTemplateDocumentAnnotationsResponse.md
index 4159232..d9b3884 100644
--- a/documentation/models/ListTemplateDocumentAnnotationsResponse.md
+++ b/documentation/models/ListTemplateDocumentAnnotationsResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------- | :--------------- | :------- | :---------- |
-| annotations | List[Annotation] | ❌ | |
+| Name | Type | Required | Description |
+| :---------- | :-------------------------------- | :------- | :---------- |
+| annotations | List[[Annotation](Annotation.md)] | ❌ | |
diff --git a/documentation/models/ListTemplateDocumentsResponse.md b/documentation/models/ListTemplateDocumentsResponse.md
index 2066d6e..a43c75d 100644
--- a/documentation/models/ListTemplateDocumentsResponse.md
+++ b/documentation/models/ListTemplateDocumentsResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :-------- | :------------- | :------- | :---------- |
-| documents | List[Document] | ❌ | |
+| Name | Type | Required | Description |
+| :-------- | :---------------------------- | :------- | :---------- |
+| documents | List[[Document](Document.md)] | ❌ | |
diff --git a/documentation/models/ListTemplatesRequest.md b/documentation/models/ListTemplatesRequest.md
index 51cf549..3e2dfbb 100644
--- a/documentation/models/ListTemplatesRequest.md
+++ b/documentation/models/ListTemplatesRequest.md
@@ -2,14 +2,14 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------- | :----------------- | :------- | :-------------------------------------------- |
-| name | str | ❌ | Name of the template |
-| tags | List[str] | ❌ | List of tag templates |
-| ids | List[str] | ❌ | List of templates IDs |
-| first | int | ❌ | |
-| last | int | ❌ | |
-| after | str | ❌ | |
-| before | str | ❌ | |
-| order_field | TemplateOrderField | ❌ | Field to order templates by |
-| ascending | bool | ❌ | Whether to order templates in ascending order |
+| Name | Type | Required | Description |
+| :---------- | :------------------------------------------ | :------- | :-------------------------------------------- |
+| name | str | ❌ | Name of the template |
+| tags | List[str] | ❌ | List of tag templates |
+| ids | List[str] | ❌ | List of templates IDs |
+| first | int | ❌ | |
+| last | int | ❌ | |
+| after | str | ❌ | |
+| before | str | ❌ | |
+| order_field | [TemplateOrderField](TemplateOrderField.md) | ❌ | Field to order templates by |
+| ascending | bool | ❌ | Whether to order templates in ascending order |
diff --git a/documentation/models/ListTemplatesResponse.md b/documentation/models/ListTemplatesResponse.md
index 031ce7a..23372ca 100644
--- a/documentation/models/ListTemplatesResponse.md
+++ b/documentation/models/ListTemplatesResponse.md
@@ -2,8 +2,8 @@
**Properties**
-| Name | Type | Required | Description |
-| :---------------- | :------------- | :------- | :------------------------------- |
-| has_next_page | bool | ❌ | Whether there is a next page |
-| has_previous_page | bool | ❌ | Whether there is a previous page |
-| templates | List[Template] | ❌ | |
+| Name | Type | Required | Description |
+| :---------------- | :---------------------------- | :------- | :------------------------------- |
+| has_next_page | bool | ❌ | Whether there is a next page |
+| has_previous_page | bool | ❌ | Whether there is a previous page |
+| templates | List[[Template](Template.md)] | ❌ | |
diff --git a/documentation/models/ListWebhooksRequest.md b/documentation/models/ListWebhooksRequest.md
index ab5ab2b..ae59f9a 100644
--- a/documentation/models/ListWebhooksRequest.md
+++ b/documentation/models/ListWebhooksRequest.md
@@ -2,7 +2,7 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------- | :----------- | :------- | :------------------- |
-| webhook_id | str | ❌ | ID of the webhook |
-| event | WebhookEvent | ❌ | Event of the webhook |
+| Name | Type | Required | Description |
+| :--------- | :------------------------------ | :------- | :------------------- |
+| webhook_id | str | ❌ | ID of the webhook |
+| event | [WebhookEvent](WebhookEvent.md) | ❌ | Event of the webhook |
diff --git a/documentation/models/ListWebhooksResponse.md b/documentation/models/ListWebhooksResponse.md
index b0ed509..2a50894 100644
--- a/documentation/models/ListWebhooksResponse.md
+++ b/documentation/models/ListWebhooksResponse.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------- | :------------ | :------- | :---------- |
-| webhooks | List[Webhook] | ❌ | |
+| Name | Type | Required | Description |
+| :------- | :-------------------------- | :------- | :---------- |
+| webhooks | List[[Webhook](Webhook.md)] | ❌ | |
diff --git a/documentation/models/Recipient.md b/documentation/models/Recipient.md
index 77970f4..e58ecc1 100644
--- a/documentation/models/Recipient.md
+++ b/documentation/models/Recipient.md
@@ -2,11 +2,11 @@
**Properties**
-| Name | Type | Required | Description |
-| :----------- | :-------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| name | str | ✅ | Name of the recipient |
-| email | str | ✅ | Email of the recipient |
-| role | RecipientRole | ✅ | Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document) |
-| id\_ | str | ❌ | Unique identifier of the recipient |
-| uid | str | ❌ | Unique identifier of the user associated with the recipient |
-| verification | RecipientVerification | ❌ | |
+| Name | Type | Required | Description |
+| :----------- | :------------------------------------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| name | str | ✅ | Name of the recipient |
+| email | str | ✅ | Email of the recipient |
+| role | [RecipientRole](RecipientRole.md) | ✅ | Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document) |
+| id\_ | str | ❌ | Unique identifier of the recipient |
+| uid | str | ❌ | Unique identifier of the user associated with the recipient |
+| verification | [RecipientVerification](RecipientVerification.md) | ❌ | |
diff --git a/documentation/models/RecipientVerification.md b/documentation/models/RecipientVerification.md
index 0c3a87a..e841d3c 100644
--- a/documentation/models/RecipientVerification.md
+++ b/documentation/models/RecipientVerification.md
@@ -2,7 +2,7 @@
**Properties**
-| Name | Type | Required | Description |
-| :----- | :------------------------ | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type\_ | RecipientVerificationType | ❌ | Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check. |
-| value | str | ❌ | Required for `PASSCODE` and `SMS` verification. - `PASSCODE`: code required by the recipient to sign the document. - `SMS`: recipient's phone number. - `ID_VERIFICATION`: leave empty. |
+| Name | Type | Required | Description |
+| :----- | :-------------------------------------------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| type\_ | [RecipientVerificationType](RecipientVerificationType.md) | ❌ | Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check. |
+| value | str | ❌ | Required for `PASSCODE` and `SMS` verification. - `PASSCODE`: code required by the recipient to sign the document. - `SMS`: recipient's phone number. - `ID_VERIFICATION`: leave empty. |
diff --git a/documentation/models/SetEnvelopeAttachmentsPlaceholdersRequest.md b/documentation/models/SetEnvelopeAttachmentsPlaceholdersRequest.md
index fe001b1..242b582 100644
--- a/documentation/models/SetEnvelopeAttachmentsPlaceholdersRequest.md
+++ b/documentation/models/SetEnvelopeAttachmentsPlaceholdersRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :----------- | :--------------------------------- | :------- | :---------- |
-| placeholders | List[AttachmentPlaceholderRequest] | ✅ | |
+| Name | Type | Required | Description |
+| :----------- | :-------------------------------------------------------------------- | :------- | :---------- |
+| placeholders | List[[AttachmentPlaceholderRequest](AttachmentPlaceholderRequest.md)] | ✅ | |
diff --git a/documentation/models/SetEnvelopeAttachmentsSettingsRequest.md b/documentation/models/SetEnvelopeAttachmentsSettingsRequest.md
index 214f26e..edfdc4a 100644
--- a/documentation/models/SetEnvelopeAttachmentsSettingsRequest.md
+++ b/documentation/models/SetEnvelopeAttachmentsSettingsRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------- | :----------------- | :------- | :---------- |
-| settings | AttachmentSettings | ✅ | |
+| Name | Type | Required | Description |
+| :------- | :------------------------------------------ | :------- | :---------- |
+| settings | [AttachmentSettings](AttachmentSettings.md) | ✅ | |
diff --git a/documentation/models/SetEnvelopeDynamicFieldsRequest.md b/documentation/models/SetEnvelopeDynamicFieldsRequest.md
index de3856f..ef14c34 100644
--- a/documentation/models/SetEnvelopeDynamicFieldsRequest.md
+++ b/documentation/models/SetEnvelopeDynamicFieldsRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------- | :----------------- | :------- | :--------------------- |
-| dynamic_fields | List[DynamicField] | ✅ | List of dynamic fields |
+| Name | Type | Required | Description |
+| :------------- | :------------------------------------ | :------- | :--------------------- |
+| dynamic_fields | List[[DynamicField](DynamicField.md)] | ✅ | List of dynamic fields |
diff --git a/documentation/models/SetEnvelopeLegalityLevelRequest.md b/documentation/models/SetEnvelopeLegalityLevelRequest.md
index 8cda3e4..8f7b1d9 100644
--- a/documentation/models/SetEnvelopeLegalityLevelRequest.md
+++ b/documentation/models/SetEnvelopeLegalityLevelRequest.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :------------- | :-------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| legality_level | EnvelopeLegalityLevel | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
+| Name | Type | Required | Description |
+| :------------- | :------------------------------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| legality_level | [EnvelopeLegalityLevel](EnvelopeLegalityLevel.md) | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
diff --git a/documentation/models/SigningStep.md b/documentation/models/SigningStep.md
index 6c6f00b..7edd4c1 100644
--- a/documentation/models/SigningStep.md
+++ b/documentation/models/SigningStep.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------- | :-------------- | :------- | :----------------- |
-| recipients | List[Recipient] | ❌ | List of recipients |
+| Name | Type | Required | Description |
+| :--------- | :------------------------------ | :------- | :----------------- |
+| recipients | List[[Recipient](Recipient.md)] | ❌ | List of recipients |
diff --git a/documentation/models/Template.md b/documentation/models/Template.md
index fc1bdaa..45c15ae 100644
--- a/documentation/models/Template.md
+++ b/documentation/models/Template.md
@@ -2,19 +2,19 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------------- | :------------------------ | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the template |
-| name | str | ❌ | Name of the template |
-| comment | str | ❌ | Comment for the template |
-| pages | int | ❌ | Total number of pages in the template |
-| legality_level | EnvelopeLegalityLevel | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
-| created_at | int | ❌ | Unix timestamp of the creation date |
-| updated_at | int | ❌ | Unix timestamp of the last modification date |
-| expiration_delay | int | ❌ | Expiration delay added to the current time when an envelope is created from this template |
-| num_recipients | int | ❌ | Number of recipients in the envelope |
-| signing_steps | List[TemplateSigningStep] | ❌ | |
-| documents | List[Document] | ❌ | |
-| notification | EnvelopeNotification | ❌ | |
-| dynamic_fields | List[str] | ❌ | List of dynamic fields |
-| attachments | EnvelopeAttachments | ❌ | |
+| Name | Type | Required | Description |
+| :--------------- | :-------------------------------------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the template |
+| name | str | ❌ | Name of the template |
+| comment | str | ❌ | Comment for the template |
+| pages | int | ❌ | Total number of pages in the template |
+| legality_level | [EnvelopeLegalityLevel](EnvelopeLegalityLevel.md) | ❌ | Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes) |
+| created_at | int | ❌ | Unix timestamp of the creation date |
+| updated_at | int | ❌ | Unix timestamp of the last modification date |
+| expiration_delay | int | ❌ | Expiration delay added to the current time when an envelope is created from this template |
+| num_recipients | int | ❌ | Number of recipients in the envelope |
+| signing_steps | List[[TemplateSigningStep](TemplateSigningStep.md)] | ❌ | |
+| documents | List[[Document](Document.md)] | ❌ | |
+| notification | [EnvelopeNotification](EnvelopeNotification.md) | ❌ | |
+| dynamic_fields | List[str] | ❌ | List of dynamic fields |
+| attachments | [EnvelopeAttachments](EnvelopeAttachments.md) | ❌ | |
diff --git a/documentation/models/TemplateRecipient.md b/documentation/models/TemplateRecipient.md
index e54055f..35e0c73 100644
--- a/documentation/models/TemplateRecipient.md
+++ b/documentation/models/TemplateRecipient.md
@@ -2,10 +2,10 @@
**Properties**
-| Name | Type | Required | Description |
-| :---- | :-------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the recipient |
-| uid | str | ❌ | Unique identifier of the user associated with the recipient |
-| name | str | ❌ | Name of the recipient |
-| email | str | ❌ | Email of the recipient |
-| role | TemplateRecipientRole | ❌ | Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document) |
+| Name | Type | Required | Description |
+| :---- | :------------------------------------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the recipient |
+| uid | str | ❌ | Unique identifier of the user associated with the recipient |
+| name | str | ❌ | Name of the recipient |
+| email | str | ❌ | Email of the recipient |
+| role | [TemplateRecipientRole](TemplateRecipientRole.md) | ❌ | Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document) |
diff --git a/documentation/models/TemplateSigningStep.md b/documentation/models/TemplateSigningStep.md
index 4b2e6ab..979ecf3 100644
--- a/documentation/models/TemplateSigningStep.md
+++ b/documentation/models/TemplateSigningStep.md
@@ -2,6 +2,6 @@
**Properties**
-| Name | Type | Required | Description |
-| :--------- | :---------------------- | :------- | :----------------- |
-| recipients | List[TemplateRecipient] | ❌ | List of recipients |
+| Name | Type | Required | Description |
+| :--------- | :---------------------------------------------- | :------- | :----------------- |
+| recipients | List[[TemplateRecipient](TemplateRecipient.md)] | ❌ | List of recipients |
diff --git a/documentation/models/Webhook.md b/documentation/models/Webhook.md
index 22fad1a..c8baf2e 100644
--- a/documentation/models/Webhook.md
+++ b/documentation/models/Webhook.md
@@ -2,8 +2,8 @@
**Properties**
-| Name | Type | Required | Description |
-| :----- | :----------- | :------- | :------------------------------- |
-| id\_ | str | ❌ | Unique identifier of the webhook |
-| event | WebhookEvent | ❌ | Event of the webhook |
-| target | str | ❌ | Target URL of the webhook |
+| Name | Type | Required | Description |
+| :----- | :------------------------------ | :------- | :------------------------------- |
+| id\_ | str | ❌ | Unique identifier of the webhook |
+| event | [WebhookEvent](WebhookEvent.md) | ❌ | Event of the webhook |
+| target | str | ❌ | Target URL of the webhook |
diff --git a/documentation/services/SignplusService.md b/documentation/services/SignplusService.md
index 04f91a1..82a2033 100644
--- a/documentation/services/SignplusService.md
+++ b/documentation/services/SignplusService.md
@@ -180,16 +180,16 @@ request_body = ListEnvelopesRequest(
folder_ids=[
"folder_ids"
],
- only_root_folder=True,
- date_from=5,
- date_to=9,
+ only_root_folder=False,
+ date_from=0,
+ date_to=1,
uid="uid",
- first=9,
- last=7,
+ first=6,
+ last=6,
after="after",
before="before",
order_field="CREATION_DATE",
- ascending=True,
+ ascending=False,
include_trash=True
)
@@ -274,7 +274,7 @@ Download signed documents for an envelope
**Return Type**
-`any`
+`Any`
**Example Usage Code Snippet**
@@ -309,7 +309,7 @@ Download certificate of completion for an envelope
**Return Type**
-`any`
+`Any`
**Example Usage Code Snippet**
@@ -569,7 +569,7 @@ sdk = Signplus(
request_body = SetEnvelopeAttachmentsSettingsRequest(
settings={
- "visible_to_recipients": False
+ "visible_to_recipients": True
}
)
@@ -617,7 +617,7 @@ request_body = SetEnvelopeAttachmentsPlaceholdersRequest(
"id_": "id",
"name": "name",
"hint": "hint",
- "required": False,
+ "required": True,
"multiple": True
}
]
@@ -665,7 +665,7 @@ result = sdk.signplus.get_attachment_file(
)
with open("output-file.ext", "wb") as f:
- f.write(result)
+ f.write(result if isinstance(result, (bytes, bytearray)) else str(result).encode())
```
## send_envelope
@@ -878,7 +878,7 @@ sdk = Signplus(
request_body = EnvelopeNotification(
subject="subject",
message="message",
- reminder_interval=1
+ reminder_interval=4
)
result = sdk.signplus.set_envelope_notification(
@@ -919,7 +919,7 @@ sdk = Signplus(
)
request_body = SetEnvelopeExpirationRequest(
- expires_at=0
+ expires_at=8
)
result = sdk.signplus.set_envelope_expiration_date(
@@ -1071,11 +1071,11 @@ sdk = Signplus(
request_body = AddAnnotationRequest(
recipient_id="recipient_id",
document_id="document_id",
- page=2,
- x=1.99,
- y=8.2,
- width=4.89,
- height=9.43,
+ page=7,
+ x=0.75,
+ y=7.6,
+ width=6.94,
+ height=2.06,
required=False,
type_="TEXT",
signature={
@@ -1085,32 +1085,32 @@ request_body = AddAnnotationRequest(
"id_": "id"
},
text={
- "size": 5.96,
- "color": 8.73,
+ "size": 9.98,
+ "color": 3.73,
"value": "value",
"tooltip": "tooltip",
"dynamic_field_name": "dynamic_field_name",
"font": {
"family": "UNKNOWN",
- "italic": True,
+ "italic": False,
"bold": True
}
},
datetime_={
- "size": 0.26,
+ "size": 8.01,
"font": {
"family": "UNKNOWN",
- "italic": True,
+ "italic": False,
"bold": True
},
"color": "color",
- "auto_fill": True,
+ "auto_fill": False,
"timezone": "timezone",
- "timestamp": 1,
+ "timestamp": 5,
"format": "DMY_NUMERIC_SLASH"
},
checkbox={
- "checked": True,
+ "checked": False,
"style": "CIRCLE_CHECK"
}
)
@@ -1228,12 +1228,12 @@ request_body = ListTemplatesRequest(
ids=[
"ids"
],
- first=1,
- last=6,
+ first=5,
+ last=3,
after="after",
before="before",
order_field="TEMPLATE_ID",
- ascending=False
+ ascending=True
)
result = sdk.signplus.list_templates(request_body=request_body)
@@ -1609,7 +1609,7 @@ sdk = Signplus(
request_body = EnvelopeNotification(
subject="subject",
message="message",
- reminder_interval=1
+ reminder_interval=4
)
result = sdk.signplus.set_template_notification(
@@ -1720,11 +1720,11 @@ sdk = Signplus(
request_body = AddAnnotationRequest(
recipient_id="recipient_id",
document_id="document_id",
- page=2,
- x=1.99,
- y=8.2,
- width=4.89,
- height=9.43,
+ page=7,
+ x=0.75,
+ y=7.6,
+ width=6.94,
+ height=2.06,
required=False,
type_="TEXT",
signature={
@@ -1734,32 +1734,32 @@ request_body = AddAnnotationRequest(
"id_": "id"
},
text={
- "size": 5.96,
- "color": 8.73,
+ "size": 9.98,
+ "color": 3.73,
"value": "value",
"tooltip": "tooltip",
"dynamic_field_name": "dynamic_field_name",
"font": {
"family": "UNKNOWN",
- "italic": True,
+ "italic": False,
"bold": True
}
},
datetime_={
- "size": 0.26,
+ "size": 8.01,
"font": {
"family": "UNKNOWN",
- "italic": True,
+ "italic": False,
"bold": True
},
"color": "color",
- "auto_fill": True,
+ "auto_fill": False,
"timezone": "timezone",
- "timestamp": 1,
+ "timestamp": 5,
"format": "DMY_NUMERIC_SLASH"
},
checkbox={
- "checked": True,
+ "checked": False,
"style": "CIRCLE_CHECK"
}
)
@@ -1835,7 +1835,7 @@ sdk = Signplus(
request_body = SetEnvelopeAttachmentsSettingsRequest(
settings={
- "visible_to_recipients": False
+ "visible_to_recipients": True
}
)
@@ -1883,7 +1883,7 @@ request_body = SetEnvelopeAttachmentsPlaceholdersRequest(
"id_": "id",
"name": "name",
"hint": "hint",
- "required": False,
+ "required": True,
"multiple": True
}
]
diff --git a/documentation/snippets/snippets.json b/documentation/snippets/snippets.json
new file mode 100644
index 0000000..ba9d492
--- /dev/null
+++ b/documentation/snippets/snippets.json
@@ -0,0 +1,282 @@
+{
+ "endpoints": {
+ "/envelope": {
+ "post": "from signplus import Signplus\nfrom signplus.models import CreateEnvelopeRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = CreateEnvelopeRequest(\n name=\"name\",\n legality_level=\"SES\",\n expires_at=8,\n comment=\"comment\",\n sandbox=False\n)\n\nresult = sdk.signplus.create_envelope(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/envelope/from_template/{template_id}": {
+ "post": "from signplus import Signplus\nfrom signplus.models import CreateEnvelopeFromTemplateRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = CreateEnvelopeFromTemplateRequest(\n name=\"name\",\n comment=\"comment\",\n sandbox=True\n)\n\nresult = sdk.signplus.create_envelope_from_template(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelopes": {
+ "post": "from signplus import Signplus\nfrom signplus.models import ListEnvelopesRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = ListEnvelopesRequest(\n name=\"name\",\n tags=[\n \"tags\"\n ],\n comment=\"comment\",\n ids=[\n \"ids\"\n ],\n statuses=[\n \"DRAFT\"\n ],\n folder_ids=[\n \"folder_ids\"\n ],\n only_root_folder=False,\n date_from=0,\n date_to=1,\n uid=\"uid\",\n first=6,\n last=6,\n after=\"after\",\n before=\"before\",\n order_field=\"CREATION_DATE\",\n ascending=False,\n include_trash=True\n)\n\nresult = sdk.signplus.list_envelopes(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n",
+ "delete": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.delete_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/signed_documents": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.download_envelope_signed_documents(\n envelope_id=\"envelope_id\",\n certificate_of_completion=True\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/certificate": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.download_envelope_certificate(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/document/{document_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope_document(\n envelope_id=\"envelope_id\",\n document_id=\"document_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/documents": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope_documents(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/document": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddEnvelopeDocumentRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddEnvelopeDocumentRequest(\n file=\"file\"\n)\n\nresult = sdk.signplus.add_envelope_document(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/dynamic_fields": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeDynamicFieldsRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeDynamicFieldsRequest(\n dynamic_fields=[\n {\n \"name\": \"name\",\n \"value\": \"value\"\n }\n ]\n)\n\nresult = sdk.signplus.set_envelope_dynamic_fields(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/signing_steps": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddEnvelopeSigningStepsRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddEnvelopeSigningStepsRequest(\n signing_steps=[\n {\n \"recipients\": [\n {\n \"id_\": \"id\",\n \"uid\": \"uid\",\n \"name\": \"name\",\n \"email\": \"email\",\n \"role\": \"SIGNER\",\n \"verification\": {\n \"type_\": \"SMS\",\n \"value\": \"value\"\n }\n }\n ]\n }\n ]\n)\n\nresult = sdk.signplus.add_envelope_signing_steps(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/attachments/settings": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeAttachmentsSettingsRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeAttachmentsSettingsRequest(\n settings={\n \"visible_to_recipients\": True\n }\n)\n\nresult = sdk.signplus.set_envelope_attachments_settings(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/attachments/placeholders": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeAttachmentsPlaceholdersRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeAttachmentsPlaceholdersRequest(\n placeholders=[\n {\n \"recipient_id\": \"recipient_id\",\n \"id_\": \"id\",\n \"name\": \"name\",\n \"hint\": \"hint\",\n \"required\": True,\n \"multiple\": True\n }\n ]\n)\n\nresult = sdk.signplus.set_envelope_attachments_placeholders(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/attachments/{file_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_attachment_file(\n envelope_id=\"envelope_id\",\n file_id=\"file_id\"\n)\n\nwith open(\"output-file.ext\", \"wb\") as f:\n f.write(result if isinstance(result, (bytes, bytearray)) else str(result).encode())\n"
+ },
+ "/envelope/{envelope_id}/send": {
+ "post": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.send_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/duplicate": {
+ "post": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.duplicate_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/void": {
+ "put": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.void_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/rename": {
+ "put": "from signplus import Signplus\nfrom signplus.models import RenameEnvelopeRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = RenameEnvelopeRequest(\n name=\"name\"\n)\n\nresult = sdk.signplus.rename_envelope(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/set_comment": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeCommentRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeCommentRequest(\n comment=\"comment\"\n)\n\nresult = sdk.signplus.set_envelope_comment(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/set_notification": {
+ "put": "from signplus import Signplus\nfrom signplus.models import EnvelopeNotification\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = EnvelopeNotification(\n subject=\"subject\",\n message=\"message\",\n reminder_interval=4\n)\n\nresult = sdk.signplus.set_envelope_notification(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/set_expiration_date": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeExpirationRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeExpirationRequest(\n expires_at=8\n)\n\nresult = sdk.signplus.set_envelope_expiration_date(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/set_legality_level": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeLegalityLevelRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeLegalityLevelRequest(\n legality_level=\"SES\"\n)\n\nresult = sdk.signplus.set_envelope_legality_level(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/annotations": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope_annotations(envelope_id=\"envelope_id\")\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/annotations/{document_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope_document_annotations(\n envelope_id=\"envelope_id\",\n document_id=\"document_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/annotation": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddAnnotationRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddAnnotationRequest(\n recipient_id=\"recipient_id\",\n document_id=\"document_id\",\n page=7,\n x=0.75,\n y=7.6,\n width=6.94,\n height=2.06,\n required=False,\n type_=\"TEXT\",\n signature={\n \"id_\": \"id\"\n },\n initials={\n \"id_\": \"id\"\n },\n text={\n \"size\": 9.98,\n \"color\": 3.73,\n \"value\": \"value\",\n \"tooltip\": \"tooltip\",\n \"dynamic_field_name\": \"dynamic_field_name\",\n \"font\": {\n \"family\": \"UNKNOWN\",\n \"italic\": False,\n \"bold\": True\n }\n },\n datetime_={\n \"size\": 8.01,\n \"font\": {\n \"family\": \"UNKNOWN\",\n \"italic\": False,\n \"bold\": True\n },\n \"color\": \"color\",\n \"auto_fill\": False,\n \"timezone\": \"timezone\",\n \"timestamp\": 5,\n \"format\": \"DMY_NUMERIC_SLASH\"\n },\n checkbox={\n \"checked\": False,\n \"style\": \"CIRCLE_CHECK\"\n }\n)\n\nresult = sdk.signplus.add_envelope_annotation(\n request_body=request_body,\n envelope_id=\"envelope_id\"\n)\n\nprint(result)\n"
+ },
+ "/envelope/{envelope_id}/annotation/{annotation_id}": {
+ "delete": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.delete_envelope_annotation(\n envelope_id=\"envelope_id\",\n annotation_id=\"annotation_id\"\n)\n\nprint(result)\n"
+ },
+ "/template": {
+ "post": "from signplus import Signplus\nfrom signplus.models import CreateTemplateRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = CreateTemplateRequest(\n name=\"name\"\n)\n\nresult = sdk.signplus.create_template(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/templates": {
+ "post": "from signplus import Signplus\nfrom signplus.models import ListTemplatesRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = ListTemplatesRequest(\n name=\"name\",\n tags=[\n \"tags\"\n ],\n ids=[\n \"ids\"\n ],\n first=5,\n last=3,\n after=\"after\",\n before=\"before\",\n order_field=\"TEMPLATE_ID\",\n ascending=True\n)\n\nresult = sdk.signplus.list_templates(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/template/{template_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_template(template_id=\"template_id\")\n\nprint(result)\n",
+ "delete": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.delete_template(template_id=\"template_id\")\n\nprint(result)\n"
+ },
+ "/template/{template_id}/duplicate": {
+ "post": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.duplicate_template(template_id=\"template_id\")\n\nprint(result)\n"
+ },
+ "/template/{template_id}/document": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddTemplateDocumentRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddTemplateDocumentRequest(\n file=\"file\"\n)\n\nresult = sdk.signplus.add_template_document(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/document/{document_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_template_document(\n template_id=\"template_id\",\n document_id=\"document_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/documents": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_template_documents(template_id=\"template_id\")\n\nprint(result)\n"
+ },
+ "/template/{template_id}/signing_steps": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddTemplateSigningStepsRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddTemplateSigningStepsRequest(\n signing_steps=[\n {\n \"recipients\": [\n {\n \"id_\": \"id\",\n \"uid\": \"uid\",\n \"name\": \"name\",\n \"email\": \"email\",\n \"role\": \"SIGNER\"\n }\n ]\n }\n ]\n)\n\nresult = sdk.signplus.add_template_signing_steps(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/rename": {
+ "put": "from signplus import Signplus\nfrom signplus.models import RenameTemplateRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = RenameTemplateRequest(\n name=\"name\"\n)\n\nresult = sdk.signplus.rename_template(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/set_comment": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetTemplateCommentRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetTemplateCommentRequest(\n comment=\"comment\"\n)\n\nresult = sdk.signplus.set_template_comment(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/set_notification": {
+ "put": "from signplus import Signplus\nfrom signplus.models import EnvelopeNotification\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = EnvelopeNotification(\n subject=\"subject\",\n message=\"message\",\n reminder_interval=4\n)\n\nresult = sdk.signplus.set_template_notification(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/annotations": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_template_annotations(template_id=\"template_id\")\n\nprint(result)\n"
+ },
+ "/template/{template_id}/annotations/{document_id}": {
+ "get": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_document_template_annotations(\n template_id=\"template_id\",\n document_id=\"document_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/annotation": {
+ "post": "from signplus import Signplus\nfrom signplus.models import AddAnnotationRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = AddAnnotationRequest(\n recipient_id=\"recipient_id\",\n document_id=\"document_id\",\n page=7,\n x=0.75,\n y=7.6,\n width=6.94,\n height=2.06,\n required=False,\n type_=\"TEXT\",\n signature={\n \"id_\": \"id\"\n },\n initials={\n \"id_\": \"id\"\n },\n text={\n \"size\": 9.98,\n \"color\": 3.73,\n \"value\": \"value\",\n \"tooltip\": \"tooltip\",\n \"dynamic_field_name\": \"dynamic_field_name\",\n \"font\": {\n \"family\": \"UNKNOWN\",\n \"italic\": False,\n \"bold\": True\n }\n },\n datetime_={\n \"size\": 8.01,\n \"font\": {\n \"family\": \"UNKNOWN\",\n \"italic\": False,\n \"bold\": True\n },\n \"color\": \"color\",\n \"auto_fill\": False,\n \"timezone\": \"timezone\",\n \"timestamp\": 5,\n \"format\": \"DMY_NUMERIC_SLASH\"\n },\n checkbox={\n \"checked\": False,\n \"style\": \"CIRCLE_CHECK\"\n }\n)\n\nresult = sdk.signplus.add_template_annotation(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/annotation/{annotation_id}": {
+ "delete": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.delete_template_annotation(\n template_id=\"template_id\",\n annotation_id=\"annotation_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/attachments/settings": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeAttachmentsSettingsRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeAttachmentsSettingsRequest(\n settings={\n \"visible_to_recipients\": True\n }\n)\n\nresult = sdk.signplus.set_template_attachments_settings(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/template/{template_id}/attachments/placeholders": {
+ "put": "from signplus import Signplus\nfrom signplus.models import SetEnvelopeAttachmentsPlaceholdersRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = SetEnvelopeAttachmentsPlaceholdersRequest(\n placeholders=[\n {\n \"recipient_id\": \"recipient_id\",\n \"id_\": \"id\",\n \"name\": \"name\",\n \"hint\": \"hint\",\n \"required\": True,\n \"multiple\": True\n }\n ]\n)\n\nresult = sdk.signplus.set_template_attachments_placeholders(\n request_body=request_body,\n template_id=\"template_id\"\n)\n\nprint(result)\n"
+ },
+ "/webhook": {
+ "post": "from signplus import Signplus\nfrom signplus.models import CreateWebhookRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = CreateWebhookRequest(\n event=\"ENVELOPE_EXPIRED\",\n target=\"target\"\n)\n\nresult = sdk.signplus.create_webhook(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/webhooks": {
+ "post": "from signplus import Signplus\nfrom signplus.models import ListWebhooksRequest\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nrequest_body = ListWebhooksRequest(\n webhook_id=\"webhook_id\",\n event=\"ENVELOPE_EXPIRED\"\n)\n\nresult = sdk.signplus.list_webhooks(request_body=request_body)\n\nprint(result)\n"
+ },
+ "/webhook/{webhook_id}": {
+ "delete": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.delete_webhook(webhook_id=\"webhook_id\")\n\nprint(result)\n"
+ }
+ },
+ "methodResponses": {
+ "/envelope": {
+ "post": "print(result)"
+ },
+ "/envelope/from_template/{template_id}": {
+ "post": "print(result)"
+ },
+ "/envelopes": {
+ "post": "print(result)"
+ },
+ "/envelope/{envelope_id}": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/signed_documents": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/certificate": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/document/{document_id}": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/documents": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/document": {
+ "post": "print(result)"
+ },
+ "/envelope/{envelope_id}/dynamic_fields": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/signing_steps": {
+ "post": "print(result)"
+ },
+ "/envelope/{envelope_id}/attachments/settings": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/attachments/placeholders": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/attachments/{file_id}": {
+ "get": "with open(\"output-file.ext\", \"wb\") as f:\n f.write(result if isinstance(result, (bytes, bytearray)) else str(result).encode())"
+ },
+ "/envelope/{envelope_id}/send": {
+ "post": "print(result)"
+ },
+ "/envelope/{envelope_id}/duplicate": {
+ "post": "print(result)"
+ },
+ "/envelope/{envelope_id}/void": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/rename": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/set_comment": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/set_notification": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/set_expiration_date": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/set_legality_level": {
+ "put": "print(result)"
+ },
+ "/envelope/{envelope_id}/annotations": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/annotations/{document_id}": {
+ "get": "print(result)"
+ },
+ "/envelope/{envelope_id}/annotation": {
+ "post": "print(result)"
+ },
+ "/template": {
+ "post": "print(result)"
+ },
+ "/templates": {
+ "post": "print(result)"
+ },
+ "/template/{template_id}": {
+ "get": "print(result)"
+ },
+ "/template/{template_id}/duplicate": {
+ "post": "print(result)"
+ },
+ "/template/{template_id}/document": {
+ "post": "print(result)"
+ },
+ "/template/{template_id}/document/{document_id}": {
+ "get": "print(result)"
+ },
+ "/template/{template_id}/documents": {
+ "get": "print(result)"
+ },
+ "/template/{template_id}/signing_steps": {
+ "post": "print(result)"
+ },
+ "/template/{template_id}/rename": {
+ "put": "print(result)"
+ },
+ "/template/{template_id}/set_comment": {
+ "put": "print(result)"
+ },
+ "/template/{template_id}/set_notification": {
+ "put": "print(result)"
+ },
+ "/template/{template_id}/annotations": {
+ "get": "print(result)"
+ },
+ "/template/{template_id}/annotations/{document_id}": {
+ "get": "print(result)"
+ },
+ "/template/{template_id}/annotation": {
+ "post": "print(result)"
+ },
+ "/template/{template_id}/attachments/settings": {
+ "put": "print(result)"
+ },
+ "/template/{template_id}/attachments/placeholders": {
+ "put": "print(result)"
+ },
+ "/webhook": {
+ "post": "print(result)"
+ },
+ "/webhooks": {
+ "post": "print(result)"
+ }
+ },
+ "example": "from signplus import Signplus\n\nsdk = Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)\n\nresult = sdk.signplus.get_envelope(envelope_id=\"envelope_id\")\n\nprint(result)\n",
+ "authentication": {
+ "bearer": {
+ "constructor": "Signplus(\n access_token=\"YOUR_ACCESS_TOKEN\",\n timeout=10000\n)",
+ "setter": "sdk.set_access_token(\"YOUR_ACCESS_TOKEN\")"
+ }
+ }
+}
diff --git a/examples/install.cmd b/examples/install.cmd
index 127b161..dd96c23 100644
--- a/examples/install.cmd
+++ b/examples/install.cmd
@@ -2,4 +2,4 @@ python -m venv .venv
call .venv\Scripts\activate
pip install build
python -m build --outdir dist ..\
-pip install dist\signplus_python-1.4.0-py3-none-any.whl --force-reinstall
+pip install dist\signplus_python-1.0.0-py3-none-any.whl --force-reinstall
diff --git a/examples/install.sh b/examples/install.sh
index 83ac5a0..87b1b0d 100644
--- a/examples/install.sh
+++ b/examples/install.sh
@@ -1,5 +1,16 @@
-python -m venv .venv
+#!/bin/bash
+
+if command -v python3 &> /dev/null; then
+ PYTHON_CMD=python3
+elif command -v python &> /dev/null && python --version 2>&1 | grep -qE "Python 3\."; then
+ PYTHON_CMD=python
+else
+ echo "Error: Python 3 is not installed or not found in PATH"
+ exit 1
+fi
+
+$PYTHON_CMD -m venv .venv
. .venv/bin/activate
-pip install build
-python -m build --outdir dist ../
-pip install dist/signplus_python-1.4.0-py3-none-any.whl --force-reinstall
+$PYTHON_CMD -m pip install build
+$PYTHON_CMD -m build --outdir dist ../
+$PYTHON_CMD -m pip install dist/signplus_python-1.0.0-py3-none-any.whl --force-reinstall
diff --git a/install.cmd b/install.cmd
index 618b60f..5a2036e 100644
--- a/install.cmd
+++ b/install.cmd
@@ -15,7 +15,7 @@ if "%USE_VENV%"=="1" (
pip install build
python -m build --outdir dist .
-pip install dist\signplus_python-1.4.0-py3-none-any.whl --force-reinstall
+pip install dist\signplus_python-1.0.0-py3-none-any.whl --force-reinstall
if "%USE_VENV%"=="1" (
deactivate
diff --git a/install.sh b/install.sh
index f7e99b9..639c619 100644
--- a/install.sh
+++ b/install.sh
@@ -1,5 +1,14 @@
#!/bin/bash
+if command -v python3 &> /dev/null; then
+ PYTHON_CMD=python3
+elif command -v python &> /dev/null && python --version 2>&1 | grep -qE "Python 3\."; then
+ PYTHON_CMD=python
+else
+ echo "Error: Python 3 is not installed or not found in PATH"
+ exit 1
+fi
+
USE_VENV=0
for arg in "$@"
@@ -13,13 +22,13 @@ do
done
if [ "$USE_VENV" -eq 1 ]; then
- python -m venv .venv
+ $PYTHON_CMD -m venv .venv
. .venv/bin/activate
fi
-pip install build
-python -m build --outdir dist .
-pip install dist/signplus_python-1.4.0-py3-none-any.whl --force-reinstall
+$PYTHON_CMD -m pip install build
+$PYTHON_CMD -m build --outdir dist .
+$PYTHON_CMD -m pip install dist/signplus_python-1.0.0-py3-none-any.whl --force-reinstall
if [ "$USE_VENV" -eq 1 ]; then
deactivate
diff --git a/prettier.config.js b/prettier.config.js
new file mode 100644
index 0000000..f68d86e
--- /dev/null
+++ b/prettier.config.js
@@ -0,0 +1,41 @@
+// Prettier configuration for code-formatter lambda
+// Aligned with sdk-gen/prettier.config.ts
+
+module.exports = {
+ printWidth: 100,
+ tabWidth: 2,
+ useTabs: false,
+ semi: true,
+ singleQuote: true,
+ quoteProps: 'as-needed',
+ jsxSingleQuote: false,
+ trailingComma: 'all',
+ bracketSpacing: true,
+ arrowParens: 'always',
+ overrides: [
+ {
+ files: '.editorconfig',
+ options: { parser: 'yaml' },
+ },
+ {
+ files: 'LICENSE',
+ options: { parser: 'markdown' },
+ },
+ {
+ files: '*.php',
+ options: {
+ parser: 'php',
+ phpVersion: '8.0',
+ trailingCommaPHP: false,
+ },
+ },
+ {
+ files: '*.md',
+ options: {
+ parser: 'markdown',
+ phpVersion: '8.0',
+ trailingCommaPHP: false,
+ },
+ },
+ ],
+};
diff --git a/pyproject.toml b/pyproject.toml
index b9e80d2..e3220d7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,11 +4,20 @@ build-backend = "setuptools.build_meta"
[project]
name = "signplus-python"
-version = "1.4.0"
+version = "1.0.0"
license = { text = "MIT" }
description = """Integrate legally-binding electronic signature to your workflow"""
readme = "PyPI_README.md"
requires-python = ">=3.9"
+classifiers = [
+ "Development Status :: 5 - Production/Stable",
+ "License :: OSI Approved :: MIT License",
+ "Topic :: Software Development"
+]
dependencies = [
- "requests>=2.31.0"
+ "requests>=2.31.0",
+ "pydantic>=2.0.0,<3.0.0"
]
+
+[project.urls]
+Repository = "https://github.com/alohihq/signplus-python"
diff --git a/src/signplus/models/__init__.py b/src/signplus/models/__init__.py
index 87b0beb..fca9ca2 100644
--- a/src/signplus/models/__init__.py
+++ b/src/signplus/models/__init__.py
@@ -1,75 +1,198 @@
-from .create_envelope_request import CreateEnvelopeRequest
-from .envelope import Envelope
-from .create_envelope_from_template_request import CreateEnvelopeFromTemplateRequest
-from .list_envelopes_request import ListEnvelopesRequest
-from .list_envelopes_response import ListEnvelopesResponse
-from .document import Document
-from .list_envelope_documents_response import ListEnvelopeDocumentsResponse
-from .add_envelope_document_request import AddEnvelopeDocumentRequest
-from .set_envelope_dynamic_fields_request import SetEnvelopeDynamicFieldsRequest
-from .add_envelope_signing_steps_request import AddEnvelopeSigningStepsRequest
-from .set_envelope_attachments_settings_request import (
- SetEnvelopeAttachmentsSettingsRequest,
+"""Lazy model exports.
+
+Names are resolved on first attribute access via PEP 562 ``__getattr__``,
+then cached in module globals. Avoids the multi-second eager-import cost
+on SDKs with thousands of generated models.
+"""
+
+import importlib
+
+_MODEL_TO_MODULE = {
+ "CreateEnvelopeRequest": "create_envelope_request",
+ "Envelope": "envelope",
+ "CreateEnvelopeFromTemplateRequest": "create_envelope_from_template_request",
+ "ListEnvelopesRequest": "list_envelopes_request",
+ "ListEnvelopesResponse": "list_envelopes_response",
+ "Document": "document",
+ "ListEnvelopeDocumentsResponse": "list_envelope_documents_response",
+ "AddEnvelopeDocumentRequest": "add_envelope_document_request",
+ "SetEnvelopeDynamicFieldsRequest": "set_envelope_dynamic_fields_request",
+ "AddEnvelopeSigningStepsRequest": "add_envelope_signing_steps_request",
+ "SetEnvelopeAttachmentsSettingsRequest": "set_envelope_attachments_settings_request",
+ "EnvelopeAttachments": "envelope_attachments",
+ "SetEnvelopeAttachmentsPlaceholdersRequest": "set_envelope_attachments_placeholders_request",
+ "RenameEnvelopeRequest": "rename_envelope_request",
+ "SetEnvelopeCommentRequest": "set_envelope_comment_request",
+ "EnvelopeNotification": "envelope_notification",
+ "SetEnvelopeExpirationRequest": "set_envelope_expiration_request",
+ "SetEnvelopeLegalityLevelRequest": "set_envelope_legality_level_request",
+ "Annotation": "annotation",
+ "ListEnvelopeDocumentAnnotationsResponse": "list_envelope_document_annotations_response",
+ "AddAnnotationRequest": "add_annotation_request",
+ "CreateTemplateRequest": "create_template_request",
+ "Template": "template",
+ "ListTemplatesRequest": "list_templates_request",
+ "ListTemplatesResponse": "list_templates_response",
+ "AddTemplateDocumentRequest": "add_template_document_request",
+ "ListTemplateDocumentsResponse": "list_template_documents_response",
+ "AddTemplateSigningStepsRequest": "add_template_signing_steps_request",
+ "RenameTemplateRequest": "rename_template_request",
+ "SetTemplateCommentRequest": "set_template_comment_request",
+ "ListTemplateAnnotationsResponse": "list_template_annotations_response",
+ "ListTemplateDocumentAnnotationsResponse": "list_template_document_annotations_response",
+ "CreateWebhookRequest": "create_webhook_request",
+ "Webhook": "webhook",
+ "ListWebhooksRequest": "list_webhooks_request",
+ "ListWebhooksResponse": "list_webhooks_response",
+ "EnvelopeLegalityLevel": "envelope_legality_level",
+ "EnvelopeFlowType": "envelope_flow_type",
+ "EnvelopeStatus": "envelope_status",
+ "SigningStep": "signing_step",
+ "Recipient": "recipient",
+ "RecipientRole": "recipient_role",
+ "RecipientVerification": "recipient_verification",
+ "RecipientVerificationType": "recipient_verification_type",
+ "Page": "page",
+ "AttachmentSettings": "attachment_settings",
+ "AttachmentPlaceholdersPerRecipient": "attachment_placeholders_per_recipient",
+ "AttachmentPlaceholder": "attachment_placeholder",
+ "AttachmentPlaceholderFile": "attachment_placeholder_file",
+ "EnvelopeOrderField": "envelope_order_field",
+ "DynamicField": "dynamic_field",
+ "AttachmentPlaceholderRequest": "attachment_placeholder_request",
+ "AnnotationType": "annotation_type",
+ "AnnotationSignature": "annotation_signature",
+ "AnnotationInitials": "annotation_initials",
+ "AnnotationText": "annotation_text",
+ "AnnotationDateTime": "annotation_date_time",
+ "AnnotationCheckbox": "annotation_checkbox",
+ "AnnotationFont": "annotation_font",
+ "AnnotationFontFamily": "annotation_font_family",
+ "AnnotationDateTimeFormat": "annotation_date_time_format",
+ "AnnotationCheckboxStyle": "annotation_checkbox_style",
+ "TemplateSigningStep": "template_signing_step",
+ "TemplateRecipient": "template_recipient",
+ "TemplateRecipientRole": "template_recipient_role",
+ "TemplateOrderField": "template_order_field",
+ "WebhookEvent": "webhook_event",
+}
+
+_REBUILD_NAMES = frozenset(
+ {
+ "CreateEnvelopeRequest",
+ "Envelope",
+ "CreateEnvelopeFromTemplateRequest",
+ "ListEnvelopesRequest",
+ "ListEnvelopesResponse",
+ "Document",
+ "ListEnvelopeDocumentsResponse",
+ "AddEnvelopeDocumentRequest",
+ "SetEnvelopeDynamicFieldsRequest",
+ "AddEnvelopeSigningStepsRequest",
+ "SetEnvelopeAttachmentsSettingsRequest",
+ "EnvelopeAttachments",
+ "SetEnvelopeAttachmentsPlaceholdersRequest",
+ "RenameEnvelopeRequest",
+ "SetEnvelopeCommentRequest",
+ "EnvelopeNotification",
+ "SetEnvelopeExpirationRequest",
+ "SetEnvelopeLegalityLevelRequest",
+ "Annotation",
+ "ListEnvelopeDocumentAnnotationsResponse",
+ "AddAnnotationRequest",
+ "CreateTemplateRequest",
+ "Template",
+ "ListTemplatesRequest",
+ "ListTemplatesResponse",
+ "AddTemplateDocumentRequest",
+ "ListTemplateDocumentsResponse",
+ "AddTemplateSigningStepsRequest",
+ "RenameTemplateRequest",
+ "SetTemplateCommentRequest",
+ "ListTemplateAnnotationsResponse",
+ "ListTemplateDocumentAnnotationsResponse",
+ "CreateWebhookRequest",
+ "Webhook",
+ "ListWebhooksRequest",
+ "ListWebhooksResponse",
+ "SigningStep",
+ "Recipient",
+ "RecipientVerification",
+ "Page",
+ "AttachmentSettings",
+ "AttachmentPlaceholdersPerRecipient",
+ "AttachmentPlaceholder",
+ "AttachmentPlaceholderFile",
+ "DynamicField",
+ "AttachmentPlaceholderRequest",
+ "AnnotationSignature",
+ "AnnotationInitials",
+ "AnnotationText",
+ "AnnotationDateTime",
+ "AnnotationCheckbox",
+ "AnnotationFont",
+ "TemplateSigningStep",
+ "TemplateRecipient",
+ }
)
-from .envelope_attachments import EnvelopeAttachments
-from .set_envelope_attachments_placeholders_request import (
- SetEnvelopeAttachmentsPlaceholdersRequest,
-)
-from .rename_envelope_request import RenameEnvelopeRequest
-from .set_envelope_comment_request import SetEnvelopeCommentRequest
-from .envelope_notification import EnvelopeNotification
-from .set_envelope_expiration_request import SetEnvelopeExpirationRequest
-from .set_envelope_legality_level_request import SetEnvelopeLegalityLevelRequest
-from .annotation import Annotation
-from .list_envelope_document_annotations_response import (
- ListEnvelopeDocumentAnnotationsResponse,
-)
-from .add_annotation_request import AddAnnotationRequest
-from .create_template_request import CreateTemplateRequest
-from .template import Template
-from .list_templates_request import ListTemplatesRequest
-from .list_templates_response import ListTemplatesResponse
-from .add_template_document_request import AddTemplateDocumentRequest
-from .list_template_documents_response import ListTemplateDocumentsResponse
-from .add_template_signing_steps_request import AddTemplateSigningStepsRequest
-from .rename_template_request import RenameTemplateRequest
-from .set_template_comment_request import SetTemplateCommentRequest
-from .list_template_annotations_response import ListTemplateAnnotationsResponse
-from .list_template_document_annotations_response import (
- ListTemplateDocumentAnnotationsResponse,
-)
-from .create_webhook_request import CreateWebhookRequest
-from .webhook import Webhook
-from .list_webhooks_request import ListWebhooksRequest
-from .list_webhooks_response import ListWebhooksResponse
-from .envelope_legality_level import EnvelopeLegalityLevel
-from .envelope_flow_type import EnvelopeFlowType
-from .envelope_status import EnvelopeStatus
-from .signing_step import SigningStep
-from .recipient import Recipient
-from .recipient_role import RecipientRole
-from .recipient_verification import RecipientVerification
-from .recipient_verification_type import RecipientVerificationType
-from .page import Page
-from .attachment_settings import AttachmentSettings
-from .attachment_placeholders_per_recipient import AttachmentPlaceholdersPerRecipient
-from .attachment_placeholder import AttachmentPlaceholder
-from .attachment_placeholder_file import AttachmentPlaceholderFile
-from .envelope_order_field import EnvelopeOrderField
-from .dynamic_field import DynamicField
-from .attachment_placeholder_request import AttachmentPlaceholderRequest
-from .annotation_type import AnnotationType
-from .annotation_signature import AnnotationSignature
-from .annotation_initials import AnnotationInitials
-from .annotation_text import AnnotationText
-from .annotation_date_time import AnnotationDateTime
-from .annotation_checkbox import AnnotationCheckbox
-from .annotation_font import AnnotationFont
-from .annotation_font_family import AnnotationFontFamily
-from .annotation_date_time_format import AnnotationDateTimeFormat
-from .annotation_checkbox_style import AnnotationCheckboxStyle
-from .template_signing_step import TemplateSigningStep
-from .template_recipient import TemplateRecipient
-from .template_recipient_role import TemplateRecipientRole
-from .template_order_field import TemplateOrderField
-from .webhook_event import WebhookEvent
+
+__all__ = list(_MODEL_TO_MODULE.keys())
+
+_rebuilt = False
+
+
+def _load(name):
+ module = _MODEL_TO_MODULE.get(name)
+ if module is None:
+ return None
+ obj = getattr(importlib.import_module("." + module, __name__), name)
+ globals()[name] = obj
+ return obj
+
+
+def _ensure_rebuilt():
+ """Resolve forward refs across every BaseModel in one batched pass.
+
+ Individual model files import their cross-references inside a
+ ``TYPE_CHECKING`` block, so at runtime each file's globals contain
+ only itself. ``model_rebuild()`` walks the call stack to find
+ forward-ref names — calling it from this module once every
+ BaseModel has been loaded into our globals is what lets pydantic
+ resolve circular refs (the same shape the prior eager-import form
+ relied on). Enums, Union types, and error models stay lazy.
+ """
+ global _rebuilt
+ if _rebuilt:
+ return
+ _rebuilt = True
+ for name in _REBUILD_NAMES:
+ if name not in globals():
+ try:
+ _load(name)
+ except Exception:
+ pass
+ ns = globals()
+ for name in _REBUILD_NAMES:
+ cls = ns.get(name)
+ if cls is None:
+ continue
+ try:
+ # _types_namespace is mandatory: pydantic resolves forward refs
+ # against caller-frame locals by default, but we're calling from
+ # inside a helper — the names live in this module's globals.
+ cls.model_rebuild(_types_namespace=ns)
+ except Exception:
+ pass
+
+
+def __getattr__(name):
+ if name not in _MODEL_TO_MODULE:
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
+ obj = _load(name)
+ if name in _REBUILD_NAMES:
+ _ensure_rebuilt()
+ return obj
+
+
+def __dir__():
+ return sorted(set(globals()).union(_MODEL_TO_MODULE))
diff --git a/src/signplus/models/add_annotation_request.py b/src/signplus/models/add_annotation_request.py
index 2a6c4c8..c75197c 100644
--- a/src/signplus/models/add_annotation_request.py
+++ b/src/signplus/models/add_annotation_request.py
@@ -1,7 +1,8 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_type import AnnotationType
from .annotation_signature import AnnotationSignature
from .annotation_initials import AnnotationInitials
@@ -10,7 +11,6 @@
from .annotation_checkbox import AnnotationCheckbox
-@JsonMap({"type_": "type", "datetime_": "datetime"})
class AddAnnotationRequest(BaseModel):
"""AddAnnotationRequest
@@ -44,74 +44,43 @@ class AddAnnotationRequest(BaseModel):
:type checkbox: AnnotationCheckbox, optional
"""
- def __init__(
- self,
- document_id: str,
- page: int,
- x: float,
- y: float,
- width: float,
- height: float,
- type_: AnnotationType,
- recipient_id: str = SENTINEL,
- required: bool = SENTINEL,
- signature: AnnotationSignature = SENTINEL,
- initials: AnnotationInitials = SENTINEL,
- text: AnnotationText = SENTINEL,
- datetime_: AnnotationDateTime = SENTINEL,
- checkbox: AnnotationCheckbox = SENTINEL,
- **kwargs,
- ):
- """AddAnnotationRequest
-
- :param recipient_id: ID of the recipient, defaults to None
- :type recipient_id: str, optional
- :param document_id: ID of the document
- :type document_id: str
- :param page: Page number where the annotation is placed
- :type page: int
- :param x: X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner
- :type x: float
- :param y: Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner
- :type y: float
- :param width: Width of the annotation (in % of the page width from 0 to 100)
- :type width: float
- :param height: Height of the annotation (in % of the page height from 0 to 100)
- :type height: float
- :param required: required, defaults to None
- :type required: bool, optional
- :param type_: Type of the annotation
- :type type_: AnnotationType
- :param signature: Signature annotation (null if annotation is not a signature), defaults to None
- :type signature: AnnotationSignature, optional
- :param initials: Initials annotation (null if annotation is not initials), defaults to None
- :type initials: AnnotationInitials, optional
- :param text: Text annotation (null if annotation is not a text), defaults to None
- :type text: AnnotationText, optional
- :param datetime_: Date annotation (null if annotation is not a date), defaults to None
- :type datetime_: AnnotationDateTime, optional
- :param checkbox: Checkbox annotation (null if annotation is not a checkbox), defaults to None
- :type checkbox: AnnotationCheckbox, optional
- """
- if recipient_id is not SENTINEL:
- self.recipient_id = recipient_id
- self.document_id = document_id
- self.page = page
- self.x = x
- self.y = y
- self.width = width
- self.height = height
- if required is not SENTINEL:
- self.required = required
- self.type_ = self._enum_matching(type_, AnnotationType.list(), "type_")
- if signature is not SENTINEL:
- self.signature = self._define_object(signature, AnnotationSignature)
- if initials is not SENTINEL:
- self.initials = self._define_object(initials, AnnotationInitials)
- if text is not SENTINEL:
- self.text = self._define_object(text, AnnotationText)
- if datetime_ is not SENTINEL:
- self.datetime_ = self._define_object(datetime_, AnnotationDateTime)
- if checkbox is not SENTINEL:
- self.checkbox = self._define_object(checkbox, AnnotationCheckbox)
- self._kwargs = kwargs
+ recipient_id: Optional[str] = Field(default=None, description="ID of the recipient")
+ document_id: str = Field(description="ID of the document")
+ page: int = Field(description="Page number where the annotation is placed")
+ x: float = Field(
+ description="X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner"
+ )
+ y: float = Field(
+ description="Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner"
+ )
+ width: float = Field(
+ description="Width of the annotation (in % of the page width from 0 to 100)"
+ )
+ height: float = Field(
+ description="Height of the annotation (in % of the page height from 0 to 100)"
+ )
+ required: Optional[bool] = Field(default=None)
+ type_: AnnotationType = Field(
+ alias="type", serialization_alias="type", description="Type of the annotation"
+ )
+ signature: Optional[AnnotationSignature] = Field(
+ default=None,
+ description="Signature annotation (null if annotation is not a signature)",
+ )
+ initials: Optional[AnnotationInitials] = Field(
+ default=None,
+ description="Initials annotation (null if annotation is not initials)",
+ )
+ text: Optional[AnnotationText] = Field(
+ default=None, description="Text annotation (null if annotation is not a text)"
+ )
+ datetime_: Optional[AnnotationDateTime] = Field(
+ alias="datetime",
+ serialization_alias="datetime",
+ default=None,
+ description="Date annotation (null if annotation is not a date)",
+ )
+ checkbox: Optional[AnnotationCheckbox] = Field(
+ default=None,
+ description="Checkbox annotation (null if annotation is not a checkbox)",
+ )
diff --git a/src/signplus/models/add_envelope_document_request.py b/src/signplus/models/add_envelope_document_request.py
index 90962a7..30f2aac 100644
--- a/src/signplus/models/add_envelope_document_request.py
+++ b/src/signplus/models/add_envelope_document_request.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class AddEnvelopeDocumentRequest(BaseModel):
"""AddEnvelopeDocumentRequest
@@ -11,12 +12,6 @@ class AddEnvelopeDocumentRequest(BaseModel):
:type file: bytes, optional
"""
- def __init__(self, file: bytes = SENTINEL, **kwargs):
- """AddEnvelopeDocumentRequest
-
- :param file: File to upload in binary format, defaults to None
- :type file: bytes, optional
- """
- if file is not SENTINEL:
- self.file = file
- self._kwargs = kwargs
+ file: Optional[bytes] = Field(
+ default=None, description="File to upload in binary format"
+ )
diff --git a/src/signplus/models/add_envelope_signing_steps_request.py b/src/signplus/models/add_envelope_signing_steps_request.py
index e5641f9..2438c9d 100644
--- a/src/signplus/models/add_envelope_signing_steps_request.py
+++ b/src/signplus/models/add_envelope_signing_steps_request.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .signing_step import SigningStep
-@JsonMap({})
class AddEnvelopeSigningStepsRequest(BaseModel):
"""AddEnvelopeSigningStepsRequest
@@ -14,12 +14,6 @@ class AddEnvelopeSigningStepsRequest(BaseModel):
:type signing_steps: List[SigningStep], optional
"""
- def __init__(self, signing_steps: List[SigningStep] = SENTINEL, **kwargs):
- """AddEnvelopeSigningStepsRequest
-
- :param signing_steps: List of signing steps, defaults to None
- :type signing_steps: List[SigningStep], optional
- """
- if signing_steps is not SENTINEL:
- self.signing_steps = self._define_list(signing_steps, SigningStep)
- self._kwargs = kwargs
+ signing_steps: Optional[List[SigningStep]] = Field(
+ default=None, description="List of signing steps"
+ )
diff --git a/src/signplus/models/add_template_document_request.py b/src/signplus/models/add_template_document_request.py
index 2210283..a085e40 100644
--- a/src/signplus/models/add_template_document_request.py
+++ b/src/signplus/models/add_template_document_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class AddTemplateDocumentRequest(BaseModel):
"""AddTemplateDocumentRequest
@@ -10,11 +12,4 @@ class AddTemplateDocumentRequest(BaseModel):
:type file: bytes
"""
- def __init__(self, file: bytes, **kwargs):
- """AddTemplateDocumentRequest
-
- :param file: File to upload in binary format
- :type file: bytes
- """
- self.file = file
- self._kwargs = kwargs
+ file: bytes = Field(description="File to upload in binary format")
diff --git a/src/signplus/models/add_template_signing_steps_request.py b/src/signplus/models/add_template_signing_steps_request.py
index 6a87d7e..93a08d1 100644
--- a/src/signplus/models/add_template_signing_steps_request.py
+++ b/src/signplus/models/add_template_signing_steps_request.py
@@ -1,11 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
from .template_signing_step import TemplateSigningStep
-@JsonMap({})
class AddTemplateSigningStepsRequest(BaseModel):
"""AddTemplateSigningStepsRequest
@@ -13,11 +14,6 @@ class AddTemplateSigningStepsRequest(BaseModel):
:type signing_steps: List[TemplateSigningStep]
"""
- def __init__(self, signing_steps: List[TemplateSigningStep], **kwargs):
- """AddTemplateSigningStepsRequest
-
- :param signing_steps: List of signing steps
- :type signing_steps: List[TemplateSigningStep]
- """
- self.signing_steps = self._define_list(signing_steps, TemplateSigningStep)
- self._kwargs = kwargs
+ signing_steps: List[TemplateSigningStep] = Field(
+ description="List of signing steps"
+ )
diff --git a/src/signplus/models/annotation.py b/src/signplus/models/annotation.py
index 28efc86..d30cbc5 100644
--- a/src/signplus/models/annotation.py
+++ b/src/signplus/models/annotation.py
@@ -1,7 +1,8 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_type import AnnotationType
from .annotation_signature import AnnotationSignature
from .annotation_initials import AnnotationInitials
@@ -10,7 +11,6 @@
from .annotation_checkbox import AnnotationCheckbox
-@JsonMap({"id_": "id", "type_": "type", "datetime_": "datetime"})
class Annotation(BaseModel):
"""Annotation
@@ -46,86 +46,60 @@ class Annotation(BaseModel):
:type checkbox: AnnotationCheckbox, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- recipient_id: str = SENTINEL,
- document_id: str = SENTINEL,
- page: int = SENTINEL,
- x: float = SENTINEL,
- y: float = SENTINEL,
- width: float = SENTINEL,
- height: float = SENTINEL,
- required: bool = SENTINEL,
- type_: AnnotationType = SENTINEL,
- signature: AnnotationSignature = SENTINEL,
- initials: AnnotationInitials = SENTINEL,
- text: AnnotationText = SENTINEL,
- datetime_: AnnotationDateTime = SENTINEL,
- checkbox: AnnotationCheckbox = SENTINEL,
- **kwargs,
- ):
- """Annotation
-
- :param id_: Unique identifier of the annotation, defaults to None
- :type id_: str, optional
- :param recipient_id: ID of the recipient, defaults to None
- :type recipient_id: str, optional
- :param document_id: ID of the document, defaults to None
- :type document_id: str, optional
- :param page: Page number where the annotation is placed, defaults to None
- :type page: int, optional
- :param x: X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner, defaults to None
- :type x: float, optional
- :param y: Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner, defaults to None
- :type y: float, optional
- :param width: Width of the annotation (in % of the page width from 0 to 100), defaults to None
- :type width: float, optional
- :param height: Height of the annotation (in % of the page height from 0 to 100), defaults to None
- :type height: float, optional
- :param required: Whether the annotation is required, defaults to None
- :type required: bool, optional
- :param type_: Type of the annotation, defaults to None
- :type type_: AnnotationType, optional
- :param signature: Signature annotation (null if annotation is not a signature), defaults to None
- :type signature: AnnotationSignature, optional
- :param initials: Initials annotation (null if annotation is not initials), defaults to None
- :type initials: AnnotationInitials, optional
- :param text: Text annotation (null if annotation is not a text), defaults to None
- :type text: AnnotationText, optional
- :param datetime_: Date annotation (null if annotation is not a date), defaults to None
- :type datetime_: AnnotationDateTime, optional
- :param checkbox: Checkbox annotation (null if annotation is not a checkbox), defaults to None
- :type checkbox: AnnotationCheckbox, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if recipient_id is not SENTINEL:
- self.recipient_id = recipient_id
- if document_id is not SENTINEL:
- self.document_id = document_id
- if page is not SENTINEL:
- self.page = page
- if x is not SENTINEL:
- self.x = x
- if y is not SENTINEL:
- self.y = y
- if width is not SENTINEL:
- self.width = width
- if height is not SENTINEL:
- self.height = height
- if required is not SENTINEL:
- self.required = required
- if type_ is not SENTINEL:
- self.type_ = self._enum_matching(type_, AnnotationType.list(), "type_")
- if signature is not SENTINEL:
- self.signature = self._define_object(signature, AnnotationSignature)
- if initials is not SENTINEL:
- self.initials = self._define_object(initials, AnnotationInitials)
- if text is not SENTINEL:
- self.text = self._define_object(text, AnnotationText)
- if datetime_ is not SENTINEL:
- self.datetime_ = self._define_object(datetime_, AnnotationDateTime)
- if checkbox is not SENTINEL:
- self.checkbox = self._define_object(checkbox, AnnotationCheckbox)
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the annotation",
+ )
+ recipient_id: Optional[str] = Field(default=None, description="ID of the recipient")
+ document_id: Optional[str] = Field(default=None, description="ID of the document")
+ page: Optional[int] = Field(
+ default=None, description="Page number where the annotation is placed"
+ )
+ x: Optional[float] = Field(
+ default=None,
+ description="X coordinate of the annotation (in % of the page width from 0 to 100) from the top left corner",
+ )
+ y: Optional[float] = Field(
+ default=None,
+ description="Y coordinate of the annotation (in % of the page height from 0 to 100) from the top left corner",
+ )
+ width: Optional[float] = Field(
+ default=None,
+ description="Width of the annotation (in % of the page width from 0 to 100)",
+ )
+ height: Optional[float] = Field(
+ default=None,
+ description="Height of the annotation (in % of the page height from 0 to 100)",
+ )
+ required: Optional[bool] = Field(
+ default=None, description="Whether the annotation is required"
+ )
+ type_: Optional[AnnotationType] = Field(
+ alias="type",
+ serialization_alias="type",
+ default=None,
+ description="Type of the annotation",
+ )
+ signature: Optional[AnnotationSignature] = Field(
+ default=None,
+ description="Signature annotation (null if annotation is not a signature)",
+ )
+ initials: Optional[AnnotationInitials] = Field(
+ default=None,
+ description="Initials annotation (null if annotation is not initials)",
+ )
+ text: Optional[AnnotationText] = Field(
+ default=None, description="Text annotation (null if annotation is not a text)"
+ )
+ datetime_: Optional[AnnotationDateTime] = Field(
+ alias="datetime",
+ serialization_alias="datetime",
+ default=None,
+ description="Date annotation (null if annotation is not a date)",
+ )
+ checkbox: Optional[AnnotationCheckbox] = Field(
+ default=None,
+ description="Checkbox annotation (null if annotation is not a checkbox)",
+ )
diff --git a/src/signplus/models/annotation_checkbox.py b/src/signplus/models/annotation_checkbox.py
index 65a797b..e952b60 100644
--- a/src/signplus/models/annotation_checkbox.py
+++ b/src/signplus/models/annotation_checkbox.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_checkbox_style import AnnotationCheckboxStyle
-@JsonMap({})
class AnnotationCheckbox(BaseModel):
"""Checkbox annotation (null if annotation is not a checkbox)
@@ -15,23 +15,9 @@ class AnnotationCheckbox(BaseModel):
:type style: AnnotationCheckboxStyle, optional
"""
- def __init__(
- self,
- checked: bool = SENTINEL,
- style: AnnotationCheckboxStyle = SENTINEL,
- **kwargs,
- ):
- """Checkbox annotation (null if annotation is not a checkbox)
-
- :param checked: Whether the checkbox is checked, defaults to None
- :type checked: bool, optional
- :param style: Style of the checkbox, defaults to None
- :type style: AnnotationCheckboxStyle, optional
- """
- if checked is not SENTINEL:
- self.checked = checked
- if style is not SENTINEL:
- self.style = self._enum_matching(
- style, AnnotationCheckboxStyle.list(), "style"
- )
- self._kwargs = kwargs
+ checked: Optional[bool] = Field(
+ default=None, description="Whether the checkbox is checked"
+ )
+ style: Optional[AnnotationCheckboxStyle] = Field(
+ default=None, description="Style of the checkbox"
+ )
diff --git a/src/signplus/models/annotation_checkbox_style.py b/src/signplus/models/annotation_checkbox_style.py
index d8e388b..ae02b2b 100644
--- a/src/signplus/models/annotation_checkbox_style.py
+++ b/src/signplus/models/annotation_checkbox_style.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class AnnotationCheckboxStyle(Enum):
+class AnnotationCheckboxStyle(str, Enum):
"""An enumeration representing different categories.
:cvar CIRCLECHECK: "CIRCLE_CHECK"
@@ -25,10 +27,11 @@ class AnnotationCheckboxStyle(Enum):
CHECKMARK = "CHECK_MARK"
TIMESSQUARE = "TIMES_SQUARE"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(
diff --git a/src/signplus/models/annotation_date_time.py b/src/signplus/models/annotation_date_time.py
index e5550c3..9e81a5e 100644
--- a/src/signplus/models/annotation_date_time.py
+++ b/src/signplus/models/annotation_date_time.py
@@ -1,12 +1,12 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_font import AnnotationFont
from .annotation_date_time_format import AnnotationDateTimeFormat
-@JsonMap({})
class AnnotationDateTime(BaseModel):
"""Date annotation (null if annotation is not a date)
@@ -26,48 +26,21 @@ class AnnotationDateTime(BaseModel):
:type format: AnnotationDateTimeFormat, optional
"""
- def __init__(
- self,
- size: float = SENTINEL,
- font: AnnotationFont = SENTINEL,
- color: str = SENTINEL,
- auto_fill: bool = SENTINEL,
- timezone: str = SENTINEL,
- timestamp: int = SENTINEL,
- format: AnnotationDateTimeFormat = SENTINEL,
- **kwargs,
- ):
- """Date annotation (null if annotation is not a date)
-
- :param size: Font size of the text in pt, defaults to None
- :type size: float, optional
- :param font: font, defaults to None
- :type font: AnnotationFont, optional
- :param color: Color of the text in hex format, defaults to None
- :type color: str, optional
- :param auto_fill: Whether the date should be automatically filled, defaults to None
- :type auto_fill: bool, optional
- :param timezone: Timezone of the date, defaults to None
- :type timezone: str, optional
- :param timestamp: Unix timestamp of the date, defaults to None
- :type timestamp: int, optional
- :param format: Format of the date time (DMY_NUMERIC_SLASH is day/month/year with slashes, MDY_NUMERIC_SLASH is month/day/year with slashes, YMD_NUMERIC_SLASH is year/month/day with slashes, DMY_NUMERIC_DASH_SHORT is day/month/year with dashes, DMY_NUMERIC_DASH is day/month/year with dashes, YMD_NUMERIC_DASH is year/month/day with dashes, MDY_TEXT_DASH_SHORT is month/day/year with dashes, MDY_TEXT_SPACE_SHORT is month/day/year with spaces, MDY_TEXT_SPACE is month/day/year with spaces), defaults to None
- :type format: AnnotationDateTimeFormat, optional
- """
- if size is not SENTINEL:
- self.size = size
- if font is not SENTINEL:
- self.font = self._define_object(font, AnnotationFont)
- if color is not SENTINEL:
- self.color = color
- if auto_fill is not SENTINEL:
- self.auto_fill = auto_fill
- if timezone is not SENTINEL:
- self.timezone = timezone
- if timestamp is not SENTINEL:
- self.timestamp = timestamp
- if format is not SENTINEL:
- self.format = self._enum_matching(
- format, AnnotationDateTimeFormat.list(), "format"
- )
- self._kwargs = kwargs
+ size: Optional[float] = Field(
+ default=None, description="Font size of the text in pt"
+ )
+ font: Optional[AnnotationFont] = Field(default=None)
+ color: Optional[str] = Field(
+ default=None, description="Color of the text in hex format"
+ )
+ auto_fill: Optional[bool] = Field(
+ default=None, description="Whether the date should be automatically filled"
+ )
+ timezone: Optional[str] = Field(default=None, description="Timezone of the date")
+ timestamp: Optional[int] = Field(
+ default=None, description="Unix timestamp of the date"
+ )
+ format: Optional[AnnotationDateTimeFormat] = Field(
+ default=None,
+ description="Format of the date time (DMY_NUMERIC_SLASH is day/month/year with slashes, MDY_NUMERIC_SLASH is month/day/year with slashes, YMD_NUMERIC_SLASH is year/month/day with slashes, DMY_NUMERIC_DASH_SHORT is day/month/year with dashes, DMY_NUMERIC_DASH is day/month/year with dashes, YMD_NUMERIC_DASH is year/month/day with dashes, MDY_TEXT_DASH_SHORT is month/day/year with dashes, MDY_TEXT_SPACE_SHORT is month/day/year with spaces, MDY_TEXT_SPACE is month/day/year with spaces)",
+ )
diff --git a/src/signplus/models/annotation_date_time_format.py b/src/signplus/models/annotation_date_time_format.py
index 686f366..d423040 100644
--- a/src/signplus/models/annotation_date_time_format.py
+++ b/src/signplus/models/annotation_date_time_format.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class AnnotationDateTimeFormat(Enum):
+class AnnotationDateTimeFormat(str, Enum):
"""An enumeration representing different categories.
:cvar DMYNUMERICSLASH: "DMY_NUMERIC_SLASH"
@@ -34,10 +36,11 @@ class AnnotationDateTimeFormat(Enum):
MDYTEXTSPACESHORT = "MDY_TEXT_SPACE_SHORT"
MDYTEXTSPACE = "MDY_TEXT_SPACE"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(
diff --git a/src/signplus/models/annotation_font.py b/src/signplus/models/annotation_font.py
index f1e9c76..731ab7e 100644
--- a/src/signplus/models/annotation_font.py
+++ b/src/signplus/models/annotation_font.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_font_family import AnnotationFontFamily
-@JsonMap({})
class AnnotationFont(BaseModel):
"""AnnotationFont
@@ -17,28 +17,10 @@ class AnnotationFont(BaseModel):
:type bold: bool, optional
"""
- def __init__(
- self,
- family: AnnotationFontFamily = SENTINEL,
- italic: bool = SENTINEL,
- bold: bool = SENTINEL,
- **kwargs,
- ):
- """AnnotationFont
-
- :param family: Font family of the text, defaults to None
- :type family: AnnotationFontFamily, optional
- :param italic: Whether the text is italic, defaults to None
- :type italic: bool, optional
- :param bold: Whether the text is bold, defaults to None
- :type bold: bool, optional
- """
- if family is not SENTINEL:
- self.family = self._enum_matching(
- family, AnnotationFontFamily.list(), "family"
- )
- if italic is not SENTINEL:
- self.italic = italic
- if bold is not SENTINEL:
- self.bold = bold
- self._kwargs = kwargs
+ family: Optional[AnnotationFontFamily] = Field(
+ default=None, description="Font family of the text"
+ )
+ italic: Optional[bool] = Field(
+ default=None, description="Whether the text is italic"
+ )
+ bold: Optional[bool] = Field(default=None, description="Whether the text is bold")
diff --git a/src/signplus/models/annotation_font_family.py b/src/signplus/models/annotation_font_family.py
index cd21ac3..a2d1280 100644
--- a/src/signplus/models/annotation_font_family.py
+++ b/src/signplus/models/annotation_font_family.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class AnnotationFontFamily(Enum):
+class AnnotationFontFamily(str, Enum):
"""An enumeration representing different categories.
:cvar UNKNOWN: "UNKNOWN"
@@ -19,10 +21,11 @@ class AnnotationFontFamily(Enum):
SANS = "SANS"
MONO = "MONO"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, AnnotationFontFamily._member_map_.values()))
diff --git a/src/signplus/models/annotation_initials.py b/src/signplus/models/annotation_initials.py
index 4136e13..7a6aacf 100644
--- a/src/signplus/models/annotation_initials.py
+++ b/src/signplus/models/annotation_initials.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({"id_": "id"})
class AnnotationInitials(BaseModel):
"""Initials annotation (null if annotation is not initials)
@@ -11,12 +12,9 @@ class AnnotationInitials(BaseModel):
:type id_: str, optional
"""
- def __init__(self, id_: str = SENTINEL, **kwargs):
- """Initials annotation (null if annotation is not initials)
-
- :param id_: Unique identifier of the annotation initials, defaults to None
- :type id_: str, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the annotation initials",
+ )
diff --git a/src/signplus/models/annotation_signature.py b/src/signplus/models/annotation_signature.py
index be2e2a1..a0a7ecc 100644
--- a/src/signplus/models/annotation_signature.py
+++ b/src/signplus/models/annotation_signature.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({"id_": "id"})
class AnnotationSignature(BaseModel):
"""Signature annotation (null if annotation is not a signature)
@@ -11,12 +12,9 @@ class AnnotationSignature(BaseModel):
:type id_: str, optional
"""
- def __init__(self, id_: str = SENTINEL, **kwargs):
- """Signature annotation (null if annotation is not a signature)
-
- :param id_: Unique identifier of the annotation signature, defaults to None
- :type id_: str, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the annotation signature",
+ )
diff --git a/src/signplus/models/annotation_text.py b/src/signplus/models/annotation_text.py
index a95e00b..71c6c8e 100644
--- a/src/signplus/models/annotation_text.py
+++ b/src/signplus/models/annotation_text.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation_font import AnnotationFont
-@JsonMap({})
class AnnotationText(BaseModel):
"""Text annotation (null if annotation is not a text)
@@ -23,41 +23,19 @@ class AnnotationText(BaseModel):
:type font: AnnotationFont, optional
"""
- def __init__(
- self,
- size: float = SENTINEL,
- color: float = SENTINEL,
- value: str = SENTINEL,
- tooltip: str = SENTINEL,
- dynamic_field_name: str = SENTINEL,
- font: AnnotationFont = SENTINEL,
- **kwargs,
- ):
- """Text annotation (null if annotation is not a text)
-
- :param size: Font size of the text in pt, defaults to None
- :type size: float, optional
- :param color: Text color in 32bit representation, defaults to None
- :type color: float, optional
- :param value: Text content of the annotation, defaults to None
- :type value: str, optional
- :param tooltip: Tooltip of the annotation, defaults to None
- :type tooltip: str, optional
- :param dynamic_field_name: Name of the dynamic field, defaults to None
- :type dynamic_field_name: str, optional
- :param font: font, defaults to None
- :type font: AnnotationFont, optional
- """
- if size is not SENTINEL:
- self.size = size
- if color is not SENTINEL:
- self.color = color
- if value is not SENTINEL:
- self.value = value
- if tooltip is not SENTINEL:
- self.tooltip = tooltip
- if dynamic_field_name is not SENTINEL:
- self.dynamic_field_name = dynamic_field_name
- if font is not SENTINEL:
- self.font = self._define_object(font, AnnotationFont)
- self._kwargs = kwargs
+ size: Optional[float] = Field(
+ default=None, description="Font size of the text in pt"
+ )
+ color: Optional[float] = Field(
+ default=None, description="Text color in 32bit representation"
+ )
+ value: Optional[str] = Field(
+ default=None, description="Text content of the annotation"
+ )
+ tooltip: Optional[str] = Field(
+ default=None, description="Tooltip of the annotation"
+ )
+ dynamic_field_name: Optional[str] = Field(
+ default=None, description="Name of the dynamic field"
+ )
+ font: Optional[AnnotationFont] = Field(default=None)
diff --git a/src/signplus/models/annotation_type.py b/src/signplus/models/annotation_type.py
index f375433..b8c0b0e 100644
--- a/src/signplus/models/annotation_type.py
+++ b/src/signplus/models/annotation_type.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class AnnotationType(Enum):
+class AnnotationType(str, Enum):
"""An enumeration representing different categories.
:cvar TEXT: "TEXT"
@@ -22,10 +24,11 @@ class AnnotationType(Enum):
CHECKBOX = "CHECKBOX"
DATE = "DATE"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, AnnotationType._member_map_.values()))
diff --git a/src/signplus/models/attachment_placeholder.py b/src/signplus/models/attachment_placeholder.py
index f798ca8..c3d5f61 100644
--- a/src/signplus/models/attachment_placeholder.py
+++ b/src/signplus/models/attachment_placeholder.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .attachment_placeholder_file import AttachmentPlaceholderFile
-@JsonMap({"id_": "id"})
class AttachmentPlaceholder(BaseModel):
"""AttachmentPlaceholder
@@ -26,46 +26,24 @@ class AttachmentPlaceholder(BaseModel):
:type files: List[AttachmentPlaceholderFile], optional
"""
- def __init__(
- self,
- recipient_id: str = SENTINEL,
- id_: str = SENTINEL,
- name: str = SENTINEL,
- hint: str = SENTINEL,
- required: bool = SENTINEL,
- multiple: bool = SENTINEL,
- files: List[AttachmentPlaceholderFile] = SENTINEL,
- **kwargs,
- ):
- """AttachmentPlaceholder
-
- :param recipient_id: ID of the recipient, defaults to None
- :type recipient_id: str, optional
- :param id_: ID of the attachment placeholder, defaults to None
- :type id_: str, optional
- :param name: Name of the attachment placeholder, defaults to None
- :type name: str, optional
- :param hint: Hint of the attachment placeholder, defaults to None
- :type hint: str, optional
- :param required: Whether the attachment placeholder is required, defaults to None
- :type required: bool, optional
- :param multiple: Whether the attachment placeholder can have multiple files, defaults to None
- :type multiple: bool, optional
- :param files: files, defaults to None
- :type files: List[AttachmentPlaceholderFile], optional
- """
- if recipient_id is not SENTINEL:
- self.recipient_id = recipient_id
- if id_ is not SENTINEL:
- self.id_ = id_
- if name is not SENTINEL:
- self.name = name
- if hint is not SENTINEL:
- self.hint = hint
- if required is not SENTINEL:
- self.required = required
- if multiple is not SENTINEL:
- self.multiple = multiple
- if files is not SENTINEL:
- self.files = self._define_list(files, AttachmentPlaceholderFile)
- self._kwargs = kwargs
+ recipient_id: Optional[str] = Field(default=None, description="ID of the recipient")
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="ID of the attachment placeholder",
+ )
+ name: Optional[str] = Field(
+ default=None, description="Name of the attachment placeholder"
+ )
+ hint: Optional[str] = Field(
+ default=None, description="Hint of the attachment placeholder"
+ )
+ required: Optional[bool] = Field(
+ default=None, description="Whether the attachment placeholder is required"
+ )
+ multiple: Optional[bool] = Field(
+ default=None,
+ description="Whether the attachment placeholder can have multiple files",
+ )
+ files: Optional[List[AttachmentPlaceholderFile]] = Field(default=None)
diff --git a/src/signplus/models/attachment_placeholder_file.py b/src/signplus/models/attachment_placeholder_file.py
index 301da0e..75aa91e 100644
--- a/src/signplus/models/attachment_placeholder_file.py
+++ b/src/signplus/models/attachment_placeholder_file.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({"id_": "id"})
class AttachmentPlaceholderFile(BaseModel):
"""AttachmentPlaceholderFile
@@ -17,31 +18,9 @@ class AttachmentPlaceholderFile(BaseModel):
:type mimetype: str, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- name: str = SENTINEL,
- size: int = SENTINEL,
- mimetype: str = SENTINEL,
- **kwargs
- ):
- """AttachmentPlaceholderFile
-
- :param id_: ID of the file, defaults to None
- :type id_: str, optional
- :param name: Name of the file, defaults to None
- :type name: str, optional
- :param size: Size of the file in bytes, defaults to None
- :type size: int, optional
- :param mimetype: MIME type of the file, defaults to None
- :type mimetype: str, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if name is not SENTINEL:
- self.name = name
- if size is not SENTINEL:
- self.size = size
- if mimetype is not SENTINEL:
- self.mimetype = mimetype
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id", serialization_alias="id", default=None, description="ID of the file"
+ )
+ name: Optional[str] = Field(default=None, description="Name of the file")
+ size: Optional[int] = Field(default=None, description="Size of the file in bytes")
+ mimetype: Optional[str] = Field(default=None, description="MIME type of the file")
diff --git a/src/signplus/models/attachment_placeholder_request.py b/src/signplus/models/attachment_placeholder_request.py
index abf1d7e..161dcb0 100644
--- a/src/signplus/models/attachment_placeholder_request.py
+++ b/src/signplus/models/attachment_placeholder_request.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({"id_": "id"})
class AttachmentPlaceholderRequest(BaseModel):
"""AttachmentPlaceholderRequest
@@ -21,37 +22,16 @@ class AttachmentPlaceholderRequest(BaseModel):
:type multiple: bool
"""
- def __init__(
- self,
- recipient_id: str,
- name: str,
- required: bool,
- multiple: bool,
- id_: str = SENTINEL,
- hint: str = SENTINEL,
- **kwargs
- ):
- """AttachmentPlaceholderRequest
-
- :param recipient_id: ID of the recipient
- :type recipient_id: str
- :param id_: ID of the attachment placeholder, defaults to None
- :type id_: str, optional
- :param name: name
- :type name: str
- :param hint: Hint of the attachment placeholder, defaults to None
- :type hint: str, optional
- :param required: Whether the attachment placeholder is required
- :type required: bool
- :param multiple: multiple
- :type multiple: bool
- """
- self.recipient_id = recipient_id
- if id_ is not SENTINEL:
- self.id_ = id_
- self.name = name
- if hint is not SENTINEL:
- self.hint = hint
- self.required = required
- self.multiple = multiple
- self._kwargs = kwargs
+ recipient_id: str = Field(description="ID of the recipient")
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="ID of the attachment placeholder",
+ )
+ name: str
+ hint: Optional[str] = Field(
+ default=None, description="Hint of the attachment placeholder"
+ )
+ required: bool = Field(description="Whether the attachment placeholder is required")
+ multiple: bool
diff --git a/src/signplus/models/attachment_placeholders_per_recipient.py b/src/signplus/models/attachment_placeholders_per_recipient.py
index 68292e0..a050b8f 100644
--- a/src/signplus/models/attachment_placeholders_per_recipient.py
+++ b/src/signplus/models/attachment_placeholders_per_recipient.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .attachment_placeholder import AttachmentPlaceholder
-@JsonMap({})
class AttachmentPlaceholdersPerRecipient(BaseModel):
"""AttachmentPlaceholdersPerRecipient
@@ -18,26 +18,8 @@ class AttachmentPlaceholdersPerRecipient(BaseModel):
:type placeholders: List[AttachmentPlaceholder], optional
"""
- def __init__(
- self,
- recipient_id: str = SENTINEL,
- recipient_name: str = SENTINEL,
- placeholders: List[AttachmentPlaceholder] = SENTINEL,
- **kwargs,
- ):
- """AttachmentPlaceholdersPerRecipient
-
- :param recipient_id: ID of the recipient, defaults to None
- :type recipient_id: str, optional
- :param recipient_name: Name of the recipient, defaults to None
- :type recipient_name: str, optional
- :param placeholders: placeholders, defaults to None
- :type placeholders: List[AttachmentPlaceholder], optional
- """
- if recipient_id is not SENTINEL:
- self.recipient_id = recipient_id
- if recipient_name is not SENTINEL:
- self.recipient_name = recipient_name
- if placeholders is not SENTINEL:
- self.placeholders = self._define_list(placeholders, AttachmentPlaceholder)
- self._kwargs = kwargs
+ recipient_id: Optional[str] = Field(default=None, description="ID of the recipient")
+ recipient_name: Optional[str] = Field(
+ default=None, description="Name of the recipient"
+ )
+ placeholders: Optional[List[AttachmentPlaceholder]] = Field(default=None)
diff --git a/src/signplus/models/attachment_settings.py b/src/signplus/models/attachment_settings.py
index 78b886c..6f94b80 100644
--- a/src/signplus/models/attachment_settings.py
+++ b/src/signplus/models/attachment_settings.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class AttachmentSettings(BaseModel):
"""AttachmentSettings
@@ -11,12 +12,6 @@ class AttachmentSettings(BaseModel):
:type visible_to_recipients: bool, optional
"""
- def __init__(self, visible_to_recipients: bool = SENTINEL, **kwargs):
- """AttachmentSettings
-
- :param visible_to_recipients: Whether the attachment is visible to the recipients, defaults to None
- :type visible_to_recipients: bool, optional
- """
- if visible_to_recipients is not SENTINEL:
- self.visible_to_recipients = visible_to_recipients
- self._kwargs = kwargs
+ visible_to_recipients: Optional[bool] = Field(
+ default=None, description="Whether the attachment is visible to the recipients"
+ )
diff --git a/src/signplus/models/create_envelope_from_template_request.py b/src/signplus/models/create_envelope_from_template_request.py
index 98b825b..ebc4b42 100644
--- a/src/signplus/models/create_envelope_from_template_request.py
+++ b/src/signplus/models/create_envelope_from_template_request.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class CreateEnvelopeFromTemplateRequest(BaseModel):
"""CreateEnvelopeFromTemplateRequest
@@ -15,27 +16,13 @@ class CreateEnvelopeFromTemplateRequest(BaseModel):
:type sandbox: bool, optional
"""
- def __init__(
- self, name: str, comment: str = SENTINEL, sandbox: bool = SENTINEL, **kwargs
- ):
- """CreateEnvelopeFromTemplateRequest
-
- :param name: Name of the envelope
- :type name: str
- :param comment: Comment for the envelope, defaults to None
- :type comment: str, optional
- :param sandbox: Whether the envelope is created in sandbox mode, defaults to None
- :type sandbox: bool, optional
- """
- self.name = self._define_str(
- "name",
- name,
- pattern="^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$",
- min_length=2,
- max_length=256,
- )
- if comment is not SENTINEL:
- self.comment = comment
- if sandbox is not SENTINEL:
- self.sandbox = sandbox
- self._kwargs = kwargs
+ name: str = Field(
+ description="Name of the envelope",
+ pattern=r"^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$",
+ min_length=2,
+ max_length=256,
+ )
+ comment: Optional[str] = Field(default=None, description="Comment for the envelope")
+ sandbox: Optional[bool] = Field(
+ default=None, description="Whether the envelope is created in sandbox mode"
+ )
diff --git a/src/signplus/models/create_envelope_request.py b/src/signplus/models/create_envelope_request.py
index 05f5e83..261d0bd 100644
--- a/src/signplus/models/create_envelope_request.py
+++ b/src/signplus/models/create_envelope_request.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope_legality_level import EnvelopeLegalityLevel
-@JsonMap({})
class CreateEnvelopeRequest(BaseModel):
"""CreateEnvelopeRequest
@@ -21,42 +21,19 @@ class CreateEnvelopeRequest(BaseModel):
:type sandbox: bool, optional
"""
- def __init__(
- self,
- name: str,
- legality_level: EnvelopeLegalityLevel,
- expires_at: int = SENTINEL,
- comment: str = SENTINEL,
- sandbox: bool = SENTINEL,
- **kwargs,
- ):
- """CreateEnvelopeRequest
-
- :param name: Name of the envelope
- :type name: str
- :param legality_level: Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes)
- :type legality_level: EnvelopeLegalityLevel
- :param expires_at: Unix timestamp of the expiration date, defaults to None
- :type expires_at: int, optional
- :param comment: Comment for the envelope, defaults to None
- :type comment: str, optional
- :param sandbox: Whether the envelope is created in sandbox mode, defaults to None
- :type sandbox: bool, optional
- """
- self.name = self._define_str(
- "name",
- name,
- pattern="^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$",
- min_length=2,
- max_length=256,
- )
- self.legality_level = self._enum_matching(
- legality_level, EnvelopeLegalityLevel.list(), "legality_level"
- )
- if expires_at is not SENTINEL:
- self.expires_at = expires_at
- if comment is not SENTINEL:
- self.comment = comment
- if sandbox is not SENTINEL:
- self.sandbox = sandbox
- self._kwargs = kwargs
+ name: str = Field(
+ description="Name of the envelope",
+ pattern=r"^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$",
+ min_length=2,
+ max_length=256,
+ )
+ legality_level: EnvelopeLegalityLevel = Field(
+ description="Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes)"
+ )
+ expires_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the expiration date"
+ )
+ comment: Optional[str] = Field(default=None, description="Comment for the envelope")
+ sandbox: Optional[bool] = Field(
+ default=None, description="Whether the envelope is created in sandbox mode"
+ )
diff --git a/src/signplus/models/create_template_request.py b/src/signplus/models/create_template_request.py
index 1f0b710..466d1c1 100644
--- a/src/signplus/models/create_template_request.py
+++ b/src/signplus/models/create_template_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class CreateTemplateRequest(BaseModel):
"""CreateTemplateRequest
@@ -10,17 +12,6 @@ class CreateTemplateRequest(BaseModel):
:type name: str
"""
- def __init__(self, name: str, **kwargs):
- """CreateTemplateRequest
-
- :param name: name
- :type name: str
- """
- self.name = self._define_str(
- "name",
- name,
- pattern="^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$",
- min_length=2,
- max_length=256,
- )
- self._kwargs = kwargs
+ name: str = Field(
+ pattern=r"^[a-zA-Z0-9][a-zA-Z0-9 ]*[a-zA-Z0-9]$", min_length=2, max_length=256
+ )
diff --git a/src/signplus/models/create_webhook_request.py b/src/signplus/models/create_webhook_request.py
index fa43dcf..9645abd 100644
--- a/src/signplus/models/create_webhook_request.py
+++ b/src/signplus/models/create_webhook_request.py
@@ -1,10 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
from .webhook_event import WebhookEvent
-@JsonMap({})
class CreateWebhookRequest(BaseModel):
"""CreateWebhookRequest
@@ -14,14 +15,5 @@ class CreateWebhookRequest(BaseModel):
:type target: str
"""
- def __init__(self, event: WebhookEvent, target: str, **kwargs):
- """CreateWebhookRequest
-
- :param event: Event of the webhook
- :type event: WebhookEvent
- :param target: URL of the webhook target
- :type target: str
- """
- self.event = self._enum_matching(event, WebhookEvent.list(), "event")
- self.target = target
- self._kwargs = kwargs
+ event: WebhookEvent = Field(description="Event of the webhook")
+ target: str = Field(description="URL of the webhook target")
diff --git a/src/signplus/models/document.py b/src/signplus/models/document.py
index 45d5940..ea3c241 100644
--- a/src/signplus/models/document.py
+++ b/src/signplus/models/document.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .page import Page
-@JsonMap({"id_": "id"})
class Document(BaseModel):
"""Document
@@ -22,36 +22,19 @@ class Document(BaseModel):
:type pages: List[Page], optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- name: str = SENTINEL,
- filename: str = SENTINEL,
- page_count: int = SENTINEL,
- pages: List[Page] = SENTINEL,
- **kwargs,
- ):
- """Document
-
- :param id_: Unique identifier of the document, defaults to None
- :type id_: str, optional
- :param name: Name of the document, defaults to None
- :type name: str, optional
- :param filename: Filename of the document, defaults to None
- :type filename: str, optional
- :param page_count: Number of pages in the document, defaults to None
- :type page_count: int, optional
- :param pages: List of pages in the document, defaults to None
- :type pages: List[Page], optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if name is not SENTINEL:
- self.name = name
- if filename is not SENTINEL:
- self.filename = filename
- if page_count is not SENTINEL:
- self.page_count = page_count
- if pages is not SENTINEL:
- self.pages = self._define_list(pages, Page)
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the document",
+ )
+ name: Optional[str] = Field(default=None, description="Name of the document")
+ filename: Optional[str] = Field(
+ default=None, description="Filename of the document"
+ )
+ page_count: Optional[int] = Field(
+ default=None, description="Number of pages in the document"
+ )
+ pages: Optional[List[Page]] = Field(
+ default=None, description="List of pages in the document"
+ )
diff --git a/src/signplus/models/dynamic_field.py b/src/signplus/models/dynamic_field.py
index e02ea86..668ad93 100644
--- a/src/signplus/models/dynamic_field.py
+++ b/src/signplus/models/dynamic_field.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class DynamicField(BaseModel):
"""DynamicField
@@ -13,16 +14,5 @@ class DynamicField(BaseModel):
:type value: str, optional
"""
- def __init__(self, name: str = SENTINEL, value: str = SENTINEL, **kwargs):
- """DynamicField
-
- :param name: Name of the dynamic field, defaults to None
- :type name: str, optional
- :param value: Value of the dynamic field, defaults to None
- :type value: str, optional
- """
- if name is not SENTINEL:
- self.name = name
- if value is not SENTINEL:
- self.value = value
- self._kwargs = kwargs
+ name: Optional[str] = Field(default=None, description="Name of the dynamic field")
+ value: Optional[str] = Field(default=None, description="Value of the dynamic field")
diff --git a/src/signplus/models/envelope.py b/src/signplus/models/envelope.py
index 6faa4bb..eea75d9 100644
--- a/src/signplus/models/envelope.py
+++ b/src/signplus/models/envelope.py
@@ -1,8 +1,9 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope_flow_type import EnvelopeFlowType
from .envelope_legality_level import EnvelopeLegalityLevel
from .envelope_status import EnvelopeStatus
@@ -12,7 +13,6 @@
from .envelope_attachments import EnvelopeAttachments
-@JsonMap({"id_": "id"})
class Envelope(BaseModel):
"""Envelope
@@ -50,95 +50,44 @@ class Envelope(BaseModel):
:type attachments: EnvelopeAttachments, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- name: str = SENTINEL,
- comment: str = SENTINEL,
- pages: int = SENTINEL,
- flow_type: EnvelopeFlowType = SENTINEL,
- legality_level: EnvelopeLegalityLevel = SENTINEL,
- status: EnvelopeStatus = SENTINEL,
- created_at: int = SENTINEL,
- updated_at: int = SENTINEL,
- expires_at: int = SENTINEL,
- num_recipients: int = SENTINEL,
- is_duplicable: bool = SENTINEL,
- signing_steps: List[SigningStep] = SENTINEL,
- documents: List[Document] = SENTINEL,
- notification: EnvelopeNotification = SENTINEL,
- attachments: EnvelopeAttachments = SENTINEL,
- **kwargs,
- ):
- """Envelope
-
- :param id_: Unique identifier of the envelope, defaults to None
- :type id_: str, optional
- :param name: Name of the envelope, defaults to None
- :type name: str, optional
- :param comment: Comment for the envelope, defaults to None
- :type comment: str, optional
- :param pages: Total number of pages in the envelope, defaults to None
- :type pages: int, optional
- :param flow_type: Flow type of the envelope (REQUEST_SIGNATURE is a request for signature, SIGN_MYSELF is a self-signing flow), defaults to None
- :type flow_type: EnvelopeFlowType, optional
- :param legality_level: Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes), defaults to None
- :type legality_level: EnvelopeLegalityLevel, optional
- :param status: Status of the envelope, defaults to None
- :type status: EnvelopeStatus, optional
- :param created_at: Unix timestamp of the creation date, defaults to None
- :type created_at: int, optional
- :param updated_at: Unix timestamp of the last modification date, defaults to None
- :type updated_at: int, optional
- :param expires_at: Unix timestamp of the expiration date, defaults to None
- :type expires_at: int, optional
- :param num_recipients: Number of recipients in the envelope, defaults to None
- :type num_recipients: int, optional
- :param is_duplicable: Whether the envelope can be duplicated, defaults to None
- :type is_duplicable: bool, optional
- :param signing_steps: signing_steps, defaults to None
- :type signing_steps: List[SigningStep], optional
- :param documents: documents, defaults to None
- :type documents: List[Document], optional
- :param notification: notification, defaults to None
- :type notification: EnvelopeNotification, optional
- :param attachments: attachments, defaults to None
- :type attachments: EnvelopeAttachments, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if name is not SENTINEL:
- self.name = name
- if comment is not SENTINEL:
- self.comment = comment
- if pages is not SENTINEL:
- self.pages = pages
- if flow_type is not SENTINEL:
- self.flow_type = self._enum_matching(
- flow_type, EnvelopeFlowType.list(), "flow_type"
- )
- if legality_level is not SENTINEL:
- self.legality_level = self._enum_matching(
- legality_level, EnvelopeLegalityLevel.list(), "legality_level"
- )
- if status is not SENTINEL:
- self.status = self._enum_matching(status, EnvelopeStatus.list(), "status")
- if created_at is not SENTINEL:
- self.created_at = created_at
- if updated_at is not SENTINEL:
- self.updated_at = updated_at
- if expires_at is not SENTINEL:
- self.expires_at = expires_at
- if num_recipients is not SENTINEL:
- self.num_recipients = num_recipients
- if is_duplicable is not SENTINEL:
- self.is_duplicable = is_duplicable
- if signing_steps is not SENTINEL:
- self.signing_steps = self._define_list(signing_steps, SigningStep)
- if documents is not SENTINEL:
- self.documents = self._define_list(documents, Document)
- if notification is not SENTINEL:
- self.notification = self._define_object(notification, EnvelopeNotification)
- if attachments is not SENTINEL:
- self.attachments = self._define_object(attachments, EnvelopeAttachments)
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the envelope",
+ )
+ name: Optional[str] = Field(default=None, description="Name of the envelope")
+ comment: Optional[str] = Field(default=None, description="Comment for the envelope")
+ pages: Optional[int] = Field(
+ default=None, description="Total number of pages in the envelope"
+ )
+ flow_type: Optional[EnvelopeFlowType] = Field(
+ default=None,
+ description="Flow type of the envelope (REQUEST_SIGNATURE is a request for signature, SIGN_MYSELF is a self-signing flow)",
+ )
+ legality_level: Optional[EnvelopeLegalityLevel] = Field(
+ default=None,
+ description="Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes)",
+ )
+ status: Optional[EnvelopeStatus] = Field(
+ default=None, description="Status of the envelope"
+ )
+ created_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the creation date"
+ )
+ updated_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the last modification date"
+ )
+ expires_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the expiration date"
+ )
+ num_recipients: Optional[int] = Field(
+ default=None, description="Number of recipients in the envelope"
+ )
+ is_duplicable: Optional[bool] = Field(
+ default=None, description="Whether the envelope can be duplicated"
+ )
+ signing_steps: Optional[List[SigningStep]] = Field(default=None)
+ documents: Optional[List[Document]] = Field(default=None)
+ notification: Optional[EnvelopeNotification] = Field(default=None)
+ attachments: Optional[EnvelopeAttachments] = Field(default=None)
diff --git a/src/signplus/models/envelope_attachments.py b/src/signplus/models/envelope_attachments.py
index bb4ea2e..94acbab 100644
--- a/src/signplus/models/envelope_attachments.py
+++ b/src/signplus/models/envelope_attachments.py
@@ -1,13 +1,13 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .attachment_settings import AttachmentSettings
from .attachment_placeholders_per_recipient import AttachmentPlaceholdersPerRecipient
-@JsonMap({})
class EnvelopeAttachments(BaseModel):
"""EnvelopeAttachments
@@ -17,23 +17,5 @@ class EnvelopeAttachments(BaseModel):
:type recipients: List[AttachmentPlaceholdersPerRecipient], optional
"""
- def __init__(
- self,
- settings: AttachmentSettings = SENTINEL,
- recipients: List[AttachmentPlaceholdersPerRecipient] = SENTINEL,
- **kwargs,
- ):
- """EnvelopeAttachments
-
- :param settings: settings, defaults to None
- :type settings: AttachmentSettings, optional
- :param recipients: recipients, defaults to None
- :type recipients: List[AttachmentPlaceholdersPerRecipient], optional
- """
- if settings is not SENTINEL:
- self.settings = self._define_object(settings, AttachmentSettings)
- if recipients is not SENTINEL:
- self.recipients = self._define_list(
- recipients, AttachmentPlaceholdersPerRecipient
- )
- self._kwargs = kwargs
+ settings: Optional[AttachmentSettings] = Field(default=None)
+ recipients: Optional[List[AttachmentPlaceholdersPerRecipient]] = Field(default=None)
diff --git a/src/signplus/models/envelope_flow_type.py b/src/signplus/models/envelope_flow_type.py
index eea3b4d..f00bf28 100644
--- a/src/signplus/models/envelope_flow_type.py
+++ b/src/signplus/models/envelope_flow_type.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class EnvelopeFlowType(Enum):
+class EnvelopeFlowType(str, Enum):
"""An enumeration representing different categories.
:cvar REQUESTSIGNATURE: "REQUEST_SIGNATURE"
@@ -13,10 +15,11 @@ class EnvelopeFlowType(Enum):
REQUESTSIGNATURE = "REQUEST_SIGNATURE"
SIGNMYSELF = "SIGN_MYSELF"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, EnvelopeFlowType._member_map_.values()))
diff --git a/src/signplus/models/envelope_legality_level.py b/src/signplus/models/envelope_legality_level.py
index dfb57e5..f7cbaef 100644
--- a/src/signplus/models/envelope_legality_level.py
+++ b/src/signplus/models/envelope_legality_level.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class EnvelopeLegalityLevel(Enum):
+class EnvelopeLegalityLevel(str, Enum):
"""An enumeration representing different categories.
:cvar SES: "SES"
@@ -16,10 +18,11 @@ class EnvelopeLegalityLevel(Enum):
QESEIDAS = "QES_EIDAS"
QESZERTES = "QES_ZERTES"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, EnvelopeLegalityLevel._member_map_.values()))
diff --git a/src/signplus/models/envelope_notification.py b/src/signplus/models/envelope_notification.py
index 58fb406..6c59d09 100644
--- a/src/signplus/models/envelope_notification.py
+++ b/src/signplus/models/envelope_notification.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class EnvelopeNotification(BaseModel):
"""EnvelopeNotification
@@ -15,26 +16,12 @@ class EnvelopeNotification(BaseModel):
:type reminder_interval: int, optional
"""
- def __init__(
- self,
- subject: str = SENTINEL,
- message: str = SENTINEL,
- reminder_interval: int = SENTINEL,
- **kwargs
- ):
- """EnvelopeNotification
-
- :param subject: Subject of the notification, defaults to None
- :type subject: str, optional
- :param message: Message of the notification, defaults to None
- :type message: str, optional
- :param reminder_interval: Interval in days to send reminder, defaults to None
- :type reminder_interval: int, optional
- """
- if subject is not SENTINEL:
- self.subject = subject
- if message is not SENTINEL:
- self.message = message
- if reminder_interval is not SENTINEL:
- self.reminder_interval = reminder_interval
- self._kwargs = kwargs
+ subject: Optional[str] = Field(
+ default=None, description="Subject of the notification"
+ )
+ message: Optional[str] = Field(
+ default=None, description="Message of the notification"
+ )
+ reminder_interval: Optional[int] = Field(
+ default=None, description="Interval in days to send reminder"
+ )
diff --git a/src/signplus/models/envelope_order_field.py b/src/signplus/models/envelope_order_field.py
index 11f6b0b..1c14a42 100644
--- a/src/signplus/models/envelope_order_field.py
+++ b/src/signplus/models/envelope_order_field.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class EnvelopeOrderField(Enum):
+class EnvelopeOrderField(str, Enum):
"""An enumeration representing different categories.
:cvar CREATIONDATE: "CREATION_DATE"
@@ -22,10 +24,11 @@ class EnvelopeOrderField(Enum):
STATUS = "STATUS"
LASTDOCUMENTCHANGE = "LAST_DOCUMENT_CHANGE"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, EnvelopeOrderField._member_map_.values()))
diff --git a/src/signplus/models/envelope_status.py b/src/signplus/models/envelope_status.py
index 93c98d3..7a34ae3 100644
--- a/src/signplus/models/envelope_status.py
+++ b/src/signplus/models/envelope_status.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class EnvelopeStatus(Enum):
+class EnvelopeStatus(str, Enum):
"""An enumeration representing different categories.
:cvar DRAFT: "DRAFT"
@@ -28,10 +30,11 @@ class EnvelopeStatus(Enum):
VOIDED = "VOIDED"
PENDING = "PENDING"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, EnvelopeStatus._member_map_.values()))
diff --git a/src/signplus/models/list_envelope_document_annotations_response.py b/src/signplus/models/list_envelope_document_annotations_response.py
index 2b05e6d..8b56ea7 100644
--- a/src/signplus/models/list_envelope_document_annotations_response.py
+++ b/src/signplus/models/list_envelope_document_annotations_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation import Annotation
-@JsonMap({})
class ListEnvelopeDocumentAnnotationsResponse(BaseModel):
"""ListEnvelopeDocumentAnnotationsResponse
@@ -14,12 +14,4 @@ class ListEnvelopeDocumentAnnotationsResponse(BaseModel):
:type annotations: List[Annotation], optional
"""
- def __init__(self, annotations: List[Annotation] = SENTINEL, **kwargs):
- """ListEnvelopeDocumentAnnotationsResponse
-
- :param annotations: annotations, defaults to None
- :type annotations: List[Annotation], optional
- """
- if annotations is not SENTINEL:
- self.annotations = self._define_list(annotations, Annotation)
- self._kwargs = kwargs
+ annotations: Optional[List[Annotation]] = Field(default=None)
diff --git a/src/signplus/models/list_envelope_documents_response.py b/src/signplus/models/list_envelope_documents_response.py
index b0a4e0b..c659cc2 100644
--- a/src/signplus/models/list_envelope_documents_response.py
+++ b/src/signplus/models/list_envelope_documents_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .document import Document
-@JsonMap({})
class ListEnvelopeDocumentsResponse(BaseModel):
"""ListEnvelopeDocumentsResponse
@@ -14,12 +14,4 @@ class ListEnvelopeDocumentsResponse(BaseModel):
:type documents: List[Document], optional
"""
- def __init__(self, documents: List[Document] = SENTINEL, **kwargs):
- """ListEnvelopeDocumentsResponse
-
- :param documents: documents, defaults to None
- :type documents: List[Document], optional
- """
- if documents is not SENTINEL:
- self.documents = self._define_list(documents, Document)
- self._kwargs = kwargs
+ documents: Optional[List[Document]] = Field(default=None)
diff --git a/src/signplus/models/list_envelopes_request.py b/src/signplus/models/list_envelopes_request.py
index d06292a..e26d181 100644
--- a/src/signplus/models/list_envelopes_request.py
+++ b/src/signplus/models/list_envelopes_request.py
@@ -1,13 +1,13 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope_status import EnvelopeStatus
from .envelope_order_field import EnvelopeOrderField
-@JsonMap({})
class ListEnvelopesRequest(BaseModel):
"""ListEnvelopesRequest
@@ -47,98 +47,38 @@ class ListEnvelopesRequest(BaseModel):
:type include_trash: bool, optional
"""
- def __init__(
- self,
- name: str = SENTINEL,
- tags: List[str] = SENTINEL,
- comment: str = SENTINEL,
- ids: List[str] = SENTINEL,
- statuses: List[EnvelopeStatus] = SENTINEL,
- folder_ids: List[str] = SENTINEL,
- only_root_folder: bool = SENTINEL,
- date_from: int = SENTINEL,
- date_to: int = SENTINEL,
- uid: str = SENTINEL,
- first: int = SENTINEL,
- last: int = SENTINEL,
- after: str = SENTINEL,
- before: str = SENTINEL,
- order_field: EnvelopeOrderField = SENTINEL,
- ascending: bool = SENTINEL,
- include_trash: bool = SENTINEL,
- **kwargs,
- ):
- """ListEnvelopesRequest
-
- :param name: Name of the envelope, defaults to None
- :type name: str, optional
- :param tags: List of tags, defaults to None
- :type tags: List[str], optional
- :param comment: Comment of the envelope, defaults to None
- :type comment: str, optional
- :param ids: List of envelope IDs, defaults to None
- :type ids: List[str], optional
- :param statuses: List of envelope statuses, defaults to None
- :type statuses: List[EnvelopeStatus], optional
- :param folder_ids: List of folder IDs, defaults to None
- :type folder_ids: List[str], optional
- :param only_root_folder: Whether to only list envelopes in the root folder, defaults to None
- :type only_root_folder: bool, optional
- :param date_from: Unix timestamp of the start date, defaults to None
- :type date_from: int, optional
- :param date_to: Unix timestamp of the end date, defaults to None
- :type date_to: int, optional
- :param uid: Unique identifier of the user, defaults to None
- :type uid: str, optional
- :param first: first, defaults to None
- :type first: int, optional
- :param last: last, defaults to None
- :type last: int, optional
- :param after: after, defaults to None
- :type after: str, optional
- :param before: before, defaults to None
- :type before: str, optional
- :param order_field: Field to order envelopes by, defaults to None
- :type order_field: EnvelopeOrderField, optional
- :param ascending: Whether to order envelopes in ascending order, defaults to None
- :type ascending: bool, optional
- :param include_trash: Whether to include envelopes in the trash, defaults to None
- :type include_trash: bool, optional
- """
- if name is not SENTINEL:
- self.name = name
- if tags is not SENTINEL:
- self.tags = tags
- if comment is not SENTINEL:
- self.comment = comment
- if ids is not SENTINEL:
- self.ids = ids
- if statuses is not SENTINEL:
- self.statuses = self._define_list(statuses, EnvelopeStatus)
- if folder_ids is not SENTINEL:
- self.folder_ids = folder_ids
- if only_root_folder is not SENTINEL:
- self.only_root_folder = only_root_folder
- if date_from is not SENTINEL:
- self.date_from = date_from
- if date_to is not SENTINEL:
- self.date_to = date_to
- if uid is not SENTINEL:
- self.uid = uid
- if first is not SENTINEL:
- self.first = first
- if last is not SENTINEL:
- self.last = last
- if after is not SENTINEL:
- self.after = after
- if before is not SENTINEL:
- self.before = before
- if order_field is not SENTINEL:
- self.order_field = self._enum_matching(
- order_field, EnvelopeOrderField.list(), "order_field"
- )
- if ascending is not SENTINEL:
- self.ascending = ascending
- if include_trash is not SENTINEL:
- self.include_trash = include_trash
- self._kwargs = kwargs
+ name: Optional[str] = Field(default=None, description="Name of the envelope")
+ tags: Optional[List[str]] = Field(default=None, description="List of tags")
+ comment: Optional[str] = Field(default=None, description="Comment of the envelope")
+ ids: Optional[List[str]] = Field(default=None, description="List of envelope IDs")
+ statuses: Optional[List[EnvelopeStatus]] = Field(
+ default=None, description="List of envelope statuses"
+ )
+ folder_ids: Optional[List[str]] = Field(
+ default=None, description="List of folder IDs"
+ )
+ only_root_folder: Optional[bool] = Field(
+ default=None, description="Whether to only list envelopes in the root folder"
+ )
+ date_from: Optional[int] = Field(
+ default=None, description="Unix timestamp of the start date"
+ )
+ date_to: Optional[int] = Field(
+ default=None, description="Unix timestamp of the end date"
+ )
+ uid: Optional[str] = Field(
+ default=None, description="Unique identifier of the user"
+ )
+ first: Optional[int] = Field(default=None)
+ last: Optional[int] = Field(default=None)
+ after: Optional[str] = Field(default=None)
+ before: Optional[str] = Field(default=None)
+ order_field: Optional[EnvelopeOrderField] = Field(
+ default=None, description="Field to order envelopes by"
+ )
+ ascending: Optional[bool] = Field(
+ default=None, description="Whether to order envelopes in ascending order"
+ )
+ include_trash: Optional[bool] = Field(
+ default=None, description="Whether to include envelopes in the trash"
+ )
diff --git a/src/signplus/models/list_envelopes_response.py b/src/signplus/models/list_envelopes_response.py
index 48d8d92..cbfb35b 100644
--- a/src/signplus/models/list_envelopes_response.py
+++ b/src/signplus/models/list_envelopes_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope import Envelope
-@JsonMap({})
class ListEnvelopesResponse(BaseModel):
"""ListEnvelopesResponse
@@ -18,26 +18,10 @@ class ListEnvelopesResponse(BaseModel):
:type envelopes: List[Envelope], optional
"""
- def __init__(
- self,
- has_next_page: bool = SENTINEL,
- has_previous_page: bool = SENTINEL,
- envelopes: List[Envelope] = SENTINEL,
- **kwargs,
- ):
- """ListEnvelopesResponse
-
- :param has_next_page: Whether there is a next page, defaults to None
- :type has_next_page: bool, optional
- :param has_previous_page: Whether there is a previous page, defaults to None
- :type has_previous_page: bool, optional
- :param envelopes: envelopes, defaults to None
- :type envelopes: List[Envelope], optional
- """
- if has_next_page is not SENTINEL:
- self.has_next_page = has_next_page
- if has_previous_page is not SENTINEL:
- self.has_previous_page = has_previous_page
- if envelopes is not SENTINEL:
- self.envelopes = self._define_list(envelopes, Envelope)
- self._kwargs = kwargs
+ has_next_page: Optional[bool] = Field(
+ default=None, description="Whether there is a next page"
+ )
+ has_previous_page: Optional[bool] = Field(
+ default=None, description="Whether there is a previous page"
+ )
+ envelopes: Optional[List[Envelope]] = Field(default=None)
diff --git a/src/signplus/models/list_template_annotations_response.py b/src/signplus/models/list_template_annotations_response.py
index 9639320..b0edaa8 100644
--- a/src/signplus/models/list_template_annotations_response.py
+++ b/src/signplus/models/list_template_annotations_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation import Annotation
-@JsonMap({})
class ListTemplateAnnotationsResponse(BaseModel):
"""ListTemplateAnnotationsResponse
@@ -14,12 +14,4 @@ class ListTemplateAnnotationsResponse(BaseModel):
:type annotations: List[Annotation], optional
"""
- def __init__(self, annotations: List[Annotation] = SENTINEL, **kwargs):
- """ListTemplateAnnotationsResponse
-
- :param annotations: annotations, defaults to None
- :type annotations: List[Annotation], optional
- """
- if annotations is not SENTINEL:
- self.annotations = self._define_list(annotations, Annotation)
- self._kwargs = kwargs
+ annotations: Optional[List[Annotation]] = Field(default=None)
diff --git a/src/signplus/models/list_template_document_annotations_response.py b/src/signplus/models/list_template_document_annotations_response.py
index 99ab9f5..579b590 100644
--- a/src/signplus/models/list_template_document_annotations_response.py
+++ b/src/signplus/models/list_template_document_annotations_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .annotation import Annotation
-@JsonMap({})
class ListTemplateDocumentAnnotationsResponse(BaseModel):
"""ListTemplateDocumentAnnotationsResponse
@@ -14,12 +14,4 @@ class ListTemplateDocumentAnnotationsResponse(BaseModel):
:type annotations: List[Annotation], optional
"""
- def __init__(self, annotations: List[Annotation] = SENTINEL, **kwargs):
- """ListTemplateDocumentAnnotationsResponse
-
- :param annotations: annotations, defaults to None
- :type annotations: List[Annotation], optional
- """
- if annotations is not SENTINEL:
- self.annotations = self._define_list(annotations, Annotation)
- self._kwargs = kwargs
+ annotations: Optional[List[Annotation]] = Field(default=None)
diff --git a/src/signplus/models/list_template_documents_response.py b/src/signplus/models/list_template_documents_response.py
index 8470562..1110465 100644
--- a/src/signplus/models/list_template_documents_response.py
+++ b/src/signplus/models/list_template_documents_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .document import Document
-@JsonMap({})
class ListTemplateDocumentsResponse(BaseModel):
"""ListTemplateDocumentsResponse
@@ -14,12 +14,4 @@ class ListTemplateDocumentsResponse(BaseModel):
:type documents: List[Document], optional
"""
- def __init__(self, documents: List[Document] = SENTINEL, **kwargs):
- """ListTemplateDocumentsResponse
-
- :param documents: documents, defaults to None
- :type documents: List[Document], optional
- """
- if documents is not SENTINEL:
- self.documents = self._define_list(documents, Document)
- self._kwargs = kwargs
+ documents: Optional[List[Document]] = Field(default=None)
diff --git a/src/signplus/models/list_templates_request.py b/src/signplus/models/list_templates_request.py
index b1c448a..2ccc59e 100644
--- a/src/signplus/models/list_templates_request.py
+++ b/src/signplus/models/list_templates_request.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .template_order_field import TemplateOrderField
-@JsonMap({})
class ListTemplatesRequest(BaseModel):
"""ListTemplatesRequest
@@ -30,58 +30,16 @@ class ListTemplatesRequest(BaseModel):
:type ascending: bool, optional
"""
- def __init__(
- self,
- name: str = SENTINEL,
- tags: List[str] = SENTINEL,
- ids: List[str] = SENTINEL,
- first: int = SENTINEL,
- last: int = SENTINEL,
- after: str = SENTINEL,
- before: str = SENTINEL,
- order_field: TemplateOrderField = SENTINEL,
- ascending: bool = SENTINEL,
- **kwargs,
- ):
- """ListTemplatesRequest
-
- :param name: Name of the template, defaults to None
- :type name: str, optional
- :param tags: List of tag templates, defaults to None
- :type tags: List[str], optional
- :param ids: List of templates IDs, defaults to None
- :type ids: List[str], optional
- :param first: first, defaults to None
- :type first: int, optional
- :param last: last, defaults to None
- :type last: int, optional
- :param after: after, defaults to None
- :type after: str, optional
- :param before: before, defaults to None
- :type before: str, optional
- :param order_field: Field to order templates by, defaults to None
- :type order_field: TemplateOrderField, optional
- :param ascending: Whether to order templates in ascending order, defaults to None
- :type ascending: bool, optional
- """
- if name is not SENTINEL:
- self.name = name
- if tags is not SENTINEL:
- self.tags = tags
- if ids is not SENTINEL:
- self.ids = ids
- if first is not SENTINEL:
- self.first = first
- if last is not SENTINEL:
- self.last = last
- if after is not SENTINEL:
- self.after = after
- if before is not SENTINEL:
- self.before = before
- if order_field is not SENTINEL:
- self.order_field = self._enum_matching(
- order_field, TemplateOrderField.list(), "order_field"
- )
- if ascending is not SENTINEL:
- self.ascending = ascending
- self._kwargs = kwargs
+ name: Optional[str] = Field(default=None, description="Name of the template")
+ tags: Optional[List[str]] = Field(default=None, description="List of tag templates")
+ ids: Optional[List[str]] = Field(default=None, description="List of templates IDs")
+ first: Optional[int] = Field(default=None)
+ last: Optional[int] = Field(default=None)
+ after: Optional[str] = Field(default=None)
+ before: Optional[str] = Field(default=None)
+ order_field: Optional[TemplateOrderField] = Field(
+ default=None, description="Field to order templates by"
+ )
+ ascending: Optional[bool] = Field(
+ default=None, description="Whether to order templates in ascending order"
+ )
diff --git a/src/signplus/models/list_templates_response.py b/src/signplus/models/list_templates_response.py
index b5d5550..dcb670c 100644
--- a/src/signplus/models/list_templates_response.py
+++ b/src/signplus/models/list_templates_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .template import Template
-@JsonMap({})
class ListTemplatesResponse(BaseModel):
"""ListTemplatesResponse
@@ -18,26 +18,10 @@ class ListTemplatesResponse(BaseModel):
:type templates: List[Template], optional
"""
- def __init__(
- self,
- has_next_page: bool = SENTINEL,
- has_previous_page: bool = SENTINEL,
- templates: List[Template] = SENTINEL,
- **kwargs,
- ):
- """ListTemplatesResponse
-
- :param has_next_page: Whether there is a next page, defaults to None
- :type has_next_page: bool, optional
- :param has_previous_page: Whether there is a previous page, defaults to None
- :type has_previous_page: bool, optional
- :param templates: templates, defaults to None
- :type templates: List[Template], optional
- """
- if has_next_page is not SENTINEL:
- self.has_next_page = has_next_page
- if has_previous_page is not SENTINEL:
- self.has_previous_page = has_previous_page
- if templates is not SENTINEL:
- self.templates = self._define_list(templates, Template)
- self._kwargs = kwargs
+ has_next_page: Optional[bool] = Field(
+ default=None, description="Whether there is a next page"
+ )
+ has_previous_page: Optional[bool] = Field(
+ default=None, description="Whether there is a previous page"
+ )
+ templates: Optional[List[Template]] = Field(default=None)
diff --git a/src/signplus/models/list_webhooks_request.py b/src/signplus/models/list_webhooks_request.py
index 873ff0d..49fb47a 100644
--- a/src/signplus/models/list_webhooks_request.py
+++ b/src/signplus/models/list_webhooks_request.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .webhook_event import WebhookEvent
-@JsonMap({})
class ListWebhooksRequest(BaseModel):
"""ListWebhooksRequest
@@ -15,18 +15,7 @@ class ListWebhooksRequest(BaseModel):
:type event: WebhookEvent, optional
"""
- def __init__(
- self, webhook_id: str = SENTINEL, event: WebhookEvent = SENTINEL, **kwargs
- ):
- """ListWebhooksRequest
-
- :param webhook_id: ID of the webhook, defaults to None
- :type webhook_id: str, optional
- :param event: Event of the webhook, defaults to None
- :type event: WebhookEvent, optional
- """
- if webhook_id is not SENTINEL:
- self.webhook_id = webhook_id
- if event is not SENTINEL:
- self.event = self._enum_matching(event, WebhookEvent.list(), "event")
- self._kwargs = kwargs
+ webhook_id: Optional[str] = Field(default=None, description="ID of the webhook")
+ event: Optional[WebhookEvent] = Field(
+ default=None, description="Event of the webhook"
+ )
diff --git a/src/signplus/models/list_webhooks_response.py b/src/signplus/models/list_webhooks_response.py
index 86689f1..0d7f5a4 100644
--- a/src/signplus/models/list_webhooks_response.py
+++ b/src/signplus/models/list_webhooks_response.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .webhook import Webhook
-@JsonMap({})
class ListWebhooksResponse(BaseModel):
"""ListWebhooksResponse
@@ -14,12 +14,4 @@ class ListWebhooksResponse(BaseModel):
:type webhooks: List[Webhook], optional
"""
- def __init__(self, webhooks: List[Webhook] = SENTINEL, **kwargs):
- """ListWebhooksResponse
-
- :param webhooks: webhooks, defaults to None
- :type webhooks: List[Webhook], optional
- """
- if webhooks is not SENTINEL:
- self.webhooks = self._define_list(webhooks, Webhook)
- self._kwargs = kwargs
+ webhooks: Optional[List[Webhook]] = Field(default=None)
diff --git a/src/signplus/models/page.py b/src/signplus/models/page.py
index 774de24..51901fc 100644
--- a/src/signplus/models/page.py
+++ b/src/signplus/models/page.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class Page(BaseModel):
"""Page
@@ -13,16 +14,9 @@ class Page(BaseModel):
:type height: int, optional
"""
- def __init__(self, width: int = SENTINEL, height: int = SENTINEL, **kwargs):
- """Page
-
- :param width: Width of the page in pixels, defaults to None
- :type width: int, optional
- :param height: Height of the page in pixels, defaults to None
- :type height: int, optional
- """
- if width is not SENTINEL:
- self.width = width
- if height is not SENTINEL:
- self.height = height
- self._kwargs = kwargs
+ width: Optional[int] = Field(
+ default=None, description="Width of the page in pixels"
+ )
+ height: Optional[int] = Field(
+ default=None, description="Height of the page in pixels"
+ )
diff --git a/src/signplus/models/recipient.py b/src/signplus/models/recipient.py
index 846944d..5525080 100644
--- a/src/signplus/models/recipient.py
+++ b/src/signplus/models/recipient.py
@@ -1,12 +1,12 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .recipient_role import RecipientRole
from .recipient_verification import RecipientVerification
-@JsonMap({"id_": "id"})
class Recipient(BaseModel):
"""Recipient
@@ -24,38 +24,19 @@ class Recipient(BaseModel):
:type verification: RecipientVerification, optional
"""
- def __init__(
- self,
- name: str,
- email: str,
- role: RecipientRole,
- id_: str = SENTINEL,
- uid: str = SENTINEL,
- verification: RecipientVerification = SENTINEL,
- **kwargs,
- ):
- """Recipient
-
- :param id_: Unique identifier of the recipient, defaults to None
- :type id_: str, optional
- :param uid: Unique identifier of the user associated with the recipient, defaults to None
- :type uid: str, optional
- :param name: Name of the recipient
- :type name: str
- :param email: Email of the recipient
- :type email: str
- :param role: Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document)
- :type role: RecipientRole
- :param verification: verification, defaults to None
- :type verification: RecipientVerification, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if uid is not SENTINEL:
- self.uid = uid
- self.name = name
- self.email = email
- self.role = self._enum_matching(role, RecipientRole.list(), "role")
- if verification is not SENTINEL:
- self.verification = self._define_object(verification, RecipientVerification)
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the recipient",
+ )
+ uid: Optional[str] = Field(
+ default=None,
+ description="Unique identifier of the user associated with the recipient",
+ )
+ name: str = Field(description="Name of the recipient")
+ email: str = Field(description="Email of the recipient")
+ role: RecipientRole = Field(
+ description="Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document)"
+ )
+ verification: Optional[RecipientVerification] = Field(default=None)
diff --git a/src/signplus/models/recipient_role.py b/src/signplus/models/recipient_role.py
index 60e51f2..01547c3 100644
--- a/src/signplus/models/recipient_role.py
+++ b/src/signplus/models/recipient_role.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class RecipientRole(Enum):
+class RecipientRole(str, Enum):
"""An enumeration representing different categories.
:cvar SIGNER: "SIGNER"
@@ -16,10 +18,11 @@ class RecipientRole(Enum):
RECEIVESCOPY = "RECEIVES_COPY"
INPERSONSIGNER = "IN_PERSON_SIGNER"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, RecipientRole._member_map_.values()))
diff --git a/src/signplus/models/recipient_verification.py b/src/signplus/models/recipient_verification.py
index dfc5ebc..39f26ec 100644
--- a/src/signplus/models/recipient_verification.py
+++ b/src/signplus/models/recipient_verification.py
@@ -1,37 +1,27 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .recipient_verification_type import RecipientVerificationType
-@JsonMap({"type_": "type"})
class RecipientVerification(BaseModel):
"""RecipientVerification
- :param type_: Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check., defaults to None
+ :param type_: Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check., defaults to None
:type type_: RecipientVerificationType, optional
:param value: Required for `PASSCODE` and `SMS` verification. - `PASSCODE`: code required by the recipient to sign the document. - `SMS`: recipient's phone number. - `ID_VERIFICATION`: leave empty., defaults to None
:type value: str, optional
"""
- def __init__(
- self,
- type_: RecipientVerificationType = SENTINEL,
- value: str = SENTINEL,
- **kwargs,
- ):
- """RecipientVerification
-
- :param type_: Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check., defaults to None
- :type type_: RecipientVerificationType, optional
- :param value: Required for `PASSCODE` and `SMS` verification. - `PASSCODE`: code required by the recipient to sign the document. - `SMS`: recipient's phone number. - `ID_VERIFICATION`: leave empty., defaults to None
- :type value: str, optional
- """
- if type_ is not SENTINEL:
- self.type_ = self._enum_matching(
- type_, RecipientVerificationType.list(), "type_"
- )
- if value is not SENTINEL:
- self.value = value
- self._kwargs = kwargs
+ type_: Optional[RecipientVerificationType] = Field(
+ alias="type",
+ serialization_alias="type",
+ default=None,
+ description="Type of verification the recipient must complete before accessing the envelope. - `PASSCODE`: requires a code to be entered. - `SMS`: sends a code via SMS. - `ID_VERIFICATION`: prompts the recipient to complete an automated ID and selfie check.",
+ )
+ value: Optional[str] = Field(
+ default=None,
+ description="Required for `PASSCODE` and `SMS` verification. - `PASSCODE`: code required by the recipient to sign the document. - `SMS`: recipient's phone number. - `ID_VERIFICATION`: leave empty.",
+ )
diff --git a/src/signplus/models/recipient_verification_type.py b/src/signplus/models/recipient_verification_type.py
index 6c11b3e..8c33fb5 100644
--- a/src/signplus/models/recipient_verification_type.py
+++ b/src/signplus/models/recipient_verification_type.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class RecipientVerificationType(Enum):
+class RecipientVerificationType(str, Enum):
"""An enumeration representing different categories.
:cvar SMS: "SMS"
@@ -16,10 +18,11 @@ class RecipientVerificationType(Enum):
PASSCODE = "PASSCODE"
IDVERIFICATION = "ID_VERIFICATION"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(
diff --git a/src/signplus/models/rename_envelope_request.py b/src/signplus/models/rename_envelope_request.py
index 958becd..9fa31ea 100644
--- a/src/signplus/models/rename_envelope_request.py
+++ b/src/signplus/models/rename_envelope_request.py
@@ -1,9 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
-@JsonMap({})
class RenameEnvelopeRequest(BaseModel):
"""RenameEnvelopeRequest
@@ -11,12 +12,4 @@ class RenameEnvelopeRequest(BaseModel):
:type name: str, optional
"""
- def __init__(self, name: str = SENTINEL, **kwargs):
- """RenameEnvelopeRequest
-
- :param name: Name of the envelope, defaults to None
- :type name: str, optional
- """
- if name is not SENTINEL:
- self.name = name
- self._kwargs = kwargs
+ name: Optional[str] = Field(default=None, description="Name of the envelope")
diff --git a/src/signplus/models/rename_template_request.py b/src/signplus/models/rename_template_request.py
index 7bcbddc..927260a 100644
--- a/src/signplus/models/rename_template_request.py
+++ b/src/signplus/models/rename_template_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class RenameTemplateRequest(BaseModel):
"""RenameTemplateRequest
@@ -10,11 +12,4 @@ class RenameTemplateRequest(BaseModel):
:type name: str
"""
- def __init__(self, name: str, **kwargs):
- """RenameTemplateRequest
-
- :param name: Name of the template
- :type name: str
- """
- self.name = name
- self._kwargs = kwargs
+ name: str = Field(description="Name of the template")
diff --git a/src/signplus/models/set_envelope_attachments_placeholders_request.py b/src/signplus/models/set_envelope_attachments_placeholders_request.py
index 0a87ec7..3112eac 100644
--- a/src/signplus/models/set_envelope_attachments_placeholders_request.py
+++ b/src/signplus/models/set_envelope_attachments_placeholders_request.py
@@ -1,11 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
from .attachment_placeholder_request import AttachmentPlaceholderRequest
-@JsonMap({})
class SetEnvelopeAttachmentsPlaceholdersRequest(BaseModel):
"""SetEnvelopeAttachmentsPlaceholdersRequest
@@ -13,13 +14,4 @@ class SetEnvelopeAttachmentsPlaceholdersRequest(BaseModel):
:type placeholders: List[AttachmentPlaceholderRequest]
"""
- def __init__(self, placeholders: List[AttachmentPlaceholderRequest], **kwargs):
- """SetEnvelopeAttachmentsPlaceholdersRequest
-
- :param placeholders: placeholders
- :type placeholders: List[AttachmentPlaceholderRequest]
- """
- self.placeholders = self._define_list(
- placeholders, AttachmentPlaceholderRequest
- )
- self._kwargs = kwargs
+ placeholders: List[AttachmentPlaceholderRequest]
diff --git a/src/signplus/models/set_envelope_attachments_settings_request.py b/src/signplus/models/set_envelope_attachments_settings_request.py
index b1fe63b..6e5a70d 100644
--- a/src/signplus/models/set_envelope_attachments_settings_request.py
+++ b/src/signplus/models/set_envelope_attachments_settings_request.py
@@ -1,10 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
from .attachment_settings import AttachmentSettings
-@JsonMap({})
class SetEnvelopeAttachmentsSettingsRequest(BaseModel):
"""SetEnvelopeAttachmentsSettingsRequest
@@ -12,11 +13,4 @@ class SetEnvelopeAttachmentsSettingsRequest(BaseModel):
:type settings: AttachmentSettings
"""
- def __init__(self, settings: AttachmentSettings, **kwargs):
- """SetEnvelopeAttachmentsSettingsRequest
-
- :param settings: settings
- :type settings: AttachmentSettings
- """
- self.settings = self._define_object(settings, AttachmentSettings)
- self._kwargs = kwargs
+ settings: AttachmentSettings
diff --git a/src/signplus/models/set_envelope_comment_request.py b/src/signplus/models/set_envelope_comment_request.py
index c46dbb2..6ef7968 100644
--- a/src/signplus/models/set_envelope_comment_request.py
+++ b/src/signplus/models/set_envelope_comment_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class SetEnvelopeCommentRequest(BaseModel):
"""SetEnvelopeCommentRequest
@@ -10,11 +12,4 @@ class SetEnvelopeCommentRequest(BaseModel):
:type comment: str
"""
- def __init__(self, comment: str, **kwargs):
- """SetEnvelopeCommentRequest
-
- :param comment: Comment for the envelope
- :type comment: str
- """
- self.comment = comment
- self._kwargs = kwargs
+ comment: str = Field(description="Comment for the envelope")
diff --git a/src/signplus/models/set_envelope_dynamic_fields_request.py b/src/signplus/models/set_envelope_dynamic_fields_request.py
index c407b52..7791be3 100644
--- a/src/signplus/models/set_envelope_dynamic_fields_request.py
+++ b/src/signplus/models/set_envelope_dynamic_fields_request.py
@@ -1,11 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
from .dynamic_field import DynamicField
-@JsonMap({})
class SetEnvelopeDynamicFieldsRequest(BaseModel):
"""SetEnvelopeDynamicFieldsRequest
@@ -13,11 +14,4 @@ class SetEnvelopeDynamicFieldsRequest(BaseModel):
:type dynamic_fields: List[DynamicField]
"""
- def __init__(self, dynamic_fields: List[DynamicField], **kwargs):
- """SetEnvelopeDynamicFieldsRequest
-
- :param dynamic_fields: List of dynamic fields
- :type dynamic_fields: List[DynamicField]
- """
- self.dynamic_fields = self._define_list(dynamic_fields, DynamicField)
- self._kwargs = kwargs
+ dynamic_fields: List[DynamicField] = Field(description="List of dynamic fields")
diff --git a/src/signplus/models/set_envelope_expiration_request.py b/src/signplus/models/set_envelope_expiration_request.py
index aaf01d5..b4556e0 100644
--- a/src/signplus/models/set_envelope_expiration_request.py
+++ b/src/signplus/models/set_envelope_expiration_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class SetEnvelopeExpirationRequest(BaseModel):
"""SetEnvelopeExpirationRequest
@@ -10,11 +12,4 @@ class SetEnvelopeExpirationRequest(BaseModel):
:type expires_at: int
"""
- def __init__(self, expires_at: int, **kwargs):
- """SetEnvelopeExpirationRequest
-
- :param expires_at: Unix timestamp of the expiration date
- :type expires_at: int
- """
- self.expires_at = expires_at
- self._kwargs = kwargs
+ expires_at: int = Field(description="Unix timestamp of the expiration date")
diff --git a/src/signplus/models/set_envelope_legality_level_request.py b/src/signplus/models/set_envelope_legality_level_request.py
index 409e94b..6df3ecf 100644
--- a/src/signplus/models/set_envelope_legality_level_request.py
+++ b/src/signplus/models/set_envelope_legality_level_request.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope_legality_level import EnvelopeLegalityLevel
-@JsonMap({})
class SetEnvelopeLegalityLevelRequest(BaseModel):
"""SetEnvelopeLegalityLevelRequest
@@ -13,14 +13,7 @@ class SetEnvelopeLegalityLevelRequest(BaseModel):
:type legality_level: EnvelopeLegalityLevel, optional
"""
- def __init__(self, legality_level: EnvelopeLegalityLevel = SENTINEL, **kwargs):
- """SetEnvelopeLegalityLevelRequest
-
- :param legality_level: Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes), defaults to None
- :type legality_level: EnvelopeLegalityLevel, optional
- """
- if legality_level is not SENTINEL:
- self.legality_level = self._enum_matching(
- legality_level, EnvelopeLegalityLevel.list(), "legality_level"
- )
- self._kwargs = kwargs
+ legality_level: Optional[EnvelopeLegalityLevel] = Field(
+ default=None,
+ description="Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes)",
+ )
diff --git a/src/signplus/models/set_template_comment_request.py b/src/signplus/models/set_template_comment_request.py
index a7d0b99..069abd9 100644
--- a/src/signplus/models/set_template_comment_request.py
+++ b/src/signplus/models/set_template_comment_request.py
@@ -1,8 +1,10 @@
-from .utils.json_map import JsonMap
+from __future__ import annotations
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-@JsonMap({})
class SetTemplateCommentRequest(BaseModel):
"""SetTemplateCommentRequest
@@ -10,11 +12,4 @@ class SetTemplateCommentRequest(BaseModel):
:type comment: str
"""
- def __init__(self, comment: str, **kwargs):
- """SetTemplateCommentRequest
-
- :param comment: Comment for the template
- :type comment: str
- """
- self.comment = comment
- self._kwargs = kwargs
+ comment: str = Field(description="Comment for the template")
diff --git a/src/signplus/models/signing_step.py b/src/signplus/models/signing_step.py
index 4b507ca..8e68ebc 100644
--- a/src/signplus/models/signing_step.py
+++ b/src/signplus/models/signing_step.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .recipient import Recipient
-@JsonMap({})
class SigningStep(BaseModel):
"""SigningStep
@@ -14,12 +14,6 @@ class SigningStep(BaseModel):
:type recipients: List[Recipient], optional
"""
- def __init__(self, recipients: List[Recipient] = SENTINEL, **kwargs):
- """SigningStep
-
- :param recipients: List of recipients, defaults to None
- :type recipients: List[Recipient], optional
- """
- if recipients is not SENTINEL:
- self.recipients = self._define_list(recipients, Recipient)
- self._kwargs = kwargs
+ recipients: Optional[List[Recipient]] = Field(
+ default=None, description="List of recipients"
+ )
diff --git a/src/signplus/models/template.py b/src/signplus/models/template.py
index 2329b01..ea23596 100644
--- a/src/signplus/models/template.py
+++ b/src/signplus/models/template.py
@@ -1,8 +1,9 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .envelope_legality_level import EnvelopeLegalityLevel
from .template_signing_step import TemplateSigningStep
from .document import Document
@@ -10,7 +11,6 @@
from .envelope_attachments import EnvelopeAttachments
-@JsonMap({"id_": "id"})
class Template(BaseModel):
"""Template
@@ -44,83 +44,38 @@ class Template(BaseModel):
:type attachments: EnvelopeAttachments, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- name: str = SENTINEL,
- comment: str = SENTINEL,
- pages: int = SENTINEL,
- legality_level: EnvelopeLegalityLevel = SENTINEL,
- created_at: int = SENTINEL,
- updated_at: int = SENTINEL,
- expiration_delay: int = SENTINEL,
- num_recipients: int = SENTINEL,
- signing_steps: List[TemplateSigningStep] = SENTINEL,
- documents: List[Document] = SENTINEL,
- notification: EnvelopeNotification = SENTINEL,
- dynamic_fields: List[str] = SENTINEL,
- attachments: EnvelopeAttachments = SENTINEL,
- **kwargs,
- ):
- """Template
-
- :param id_: Unique identifier of the template, defaults to None
- :type id_: str, optional
- :param name: Name of the template, defaults to None
- :type name: str, optional
- :param comment: Comment for the template, defaults to None
- :type comment: str, optional
- :param pages: Total number of pages in the template, defaults to None
- :type pages: int, optional
- :param legality_level: Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes), defaults to None
- :type legality_level: EnvelopeLegalityLevel, optional
- :param created_at: Unix timestamp of the creation date, defaults to None
- :type created_at: int, optional
- :param updated_at: Unix timestamp of the last modification date, defaults to None
- :type updated_at: int, optional
- :param expiration_delay: Expiration delay added to the current time when an envelope is created from this template, defaults to None
- :type expiration_delay: int, optional
- :param num_recipients: Number of recipients in the envelope, defaults to None
- :type num_recipients: int, optional
- :param signing_steps: signing_steps, defaults to None
- :type signing_steps: List[TemplateSigningStep], optional
- :param documents: documents, defaults to None
- :type documents: List[Document], optional
- :param notification: notification, defaults to None
- :type notification: EnvelopeNotification, optional
- :param dynamic_fields: List of dynamic fields, defaults to None
- :type dynamic_fields: List[str], optional
- :param attachments: attachments, defaults to None
- :type attachments: EnvelopeAttachments, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if name is not SENTINEL:
- self.name = name
- if comment is not SENTINEL:
- self.comment = comment
- if pages is not SENTINEL:
- self.pages = pages
- if legality_level is not SENTINEL:
- self.legality_level = self._enum_matching(
- legality_level, EnvelopeLegalityLevel.list(), "legality_level"
- )
- if created_at is not SENTINEL:
- self.created_at = created_at
- if updated_at is not SENTINEL:
- self.updated_at = updated_at
- if expiration_delay is not SENTINEL:
- self.expiration_delay = expiration_delay
- if num_recipients is not SENTINEL:
- self.num_recipients = num_recipients
- if signing_steps is not SENTINEL:
- self.signing_steps = self._define_list(signing_steps, TemplateSigningStep)
- if documents is not SENTINEL:
- self.documents = self._define_list(documents, Document)
- if notification is not SENTINEL:
- self.notification = self._define_object(notification, EnvelopeNotification)
- if dynamic_fields is not SENTINEL:
- self.dynamic_fields = dynamic_fields
- if attachments is not SENTINEL:
- self.attachments = self._define_object(attachments, EnvelopeAttachments)
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the template",
+ )
+ name: Optional[str] = Field(default=None, description="Name of the template")
+ comment: Optional[str] = Field(default=None, description="Comment for the template")
+ pages: Optional[int] = Field(
+ default=None, description="Total number of pages in the template"
+ )
+ legality_level: Optional[EnvelopeLegalityLevel] = Field(
+ default=None,
+ description="Legal level of the envelope (SES is Simple Electronic Signature, QES_EIDAS is Qualified Electronic Signature, QES_ZERTES is Qualified Electronic Signature with Zertes)",
+ )
+ created_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the creation date"
+ )
+ updated_at: Optional[int] = Field(
+ default=None, description="Unix timestamp of the last modification date"
+ )
+ expiration_delay: Optional[int] = Field(
+ default=None,
+ description="Expiration delay added to the current time when an envelope is created from this template",
+ )
+ num_recipients: Optional[int] = Field(
+ default=None, description="Number of recipients in the envelope"
+ )
+ signing_steps: Optional[List[TemplateSigningStep]] = Field(default=None)
+ documents: Optional[List[Document]] = Field(default=None)
+ notification: Optional[EnvelopeNotification] = Field(default=None)
+ dynamic_fields: Optional[List[str]] = Field(
+ default=None, description="List of dynamic fields"
+ )
+ attachments: Optional[EnvelopeAttachments] = Field(default=None)
diff --git a/src/signplus/models/template_order_field.py b/src/signplus/models/template_order_field.py
index cf99eb0..65c1bf0 100644
--- a/src/signplus/models/template_order_field.py
+++ b/src/signplus/models/template_order_field.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class TemplateOrderField(Enum):
+class TemplateOrderField(str, Enum):
"""An enumeration representing different categories.
:cvar TEMPLATEID: "TEMPLATE_ID"
@@ -19,10 +21,11 @@ class TemplateOrderField(Enum):
TEMPLATEMODIFICATIONDATE = "TEMPLATE_MODIFICATION_DATE"
TEMPLATENAME = "TEMPLATE_NAME"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, TemplateOrderField._member_map_.values()))
diff --git a/src/signplus/models/template_recipient.py b/src/signplus/models/template_recipient.py
index 541fb0d..1add5a0 100644
--- a/src/signplus/models/template_recipient.py
+++ b/src/signplus/models/template_recipient.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .template_recipient_role import TemplateRecipientRole
-@JsonMap({"id_": "id"})
class TemplateRecipient(BaseModel):
"""TemplateRecipient
@@ -21,36 +21,19 @@ class TemplateRecipient(BaseModel):
:type role: TemplateRecipientRole, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- uid: str = SENTINEL,
- name: str = SENTINEL,
- email: str = SENTINEL,
- role: TemplateRecipientRole = SENTINEL,
- **kwargs,
- ):
- """TemplateRecipient
-
- :param id_: Unique identifier of the recipient, defaults to None
- :type id_: str, optional
- :param uid: Unique identifier of the user associated with the recipient, defaults to None
- :type uid: str, optional
- :param name: Name of the recipient, defaults to None
- :type name: str, optional
- :param email: Email of the recipient, defaults to None
- :type email: str, optional
- :param role: Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document), defaults to None
- :type role: TemplateRecipientRole, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if uid is not SENTINEL:
- self.uid = uid
- if name is not SENTINEL:
- self.name = name
- if email is not SENTINEL:
- self.email = email
- if role is not SENTINEL:
- self.role = self._enum_matching(role, TemplateRecipientRole.list(), "role")
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the recipient",
+ )
+ uid: Optional[str] = Field(
+ default=None,
+ description="Unique identifier of the user associated with the recipient",
+ )
+ name: Optional[str] = Field(default=None, description="Name of the recipient")
+ email: Optional[str] = Field(default=None, description="Email of the recipient")
+ role: Optional[TemplateRecipientRole] = Field(
+ default=None,
+ description="Role of the recipient (SIGNER signs the document, RECEIVES_COPY receives a copy of the document, IN_PERSON_SIGNER signs the document in person, SENDER sends the document)",
+ )
diff --git a/src/signplus/models/template_recipient_role.py b/src/signplus/models/template_recipient_role.py
index dea216c..ef527c5 100644
--- a/src/signplus/models/template_recipient_role.py
+++ b/src/signplus/models/template_recipient_role.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class TemplateRecipientRole(Enum):
+class TemplateRecipientRole(str, Enum):
"""An enumeration representing different categories.
:cvar SIGNER: "SIGNER"
@@ -19,10 +21,11 @@ class TemplateRecipientRole(Enum):
INPERSONSIGNER = "IN_PERSON_SIGNER"
SENDER = "SENDER"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, TemplateRecipientRole._member_map_.values()))
diff --git a/src/signplus/models/template_signing_step.py b/src/signplus/models/template_signing_step.py
index 3b414f4..ff6d251 100644
--- a/src/signplus/models/template_signing_step.py
+++ b/src/signplus/models/template_signing_step.py
@@ -1,12 +1,12 @@
from __future__ import annotations
from typing import List
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .template_recipient import TemplateRecipient
-@JsonMap({})
class TemplateSigningStep(BaseModel):
"""TemplateSigningStep
@@ -14,12 +14,6 @@ class TemplateSigningStep(BaseModel):
:type recipients: List[TemplateRecipient], optional
"""
- def __init__(self, recipients: List[TemplateRecipient] = SENTINEL, **kwargs):
- """TemplateSigningStep
-
- :param recipients: List of recipients, defaults to None
- :type recipients: List[TemplateRecipient], optional
- """
- if recipients is not SENTINEL:
- self.recipients = self._define_list(recipients, TemplateRecipient)
- self._kwargs = kwargs
+ recipients: Optional[List[TemplateRecipient]] = Field(
+ default=None, description="List of recipients"
+ )
diff --git a/src/signplus/models/utils/base_error.py b/src/signplus/models/utils/base_error.py
new file mode 100644
index 0000000..ef59699
--- /dev/null
+++ b/src/signplus/models/utils/base_error.py
@@ -0,0 +1,116 @@
+from typing import Any, Dict, Optional, Type
+from pydantic import BaseModel as PydanticBaseModel, ValidationError
+
+
+class BaseError(Exception):
+ """
+ Base exception class for SDK error models.
+
+ Combines Exception behavior with Pydantic validation:
+ - Can be raised as an exception
+ - Validates input data using Pydantic
+ - Provides attribute access to error fields
+ - Includes status and response for HTTP errors
+ """
+
+ # Pydantic model class for validation (overridden by subclasses)
+ _model_class: Type[PydanticBaseModel] = None
+
+ def __init__(self, **data: Any):
+ """
+ Initialize error with validated data.
+
+ :param data: Error data to validate
+ """
+ # If _model_class is set, use it for validation
+ if self._model_class is not None:
+ try:
+ # Validate data using Pydantic model
+ validated_data = self._model_class(**data)
+ # Store validated fields as instance attributes
+ for field_name in self._model_class.model_fields:
+ setattr(self, field_name, getattr(validated_data, field_name))
+ # Store the validated model for serialization
+ self._data = validated_data
+ except ValidationError:
+ # If validation fails, store raw data
+ for key, value in data.items():
+ setattr(self, key, value)
+ self._data = data
+ else:
+ # No validation - just store attributes
+ for key, value in data.items():
+ setattr(self, key, value)
+ self._data = data
+
+ # Add standard error attributes
+ self.status: Optional[int] = getattr(self, "status", None)
+ self.response: Optional[Any] = getattr(self, "response", None)
+
+ # Call Exception.__init__ with message if available
+ message = getattr(self, "message", str(data))
+ super().__init__(message)
+
+ def model_dump_original(self, **kwargs: Any) -> Dict[str, Any]:
+ """
+ Serialize error using original field names.
+
+ :param kwargs: Additional arguments for serialization
+ :return: Dictionary with original API field names
+ :rtype: Dict[str, Any]
+ """
+ if isinstance(self._data, PydanticBaseModel):
+ # Set exclude_unset=True by default
+ if "exclude_unset" not in kwargs:
+ kwargs["exclude_unset"] = True
+ return self._data.model_dump(by_alias=True, **kwargs)
+ else:
+ # Raw data
+ return self._data if isinstance(self._data, dict) else {}
+
+ def _map(self, **kwargs: Any) -> Dict[str, Any]:
+ """
+ Legacy alias for model_dump_original().
+
+ :param kwargs: Additional arguments
+ :return: Dictionary with original field names
+ :rtype: Dict[str, Any]
+ """
+ return self.model_dump_original(**kwargs)
+
+ @classmethod
+ def _unmap(cls, obj: Any) -> "BaseError":
+ """
+ Create error instance from dictionary.
+
+ :param obj: Dictionary or object to convert
+ :return: Error instance
+ :rtype: BaseError
+ """
+ if isinstance(obj, dict):
+ return cls(**obj)
+ return obj
+
+ @property
+ def _kwargs(self) -> Dict[str, Any]:
+ """
+ Access extra fields not in schema.
+
+ :return: Dictionary of extra fields
+ :rtype: Dict[str, Any]
+ """
+ if isinstance(self._data, PydanticBaseModel):
+ return getattr(self._data, "__pydantic_extra__", {})
+ return {}
+
+ def __str__(self) -> str:
+ """String representation of the error."""
+ message = getattr(self, "message", None)
+ status = getattr(self, "status", None)
+ if message and status:
+ return f"{status}: {message}"
+ elif message:
+ return str(message)
+ elif status:
+ return f"Error {status}"
+ return super().__str__()
diff --git a/src/signplus/models/utils/base_model.py b/src/signplus/models/utils/base_model.py
index 48c34e9..fb8cc93 100644
--- a/src/signplus/models/utils/base_model.py
+++ b/src/signplus/models/utils/base_model.py
@@ -1,310 +1,128 @@
-import re
-import operator
-from typing import List, Union, Type, Any, TypeVar, Optional
-from enum import Enum
-from .one_of_base_model import OneOfBaseModel
-from .sentinel import SENTINEL
+from pydantic import BaseModel as PydanticBaseModel, ConfigDict, ValidationError
+from typing import Any, Dict
-T = TypeVar("T")
-
-class BaseModel:
- """
- A base class that most of the models in the SDK inherited from.
+class BaseModel(PydanticBaseModel):
"""
+ Pydantic-based model for SDK objects with custom configuration.
- def __init__(self):
- pass
-
- def _define_object(self, input_data: Any, input_class: Type[T]) -> Optional[T]:
- """
- Check if the input data is an instance of the input class and return the input data if it is.
- Otherwise, return an instance of the input class.
-
- :param input_data: The input data to be checked.
- :param input_class: The class that the input data should be an instance of.
- :return: The input data if it is an instance of input_class, otherwise an instance of input_class.
- :rtype: object
- """
- if input_data is None or input_data is SENTINEL:
- return None
- elif isinstance(input_data, input_class):
- return input_data
- else:
- return input_class._unmap(input_data)
-
- def _define_list(
- self, input_data: Optional[List[Any]], list_class: Type[T]
- ) -> Optional[List[T]]:
- """
- Create a list of instances of a specified class from input data.
- :param input_data: The input data to be transformed into a list of instances.
- :param list_class: The class that each instance in the list should be an instance of.
- :return: A list of instances of list_class.
- :rtype: list
- """
+ This class extends Pydantic's BaseModel to provide:
+ - Automatic validation on instantiation
+ - Type-safe attribute access
+ - JSON serialization with API field name mapping
+ - Support for additional properties (extra fields)
+ """
- if input_data is None or input_data is SENTINEL:
- return None
+ model_config = ConfigDict(
+ # Allow extra fields beyond defined properties (replaces **kwargs behavior)
+ extra="allow",
+ # Validate field values when they are assigned after initialization
+ validate_assignment=True,
+ # Use enum values instead of enum objects in serialization
+ use_enum_values=True,
+ # Allow models to be populated using either field name or alias
+ populate_by_name=True,
+ # Arbitrary types allowed (for flexibility with custom types)
+ arbitrary_types_allowed=False,
+ # Validate `Field(pattern=...)` constraints with Python's `re` engine
+ # instead of Pydantic's default Rust `regex` engine. The Rust engine
+ # rejects ALL look-around (`(?=…)`, `(?!…)`, `(?<=…)`, `(? Dict[str, Any]:
+ """
+ Serialize model using original field names from OpenAPI spec.
+
+ This ensures JSON output matches the API contract by using field aliases
+ (typically camelCase) instead of Python field names (snake_case).
+
+ By default, unset fields are excluded from the output.
+ To include them, pass exclude_unset=False explicitly.
+
+ :param kwargs: Additional arguments passed to model_dump()
+ :return: Dictionary with original API field names
+ :rtype: Dict[str, Any]
+
+ Example:
+ >>> cat = Cat(body_fat_percentage=15.5, age=None)
+ >>> cat.model_dump_original()
+ {'bodyFatPercentage': 15.5, 'age': None}
+ >>> cat.model_dump_original(exclude_unset=False)
+ {'bodyFatPercentage': 15.5, 'age': None}
+ """
+ # Set exclude_unset=True by default to exclude fields that were not explicitly set
+ # Note: We do NOT exclude None values by default, because if a field is explicitly
+ # set to None, it should be sent as null in the JSON to the API
+ if "exclude_unset" not in kwargs:
+ kwargs["exclude_unset"] = True
+
+ # Exclude extra fields by default (additional properties not in schema)
+ # This matches the expected behavior where undefined fields are not sent to APIs
+ result = self.model_dump(by_alias=True, **kwargs)
+
+ # Remove extra fields from the result
+ extra_fields = getattr(self, "__pydantic_extra__", {})
+ if extra_fields:
+ for extra_field_name in extra_fields.keys():
+ result.pop(extra_field_name, None)
- result: List[T] = []
- for item in input_data:
- if hasattr(list_class, "__args__") and len(list_class.__args__) > 0:
- class_list = self.__create_class_map(list_class)
- OneOfBaseModel.class_list = class_list
- result.append(OneOfBaseModel.return_one_of(item))
- elif issubclass(list_class, Enum):
- result.append(
- self._enum_matching(item, list_class.list(), list_class.__name__)
- )
- elif isinstance(item, list_class):
- result.append(item)
- elif isinstance(item, dict):
- result.append(list_class._unmap(item))
- else:
- result.append(list_class(item))
return result
- def _define_str(
- self,
- variable_name: str,
- value: Optional[Any],
- nullable=False,
- pattern: Optional[str] = None,
- min_length: Optional[int] = None,
- max_length: Optional[int] = None,
- ) -> Optional[str]:
- """
- Check if a string value is within the specified boundaries and matches a regex pattern.
- Return the value if it is, otherwise raise a ValueError.
-
- :param variable_name: The variable name.
- :type variable_name: str
- :param value: The value to be checked.
- :type value: str
- :param nullable: Whether the value can be None.
- :type nullable: bool
- :param pattern: The regex pattern to match.
- :type pattern: str
- :param min_length: The minimum length of the value.
- :type min_length: int
- :param max_length: The maximum length of the value.
- :type max_length: int
- :param inclusive_lenght_boundary: Whether the length boundaries are inclusive.
- :type inclusive_lenght_boundary: bool
-
- :raises ValueError: If the value is not within the boundaries or does not match the pattern.
-
- :return: The value if it is within the boundaries and matches the pattern.
- :rtype: str
- """
- if value is None and not nullable:
- raise ValueError(f"{variable_name} cannot be null.")
- if value is None or value is SENTINEL:
- return None
-
- if pattern:
- self._pattern_matching(value, pattern, variable_name)
-
- if min_length is not None:
- operation = operator.ge
- self._boundary_check(variable_name, len(value), min_length, operation, str)
-
- if max_length is not None:
- operation = operator.le
- self._boundary_check(variable_name, len(value), max_length, operation, str)
-
- return value
-
- def _define_number(
- self,
- variable_name: str,
- value: Optional[Union[float, int]],
- nullable=False,
- ge: Optional[Union[float, int]] = None,
- gt: Optional[Union[float, int]] = None,
- le: Optional[Union[float, int]] = None,
- lt: Optional[Union[float, int]] = None,
- ) -> Optional[Union[float, int]]:
- """
- Check if a number value is within the specified boundaries.
- Return the value if it is, otherwise raise a ValueError.
-
- :param variable_name: The variable name.
- :type variable_name: str
- :param value: The value to be checked.
- :type value: Union[float, int]
- :param nullable: Whether the value can be None.
- :type nullable: bool
- :param ge: The minimum value of the number (inclusive). The value must be greater than or equal to this.
- :type ge: Union[float, int]
- :param gt: The minimum value of the number (exclusive). The value must be greater than this.
- :type gt: Union[float, int]
- :param le: The maximum value of the number (inclusive). The value must be less than or equal to this.
- :type le: Union[float, int]
- :param lt: The maximum value of the number (exclusive). The value must be less than this.
- :type lt: Union[float, int]
-
- :raises ValueError: If the value is not within the boundaries.
-
- :return: The value if it is within the boundaries.
- :rtype: Union[float, int]
+ @classmethod
+ def model_validate_original(cls, obj: Any) -> "BaseModel":
"""
- if value is None and not nullable:
- raise ValueError(f"{variable_name} cannot be null.")
-
- if value is None or value is SENTINEL:
- return None
-
- if ge is not None:
- operation = operator.ge
- self._boundary_check(variable_name, value, ge, operation, float)
-
- if gt is not None:
- operation = operator.gt
- self._boundary_check(variable_name, value, gt, operation, float)
+ Parse and validate object using original field names from OpenAPI spec.
- if le is not None:
- operation = operator.le
- self._boundary_check(variable_name, value, le, operation, float)
+ This method accepts data with API field names (aliases) and creates
+ a validated model instance.
- if lt is not None:
- operation = operator.lt
- self._boundary_check(variable_name, value, lt, operation, float)
+ :param obj: Dictionary or object to validate
+ :return: Validated model instance
+ :rtype: BaseModel
- return value
-
- def _boundary_check(
- self,
- variable_name: str,
- value: float,
- boundary: float,
- operation: operator,
- value_type: Union[str, float, int],
- ) -> Optional[str]:
+ Example:
+ >>> data = {'bodyFatPercentage': 15.5}
+ >>> cat = Cat.model_validate_original(data)
+ >>> cat.body_fat_percentage
+ 15.5
"""
- Checks if a value is within the specified boundaries and returns the value if it is.
-
- :param variable_name: The variable name.
- :type variable_name: str
- :param value: The value to be checked.
- :type value: Union[str, float, int]
- :param boundary: The boundary value to be checked against.
- :type boundary: float
- :param operator: The operator to be used for the boundary check.
- :type operator: operator
- :param type: The type of the value.
- :type type: Union[str, float, int]
-
- :raises ValueError: If the value is not within the boundaries.
+ return cls.model_validate(obj)
- :return: The value if it is within the boundaries.
- :rtype: Union[str, float, int]
+ def _map(self, **kwargs: Any) -> Dict[str, Any]:
"""
- reference = "length" if value_type is str else "value"
- if not operation(value, boundary):
- raise ValueError(
- f"Invalid {reference} for {variable_name}: must satisfy the condition {operation.__name__} {boundary}, received {value}"
- )
+ Legacy alias for model_dump_original() for backward compatibility.
- return value
-
- def _pattern_matching(
- self, value: Optional[str], pattern: str, variable_name: str
- ) -> Optional[str]:
+ :param kwargs: Additional arguments passed to model_dump_original()
+ :return: Dictionary with original API field names
+ :rtype: Dict[str, Any]
"""
- Checks if a value matches a regex pattern and returns the value if there's a match.
+ return self.model_dump_original(**kwargs)
- :param value: The value to be checked.
- :type value: str
- :param pattern: The regex pattern.
- :type pattern: str
- :param variable_name: The variable name.
- :type variable_name: str
- :return: The value if it matches the pattern.
- :rtype: str
- :raises ValueError: If the value does not match the pattern.
+ @classmethod
+ def _unmap(cls, obj: Any) -> "BaseModel":
"""
- if value is None:
- return None
-
- if re.match(r"{}".format(pattern), value):
- return value
- else:
- raise ValueError(
- f"Invalid value for {variable_name}: must match {pattern}, received {value}"
- )
+ Legacy alias for model_validate_original() for backward compatibility.
- def _enum_matching(
- self, value: Union[str, Enum], enum_values: List[str], variable_name: str
- ) -> Union[str, Enum]:
+ :param obj: Dictionary or object to validate
+ :return: Validated model instance
+ :rtype: BaseModel
"""
- Checks if a value (str or enum) matches the required enum values and returns the value if there's a match.
+ return cls.model_validate_original(obj)
- :param value: The value to be checked.
- :type value: Union[str, Enum]
- :param enum_values: The list of valid enum values.
- :type enum_values: List[str]
- :param variable_name: The variable name.
- :type variable_name: str
- :return: The value if it matches one of the enum values.
- :rtype: Union[str, Enum]
- :raises ValueError: If the value does not match any of the enum values.
+ @property
+ def _kwargs(self) -> Dict[str, Any]:
"""
- if value is None:
- return None
+ Access extra fields (additional properties beyond defined schema).
- str_value = value.value if isinstance(value, Enum) else value
- if str_value in enum_values:
- return value
- else:
- raise ValueError(
- f"Invalid value for {variable_name}: must match one of {enum_values}, received {value}"
- )
-
- def _get_representation(self, level: int = 0) -> str:
- """
- Get a string representation of the model.
-
- :param int level: The indentation level.
- :return: A string representation of the model.
- """
- indent = " " * level
- representation_lines = []
-
- for attr, value in vars(self).items():
- if value is not None:
- value_representation = (
- value._get_representation(level + 1)
- if hasattr(value, "_get_representation")
- else repr(value)
- )
- representation_lines.append(
- f"{indent} {attr}={value_representation}"
- )
-
- return (
- f"{self.__class__.__name__}(\n"
- + ",\n".join(representation_lines)
- + f"\n{indent})"
- )
-
- def __str__(self):
- return self._get_representation()
-
- def __repr__(self):
- return self._get_representation()
-
- def __create_class_map(self, union_type):
- """
- Create a dictionary that maps class names to the actual classes in a Union type.
+ In Pydantic v2, extra fields are stored in __pydantic_extra__.
+ This property provides backward compatibility with v1's **kwargs pattern.
- :param union_type: The Union type to create a class map for.
- :return: A dictionary mapping class names to classes.
- :rtype: dict
+ :return: Dictionary of extra fields
+ :rtype: Dict[str, Any]
"""
- class_map = {}
- for arg in union_type.__args__:
- if arg.__name__:
- class_map[arg.__name__] = arg
- return class_map
+ return getattr(self, "__pydantic_extra__", {})
diff --git a/src/signplus/models/utils/cast_models.py b/src/signplus/models/utils/cast_models.py
index 2ad2229..679566e 100644
--- a/src/signplus/models/utils/cast_models.py
+++ b/src/signplus/models/utils/cast_models.py
@@ -1,7 +1,8 @@
from enum import Enum
-from typing import get_args, Union
+from typing import Any, get_args, Union
from inspect import isclass
from .one_of_base_model import OneOfBaseModel
+from pydantic import ValidationError
def cast_models(func):
@@ -23,7 +24,11 @@ def wrapper(self, *clss, **kwargs):
new_cls_args.append(_get_instanced_type(input, input_type))
for type_name, input in kwargs.items():
- new_kwargs[type_name] = _get_instanced_type(input, cls_types[type_name])
+ # Config parameters pass through unchanged - they're already dicts
+ if type_name == "request_config":
+ new_kwargs[type_name] = input
+ else:
+ new_kwargs[type_name] = _get_instanced_type(input, cls_types[type_name])
return func(self, *new_cls_args, **new_kwargs)
@@ -35,6 +40,14 @@ def _get_instanced_type(data, input_type):
:param input_type: The type of the input.
:return: The instanced type.
"""
+ # `typing.Any` means "no validation" — pass the data through
+ # unchanged. Without this guard, downstream branches eventually
+ # call `isinstance(data, Any)`, which raises
+ # `TypeError: typing.Any cannot be used with isinstance()` and
+ # crashes any method whose annotation propagates an Any-schema.
+ if input_type is Any:
+ return data
+
# Instanciate oneOf models
if _is_one_of_model(input_type):
class_list = {
@@ -53,12 +66,35 @@ def _get_instanced_type(data, input_type):
# Instanciate object models
elif isinstance(data, dict) and input_type is not str:
- return input_type(**data)
+ # Pydantic models: use model_validate() for better validation
+ if hasattr(input_type, "model_validate"):
+ try:
+ return input_type.model_validate(data)
+ except ValidationError as e:
+ # Convert ValidationError to TypeError for backward compatibility
+ raise TypeError(f"Invalid data for {input_type.__name__}: {e}")
+ # Legacy models or direct instantiation
+ else:
+ return input_type(**data)
# Instanciate list of object models
elif isinstance(data, list) and all(isinstance(i, dict) for i in data):
element_type = get_args(input_type)[0]
- return [element_type(**item) for item in data]
+ # `List[Any]` — no per-item validation, just return the list as-is.
+ # Otherwise the else-branch would call `Any(**item)` which raises
+ # `TypeError: Cannot instantiate typing.Any`.
+ if element_type is Any:
+ return data
+ # Pydantic models: use model_validate() for each item
+ if hasattr(element_type, "model_validate"):
+ try:
+ return [element_type.model_validate(item) for item in data]
+ except ValidationError as e:
+ # Convert ValidationError to TypeError for backward compatibility
+ raise TypeError(f"Invalid data for {element_type.__name__}: {e}")
+ # Legacy models or direct instantiation
+ else:
+ return [element_type(**item) for item in data]
# Instanciate bytes if input is str
elif input_type is bytes and isinstance(data, str):
diff --git a/src/signplus/models/utils/one_of_base_model.py b/src/signplus/models/utils/one_of_base_model.py
index 8186278..699e13d 100644
--- a/src/signplus/models/utils/one_of_base_model.py
+++ b/src/signplus/models/utils/one_of_base_model.py
@@ -68,6 +68,13 @@ def _get_instance(cls, class_constructor, input_data):
:return: An instance of the class if the input data matches the class constructor
or can be used to initialize the class, None otherwise.
"""
+ # `Union[..., Any]` / `Optional[Any]` propagate `typing.Any` through
+ # `class_list`. `isinstance(..., Any)` raises, so short-circuit and
+ # pass the data through — `Any` in a oneOf means the branch accepts
+ # anything by definition.
+ if class_constructor is Any:
+ return input_data
+
# Check if the class is only a TypeHint.
origin = get_origin(class_constructor)
if origin is not None and isinstance(input_data, list):
@@ -108,6 +115,11 @@ def _get_list_instance(
inner_type = args[0]
+ # `List[Any]` inside a oneOf branch — every item satisfies it by
+ # definition, and `isinstance(item, Any)` would raise.
+ if inner_type is Any:
+ return input_data
+
if not all(isinstance(item, inner_type) for item in input_data):
return [inner_type._unmap(item) for item in input_data]
diff --git a/src/signplus/models/webhook.py b/src/signplus/models/webhook.py
index 970c4d1..8bfb3b0 100644
--- a/src/signplus/models/webhook.py
+++ b/src/signplus/models/webhook.py
@@ -1,11 +1,11 @@
from __future__ import annotations
-from .utils.json_map import JsonMap
+from pydantic import Field
+from typing import Optional
+from typing import Any
from .utils.base_model import BaseModel
-from .utils.sentinel import SENTINEL
from .webhook_event import WebhookEvent
-@JsonMap({"id_": "id"})
class Webhook(BaseModel):
"""Webhook
@@ -17,26 +17,13 @@ class Webhook(BaseModel):
:type target: str, optional
"""
- def __init__(
- self,
- id_: str = SENTINEL,
- event: WebhookEvent = SENTINEL,
- target: str = SENTINEL,
- **kwargs,
- ):
- """Webhook
-
- :param id_: Unique identifier of the webhook, defaults to None
- :type id_: str, optional
- :param event: Event of the webhook, defaults to None
- :type event: WebhookEvent, optional
- :param target: Target URL of the webhook, defaults to None
- :type target: str, optional
- """
- if id_ is not SENTINEL:
- self.id_ = id_
- if event is not SENTINEL:
- self.event = self._enum_matching(event, WebhookEvent.list(), "event")
- if target is not SENTINEL:
- self.target = target
- self._kwargs = kwargs
+ id_: Optional[str] = Field(
+ alias="id",
+ serialization_alias="id",
+ default=None,
+ description="Unique identifier of the webhook",
+ )
+ event: Optional[WebhookEvent] = Field(
+ default=None, description="Event of the webhook"
+ )
+ target: Optional[str] = Field(default=None, description="Target URL of the webhook")
diff --git a/src/signplus/models/webhook_event.py b/src/signplus/models/webhook_event.py
index bd337c8..675a550 100644
--- a/src/signplus/models/webhook_event.py
+++ b/src/signplus/models/webhook_event.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
from enum import Enum
+from typing import Any
-class WebhookEvent(Enum):
+class WebhookEvent(str, Enum):
"""An enumeration representing different categories.
:cvar ENVELOPEEXPIRED: "ENVELOPE_EXPIRED"
@@ -22,10 +24,11 @@ class WebhookEvent(Enum):
ENVELOPECOMPLETED = "ENVELOPE_COMPLETED"
ENVELOPEAUDITTRAIL = "ENVELOPE_AUDIT_TRAIL"
+ @staticmethod
def list():
- """Lists all category values.
+ """Lists all enum values.
- :return: A list of all category values.
+ :return: A list of all enum values.
:rtype: list
"""
return list(map(lambda x: x.value, WebhookEvent._member_map_.values()))
diff --git a/src/signplus/net/headers/base_header.py b/src/signplus/net/headers/base_header.py
index cc1eb3c..8c6b8c3 100644
--- a/src/signplus/net/headers/base_header.py
+++ b/src/signplus/net/headers/base_header.py
@@ -2,8 +2,25 @@
class BaseHeader:
+ """
+ Base class for authentication header implementations.
+ Defines the interface for setting authentication values and retrieving HTTP headers.
+ """
+
def set_value(self, value: Any) -> None:
+ """
+ Set the authentication value.
+ Subclasses should override this method to store authentication credentials.
+
+ :param value: The authentication value to set.
+ """
pass
def get_headers(self) -> Dict[str, str]:
+ """
+ Get the HTTP headers containing authentication information.
+ Subclasses should override this method to return appropriate authentication headers.
+
+ :return: A dictionary of HTTP headers with authentication data.
+ """
pass
diff --git a/src/signplus/net/request_chain/handlers/http_handler.py b/src/signplus/net/request_chain/handlers/http_handler.py
index 6fc9255..9e551a3 100644
--- a/src/signplus/net/request_chain/handlers/http_handler.py
+++ b/src/signplus/net/request_chain/handlers/http_handler.py
@@ -2,6 +2,7 @@
from requests.exceptions import Timeout
from typing import Generator, Optional, Tuple
+from pydantic import TypeAdapter
from .base_handler import BaseHandler
from ...transport.request import Request
from ...transport.response import Response
@@ -36,11 +37,14 @@ def handle(
try:
request_args = self._get_request_data(request)
+ # Get timeout from config if available, otherwise use default
+ timeout = self._get_timeout_from_config(request)
+
result = requests.request(
request.method,
request.url,
headers=request.headers,
- timeout=self._timeout_in_seconds,
+ timeout=timeout,
**request_args,
)
response = Response(result)
@@ -50,6 +54,26 @@ def handle(
response.body, dict
):
error_model_class = request.errors[response.status]
+ if isinstance(error_model_class, TypeAdapter):
+ # TypeAdapter for anyOf/oneOf union type errors: parse into the correct variant
+ try:
+ parsed_body = error_model_class.validate_python(
+ response.body
+ )
+ except Exception:
+ parsed_body = response.body
+ message = response.body.get("message")
+ if not isinstance(message, str):
+ message = (
+ f"{response.status} error in request to: {request.url}"
+ )
+ error = ApiError(
+ message=message,
+ status=response.status,
+ response=response,
+ )
+ error.body = parsed_body
+ return None, error
error = error_model_class(**response.body)
if "message" not in response.body:
error.message = (
@@ -73,14 +97,24 @@ def handle(
def stream(
self, request: Request
) -> Generator[Tuple[Optional[Response], Optional[Exception]], None, None]:
+ """
+ Stream the request to the specified URL and yield response chunks.
+ Useful for handling large responses or server-sent events.
+
+ :param request: The request to stream.
+ :return: A generator yielding response chunks and any errors that occurred.
+ """
try:
request_args = self._get_request_data(request)
+ # Get timeout from config if available, otherwise use default
+ timeout = self._get_timeout_from_config(request)
+
result = requests.request(
request.method,
request.url,
headers=request.headers,
- timeout=self._timeout_in_seconds,
+ timeout=timeout,
stream=True,
**request_args,
)
@@ -113,12 +147,26 @@ def _get_request_data(self, request: Request) -> dict:
:rtype: dict
"""
headers = request.headers or {}
+
+ # No body was set on the request (the operation declares no requestBody).
+ # Sending an empty JSON payload would force a Content-Type the endpoint
+ # never advertises, which strict servers reject with HTTP 415.
+ if request.body is None:
+ return {}
+
data = request.body or {}
content_type = headers.get("Content-Type", "application/json")
if request.method == "GET" and not data:
return {}
+ # Raw binary bodies (e.g. application/octet-stream, file uploads) must be
+ # sent as-is. Routing them through `json=` crashes with
+ # "TypeError: Object of type bytes is not JSON serializable", regardless
+ # of what Content-Type the request defaulted to.
+ if isinstance(data, (bytes, bytearray)):
+ return {"data": data}
+
if content_type.startswith("application/") and "json" in content_type:
return {"json": data}
@@ -133,3 +181,15 @@ def _get_request_data(self, request: Request) -> dict:
return {"files": files, "data": form_data}
return {"data": data}
+
+ def _get_timeout_from_config(self, request: Request) -> float:
+ """
+ Get the timeout for the request from config or use default.
+
+ :param Request request: The request object.
+ :return: The timeout in seconds.
+ :rtype: float
+ """
+ if request.config and "timeout" in request.config:
+ return request.config["timeout"] / 1000
+ return self._timeout_in_seconds
diff --git a/src/signplus/net/request_chain/handlers/retry_handler.py b/src/signplus/net/request_chain/handlers/retry_handler.py
index 6807d69..8238e3d 100644
--- a/src/signplus/net/request_chain/handlers/retry_handler.py
+++ b/src/signplus/net/request_chain/handlers/retry_handler.py
@@ -12,10 +12,15 @@
class RetryHandler(BaseHandler):
"""
Handler for retrying requests.
- Retries the request if the previous handler in the chain returned an error or a response with a status code of 500 or higher.
+ Supports configurable retry attempts, exponential backoff with jitter, and specific status codes or HTTP methods to retry.
:ivar int _max_attempts: The maximum number of retry attempts.
- :ivar int _delay_in_milliseconds: The delay between retry attempts in milliseconds.
+ :ivar int _delay_in_milliseconds: The initial delay between retry attempts in milliseconds.
+ :ivar int _max_delay_in_milliseconds: The maximum delay between retry attempts in milliseconds (caps exponential backoff).
+ :ivar float _backoff_factor: Multiplier for exponential backoff.
+ :ivar int _jitter_in_milliseconds: Maximum random jitter in milliseconds to add to retry delays.
+ :ivar set[int] | None _status_codes_to_retry: Specific HTTP status codes to retry (None triggers default: 5xx + 408, 429).
+ :ivar set[str] _http_methods_to_retry: HTTP methods that are allowed to be retried.
"""
def __init__(self):
@@ -25,12 +30,22 @@ def __init__(self):
super().__init__()
self._max_attempts = 3
self._delay_in_milliseconds = 150
+ self._max_delay_in_milliseconds = 5000
+ self._backoff_factor = 2
+ self._jitter_in_milliseconds = 50
+ self._status_codes_to_retry = None
+ self._http_methods_to_retry = {
+ m.upper()
+ for m in ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]
+ }
def handle(
self, request: Request
) -> Tuple[Optional[Response], Optional[RequestError]]:
"""
- Retry the request if the response has a status code greater or equal to 500 or equal to 408 (timeout).
+ Retry the request based on configured retry settings.
+ Implements exponential backoff with optional jitter between retry attempts.
+ Per-request retry config (via request.config['retry']) overrides SDK defaults.
:param Request request: The request to retry.
:return: The response and any error that occurred.
@@ -40,11 +55,14 @@ def handle(
if self._next_handler is None:
raise RequestError("Handler chain is incomplete")
+ retry_config = (request.config or {}).get("retry") or {}
+ max_attempts = retry_config.get("attempts", self._max_attempts)
+
response, error = self._next_handler.handle(request)
try_count = 0
- while try_count < self._max_attempts and self._should_retry(error):
- self._delay(try_count)
+ while try_count < max_attempts and self._should_retry(error, request):
+ self._delay(try_count, request)
response, error = self._next_handler.handle(request)
try_count += 1
@@ -54,7 +72,9 @@ def stream(
self, request: Request
) -> Generator[Tuple[Optional[Response], Optional[RequestError]], None, None]:
"""
- Retry the request if the response has a status code greater or equal to 500 or equal to 408 (timeout).
+ Retry the request based on configured retry settings.
+ Implements exponential backoff with optional jitter between retry attempts.
+ Per-request retry config (via request.config['retry']) overrides SDK defaults.
:param Request request: The request to retry.
:return: The response and any error that occurred.
@@ -65,15 +85,17 @@ def stream(
raise RequestError("Handler chain is incomplete")
try:
+ retry_config = (request.config or {}).get("retry") or {}
+ max_attempts = retry_config.get("attempts", self._max_attempts)
try_count = 0
stream = self._next_handler.stream(request)
while True:
response, error = next(stream)
- if try_count < self._max_attempts and self._should_retry(error):
- self._delay(try_count)
+ if try_count < max_attempts and self._should_retry(error, request):
+ self._delay(try_count, request)
try_count += 1
stream = self._next_handler.stream(request) # Retry the request
- elif try_count >= self._max_attempts:
+ elif try_count >= max_attempts:
yield response, error
break
else:
@@ -82,20 +104,69 @@ def stream(
except StopIteration:
pass
- def _delay(self, try_count: int) -> None:
- jitter = random.uniform(0.5, 1.5)
- delay = self._delay_in_milliseconds * (2**try_count) * jitter / 1000
- sleep(delay)
+ def _delay(self, try_count: int, request: Request) -> None:
+ """
+ Calculate and apply delay before next retry attempt using exponential backoff.
+ Delay is capped at maximum delay and optional jitter is added.
+ Per-request retry config overrides SDK defaults.
- def _should_retry(self, error: Optional[ApiError]) -> bool:
+ :param int try_count: Current retry attempt number (0-indexed).
+ :param Request request: The request being retried, used to read per-request retry config.
"""
- Determine whether the request should be retried.
+ retry_config = (request.config or {}).get("retry") or {}
+ base_delay = retry_config.get("delay_ms", self._delay_in_milliseconds)
+ max_delay = retry_config.get("max_delay_ms", self._max_delay_in_milliseconds)
+ backoff_factor = retry_config.get("backoff_factor", self._backoff_factor)
+ jitter = retry_config.get("jitter_ms", self._jitter_in_milliseconds)
+
+ # Calculate exponential backoff: initialDelay * (backoffFactor ^ try_count)
+ delay = base_delay * (backoff_factor**try_count)
+
+ # Cap at max delay
+ delay = min(delay, max_delay)
+
+ # Add jitter: random value between 0 and jitter_ms
+ if jitter > 0:
+ delay += random.uniform(0, jitter)
+
+ # Convert to seconds and sleep
+ sleep(delay / 1000)
+
+ def _should_retry(self, error: Optional[ApiError], request: Request) -> bool:
+ """
+ Determine whether the request should be retried based on status code and HTTP method.
+ By default, retries all 5xx server errors and specific 4xx client errors (408 Timeout, 429 Rate Limit).
+ Per-request retry config overrides SDK defaults for status codes and HTTP methods.
- :param Optional[Response] response: The response from the previous handler.
:param Optional[ApiError] error: The error from the previous handler.
+ :param Request request: The request being retried.
:return: True if the request should be retried, False otherwise.
:rtype: bool
"""
if not error:
return False
- return error.status == 408 or error.status >= 500
+
+ retry_config = (request.config or {}).get("retry") or {}
+
+ # Check if status code is retryable
+ request_status_codes = retry_config.get("status_codes_to_retry")
+ if request_status_codes is not None:
+ should_retry_status = error.status in request_status_codes
+ elif self._status_codes_to_retry is not None:
+ should_retry_status = error.status in self._status_codes_to_retry
+ else:
+ # Default: retry 5xx, 408 (Timeout), 429 (Rate Limit)
+ should_retry_status = (
+ error.status >= 500 or error.status == 408 or error.status == 429
+ )
+
+ # Check if HTTP method is retryable
+ request_http_methods = retry_config.get("http_methods_to_retry")
+ if request_http_methods is not None:
+ should_retry_method = request.method.upper() in {
+ m.upper() for m in request_http_methods
+ }
+ else:
+ should_retry_method = request.method.upper() in self._http_methods_to_retry
+
+ return should_retry_status and should_retry_method
diff --git a/src/signplus/net/sdk_config.py b/src/signplus/net/sdk_config.py
new file mode 100644
index 0000000..0e1ce6b
--- /dev/null
+++ b/src/signplus/net/sdk_config.py
@@ -0,0 +1,63 @@
+from typing import TypedDict, Optional
+
+from ..net.environment import Environment
+
+
+class RetryConfig(TypedDict, total=False):
+ """
+ Configuration for retry behavior.
+
+ :ivar int attempts: Maximum number of retry attempts.
+ :ivar int delay_ms: Delay in milliseconds between retries.
+ :ivar int max_delay_ms: Maximum delay in milliseconds between retries (caps exponential backoff).
+ :ivar float backoff_factor: Multiplier for exponential backoff (e.g., 2.0 for doubling delay each retry).
+ :ivar int jitter_ms: Maximum random jitter in milliseconds to add to retry delays.
+ :ivar list[int] status_codes_to_retry: Specific HTTP status codes to retry (overrides default 5xx + 408, 429).
+ :ivar list[str] http_methods_to_retry: HTTP methods to retry (e.g., ['GET', 'POST']).
+ """
+
+ attempts: int
+ delay_ms: int
+ max_delay_ms: int
+ backoff_factor: float
+ jitter_ms: int
+ status_codes_to_retry: list[int]
+ http_methods_to_retry: list[str]
+
+
+class ValidationConfig(TypedDict, total=False):
+ """
+ Configuration for response validation.
+
+ :ivar bool response_validation: Whether to validate responses against schemas.
+ """
+
+ response_validation: bool
+
+
+class SdkConfig(TypedDict, total=False):
+ """
+ Configuration dictionary for SDK, service, method, and request-level overrides.
+
+ Hierarchy (highest to lowest priority):
+ - Request config (passed directly to method call)
+ - Method config (set via set__config())
+ - Service config (set via set_config())
+ - SDK config (set at initialization)
+
+ :ivar str base_url: Base URL for API requests. Can be a string URL or Environment enum.
+ :ivar Environment environment: Environment enum value for base URL.
+ :ivar int timeout: Request timeout in milliseconds.
+ :ivar str token: Bearer token for authentication.
+ :ivar str access_token: Access token for authentication (alias for token).
+ :ivar RetryConfig retry: Retry configuration.
+ :ivar ValidationConfig validation: Validation configuration.
+ """
+
+ base_url: str
+ environment: Environment
+ timeout: int
+ token: str
+ access_token: str
+ retry: RetryConfig
+ validation: ValidationConfig
diff --git a/src/signplus/net/transport/api_error.py b/src/signplus/net/transport/api_error.py
index cb4cdd5..c9ee413 100644
--- a/src/signplus/net/transport/api_error.py
+++ b/src/signplus/net/transport/api_error.py
@@ -1,9 +1,8 @@
-from ...models.utils.base_model import BaseModel
from .response import Response
from typing import Optional
-class ApiError(BaseModel, Exception):
+class ApiError(Exception):
"""
Class representing an API Error.
@@ -26,3 +25,12 @@ def __init__(
self.message = message
self.status = status
self.response = response
+ super().__init__(message)
+
+ def __str__(self) -> str:
+ parts = []
+ if self.status is not None:
+ parts.append(f"status={self.status}")
+ if self.message:
+ parts.append(self.message)
+ return ": ".join(parts)
diff --git a/src/signplus/net/transport/request.py b/src/signplus/net/transport/request.py
index 81fa33b..ce86fee 100644
--- a/src/signplus/net/transport/request.py
+++ b/src/signplus/net/transport/request.py
@@ -1,6 +1,9 @@
-from typing import Any, Set
+from typing import Any, Set, TYPE_CHECKING
from .utils import extract_original_data
+if TYPE_CHECKING:
+ from ..sdk_config import SdkConfig
+
class Request:
"""
@@ -27,6 +30,7 @@ class Request:
:ivar Any body: Request body.
:ivar Set[str] scopes: List of scopes to include in the request.
:ivar dict errors: Dictionary of HTTP status codes to error models.
+ :ivar SdkConfig config: Configuration dictionary for the request.
"""
def __init__(self):
@@ -36,6 +40,7 @@ def __init__(self):
self.body = None
self.scopes = None
self.errors = None
+ self.config: "SdkConfig" = None
def set_url(self, url: str) -> "Request":
"""
@@ -105,6 +110,17 @@ def set_errors(self, errors: dict) -> "Request":
self.errors = errors
return self
+ def set_config(self, config: "SdkConfig") -> "Request":
+ """
+ Set the configuration for the request.
+
+ :param SdkConfig config: Configuration dictionary for the request.
+ :return: The updated Request object.
+ :rtype: Request
+ """
+ self.config = config
+ return self
+
def __str__(self) -> str:
"""
Return a string representation of the Request object.
diff --git a/src/signplus/net/transport/response.py b/src/signplus/net/transport/response.py
index 5824044..f1bacb8 100644
--- a/src/signplus/net/transport/response.py
+++ b/src/signplus/net/transport/response.py
@@ -1,7 +1,7 @@
import json
import re
from typing import Generator, Optional, Union
-from requests import Response as RequestsResponse
+from requests import Response
from urllib.parse import parse_qs
@@ -13,19 +13,21 @@ class Response:
:ivar dict headers: The headers of the HTTP response.
:ivar str body: The body of the HTTP response.
:var str chunk: The chunk of the HTTP response.
+ :property Response raw: The original requests.Response object.
"""
def __init__(
self,
- response: RequestsResponse,
+ response: Response,
chunk: Optional[str] = None,
raw_chunk: Optional[bytes] = None,
) -> None:
"""
Initializes a Response object.
- :param RequestsResponse response: The requests.Response object.
+ :param Response response: The Response object.
"""
+ self._raw_response = response
self.status = response.status_code
self.headers = response.headers
@@ -37,12 +39,12 @@ def __init__(
@staticmethod
def from_chunk(
- response: RequestsResponse, raw_chunk: bytes
+ response: Response, raw_chunk: bytes
) -> Generator["Response", None, None]:
"""
Create a Response object from a chunk of data.
- :param RequestsResponse response: The requests.Response object.
+ :param Response response: The Response object.
:param bytes chunk: The chunk of data.
:return: A Response object.
:rtype: Response
@@ -67,6 +69,16 @@ def __str__(self) -> str:
f"Response(status={self.status}, headers={self.headers}, body={self.body})"
)
+ @property
+ def raw(self) -> Response:
+ """
+ Get the underlying requests.Response object.
+
+ :return: The original requests.Response object.
+ :rtype: Response
+ """
+ return self._raw_response
+
def _parse_response_body(
self, content_type: str, body: str, raw_body: bytes
) -> Union[str, dict, bytes]:
@@ -79,7 +91,9 @@ def _parse_response_body(
If the content type is 'application/x-www-form-urlencoded', it parses the body as a query string.
For all other content types, it returns the raw binary content.
- :param RequestsResponse response: The HTTP response received from a request.
+ :param str content_type: The content type of the response.
+ :param str body: The text body of the response.
+ :param bytes raw_body: The raw binary body of the response.
:return: The parsed response body.
:rtype: str or dict or bytes
"""
@@ -92,7 +106,11 @@ def _parse_response_body(
# Note: this assumes that the content of data is a valid JSON string
return json.loads(json_body)
- if "text/" in content_type or content_type == "application/xml":
+ if (
+ "text/" in content_type
+ or content_type == "application/xml"
+ or content_type == "application/javascript"
+ ):
return body
if content_type == "application/x-www-form-urlencoded":
diff --git a/src/signplus/net/transport/serializer.py b/src/signplus/net/transport/serializer.py
index d258dd4..cd4cef1 100644
--- a/src/signplus/net/transport/serializer.py
+++ b/src/signplus/net/transport/serializer.py
@@ -1,4 +1,4 @@
-from typing import Any, List
+from typing import Any, List, Optional, TYPE_CHECKING
from urllib.parse import quote
from .request import Request
@@ -7,6 +7,9 @@
from ...net.headers.base_header import BaseHeader
from ...net.transport.api_error import ApiError
+if TYPE_CHECKING:
+ from ...net.sdk_config import SdkConfig
+
class Serializer:
"""
@@ -18,14 +21,21 @@ class Serializer:
:ivar dict[str, str] path: A dictionary containing path parameters for the request.
:ivar list[str] query: A list containing query parameters for the request.
:ivar dict[int, ApiError] errors: A dictionary of HTTP status codes to error models.
+ :ivar SdkConfig config: Configuration dictionary for the request.
"""
- def __init__(self, url: str, default_headers: List[BaseHeader] = []):
+ def __init__(
+ self,
+ url: str,
+ default_headers: List[BaseHeader] = [],
+ config: Optional["SdkConfig"] = None,
+ ):
"""
- Initializes a Serializer instance with the base URL.
+ Initializes a Serializer instance with the base URL and configuration.
:param str url: The base URL to be serialized.
- :param list[BaseHeader] default_headers: A list of default headers to be added to the request. Defaults to an empty list.
+ :param list[BaseHeader] default_headers: A list of default headers to be added to the request (with config overrides already applied). Defaults to an empty list.
+ :param SdkConfig config: Configuration dictionary for timeout and other non-auth settings.
"""
self.url: str = url
self.headers: dict[str, str] = {}
@@ -33,7 +43,13 @@ def __init__(self, url: str, default_headers: List[BaseHeader] = []):
self.path: dict[str, str] = {}
self.query: list[str] = []
self.errors: dict[int, ApiError] = {}
+ self.config: Optional["SdkConfig"] = config
+
+ self.headers["User-Agent"] = (
+ "postman-codegen/1.6.0 signplus-python/1.0.0 (python)"
+ )
+ # Apply default headers
for header in default_headers:
for key, value in header.get_headers().items():
self.add_header(key, value)
@@ -219,6 +235,7 @@ def serialize(self) -> Request:
.set_url(final_url)
.set_headers(self.headers)
.set_errors(self.errors)
+ .set_config(self.config)
)
def _define_url(self) -> str:
diff --git a/src/signplus/net/transport/utils.py b/src/signplus/net/transport/utils.py
index ca12a77..c5edaf8 100644
--- a/src/signplus/net/transport/utils.py
+++ b/src/signplus/net/transport/utils.py
@@ -7,6 +7,8 @@ def extract_original_data(data: Any) -> Any:
"""
Extracts the original data from internal models and enums.
+ Supports both Pydantic models (model_dump_original) and legacy models (_map).
+
:param Any data: The data to be extracted.
:return: The extracted data.
:rtype: Any
@@ -17,11 +19,22 @@ def extract_original_data(data: Any) -> Any:
data_type = type(data)
if issubclass(data_type, BaseModel):
- return data._map()
+ # Pydantic models: use model_dump_original()
+ if hasattr(data, "model_dump_original"):
+ return data.model_dump_original()
+ # Legacy models: use _map()
+ elif hasattr(data, "_map"):
+ return data._map()
+ # Fallback: try to convert to dict
+ else:
+ return dict(data)
if issubclass(data_type, Enum):
return data.value
+ if issubclass(data_type, dict):
+ return {key: extract_original_data(value) for key, value in data.items()}
+
if issubclass(data_type, list):
return [extract_original_data(item) for item in data]
diff --git a/src/signplus/sdk.py b/src/signplus/sdk.py
index c5ab162..0713b88 100644
--- a/src/signplus/sdk.py
+++ b/src/signplus/sdk.py
@@ -4,6 +4,12 @@
class Signplus:
+ """
+ Main SDK client class for Signplus.
+ Provides centralized configuration and access to all service endpoints.
+ Supports authentication, environment management, and global timeout settings.
+ """
+
def __init__(
self,
access_token: str = None,
@@ -14,9 +20,10 @@ def __init__(
Initializes Signplus the SDK class.
"""
- self._base_url = (
+ _resolved_url = (
base_url.value if isinstance(base_url, Environment) else base_url
)
+ self._base_url = _resolved_url.rstrip("/") if _resolved_url else _resolved_url
self.signplus = SignplusService(base_url=self._base_url)
self.set_access_token(access_token)
self.set_timeout(timeout)
@@ -28,9 +35,10 @@ def set_base_url(self, base_url: Union[Environment, str]):
:param Union[Environment, str] base_url: The base URL to be set.
:return: The SDK instance.
"""
- self._base_url = (
+ _resolved_url = (
base_url.value if isinstance(base_url, Environment) else base_url
)
+ self._base_url = _resolved_url.rstrip("/") if _resolved_url else _resolved_url
self.signplus.set_base_url(self._base_url)
diff --git a/src/signplus/services/async_/signplus.py b/src/signplus/services/async_/signplus.py
index c0ebbfe..4de8bd2 100644
--- a/src/signplus/services/async_/signplus.py
+++ b/src/signplus/services/async_/signplus.py
@@ -1,6 +1,7 @@
-from typing import Awaitable, List
+from typing import Awaitable, Optional, Any, List
from .utils.to_async import to_async
from ..signplus import SignplusService
+from ...net.sdk_config import SdkConfig
from ...models.utils.sentinel import SENTINEL
from ...models import (
Envelope,
@@ -48,231 +49,467 @@ class SignplusServiceAsync(SignplusService):
"""
def create_envelope(
- self, request_body: CreateEnvelopeRequest
+ self,
+ request_body: CreateEnvelopeRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().create_envelope)(request_body)
+ return to_async(super().create_envelope)(
+ request_body, request_config=request_config
+ )
def create_envelope_from_template(
- self, request_body: CreateEnvelopeFromTemplateRequest, template_id: str
+ self,
+ request_body: CreateEnvelopeFromTemplateRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
return to_async(super().create_envelope_from_template)(
- request_body, template_id
+ request_body, template_id, request_config=request_config
)
def list_envelopes(
- self, request_body: ListEnvelopesRequest = None
+ self,
+ request_body: ListEnvelopesRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[ListEnvelopesResponse]:
- return to_async(super().list_envelopes)(request_body)
+ return to_async(super().list_envelopes)(
+ request_body, request_config=request_config
+ )
- def get_envelope(self, envelope_id: str) -> Awaitable[Envelope]:
- return to_async(super().get_envelope)(envelope_id)
+ def get_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Envelope]:
+ return to_async(super().get_envelope)(
+ envelope_id, request_config=request_config
+ )
- def delete_envelope(self, envelope_id: str) -> Awaitable[None]:
- return to_async(super().delete_envelope)(envelope_id)
+ def delete_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[None]:
+ return to_async(super().delete_envelope)(
+ envelope_id, request_config=request_config
+ )
def download_envelope_signed_documents(
- self, envelope_id: str, certificate_of_completion: bool = SENTINEL
- ) -> Awaitable[any]:
+ self,
+ envelope_id: str,
+ certificate_of_completion: bool = SENTINEL,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Awaitable[Any]:
return to_async(super().download_envelope_signed_documents)(
- envelope_id, certificate_of_completion
+ envelope_id, certificate_of_completion, request_config=request_config
)
- def download_envelope_certificate(self, envelope_id: str) -> Awaitable[any]:
- return to_async(super().download_envelope_certificate)(envelope_id)
+ def download_envelope_certificate(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Any]:
+ return to_async(super().download_envelope_certificate)(
+ envelope_id, request_config=request_config
+ )
def get_envelope_document(
- self, envelope_id: str, document_id: str
+ self,
+ envelope_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Document]:
- return to_async(super().get_envelope_document)(envelope_id, document_id)
+ return to_async(super().get_envelope_document)(
+ envelope_id, document_id, request_config=request_config
+ )
def get_envelope_documents(
- self, envelope_id: str
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
) -> Awaitable[ListEnvelopeDocumentsResponse]:
- return to_async(super().get_envelope_documents)(envelope_id)
+ return to_async(super().get_envelope_documents)(
+ envelope_id, request_config=request_config
+ )
def add_envelope_document(
- self, request_body: AddEnvelopeDocumentRequest, envelope_id: str
+ self,
+ request_body: AddEnvelopeDocumentRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Document]:
- return to_async(super().add_envelope_document)(request_body, envelope_id)
+ return to_async(super().add_envelope_document)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_dynamic_fields(
- self, request_body: SetEnvelopeDynamicFieldsRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeDynamicFieldsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().set_envelope_dynamic_fields)(request_body, envelope_id)
+ return to_async(super().set_envelope_dynamic_fields)(
+ request_body, envelope_id, request_config=request_config
+ )
def add_envelope_signing_steps(
- self, request_body: AddEnvelopeSigningStepsRequest, envelope_id: str
+ self,
+ request_body: AddEnvelopeSigningStepsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().add_envelope_signing_steps)(request_body, envelope_id)
+ return to_async(super().add_envelope_signing_steps)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_attachments_settings(
- self, request_body: SetEnvelopeAttachmentsSettingsRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsSettingsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[EnvelopeAttachments]:
return to_async(super().set_envelope_attachments_settings)(
- request_body, envelope_id
+ request_body, envelope_id, request_config=request_config
)
def set_envelope_attachments_placeholders(
- self, request_body: SetEnvelopeAttachmentsPlaceholdersRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsPlaceholdersRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[EnvelopeAttachments]:
return to_async(super().set_envelope_attachments_placeholders)(
- request_body, envelope_id
+ request_body, envelope_id, request_config=request_config
)
- def get_attachment_file(self, envelope_id: str, file_id: str) -> Awaitable[bytes]:
- return to_async(super().get_attachment_file)(envelope_id, file_id)
+ def get_attachment_file(
+ self,
+ envelope_id: str,
+ file_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Awaitable[bytes]:
+ return to_async(super().get_attachment_file)(
+ envelope_id, file_id, request_config=request_config
+ )
- def send_envelope(self, envelope_id: str) -> Awaitable[Envelope]:
- return to_async(super().send_envelope)(envelope_id)
+ def send_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Envelope]:
+ return to_async(super().send_envelope)(
+ envelope_id, request_config=request_config
+ )
- def duplicate_envelope(self, envelope_id: str) -> Awaitable[Envelope]:
- return to_async(super().duplicate_envelope)(envelope_id)
+ def duplicate_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Envelope]:
+ return to_async(super().duplicate_envelope)(
+ envelope_id, request_config=request_config
+ )
- def void_envelope(self, envelope_id: str) -> Awaitable[Envelope]:
- return to_async(super().void_envelope)(envelope_id)
+ def void_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Envelope]:
+ return to_async(super().void_envelope)(
+ envelope_id, request_config=request_config
+ )
def rename_envelope(
- self, request_body: RenameEnvelopeRequest, envelope_id: str
+ self,
+ request_body: RenameEnvelopeRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().rename_envelope)(request_body, envelope_id)
+ return to_async(super().rename_envelope)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_comment(
- self, request_body: SetEnvelopeCommentRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeCommentRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().set_envelope_comment)(request_body, envelope_id)
+ return to_async(super().set_envelope_comment)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_notification(
- self, request_body: EnvelopeNotification, envelope_id: str
+ self,
+ request_body: EnvelopeNotification,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().set_envelope_notification)(request_body, envelope_id)
+ return to_async(super().set_envelope_notification)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_expiration_date(
- self, request_body: SetEnvelopeExpirationRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeExpirationRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().set_envelope_expiration_date)(request_body, envelope_id)
+ return to_async(super().set_envelope_expiration_date)(
+ request_body, envelope_id, request_config=request_config
+ )
def set_envelope_legality_level(
- self, request_body: SetEnvelopeLegalityLevelRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeLegalityLevelRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Envelope]:
- return to_async(super().set_envelope_legality_level)(request_body, envelope_id)
+ return to_async(super().set_envelope_legality_level)(
+ request_body, envelope_id, request_config=request_config
+ )
- def get_envelope_annotations(self, envelope_id: str) -> Awaitable[List[Annotation]]:
- return to_async(super().get_envelope_annotations)(envelope_id)
+ def get_envelope_annotations(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[List[Annotation]]:
+ return to_async(super().get_envelope_annotations)(
+ envelope_id, request_config=request_config
+ )
def get_envelope_document_annotations(
- self, envelope_id: str, document_id: str
+ self,
+ envelope_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[ListEnvelopeDocumentAnnotationsResponse]:
return to_async(super().get_envelope_document_annotations)(
- envelope_id, document_id
+ envelope_id, document_id, request_config=request_config
)
def add_envelope_annotation(
- self, request_body: AddAnnotationRequest, envelope_id: str
+ self,
+ request_body: AddAnnotationRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Annotation]:
- return to_async(super().add_envelope_annotation)(request_body, envelope_id)
+ return to_async(super().add_envelope_annotation)(
+ request_body, envelope_id, request_config=request_config
+ )
def delete_envelope_annotation(
- self, envelope_id: str, annotation_id: str
+ self,
+ envelope_id: str,
+ annotation_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[None]:
- return to_async(super().delete_envelope_annotation)(envelope_id, annotation_id)
+ return to_async(super().delete_envelope_annotation)(
+ envelope_id, annotation_id, request_config=request_config
+ )
def create_template(
- self, request_body: CreateTemplateRequest
+ self,
+ request_body: CreateTemplateRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Template]:
- return to_async(super().create_template)(request_body)
+ return to_async(super().create_template)(
+ request_body, request_config=request_config
+ )
def list_templates(
- self, request_body: ListTemplatesRequest = None
+ self,
+ request_body: ListTemplatesRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[ListTemplatesResponse]:
- return to_async(super().list_templates)(request_body)
+ return to_async(super().list_templates)(
+ request_body, request_config=request_config
+ )
- def get_template(self, template_id: str) -> Awaitable[Template]:
- return to_async(super().get_template)(template_id)
+ def get_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Template]:
+ return to_async(super().get_template)(
+ template_id, request_config=request_config
+ )
- def delete_template(self, template_id: str) -> Awaitable[None]:
- return to_async(super().delete_template)(template_id)
+ def delete_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[None]:
+ return to_async(super().delete_template)(
+ template_id, request_config=request_config
+ )
- def duplicate_template(self, template_id: str) -> Awaitable[Template]:
- return to_async(super().duplicate_template)(template_id)
+ def duplicate_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[Template]:
+ return to_async(super().duplicate_template)(
+ template_id, request_config=request_config
+ )
def add_template_document(
- self, request_body: AddTemplateDocumentRequest, template_id: str
+ self,
+ request_body: AddTemplateDocumentRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Document]:
- return to_async(super().add_template_document)(request_body, template_id)
+ return to_async(super().add_template_document)(
+ request_body, template_id, request_config=request_config
+ )
def get_template_document(
- self, template_id: str, document_id: str
+ self,
+ template_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Document]:
- return to_async(super().get_template_document)(template_id, document_id)
+ return to_async(super().get_template_document)(
+ template_id, document_id, request_config=request_config
+ )
def get_template_documents(
- self, template_id: str
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
) -> Awaitable[ListTemplateDocumentsResponse]:
- return to_async(super().get_template_documents)(template_id)
+ return to_async(super().get_template_documents)(
+ template_id, request_config=request_config
+ )
def add_template_signing_steps(
- self, request_body: AddTemplateSigningStepsRequest, template_id: str
+ self,
+ request_body: AddTemplateSigningStepsRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Template]:
- return to_async(super().add_template_signing_steps)(request_body, template_id)
+ return to_async(super().add_template_signing_steps)(
+ request_body, template_id, request_config=request_config
+ )
def rename_template(
- self, request_body: RenameTemplateRequest, template_id: str
+ self,
+ request_body: RenameTemplateRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Template]:
- return to_async(super().rename_template)(request_body, template_id)
+ return to_async(super().rename_template)(
+ request_body, template_id, request_config=request_config
+ )
def set_template_comment(
- self, request_body: SetTemplateCommentRequest, template_id: str
+ self,
+ request_body: SetTemplateCommentRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Template]:
- return to_async(super().set_template_comment)(request_body, template_id)
+ return to_async(super().set_template_comment)(
+ request_body, template_id, request_config=request_config
+ )
def set_template_notification(
- self, request_body: EnvelopeNotification, template_id: str
+ self,
+ request_body: EnvelopeNotification,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Template]:
- return to_async(super().set_template_notification)(request_body, template_id)
+ return to_async(super().set_template_notification)(
+ request_body, template_id, request_config=request_config
+ )
def get_template_annotations(
- self, template_id: str
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
) -> Awaitable[ListTemplateAnnotationsResponse]:
- return to_async(super().get_template_annotations)(template_id)
+ return to_async(super().get_template_annotations)(
+ template_id, request_config=request_config
+ )
def get_document_template_annotations(
- self, template_id: str, document_id: str
+ self,
+ template_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[ListTemplateDocumentAnnotationsResponse]:
return to_async(super().get_document_template_annotations)(
- template_id, document_id
+ template_id, document_id, request_config=request_config
)
def add_template_annotation(
- self, request_body: AddAnnotationRequest, template_id: str
+ self,
+ request_body: AddAnnotationRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[Annotation]:
- return to_async(super().add_template_annotation)(request_body, template_id)
+ return to_async(super().add_template_annotation)(
+ request_body, template_id, request_config=request_config
+ )
def delete_template_annotation(
- self, template_id: str, annotation_id: str
+ self,
+ template_id: str,
+ annotation_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[None]:
- return to_async(super().delete_template_annotation)(template_id, annotation_id)
+ return to_async(super().delete_template_annotation)(
+ template_id, annotation_id, request_config=request_config
+ )
def set_template_attachments_settings(
- self, request_body: SetEnvelopeAttachmentsSettingsRequest, template_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsSettingsRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[EnvelopeAttachments]:
return to_async(super().set_template_attachments_settings)(
- request_body, template_id
+ request_body, template_id, request_config=request_config
)
def set_template_attachments_placeholders(
- self, request_body: SetEnvelopeAttachmentsPlaceholdersRequest, template_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsPlaceholdersRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[EnvelopeAttachments]:
return to_async(super().set_template_attachments_placeholders)(
- request_body, template_id
+ request_body, template_id, request_config=request_config
)
- def create_webhook(self, request_body: CreateWebhookRequest) -> Awaitable[Webhook]:
- return to_async(super().create_webhook)(request_body)
+ def create_webhook(
+ self,
+ request_body: CreateWebhookRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Awaitable[Webhook]:
+ return to_async(super().create_webhook)(
+ request_body, request_config=request_config
+ )
def list_webhooks(
- self, request_body: ListWebhooksRequest = None
+ self,
+ request_body: ListWebhooksRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Awaitable[ListWebhooksResponse]:
- return to_async(super().list_webhooks)(request_body)
+ return to_async(super().list_webhooks)(
+ request_body, request_config=request_config
+ )
- def delete_webhook(self, webhook_id: str) -> Awaitable[None]:
- return to_async(super().delete_webhook)(webhook_id)
+ def delete_webhook(
+ self, webhook_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Awaitable[None]:
+ return to_async(super().delete_webhook)(
+ webhook_id, request_config=request_config
+ )
diff --git a/src/signplus/services/signplus.py b/src/signplus/services/signplus.py
index c1cc15d..413b23e 100644
--- a/src/signplus/services/signplus.py
+++ b/src/signplus/services/signplus.py
@@ -1,7 +1,8 @@
-from typing import List
+from typing import Any, Optional, List
from .utils.validator import Validator
from .utils.base_service import BaseService
from ..net.transport.serializer import Serializer
+from ..net.sdk_config import SdkConfig
from ..net.environment.environment import Environment
from ..models.utils.sentinel import SENTINEL
from ..models.utils.cast_models import cast_models
@@ -46,9 +47,551 @@
class SignplusService(BaseService):
+ """
+ Service class for SignplusService operations.
+ Provides methods to interact with SignplusService-related API endpoints.
+ Inherits common functionality from BaseService including authentication and request handling.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """Initialize the service and method-level configurations."""
+ super().__init__(*args, **kwargs)
+ self._create_envelope_config: SdkConfig = {}
+ self._create_envelope_from_template_config: SdkConfig = {}
+ self._list_envelopes_config: SdkConfig = {}
+ self._get_envelope_config: SdkConfig = {}
+ self._delete_envelope_config: SdkConfig = {}
+ self._download_envelope_signed_documents_config: SdkConfig = {}
+ self._download_envelope_certificate_config: SdkConfig = {}
+ self._get_envelope_document_config: SdkConfig = {}
+ self._get_envelope_documents_config: SdkConfig = {}
+ self._add_envelope_document_config: SdkConfig = {}
+ self._set_envelope_dynamic_fields_config: SdkConfig = {}
+ self._add_envelope_signing_steps_config: SdkConfig = {}
+ self._set_envelope_attachments_settings_config: SdkConfig = {}
+ self._set_envelope_attachments_placeholders_config: SdkConfig = {}
+ self._get_attachment_file_config: SdkConfig = {}
+ self._send_envelope_config: SdkConfig = {}
+ self._duplicate_envelope_config: SdkConfig = {}
+ self._void_envelope_config: SdkConfig = {}
+ self._rename_envelope_config: SdkConfig = {}
+ self._set_envelope_comment_config: SdkConfig = {}
+ self._set_envelope_notification_config: SdkConfig = {}
+ self._set_envelope_expiration_date_config: SdkConfig = {}
+ self._set_envelope_legality_level_config: SdkConfig = {}
+ self._get_envelope_annotations_config: SdkConfig = {}
+ self._get_envelope_document_annotations_config: SdkConfig = {}
+ self._add_envelope_annotation_config: SdkConfig = {}
+ self._delete_envelope_annotation_config: SdkConfig = {}
+ self._create_template_config: SdkConfig = {}
+ self._list_templates_config: SdkConfig = {}
+ self._get_template_config: SdkConfig = {}
+ self._delete_template_config: SdkConfig = {}
+ self._duplicate_template_config: SdkConfig = {}
+ self._add_template_document_config: SdkConfig = {}
+ self._get_template_document_config: SdkConfig = {}
+ self._get_template_documents_config: SdkConfig = {}
+ self._add_template_signing_steps_config: SdkConfig = {}
+ self._rename_template_config: SdkConfig = {}
+ self._set_template_comment_config: SdkConfig = {}
+ self._set_template_notification_config: SdkConfig = {}
+ self._get_template_annotations_config: SdkConfig = {}
+ self._get_document_template_annotations_config: SdkConfig = {}
+ self._add_template_annotation_config: SdkConfig = {}
+ self._delete_template_annotation_config: SdkConfig = {}
+ self._set_template_attachments_settings_config: SdkConfig = {}
+ self._set_template_attachments_placeholders_config: SdkConfig = {}
+ self._create_webhook_config: SdkConfig = {}
+ self._list_webhooks_config: SdkConfig = {}
+ self._delete_webhook_config: SdkConfig = {}
+
+ def set_create_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for create_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._create_envelope_config = config
+ return self
+
+ def set_create_envelope_from_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for create_envelope_from_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._create_envelope_from_template_config = config
+ return self
+
+ def set_list_envelopes_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for list_envelopes.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._list_envelopes_config = config
+ return self
+
+ def set_get_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_envelope_config = config
+ return self
+
+ def set_delete_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for delete_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._delete_envelope_config = config
+ return self
+
+ def set_download_envelope_signed_documents_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for download_envelope_signed_documents.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._download_envelope_signed_documents_config = config
+ return self
+
+ def set_download_envelope_certificate_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for download_envelope_certificate.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._download_envelope_certificate_config = config
+ return self
+
+ def set_get_envelope_document_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_envelope_document.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_envelope_document_config = config
+ return self
+
+ def set_get_envelope_documents_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_envelope_documents.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_envelope_documents_config = config
+ return self
+
+ def set_add_envelope_document_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_envelope_document.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_envelope_document_config = config
+ return self
+
+ def set_set_envelope_dynamic_fields_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_dynamic_fields.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_dynamic_fields_config = config
+ return self
+
+ def set_add_envelope_signing_steps_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_envelope_signing_steps.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_envelope_signing_steps_config = config
+ return self
+
+ def set_set_envelope_attachments_settings_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_attachments_settings.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_attachments_settings_config = config
+ return self
+
+ def set_set_envelope_attachments_placeholders_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_attachments_placeholders.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_attachments_placeholders_config = config
+ return self
+
+ def set_get_attachment_file_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_attachment_file.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_attachment_file_config = config
+ return self
+
+ def set_send_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for send_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._send_envelope_config = config
+ return self
+
+ def set_duplicate_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for duplicate_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._duplicate_envelope_config = config
+ return self
+
+ def set_void_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for void_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._void_envelope_config = config
+ return self
+
+ def set_rename_envelope_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for rename_envelope.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._rename_envelope_config = config
+ return self
+
+ def set_set_envelope_comment_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_comment.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_comment_config = config
+ return self
+
+ def set_set_envelope_notification_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_notification.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_notification_config = config
+ return self
+
+ def set_set_envelope_expiration_date_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_expiration_date.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_expiration_date_config = config
+ return self
+
+ def set_set_envelope_legality_level_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_envelope_legality_level.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_envelope_legality_level_config = config
+ return self
+
+ def set_get_envelope_annotations_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_envelope_annotations.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_envelope_annotations_config = config
+ return self
+
+ def set_get_envelope_document_annotations_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_envelope_document_annotations.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_envelope_document_annotations_config = config
+ return self
+
+ def set_add_envelope_annotation_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_envelope_annotation.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_envelope_annotation_config = config
+ return self
+
+ def set_delete_envelope_annotation_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for delete_envelope_annotation.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._delete_envelope_annotation_config = config
+ return self
+
+ def set_create_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for create_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._create_template_config = config
+ return self
+
+ def set_list_templates_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for list_templates.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._list_templates_config = config
+ return self
+
+ def set_get_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_template_config = config
+ return self
+
+ def set_delete_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for delete_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._delete_template_config = config
+ return self
+
+ def set_duplicate_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for duplicate_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._duplicate_template_config = config
+ return self
+
+ def set_add_template_document_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_template_document.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_template_document_config = config
+ return self
+
+ def set_get_template_document_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_template_document.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_template_document_config = config
+ return self
+
+ def set_get_template_documents_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_template_documents.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_template_documents_config = config
+ return self
+
+ def set_add_template_signing_steps_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_template_signing_steps.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_template_signing_steps_config = config
+ return self
+
+ def set_rename_template_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for rename_template.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._rename_template_config = config
+ return self
+
+ def set_set_template_comment_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_template_comment.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_template_comment_config = config
+ return self
+
+ def set_set_template_notification_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_template_notification.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_template_notification_config = config
+ return self
+
+ def set_get_template_annotations_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_template_annotations.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_template_annotations_config = config
+ return self
+
+ def set_get_document_template_annotations_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for get_document_template_annotations.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._get_document_template_annotations_config = config
+ return self
+
+ def set_add_template_annotation_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for add_template_annotation.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._add_template_annotation_config = config
+ return self
+
+ def set_delete_template_annotation_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for delete_template_annotation.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._delete_template_annotation_config = config
+ return self
+
+ def set_set_template_attachments_settings_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_template_attachments_settings.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_template_attachments_settings_config = config
+ return self
+
+ def set_set_template_attachments_placeholders_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for set_template_attachments_placeholders.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._set_template_attachments_placeholders_config = config
+ return self
+
+ def set_create_webhook_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for create_webhook.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._create_webhook_config = config
+ return self
+
+ def set_list_webhooks_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for list_webhooks.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._list_webhooks_config = config
+ return self
+
+ def set_delete_webhook_config(self, config: SdkConfig):
+ """
+ Sets method-level configuration for delete_webhook.
+
+ :param SdkConfig config: Configuration dictionary to override service-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._delete_webhook_config = config
+ return self
@cast_models
- def create_envelope(self, request_body: CreateEnvelopeRequest) -> Envelope:
+ def create_envelope(
+ self,
+ request_body: CreateEnvelopeRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Envelope:
"""Create new envelope
:param request_body: The request body.
@@ -62,10 +605,15 @@ def create_envelope(self, request_body: CreateEnvelopeRequest) -> Envelope:
Validator(CreateEnvelopeRequest).validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._create_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -73,11 +621,15 @@ def create_envelope(self, request_body: CreateEnvelopeRequest) -> Envelope:
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def create_envelope_from_template(
- self, request_body: CreateEnvelopeFromTemplateRequest, template_id: str
+ self,
+ request_body: CreateEnvelopeFromTemplateRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Create new envelope from template
@@ -95,10 +647,15 @@ def create_envelope_from_template(
Validator(CreateEnvelopeFromTemplateRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._create_envelope_from_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/from_template/{{template_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/from_template/{{template_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -107,11 +664,14 @@ def create_envelope_from_template(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def list_envelopes(
- self, request_body: ListEnvelopesRequest = None
+ self,
+ request_body: ListEnvelopesRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> ListEnvelopesResponse:
"""List envelopes
@@ -126,10 +686,15 @@ def list_envelopes(
Validator(ListEnvelopesRequest).is_optional().validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._list_envelopes_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelopes",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelopes",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -137,10 +702,16 @@ def list_envelopes(
)
response, _, _ = self.send_request(serialized_request)
- return ListEnvelopesResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListEnvelopesResponse.model_validate(response)
+ )
@cast_models
- def get_envelope(self, envelope_id: str) -> Envelope:
+ def get_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Envelope:
"""Get envelope
:param envelope_id: envelope_id
@@ -154,10 +725,15 @@ def get_envelope(self, envelope_id: str) -> Envelope:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._get_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -165,10 +741,12 @@ def get_envelope(self, envelope_id: str) -> Envelope:
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
- def delete_envelope(self, envelope_id: str) -> None:
+ def delete_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> None:
"""Delete envelope
:param envelope_id: envelope_id
@@ -180,10 +758,15 @@ def delete_envelope(self, envelope_id: str) -> None:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._delete_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -194,8 +777,12 @@ def delete_envelope(self, envelope_id: str) -> None:
@cast_models
def download_envelope_signed_documents(
- self, envelope_id: str, certificate_of_completion: bool = SENTINEL
- ) -> any:
+ self,
+ envelope_id: str,
+ certificate_of_completion: bool = SENTINEL,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Any:
"""Download signed documents for an envelope
:param envelope_id: ID of the envelope
@@ -206,16 +793,21 @@ def download_envelope_signed_documents(
:raises RequestError: Raised when a request fails, with optional HTTP status code and details.
...
:return: The parsed response data.
- :rtype: any
+ :rtype: Any
"""
Validator(str).validate(envelope_id)
Validator(bool).is_optional().validate(certificate_of_completion)
+ resolved_config = self._get_resolved_config(
+ self._download_envelope_signed_documents_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/signed_documents",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/signed_documents",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.add_query("certificate_of_completion", certificate_of_completion)
@@ -227,7 +819,9 @@ def download_envelope_signed_documents(
return response
@cast_models
- def download_envelope_certificate(self, envelope_id: str) -> any:
+ def download_envelope_certificate(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Any:
"""Download certificate of completion for an envelope
:param envelope_id: ID of the envelope
@@ -236,15 +830,20 @@ def download_envelope_certificate(self, envelope_id: str) -> any:
:raises RequestError: Raised when a request fails, with optional HTTP status code and details.
...
:return: The parsed response data.
- :rtype: any
+ :rtype: Any
"""
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._download_envelope_certificate_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/certificate",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/certificate",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -255,7 +854,13 @@ def download_envelope_certificate(self, envelope_id: str) -> any:
return response
@cast_models
- def get_envelope_document(self, envelope_id: str, document_id: str) -> Document:
+ def get_envelope_document(
+ self,
+ envelope_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Document:
"""Get envelope document
:param envelope_id: envelope_id
@@ -272,10 +877,15 @@ def get_envelope_document(self, envelope_id: str, document_id: str) -> Document:
Validator(str).validate(envelope_id)
Validator(str).validate(document_id)
+ resolved_config = self._get_resolved_config(
+ self._get_envelope_document_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/document/{{document_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/document/{{document_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.add_path("document_id", document_id)
@@ -284,10 +894,12 @@ def get_envelope_document(self, envelope_id: str, document_id: str) -> Document:
)
response, _, _ = self.send_request(serialized_request)
- return Document._unmap(response)
+ return None if response in (b"", "") else Document.model_validate(response)
@cast_models
- def get_envelope_documents(self, envelope_id: str) -> ListEnvelopeDocumentsResponse:
+ def get_envelope_documents(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> ListEnvelopeDocumentsResponse:
"""Get envelope documents
:param envelope_id: envelope_id
@@ -301,10 +913,15 @@ def get_envelope_documents(self, envelope_id: str) -> ListEnvelopeDocumentsRespo
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._get_envelope_documents_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/documents",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/documents",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -312,11 +929,19 @@ def get_envelope_documents(self, envelope_id: str) -> ListEnvelopeDocumentsRespo
)
response, _, _ = self.send_request(serialized_request)
- return ListEnvelopeDocumentsResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListEnvelopeDocumentsResponse.model_validate(response)
+ )
@cast_models
def add_envelope_document(
- self, request_body: AddEnvelopeDocumentRequest, envelope_id: str
+ self,
+ request_body: AddEnvelopeDocumentRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Document:
"""Add envelope document
@@ -334,10 +959,15 @@ def add_envelope_document(
Validator(AddEnvelopeDocumentRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._add_envelope_document_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/document",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/document",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -346,11 +976,15 @@ def add_envelope_document(
)
response, _, _ = self.send_request(serialized_request)
- return Document._unmap(response)
+ return None if response in (b"", "") else Document.model_validate(response)
@cast_models
def set_envelope_dynamic_fields(
- self, request_body: SetEnvelopeDynamicFieldsRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeDynamicFieldsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Set envelope dynamic fields
@@ -368,10 +1002,15 @@ def set_envelope_dynamic_fields(
Validator(SetEnvelopeDynamicFieldsRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_dynamic_fields_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/dynamic_fields",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/dynamic_fields",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -380,11 +1019,15 @@ def set_envelope_dynamic_fields(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def add_envelope_signing_steps(
- self, request_body: AddEnvelopeSigningStepsRequest, envelope_id: str
+ self,
+ request_body: AddEnvelopeSigningStepsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Add envelope signing steps
@@ -402,10 +1045,15 @@ def add_envelope_signing_steps(
Validator(AddEnvelopeSigningStepsRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._add_envelope_signing_steps_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/signing_steps",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/signing_steps",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -414,11 +1062,15 @@ def add_envelope_signing_steps(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def set_envelope_attachments_settings(
- self, request_body: SetEnvelopeAttachmentsSettingsRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsSettingsRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> EnvelopeAttachments:
"""Set envelope attachment settings
@@ -436,10 +1088,15 @@ def set_envelope_attachments_settings(
Validator(SetEnvelopeAttachmentsSettingsRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_attachments_settings_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/settings",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/settings",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -448,11 +1105,19 @@ def set_envelope_attachments_settings(
)
response, _, _ = self.send_request(serialized_request)
- return EnvelopeAttachments._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else EnvelopeAttachments.model_validate(response)
+ )
@cast_models
def set_envelope_attachments_placeholders(
- self, request_body: SetEnvelopeAttachmentsPlaceholdersRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsPlaceholdersRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> EnvelopeAttachments:
"""Placeholders to be set, completely replacing the existing ones.
@@ -470,10 +1135,15 @@ def set_envelope_attachments_placeholders(
Validator(SetEnvelopeAttachmentsPlaceholdersRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_attachments_placeholders_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/placeholders",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/placeholders",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -482,10 +1152,20 @@ def set_envelope_attachments_placeholders(
)
response, _, _ = self.send_request(serialized_request)
- return EnvelopeAttachments._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else EnvelopeAttachments.model_validate(response)
+ )
@cast_models
- def get_attachment_file(self, envelope_id: str, file_id: str) -> bytes:
+ def get_attachment_file(
+ self,
+ envelope_id: str,
+ file_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> bytes:
"""Get envelope attachment file
:param envelope_id: envelope_id
@@ -502,10 +1182,15 @@ def get_attachment_file(self, envelope_id: str, file_id: str) -> bytes:
Validator(str).validate(envelope_id)
Validator(str).validate(file_id)
+ resolved_config = self._get_resolved_config(
+ self._get_attachment_file_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/{{file_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/attachments/{{file_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.add_path("file_id", file_id)
@@ -517,7 +1202,9 @@ def get_attachment_file(self, envelope_id: str, file_id: str) -> bytes:
return response
@cast_models
- def send_envelope(self, envelope_id: str) -> Envelope:
+ def send_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Envelope:
"""Send envelope for signature
:param envelope_id: envelope_id
@@ -531,10 +1218,15 @@ def send_envelope(self, envelope_id: str) -> Envelope:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._send_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/send",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/send",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -542,10 +1234,12 @@ def send_envelope(self, envelope_id: str) -> Envelope:
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
- def duplicate_envelope(self, envelope_id: str) -> Envelope:
+ def duplicate_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Envelope:
"""Duplicate envelope
:param envelope_id: envelope_id
@@ -559,10 +1253,15 @@ def duplicate_envelope(self, envelope_id: str) -> Envelope:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._duplicate_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/duplicate",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/duplicate",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -570,10 +1269,12 @@ def duplicate_envelope(self, envelope_id: str) -> Envelope:
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
- def void_envelope(self, envelope_id: str) -> Envelope:
+ def void_envelope(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Envelope:
"""Void envelope
:param envelope_id: envelope_id
@@ -587,10 +1288,15 @@ def void_envelope(self, envelope_id: str) -> Envelope:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._void_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/void",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/void",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -598,11 +1304,15 @@ def void_envelope(self, envelope_id: str) -> Envelope:
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def rename_envelope(
- self, request_body: RenameEnvelopeRequest, envelope_id: str
+ self,
+ request_body: RenameEnvelopeRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Rename envelope
@@ -620,10 +1330,15 @@ def rename_envelope(
Validator(RenameEnvelopeRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._rename_envelope_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/rename",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/rename",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -632,11 +1347,15 @@ def rename_envelope(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def set_envelope_comment(
- self, request_body: SetEnvelopeCommentRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeCommentRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Set envelope comment
@@ -654,10 +1373,15 @@ def set_envelope_comment(
Validator(SetEnvelopeCommentRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_comment_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_comment",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_comment",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -666,11 +1390,15 @@ def set_envelope_comment(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def set_envelope_notification(
- self, request_body: EnvelopeNotification, envelope_id: str
+ self,
+ request_body: EnvelopeNotification,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Set envelope notification
@@ -688,10 +1416,15 @@ def set_envelope_notification(
Validator(EnvelopeNotification).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_notification_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_notification",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_notification",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -700,11 +1433,15 @@ def set_envelope_notification(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def set_envelope_expiration_date(
- self, request_body: SetEnvelopeExpirationRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeExpirationRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Set envelope expiration date
@@ -722,10 +1459,15 @@ def set_envelope_expiration_date(
Validator(SetEnvelopeExpirationRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_expiration_date_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_expiration_date",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_expiration_date",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -734,11 +1476,15 @@ def set_envelope_expiration_date(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
def set_envelope_legality_level(
- self, request_body: SetEnvelopeLegalityLevelRequest, envelope_id: str
+ self,
+ request_body: SetEnvelopeLegalityLevelRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Envelope:
"""Set envelope legality level
@@ -756,10 +1502,15 @@ def set_envelope_legality_level(
Validator(SetEnvelopeLegalityLevelRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._set_envelope_legality_level_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_legality_level",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/set_legality_level",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -768,10 +1519,12 @@ def set_envelope_legality_level(
)
response, _, _ = self.send_request(serialized_request)
- return Envelope._unmap(response)
+ return None if response in (b"", "") else Envelope.model_validate(response)
@cast_models
- def get_envelope_annotations(self, envelope_id: str) -> List[Annotation]:
+ def get_envelope_annotations(
+ self, envelope_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> List[Annotation]:
"""Get envelope annotations
:param envelope_id: ID of the envelope
@@ -785,10 +1538,15 @@ def get_envelope_annotations(self, envelope_id: str) -> List[Annotation]:
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._get_envelope_annotations_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotations",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotations",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -796,11 +1554,18 @@ def get_envelope_annotations(self, envelope_id: str) -> List[Annotation]:
)
response, _, _ = self.send_request(serialized_request)
- return [Annotation._unmap(item) for item in response]
+ return [
+ Annotation.model_validate(item)
+ for item in (response if isinstance(response, list) else [])
+ ]
@cast_models
def get_envelope_document_annotations(
- self, envelope_id: str, document_id: str
+ self,
+ envelope_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> ListEnvelopeDocumentAnnotationsResponse:
"""Get envelope document annotations
@@ -818,10 +1583,15 @@ def get_envelope_document_annotations(
Validator(str).validate(envelope_id)
Validator(str).validate(document_id)
+ resolved_config = self._get_resolved_config(
+ self._get_envelope_document_annotations_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotations/{{document_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotations/{{document_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.add_path("document_id", document_id)
@@ -830,11 +1600,19 @@ def get_envelope_document_annotations(
)
response, _, _ = self.send_request(serialized_request)
- return ListEnvelopeDocumentAnnotationsResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListEnvelopeDocumentAnnotationsResponse.model_validate(response)
+ )
@cast_models
def add_envelope_annotation(
- self, request_body: AddAnnotationRequest, envelope_id: str
+ self,
+ request_body: AddAnnotationRequest,
+ envelope_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Annotation:
"""Add envelope annotation
@@ -852,10 +1630,15 @@ def add_envelope_annotation(
Validator(AddAnnotationRequest).validate(request_body)
Validator(str).validate(envelope_id)
+ resolved_config = self._get_resolved_config(
+ self._add_envelope_annotation_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotation",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotation",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.serialize()
@@ -864,10 +1647,16 @@ def add_envelope_annotation(
)
response, _, _ = self.send_request(serialized_request)
- return Annotation._unmap(response)
+ return None if response in (b"", "") else Annotation.model_validate(response)
@cast_models
- def delete_envelope_annotation(self, envelope_id: str, annotation_id: str) -> None:
+ def delete_envelope_annotation(
+ self,
+ envelope_id: str,
+ annotation_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> None:
"""Delete envelope annotation
:param envelope_id: ID of the envelope
@@ -882,10 +1671,15 @@ def delete_envelope_annotation(self, envelope_id: str, annotation_id: str) -> No
Validator(str).validate(envelope_id)
Validator(str).validate(annotation_id)
+ resolved_config = self._get_resolved_config(
+ self._delete_envelope_annotation_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotation/{{annotation_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/envelope/{{envelope_id}}/annotation/{{annotation_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("envelope_id", envelope_id)
.add_path("annotation_id", annotation_id)
@@ -896,7 +1690,12 @@ def delete_envelope_annotation(self, envelope_id: str, annotation_id: str) -> No
self.send_request(serialized_request)
@cast_models
- def create_template(self, request_body: CreateTemplateRequest) -> Template:
+ def create_template(
+ self,
+ request_body: CreateTemplateRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Template:
"""Create new template
:param request_body: The request body.
@@ -910,10 +1709,15 @@ def create_template(self, request_body: CreateTemplateRequest) -> Template:
Validator(CreateTemplateRequest).validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._create_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -921,11 +1725,14 @@ def create_template(self, request_body: CreateTemplateRequest) -> Template:
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def list_templates(
- self, request_body: ListTemplatesRequest = None
+ self,
+ request_body: ListTemplatesRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> ListTemplatesResponse:
"""List templates
@@ -940,10 +1747,15 @@ def list_templates(
Validator(ListTemplatesRequest).is_optional().validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._list_templates_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/templates",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/templates",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -951,10 +1763,16 @@ def list_templates(
)
response, _, _ = self.send_request(serialized_request)
- return ListTemplatesResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListTemplatesResponse.model_validate(response)
+ )
@cast_models
- def get_template(self, template_id: str) -> Template:
+ def get_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Template:
"""Get template
:param template_id: template_id
@@ -968,10 +1786,15 @@ def get_template(self, template_id: str) -> Template:
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._get_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -979,10 +1802,12 @@ def get_template(self, template_id: str) -> Template:
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
- def delete_template(self, template_id: str) -> None:
+ def delete_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> None:
"""Delete template
:param template_id: template_id
@@ -994,10 +1819,15 @@ def delete_template(self, template_id: str) -> None:
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._delete_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1007,7 +1837,9 @@ def delete_template(self, template_id: str) -> None:
self.send_request(serialized_request)
@cast_models
- def duplicate_template(self, template_id: str) -> Template:
+ def duplicate_template(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> Template:
"""Duplicate template
:param template_id: template_id
@@ -1021,10 +1853,15 @@ def duplicate_template(self, template_id: str) -> Template:
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._duplicate_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/duplicate",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/duplicate",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1032,11 +1869,15 @@ def duplicate_template(self, template_id: str) -> Template:
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def add_template_document(
- self, request_body: AddTemplateDocumentRequest, template_id: str
+ self,
+ request_body: AddTemplateDocumentRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Document:
"""Add template document
@@ -1054,10 +1895,15 @@ def add_template_document(
Validator(AddTemplateDocumentRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._add_template_document_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/document",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/document",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1066,10 +1912,16 @@ def add_template_document(
)
response, _, _ = self.send_request(serialized_request)
- return Document._unmap(response)
+ return None if response in (b"", "") else Document.model_validate(response)
@cast_models
- def get_template_document(self, template_id: str, document_id: str) -> Document:
+ def get_template_document(
+ self,
+ template_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Document:
"""Get template document
:param template_id: template_id
@@ -1086,10 +1938,15 @@ def get_template_document(self, template_id: str, document_id: str) -> Document:
Validator(str).validate(template_id)
Validator(str).validate(document_id)
+ resolved_config = self._get_resolved_config(
+ self._get_template_document_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/document/{{document_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/document/{{document_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.add_path("document_id", document_id)
@@ -1098,10 +1955,12 @@ def get_template_document(self, template_id: str, document_id: str) -> Document:
)
response, _, _ = self.send_request(serialized_request)
- return Document._unmap(response)
+ return None if response in (b"", "") else Document.model_validate(response)
@cast_models
- def get_template_documents(self, template_id: str) -> ListTemplateDocumentsResponse:
+ def get_template_documents(
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> ListTemplateDocumentsResponse:
"""Get template documents
:param template_id: template_id
@@ -1115,10 +1974,15 @@ def get_template_documents(self, template_id: str) -> ListTemplateDocumentsRespo
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._get_template_documents_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/documents",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/documents",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1126,11 +1990,19 @@ def get_template_documents(self, template_id: str) -> ListTemplateDocumentsRespo
)
response, _, _ = self.send_request(serialized_request)
- return ListTemplateDocumentsResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListTemplateDocumentsResponse.model_validate(response)
+ )
@cast_models
def add_template_signing_steps(
- self, request_body: AddTemplateSigningStepsRequest, template_id: str
+ self,
+ request_body: AddTemplateSigningStepsRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Template:
"""Add template signing steps
@@ -1148,10 +2020,15 @@ def add_template_signing_steps(
Validator(AddTemplateSigningStepsRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._add_template_signing_steps_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/signing_steps",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/signing_steps",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1160,11 +2037,15 @@ def add_template_signing_steps(
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def rename_template(
- self, request_body: RenameTemplateRequest, template_id: str
+ self,
+ request_body: RenameTemplateRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Template:
"""Rename template
@@ -1182,10 +2063,15 @@ def rename_template(
Validator(RenameTemplateRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._rename_template_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/rename",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/rename",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1194,11 +2080,15 @@ def rename_template(
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def set_template_comment(
- self, request_body: SetTemplateCommentRequest, template_id: str
+ self,
+ request_body: SetTemplateCommentRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Template:
"""Set template comment
@@ -1216,10 +2106,15 @@ def set_template_comment(
Validator(SetTemplateCommentRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._set_template_comment_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/set_comment",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/set_comment",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1228,11 +2123,15 @@ def set_template_comment(
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def set_template_notification(
- self, request_body: EnvelopeNotification, template_id: str
+ self,
+ request_body: EnvelopeNotification,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Template:
"""Set template notification
@@ -1250,10 +2149,15 @@ def set_template_notification(
Validator(EnvelopeNotification).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._set_template_notification_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/set_notification",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/set_notification",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1262,11 +2166,11 @@ def set_template_notification(
)
response, _, _ = self.send_request(serialized_request)
- return Template._unmap(response)
+ return None if response in (b"", "") else Template.model_validate(response)
@cast_models
def get_template_annotations(
- self, template_id: str
+ self, template_id: str, *, request_config: Optional[SdkConfig] = None
) -> ListTemplateAnnotationsResponse:
"""Get template annotations
@@ -1281,10 +2185,15 @@ def get_template_annotations(
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._get_template_annotations_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotations",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotations",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1292,11 +2201,19 @@ def get_template_annotations(
)
response, _, _ = self.send_request(serialized_request)
- return ListTemplateAnnotationsResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListTemplateAnnotationsResponse.model_validate(response)
+ )
@cast_models
def get_document_template_annotations(
- self, template_id: str, document_id: str
+ self,
+ template_id: str,
+ document_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> ListTemplateDocumentAnnotationsResponse:
"""Get document template annotations
@@ -1314,10 +2231,15 @@ def get_document_template_annotations(
Validator(str).validate(template_id)
Validator(str).validate(document_id)
+ resolved_config = self._get_resolved_config(
+ self._get_document_template_annotations_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotations/{{document_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotations/{{document_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.add_path("document_id", document_id)
@@ -1326,11 +2248,19 @@ def get_document_template_annotations(
)
response, _, _ = self.send_request(serialized_request)
- return ListTemplateDocumentAnnotationsResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListTemplateDocumentAnnotationsResponse.model_validate(response)
+ )
@cast_models
def add_template_annotation(
- self, request_body: AddAnnotationRequest, template_id: str
+ self,
+ request_body: AddAnnotationRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> Annotation:
"""Add template annotation
@@ -1348,10 +2278,15 @@ def add_template_annotation(
Validator(AddAnnotationRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._add_template_annotation_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotation",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotation",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1360,10 +2295,16 @@ def add_template_annotation(
)
response, _, _ = self.send_request(serialized_request)
- return Annotation._unmap(response)
+ return None if response in (b"", "") else Annotation.model_validate(response)
@cast_models
- def delete_template_annotation(self, template_id: str, annotation_id: str) -> None:
+ def delete_template_annotation(
+ self,
+ template_id: str,
+ annotation_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> None:
"""Delete template annotation
:param template_id: ID of the template
@@ -1378,10 +2319,15 @@ def delete_template_annotation(self, template_id: str, annotation_id: str) -> No
Validator(str).validate(template_id)
Validator(str).validate(annotation_id)
+ resolved_config = self._get_resolved_config(
+ self._delete_template_annotation_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotation/{{annotation_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/annotation/{{annotation_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.add_path("annotation_id", annotation_id)
@@ -1393,7 +2339,11 @@ def delete_template_annotation(self, template_id: str, annotation_id: str) -> No
@cast_models
def set_template_attachments_settings(
- self, request_body: SetEnvelopeAttachmentsSettingsRequest, template_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsSettingsRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> EnvelopeAttachments:
"""Set template attachment settings
@@ -1411,10 +2361,15 @@ def set_template_attachments_settings(
Validator(SetEnvelopeAttachmentsSettingsRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._set_template_attachments_settings_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/attachments/settings",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/attachments/settings",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1423,11 +2378,19 @@ def set_template_attachments_settings(
)
response, _, _ = self.send_request(serialized_request)
- return EnvelopeAttachments._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else EnvelopeAttachments.model_validate(response)
+ )
@cast_models
def set_template_attachments_placeholders(
- self, request_body: SetEnvelopeAttachmentsPlaceholdersRequest, template_id: str
+ self,
+ request_body: SetEnvelopeAttachmentsPlaceholdersRequest,
+ template_id: str,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> EnvelopeAttachments:
"""Placeholders to be set, completely replacing the existing ones.
@@ -1445,10 +2408,15 @@ def set_template_attachments_placeholders(
Validator(SetEnvelopeAttachmentsPlaceholdersRequest).validate(request_body)
Validator(str).validate(template_id)
+ resolved_config = self._get_resolved_config(
+ self._set_template_attachments_placeholders_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/attachments/placeholders",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/template/{{template_id}}/attachments/placeholders",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("template_id", template_id)
.serialize()
@@ -1457,10 +2425,19 @@ def set_template_attachments_placeholders(
)
response, _, _ = self.send_request(serialized_request)
- return EnvelopeAttachments._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else EnvelopeAttachments.model_validate(response)
+ )
@cast_models
- def create_webhook(self, request_body: CreateWebhookRequest) -> Webhook:
+ def create_webhook(
+ self,
+ request_body: CreateWebhookRequest,
+ *,
+ request_config: Optional[SdkConfig] = None,
+ ) -> Webhook:
"""Create webhook
:param request_body: The request body.
@@ -1474,10 +2451,15 @@ def create_webhook(self, request_body: CreateWebhookRequest) -> Webhook:
Validator(CreateWebhookRequest).validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._create_webhook_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/webhook",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/webhook",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -1485,11 +2467,14 @@ def create_webhook(self, request_body: CreateWebhookRequest) -> Webhook:
)
response, _, _ = self.send_request(serialized_request)
- return Webhook._unmap(response)
+ return None if response in (b"", "") else Webhook.model_validate(response)
@cast_models
def list_webhooks(
- self, request_body: ListWebhooksRequest = None
+ self,
+ request_body: ListWebhooksRequest = None,
+ *,
+ request_config: Optional[SdkConfig] = None,
) -> ListWebhooksResponse:
"""List webhooks
@@ -1504,10 +2489,15 @@ def list_webhooks(
Validator(ListWebhooksRequest).is_optional().validate(request_body)
+ resolved_config = self._get_resolved_config(
+ self._list_webhooks_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/webhooks",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/webhooks",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.serialize()
.set_method("POST")
@@ -1515,10 +2505,16 @@ def list_webhooks(
)
response, _, _ = self.send_request(serialized_request)
- return ListWebhooksResponse._unmap(response)
+ return (
+ None
+ if response in (b"", "")
+ else ListWebhooksResponse.model_validate(response)
+ )
@cast_models
- def delete_webhook(self, webhook_id: str) -> None:
+ def delete_webhook(
+ self, webhook_id: str, *, request_config: Optional[SdkConfig] = None
+ ) -> None:
"""Delete webhook
:param webhook_id: webhook_id
@@ -1530,10 +2526,15 @@ def delete_webhook(self, webhook_id: str) -> None:
Validator(str).validate(webhook_id)
+ resolved_config = self._get_resolved_config(
+ self._delete_webhook_config, request_config
+ )
+
serialized_request = (
Serializer(
- f"{self.base_url or Environment.DEFAULT.url}/webhook/{{webhook_id}}",
- [self.get_access_token()],
+ f"{resolved_config.get('base_url') or self.base_url or Environment.DEFAULT.url}/webhook/{{webhook_id}}",
+ [self.get_access_token(resolved_config)],
+ resolved_config,
)
.add_path("webhook_id", webhook_id)
.serialize()
diff --git a/src/signplus/services/utils/base_service.py b/src/signplus/services/utils/base_service.py
index db2e2d5..4db3a29 100644
--- a/src/signplus/services/utils/base_service.py
+++ b/src/signplus/services/utils/base_service.py
@@ -1,4 +1,4 @@
-from typing import Any, Dict, Tuple, Generator
+from typing import Any, Dict, Tuple, Generator, TYPE_CHECKING
from enum import Enum
from .default_headers import DefaultHeaders, DefaultHeadersKeys
@@ -7,11 +7,13 @@
from ...net.transport.request import Request
from ...net.request_chain.request_chain import RequestChain
-from ...net.request_chain.handlers.hook_handler import HookHandler
from ...net.request_chain.handlers.http_handler import HttpHandler
from ...net.headers.access_token_auth import AccessTokenAuth
from ...net.request_chain.handlers.retry_handler import RetryHandler
+if TYPE_CHECKING:
+ from ...net.sdk_config import SdkConfig
+
class BaseService:
"""
@@ -27,9 +29,10 @@ def __init__(self, base_url: str) -> None:
:param str base_url: The base URL for the service. Defaults to None.
"""
- self.base_url = base_url
+ self.base_url = base_url.rstrip("/") if base_url else base_url
self._default_headers = DefaultHeaders()
self._timeout = 60000
+ self._service_config: "SdkConfig" = {}
self._update_request_handler()
@@ -43,13 +46,19 @@ def set_access_token(self, access_token: str):
return self
- def get_access_token(self) -> BaseHeader:
+ def get_access_token(self, resolved_config: "SdkConfig" = None) -> BaseHeader:
"""
- Get the access auth header.
+ Get the access auth header, with optional config overrides.
+ :param SdkConfig resolved_config: Optional resolved configuration for overrides.
:return: The access auth header.
:rtype: BaseHeader
"""
+ if resolved_config and (
+ "token" in resolved_config or "access_token" in resolved_config
+ ):
+ token = resolved_config.get("token") or resolved_config.get("access_token")
+ return AccessTokenAuth(token)
return self._default_headers.get_header(DefaultHeadersKeys.ACCESS_AUTH)
def set_timeout(self, timeout: int):
@@ -70,10 +79,78 @@ def set_base_url(self, base_url: str):
:param str base_url: The base URL to be set.
"""
- self.base_url = base_url
+ self.base_url = base_url.rstrip("/") if base_url else base_url
+
+ return self
+
+ def set_config(self, config: "SdkConfig"):
+ """
+ Sets service-level configuration that applies to all methods in this service.
+ :param SdkConfig config: Configuration dictionary to override SDK-level defaults.
+ :return: The service instance for method chaining.
+ """
+ self._service_config = config
return self
+ @staticmethod
+ def _deep_merge(base: dict, override: dict) -> dict:
+ """
+ Recursively merges two dictionaries. Nested dicts are merged key-by-key so
+ that a partial override (e.g. ``{"retry": {"attempts": 5}}``) only overwrites
+ the keys it specifies instead of replacing the entire nested dict.
+
+ Every dict value from ``override`` is recursed into (creating a fresh dict),
+ so override sources are never shared by reference in the result. Unoverridden
+ nested values from ``base`` are shallow-copied at the top level via ``dict(base)``;
+ configs are consumed read-only downstream so this is intentional.
+
+ :param dict base: The base dictionary.
+ :param dict override: Values to merge on top of base.
+ :return: A new merged dictionary.
+ :rtype: dict
+ """
+ merged = dict(base)
+ for key, value in override.items():
+ if isinstance(value, dict):
+ base_node = merged.get(key)
+ merged[key] = BaseService._deep_merge(
+ base_node if isinstance(base_node, dict) else {}, value
+ )
+ else:
+ merged[key] = value
+ return merged
+
+ def _get_resolved_config(
+ self, method_config: "SdkConfig" = None, request_config: "SdkConfig" = None
+ ) -> "SdkConfig":
+ """
+ Resolves configuration overrides from the hierarchy: request_config > method_config > service_config.
+ Merges override configs into a single dictionary using deep merge so that partial
+ overrides for nested dicts (e.g. ``retry``) only replace the specified keys.
+ SDK defaults are used as fallbacks where these overrides are not provided.
+
+ :param SdkConfig method_config: Method-level configuration override.
+ :param SdkConfig request_config: Request-level configuration override.
+ :return: Merged configuration with all overrides applied.
+ :rtype: SdkConfig
+ """
+ resolved: "SdkConfig" = {}
+
+ # Apply service config
+ if self._service_config:
+ resolved = BaseService._deep_merge(resolved, self._service_config)
+
+ # Apply method config
+ if method_config:
+ resolved = BaseService._deep_merge(resolved, method_config)
+
+ # Apply request config
+ if request_config:
+ resolved = BaseService._deep_merge(resolved, request_config)
+
+ return resolved
+
def send_request(self, request: Request) -> Tuple[Dict, int, str]:
"""
Sends the given request.
@@ -83,6 +160,7 @@ def send_request(self, request: Request) -> Tuple[Dict, int, str]:
:rtype: Tuple[Dict, int, str]
"""
response = self._request_handler.send(request)
+ self._last_response = response
return (
response.body,
response.status,
@@ -122,7 +200,6 @@ def _get_request_handler(self) -> RequestChain:
"""
return (
RequestChain()
- .add_handler(HookHandler())
.add_handler(RetryHandler())
.add_handler(HttpHandler(self._timeout))
)
diff --git a/src/signplus/services/utils/validator.py b/src/signplus/services/utils/validator.py
index e42180c..b8a402c 100644
--- a/src/signplus/services/utils/validator.py
+++ b/src/signplus/services/utils/validator.py
@@ -1,6 +1,8 @@
import re
import operator
-from typing import Union, Any, Type, Pattern, get_args
+from enum import Enum
+from inspect import isclass
+from typing import Union, Any, Type, Pattern, get_args, get_origin
from ...models.utils.sentinel import was_value_set
from ...models.utils.one_of_base_model import OneOfBaseModel
@@ -194,8 +196,41 @@ def _match_type(self, value: Any) -> bool:
:param Any value: The input that needs to be checked
:raises ValueError: If the value does not match the expected type.
"""
- is_numeric = self._type is float and isinstance(value, int)
- if isinstance(value, self._type) or is_numeric:
+ # `Any` is a typing special form, not a runtime class — passing it
+ # to isinstance() raises TypeError. Treat Any-typed fields as
+ # "always match" so models with `field: Any` validate without
+ # crashing on every snippet that touches them.
+ if self._type is Any:
+ return True
+ # Subscripted generics (e.g. List[str], Dict[str, int]) cannot be passed
+ # to isinstance() — it raises "TypeError: Subscripted generics cannot be
+ # used with class and instance checks". Fall back to the runtime origin
+ # class (list, dict, ...) for the check.
+ check_type = get_origin(self._type) or self._type
+ if check_type is Any:
+ return True
+ # A subscripted Union (e.g. a list of `Union[str, int]`) reaches here as
+ # `typing.Union`, which also can't be passed to isinstance(). Match the
+ # value against any of the union's member types instead.
+ if check_type is Union:
+ return any(
+ Validator(arg)._match_type(value) for arg in get_args(self._type)
+ )
+ # Enum-typed fields accept either an enum member or any of the enum's
+ # underlying values (e.g. the raw string a snippet passes), so a plain
+ # value isn't rejected with "Invalid type: Expected ".
+ if isclass(check_type) and issubclass(check_type, Enum):
+ if isinstance(value, check_type):
+ return True
+ try:
+ check_type(value)
+ return True
+ except (ValueError, TypeError):
+ # ValueError: not a valid enum value. TypeError: unhashable
+ # value (e.g. a list/dict) can't be looked up in the enum.
+ return False
+ is_numeric = check_type is float and isinstance(value, int)
+ if isinstance(value, check_type) or is_numeric:
return True
return False