Skip to content

Commit b784b51

Browse files
authored
Merge pull request #189 from ynput/bugfix/184-serverapiget_addon_settings_schema-requested-url-is-wrong
Fix addons url functions
2 parents 22fcd65 + 77a23d1 commit b784b51

File tree

3 files changed

+103
-32
lines changed

3 files changed

+103
-32
lines changed

ayon_api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
get_attributes_fields_for_type,
8686
get_default_fields_for_type,
8787
get_addons_info,
88+
get_addon_endpoint,
8889
get_addon_url,
8990
download_addon_private_file,
9091
get_installers,
@@ -313,6 +314,7 @@
313314
"get_attributes_fields_for_type",
314315
"get_default_fields_for_type",
315316
"get_addons_info",
317+
"get_addon_endpoint",
316318
"get_addon_url",
317319
"download_addon_private_file",
318320
"get_installers",

ayon_api/_api.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,8 @@ def dispatch_event(*args, **kwargs):
780780
sender (Optional[str]): Sender of event.
781781
event_hash (Optional[str]): Event hash.
782782
project_name (Optional[str]): Project name.
783-
username (Optional[str]): Username which triggered event.
784783
depends_on (Optional[str]): Add dependency to another event.
784+
username (Optional[str]): Username which triggered event.
785785
description (Optional[str]): Description of event.
786786
summary (Optional[dict[str, Any]]): Summary of event that can be used
787787
for simple filtering on listeners.
@@ -1155,6 +1155,30 @@ def get_addons_info(*args, **kwargs):
11551155
return con.get_addons_info(*args, **kwargs)
11561156

11571157

