diff --git a/src/superannotate/lib/app/interface/sdk_interface.py b/src/superannotate/lib/app/interface/sdk_interface.py index c1446ef9d..bb1a0f346 100644 --- a/src/superannotate/lib/app/interface/sdk_interface.py +++ b/src/superannotate/lib/app/interface/sdk_interface.py @@ -1679,6 +1679,7 @@ def upload_image_annotations( raise AppException("Folder not found.") image = self.controller.items.get_by_name(project, folder, image_name).data + if not image: raise AppException("Image not found.") response = self.controller.annotations.upload_image_annotations( @@ -2491,7 +2492,7 @@ def query( ) if response.errors: raise AppException(response.errors) - return BaseSerializer.serialize_iterable(response.data) + return BaseSerializer.serialize_iterable(response.data, exclude = set(["meta"])) def get_item_metadata( self, @@ -2550,6 +2551,7 @@ def get_item_metadata( include_custom_metadata=include_custom_metadata, ) exclude = {"custom_metadata"} if not include_custom_metadata else {} + exclude.add("meta") if response.errors: raise AppException(response.errors) return BaseSerializer(response.data).serialize(exclude=exclude) @@ -2656,6 +2658,7 @@ def search_items( include_custom_metadata=include_custom_metadata, ) exclude = {"custom_metadata"} if not include_custom_metadata else {} + exclude.add("meta") if response.errors: raise AppException(response.errors) return BaseSerializer.serialize_iterable(response.data, exclude=exclude) diff --git a/src/superannotate/lib/core/entities/items.py b/src/superannotate/lib/core/entities/items.py index 4b84ea5d9..bda7c6dce 100644 --- a/src/superannotate/lib/core/entities/items.py +++ b/src/superannotate/lib/core/entities/items.py @@ -16,7 +16,7 @@ class ImageEntity(BaseItemEntity): ) approval_status: Optional[ApprovalStatus] = Field(None) is_pinned: Optional[bool] - # meta: Optional[dict] + meta: Optional[dict] class Config: extra = Extra.ignore diff --git a/src/superannotate/lib/core/serviceproviders.py b/src/superannotate/lib/core/serviceproviders.py index e888c34d9..73ef4913f 100644 --- a/src/superannotate/lib/core/serviceproviders.py +++ b/src/superannotate/lib/core/serviceproviders.py @@ -428,7 +428,7 @@ def list( raise NotImplementedError @abstractmethod - def create(self, project: entities.ProjectEntity, name: str) -> SubsetResponse: + def create_multiple(self, project: entities.ProjectEntity, names: List[str]) -> SubsetListResponse: raise NotImplementedError @abstractmethod diff --git a/src/superannotate/lib/core/usecases/annotations.py b/src/superannotate/lib/core/usecases/annotations.py index b0cea5c87..1922ea4cc 100644 --- a/src/superannotate/lib/core/usecases/annotations.py +++ b/src/superannotate/lib/core/usecases/annotations.py @@ -655,7 +655,7 @@ def execute(self): chunk_size=5 * 1024 * 1024, ) ) - if not uploaded.ok: + if not uploaded: self._response.errors = constants.INVALID_JSON_MESSAGE else: response = asyncio.run( @@ -697,6 +697,7 @@ def execute(self): self._image.annotation_status = ( constants.AnnotationStatus.IN_PROGRESS.value ) + self._image.is_pinned = int(self._image.is_pinned) self._service_provider.items.update(self._project, self._image) if self._verbose: self.reporter.log_info( diff --git a/src/superannotate/lib/core/usecases/items.py b/src/superannotate/lib/core/usecases/items.py index 094320a62..d41c6e400 100644 --- a/src/superannotate/lib/core/usecases/items.py +++ b/src/superannotate/lib/core/usecases/items.py @@ -913,6 +913,7 @@ def __distribute_to_results(self, item_id, response, item): def validate_items( self, ): + filtered_items = self.__filter_duplicates() if len(filtered_items) != len(self.items): self.reporter.log_info( @@ -922,6 +923,7 @@ def validate_items( self.items = self.__filter_invalid_items() self.__separate_to_paths() + def validate_project(self): response = self._service_provider.validate_saqul_query(self.project, "_") if not response.ok: @@ -946,6 +948,7 @@ def execute( self.item_ids.extend(ids) + futures = [] subsets = self._service_provider.subsets.list(self.project).data subset = None for s in subsets: @@ -953,11 +956,12 @@ def execute( subset = s break + if not subset: - subset = self._service_provider.subsets.create( + subset = self._service_provider.subsets.create_multiple( self.project, - self.subset_name, - ).data + [self.subset_name] + ).data[0] self.reporter.log_info( f"You've successfully created a new subset - {self.subset_name}." @@ -969,7 +973,7 @@ def execute( tmp_response = self._service_provider.subsets.add_items( project=self.project, item_ids=self.item_ids[i : i + self.CHUNK_SIZE], # noqa - subset=subset, + subset=subset ) if not response: diff --git a/src/superannotate/lib/infrastructure/services/subset.py b/src/superannotate/lib/infrastructure/services/subset.py index 2f166cfc9..0dbda912b 100644 --- a/src/superannotate/lib/infrastructure/services/subset.py +++ b/src/superannotate/lib/infrastructure/services/subset.py @@ -2,7 +2,7 @@ from lib.core import entities from lib.core.conditions import Condition -from lib.core.service_types import SubsetResponse +from lib.core.service_types import SubsetListResponse from lib.core.serviceproviders import BaseSubsetService @@ -18,12 +18,12 @@ def list(self, project: entities.ProjectEntity, condition: Condition = None): item_type=entities.SubSetEntity, ) - def create(self, project: entities.ProjectEntity, name: str): + def create_multiple(self, project: entities.ProjectEntity, name: List[str]): return self.client.request( - "POST", - self.URL_CREATE.format(project_id=project.id), + method = "POST", + url =self.URL_CREATE.format(project_id=project.id), data={"names": [name]}, - content_type=SubsetResponse, + content_type=SubsetListResponse ) def add_items( @@ -38,7 +38,7 @@ def add_items( project_id=project.id, subset_id=subset.id ), method="POST", - data=data, + data=data ) if not response.ok: response.data["skipped"] = set()