Skip to content

Commit a8c90d2

Browse files
authored
Merge pull request #452 from superannotateai/1119_get_subsets
initial commit
2 parents 3c85504 + 1c74f5c commit a8c90d2

File tree

10 files changed

+94
-1
lines changed

10 files changed

+94
-1
lines changed

docs/source/superannotate.sdk.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,20 @@ ______
7373
.. automethod:: superannotate.SAClient.attach_items
7474
.. automethod:: superannotate.SAClient.copy_items
7575
.. automethod:: superannotate.SAClient.move_items
76+
.. automethod:: superannotate.SAClient.assign_items
77+
.. automethod:: superannotate.SAClient.unassign_items
7678
.. automethod:: superannotate.SAClient.get_item_metadata
7779
.. automethod:: superannotate.SAClient.set_annotation_statuses
7880

7981
----------
8082

83+
Subsets
84+
______
85+
86+
.. automethod:: superannotate.SAClient.get_subsets
87+
88+
----------
89+
8190
Images
8291
______
8392

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2744,3 +2744,19 @@ def download_annotations(
27442744
if response.errors:
27452745
raise AppException(response.errors)
27462746
return response.data
2747+
2748+
def get_subsets(self, project: Union[NotEmptyStr, dict]):
2749+
"""Get Subsets
2750+
2751+
:param project: project name (e.g., “project1”)
2752+
:type project: str
2753+
2754+
:return: subsets’ metadata
2755+
:rtype: list of dicts
2756+
"""
2757+
project_name, _ = extract_project_folder(project)
2758+
2759+
response = self.controller.list_subsets(project_name)
2760+
if response.errors:
2761+
raise AppException(response.errors)
2762+
return BaseSerializer.serialize_iterable(response.data)

src/superannotate/lib/core/entities/base.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ def validate(cls, v: datetime):
2727
return v.isoformat()
2828

2929

30+
class SubSetEntity(BaseModel):
31+
name: str
32+
33+
class Config:
34+
extra = Extra.ignore
35+
36+
3037
class TimedBaseModel(BaseModel):
3138
createdAt: StringDate = Field(None, alias="createdAt")
3239
updatedAt: StringDate = Field(None, alias="updatedAt")

src/superannotate/lib/core/service_types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from pydantic import BaseModel
88
from pydantic import Extra
9+
from pydantic import parse_obj_as
910

1011

1112
class Limit(BaseModel):
@@ -81,7 +82,7 @@ def __init__(self, response, content_type=None):
8182
}
8283
try:
8384
if content_type and content_type is not self.__class__:
84-
data["data"] = content_type(**response.json())
85+
data["data"] = parse_obj_as(content_type, response.json())
8586
else:
8687
data["data"] = response.json()
8788
except Exception as e:

src/superannotate/lib/core/serviceproviders.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,6 @@ def saqul_query(
368368

369369
def validate_saqul_query(self, team_id: int, project_id: int, query: str) -> dict:
370370
raise NotImplementedError
371+
372+
def list_sub_sets(self, team_id: int, project_id: int) -> ServiceResponse:
373+
raise NotImplementedError

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from lib.core.reporter import Reporter
2020
from lib.core.repositories import BaseManageableRepository
2121
from lib.core.repositories import BaseReadOnlyRepository
22+
from lib.core.response import Response
2223
from lib.core.serviceproviders import SuperannotateServiceProvider
2324
from lib.core.usecases.base import BaseReportableUseCase
2425
from lib.core.usecases.base import BaseUseCase
@@ -1079,3 +1080,38 @@ def execute(self):
10791080
)
10801081
self._response.data = invited, list(to_skip)
10811082
return self._response
1083+
1084+
1085+
class ListSubsetsUseCase(BaseReportableUseCase):
1086+
def __init__(
1087+
self,
1088+
reporter: Reporter,
1089+
project: ProjectEntity,
1090+
backend_client: SuperannotateServiceProvider,
1091+
):
1092+
super().__init__(reporter)
1093+
self._project = project
1094+
self._backend_client = backend_client
1095+
1096+
def validate_project(self):
1097+
if self._project.sync_status != constances.ProjectState.SYNCED.value:
1098+
raise AppException("Data is not synced.")
1099+
1100+
response = self._backend_client.validate_saqul_query(
1101+
self._project.team_id, self._project.id, "_"
1102+
)
1103+
error = response.get("error")
1104+
if error:
1105+
raise AppException(response["error"])
1106+
1107+
def execute(self) -> Response:
1108+
if self.is_valid():
1109+
sub_sets_response = self._backend_client.list_sub_sets(
1110+
team_id=self._project.team_id, project_id=self._project.id
1111+
)
1112+
if sub_sets_response.ok:
1113+
self._response.data = []
1114+
else:
1115+
self._response.data = []
1116+
1117+
return self._response

src/superannotate/lib/infrastructure/controller.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,3 +1689,12 @@ def download_annotations(
16891689
callback=callback,
16901690
)
16911691
return use_case.execute()
1692+
1693+
def list_subsets(self, project_name: str):
1694+
project = self._get_project(project_name)
1695+
use_case = usecases.ListSubsetsUseCase(
1696+
reporter=self.get_default_reporter(),
1697+
project=project,
1698+
backend_client=self.backend_client,
1699+
)
1700+
return use_case.execute()

src/superannotate/lib/infrastructure/services.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import lib.core as constance
1616
import requests.packages.urllib3
17+
from lib.core import entities
1718
from lib.core.exceptions import AppException
1819
from lib.core.exceptions import BackendError
1920
from lib.core.reporter import Reporter
@@ -240,6 +241,7 @@ class SuperannotateBackendService(BaseBackendService):
240241
URL_ATTACH_INTEGRATIONS = "image/integration/create"
241242
URL_SAQUL_QUERY = "/images/search/advanced"
242243
URL_VALIDATE_SAQUL_QUERY = "/images/parse/query/advanced"
244+
URL_LIST_SUBSETS = "/project/{project_id}/subset"
243245

244246
def upload_priority_scores(
245247
self, team_id: int, project_id: int, folder_id: int, priorities: list
@@ -1190,3 +1192,11 @@ def validate_saqul_query(self, team_id: int, project_id: int, query: str) -> dic
11901192
return self._request(
11911193
validate_query_url, "post", params=params, data=data
11921194
).json()
1195+
1196+
def list_sub_sets(self, team_id: int, project_id: int) -> ServiceResponse:
1197+
return self._request(
1198+
urljoin(self.api_url, self.URL_LIST_SUBSETS.format(project_id=project_id)),
1199+
"get",
1200+
params=dict(team_id=team_id),
1201+
content_type=List[entities.SubSetEntity],
1202+
)

tests/integration/test_benchmark.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from os.path import dirname
44

55
import pytest
6+
67
from src.superannotate import SAClient
8+
79
sa = SAClient()
810
from tests.integration.base import BaseTestCase
911

tests/integration/test_create_from_full_info.py

Whitespace-only changes.

0 commit comments

Comments
 (0)