1158+
def get_addon_endpoint(*args, **kwargs):
1159+
"""Calculate endpoint to addon route.
1160+
1161+
Examples:
1162+
1163+
>>> api = ServerAPI("https://your.url.com")
1164+
>>> api.get_addon_url(
1165+
... "example", "1.0.0", "private", "my.zip")
1166+
'addons/example/1.0.0/private/my.zip'
1167+
1168+
Args:
1169+
addon_name (str): Name of addon.
1170+
addon_version (str): Version of addon.
1171+
*subpaths (str): Any amount of subpaths that are added to
1172+
addon url.
1173+
1174+
Returns:
1175+
str: Final url.
1176+
1177+
"""
1178+
con = get_server_api_connection()
1179+
return con.get_addon_endpoint(*args, **kwargs)
1180+
1181+
11581182
def get_addon_url(*args, **kwargs):
11591183
"""Calculate url to addon route.
11601184
@@ -1163,13 +1187,14 @@ def get_addon_url(*args, **kwargs):
11631187
>>> api = ServerAPI("https://your.url.com")
11641188
>>> api.get_addon_url(
11651189
... "example", "1.0.0", "private", "my.zip")
1166-
'https://your.url.com/addons/example/1.0.0/private/my.zip'
1190+
'https://your.url.com/api/addons/example/1.0.0/private/my.zip'
11671191
11681192
Args:
11691193
addon_name (str): Name of addon.
11701194
addon_version (str): Version of addon.
11711195
*subpaths (str): Any amount of subpaths that are added to
11721196
addon url.
1197+
use_rest (Optional[bool]): Use rest endpoint.
11731198
11741199
Returns:
11751200
str: Final url.

ayon_api/server_api.py

Lines changed: 74 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import warnings
1717
import itertools
1818
from contextlib import contextmanager
19+
from typing import Optional
1920

2021
try:
2122
from http import HTTPStatus
@@ -1323,49 +1324,44 @@ def _do_rest_request(self, function, url, **kwargs):
13231324
return new_response
13241325

13251326
def raw_post(self, entrypoint, **kwargs):
1326-
entrypoint = entrypoint.lstrip("/").rstrip("/")
1327-
self.log.debug("Executing [POST] {}".format(entrypoint))
1328-
url = "{}/{}".format(self._rest_url, entrypoint)
1327+
url = self._endpoint_to_url(entrypoint)
1328+
self.log.debug("Executing [POST] {}".format(url))
13291329
return self._do_rest_request(
13301330
RequestTypes.post,
13311331
url,
13321332
**kwargs
13331333
)
13341334

13351335
def raw_put(self, entrypoint, **kwargs):
1336-
entrypoint = entrypoint.lstrip("/").rstrip("/")
1337-
self.log.debug("Executing [PUT] {}".format(entrypoint))
1338-
url = "{}/{}".format(self._rest_url, entrypoint)
1336+
url = self._endpoint_to_url(entrypoint)
1337+
self.log.debug("Executing [PUT] {}".format(url))
13391338
return self._do_rest_request(
13401339
RequestTypes.put,
13411340
url,
13421341
**kwargs
13431342
)
13441343

13451344
def raw_patch(self, entrypoint, **kwargs):
1346-
entrypoint = entrypoint.lstrip("/").rstrip("/")
1347-
self.log.debug("Executing [PATCH] {}".format(entrypoint))
1348-
url = "{}/{}".format(self._rest_url, entrypoint)
1345+
url = self._endpoint_to_url(entrypoint)
1346+
self.log.debug("Executing [PATCH] {}".format(url))
13491347
return self._do_rest_request(
13501348
RequestTypes.patch,
13511349
url,
13521350
**kwargs
13531351
)
13541352

13551353
def raw_get(self, entrypoint, **kwargs):
1356-
entrypoint = entrypoint.lstrip("/").rstrip("/")
1357-
self.log.debug("Executing [GET] {}".format(entrypoint))
1358-
url = "{}/{}".format(self._rest_url, entrypoint)
1354+
url = self._endpoint_to_url(entrypoint)
1355+
self.log.debug("Executing [GET] {}".format(url))
13591356
return self._do_rest_request(
13601357
RequestTypes.get,
13611358
url,
13621359
**kwargs
13631360
)
13641361

13651362
def raw_delete(self, entrypoint, **kwargs):
1366-
entrypoint = entrypoint.lstrip("/").rstrip("/")
1367-
self.log.debug("Executing [DELETE] {}".format(entrypoint))
1368-
url = "{}/{}".format(self._rest_url, entrypoint)
1363+
url = self._endpoint_to_url(entrypoint)
1364+
self.log.debug("Executing [DELETE] {}".format(url))
13691365
return self._do_rest_request(
13701366
RequestTypes.delete,
13711367
url,
@@ -1708,6 +1704,30 @@ def enroll_event_job(
17081704

17091705
return response.data
17101706

1707+
def _endpoint_to_url(
1708+
self,
1709+
endpoint: str,
1710+
use_rest: Optional[bool] = True
1711+
):
1712+
"""Cleanup endpoint and return full url to AYON server.
1713+
1714+
If endpoint already starts with server url only slashes are removed.
1715+
1716+
Args:
1717+
endpoint (str): Endpoint to be cleaned.
1718+
use_rest (Optional[bool]): Use only base server url if set to
1719+
False, otherwise REST endpoint is used.
1720+
1721+
Returns:
1722+
str: Full url to AYON server.
1723+
1724+
"""
1725+
endpoint = endpoint.lstrip("/").rstrip("/")
1726+
if endpoint.startswith(self._base_url):
1727+
return endpoint
1728+
base_url = self._rest_url if use_rest else self._graphql_url
1729+
return f"{base_url}/{endpoint}"
1730+
17111731
def _download_file_to_stream(self, url, stream, chunk_size, progress):
17121732
kwargs = {"stream": True}
17131733
if self._session is None:
@@ -1752,9 +1772,8 @@ def download_file_to_stream(
17521772

17531773
if endpoint.startswith(self._base_url):
17541774
url = endpoint
1755-
else:
1756-
endpoint = endpoint.lstrip("/").rstrip("/")
1757-
url = "{}/{}".format(self._rest_url, endpoint)
1775+
1776+
url = self._endpoint_to_url(endpoint)
17581777

17591778
if progress is None:
17601779
progress = TransferProgress()
@@ -1922,11 +1941,7 @@ def upload_file_from_stream(
19221941
requests.Response: Response object
19231942
19241943
"""
1925-
if endpoint.startswith(self._base_url):
1926-
url = endpoint
1927-
else:
1928-
endpoint = endpoint.lstrip("/").rstrip("/")
1929-
url = "{}/{}".format(self._rest_url, endpoint)
1944+
url = self._endpoint_to_url(endpoint)
19301945

