clappia-api-tools 2.0.4__tar.gz → 2.0.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/PKG-INFO +1 -1
- clappia_api_tools-2.0.6/clappia_api_tools/__init__.py +35 -0
- clappia_api_tools-2.0.6/clappia_api_tools/client/__init__.py +27 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/analytics_client.py +50 -3
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/app_definition_client.py +55 -6
- clappia_api_tools-2.0.6/clappia_api_tools/client/base_client.py +75 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/submission_client.py +83 -2
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/workflow_definition_client.py +53 -3
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/workplace_client.py +49 -2
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/submission_requests.py +5 -0
- clappia_api_tools-2.0.6/clappia_api_tools/utils/__init__.py +4 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/utils/api_utils.py +94 -19
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/PKG-INFO +1 -1
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/pyproject.toml +1 -1
- clappia_api_tools-2.0.4/clappia_api_tools/__init__.py +0 -27
- clappia_api_tools-2.0.4/clappia_api_tools/client/__init__.py +0 -11
- clappia_api_tools-2.0.4/clappia_api_tools/client/base_client.py +0 -25
- clappia_api_tools-2.0.4/clappia_api_tools/utils/__init__.py +0 -4
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/LICENSE +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/README.md +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/enums/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/enums/enums.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/json_serialized.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/permissions.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/analytics/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/analytics/base.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/analytics/chart/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/analytics/chart/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/analytics/model.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/app_metadata/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/app_metadata/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/base.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/definition/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/definition/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/field/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/field/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/model.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/page/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/page/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/section/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/app_definition/section/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/workflow_definition/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/workflow_definition/base.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/workflow_definition/step/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/workflow_definition/step/request.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/workplace_requests.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/analytics_responses.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/app_definition_responses.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/base_response.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/submission_responses.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/workflow_responses.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/workplace_responses.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/submission.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/workplace_user.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/integration/__init__.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/integration/definition/test_tools_definition.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/integration/submission/test_tools_submission.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/integration/workplace/test_tools_workplace.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/unit/client/test_analytics_client.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/unit/client/test_client.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/utils/logging_utils.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/utils/utils.py +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/SOURCES.txt +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/dependency_links.txt +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/requires.txt +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/top_level.txt +0 -0
- {clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/setup.cfg +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Clappia Tools - LangChain integration for Clappia API
|
|
3
|
+
|
|
4
|
+
This package provides a unified client for interacting with Clappia APIs.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .client.app_definition_client import AppDefinitionClient, AppDefinitionAPIKeyClient, AppDefinitionAuthTokenClient
|
|
8
|
+
from .client.submission_client import SubmissionClient, SubmissionAPIKeyClient, SubmissionAuthTokenClient
|
|
9
|
+
from .client.workflow_definition_client import WorkflowDefinitionClient, WorkflowDefinitionAPIKeyClient, WorkflowDefinitionAuthTokenClient
|
|
10
|
+
from .client.analytics_client import AnalyticsClient, AnalyticsAPIKeyClient, AnalyticsAuthTokenClient
|
|
11
|
+
from .client.workplace_client import WorkplaceClient, WorkplaceAPIKeyClient, WorkplaceAuthTokenClient
|
|
12
|
+
from .client.base_client import BaseClappiaClient
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__version__ = "1.0.2"
|
|
16
|
+
__all__ = [
|
|
17
|
+
"AppDefinitionClient",
|
|
18
|
+
"AppDefinitionAPIKeyClient",
|
|
19
|
+
"AppDefinitionAuthTokenClient",
|
|
20
|
+
"SubmissionClient",
|
|
21
|
+
"SubmissionAPIKeyClient",
|
|
22
|
+
"SubmissionAuthTokenClient",
|
|
23
|
+
"WorkflowDefinitionClient",
|
|
24
|
+
"WorkflowDefinitionAPIKeyClient",
|
|
25
|
+
"WorkflowDefinitionAuthTokenClient",
|
|
26
|
+
"AnalyticsClient",
|
|
27
|
+
"WorkplaceClient",
|
|
28
|
+
"WorkplaceAPIKeyClient",
|
|
29
|
+
"WorkplaceAuthTokenClient",
|
|
30
|
+
"BaseClappiaClient",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def __dir__():
|
|
35
|
+
return __all__
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
2
|
+
from .submission_client import SubmissionClient, SubmissionAPIKeyClient, SubmissionAuthTokenClient
|
|
3
|
+
from .app_definition_client import AppDefinitionClient, AppDefinitionAPIKeyClient, AppDefinitionAuthTokenClient
|
|
4
|
+
from .workflow_definition_client import WorkflowDefinitionClient, WorkflowDefinitionAPIKeyClient, WorkflowDefinitionAuthTokenClient
|
|
5
|
+
from .analytics_client import AnalyticsClient, AnalyticsAPIKeyClient, AnalyticsAuthTokenClient
|
|
6
|
+
from .workplace_client import WorkplaceClient, WorkplaceAPIKeyClient, WorkplaceAuthTokenClient
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"BaseClappiaClient",
|
|
10
|
+
"BaseAPIKeyClient",
|
|
11
|
+
"BaseAuthTokenClient",
|
|
12
|
+
"SubmissionClient",
|
|
13
|
+
"SubmissionAPIKeyClient",
|
|
14
|
+
"SubmissionAuthTokenClient",
|
|
15
|
+
"AppDefinitionClient",
|
|
16
|
+
"AppDefinitionAPIKeyClient",
|
|
17
|
+
"AppDefinitionAuthTokenClient",
|
|
18
|
+
"WorkflowDefinitionClient",
|
|
19
|
+
"WorkflowDefinitionAPIKeyClient",
|
|
20
|
+
"WorkflowDefinitionAuthTokenClient",
|
|
21
|
+
"AnalyticsClient",
|
|
22
|
+
"AnalyticsAPIKeyClient",
|
|
23
|
+
"AnalyticsAuthTokenClient",
|
|
24
|
+
"WorkplaceClient",
|
|
25
|
+
"WorkplaceAPIKeyClient",
|
|
26
|
+
"WorkplaceAuthTokenClient",
|
|
27
|
+
]
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/analytics_client.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
from abc import ABC
|
|
1
2
|
from typing import Dict, Any, Optional
|
|
2
|
-
from .base_client import BaseClappiaClient
|
|
3
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
3
4
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
4
5
|
from clappia_api_tools.models.request import (
|
|
5
6
|
UpsertSummaryChartDefinitionRequest,
|
|
@@ -34,8 +35,8 @@ ChartDefinitionResponseUnion = Union[
|
|
|
34
35
|
logger = get_logger(__name__)
|
|
35
36
|
|
|
36
37
|
|
|
37
|
-
class AnalyticsClient(BaseClappiaClient):
|
|
38
|
-
"""
|
|
38
|
+
class AnalyticsClient(BaseClappiaClient, ABC):
|
|
39
|
+
"""Abstract client for managing Clappia analytics and charts.
|
|
39
40
|
|
|
40
41
|
This client handles retrieving and managing analytics configurations, including
|
|
41
42
|
adding charts, removing charts, updating charts, and reordering charts.
|
|
@@ -1162,3 +1163,49 @@ class AnalyticsClient(BaseClappiaClient):
|
|
|
1162
1163
|
operation="get_charts",
|
|
1163
1164
|
data=response_data,
|
|
1164
1165
|
)
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
class AnalyticsAPIKeyClient(BaseAPIKeyClient, AnalyticsClient):
|
|
1169
|
+
"""Client for managing Clappia analytics and charts with API key authentication.
|
|
1170
|
+
|
|
1171
|
+
This client combines API key authentication with all analytics business logic.
|
|
1172
|
+
"""
|
|
1173
|
+
|
|
1174
|
+
def __init__(
|
|
1175
|
+
self,
|
|
1176
|
+
api_key: str,
|
|
1177
|
+
base_url: Optional[str] = None,
|
|
1178
|
+
timeout: int = 30,
|
|
1179
|
+
):
|
|
1180
|
+
"""Initialize analytics client with API key.
|
|
1181
|
+
|
|
1182
|
+
Args:
|
|
1183
|
+
api_key: Clappia API key.
|
|
1184
|
+
base_url: API base URL.
|
|
1185
|
+
timeout: Request timeout in seconds.
|
|
1186
|
+
"""
|
|
1187
|
+
BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
class AnalyticsAuthTokenClient(BaseAuthTokenClient, AnalyticsClient):
|
|
1191
|
+
"""Client for managing Clappia analytics and charts with auth token authentication.
|
|
1192
|
+
|
|
1193
|
+
This client combines auth token authentication with all analytics business logic.
|
|
1194
|
+
"""
|
|
1195
|
+
|
|
1196
|
+
def __init__(
|
|
1197
|
+
self,
|
|
1198
|
+
auth_token: str,
|
|
1199
|
+
workplace_id: str,
|
|
1200
|
+
base_url: Optional[str] = None,
|
|
1201
|
+
timeout: int = 30,
|
|
1202
|
+
):
|
|
1203
|
+
"""Initialize analytics client with auth token.
|
|
1204
|
+
|
|
1205
|
+
Args:
|
|
1206
|
+
auth_token: Clappia Auth token.
|
|
1207
|
+
workplace_id: Clappia Workplace ID.
|
|
1208
|
+
base_url: API base URL.
|
|
1209
|
+
timeout: Request timeout in seconds.
|
|
1210
|
+
"""
|
|
1211
|
+
BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
|
-
from
|
|
2
|
+
from abc import ABC
|
|
3
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
3
4
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
4
5
|
from typing import List, Dict, Any, Optional, Union
|
|
5
6
|
from clappia_api_tools.models.request import (
|
|
@@ -120,13 +121,17 @@ FieldRequestUnion = Union[
|
|
|
120
121
|
logger = get_logger(__name__)
|
|
121
122
|
|
|
122
123
|
|
|
123
|
-
class AppDefinitionClient(BaseClappiaClient):
|
|
124
|
-
"""
|
|
124
|
+
class AppDefinitionClient(BaseClappiaClient, ABC):
|
|
125
|
+
"""Abstract client for managing Clappia app definitions.
|
|
125
126
|
|
|
126
127
|
This client handles retrieving and managing app definitions, including
|
|
127
128
|
getting app definitions, creating apps, adding fields, and updating fields.
|
|
129
|
+
|
|
130
|
+
Note: This is an abstract base class that contains business logic but no authentication.
|
|
131
|
+
Use AppDefinitionAPIKeyClient or AppDefinitionAuthTokenClient for actual usage.
|
|
128
132
|
"""
|
|
129
133
|
|
|
134
|
+
|
|
130
135
|
def create_app(self, request: CreateAppRequest) -> AppCreationResponse:
|
|
131
136
|
"""Create a new app."""
|
|
132
137
|
env_valid, env_error = self.api_utils.validate_environment()
|
|
@@ -151,7 +156,7 @@ class AppDefinitionClient(BaseClappiaClient):
|
|
|
151
156
|
success=True, message="Successfully created app", data=response_data
|
|
152
157
|
)
|
|
153
158
|
|
|
154
|
-
def get_definition(self, app_id: str
|
|
159
|
+
def get_definition(self, app_id: str) -> AppDefinitionResponse:
|
|
155
160
|
"""Retrieve the complete definition for a specific app."""
|
|
156
161
|
params = {"appId": app_id}
|
|
157
162
|
|
|
@@ -160,8 +165,7 @@ class AppDefinitionClient(BaseClappiaClient):
|
|
|
160
165
|
success, error_message, response_data = self.api_utils.make_request(
|
|
161
166
|
method="GET",
|
|
162
167
|
endpoint="/getAppDefinition",
|
|
163
|
-
params=params
|
|
164
|
-
extra_headers=extra_headers,
|
|
168
|
+
params=params
|
|
165
169
|
)
|
|
166
170
|
|
|
167
171
|
if not success:
|
|
@@ -5800,4 +5804,49 @@ class AppDefinitionClient(BaseClappiaClient):
|
|
|
5800
5804
|
operation="update_app_metadata",
|
|
5801
5805
|
data=response_data,
|
|
5802
5806
|
)
|
|
5807
|
+
|
|
5808
|
+
class AppDefinitionAPIKeyClient(BaseAPIKeyClient, AppDefinitionClient):
|
|
5809
|
+
"""Client for managing Clappia app definitions with API key authentication.
|
|
5810
|
+
This client combines API key authentication with all app definition business logic.
|
|
5811
|
+
"""
|
|
5812
|
+
|
|
5813
|
+
def __init__(
|
|
5814
|
+
self,
|
|
5815
|
+
api_key: str,
|
|
5816
|
+
base_url: Optional[str] = None,
|
|
5817
|
+
timeout: int = 30,
|
|
5818
|
+
):
|
|
5819
|
+
"""Initialize app definition client with API key.
|
|
5820
|
+
|
|
5821
|
+
Args:
|
|
5822
|
+
api_key: Clappia API key.
|
|
5823
|
+
base_url: API base URL.
|
|
5824
|
+
timeout: Request timeout in seconds.
|
|
5825
|
+
"""
|
|
5826
|
+
BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
|
|
5827
|
+
|
|
5828
|
+
class AppDefinitionAuthTokenClient(BaseAuthTokenClient, AppDefinitionClient):
|
|
5829
|
+
"""Client for managing Clappia app definitions with auth token authentication.
|
|
5830
|
+
|
|
5831
|
+
This client combines auth token authentication with all app definition business logic.
|
|
5832
|
+
"""
|
|
5833
|
+
|
|
5834
|
+
def __init__(
|
|
5835
|
+
self,
|
|
5836
|
+
auth_token: str,
|
|
5837
|
+
workplace_id: str,
|
|
5838
|
+
base_url: Optional[str] = None,
|
|
5839
|
+
timeout: int = 30,
|
|
5840
|
+
):
|
|
5841
|
+
"""Initialize app definition client with auth token.
|
|
5842
|
+
|
|
5843
|
+
Args:
|
|
5844
|
+
auth_token: Clappia Auth token.
|
|
5845
|
+
workplace_id: Clappia Workplace ID.
|
|
5846
|
+
base_url: API base URL.
|
|
5847
|
+
timeout: Request timeout in seconds.
|
|
5848
|
+
"""
|
|
5849
|
+
BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
|
|
5850
|
+
|
|
5851
|
+
|
|
5803
5852
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from abc import ABC
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from clappia_api_tools.utils.api_utils import ClappiaAPIKeyUtils, ClappiaAuthTokenUtils
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class BaseClappiaClient(ABC):
|
|
7
|
+
"""Base client with shared functionality for all Clappia clients.
|
|
8
|
+
|
|
9
|
+
This class provides the common initialization and shared utilities
|
|
10
|
+
that all specialized Clappia clients will inherit from.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(
|
|
14
|
+
self,
|
|
15
|
+
base_url: Optional[str] = None,
|
|
16
|
+
timeout: int = 30,
|
|
17
|
+
):
|
|
18
|
+
"""Initialize base Clappia client.
|
|
19
|
+
Args:
|
|
20
|
+
base_url: API base URL.
|
|
21
|
+
timeout: Request timeout in seconds.
|
|
22
|
+
"""
|
|
23
|
+
self.base_url = base_url
|
|
24
|
+
self.timeout = timeout
|
|
25
|
+
|
|
26
|
+
class BaseAPIKeyClient(BaseClappiaClient):
|
|
27
|
+
"""Base client for API key authentication.
|
|
28
|
+
|
|
29
|
+
This class provides the common initialization and shared utilities
|
|
30
|
+
for clients that use API key authentication.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
api_key: Optional[str] = None,
|
|
36
|
+
base_url: Optional[str] = None,
|
|
37
|
+
timeout: int = 30,
|
|
38
|
+
):
|
|
39
|
+
"""Initialize base API key client.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
api_key: Clappia API key.
|
|
43
|
+
base_url: API base URL.
|
|
44
|
+
timeout: Request timeout in seconds.
|
|
45
|
+
"""
|
|
46
|
+
super().__init__(base_url, timeout)
|
|
47
|
+
self.api_utils = ClappiaAPIKeyUtils(api_key, base_url, timeout)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class BaseAuthTokenClient(BaseClappiaClient):
|
|
51
|
+
"""Base client for auth token authentication.
|
|
52
|
+
|
|
53
|
+
This class provides the common initialization and shared utilities
|
|
54
|
+
for clients that use auth token and workplace ID authentication.
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
auth_token: Optional[str] = None,
|
|
60
|
+
workplace_id: Optional[str] = None,
|
|
61
|
+
base_url: Optional[str] = None,
|
|
62
|
+
timeout: int = 30,
|
|
63
|
+
):
|
|
64
|
+
"""Initialize base auth token client.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
auth_token: Clappia Auth token.
|
|
68
|
+
workplace_id: Clappia Workplace ID.
|
|
69
|
+
base_url: API base URL.
|
|
70
|
+
timeout: Request timeout in seconds.
|
|
71
|
+
"""
|
|
72
|
+
super().__init__(base_url, timeout)
|
|
73
|
+
self.api_utils = ClappiaAuthTokenUtils(auth_token, workplace_id, base_url, timeout)
|
|
74
|
+
|
|
75
|
+
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/submission_client.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
from abc import ABC
|
|
1
2
|
from typing import Dict, Any, List, Optional
|
|
2
|
-
from .base_client import BaseClappiaClient
|
|
3
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
3
4
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
4
5
|
from clappia_api_tools.models.request import (
|
|
5
6
|
GetSubmissionsRequest,
|
|
@@ -27,7 +28,7 @@ from clappia_api_tools.models.response import (
|
|
|
27
28
|
logger = get_logger(__name__)
|
|
28
29
|
|
|
29
30
|
|
|
30
|
-
class SubmissionClient(BaseClappiaClient):
|
|
31
|
+
class SubmissionClient(BaseClappiaClient, ABC):
|
|
31
32
|
"""Client for managing Clappia submissions.
|
|
32
33
|
|
|
33
34
|
This client handles retrieving and managing submissions, including
|
|
@@ -35,6 +36,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
35
36
|
editing submissions, updating submission status, updating submission owners.
|
|
36
37
|
"""
|
|
37
38
|
|
|
39
|
+
|
|
38
40
|
def get_submissions(
|
|
39
41
|
self,
|
|
40
42
|
app_id: str,
|
|
@@ -43,6 +45,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
43
45
|
forward: bool = True,
|
|
44
46
|
filters: Optional[SubmissionFilters] = None,
|
|
45
47
|
last_submission_id: Optional[str] = None,
|
|
48
|
+
requesting_user_email_address: Optional[str] = None,
|
|
46
49
|
) -> SubmissionsResponse:
|
|
47
50
|
try:
|
|
48
51
|
request = GetSubmissionsRequest(
|
|
@@ -52,6 +55,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
52
55
|
filters=filters,
|
|
53
56
|
last_submission_id=last_submission_id,
|
|
54
57
|
fields=fields,
|
|
58
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
55
59
|
)
|
|
56
60
|
except Exception as e:
|
|
57
61
|
return SubmissionsResponse(success=False, message=str(e), app_id=app_id)
|
|
@@ -61,9 +65,11 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
61
65
|
return SubmissionsResponse(success=False, message=env_error, app_id=app_id)
|
|
62
66
|
|
|
63
67
|
payload = {
|
|
68
|
+
"workplaceId": self.workplace_id,
|
|
64
69
|
"appId": request.app_id,
|
|
65
70
|
"pageSize": request.page_size,
|
|
66
71
|
"forward": request.forward,
|
|
72
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
67
73
|
}
|
|
68
74
|
|
|
69
75
|
if request.filters:
|
|
@@ -104,6 +110,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
104
110
|
forward: bool = True,
|
|
105
111
|
page_size: int = 1000,
|
|
106
112
|
filters: Optional[SubmissionFilters] = None,
|
|
113
|
+
requesting_user_email_address: Optional[str] = None,
|
|
107
114
|
) -> SubmissionsAggregationResponse:
|
|
108
115
|
try:
|
|
109
116
|
request = GetSubmissionsAggregationRequest(
|
|
@@ -114,6 +121,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
114
121
|
forward=forward,
|
|
115
122
|
page_size=page_size,
|
|
116
123
|
filters=filters,
|
|
124
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
117
125
|
)
|
|
118
126
|
except Exception as e:
|
|
119
127
|
return SubmissionsAggregationResponse(
|
|
@@ -134,10 +142,12 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
134
142
|
)
|
|
135
143
|
|
|
136
144
|
payload = {
|
|
145
|
+
"workplaceId": self.workplace_id,
|
|
137
146
|
"appId": request.app_id,
|
|
138
147
|
"forward": request.forward,
|
|
139
148
|
"pageSize": request.page_size,
|
|
140
149
|
"xAxisLabels": request.x_axis_labels or [],
|
|
150
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
141
151
|
}
|
|
142
152
|
|
|
143
153
|
if request.dimensions:
|
|
@@ -176,11 +186,13 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
176
186
|
self,
|
|
177
187
|
app_id: str,
|
|
178
188
|
data: Dict[str, Any],
|
|
189
|
+
requesting_user_email_address: Optional[str] = None,
|
|
179
190
|
) -> SubmissionResponse:
|
|
180
191
|
try:
|
|
181
192
|
request = CreateSubmissionRequest(
|
|
182
193
|
app_id=app_id,
|
|
183
194
|
data=data,
|
|
195
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
184
196
|
)
|
|
185
197
|
except Exception as e:
|
|
186
198
|
return SubmissionResponse(
|
|
@@ -208,8 +220,10 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
208
220
|
)
|
|
209
221
|
|
|
210
222
|
payload = {
|
|
223
|
+
"workplaceId": self.workplace_id,
|
|
211
224
|
"appId": request.app_id,
|
|
212
225
|
"data": request.data,
|
|
226
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
213
227
|
}
|
|
214
228
|
|
|
215
229
|
logger.info(f"Creating submission for app_id: {app_id} with data: {data}")
|
|
@@ -243,12 +257,14 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
243
257
|
app_id: str,
|
|
244
258
|
submission_id: str,
|
|
245
259
|
data: Dict[str, Any],
|
|
260
|
+
requesting_user_email_address: Optional[str] = None,
|
|
246
261
|
) -> SubmissionResponse:
|
|
247
262
|
try:
|
|
248
263
|
request = EditSubmissionRequest(
|
|
249
264
|
app_id=app_id,
|
|
250
265
|
submission_id=submission_id,
|
|
251
266
|
data=data,
|
|
267
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
252
268
|
)
|
|
253
269
|
except Exception as e:
|
|
254
270
|
return SubmissionResponse(
|
|
@@ -279,9 +295,11 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
279
295
|
)
|
|
280
296
|
|
|
281
297
|
payload = {
|
|
298
|
+
"workplaceId": self.workplace_id,
|
|
282
299
|
"appId": request.app_id,
|
|
283
300
|
"submissionId": request.submission_id,
|
|
284
301
|
"data": request.data,
|
|
302
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
285
303
|
}
|
|
286
304
|
|
|
287
305
|
logger.info(
|
|
@@ -317,6 +335,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
317
335
|
submission_id: str,
|
|
318
336
|
status_name: str,
|
|
319
337
|
comments: Optional[str] = None,
|
|
338
|
+
requesting_user_email_address: Optional[str] = None,
|
|
320
339
|
) -> SubmissionResponse:
|
|
321
340
|
try:
|
|
322
341
|
request = UpdateSubmissionStatusRequest(
|
|
@@ -324,6 +343,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
324
343
|
submission_id=submission_id,
|
|
325
344
|
status_name=status_name,
|
|
326
345
|
comments=comments,
|
|
346
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
327
347
|
)
|
|
328
348
|
except Exception as e:
|
|
329
349
|
return SubmissionResponse(
|
|
@@ -350,9 +370,11 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
350
370
|
}
|
|
351
371
|
|
|
352
372
|
payload = {
|
|
373
|
+
"workplaceId": self.workplace_id,
|
|
353
374
|
"appId": request.app_id,
|
|
354
375
|
"submissionId": request.submission_id,
|
|
355
376
|
"status": status,
|
|
377
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
356
378
|
}
|
|
357
379
|
|
|
358
380
|
logger.info(f"Updating status for submission {submission_id} to {status_name}")
|
|
@@ -386,6 +408,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
386
408
|
submission_id: str,
|
|
387
409
|
email_ids: List[str],
|
|
388
410
|
phone_numbers: Optional[List[str]] = None,
|
|
411
|
+
requesting_user_email_address: Optional[str] = None,
|
|
389
412
|
) -> SubmissionResponse:
|
|
390
413
|
try:
|
|
391
414
|
request = UpdateSubmissionOwnersRequest(
|
|
@@ -393,6 +416,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
393
416
|
submission_id=submission_id,
|
|
394
417
|
email_ids=email_ids,
|
|
395
418
|
phone_numbers=phone_numbers,
|
|
419
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
396
420
|
)
|
|
397
421
|
except Exception as e:
|
|
398
422
|
return SubmissionResponse(
|
|
@@ -414,9 +438,11 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
414
438
|
)
|
|
415
439
|
|
|
416
440
|
payload = {
|
|
441
|
+
"workplaceId": self.workplace_id,
|
|
417
442
|
"appId": request.app_id,
|
|
418
443
|
"submissionId": request.submission_id,
|
|
419
444
|
"emailIds": [str(email) for email in request.email_ids],
|
|
445
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
420
446
|
}
|
|
421
447
|
|
|
422
448
|
logger.info(f"Updating owners for submission {submission_id}")
|
|
@@ -472,6 +498,7 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
472
498
|
)
|
|
473
499
|
|
|
474
500
|
payload = {
|
|
501
|
+
"workplaceId": self.workplace_id,
|
|
475
502
|
"appId": request.app_id,
|
|
476
503
|
"requestingUserEmailAddress": str(request.requesting_user_email_address),
|
|
477
504
|
"format": request.format,
|
|
@@ -518,11 +545,13 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
518
545
|
self,
|
|
519
546
|
app_id: str,
|
|
520
547
|
filters: Optional[SubmissionFilters] = None,
|
|
548
|
+
requesting_user_email_address: Optional[str] = None,
|
|
521
549
|
) -> SubmissionsCountResponse:
|
|
522
550
|
try:
|
|
523
551
|
request = GetSubmissionsCountRequest(
|
|
524
552
|
app_id=app_id,
|
|
525
553
|
filters=filters,
|
|
554
|
+
requesting_user_email_address=requesting_user_email_address,
|
|
526
555
|
)
|
|
527
556
|
except Exception as e:
|
|
528
557
|
return SubmissionsCountResponse(
|
|
@@ -536,7 +565,9 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
536
565
|
)
|
|
537
566
|
|
|
538
567
|
payload = {
|
|
568
|
+
"workplaceId": self.workplace_id,
|
|
539
569
|
"appId": request.app_id,
|
|
570
|
+
"requestingUserEmailAddress": request.requesting_user_email_address,
|
|
540
571
|
}
|
|
541
572
|
|
|
542
573
|
if request.filters:
|
|
@@ -561,3 +592,53 @@ class SubmissionClient(BaseClappiaClient):
|
|
|
561
592
|
total_count=response_data.get("totalCount"),
|
|
562
593
|
filtered_count=response_data.get("filteredCount"),
|
|
563
594
|
)
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
class SubmissionAPIKeyClient(BaseAPIKeyClient, SubmissionClient):
|
|
598
|
+
"""Client for managing Clappia submissions with API key authentication.
|
|
599
|
+
|
|
600
|
+
This client combines API key authentication with all submission business logic.
|
|
601
|
+
"""
|
|
602
|
+
|
|
603
|
+
def __init__(
|
|
604
|
+
self,
|
|
605
|
+
api_key: str,
|
|
606
|
+
workplace_id: str,
|
|
607
|
+
base_url: Optional[str] = None,
|
|
608
|
+
timeout: int = 30,
|
|
609
|
+
):
|
|
610
|
+
"""Initialize submission client with API key.
|
|
611
|
+
|
|
612
|
+
Args:
|
|
613
|
+
api_key: Clappia API key.
|
|
614
|
+
workplace_id: Clappia Workplace ID #TODO: remove this parameter once ClappiaExternalService/v4 is live in all stages
|
|
615
|
+
base_url: API base URL.
|
|
616
|
+
timeout: Request timeout in seconds.
|
|
617
|
+
"""
|
|
618
|
+
BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
|
|
619
|
+
self.workplace_id = workplace_id
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
class SubmissionAuthTokenClient(BaseAuthTokenClient, SubmissionClient):
|
|
623
|
+
"""Client for managing Clappia submissions with auth token authentication.
|
|
624
|
+
|
|
625
|
+
This client combines auth token authentication with all submission business logic.
|
|
626
|
+
"""
|
|
627
|
+
|
|
628
|
+
def __init__(
|
|
629
|
+
self,
|
|
630
|
+
auth_token: str,
|
|
631
|
+
workplace_id: str,
|
|
632
|
+
base_url: Optional[str] = None,
|
|
633
|
+
timeout: int = 30,
|
|
634
|
+
):
|
|
635
|
+
"""Initialize submission client with auth token.
|
|
636
|
+
|
|
637
|
+
Args:
|
|
638
|
+
auth_token: Clappia Auth token.
|
|
639
|
+
workplace_id: Clappia Workplace ID.
|
|
640
|
+
base_url: API base URL.
|
|
641
|
+
timeout: Request timeout in seconds.
|
|
642
|
+
"""
|
|
643
|
+
BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
|
|
644
|
+
self.workplace_id = workplace_id
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
from abc import ABC
|
|
1
2
|
from typing import Optional, Union
|
|
2
|
-
from .base_client import BaseClappiaClient
|
|
3
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
3
4
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
4
5
|
|
|
5
6
|
from clappia_api_tools.models.request import (
|
|
@@ -50,14 +51,18 @@ WorkflowStepRequestUnion = Union[
|
|
|
50
51
|
logger = get_logger(__name__)
|
|
51
52
|
|
|
52
53
|
|
|
53
|
-
class WorkflowDefinitionClient(BaseClappiaClient):
|
|
54
|
-
"""
|
|
54
|
+
class WorkflowDefinitionClient(BaseClappiaClient, ABC):
|
|
55
|
+
"""Abstract client for managing Clappia workflow definitions.
|
|
55
56
|
|
|
56
57
|
This client handles retrieving and managing workflow definitions, including
|
|
57
58
|
getting workflows, adding workflow steps, removing workflow steps,
|
|
58
59
|
updating workflow steps, and reordering workflow steps.
|
|
60
|
+
|
|
61
|
+
Note: This is an abstract base class that contains business logic but no authentication.
|
|
62
|
+
Use WorkflowDefinitionAPIKeyClient or WorkflowDefinitionAuthTokenClient for actual usage.
|
|
59
63
|
"""
|
|
60
64
|
|
|
65
|
+
|
|
61
66
|
def get_workflow(self, app_id: str, trigger_type: str) -> WorkflowResponse:
|
|
62
67
|
"""Get a workflow definition for a specific app and trigger type"""
|
|
63
68
|
|
|
@@ -2612,3 +2617,48 @@ class WorkflowDefinitionClient(BaseClappiaClient):
|
|
|
2612
2617
|
step_variable_name=step_variable_name,
|
|
2613
2618
|
data=response_data,
|
|
2614
2619
|
)
|
|
2620
|
+
|
|
2621
|
+
class WorkflowDefinitionAPIKeyClient(BaseAPIKeyClient, WorkflowDefinitionClient):
|
|
2622
|
+
"""Client for managing Clappia workflow definitions with API key authentication.
|
|
2623
|
+
|
|
2624
|
+
This client combines API key authentication with all workflow definition business logic.
|
|
2625
|
+
"""
|
|
2626
|
+
|
|
2627
|
+
def __init__(
|
|
2628
|
+
self,
|
|
2629
|
+
api_key: str,
|
|
2630
|
+
base_url: Optional[str] = None,
|
|
2631
|
+
timeout: int = 30,
|
|
2632
|
+
):
|
|
2633
|
+
"""Initialize workflow definition client with API key.
|
|
2634
|
+
|
|
2635
|
+
Args:
|
|
2636
|
+
api_key: Clappia API key.
|
|
2637
|
+
base_url: API base URL.
|
|
2638
|
+
timeout: Request timeout in seconds.
|
|
2639
|
+
"""
|
|
2640
|
+
BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
class WorkflowDefinitionAuthTokenClient(BaseAuthTokenClient, WorkflowDefinitionClient):
|
|
2644
|
+
"""Client for managing Clappia workflow definitions with auth token authentication.
|
|
2645
|
+
|
|
2646
|
+
This client combines auth token authentication with all workflow definition business logic.
|
|
2647
|
+
"""
|
|
2648
|
+
|
|
2649
|
+
def __init__(
|
|
2650
|
+
self,
|
|
2651
|
+
auth_token: str,
|
|
2652
|
+
workplace_id: str,
|
|
2653
|
+
base_url: Optional[str] = None,
|
|
2654
|
+
timeout: int = 30,
|
|
2655
|
+
):
|
|
2656
|
+
"""Initialize workflow definition client with auth token.
|
|
2657
|
+
|
|
2658
|
+
Args:
|
|
2659
|
+
auth_token: Clappia Auth token.
|
|
2660
|
+
workplace_id: Clappia Workplace ID.
|
|
2661
|
+
base_url: API base URL.
|
|
2662
|
+
timeout: Request timeout in seconds.
|
|
2663
|
+
"""
|
|
2664
|
+
BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/client/workplace_client.py
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
from abc import ABC
|
|
1
2
|
from typing import Dict, Any, List, Optional
|
|
2
|
-
from .base_client import BaseClappiaClient
|
|
3
|
+
from .base_client import BaseClappiaClient, BaseAPIKeyClient, BaseAuthTokenClient
|
|
3
4
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
4
5
|
from clappia_api_tools.models.request import (
|
|
5
6
|
AddUserToWorkplaceRequest,
|
|
@@ -29,7 +30,7 @@ from clappia_api_tools.models.permissions import Permission
|
|
|
29
30
|
logger = get_logger(__name__)
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
class WorkplaceClient(BaseClappiaClient):
|
|
33
|
+
class WorkplaceClient(BaseClappiaClient, ABC):
|
|
33
34
|
"""Client for managing Clappia workplace users.
|
|
34
35
|
|
|
35
36
|
This client handles workplace user management operations including
|
|
@@ -752,3 +753,49 @@ class WorkplaceClient(BaseClappiaClient):
|
|
|
752
753
|
operation="get_workplace_users",
|
|
753
754
|
data=response_data,
|
|
754
755
|
)
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
class WorkplaceAPIKeyClient(BaseAPIKeyClient, WorkplaceClient):
|
|
759
|
+
"""Client for managing Clappia workplace users with API key authentication.
|
|
760
|
+
|
|
761
|
+
This client combines API key authentication with all workplace business logic.
|
|
762
|
+
"""
|
|
763
|
+
|
|
764
|
+
def __init__(
|
|
765
|
+
self,
|
|
766
|
+
api_key: str,
|
|
767
|
+
base_url: Optional[str] = None,
|
|
768
|
+
timeout: int = 30,
|
|
769
|
+
):
|
|
770
|
+
"""Initialize workplace client with API key.
|
|
771
|
+
|
|
772
|
+
Args:
|
|
773
|
+
api_key: Clappia API key.
|
|
774
|
+
base_url: API base URL.
|
|
775
|
+
timeout: Request timeout in seconds.
|
|
776
|
+
"""
|
|
777
|
+
BaseAPIKeyClient.__init__(self, api_key, base_url, timeout)
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
class WorkplaceAuthTokenClient(BaseAuthTokenClient, WorkplaceClient):
|
|
781
|
+
"""Client for managing Clappia workplace users with auth token authentication.
|
|
782
|
+
|
|
783
|
+
This client combines auth token authentication with all workplace business logic.
|
|
784
|
+
"""
|
|
785
|
+
|
|
786
|
+
def __init__(
|
|
787
|
+
self,
|
|
788
|
+
auth_token: str,
|
|
789
|
+
workplace_id: str,
|
|
790
|
+
base_url: Optional[str] = None,
|
|
791
|
+
timeout: int = 30,
|
|
792
|
+
):
|
|
793
|
+
"""Initialize workplace client with auth token.
|
|
794
|
+
|
|
795
|
+
Args:
|
|
796
|
+
auth_token: Clappia Auth token.
|
|
797
|
+
workplace_id: Clappia Workplace ID.
|
|
798
|
+
base_url: API base URL.
|
|
799
|
+
timeout: Request timeout in seconds.
|
|
800
|
+
"""
|
|
801
|
+
BaseAuthTokenClient.__init__(self, auth_token, workplace_id, base_url, timeout)
|
|
@@ -11,6 +11,11 @@ from ..submission import (
|
|
|
11
11
|
|
|
12
12
|
class BaseSubmissionRequest(BaseModel):
|
|
13
13
|
app_id: str = Field(description="App Id")
|
|
14
|
+
# TODO: Remove this field once ClappiaExternalService/v4 is live in all stages
|
|
15
|
+
requesting_user_email_address: Optional[EmailStr] = Field(
|
|
16
|
+
None, description="Email of requesting user"
|
|
17
|
+
)
|
|
18
|
+
|
|
14
19
|
|
|
15
20
|
@field_validator("app_id")
|
|
16
21
|
def validate_app_id(cls, v: str) -> str:
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import json
|
|
3
3
|
import requests
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
4
5
|
from typing import Optional, Dict, Any, Tuple
|
|
5
6
|
from clappia_api_tools.utils.logging_utils import get_logger
|
|
6
7
|
|
|
7
8
|
logger = get_logger(__name__)
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class ClappiaAPIUtils:
|
|
11
|
-
"""
|
|
11
|
+
class ClappiaAPIUtils(ABC):
|
|
12
|
+
"""Abstract base API utilities with common functionality for all Clappia API interactions"""
|
|
12
13
|
|
|
13
14
|
def __init__(
|
|
14
15
|
self,
|
|
15
|
-
api_key: str,
|
|
16
16
|
base_url: str,
|
|
17
17
|
timeout: int = 30,
|
|
18
18
|
):
|
|
@@ -20,21 +20,14 @@ class ClappiaAPIUtils:
|
|
|
20
20
|
Initialize API utilities with configurable parameters
|
|
21
21
|
|
|
22
22
|
Args:
|
|
23
|
-
api_key: Clappia API key
|
|
24
23
|
base_url: API base URL
|
|
25
24
|
timeout: Request timeout in seconds
|
|
26
25
|
"""
|
|
27
|
-
self.api_key = api_key
|
|
28
26
|
self.base_url = base_url
|
|
29
27
|
self.timeout = timeout
|
|
30
28
|
|
|
31
29
|
def validate_environment(self) -> Tuple[bool, str]:
|
|
32
30
|
"""Validate that required configuration is available"""
|
|
33
|
-
if not self.api_key:
|
|
34
|
-
return (
|
|
35
|
-
False,
|
|
36
|
-
"API key is not configured",
|
|
37
|
-
)
|
|
38
31
|
if not self.base_url:
|
|
39
32
|
return (
|
|
40
33
|
False,
|
|
@@ -42,11 +35,9 @@ class ClappiaAPIUtils:
|
|
|
42
35
|
)
|
|
43
36
|
return True, ""
|
|
44
37
|
|
|
45
|
-
def get_headers(self) -> Dict[str, str]:
|
|
38
|
+
def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
|
|
46
39
|
"""Get standard headers for API requests"""
|
|
47
40
|
return {
|
|
48
|
-
"x-api-key": self.api_key,
|
|
49
|
-
"Authorization": self.api_key,
|
|
50
41
|
"Content-Type": "application/json"
|
|
51
42
|
}
|
|
52
43
|
|
|
@@ -85,8 +76,7 @@ class ClappiaAPIUtils:
|
|
|
85
76
|
method: str,
|
|
86
77
|
endpoint: str,
|
|
87
78
|
data: Optional[Dict[str, Any]] = None,
|
|
88
|
-
params: Optional[Dict[str, Any]] = None
|
|
89
|
-
extra_headers: Optional[Dict[str, Any]] = None,
|
|
79
|
+
params: Optional[Dict[str, Any]] = None
|
|
90
80
|
) -> Tuple[bool, Optional[str], Optional[Dict[str, Any]]]:
|
|
91
81
|
"""
|
|
92
82
|
Make HTTP request to Clappia API
|
|
@@ -105,12 +95,10 @@ class ClappiaAPIUtils:
|
|
|
105
95
|
return False, f"Configuration error: {env_error}", None
|
|
106
96
|
|
|
107
97
|
url = f"{self.base_url.rstrip('/')}/{endpoint.lstrip('/')}"
|
|
108
|
-
headers = self.get_headers()
|
|
109
|
-
if extra_headers:
|
|
110
|
-
headers.update(extra_headers)
|
|
98
|
+
headers = self.get_headers(data)
|
|
111
99
|
|
|
112
100
|
try:
|
|
113
|
-
logger.info(f"Making {method} request to {url}")
|
|
101
|
+
logger.info(f"Making {method} request to {url}, headers: {headers}, data: {data}, params: {params}")
|
|
114
102
|
if data:
|
|
115
103
|
logger.debug(f"Request data: {json.dumps(data, indent=2)}")
|
|
116
104
|
|
|
@@ -134,3 +122,90 @@ class ClappiaAPIUtils:
|
|
|
134
122
|
return False, "Connection error - unable to reach Clappia API", None
|
|
135
123
|
except Exception as e:
|
|
136
124
|
return False, f"Unexpected error: {str(e)}", None
|
|
125
|
+
|
|
126
|
+
class ClappiaAPIKeyUtils(ClappiaAPIUtils):
|
|
127
|
+
"""API utilities for Clappia API key authentication"""
|
|
128
|
+
|
|
129
|
+
def __init__(
|
|
130
|
+
self,
|
|
131
|
+
api_key: str,
|
|
132
|
+
base_url: str,
|
|
133
|
+
timeout: int = 30,
|
|
134
|
+
):
|
|
135
|
+
"""
|
|
136
|
+
Initialize API utilities with configurable parameters
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
api_key: Clappia API key
|
|
140
|
+
base_url: API base URL
|
|
141
|
+
timeout: Request timeout in seconds
|
|
142
|
+
"""
|
|
143
|
+
super().__init__(base_url, timeout)
|
|
144
|
+
self.api_key = api_key
|
|
145
|
+
|
|
146
|
+
def validate_environment(self) -> Tuple[bool, str]:
|
|
147
|
+
"""Validate that required configuration is available"""
|
|
148
|
+
if not self.api_key:
|
|
149
|
+
return (
|
|
150
|
+
False,
|
|
151
|
+
"API key is not configured",
|
|
152
|
+
)
|
|
153
|
+
return super().validate_environment()
|
|
154
|
+
|
|
155
|
+
def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
|
|
156
|
+
"""Get standard headers for API requests"""
|
|
157
|
+
headers = super().get_headers(data)
|
|
158
|
+
headers["x-api-key"] = self.api_key
|
|
159
|
+
return headers
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class ClappiaAuthTokenUtils(ClappiaAPIUtils):
|
|
163
|
+
"""API utilities for Clappia auth token authentication with workplace ID support"""
|
|
164
|
+
|
|
165
|
+
def __init__(
|
|
166
|
+
self,
|
|
167
|
+
auth_token: str,
|
|
168
|
+
workplace_id: str,
|
|
169
|
+
base_url: str,
|
|
170
|
+
timeout: int = 30,
|
|
171
|
+
):
|
|
172
|
+
"""
|
|
173
|
+
Initialize API utilities with auth token and workplace ID
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
auth_token: Clappia Auth token
|
|
177
|
+
workplace_id: Clappia Workplace ID
|
|
178
|
+
base_url: API base URL
|
|
179
|
+
timeout: Request timeout in seconds
|
|
180
|
+
"""
|
|
181
|
+
super().__init__(base_url, timeout)
|
|
182
|
+
self.auth_token = auth_token
|
|
183
|
+
self.workplace_id = workplace_id
|
|
184
|
+
|
|
185
|
+
def validate_environment(self) -> Tuple[bool, str]:
|
|
186
|
+
"""Validate that required configuration is available"""
|
|
187
|
+
if not self.auth_token:
|
|
188
|
+
return (
|
|
189
|
+
False,
|
|
190
|
+
"Auth token is not configured",
|
|
191
|
+
)
|
|
192
|
+
if not self.workplace_id:
|
|
193
|
+
return (
|
|
194
|
+
False,
|
|
195
|
+
"Workplace ID is not configured",
|
|
196
|
+
)
|
|
197
|
+
return super().validate_environment()
|
|
198
|
+
|
|
199
|
+
def get_headers(self, data: Optional[Dict[str, Any]] = None) -> Dict[str, str]:
|
|
200
|
+
"""Get standard headers for API requests with auth token and optional app_id"""
|
|
201
|
+
headers = super().get_headers(data)
|
|
202
|
+
headers["Authorization"] = self.auth_token
|
|
203
|
+
headers["workplaceId"] = self.workplace_id
|
|
204
|
+
|
|
205
|
+
# Add app_id header if present in request data
|
|
206
|
+
if data and "appId" in data:
|
|
207
|
+
headers["appId"] = data["appId"]
|
|
208
|
+
|
|
209
|
+
return headers
|
|
210
|
+
|
|
211
|
+
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Clappia Tools - LangChain integration for Clappia API
|
|
3
|
-
|
|
4
|
-
This package provides a unified client for interacting with Clappia APIs.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from .client.app_definition_client import AppDefinitionClient
|
|
8
|
-
from .client.submission_client import SubmissionClient
|
|
9
|
-
from .client.workflow_definition_client import WorkflowDefinitionClient
|
|
10
|
-
from .client.analytics_client import AnalyticsClient
|
|
11
|
-
from .client.workplace_client import WorkplaceClient
|
|
12
|
-
from .client.base_client import BaseClappiaClient
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
__version__ = "1.0.2"
|
|
16
|
-
__all__ = [
|
|
17
|
-
"AppDefinitionClient",
|
|
18
|
-
"SubmissionClient",
|
|
19
|
-
"WorkflowDefinitionClient",
|
|
20
|
-
"AnalyticsClient",
|
|
21
|
-
"WorkplaceClient",
|
|
22
|
-
"BaseClappiaClient",
|
|
23
|
-
]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def __dir__():
|
|
27
|
-
return __all__
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
from .base_client import BaseClappiaClient
|
|
2
|
-
from .submission_client import SubmissionClient
|
|
3
|
-
from .app_definition_client import AppDefinitionClient
|
|
4
|
-
from .workplace_client import WorkplaceClient
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"BaseClappiaClient",
|
|
8
|
-
"SubmissionClient",
|
|
9
|
-
"AppDefinitionClient",
|
|
10
|
-
"WorkplaceClient",
|
|
11
|
-
]
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
from typing import Optional
|
|
2
|
-
from clappia_api_tools.utils.api_utils import ClappiaAPIUtils
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class BaseClappiaClient:
|
|
6
|
-
"""Base client with shared functionality for all Clappia clients.
|
|
7
|
-
|
|
8
|
-
This class provides the common initialization and shared utilities
|
|
9
|
-
that all specialized Clappia clients will inherit from.
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
def __init__(
|
|
13
|
-
self,
|
|
14
|
-
api_key: Optional[str] = None,
|
|
15
|
-
base_url: Optional[str] = None,
|
|
16
|
-
timeout: int = 30,
|
|
17
|
-
):
|
|
18
|
-
"""Initialize base Clappia client.
|
|
19
|
-
|
|
20
|
-
Args:
|
|
21
|
-
api_key: Clappia API key.
|
|
22
|
-
base_url: API base URL.
|
|
23
|
-
timeout: Request timeout in seconds.
|
|
24
|
-
"""
|
|
25
|
-
self.api_utils = ClappiaAPIUtils(api_key, base_url, timeout)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/json_serialized.py
RENAMED
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/request/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/response/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/models/workplace_user.py
RENAMED
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/tests/integration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools/utils/logging_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{clappia_api_tools-2.0.4 → clappia_api_tools-2.0.6}/clappia_api_tools.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|