Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion src/superannotate/lib/app/interface/sdk_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
from lib.app.serializers import ProjectSerializer
from lib.app.serializers import SettingsSerializer
from lib.app.serializers import TeamSerializer
from lib.app.serializers import ItemSerializer
from lib.core import entities
from lib.core import LIMITED_FUNCTIONS
from lib.core.conditions import Condition
Expand Down Expand Up @@ -85,6 +86,49 @@ def __init__(
):
super().__init__(token, config_path)

def get_folder_by_id(self, project_id: int, folder_id: int):
"""Returns the folder
:param folder_id: the id of the folder
:param project_id: the id of the project
:return: folder information
:rtype: dict
"""

response = self.controller.get_folder_by_id(
folder_id=folder_id,
project_id=project_id
)

return FolderSerializer(response).serialize(exclude={"completedCount", "is_root"})

def get_project_by_id(self, project_id: int):
"""Returns the project
:param project_id: the id of the project
:return: folder information
:rtype: dict
"""
response = self.controller.get_project_by_id(
project_id=project_id
)

return ProjectSerializer(response.data).serialize()

def get_item_by_id(self, project_id: int, item_id: int):
"""Returns the project
:param item_id: the id of the item
:param project_id: the id of the project
:return: folder information
:rtype: dict
"""

response = self.controller.get_item_by_id(
item_id=item_id,
project_id=project_id
)

return ItemSerializer(response).serialize(exclude = {"url", "meta"})


def get_team_metadata(self):
"""Returns team metadata

Expand Down Expand Up @@ -455,7 +499,7 @@ def get_project_metadata(
include_settings: Optional[StrictBool] = False,
include_workflow: Optional[StrictBool] = False,
include_contributors: Optional[StrictBool] = False,
include_complete_image_count: Optional[StrictBool] = False,
include_complete_image_count: Optional[StrictBool] = False
):
"""Returns project metadata

Expand Down
11 changes: 11 additions & 0 deletions src/superannotate/lib/app/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,17 @@ def serialize(self):
self.data["value"] = constance.ImageQuality.get_name(self.data["value"])
return self.data

class ItemSerializer(BaseSerializer):
def serialize(
self,
fields: List[str] = None,
by_alias: bool = False,
flat: bool = False,
exclude: Set[str] = None,
):
data = super().serialize(fields, by_alias, flat, exclude)

return data

class EntitySerializer:
@classmethod
Expand Down
3 changes: 3 additions & 0 deletions src/superannotate/lib/core/entities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
from lib.core.entities.items import DocumentEntity
from lib.core.entities.items import ImageEntity
from lib.core.entities.items import VideoEntity
from lib.core.entities.items import ClassificationEntity
from lib.core.entities.items import TiledEntity
from lib.core.entities.items import PointCloudEntity
from lib.core.entities.project import AttachmentEntity
from lib.core.entities.project import MLModelEntity
from lib.core.entities.project import ProjectEntity
Expand Down
13 changes: 12 additions & 1 deletion src/superannotate/lib/core/entities/items.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,18 @@ class VideoEntity(BaseItemEntity):
class Config:
extra = Extra.ignore


class DocumentEntity(BaseItemEntity):
class Config:
extra = Extra.ignore

class TiledEntity(BaseItemEntity):
class Config:
extra = Extra.ignore

class ClassificationEntity(BaseItemEntity):
class Config:
extra = Extra.ignore

class PointCloudEntity(BaseItemEntity):
class Config:
extra = Extra.ignore
19 changes: 18 additions & 1 deletion src/superannotate/lib/core/service_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,27 @@ def set_error(self, value: Union[dict, str]):
self._error = value


class ImageResponse(ServiceResponse):
data: entities.ImageEntity = None

class VideoResponse(ServiceResponse):
data: entities.VideoEntity = None

class DocumentResponse(ServiceResponse):
data: entities.DocumentEntity = None

class TiledResponse(ServiceResponse):
data: entities.TiledEntity = None

class ClassificationResponse(ServiceResponse):
data: entities.ClassificationEntity = None

class PointCloudResponse(ServiceResponse):
data: entities.PointCloudEntity = None

class TeamResponse(ServiceResponse):
data: entities.TeamEntity = None


class ModelListResponse(ServiceResponse):
data: List[entities.AnnotationClassEntity] = None

