@@ -133,20 +133,22 @@ def upload_image_to_project(
133133 break
134134
135135
136- def copy_images (project , source_folder , destination_folder , image_names ):
137- project , source_project_folder = get_project_and_folder_metadata (
138- source_project
139- )
140- destination_project , destination_project_folder = get_project_and_folder_metadata (
141- destination_project
142- )
136+ def _copy_images (source_project , destination_project , image_names = None ):
137+ source_project , source_project_folder = source_project
138+ destination_project , destination_project_folder = destination_project
139+ if source_project ["id" ] != destination_project ["id" ]:
140+ raise SABaseException (
141+ 0 ,
142+ "Source and destination projects should be the same for copy_images"
143+ )
143144 params = {
144- "team_id" : _api . team_id ,
145- "project_id" : img_metadatas [ 0 ][ "project_id " ]
145+ "team_id" : source_project [ " team_id" ] ,
146+ "project_id" : source_project [ "id " ]
146147 }
147148 json_req = {
148- "image_ids" : [x ["id" ] for x in img_metadatas ],
149- "destination_folder_id" : destination_project_folder_id
149+ "image_names" : image_names ,
150+ "destination_folder_id" : destination_project_folder ["id" ],
151+ "source_folder_name" : source_project_folder ["name" ]
150152 }
151153 response = _api .send_request (
152154 req_type = 'POST' , path = '/image/copy' , params = params , json_req = json_req
@@ -156,6 +158,85 @@ def copy_images(project, source_folder, destination_folder, image_names):
156158 response .status_code , "Couldn't copy images " + response .text
157159 )
158160
161+ return response .json ()
162+
163+
164+ def copy_images (source_project , destination_project , image_names = None ):
165+ source_project , source_project_folder = get_project_and_folder_metadata (
166+ source_project
167+ )
168+ destination_project , destination_project_folder = get_project_and_folder_metadata (
169+ destination_project
170+ )
171+ if image_names is None :
172+ image_names = search_images ((source_project , source_project_folder ))
173+ res = _copy_images (
174+ (source_project , source_project_folder ),
175+ (destination_project , destination_project_folder ), image_names
176+ )
177+ logger .info (
178+ "Copied images %s from %s to %s. Number of skipped images %s" ,
179+ image_names ,
180+ source_project ["name" ] + "" if source_project_folder is None else "/" +
181+ source_project_folder ["name" ], destination_project ["name" ] +
182+ "" if destination_project_folder is None else "/" +
183+ destination_project_folder ["name" ], res ["skipped" ]
184+ )
185+ return res ["skipped" ]
186+
187+
188+ def delete_images (project , image_names ):
189+ """Delete images in project.
190+
191+ :param project: project name or metadata of the project to be deleted
192+ :type project: str or dict
193+ :param folder_names: to be deleted folders' names
194+ :type folder_names: str or list of strs
195+ """
196+ if not isinstance (image_names , list ):
197+ raise SABaseException (0 , "image_names should be a list of strs" )
198+ images = get_image_metadata (
199+ project , image_names , return_dict_on_single_output = False
200+ )
201+ project , _ = get_project_and_folder_metadata (project )
202+
203+ params = {"team_id" : project ["team_id" ], "project_id" : project ["id" ]}
204+ data = {"image_ids" : [image ["id" ] for image in images ]}
205+ response = _api .send_request (
206+ req_type = 'PUT' ,
207+ path = '/image/delete/images' ,
208+ params = params ,
209+ json_req = data
210+ )
211+ if not response .ok :
212+ raise SABaseException (
213+ response .status_code , "Couldn't delete images " + response .text
214+ )
215+ logger .info ("Images %s deleted in project %s" , image_names , project ["name" ])
216+
217+
218+ def move_images (source_project , destination_project , image_names = None ):
219+ source_project , source_project_folder = get_project_and_folder_metadata (
220+ source_project
221+ )
222+ destination_project , destination_project_folder = get_project_and_folder_metadata (
223+ destination_project
224+ )
225+ if image_names is None :
226+ image_names = search_images ((source_project , source_project_folder ))
227+ _copy_images (
228+ (source_project , source_project_folder ),
229+ (destination_project , destination_project_folder ), image_names
230+ )
231+ delete_images ((source_project , source_project_folder ), image_names )
232+ logger .info (
233+ "Moved images %s from project %s to project %s" , image_names ,
234+ source_project ["name" ] + "" if source_project_folder is None else "/" +
235+ source_project_folder ["name" ], destination_project ["name" ] +
236+ "" if destination_project_folder is None else "/" +
237+ destination_project_folder ["name" ]
238+ )
239+
159240
160241def copy_image (
161242 source_project ,
0 commit comments