diff --git a/lib/cloudinary/__init__.py b/lib/cloudinary/__init__.py index f9b79955..877340c9 100644 --- a/lib/cloudinary/__init__.py +++ b/lib/cloudinary/__init__.py @@ -38,7 +38,7 @@ CL_BLANK = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAA URI_SCHEME = "cloudinary" API_VERSION = "v1_1" -VERSION = "1.40.0" +VERSION = "1.41.0" _USER_PLATFORM_DETAILS = "; ".join((platform(), "Python {}".format(python_version()))) diff --git a/lib/cloudinary/api.py b/lib/cloudinary/api.py index 0ae0fb33..95543d32 100644 --- a/lib/cloudinary/api.py +++ b/lib/cloudinary/api.py @@ -543,10 +543,6 @@ def create_upload_preset(**options): return call_api("post", uri, params, **options) -def create_folder(path, **options): - return call_api("post", ["folders", path], {}, **options) - - def root_folders(**options): return call_api("get", ["folders"], only(options, "next_cursor", "max_results"), **options) @@ -555,6 +551,24 @@ def subfolders(of_folder_path, **options): return call_api("get", ["folders", of_folder_path], only(options, "next_cursor", "max_results"), **options) +def create_folder(path, **options): + return call_api("post", ["folders", path], {}, **options) + + +def rename_folder(from_path, to_path, **options): + """ + Renames folder + + :param from_path: The full path of an existing asset folder. + :param to_path: The full path of the new asset folder. + :param options: Additional options + + :rtype: Response + """ + params = {"to_folder": to_path} + return call_api("put", ["folders", from_path], params, **options) + + def delete_folder(path, **options): """Deletes folder @@ -727,7 +741,7 @@ def update_metadata_field(field_external_id, field, **options): def __metadata_field_params(field): return only(field, "type", "external_id", "label", "mandatory", "restrictions", - "default_value", "validation", "datasource") + "default_value", "default_disabled", "validation", "datasource") def delete_metadata_field(field_external_id, **options): diff --git a/lib/cloudinary/auth_token.py b/lib/cloudinary/auth_token.py index 4f6c1fe1..8ddeacdf 100644 --- a/lib/cloudinary/auth_token.py +++ b/lib/cloudinary/auth_token.py @@ -11,7 +11,7 @@ AUTH_TOKEN_UNSAFE_RE = r'([ "#%&\'\/:;<=>?@\[\\\]^`{\|}~]+)' def generate(url=None, acl=None, start_time=None, duration=None, - expiration=None, ip=None, key=None, token_name=AUTH_TOKEN_NAME): + expiration=None, ip=None, key=None, token_name=AUTH_TOKEN_NAME, **_): if expiration is None: if duration is not None: diff --git a/lib/cloudinary/utils.py b/lib/cloudinary/utils.py index 1b7b7215..297bdb7a 100644 --- a/lib/cloudinary/utils.py +++ b/lib/cloudinary/utils.py @@ -820,7 +820,7 @@ def cloudinary_url(source, **options): transformation = re.sub(r'([^:])/+', r'\1/', transformation) signature = None - if sign_url and not auth_token: + if sign_url and (not auth_token or auth_token.pop('set_url_signature', False)): to_sign = "/".join(__compact([transformation, source_to_sign])) if long_url_signature: # Long signature forces SHA256 diff --git a/requirements.txt b/requirements.txt index 0e7f8cf0..94a65531 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ bleach==6.1.0 certifi==2024.7.4 cheroot==10.0.1 cherrypy==18.10.0 -cloudinary==1.40.0 +cloudinary==1.41.0 distro==1.9.0 dnspython==2.6.1 facebook-sdk==3.1.0