Expand Down
4 changes: 4 additions & 0 deletions src/superannotate/lib/core/serviceproviders.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@ def upload_priority_scores(


class BaseFolderService(SuperannotateServiceProvider):
@abstractmethod
def get_by_id(self, folder_id: int, project_id: int, team_id: int):
raise NotImplementedError

@abstractmethod
def get_by_name(self, project: entities.ProjectEntity, name: str) -> FolderResponse:
raise NotImplementedError
Expand Down
26 changes: 26 additions & 0 deletions src/superannotate/lib/core/usecases/folders.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,32 @@
logger = get_default_logger()


class GetFolderByIDUseCase(BaseUseCase):
def __init__(self, project_id, folder_id, team_id, service_provider):
self._project_id = project_id
self._folder_id = folder_id
self._team_id = team_id
self._service_provider = service_provider
super().__init__()

def execute(self):
try:
response = self._service_provider.folders.get_by_id(
folder_id = self._folder_id,
project_id = self._project_id,
team_id = self._team_id
)
except AppException as e:
self._response.errors=e
else:
self._response.data = response.data

if not response.ok:
self._response.errors = AppException(response.error)

return self._response


class CreateFolderUseCase(BaseUseCase):
def __init__(
self,
Expand Down
25 changes: 25 additions & 0 deletions src/superannotate/lib/core/usecases/items.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,31 @@

logger = get_default_logger()

class GetItemByIDUseCase(BaseUseCase):
def __init__(self, item_id, project, service_provider):
self._item_id = item_id
self._project = project
self._service_provider = service_provider
super().__init__()

def execute(self, ):

try:
response = self._service_provider.items.get_by_id(
item_id = self._item_id,
project_id = self._project.id,
project_type = self._project.type

)
except AppException as e:
self._response.errors = e
else:
self._response.data = response.data

if not response.ok:
self._response.errors = response.error

return self._response

class GetItem(BaseReportableUseCase):
def __init__(
Expand Down
20 changes: 20 additions & 0 deletions src/superannotate/lib/core/usecases/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,26 @@

logger = get_default_logger()

class GetProjectByIDUseCase(BaseUseCase):
def __init__(self, project_id, service_provider):
self._project_id = project_id
self._service_provider=service_provider
super().__init__()

def execute(self):
try:

self._response.data= self._service_provider.projects.get_by_id(
project_id = self._project_id
)

except AppException as e:
self._response.errors = e
else:
if not self._response.data.data:
self._response.errors = AppException("Either the specified project does not exist or you do not have permission to view it")

return self._response

class GetProjectsUseCase(BaseUseCase):
def __init__(
Expand Down
67 changes: 67 additions & 0 deletions src/superannotate/lib/infrastructure/controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ def __init__(self, service_provider: ServiceProvider):


class ProjectManager(BaseManager):
def get_by_id(self, project_id):
use_case = usecases.GetProjectByIDUseCase(
project_id=project_id,
service_provider=self.service_provider
)
response = use_case.execute()
return response

def get_by_name(self, name: str):
use_case = usecases.GetProjectByNameUseCase(
name=name, service_provider=self.service_provider
Expand Down Expand Up @@ -302,6 +310,16 @@ def create(self, project: ProjectEntity, folder: FolderEntity):
)
return use_case.execute()

def get_by_id(self, folder_id, project_id, team_id):
use_case = usecases.GetFolderByIDUseCase(
folder_id=folder_id,
project_id=project_id,
team_id=team_id,
service_provider = self.service_provider
)
result = use_case.execute()
return result

def list(self, project: ProjectEntity, condition: Condition = None):
use_case = usecases.SearchFoldersUseCase(
project=project, service_provider=self.service_provider, condition=condition
Expand Down Expand Up @@ -355,6 +373,15 @@ def get_by_name(
)
return use_case.execute()

def get_by_id(self, item_id: int, project : ProjectEntity):
use_case = usecases.GetItemByIDUseCase(
item_id = item_id,
project = project.data,
service_provider = self.service_provider
)
return use_case.execute()


def list(
self,
project: ProjectEntity,
Expand Down Expand Up @@ -832,6 +859,46 @@ def set_default(cls, obj):
cls.DEFAULT = obj
return cls.DEFAULT

def get_folder_by_id(
self, folder_id: int, project_id: int
) -> FolderEntity:
response= self.folders.get_by_id(
folder_id = folder_id,
project_id = project_id,
team_id = self.team_id
)

if response.errors:
raise AppException(response.errors)

return response.data

def get_project_by_id(
self, project_id: int
)->ProjectEntity:
response = self.projects.get_by_id(
project_id = project_id
)
if response.errors:
raise AppException(response.errors)

return response.data

def get_item_by_id(
self, item_id: int, project_id:int
):
project=self.get_project_by_id(project_id = project_id)
response = self.items.get_by_id(
item_id = item_id,
project = project
)

if response.errors:
raise AppException(response.errors)

return response.data


def get_project_folder_by_path(
self, path: Union[str, Path]
) -> Tuple[ProjectEntity, FolderEntity]:
Expand Down
12 changes: 12 additions & 0 deletions src/superannotate/lib/infrastructure/services/folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,19 @@ class FolderService(BaseFolderService):
URL_GET_BY_NAME = "folder/getFolderByName"
URL_DELETE_MULTIPLE = "image/delete/images"
URL_ASSIGN_FOLDER = "folder/editAssignment"
URL_GET_BY_ID = "folder/getFolderById"

def get_by_id(self, folder_id, project_id, team_id):
params = {
"team_id": team_id,
"folder_id": folder_id,
"project_id": project_id
}
response = self.client.request(
self.URL_GET_BY_ID, "get", params = params, content_type=FolderResponse
)

return response
def get_by_name(self, project: entities.ProjectEntity, name: str):
params = {"project_id": project.id, "name": name}
return self.client.request(
Expand Down
Loading