Skip to content

Commit 0594bab

Browse files
committed
deleted delete_images, assign_images(unassign)
1 parent 167b043 commit 0594bab

File tree

13 files changed

+8
-396
lines changed

13 files changed

+8
-396
lines changed

docs/source/superannotate.sdk.rst

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ ______
9595
.. automethod:: superannotate.SAClient.upload_image_annotations
9696
.. automethod:: superannotate.SAClient.copy_image
9797
.. automethod:: superannotate.SAClient.pin_image
98-
.. automethod:: superannotate.SAClient.assign_images
99-
.. automethod:: superannotate.SAClient.delete_images
10098
.. automethod:: superannotate.SAClient.add_annotation_bbox_to_image
10199
.. automethod:: superannotate.SAClient.add_annotation_point_to_image
102100
.. automethod:: superannotate.SAClient.add_annotation_comment_to_image

pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
minversion = 3.7
33
log_cli=true
44
python_files = test_*.py
5-
;addopts = -n auto --dist=loadscope
5+
addopts = -n auto --dist=loadscope

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -630,39 +630,6 @@ def pin_image(
630630
is_pinned=int(pin),
631631
)
632632

633-
def delete_images(
634-
self, project: Union[NotEmptyStr, dict], image_names: Optional[List[str]] = None
635-
):
636-
"""Delete Images in project.
637-
638-
:param project: project name or folder path (e.g., "project1/folder1")
639-
:type project: str
640-
:param image_names: to be deleted images' names. If None, all the images will be deleted
641-
:type image_names: list of strs
642-
"""
643-
644-
warning_msg = (
645-
"We're deprecating the delete_images function. Please use delete_items instead."
646-
"Learn more. \n"
647-
"https://superannotate.readthedocs.io/en/stable/superannotate.sdk.html#superannotate.delete_items"
648-
)
649-
logger.warning(warning_msg)
650-
warnings.warn(warning_msg, DeprecationWarning)
651-
project_name, folder_name = extract_project_folder(project)
652-
653-
if not isinstance(image_names, list) and image_names is not None:
654-
raise AppException("image_names should be a list of str or None.")
655-
656-
response = self.controller.delete_images(
657-
project_name=project_name, folder_name=folder_name, image_names=image_names
658-
)
659-
if response.errors:
660-
raise AppException(response.errors)
661-
662-
logger.info(
663-
f"Images deleted in project {project_name}{'/' + folder_name if folder_name else ''}"
664-
)
665-
666633
def delete_items(self, project: str, items: Optional[List[str]] = None):
667634
"""Delete items in a given project.
668635
@@ -724,91 +691,6 @@ def unassign_items(
724691
if response.errors:
725692
raise AppException(response.errors)
726693

727-
def assign_images(
728-
self, project: Union[NotEmptyStr, dict], image_names: List[str], user: str
729-
):
730-
"""Assigns images to a user. The assignment role, QA or Annotator, will
731-
be deduced from the user's role in the project. With SDK, the user can be
732-
assigned to a role in the project with the share_project function.
733-
734-
:param project: project name or folder path (e.g., "project1/folder1")
735-
:type project: str
736-
:param image_names: list of image names to assign
737-
:type image_names: list of str
738-
:param user: user email
739-
:type user: str
740-
"""
741-
742-
warning_msg = (
743-
"We're deprecating the assign_images function. Please use assign_items instead."
744-
"Learn more. \n"
745-
"https://superannotate.readthedocs.io/en/stable/superannotate.sdk.html#superannotate.assign_items"
746-
)
747-
logger.warning(warning_msg)
748-
warnings.warn(warning_msg, DeprecationWarning)
749-
project_name, folder_name = extract_project_folder(project)
750-
project = self.controller.get_project_metadata(project_name).data
751-
752-
if project["project"].type in [
753-
constants.ProjectType.VIDEO.value,
754-
constants.ProjectType.DOCUMENT.value,
755-
]:
756-
raise AppException(LIMITED_FUNCTIONS[project["project"].type])
757-
758-
contributors = (
759-
self.controller.get_project_metadata(
760-
project_name=project_name, include_contributors=True
761-
)
762-
.data["project"]
763-
.users
764-
)
765-
contributor = None
766-
for c in contributors:
767-
if c["user_id"] == user:
768-
contributor = user
769-
770-
if not contributor:
771-
logger.warning(
772-
f"Skipping {user}. {user} is not a verified contributor for the {project_name}"
773-
)
774-
return
775-
776-
response = self.controller.assign_images(
777-
project_name, folder_name, image_names, user
778-
)
779-
if not response.errors:
780-
logger.info(f"Assign images to user {user}")
781-
else:
782-
raise AppException(response.errors)
783-
784-
def unassign_images(
785-
self, project: Union[NotEmptyStr, dict], image_names: List[NotEmptyStr]
786-
):
787-
"""Removes assignment of given images for all assignees. With SDK,
788-
the user can be assigned to a role in the project with the share_project
789-
function.
790-
791-
:param project: project name or folder path (e.g., "project1/folder1")
792-
:type project: str
793-
:param image_names: list of images to unassign
794-
:type image_names: list of str
795-
"""
796-
797-
warning_msg = (
798-
"We're deprecating the unassign_images function. Please use unassign_items instead."
799-
"Learn more. \n"
800-
"https://superannotate.readthedocs.io/en/stable/superannotate.sdk.html#superannotate.unassign_items"
801-
)
802-
logger.warning(warning_msg)
803-
warnings.warn(warning_msg, DeprecationWarning)
804-
project_name, folder_name = extract_project_folder(project)
805-
806-
response = self.controller.un_assign_images(
807-
project_name=project_name, folder_name=folder_name, image_names=image_names
808-
)
809-
if response.errors:
810-
raise AppException(response.errors)
811-
812694
def unassign_folder(self, project_name: NotEmptyStr, folder_name: NotEmptyStr):
813695
"""Removes assignment of given folder for all assignees.
814696
With SDK, the user can be assigned to a role in the project

