Skip to content

Commit 0a4639a

Browse files
committed
Add delete images function
1 parent 44390ab commit 0a4639a

File tree

4 files changed

+74
-20
lines changed

4 files changed

+74
-20
lines changed

docs/source/superannotate.sdk.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ ______
8787
.. autofunction:: superannotate.pin_image
8888
.. autofunction:: superannotate.assign_images
8989
.. autofunction:: superannotate.delete_image
90+
.. autofunction:: superannotate.delete_images
9091
.. autofunction:: superannotate.add_annotation_bbox_to_image
9192
.. autofunction:: superannotate.add_annotation_polygon_to_image
9293
.. autofunction:: superannotate.add_annotation_polyline_to_image

superannotate/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ def consensus(*args, **kwargs):
4747
add_annotation_cuboid_to_image, add_annotation_ellipse_to_image,
4848
add_annotation_point_to_image, add_annotation_polygon_to_image,
4949
add_annotation_polyline_to_image, add_annotation_template_to_image,
50-
create_fuse_image, delete_image, download_image, download_image_annotations,
51-
download_image_preannotations, get_image_annotations, get_image_bytes,
52-
get_image_metadata, get_image_preannotations, search_images,
53-
set_image_annotation_status, upload_image_annotations
50+
create_fuse_image, delete_image, delete_images, download_image,
51+
download_image_annotations, download_image_preannotations,
52+
get_image_annotations, get_image_bytes, get_image_metadata,
53+
get_image_preannotations, search_images, set_image_annotation_status,
54+
upload_image_annotations
5455
)
5556
from .db.project_api import (
5657
create_folder, delete_folders, get_folder_metadata,

superannotate/db/images.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,34 @@ def delete_image(project, image_name):
587587
logger.info("Successfully deleted image %s.", image_name)
588588

589589

590+
def delete_images(project, image_names):
591+
"""Delete images in project.
592+
593+
:param project: project name or metadata of the project to be deleted
594+
:type project: str or dict
595+
:param folder_names: to be deleted folders' names
596+
:type folder_names: str or list of strs
597+
"""
598+
if not isinstance(image_names, list):
599+
raise SABaseException(0, "image_names should be a list of strs")
600+
images = get_image_metadata(project, image_names)
601+
project, _ = get_project_and_folder_metadata(project)
602+
603+
params = {"team_id": project["team_id"], "project_id": project["id"]}
604+
data = {"image_ids": [image["id"] for image in images]}
605+
response = _api.send_request(
606+
req_type='PUT',
607+
path='/image/delete/images',
608+
params=params,
609+
json_req=data
610+
)
611+
if not response.ok:
612+
raise SABaseException(
613+
response.status_code, "Couldn't delete images " + response.text
614+
)
615+
logger.info("Images %s deleted in project %s", image_names, project["name"])
616+
617+
590618
def get_image_bytes(project, image_name, variant='original'):
591619
"""Returns an io.BytesIO() object of the image. Suitable for creating
592620
PIL.Image out of it.

tests/test_folders.py

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,18 @@
44
import superannotate as sa
55
from superannotate.exceptions import SABaseException
66

7-
PROJECT_NAME1 = "test folder simple"
8-
PROJECT_NAME2 = "test folder annotations"
9-
PROJECT_NAME3 = "test folder deletes"
10-
PROJECT_NAME4 = "test folder image count"
11-
127
FROM_FOLDER = Path("./tests/sample_project_vector")
138

149

1510
def test_basic_folders(tmpdir):
11+
PROJECT_NAME = "test folder simple"
1612
tmpdir = Path(tmpdir)
1713

18-
projects_found = sa.search_projects(PROJECT_NAME1, return_metadata=True)
14+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
1915
for pr in projects_found:
2016
sa.delete_project(pr)
2117

22-
project = sa.create_project(PROJECT_NAME1, 'test', 'Vector')
18+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
2319
project = project["name"]
2420
sa.upload_images_from_folder_to_project(
2521
project, FROM_FOLDER, annotation_status="InProgress"
@@ -94,13 +90,14 @@ def test_basic_folders(tmpdir):
9490

9591

9692
def test_folder_annotations(tmpdir):
93+
PROJECT_NAME = "test folder annotations"
9794
tmpdir = Path(tmpdir)
9895

99-
projects_found = sa.search_projects(PROJECT_NAME2, return_metadata=True)
96+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
10097
for pr in projects_found:
10198
sa.delete_project(pr)
10299

103-
project = sa.create_project(PROJECT_NAME2, 'test', 'Vector')
100+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
104101
project = project["name"]
105102
sa.upload_images_from_folder_to_project(
106103
project, FROM_FOLDER, annotation_status="InProgress"
@@ -132,13 +129,15 @@ def test_folder_annotations(tmpdir):
132129

133130

134131
def test_delete_folders(tmpdir):
132+
PROJECT_NAME = "test folder deletes"
133+
135134
tmpdir = Path(tmpdir)
136135

137-
projects_found = sa.search_projects(PROJECT_NAME3, return_metadata=True)
136+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
138137
for pr in projects_found:
139138
sa.delete_project(pr)
140139

141-
project = sa.create_project(PROJECT_NAME3, 'test', 'Vector')
140+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
142141
sa.create_folder(project, "folder1")
143142
sa.create_folder(project, "folder2")
144143
sa.create_folder(project, "folder3")
@@ -160,13 +159,14 @@ def test_delete_folders(tmpdir):
160159

161160

162161
def test_rename_folder(tmpdir):
162+
PROJECT_NAME = "test folder image count"
163163
tmpdir = Path(tmpdir)
164164

165-
projects_found = sa.search_projects(PROJECT_NAME3, return_metadata=True)
165+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
166166
for pr in projects_found:
167167
sa.delete_project(pr)
168168

169-
project = sa.create_project(PROJECT_NAME3, 'test', 'Vector')
169+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
170170
sa.create_folder(project, "folder1")
171171
sa.create_folder(project, "folder2")
172172
sa.create_folder(project, "folder3")
@@ -184,13 +184,14 @@ def test_rename_folder(tmpdir):
184184

185185

186186
def test_project_folder_image_count(tmpdir):
187+
PROJECT_NAME = "test folder image count"
187188
tmpdir = Path(tmpdir)
188189

189-
projects_found = sa.search_projects(PROJECT_NAME4, return_metadata=True)
190+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
190191
for pr in projects_found:
191192
sa.delete_project(pr)
192193

193-
project = sa.create_project(PROJECT_NAME4, 'test', 'Vector')
194+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
194195
project = project["name"]
195196
sa.upload_images_from_folder_to_project(
196197
project, FROM_FOLDER, annotation_status="InProgress"
@@ -207,4 +208,27 @@ def test_project_folder_image_count(tmpdir):
207208
assert num_images == 4
208209

209210
num_images = sa.get_project_image_count(project + "/folder1")
210-
assert num_images == 4
211+
assert num_images == 4
212+
213+
214+
def test_delete_images(tmpdir):
215+
PROJECT_NAME = "test delete folder images"
216+
tmpdir = Path(tmpdir)
217+
218+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
219+
for pr in projects_found:
220+
sa.delete_project(pr)
221+
222+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
223+
sa.create_folder(project, "folder1")
224+
project = project["name"] + "/folder1"
225+
sa.upload_images_from_folder_to_project(
226+
project, FROM_FOLDER, annotation_status="InProgress"
227+
)
228+
num_images = sa.get_project_image_count(project)
229+
assert num_images == 4
230+
231+
sa.delete_images(project, ["example_image_2.jpg", "example_image_3.jpg"])
232+
233+
num_images = sa.get_project_image_count(project)
234+
assert num_images == 2

0 commit comments

Comments
 (0)