@@ -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
90147def __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
192209def create_empty_annotation (size , image_name ):
0 commit comments