19311946
# Create dummy object so the function does not have to check
19321947
# 'progress' variable everywhere
@@ -2337,15 +2352,15 @@ def get_addons_info(self, details=True):
23372352
response.raise_for_status()
23382353
return response.data
23392354

2340-
def get_addon_url(self, addon_name, addon_version, *subpaths):
2341-
"""Calculate url to addon route.
2355+
def get_addon_endpoint(self, addon_name, addon_version, *subpaths):
2356+
"""Calculate endpoint to addon route.
23422357
23432358
Examples:
23442359
23452360
>>> api = ServerAPI("https://your.url.com")
23462361
>>> api.get_addon_url(
23472362
... "example", "1.0.0", "private", "my.zip")
2348-
'https://your.url.com/addons/example/1.0.0/private/my.zip'
2363+
'addons/example/1.0.0/private/my.zip'
23492364
23502365
Args:
23512366
addon_name (str): Name of addon.
@@ -2360,13 +2375,41 @@ def get_addon_url(self, addon_name, addon_version, *subpaths):
23602375
ending = ""
23612376
if subpaths:
23622377
ending = "/{}".format("/".join(subpaths))
2363-
return "{}/addons/{}/{}{}".format(
2364-
self._base_url,
2378+
return "addons/{}/{}{}".format(
23652379
addon_name,
23662380
addon_version,
23672381
ending
23682382
)
23692383

2384+
def get_addon_url(
2385+
self, addon_name, addon_version, *subpaths, use_rest=True
2386+
):
2387+
"""Calculate url to addon route.
2388+
2389+
Examples:
2390+
2391+
>>> api = ServerAPI("https://your.url.com")
2392+
>>> api.get_addon_url(
2393+
... "example", "1.0.0", "private", "my.zip")
2394+
'https://your.url.com/api/addons/example/1.0.0/private/my.zip'
2395+
2396+
Args:
2397+
addon_name (str): Name of addon.
2398+
addon_version (str): Version of addon.
2399+
*subpaths (str): Any amount of subpaths that are added to
2400+
addon url.
2401+
use_rest (Optional[bool]): Use rest endpoint.
2402+
2403+
Returns:
2404+
str: Final url.
2405+
2406+
"""
2407+
endpoint = self.get_addon_endpoint(
2408+
addon_name, addon_version, *subpaths
2409+
)
2410+
url_base = self._base_url if use_rest else self._rest_url
2411+
return f"{url_base}/{endpoint}"
2412+
23702413
def download_addon_private_file(
23712414
self,
23722415
addon_name,
@@ -2404,12 +2447,13 @@ def download_addon_private_file(
24042447
dst_dirpath = os.path.dirname(dst_filepath)
24052448
os.makedirs(dst_dirpath, exist_ok=True)
24062449

2407-
url = self.get_addon_url(
2450+
endpoint = self.get_addon_endpoint(
24082451
addon_name,
24092452
addon_version,
24102453
"private",
24112454
filename
24122455
)
2456+
url = f"{self._base_url}/{endpoint}"
24132457
self.download_file(
24142458
url, dst_filepath, chunk_size=chunk_size, progress=progress
24152459
)
@@ -3222,7 +3266,7 @@ def get_addon_settings_schema(
32223266
if project_name:
32233267
args = (project_name, )
32243268

3225-
endpoint = self.get_addon_url(
3269+
endpoint = self.get_addon_endpoint(
32263270
addon_name, addon_version, "schema", *args
32273271
)
32283272
result = self.get(endpoint)

0 commit comments

Comments
 (0)