Skip to content

Commit d9dacbf

Browse files
Vaghinak BasentsyanVaghinak Basentsyan
authored andcommitted
Merge remote-tracking branch 'origin/develop' into sdk_copy_iamge
# Conflicts: # src/superannotate/lib/app/interface/sdk_interface.py # src/superannotate/lib/core/usecases/images.py # src/superannotate/lib/infrastructure/controller.py
2 parents efeba55 + 3a4181a commit d9dacbf

File tree

6 files changed

+244
-225
lines changed

6 files changed

+244
-225
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import os
66
import tempfile
77
import time
8-
from collections import namedtuple
98
from pathlib import Path
109
from typing import Iterable
1110
from typing import List
@@ -1732,7 +1731,9 @@ def upload_videos_from_folder_to_project(
17321731
f"{len(duplicates)} already existing images found that won't be uploaded."
17331732
)
17341733
if not images_to_upload:
1735-
logger.warning(f"{len(duplicates)} already existing images found that won't be uploaded.")
1734+
logger.warning(
1735+
f"{len(duplicates)} already existing images found that won't be uploaded."
1736+
)
17361737
continue
17371738
if use_case.is_valid():
17381739
with tqdm(

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

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818

1919
class CreateFolderUseCase(BaseUseCase):
2020
def __init__(
21-
self,
22-
project: ProjectEntity,
23-
folder: FolderEntity,
24-
folders: BaseManageableRepository,
21+
self,
22+
project: ProjectEntity,
23+
folder: FolderEntity,
24+
folders: BaseManageableRepository,
2525
):
2626
super().__init__()
2727
self._project = project
@@ -32,12 +32,12 @@ def validate_folder(self):
3232
if not self._folder.name:
3333
raise AppValidationException("Folder name cannot be empty.")
3434
if (
35-
len(
36-
set(self._folder.name).intersection(
37-
constances.SPECIAL_CHARACTERS_IN_PROJECT_FOLDER_NAMES
38-
)
35+
len(
36+
set(self._folder.name).intersection(
37+
constances.SPECIAL_CHARACTERS_IN_PROJECT_FOLDER_NAMES
3938
)
40-
> 0
39+
)
40+
> 0
4141
):
4242
self._folder.name = "".join(
4343
"_"
@@ -56,14 +56,13 @@ def execute(self):
5656
return self._response
5757

5858

59-
6059
class GetFolderUseCase(BaseUseCase):
6160
def __init__(
62-
self,
63-
project: ProjectEntity,
64-
folders: BaseReadOnlyRepository,
65-
folder_name: str,
66-
team_id: int,
61+
self,
62+
project: ProjectEntity,
63+
folders: BaseReadOnlyRepository,
64+
folder_name: str,
65+
team_id: int,
6766
):
6867
super().__init__()
6968
self._project = project
@@ -73,9 +72,9 @@ def __init__(
7372

7473
def execute(self):
7574
condition = (
76-
Condition("name", self._folder_name, EQ)
77-
& Condition("team_id", self._team_id, EQ)
78-
& Condition("project_id", self._project.uuid, EQ)
75+
Condition("name", self._folder_name, EQ)
76+
& Condition("team_id", self._team_id, EQ)
77+
& Condition("project_id", self._project.uuid, EQ)
7978
)
8079
try:
8180
self._response.data = self._folders.get_one(condition)
@@ -86,12 +85,12 @@ def execute(self):
8685

8786
class SearchFoldersUseCase(BaseUseCase):
8887
def __init__(
89-
self,
90-
project: ProjectEntity,
91-
folders: BaseReadOnlyRepository,
92-
condition: Condition,
93-
folder_name: str = None,
94-
include_users=False,
88+
self,
89+
project: ProjectEntity,
90+
folders: BaseReadOnlyRepository,
91+
condition: Condition,
92+
folder_name: str = None,
93+
include_users=False,
9594
):
9695
super().__init__()
9796
self._project = project
@@ -102,10 +101,10 @@ def __init__(
102101

103102
def execute(self):
104103
condition = (
105-
self._condition
106-
& Condition("project_id", self._project.uuid, EQ)
107-
& Condition("team_id", self._project.team_id, EQ)
108-
& Condition("includeUsers", self._include_users, EQ)
104+
self._condition
105+
& Condition("project_id", self._project.uuid, EQ)
106+
& Condition("team_id", self._project.team_id, EQ)
107+
& Condition("includeUsers", self._include_users, EQ)
109108
)
110109
if self._folder_name:
111110
condition &= Condition("name", self._folder_name, EQ)
@@ -115,10 +114,10 @@ def execute(self):
115114

116115
class DeleteFolderUseCase(BaseUseCase):
117116
def __init__(
118-
self,
119-
project: ProjectEntity,
120-
folders: BaseManageableRepository,
121-
folders_to_delete: List[FolderEntity],
117+
self,
118+
project: ProjectEntity,
119+
folders: BaseManageableRepository,
120+
folders_to_delete: List[FolderEntity],
122121
):
123122
super().__init__()
124123
self._project = project
@@ -137,7 +136,7 @@ def execute(self):
137136

138137
class UpdateFolderUseCase(BaseUseCase):
139138
def __init__(
140-
self, folders: BaseManageableRepository, folder: FolderEntity,
139+
self, folders: BaseManageableRepository, folder: FolderEntity,
141140
):
142141
super().__init__()
143142
self._folders = folders
@@ -147,12 +146,12 @@ def validate_folder(self):
147146
if not self._folder.name:
148147
raise AppValidationException("Folder name cannot be empty.")
149148
if (
150-
len(
151-
set(self._folder.name).intersection(
152-
constances.SPECIAL_CHARACTERS_IN_PROJECT_FOLDER_NAMES
153-
)
149+
len(
150+
set(self._folder.name).intersection(
151+
constances.SPECIAL_CHARACTERS_IN_PROJECT_FOLDER_NAMES
154152
)
155-
> 0
153+
)
154+
> 0
156155
):
157156
self._folder.name = "".join(
158157
"_"
@@ -175,11 +174,11 @@ def execute(self):
175174

176175
class AssignFolderUseCase(BaseUseCase):
177176
def __init__(
178-
self,
179-
service: SuerannotateServiceProvider,
180-
project_entity: ProjectEntity,
181-
folder: FolderEntity,
182-
users: List[str],
177+
self,
178+
service: SuerannotateServiceProvider,
179+
project_entity: ProjectEntity,
180+
folder: FolderEntity,
181+
users: List[str],
183182
):
184183
super().__init__()
185184
self._service = service

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

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@
5252

5353
class GetImagesUseCase(BaseUseCase):
5454
def __init__(
55-
self,
56-
project: ProjectEntity,
57-
folder: FolderEntity,
58-
images: BaseReadOnlyRepository,
59-
annotation_status: str = None,
60-
image_name_prefix: str = None,
55+
self,
56+
project: ProjectEntity,
57+
folder: FolderEntity,
58+
images: BaseReadOnlyRepository,
59+
annotation_status: str = None,
60+
image_name_prefix: str = None,
6161
):
6262
super().__init__()
6363
self._project = project
@@ -74,18 +74,18 @@ def validate_project_type(self):
7474

7575
def validate_annotation_status(self):
7676
if (
77-
self._annotation_status
78-
and self._annotation_status.lower()
79-
not in constances.AnnotationStatus.values()
77+
self._annotation_status
78+
and self._annotation_status.lower()
79+
not in constances.AnnotationStatus.values()
8080
):
8181
raise AppValidationException("Invalid annotations status.")
8282

8383
def execute(self):
8484
if self.is_valid():
8585
condition = (
86-
Condition("team_id", self._project.team_id, EQ)
87-
& Condition("project_id", self._project.uuid, EQ)
88-
& Condition("folder_id", self._folder.uuid, EQ)
86+
Condition("team_id", self._project.team_id, EQ)
87+
& Condition("project_id", self._project.uuid, EQ)
88+
& Condition("folder_id", self._folder.uuid, EQ)
8989
)
9090
if self._image_name_prefix:
9191
condition = condition & Condition("name", self._image_name_prefix, EQ)
@@ -102,12 +102,12 @@ def execute(self):
102102

103103
class GetImageUseCase(BaseUseCase):
104104
def __init__(
105-
self,
106-
project: ProjectEntity,
107-
folder: FolderEntity,
108-
image_name: str,
109-
images: BaseReadOnlyRepository,
110-
service: SuerannotateServiceProvider,
105+
self,
106+
project: ProjectEntity,
107+
folder: FolderEntity,
108+
image_name: str,
109+
images: BaseReadOnlyRepository,
110+
service: SuerannotateServiceProvider,
111111
):
112112
super().__init__()
113113
self._project = project
@@ -137,11 +137,11 @@ def execute(self):
137137

138138
class GetAllImagesUseCase(BaseUseCase):
139139
def __init__(
140-
self,
141-
project: ProjectEntity,
142-
service_provider: SuerannotateServiceProvider,
143-
annotation_status: str = None,
144-
name_prefix: str = None,
140+
self,
141+
project: ProjectEntity,
142+
service_provider: SuerannotateServiceProvider,
143+
annotation_status: str = None,
144+
name_prefix: str = None,
145145
):
146146
super().__init__()
147147
self._project = project
@@ -155,9 +155,9 @@ def annotation_status(self):
155155

156156
def execute(self):
157157
condition = (
158-
Condition("team_id", self._project.team_id, EQ)
159-
& Condition("project_id", self._project.uuid, EQ)
160-
& Condition("folder_id", 0, EQ)
158+
Condition("team_id", self._project.team_id, EQ)
159+
& Condition("project_id", self._project.uuid, EQ)
160+
& Condition("folder_id", 0, EQ)
161161
)
162162
if self._annotation_status:
163163
condition &= Condition("annotation_status", self.annotation_status, EQ)
@@ -1991,13 +1991,7 @@ def validate_limitations(self):
19911991
errors = []
19921992
if response.data.folder_limit.remaining_image_count < 1:
19931993
errors.append(constances.ATTACH_FOLDER_LIMIT_ERROR_MESSAGE)
1994-
elif (
1995-
self._move
1996-
and self._to_project.uuid != self._from_project.uuid
1997-
and response.data.project_limit.remaining_image_count < 1
1998-
):
1999-
errors.append(constances.ATTACH_PROJECT_LIMIT_ERROR_MESSAGE)
2000-
elif not self._move and response.data.project_limit.remaining_image_count < 1:
1994+
elif self._to_project.uuid != self._from_project.uuid and response.data.project_limit.remaining_image_count < 1:
20011995
errors.append(constances.ATTACH_PROJECT_LIMIT_ERROR_MESSAGE)
20021996
if errors:
20031997
raise AppValidationException("\n".join(errors))
@@ -2031,7 +2025,7 @@ def execute(self) -> Response:
20312025
image=image_bytes,
20322026
project_settings=self._project_settings,
20332027
upload_path=auth_data["filePath"],
2034-
s3_repo=self._to_upload_s3_repo
2028+
s3_repo=self._to_upload_s3_repo,
20352029
).execute()
20362030
if s3_response.errors:
20372031
raise AppException(s3_response.errors)
@@ -2043,7 +2037,9 @@ def execute(self) -> Response:
20432037
folder=self._to_folder,
20442038
attachments=[image_entity],
20452039
backend_service_provider=self._backend_service,
2046-
annotation_status=image.annotation_status_code if self._copy_annotation_status else None,
2040+
annotation_status=image.annotation_status_code
2041+
if self._copy_annotation_status
2042+
else None,
20472043
upload_state_code=constances.UploadState.BASIC.value,
20482044
).execute()
20492045
self._response.data = image_entity
@@ -2613,8 +2609,8 @@ def execute(self):
26132609
failed_annotations = []
26142610
for _ in range(0, len(self.annotations_to_upload), self.AUTH_DATA_CHUNK_SIZE):
26152611
annotations_to_upload = self.annotations_to_upload[
2616-
_: _ + self.AUTH_DATA_CHUNK_SIZE # noqa: E203
2617-
]
2612+
_ : _ + self.AUTH_DATA_CHUNK_SIZE # noqa: E203
2613+
]
26182614

26192615
if self._pre_annotation:
26202616
response = self._backend_service.get_pre_annotation_upload_data(
@@ -2689,7 +2685,7 @@ def execute(self):
26892685
return self._response
26902686

26912687
def upload_to_s3(
2692-
self, image_id: int, image_info, bucket, from_s3, image_id_name_map
2688+
self, image_id: int, image_info, bucket, from_s3, image_id_name_map
26932689
):
26942690
if from_s3:
26952691
file = io.BytesIO()
@@ -2712,14 +2708,14 @@ def upload_to_s3(
27122708
)
27132709
if self._project.project_type == constances.ProjectType.PIXEL.value:
27142710
mask_filename = (
2715-
image_id_name_map[image_id].name + constances.ANNOTATION_MASK_POSTFIX
2711+
image_id_name_map[image_id].name + constances.ANNOTATION_MASK_POSTFIX
27162712
)
27172713
if from_s3:
27182714
file = io.BytesIO()
2719-
s3_object = self._client_s3_bucket.Objcect(
2720-
self._client_s3_bucket, self._folder_path + mask_filename
2715+
s3_object = from_s3.Object(
2716+
self._client_s3_bucket, f"{self._folder_path}/{mask_filename}"
27212717
)
2722-
s3_object.download_file(file)
2718+
s3_object.download_fileobj(file)
27232719
file.seek(0)
27242720
else:
27252721
with open(f"{self._folder_path}/{mask_filename}", "rb") as mask_file:

0 commit comments

Comments
 (0)