Skip to content

Commit fa4fc7b

Browse files
committed
Fix copy-move
1 parent 6b28cbd commit fa4fc7b

File tree

2 files changed

+85
-64
lines changed

2 files changed

+85
-64
lines changed

superannotate/db/project_images.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,14 @@ def copy_images(
237237
if image_names == None:
238238
image_names = search_images(source_project_inp)
239239

240-
done_count, skipped_count, total_skipped_list = __copy_images(
240+
done_count, total_skipped_list, logs = __copy_images(
241241
source_project, source_folder_id, destination_folder_id, image_names,
242242
include_annotations, copy_pin
243243
)
244+
for log in logs:
245+
logger.info(log)
244246

245-
if done_count > 1:
247+
if done_count > 1 or done_count == 0:
246248
message = f"Copied {done_count}/{len(image_names)} images from {get_project_folder_string(source_project_inp)} to {get_project_folder_string(destination_project_inp)}."
247249
logger.info(message)
248250

@@ -349,14 +351,16 @@ def move_images(
349351
if image_names == None:
350352
image_names = search_images(source_project_inp)
351353

352-
moved, skipped = __move_images(
354+
moved, skipped, logs = __move_images(
353355
source_project, source_folder_id, destination_folder_id, image_names
354356
)
355357

356-
if len(moved) > 1:
358+
for log in logs:
359+
logger.info(log)
360+
361+
if len(moved) > 1 or len(moved) == 0:
357362
message = f"Moved {len(moved)}/{len(image_names)} images from {get_project_folder_string(source_project_inp)} to {get_project_folder_string(destination_project_inp)}."
358363
logger.info(message)
359-
360364
elif len(moved) == 1:
361365
message = f"Moved an image from {get_project_folder_string(source_project_inp)} to {get_project_folder_string(destination_project_inp)}."
362366
logger.info(message)

superannotate/db/utils.py

Lines changed: 76 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def __move_images(
6060
image_names_lists = divide_chunks(image_names, 1000)
6161
total_skipped = []
6262
total_moved = []
63+
logs = []
6364

6465
for image_names in image_names_lists:
6566
response = _api.send_request(
@@ -77,14 +78,70 @@ def __move_images(
7778
)
7879

7980
if not response.ok:
80-
raise SABaseException(
81-
response.status_code, "Couldn't move images " + response.text
82-
)
81+
logs.append("Couldn't move images " + response.text)
82+
total_skipped += image_names
83+
continue
8384
res = response.json()
8485
total_moved += res['done']
8586

8687
total_skipped = list(set(image_names) - set(total_moved))
87-
return (total_moved, total_skipped)
88+
return (total_moved, total_skipped, logs)
89+
90+
91+
def _copy_images_request(
92+
team_id, project_id, image_names, destination_folder_id, source_folder_id,
93+
include_annotations, copy_pin
94+
):
95+
response = _api.send_request(
96+
req_type='POST',
97+
path='/images/copy-image-or-folders',
98+
params={
99+
"team_id": team_id,
100+
"project_id": project_id
101+
},
102+
json_req={
103+
"is_folder_copy": False,
104+
"image_names": image_names,
105+
"destination_folder_id": destination_folder_id,
106+
"source_folder_id": source_folder_id,
107+
"include_annotations": include_annotations,
108+
"keep_pin_status": copy_pin
109+
}
110+
)
111+
return response
112+
113+
114+
def copy_polling(image_names, source_project, poll_id):
115+
done_count = 0
116+
skipped_count = 0
117+
now_timestamp = datetime.datetime.now().timestamp()
118+
delta_seconds = len(image_names) * 0.3
119+
max_timestamp = now_timestamp + delta_seconds
120+
logs = []
121+
while True:
122+
time.sleep(4)
123+
now_timestamp = datetime.datetime.now().timestamp()
124+
if (now_timestamp > max_timestamp):
125+
break
126+
response = _api.send_request(
127+
req_type='GET',
128+
path='/images/copy-image-progress',
129+
params={
130+
"team_id": source_project["team_id"],
131+
"project_id": source_project["id"],
132+
"poll_id": poll_id
133+
}
134+
)
135+
if not response.ok:
136+
logs.append("Couldn't copy images " + response.text)
137+
continue
138+
res = response.json()
139+
done_count = int(res['done'])
140+
skipped_count = int(res['skipped'])
141+
total_count = int(res['total_count'])
142+
if (skipped_count + done_count == total_count):
143+
break
144+
return (skipped_count, done_count, logs)
88145

89146

90147
def __copy_images(
@@ -115,78 +172,38 @@ def __copy_images(
115172
total_done_count = 0
116173
total_skipped_list = []
117174

118-
for image_names in image_names_lists:
175+
logs = []
119176

177+
for image_names in image_names_lists:
120178
duplicates = get_duplicate_image_names(
121179
project_id=project_id,
122180
team_id=team_id,
123181
folder_id=destination_folder_id,
124182
image_paths=image_names
125183
)
126-
127184
total_skipped_list += duplicates
128-
129185
image_names = list(set(image_names) - set(duplicates))
130-
131186
if not image_names:
132-
total_skipped_count = len(total_skipped_list)
133-
return (total_done_count, total_skipped_count, total_skipped_list)
187+
continue
134188

135-
response = _api.send_request(
136-
req_type='POST',
137-
path='/images/copy-image-or-folders',
138-
params={
139-
"team_id": team_id,
140-
"project_id": project_id
141-
},
142-
json_req={
143-
"is_folder_copy": False,
144-
"image_names": image_names,
145-
"destination_folder_id": destination_folder_id,
146-
"source_folder_id": source_folder_id,
147-
"include_annotations": include_annotations,
148-
"keep_pin_status": copy_pin
149-
}
189+
response = _copy_images_request(
190+
team_id, project_id, image_names, destination_folder_id,
191+
source_folder_id, include_annotations, copy_pin
150192
)
151-
152193
if not response.ok:
153-
raise SABaseException(
154-
response.status_code, "Couldn't copy images " + response.text
155-
)
194+
logs.append("Couldn't copy images " + response.text)
195+
total_skipped_list += image_names
196+
continue
197+
156198
res = response.json()
157199
poll_id = res['poll_id']
158-
done_count = 0
159-
skipped_count = 0
160-
now_timestamp = datetime.datetime.now().timestamp()
161-
delta_seconds = len(image_names) * 0.3
162-
max_timestamp = now_timestamp + delta_seconds
163-
while True:
164-
time.sleep(4)
165-
response = _api.send_request(
166-
req_type='GET',
167-
path='/images/copy-image-progress',
168-
params={
169-
"team_id": source_project["team_id"],
170-
"project_id": source_project["id"],
171-
"poll_id": poll_id
172-
}
173-
)
174-
if not response.ok:
175-
raise SABaseException(
176-
response.status_code,
177-
"Couldn't copy images " + response.text
178-
)
179-
res = response.json()
180-
done_count = int(res['done'])
181-
skipped_count = int(res['skipped'])
182-
total_count = int(res['total_count'])
183-
now_timestamp = datetime.datetime.now().timestamp()
184-
if (skipped_count + done_count
185-
== total_count) or (now_timestamp > max_timestamp):
186-
break
200+
skipped_count, done_count, polling_logs = copy_polling(
201+
image_names, source_project, poll_id
202+
)
203+
logs += polling_logs
187204
total_skipped_count += skipped_count
188205
total_done_count += done_count
189-
return (total_done_count, total_skipped_count, total_skipped_list)
206+
return (total_done_count, total_skipped_list, logs)
190207

191208

192209
def create_empty_annotation(size, image_name):

0 commit comments

Comments
 (0)