uipath 2.0.53__py3-none-any.whl → 2.0.55__py3-none-any.whl
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.
Potentially problematic release.
This version of uipath might be problematic. Click here for more details.
- uipath/_cli/_auth/_auth_server.py +5 -16
- uipath/_cli/_auth/auth_config.json +2 -2
- uipath/_cli/cli_auth.py +2 -2
- uipath/_cli/cli_run.py +2 -2
- uipath/_services/__init__.py +2 -0
- uipath/_services/_base_service.py +47 -125
- uipath/_services/actions_service.py +12 -4
- uipath/_services/api_client.py +2 -36
- uipath/_services/assets_service.py +73 -8
- uipath/_services/attachments_service.py +595 -0
- uipath/_services/buckets_service.py +4 -9
- uipath/_services/jobs_service.py +256 -2
- uipath/_uipath.py +5 -0
- uipath/_utils/__init__.py +2 -0
- uipath/_utils/_request_override.py +2 -2
- uipath/_utils/_url.py +85 -0
- uipath/models/__init__.py +4 -1
- uipath/models/assets.py +22 -0
- uipath/models/attachment.py +28 -0
- {uipath-2.0.53.dist-info → uipath-2.0.55.dist-info}/METADATA +1 -1
- {uipath-2.0.53.dist-info → uipath-2.0.55.dist-info}/RECORD +24 -21
- {uipath-2.0.53.dist-info → uipath-2.0.55.dist-info}/WHEEL +0 -0
- {uipath-2.0.53.dist-info → uipath-2.0.55.dist-info}/entry_points.txt +0 -0
- {uipath-2.0.53.dist-info → uipath-2.0.55.dist-info}/licenses/LICENSE +0 -0
|
@@ -2,7 +2,6 @@ import http.server
|
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
4
|
import socketserver
|
|
5
|
-
import ssl
|
|
6
5
|
import time
|
|
7
6
|
|
|
8
7
|
import click
|
|
@@ -109,19 +108,15 @@ def make_request_handler_class(state, code_verifier, token_callback, domain):
|
|
|
109
108
|
return SimpleHTTPSRequestHandler
|
|
110
109
|
|
|
111
110
|
|
|
112
|
-
class
|
|
113
|
-
def __init__(self, port=6234
|
|
114
|
-
"""Initialize
|
|
111
|
+
class HTTPServer:
|
|
112
|
+
def __init__(self, port=6234):
|
|
113
|
+
"""Initialize HTTP server with configurable parameters.
|
|
115
114
|
|
|
116
115
|
Args:
|
|
117
116
|
port (int, optional): Port number to run the server on. Defaults to 6234.
|
|
118
|
-
cert_file (str, optional): SSL certificate file. Defaults to "localhost.crt".
|
|
119
|
-
key_file (str, optional): SSL key file. Defaults to "localhost.key".
|
|
120
117
|
"""
|
|
121
118
|
self.current_path = os.path.dirname(os.path.abspath(__file__))
|
|
122
119
|
self.port = port
|
|
123
|
-
self.cert_file = os.path.join(self.current_path, "localhost.crt")
|
|
124
|
-
self.key_file = os.path.join(self.current_path, "localhost.key")
|
|
125
120
|
self.httpd = None
|
|
126
121
|
self.token_data = None
|
|
127
122
|
self.should_shutdown = False
|
|
@@ -136,7 +131,7 @@ class HTTPSServer:
|
|
|
136
131
|
self.should_shutdown = True
|
|
137
132
|
|
|
138
133
|
def create_server(self, state, code_verifier, domain):
|
|
139
|
-
"""Create and configure the
|
|
134
|
+
"""Create and configure the HTTP server.
|
|
140
135
|
|
|
141
136
|
Args:
|
|
142
137
|
state (str): The OAuth state parameter.
|
|
@@ -144,20 +139,14 @@ class HTTPSServer:
|
|
|
144
139
|
domain (str): The domain for authentication.
|
|
145
140
|
|
|
146
141
|
Returns:
|
|
147
|
-
socketserver.TCPServer: The configured
|
|
142
|
+
socketserver.TCPServer: The configured HTTP server.
|
|
148
143
|
"""
|
|
149
|
-
# Create SSL context
|
|
150
|
-
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
|
151
|
-
context.load_cert_chain(self.cert_file, self.key_file)
|
|
152
|
-
|
|
153
144
|
# Create server with address reuse
|
|
154
145
|
socketserver.TCPServer.allow_reuse_address = True
|
|
155
146
|
handler = make_request_handler_class(
|
|
156
147
|
state, code_verifier, self.token_received_callback, domain
|
|
157
148
|
)
|
|
158
149
|
self.httpd = socketserver.TCPServer(("", self.port), handler)
|
|
159
|
-
self.httpd.socket = context.wrap_socket(self.httpd.socket, server_side=True)
|
|
160
|
-
|
|
161
150
|
return self.httpd
|
|
162
151
|
|
|
163
152
|
def start(self, state, code_verifier, domain):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"client_id": "36dea5b8-e8bb-423d-8e7b-c808df8f1c00",
|
|
3
|
-
"redirect_uri": "
|
|
3
|
+
"redirect_uri": "http://localhost:__PY_REPLACE_PORT__/oidc/login",
|
|
4
4
|
"scope": "offline_access OrchestratorApiUserAccess ConnectionService DataService DocumentUnderstanding EnterpriseContextService Directory JamJamApi LLMGateway LLMOps OMS RCS.FolderAuthorization",
|
|
5
5
|
"port": 8104
|
|
6
|
-
}
|
|
6
|
+
}
|
uipath/_cli/cli_auth.py
CHANGED
|
@@ -8,7 +8,7 @@ import click
|
|
|
8
8
|
from dotenv import load_dotenv
|
|
9
9
|
|
|
10
10
|
from ..telemetry import track
|
|
11
|
-
from ._auth._auth_server import
|
|
11
|
+
from ._auth._auth_server import HTTPServer
|
|
12
12
|
from ._auth._oidc_utils import get_auth_config, get_auth_url
|
|
13
13
|
from ._auth._portal_service import PortalService, select_tenant
|
|
14
14
|
from ._auth._utils import update_auth_file, update_env_file
|
|
@@ -97,7 +97,7 @@ def auth(domain, force: None | bool = False):
|
|
|
97
97
|
auth_url,
|
|
98
98
|
)
|
|
99
99
|
|
|
100
|
-
server =
|
|
100
|
+
server = HTTPServer(port=auth_config["port"])
|
|
101
101
|
token_data = server.start(state, code_verifier, domain)
|
|
102
102
|
|
|
103
103
|
if token_data:
|
uipath/_cli/cli_run.py
CHANGED
|
@@ -42,14 +42,14 @@ def python_run_middleware(
|
|
|
42
42
|
if not entrypoint:
|
|
43
43
|
return MiddlewareResult(
|
|
44
44
|
should_continue=False,
|
|
45
|
-
|
|
45
|
+
error_message="""No entrypoint specified. Please provide a path to a Python script.
|
|
46
46
|
Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path>]`""",
|
|
47
47
|
)
|
|
48
48
|
|
|
49
49
|
if not os.path.exists(entrypoint):
|
|
50
50
|
return MiddlewareResult(
|
|
51
51
|
should_continue=False,
|
|
52
|
-
error_message=f"""
|
|
52
|
+
error_message=f"""Script not found at path {entrypoint}.
|
|
53
53
|
Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path>]`""",
|
|
54
54
|
)
|
|
55
55
|
|
uipath/_services/__init__.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from .actions_service import ActionsService
|
|
2
2
|
from .api_client import ApiClient
|
|
3
3
|
from .assets_service import AssetsService
|
|
4
|
+
from .attachments_service import AttachmentsService
|
|
4
5
|
from .buckets_service import BucketsService
|
|
5
6
|
from .connections_service import ConnectionsService
|
|
6
7
|
from .context_grounding_service import ContextGroundingService
|
|
@@ -13,6 +14,7 @@ from .queues_service import QueuesService
|
|
|
13
14
|
__all__ = [
|
|
14
15
|
"ActionsService",
|
|
15
16
|
"AssetsService",
|
|
17
|
+
"AttachmentsService",
|
|
16
18
|
"BucketsService",
|
|
17
19
|
"ConnectionsService",
|
|
18
20
|
"ContextGroundingService",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
from logging import getLogger
|
|
3
|
-
from typing import Any, Union
|
|
3
|
+
from typing import Any, Literal, Union
|
|
4
4
|
|
|
5
5
|
from httpx import (
|
|
6
6
|
URL,
|
|
@@ -22,7 +22,7 @@ from uipath._utils._read_overwrites import OverwritesManager
|
|
|
22
22
|
|
|
23
23
|
from .._config import Config
|
|
24
24
|
from .._execution_context import ExecutionContext
|
|
25
|
-
from .._utils import user_agent_value
|
|
25
|
+
from .._utils import UiPathUrl, user_agent_value
|
|
26
26
|
from .._utils.constants import HEADER_USER_AGENT
|
|
27
27
|
|
|
28
28
|
|
|
@@ -39,24 +39,17 @@ class BaseService:
|
|
|
39
39
|
self._logger = getLogger("uipath")
|
|
40
40
|
self._config = config
|
|
41
41
|
self._execution_context = execution_context
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
self._tenant_scope_client_async = AsyncClient(
|
|
48
|
-
base_url=self._config.base_url,
|
|
49
|
-
headers=Headers(self.default_headers),
|
|
50
|
-
timeout=30.0,
|
|
51
|
-
)
|
|
52
|
-
org_scope_base_url = self.__get_org_scope_base_url()
|
|
53
|
-
self._org_scope_client = Client(
|
|
54
|
-
base_url=org_scope_base_url,
|
|
42
|
+
|
|
43
|
+
self._url = UiPathUrl(self._config.base_url)
|
|
44
|
+
|
|
45
|
+
self._client = Client(
|
|
46
|
+
base_url=self._url.base_url,
|
|
55
47
|
headers=Headers(self.default_headers),
|
|
56
48
|
timeout=30.0,
|
|
57
49
|
)
|
|
58
|
-
|
|
59
|
-
|
|
50
|
+
|
|
51
|
+
self._client_async = AsyncClient(
|
|
52
|
+
base_url=self._url.base_url,
|
|
60
53
|
headers=Headers(self.default_headers),
|
|
61
54
|
timeout=30.0,
|
|
62
55
|
)
|
|
@@ -77,12 +70,12 @@ class BaseService:
|
|
|
77
70
|
self,
|
|
78
71
|
method: str,
|
|
79
72
|
url: Union[URL, str],
|
|
73
|
+
*,
|
|
74
|
+
scoped: Literal["org", "tenant"] = "tenant",
|
|
80
75
|
**kwargs: Any,
|
|
81
76
|
) -> Response:
|
|
82
77
|
self._logger.debug(f"Request: {method} {url}")
|
|
83
|
-
self._logger.debug(
|
|
84
|
-
f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
|
|
85
|
-
)
|
|
78
|
+
self._logger.debug(f"HEADERS: {kwargs.get('headers', self._client.headers)}")
|
|
86
79
|
|
|
87
80
|
try:
|
|
88
81
|
stack = inspect.stack()
|
|
@@ -104,10 +97,13 @@ class BaseService:
|
|
|
104
97
|
specific_component = (
|
|
105
98
|
f"{module_name}.{function_name}" if module_name and function_name else ""
|
|
106
99
|
)
|
|
107
|
-
headers = kwargs.get("headers", {})
|
|
108
|
-
headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
|
|
109
100
|
|
|
110
|
-
|
|
101
|
+
kwargs.setdefault("headers", {})
|
|
102
|
+
kwargs["headers"][HEADER_USER_AGENT] = user_agent_value(specific_component)
|
|
103
|
+
|
|
104
|
+
scoped_url = self._url.scope_url(str(url), scoped)
|
|
105
|
+
|
|
106
|
+
response = self._client.request(method, scoped_url, **kwargs)
|
|
111
107
|
response.raise_for_status()
|
|
112
108
|
|
|
113
109
|
return response
|
|
@@ -123,96 +119,51 @@ class BaseService:
|
|
|
123
119
|
self,
|
|
124
120
|
method: str,
|
|
125
121
|
url: Union[URL, str],
|
|
122
|
+
*,
|
|
123
|
+
scoped: Literal["org", "tenant"] = "tenant",
|
|
126
124
|
**kwargs: Any,
|
|
127
125
|
) -> Response:
|
|
128
126
|
self._logger.debug(f"Request: {method} {url}")
|
|
129
127
|
self._logger.debug(
|
|
130
|
-
f"HEADERS: {kwargs.get('headers', self.
|
|
128
|
+
f"HEADERS: {kwargs.get('headers', self._client_async.headers)}"
|
|
131
129
|
)
|
|
132
130
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
# use the third frame because of the retry decorator
|
|
137
|
-
caller_frame = stack[3].frame
|
|
138
|
-
function_name = caller_frame.f_code.co_name
|
|
139
|
-
|
|
140
|
-
if "self" in caller_frame.f_locals:
|
|
141
|
-
module_name = type(caller_frame.f_locals["self"]).__name__
|
|
142
|
-
elif "cls" in caller_frame.f_locals:
|
|
143
|
-
module_name = caller_frame.f_locals["cls"].__name__
|
|
144
|
-
else:
|
|
145
|
-
module_name = ""
|
|
146
|
-
except Exception:
|
|
147
|
-
function_name = ""
|
|
148
|
-
module_name = ""
|
|
149
|
-
|
|
150
|
-
specific_component = (
|
|
151
|
-
f"{module_name}.{function_name}" if module_name and function_name else ""
|
|
131
|
+
kwargs.setdefault("headers", {})
|
|
132
|
+
kwargs["headers"][HEADER_USER_AGENT] = user_agent_value(
|
|
133
|
+
self._specific_component
|
|
152
134
|
)
|
|
153
|
-
headers = kwargs.get("headers", {})
|
|
154
|
-
headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
|
|
155
135
|
|
|
156
|
-
|
|
136
|
+
scoped_url = self._url.scope_url(str(url), scoped)
|
|
137
|
+
|
|
138
|
+
response = await self._client_async.request(method, scoped_url, **kwargs)
|
|
157
139
|
response.raise_for_status()
|
|
158
140
|
|
|
159
141
|
return response
|
|
160
142
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
try:
|
|
173
|
-
stack = inspect.stack()
|
|
174
|
-
|
|
175
|
-
# use the third frame because of the retry decorator
|
|
176
|
-
caller_frame = stack[3].frame
|
|
177
|
-
function_name = caller_frame.f_code.co_name
|
|
178
|
-
|
|
179
|
-
if "self" in caller_frame.f_locals:
|
|
180
|
-
module_name = type(caller_frame.f_locals["self"]).__name__
|
|
181
|
-
elif "cls" in caller_frame.f_locals:
|
|
182
|
-
module_name = caller_frame.f_locals["cls"].__name__
|
|
183
|
-
else:
|
|
184
|
-
module_name = ""
|
|
185
|
-
except Exception:
|
|
186
|
-
function_name = ""
|
|
187
|
-
module_name = ""
|
|
188
|
-
|
|
189
|
-
specific_component = (
|
|
190
|
-
f"{module_name}.{function_name}" if module_name and function_name else ""
|
|
191
|
-
)
|
|
192
|
-
headers = kwargs.get("headers", {})
|
|
193
|
-
headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
|
|
194
|
-
|
|
195
|
-
response = self._org_scope_client.request(method, url, **kwargs)
|
|
196
|
-
response.raise_for_status()
|
|
143
|
+
@property
|
|
144
|
+
def default_headers(self) -> dict[str, str]:
|
|
145
|
+
return {
|
|
146
|
+
"Accept": "application/json",
|
|
147
|
+
"Content-Type": "application/json",
|
|
148
|
+
**self.auth_headers,
|
|
149
|
+
**self.custom_headers,
|
|
150
|
+
}
|
|
197
151
|
|
|
198
|
-
|
|
152
|
+
@property
|
|
153
|
+
def auth_headers(self) -> dict[str, str]:
|
|
154
|
+
header = f"Bearer {self._config.secret}"
|
|
155
|
+
return {"Authorization": header}
|
|
199
156
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
url: Union[URL, str],
|
|
204
|
-
**kwargs: Any,
|
|
205
|
-
) -> Response:
|
|
206
|
-
self._logger.debug(f"Request: {method} {url}")
|
|
207
|
-
self._logger.debug(
|
|
208
|
-
f"HEADERS: {kwargs.get('headers', self._tenant_scope_client.headers)}"
|
|
209
|
-
)
|
|
157
|
+
@property
|
|
158
|
+
def custom_headers(self) -> dict[str, str]:
|
|
159
|
+
return {}
|
|
210
160
|
|
|
161
|
+
@property
|
|
162
|
+
def _specific_component(self) -> str:
|
|
211
163
|
try:
|
|
212
164
|
stack = inspect.stack()
|
|
213
165
|
|
|
214
|
-
|
|
215
|
-
caller_frame = stack[3].frame
|
|
166
|
+
caller_frame = stack[4].frame
|
|
216
167
|
function_name = caller_frame.f_code.co_name
|
|
217
168
|
|
|
218
169
|
if "self" in caller_frame.f_locals:
|
|
@@ -228,34 +179,5 @@ class BaseService:
|
|
|
228
179
|
specific_component = (
|
|
229
180
|
f"{module_name}.{function_name}" if module_name and function_name else ""
|
|
230
181
|
)
|
|
231
|
-
headers = kwargs.get("headers", {})
|
|
232
|
-
headers[HEADER_USER_AGENT] = user_agent_value(specific_component)
|
|
233
|
-
|
|
234
|
-
response = await self._org_scope_client_async.request(method, url, **kwargs)
|
|
235
|
-
response.raise_for_status()
|
|
236
|
-
|
|
237
|
-
return response
|
|
238
|
-
|
|
239
|
-
@property
|
|
240
|
-
def default_headers(self) -> dict[str, str]:
|
|
241
|
-
return {
|
|
242
|
-
"Accept": "application/json",
|
|
243
|
-
"Content-Type": "application/json",
|
|
244
|
-
**self.auth_headers,
|
|
245
|
-
**self.custom_headers,
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
@property
|
|
249
|
-
def auth_headers(self) -> dict[str, str]:
|
|
250
|
-
header = f"Bearer {self._config.secret}"
|
|
251
|
-
return {"Authorization": header}
|
|
252
|
-
|
|
253
|
-
@property
|
|
254
|
-
def custom_headers(self) -> dict[str, str]:
|
|
255
|
-
return {}
|
|
256
182
|
|
|
257
|
-
|
|
258
|
-
base_url = str(self._config.base_url)
|
|
259
|
-
if base_url.endswith("/"):
|
|
260
|
-
base_url = base_url[:-1]
|
|
261
|
-
return base_url.rsplit("/", 1)[0] + "/"
|
|
183
|
+
return specific_component
|
|
@@ -349,8 +349,12 @@ class ActionsService(FolderContext, BaseService):
|
|
|
349
349
|
raise Exception("appName or appKey is required")
|
|
350
350
|
spec = _retrieve_app_key_spec(app_name=app_name)
|
|
351
351
|
|
|
352
|
-
response = await self.
|
|
353
|
-
spec.method,
|
|
352
|
+
response = await self.request_async(
|
|
353
|
+
spec.method,
|
|
354
|
+
spec.endpoint,
|
|
355
|
+
params=spec.params,
|
|
356
|
+
headers=spec.headers,
|
|
357
|
+
scoped="org",
|
|
354
358
|
)
|
|
355
359
|
try:
|
|
356
360
|
deployed_app = self._extract_deployed_app(
|
|
@@ -382,8 +386,12 @@ class ActionsService(FolderContext, BaseService):
|
|
|
382
386
|
|
|
383
387
|
spec = _retrieve_app_key_spec(app_name=app_name)
|
|
384
388
|
|
|
385
|
-
response = self.
|
|
386
|
-
spec.method,
|
|
389
|
+
response = self.request(
|
|
390
|
+
spec.method,
|
|
391
|
+
spec.endpoint,
|
|
392
|
+
params=spec.params,
|
|
393
|
+
headers=spec.headers,
|
|
394
|
+
scoped="org",
|
|
387
395
|
)
|
|
388
396
|
|
|
389
397
|
try:
|
uipath/_services/api_client.py
CHANGED
|
@@ -28,7 +28,7 @@ class ApiClient(FolderContext, BaseService):
|
|
|
28
28
|
) -> Response:
|
|
29
29
|
if kwargs.get("include_folder_headers", False):
|
|
30
30
|
kwargs["headers"] = {
|
|
31
|
-
**kwargs.get("headers", self.
|
|
31
|
+
**kwargs.get("headers", self._client.headers),
|
|
32
32
|
**self.folder_headers,
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -45,7 +45,7 @@ class ApiClient(FolderContext, BaseService):
|
|
|
45
45
|
) -> Response:
|
|
46
46
|
if kwargs.get("include_folder_headers", False):
|
|
47
47
|
kwargs["headers"] = {
|
|
48
|
-
**kwargs.get("headers", self.
|
|
48
|
+
**kwargs.get("headers", self._client_async.headers),
|
|
49
49
|
**self.folder_headers,
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -53,37 +53,3 @@ class ApiClient(FolderContext, BaseService):
|
|
|
53
53
|
del kwargs["include_folder_headers"]
|
|
54
54
|
|
|
55
55
|
return await super().request_async(method, url, **kwargs)
|
|
56
|
-
|
|
57
|
-
def request_org_scope(
|
|
58
|
-
self,
|
|
59
|
-
method: str,
|
|
60
|
-
url: Union[URL, str],
|
|
61
|
-
**kwargs: Any,
|
|
62
|
-
) -> Response:
|
|
63
|
-
if kwargs.get("include_folder_headers", False):
|
|
64
|
-
kwargs["headers"] = {
|
|
65
|
-
**kwargs.get("headers", self._org_scope_client.headers),
|
|
66
|
-
**self.folder_headers,
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if "include_folder_headers" in kwargs:
|
|
70
|
-
del kwargs["include_folder_headers"]
|
|
71
|
-
|
|
72
|
-
return super().request_org_scope(method, url, **kwargs)
|
|
73
|
-
|
|
74
|
-
async def request_org_scope_async(
|
|
75
|
-
self,
|
|
76
|
-
method: str,
|
|
77
|
-
url: Union[URL, str],
|
|
78
|
-
**kwargs: Any,
|
|
79
|
-
) -> Response:
|
|
80
|
-
if kwargs.get("include_folder_headers", False):
|
|
81
|
-
kwargs["headers"] = {
|
|
82
|
-
**kwargs.get("headers", self._org_scope_client_async.headers),
|
|
83
|
-
**self.folder_headers,
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if "include_folder_headers" in kwargs:
|
|
87
|
-
del kwargs["include_folder_headers"]
|
|
88
|
-
|
|
89
|
-
return await super().request_org_scope_async(method, url, **kwargs)
|
|
@@ -7,7 +7,7 @@ from .._execution_context import ExecutionContext
|
|
|
7
7
|
from .._folder_context import FolderContext
|
|
8
8
|
from .._utils import Endpoint, RequestSpec, header_folder, infer_bindings
|
|
9
9
|
from .._utils._read_overwrites import OverwritesManager, read_resource_overwrites
|
|
10
|
-
from ..models import UserAsset
|
|
10
|
+
from ..models import Asset, UserAsset
|
|
11
11
|
from ..tracing._traced import traced
|
|
12
12
|
from ._base_service import BaseService
|
|
13
13
|
|
|
@@ -34,7 +34,7 @@ class AssetsService(FolderContext, BaseService):
|
|
|
34
34
|
*,
|
|
35
35
|
folder_key: Optional[str] = None,
|
|
36
36
|
folder_path: Optional[str] = None,
|
|
37
|
-
) -> UserAsset:
|
|
37
|
+
) -> UserAsset | Asset:
|
|
38
38
|
"""Retrieve an asset by its name.
|
|
39
39
|
|
|
40
40
|
Related Activity: [Get Asset](https://docs.uipath.com/activities/other/latest/workflow/get-robot-asset)
|
|
@@ -56,6 +56,11 @@ class AssetsService(FolderContext, BaseService):
|
|
|
56
56
|
client.assets.retrieve(name="MyAsset")
|
|
57
57
|
```
|
|
58
58
|
"""
|
|
59
|
+
try:
|
|
60
|
+
is_user = self._execution_context.robot_key is not None
|
|
61
|
+
except ValueError:
|
|
62
|
+
is_user = False
|
|
63
|
+
|
|
59
64
|
with read_resource_overwrites("asset", name, folder_path) as (
|
|
60
65
|
overwritten_name,
|
|
61
66
|
overwritten_folder_path,
|
|
@@ -68,11 +73,15 @@ class AssetsService(FolderContext, BaseService):
|
|
|
68
73
|
response = self.request(
|
|
69
74
|
spec.method,
|
|
70
75
|
url=spec.endpoint,
|
|
76
|
+
params=spec.params,
|
|
71
77
|
content=spec.content,
|
|
72
78
|
headers=spec.headers,
|
|
73
79
|
)
|
|
74
80
|
|
|
75
|
-
|
|
81
|
+
if is_user:
|
|
82
|
+
return UserAsset.model_validate(response.json())
|
|
83
|
+
else:
|
|
84
|
+
return Asset.model_validate(response.json()["value"][0])
|
|
76
85
|
|
|
77
86
|
@traced(
|
|
78
87
|
name="assets_retrieve", run_type="uipath", hide_input=True, hide_output=True
|
|
@@ -83,7 +92,7 @@ class AssetsService(FolderContext, BaseService):
|
|
|
83
92
|
*,
|
|
84
93
|
folder_key: Optional[str] = None,
|
|
85
94
|
folder_path: Optional[str] = None,
|
|
86
|
-
) -> UserAsset:
|
|
95
|
+
) -> UserAsset | Asset:
|
|
87
96
|
"""Asynchronously retrieve an asset by its name.
|
|
88
97
|
|
|
89
98
|
Related Activity: [Get Asset](https://docs.uipath.com/activities/other/latest/workflow/get-robot-asset)
|
|
@@ -96,6 +105,11 @@ class AssetsService(FolderContext, BaseService):
|
|
|
96
105
|
Returns:
|
|
97
106
|
UserAsset: The asset data.
|
|
98
107
|
"""
|
|
108
|
+
try:
|
|
109
|
+
is_user = self._execution_context.robot_key is not None
|
|
110
|
+
except ValueError:
|
|
111
|
+
is_user = False
|
|
112
|
+
|
|
99
113
|
with read_resource_overwrites("asset", name, folder_path) as (
|
|
100
114
|
overwritten_name,
|
|
101
115
|
overwritten_folder_path,
|
|
@@ -108,11 +122,15 @@ class AssetsService(FolderContext, BaseService):
|
|
|
108
122
|
response = await self.request_async(
|
|
109
123
|
spec.method,
|
|
110
124
|
url=spec.endpoint,
|
|
125
|
+
params=spec.params,
|
|
111
126
|
content=spec.content,
|
|
112
127
|
headers=spec.headers,
|
|
113
128
|
)
|
|
114
129
|
|
|
115
|
-
|
|
130
|
+
if is_user:
|
|
131
|
+
return UserAsset.model_validate(response.json())
|
|
132
|
+
else:
|
|
133
|
+
return Asset.model_validate(response.json()["value"][0])
|
|
116
134
|
|
|
117
135
|
@infer_bindings()
|
|
118
136
|
@traced(
|
|
@@ -138,7 +156,18 @@ class AssetsService(FolderContext, BaseService):
|
|
|
138
156
|
|
|
139
157
|
Returns:
|
|
140
158
|
Optional[str]: The decrypted credential password.
|
|
159
|
+
|
|
160
|
+
Raises:
|
|
161
|
+
ValueError: If the method is called for a user asset.
|
|
141
162
|
"""
|
|
163
|
+
try:
|
|
164
|
+
is_user = self._execution_context.robot_key is not None
|
|
165
|
+
except ValueError:
|
|
166
|
+
is_user = False
|
|
167
|
+
|
|
168
|
+
if not is_user:
|
|
169
|
+
raise ValueError("This method can only be used for robot assets.")
|
|
170
|
+
|
|
142
171
|
with read_resource_overwrites("asset", name, folder_path) as (
|
|
143
172
|
overwritten_name,
|
|
144
173
|
overwritten_folder_path,
|
|
@@ -185,7 +214,17 @@ class AssetsService(FolderContext, BaseService):
|
|
|
185
214
|
Returns:
|
|
186
215
|
Optional[str]: The decrypted credential password.
|
|
187
216
|
|
|
217
|
+
Raises:
|
|
218
|
+
ValueError: If the method is called for a user asset.
|
|
188
219
|
"""
|
|
220
|
+
try:
|
|
221
|
+
is_user = self._execution_context.robot_key is not None
|
|
222
|
+
except ValueError:
|
|
223
|
+
is_user = False
|
|
224
|
+
|
|
225
|
+
if not is_user:
|
|
226
|
+
raise ValueError("This method can only be used for robot assets.")
|
|
227
|
+
|
|
189
228
|
with read_resource_overwrites("asset", name, folder_path) as (
|
|
190
229
|
overwritten_name,
|
|
191
230
|
overwritten_folder_path,
|
|
@@ -224,7 +263,18 @@ class AssetsService(FolderContext, BaseService):
|
|
|
224
263
|
|
|
225
264
|
Returns:
|
|
226
265
|
Response: The HTTP response confirming the update.
|
|
266
|
+
|
|
267
|
+
Raises:
|
|
268
|
+
ValueError: If the method is called for a user asset.
|
|
227
269
|
"""
|
|
270
|
+
try:
|
|
271
|
+
is_user = self._execution_context.robot_key is not None
|
|
272
|
+
except ValueError:
|
|
273
|
+
is_user = False
|
|
274
|
+
|
|
275
|
+
if not is_user:
|
|
276
|
+
raise ValueError("This method can only be used for robot assets.")
|
|
277
|
+
|
|
228
278
|
with read_resource_overwrites("asset", robot_asset.name or "", folder_path) as (
|
|
229
279
|
overwritten_name,
|
|
230
280
|
overwritten_folder_path,
|
|
@@ -288,14 +338,29 @@ class AssetsService(FolderContext, BaseService):
|
|
|
288
338
|
folder_key: Optional[str] = None,
|
|
289
339
|
folder_path: Optional[str] = None,
|
|
290
340
|
) -> RequestSpec:
|
|
341
|
+
try:
|
|
342
|
+
robot_key = self._execution_context.robot_key
|
|
343
|
+
except ValueError:
|
|
344
|
+
robot_key = None
|
|
345
|
+
|
|
346
|
+
if robot_key is None:
|
|
347
|
+
return RequestSpec(
|
|
348
|
+
method="GET",
|
|
349
|
+
endpoint=Endpoint(
|
|
350
|
+
"/orchestrator_/odata/Assets/UiPath.Server.Configuration.OData.GetFiltered",
|
|
351
|
+
),
|
|
352
|
+
params={"$filter": f"Name eq '{name}'", "$top": 1},
|
|
353
|
+
headers={
|
|
354
|
+
**header_folder(folder_key, folder_path),
|
|
355
|
+
},
|
|
356
|
+
)
|
|
357
|
+
|
|
291
358
|
return RequestSpec(
|
|
292
359
|
method="POST",
|
|
293
360
|
endpoint=Endpoint(
|
|
294
361
|
"/orchestrator_/odata/Assets/UiPath.Server.Configuration.OData.GetRobotAssetByNameForRobotKey"
|
|
295
362
|
),
|
|
296
|
-
content=str(
|
|
297
|
-
{"assetName": name, "robotKey": self._execution_context.robot_key}
|
|
298
|
-
),
|
|
363
|
+
content=str({"assetName": name, "robotKey": robot_key}),
|
|
299
364
|
headers={
|
|
300
365
|
**header_folder(folder_key, folder_path),
|
|
301
366
|
},
|