Skip to content

Commit 37a7c07

Browse files
committed
Set images annotation statuses
1 parent be8fbad commit 37a7c07

File tree

5 files changed

+91
-30
lines changed

5 files changed

+91
-30
lines changed

docs/source/superannotate.sdk.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ ______
7777
.. autofunction:: superannotate.get_image_bytes
7878
.. autofunction:: superannotate.download_image
7979
.. autofunction:: superannotate.set_image_annotation_status
80+
.. autofunction:: superannotate.set_images_annotation_statuses
8081
.. autofunction:: superannotate.get_image_annotations
8182
.. autofunction:: superannotate.get_image_preannotations
8283
.. autofunction:: superannotate.download_image_annotations

superannotate/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ def consensus(*args, **kwargs):
5454
)
5555
from .db.project_api import (
5656
create_folder, delete_folders, get_folder_metadata,
57-
get_project_and_folder_metadata, rename_folder, search_folders
57+
get_project_and_folder_metadata, rename_folder, search_folders,
58+
set_images_annotation_statuses
5859
)
5960
from .db.project_images import (
6061
assign_images, copy_image, copy_images, delete_images, move_image,

superannotate/db/project_api.py

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,35 @@ def get_folder_metadata(project, folder_name):
8282
return res
8383

8484

85+
def get_project_and_folder_metadata(project):
86+
if isinstance(project, dict):
87+
project = project
88+
folder = None
89+
elif isinstance(project, tuple):
90+
if len(project) != 2:
91+
raise SAIncorrectProjectArgument(project)
92+
project, folder = project
93+
if not isinstance(project, dict):
94+
raise SAIncorrectProjectArgument(project)
95+
if folder is not None and not isinstance(project, dict):
96+
raise SAIncorrectProjectArgument(project)
97+
elif isinstance(project, str):
98+
parts = project.split('/')
99+
if len(parts) == 1:
100+
project_name = parts[0]
101+
project = get_project_metadata_bare(project_name)
102+
folder = None
103+
elif len(parts) == 2:
104+
project_name, folder_name = parts
105+
project = get_project_metadata_bare(project_name)
106+
folder = get_folder_metadata(project, folder_name)
107+
else:
108+
raise SAIncorrectProjectArgument(project)
109+
else:
110+
raise SAIncorrectProjectArgument(project)
111+
return project, folder
112+
113+
85114
def search_folders(project, folder_name=None, return_metadata=False):
86115
if not isinstance(project, dict):
87116
project = get_project_metadata_bare(project)
@@ -213,30 +242,27 @@ def rename_folder(project, new_folder_name):
213242
)
214243

215244

216-
def get_project_and_folder_metadata(project):
217-
if isinstance(project, dict):
218-
project = project
219-
folder = None
220-
elif isinstance(project, tuple):
221-
if len(project) != 2:
222-
raise SAIncorrectProjectArgument(project)
223-
project, folder = project
224-
if not isinstance(project, dict):
225-
raise SAIncorrectProjectArgument(project)
226-
if folder is not None and not isinstance(project, dict):
227-
raise SAIncorrectProjectArgument(project)
228-
elif isinstance(project, str):
229-
parts = project.split('/')
230-
if len(parts) == 1:
231-
project_name = parts[0]
232-
project = get_project_metadata_bare(project_name)
233-
folder = None
234-
elif len(parts) == 2:
235-
project_name, folder_name = parts
236-
project = get_project_metadata_bare(project_name)
237-
folder = get_folder_metadata(project, folder_name)
238-
else:
239-
raise SAIncorrectProjectArgument(project)
240-
else:
241-
raise SAIncorrectProjectArgument(project)
242-
return project, folder
245+
def set_images_annotation_statuses(project, image_names, annotation_status):
246+
NUM_TO_SEND = 500
247+
project, project_folder = get_project_and_folder_metadata(project)
248+
params = {"team_id": project["team_id"], "project_id": project["id"]}
249+
annotation_status = common.annotation_status_str_to_int(annotation_status)
250+
data = {
251+
"annotation_status": annotation_status,
252+
"folder_id": project_folder["id"]
253+
}
254+
for start_index in range(0, len(image_names), NUM_TO_SEND):
255+
end_index = min(start_index + NUM_TO_SEND, len(image_names))
256+
data["image_names"] = image_names[start_index:end_index]
257+
response = _api.send_request(
258+
req_type='PUT',
259+
path=f'/image/updateAnnotationStatusBulk',
260+
params=params,
261+
json_req=data
262+
)
263+
if not response.ok:
264+
raise SABaseException(
265+
response.status_code,
266+
"Couldn't change annotation statuses " + response.text
267+
)
268+
logger.info("Annotations status changed")

superannotate/db/projects.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import logging
66
import math
77
import os
8-
import random
98
import tempfile
109
import threading
1110
import time

tests/test_folders.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,4 +458,38 @@ def test_folder_export(tmpdir):
458458

459459
assert len(list((tmpdir / "folder2").rglob("*"))) == 2
460460

461-
assert len(list((tmpdir).glob("*.*"))) == 4
461+
assert len(list((tmpdir).glob("*.*"))) == 4
462+
463+
464+
def test_folder_image_annotation_status(tmpdir):
465+
PROJECT_NAME = "test folder set annotation status"
466+
tmpdir = Path(tmpdir)
467+
468+
projects_found = sa.search_projects(PROJECT_NAME, return_metadata=True)
469+
for pr in projects_found:
470+
sa.delete_project(pr)
471+
472+
project = sa.create_project(PROJECT_NAME, 'test', 'Vector')
473+
sa.create_annotation_classes_from_classes_json(
474+
project, FROM_FOLDER / "classes" / "classes.json"
475+
)
476+
sa.upload_images_from_folder_to_project(
477+
project, FROM_FOLDER, annotation_status="InProgress"
478+
)
479+
sa.create_folder(project, "folder1")
480+
project = PROJECT_NAME + "/folder1"
481+
sa.upload_images_from_folder_to_project(
482+
project, FROM_FOLDER, annotation_status="InProgress"
483+
)
484+
485+
sa.set_images_annotation_statuses(
486+
project, ["example_image_1.jpg", "example_image_2.jpg"], "QualityCheck"
487+
)
488+
489+
for image in ["example_image_1.jpg", "example_image_2.jpg"]:
490+
metadata = sa.get_image_metadata(project, image)
491+
assert metadata["annotation_status"] == "QualityCheck"
492+
493+
for image in ["example_image_3.jpg", "example_image_3.jpg"]:
494+
metadata = sa.get_image_metadata(project, image)
495+
assert metadata["annotation_status"] == "InProgress"

0 commit comments

Comments
 (0)