Skip to content

Commit 4fecabe

Browse files
Add support for status option in sync command
1 parent 13fa594 commit 4fecabe

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

Diff for: cloudinary_cli/modules/sync.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,19 @@
3838
help="Specify the batch size for deleting remote assets.")
3939
@option("-fm", "--folder-mode", type=Choice(['fixed', 'dynamic'], case_sensitive=False),
4040
help="Specify folder mode explicitly. By default uses cloud mode configured in your cloud.", hidden=True)
41+
@option("-st", "--status", type=Choice(['all', 'active', 'pending'], case_sensitive=False),
42+
help="Specify asset status. Server default: active.", default=None)
4143
@option("-o", "--optional_parameter", multiple=True, nargs=2, help="Pass optional parameters as raw strings.")
4244
@option("-O", "--optional_parameter_parsed", multiple=True, nargs=2,
4345
help="Pass optional parameters as interpreted strings.")
4446
@option("--dry-run", is_flag=True, help="Simulate the sync operation without making any changes.")
4547
def sync(local_folder, cloudinary_folder, push, pull, include_hidden, concurrent_workers, force, keep_unique,
46-
deletion_batch_size, folder_mode, optional_parameter, optional_parameter_parsed, dry_run):
48+
deletion_batch_size, folder_mode, status, optional_parameter, optional_parameter_parsed, dry_run):
4749
if push == pull:
4850
raise UsageError("Please use either the '--push' OR '--pull' options")
4951

5052
sync_dir = SyncDir(local_folder, cloudinary_folder, include_hidden, concurrent_workers, force, keep_unique,
51-
deletion_batch_size, folder_mode, optional_parameter, optional_parameter_parsed, dry_run)
53+
deletion_batch_size, folder_mode, status, optional_parameter, optional_parameter_parsed, dry_run)
5254
result = True
5355
if push:
5456
result = sync_dir.push()
@@ -63,7 +65,7 @@ def sync(local_folder, cloudinary_folder, push, pull, include_hidden, concurrent
6365

6466
class SyncDir:
6567
def __init__(self, local_dir, remote_dir, include_hidden, concurrent_workers, force, keep_deleted,
66-
deletion_batch_size, folder_mode, optional_parameter, optional_parameter_parsed, dry_run):
68+
deletion_batch_size, folder_mode, status, optional_parameter, optional_parameter_parsed, dry_run):
6769
self.local_dir = local_dir
6870
self.remote_dir = remote_dir.strip('/')
6971
self.user_friendly_remote_dir = self.remote_dir if self.remote_dir else '/'
@@ -100,7 +102,7 @@ def __init__(self, local_dir, remote_dir, include_hidden, concurrent_workers, fo
100102
logger.info(f"Cloudinary folder '{self.user_friendly_remote_dir}' does not exist "
101103
f"({self.folder_mode} folder mode).")
102104
else:
103-
raw_remote_files = query_cld_folder(self.remote_dir, self.folder_mode)
105+
raw_remote_files = query_cld_folder(self.remote_dir, self.folder_mode, status)
104106
if len(raw_remote_files):
105107
logger.info(
106108
f"Found {len(raw_remote_files)} items in Cloudinary folder '{self.user_friendly_remote_dir}' "

Diff for: cloudinary_cli/utils/api_utils.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,22 @@
2121
_cursor_fields = {"resource": "derived_next_cursor"}
2222

2323

24-
def query_cld_folder(folder, folder_mode):
24+
def query_cld_folder(folder, folder_mode, status=None):
2525
files = {}
2626

2727
folder = folder.strip('/') # omit redundant leading slash and duplicate trailing slashes in query
2828
folder_key = "asset_folder" if folder_mode == "dynamic" else "folder"
2929
folder_query = f"{folder}/*" if folder else "*"
30+
status_value = "(active OR pending)" if status == "all" else status
31+
status_query = f" AND status:{status_value}" if status_value else ""
3032

31-
expression = Search().expression(f"{folder_key}:\"{folder_query}\"").with_field("image_analysis").max_results(500)
33+
search = Search().expression(f"{folder_key}:\"{folder_query}\"{status_query}").with_field("image_analysis").max_results(500)
34+
35+
logger.debug(f"Search expression: {search.to_json()}")
3236

3337
next_cursor = True
3438
while next_cursor:
35-
res = expression.execute()
39+
res = search.execute()
3640

3741
for asset in res['resources']:
3842
rel_path = _relative_path(asset, folder)
@@ -58,7 +62,7 @@ def query_cld_folder(folder, folder_mode):
5862
}
5963
# use := when switch to python 3.8
6064
next_cursor = res.get('next_cursor')
61-
expression.next_cursor(next_cursor)
65+
search.next_cursor(next_cursor)
6266

6367
return files
6468

0 commit comments

Comments
 (0)