src/superannotate/lib/core/serviceproviders.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -162,22 +162,9 @@ def set_images_statuses_bulk(
162162
):
163163
raise NotImplementedError
164164

165-
def delete_images(self, project_id: int, team_id: int, image_ids: List[int]):
166-
raise NotImplementedError
167-
168165
def delete_items(self, project_id: int, team_id: int, item_ids: List[int]):
169166
raise NotImplementedError
170167

171-
def assign_images(
172-
self,
173-
team_id: int,
174-
project_id: int,
175-
folder_name: str,
176-
user: str,
177-
image_names: list,
178-
):
179-
raise NotImplementedError
180-
181168
def assign_items(
182169
self,
183170
team_id: int,
@@ -206,15 +193,6 @@ def assign_folder(
206193
):
207194
raise NotImplementedError
208195

209-
def un_assign_images(
210-
self,
211-
team_id: int,
212-
project_id: int,
213-
folder_name: str,
214-
image_names: list,
215-
):
216-
raise NotImplementedError
217-
218196
def un_assign_items(
219197
self,
220198
team_id: int,

src/superannotate/lib/core/usecases/images.py

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -1665,62 +1665,6 @@ def execute(self) -> Response:
16651665
return self._response
16661666

16671667

1668-
class DeleteImagesUseCase(BaseUseCase):
1669-
CHUNK_SIZE = 1000
1670-
1671-
def __init__(
1672-
self,
1673-
project: ProjectEntity,
1674-
folder: FolderEntity,
1675-
backend_service_provider: SuperannotateServiceProvider,
1676-
images: BaseReadOnlyRepository,
1677-
image_names: List[str] = None,
1678-
):
1679-
super().__init__()
1680-
self._project = project
1681-
self._folder = folder
1682-
self._images = images
1683-
self._backend_service = backend_service_provider
1684-
self._image_names = image_names
1685-
1686-
def validate_project_type(self):
1687-
if self._project.type in constances.LIMITED_FUNCTIONS:
1688-
raise AppValidationException(
1689-
constances.LIMITED_FUNCTIONS[self._project.type]
1690-
)
1691-
1692-
def execute(self):
1693-
if self.is_valid():
1694-
if self._image_names:
1695-
image_ids = [
1696-
image.uuid
1697-
for image in GetBulkImages(
1698-
service=self._backend_service,
1699-
project_id=self._project.id,
1700-
team_id=self._project.team_id,
1701-
folder_id=self._folder.uuid,
1702-
images=self._image_names,
1703-
)
1704-
.execute()
1705-
.data
1706-
]
1707-
else:
1708-
condition = (
1709-
Condition("team_id", self._project.team_id, EQ)
1710-
& Condition("project_id", self._project.id, EQ)
1711-
& Condition("folder_id", self._folder.uuid, EQ)
1712-
)
1713-
image_ids = [image.uuid for image in self._images.get_all(condition)]
1714-
1715-
for i in range(0, len(image_ids), self.CHUNK_SIZE):
1716-
self._backend_service.delete_images(
1717-
project_id=self._project.id,
1718-
team_id=self._project.team_id,
1719-
image_ids=image_ids[i : i + self.CHUNK_SIZE], # noqa: E203
1720-
)
1721-
return self._response
1722-
1723-
17241668
class DownloadImageAnnotationsUseCase(BaseUseCase):
17251669
def __init__(
17261670
self,
@@ -1963,83 +1907,6 @@ def execute(self):
19631907
return self._response
19641908

19651909

1966-
class AssignImagesUseCase(BaseUseCase):
1967-
CHUNK_SIZE = 500
1968-
1969-
def __init__(
1970-
self,
1971-
service: SuperannotateServiceProvider,
1972-
project: ProjectEntity,
1973-
folder: FolderEntity,
1974-
image_names: list,
1975-
user: str,
1976-
):
1977-
super().__init__()
1978-
self._project = project
1979-
self._folder = folder
1980-
self._image_names = image_names
1981-
self._user = user
1982-
self._service = service
1983-
1984-
def validate_project_type(self):
1985-
if self._project.type in constances.LIMITED_FUNCTIONS:
1986-
raise AppValidationException(
1987-
constances.LIMITED_FUNCTIONS[self._project.type]
1988-
)
1989-
1990-
def execute(self):
1991-
if self.is_valid():
1992-
for i in range(0, len(self._image_names), self.CHUNK_SIZE):
1993-
is_assigned = self._service.assign_images(
1994-
team_id=self._project.team_id,
1995-
project_id=self._project.id,
1996-
folder_name=self._folder.name,
1997-
user=self._user,
1998-
image_names=self._image_names[
1999-
i : i + self.CHUNK_SIZE # noqa: E203
2000-
],
2001-
)
2002-
if not is_assigned:
2003-
self._response.errors = AppException(
2004-
f"Cant assign {', '.join(self._image_names[i: i + self.CHUNK_SIZE])}"
2005-
)
2006-
continue
2007-
return self._response
2008-
2009-
2010-
class UnAssignImagesUseCase(BaseUseCase):
2011-
CHUNK_SIZE = 500
2012-
2013-
def __init__(
2014-
self,
2015-
service: SuperannotateServiceProvider,
2016-
project_entity: ProjectEntity,
2017-
folder: FolderEntity,
2018-
image_names: list,
2019-
):
2020-
super().__init__()
2021-
self._project_entity = project_entity
2022-
self._folder = folder
2023-
self._image_names = image_names
2024-
self._service = service
2025-
2026-
def execute(self):
2027-
# todo handling to backend side
2028-
for i in range(0, len(self._image_names), self.CHUNK_SIZE):
2029-
is_un_assigned = self._service.un_assign_images(
2030-
team_id=self._project_entity.team_id,
2031-
project_id=self._project_entity.id,
2032-
folder_name=self._folder.name,
2033-
image_names=self._image_names[i : i + self.CHUNK_SIZE], # noqa: E203
2034-
)
2035-
if not is_un_assigned:
2036-
self._response.errors = AppException(
2037-
f"Cant un assign {', '.join(self._image_names[i: i + self.CHUNK_SIZE])}"
2038-
)
2039-
2040-
return self._response
2041-
2042-
20431910
class UnAssignFolderUseCase(BaseUseCase):
20441911
def __init__(
20451912
self,

src/superannotate/lib/infrastructure/controller.py

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -795,24 +795,6 @@ def set_project_settings(self, project_name: str, new_settings: List[dict]):
795795
)
796796
return use_case.execute()
797797

798-
def delete_images(
799-
self,
800-
project_name: str,
801-
folder_name: str,
802-
image_names: List[str] = None,
803-
):
804-
project = self._get_project(project_name)
805-
folder = self._get_folder(project, folder_name)
806-
807-
use_case = usecases.DeleteImagesUseCase(
808-
project=project,
809-
folder=folder,
810-
images=self.images,
811-
image_names=image_names,
812-
backend_service_provider=self._backend_client,
813-
)
814-
return use_case.execute()
815-
816798
def delete_items(
817799
self,
818800
project_name: str,
@@ -858,31 +840,6 @@ def un_assign_items(self, project_name, folder_name, item_names):
858840
)
859841
return use_case.execute()
860842

861-
def assign_images(
862-
self, project_name: str, folder_name: str, image_names: list, user: str
863-
):
864-
project_entity = self._get_project(project_name)
865-
folder = self._get_folder(project_entity, folder_name)
866-
use_case = usecases.AssignImagesUseCase(
867-
project=project_entity,
868-
service=self._backend_client,
869-
folder=folder,
870-
image_names=image_names,
871-
user=user,
872-
)
873-
return use_case.execute()
874-
875-
def un_assign_images(self, project_name, folder_name, image_names):
876-
project = self._get_project(project_name)
877-
folder = self._get_folder(project, folder_name)
878-
use_case = usecases.UnAssignImagesUseCase(
879-
project_entity=project,
880-
service=self._backend_client,
881-
folder=folder,
882-
image_names=image_names,
883-
)
884-
return use_case.execute()
885-
886843
def un_assign_folder(self, project_name: str, folder_name: str):
887844
project_entity = self._get_project(project_name)
888845
folder = self._get_folder(project_entity, folder_name)

0 commit comments

Comments
 (0)