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
1 change: 0 additions & 1 deletion docs/source/superannotate.sdk.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ ________
.. autofunction:: superannotate.delete_folders
.. autofunction:: superannotate.upload_images_to_project
.. autofunction:: superannotate.attach_image_urls_to_project
.. autofunction:: superannotate.upload_images_from_public_urls_to_project
.. autofunction:: superannotate.attach_document_urls_to_project
.. autofunction:: superannotate.attach_items_from_integrated_storage
.. autofunction:: superannotate.upload_image_to_project
Expand Down
4 changes: 0 additions & 4 deletions src/superannotate/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,6 @@
from superannotate.lib.app.interface.sdk_interface import (
upload_images_from_folder_to_project,
)
from superannotate.lib.app.interface.sdk_interface import (
upload_images_from_public_urls_to_project,
)
from superannotate.lib.app.interface.sdk_interface import upload_images_to_project
from superannotate.lib.app.interface.sdk_interface import (
upload_preannotations_from_folder_to_project,
Expand Down Expand Up @@ -193,7 +190,6 @@
"delete_annotations",
"upload_image_to_project",
"upload_image_annotations",
"upload_images_from_public_urls_to_project",
"upload_images_from_folder_to_project",
"attach_image_urls_to_project",
"attach_video_urls_to_project",
Expand Down
54 changes: 0 additions & 54 deletions src/superannotate/lib/app/interface/sdk_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,60 +520,6 @@ def copy_image(
)


@Trackable
@validate_arguments
def upload_images_from_public_urls_to_project(
project: Union[NotEmptyStr, dict],
img_urls: List[NotEmptyStr],
img_names: Optional[List[NotEmptyStr]] = None,
annotation_status: Optional[AnnotationStatuses] = "NotStarted",
image_quality_in_editor: Optional[NotEmptyStr] = None,
):
"""Uploads all images given in the list of URL strings in img_urls to the project.
Sets status of all the uploaded images to annotation_status if it is not None.

:param project: project name or folder path (e.g., "project1/folder1")
:type project: str
:param img_urls: list of str objects to upload
:type img_urls: list
:param img_names: list of str names for each urls in img_url list
:type img_names: list
:param annotation_status: value to set the annotation statuses of the uploaded images
NotStarted InProgress QualityCheck Returned Completed Skipped
:type annotation_status: str
:param image_quality_in_editor: image quality be seen in SuperAnnotate web annotation editor.
Can be either "compressed" or "original". If None then the default value in project settings will be used.
:type image_quality_in_editor: str

:return: uploaded images' urls, uploaded images' filenames, duplicate images' filenames
and not-uploaded images' urls
:rtype: tuple of list of strs
"""
warning_msg = (
"The upload_images_from_public_urls function is deprecated and will be removed with the coming release, "
"please use attach_image_urls_to_project instead."
)
logger.warning(warning_msg)
warnings.warn(warning_msg, DeprecationWarning)

project_name, folder_name = extract_project_folder(project)

use_case = Controller.get_default().upload_images_from_public_urls_to_project(
project_name=project_name,
folder_name=folder_name,
image_urls=img_urls,
image_names=img_names,
annotation_status=annotation_status,
image_quality_in_editor=image_quality_in_editor,
)
if use_case.is_valid():
with tqdm(total=len(img_urls), desc="Uploading images") as progress_bar:
for _ in use_case.execute():
progress_bar.update(1)
return use_case.data
raise AppException(use_case.response.errors)


@Trackable
@validate_arguments
def copy_images(
Expand Down
9 changes: 3 additions & 6 deletions src/superannotate/lib/app/mixp/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,13 @@

from .utils import parsers


logger = get_default_logger()


def get_mp_instance() -> Mixpanel:
try:
if "api.annotate.online" in get_default_controller()._backend_client.api_url:
return Mixpanel("ca95ed96f80e8ec3be791e2d3097cf51")
finally:
return Mixpanel("e741d4863e7e05b1a45833d01865ef0d")
if "api.annotate.online" in get_default_controller()._backend_url:
return Mixpanel("ca95ed96f80e8ec3be791e2d3097cf51")
return Mixpanel("e741d4863e7e05b1a45833d01865ef0d")


def get_default(team_name, user_id, project_name=None):
Expand Down
20 changes: 0 additions & 20 deletions src/superannotate/lib/app/mixp/utils/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,26 +173,6 @@ def upload_image_to_project(*args, **kwargs):
}


def upload_images_from_public_urls_to_project(*args, **kwargs):
project = kwargs.get("project", None)
if not project:
project = args[0]
img_urls = kwargs.get("img_urls", [])
if not img_urls:
img_urls += args[1]
return {
"event_name": "upload_images_from_public_urls_to_project",
"properties": {
"Image Count": len(img_urls),
"Image Name": bool(args[2:3] or kwargs.get("img_names", None)),
"Annotation Status": bool(
args[3:4] or kwargs.get("annotation_status", None)
),
"project_name": get_project_name(project),
},
}


def upload_video_to_project(*args, **kwargs):
project = kwargs.get("project", None)
if not project:
Expand Down
11 changes: 10 additions & 1 deletion src/superannotate/lib/core/entities/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from lib.core.entities.integrations import IntegrationEntity
from lib.core.entities.items import DocumentEntity
from lib.core.entities.items import Entity
from lib.core.entities.items import TmpBaseEntity
from lib.core.entities.items import TmpImageEntity
from lib.core.entities.items import VideoEntity
from lib.core.entities.project_entities import AnnotationClassEntity
from lib.core.entities.project_entities import BaseEntity
from lib.core.entities.project_entities import ConfigEntity
from lib.core.entities.project_entities import Entity
from lib.core.entities.project_entities import FolderEntity
from lib.core.entities.project_entities import ImageEntity
from lib.core.entities.project_entities import ImageInfoEntity
Expand All @@ -22,8 +26,13 @@
)

__all__ = [
# items
"BaseEntity",
"TmpBaseEntity",
"Entity",
"VideoEntity",
"DocumentEntity",
# project
"ProjectEntity",
"ProjectSettingEntity",
"ConfigEntity",
Expand Down
8 changes: 5 additions & 3 deletions src/superannotate/lib/core/entities/integrations.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from lib.core.entities.base import TimedBaseModel
from lib.core.enums import IntegrationTypeEnum

from pydantic import Field
from pydantic import Extra


class IntegrationEntity(TimedBaseModel):
id: int = None
user_id: str = None
name: str
type: str = "aws"
type: IntegrationTypeEnum = Field(None, alias="source")
root: str = Field(None, alias="bucket_name")
source: int = None

class Config:
arbitrary_types_allowed = True
extra = Extra.ignore
53 changes: 53 additions & 0 deletions src/superannotate/lib/core/entities/items.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from typing import Optional

from lib.core.enums import AnnotationStatus
from lib.core.enums import SegmentationStatus

from pydantic import BaseModel
from pydantic import Extra
from pydantic import Field


class TmpBaseEntity(BaseModel):
id: int
name: str
path: Optional[str] = Field(None, description="Item’s path in SuperAnnotate project")
url: Optional[str] = Field(None, description="Publicly available HTTP address")
annotation_status: AnnotationStatus = Field(description="Item annotation status")
annotator_name: Optional[str] = Field(description="Annotator email")
qa_name: Optional[str] = Field(description="QA email")
entropy_value: Optional[str] = Field(description="Priority score of given item")
createdAt: str = Field(description="Date of creation")
updatedAt: str = Field(description="Update date")

class Config:
extra = Extra.allow

def add_path(self, project_name: str, folder_name: str):
path = f"{project_name}{f'/{folder_name}' if folder_name != 'root' else ''}/{self.name}"
self.path = path
return self


class Entity(TmpBaseEntity):
class Config:
extra = Extra.allow


class TmpImageEntity(Entity):
prediction_status: Optional[SegmentationStatus] = Field(SegmentationStatus.NOT_STARTED)
segmentation_status: Optional[SegmentationStatus] = Field(SegmentationStatus.NOT_STARTED)
approval_status: bool = None

class Config:
extra = Extra.ignore


class VideoEntity(Entity):
class Config:
ignore_extra = True


class DocumentEntity(Entity):
class Config:
ignore_extra = True
46 changes: 0 additions & 46 deletions src/superannotate/lib/core/entities/project_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,10 @@
from typing import Any
from typing import Iterable
from typing import List
from typing import Optional
from typing import Union

from lib.core.enums import AnnotationStatus
from lib.core.enums import ClassTypeEnum
from lib.core.enums import SegmentationStatus
from pydantic import BaseModel
from pydantic import Extra
from pydantic import Field
from superannotate_schemas.schemas.classes import AnnotationClass


Expand Down Expand Up @@ -484,44 +479,3 @@ def to_dict(self):
"is_global": self.is_global,
**self.hyper_parameters,
}


class Entity(BaseModel):
id: int
name: str
path: Optional[str] = Field(None, description="Item’s path in SuperAnnotate project")
url: Optional[str] = Field(None, description="Publicly available HTTP address")
annotation_status: AnnotationStatus = Field(description="Item annotation status")
annotator_name: Optional[str] = Field(description="Annotator email")
qa_name: Optional[str] = Field(description="QA email")
entropy_value: Optional[str] = Field(description="Priority score of given item")
created_at: str = Field(alias="createdAt", description="Date of creation")
updated_at: str = Field(alias="updatedAt", description="Update date")

class Config:
extra = Extra.allow

def add_path(self, project_name: str, folder_name: str):
path = f"{project_name}{f'/{folder_name}' if folder_name != 'root' else ''}/{self.name}"
self.path = path
return self


class TmpImageEntity(Entity):
prediction_status: Optional[SegmentationStatus] = Field(SegmentationStatus.NOT_STARTED)
segmentation_status: Optional[SegmentationStatus] = Field(SegmentationStatus.NOT_STARTED)
approval_status: bool = None

class Config:
arbitrary_types_allowed = False
ignore_extra = True


class VideoEntity(Entity):
class Config:
ignore_extra = True


class DocumentEntity(Entity):
class Config:
ignore_extra = True
6 changes: 6 additions & 0 deletions src/superannotate/lib/core/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ def get_value(cls, name):
return cls.OBJECT.value


class IntegrationTypeEnum(BaseTitledEnum):
AWS = "aws", 1
GCP = "gcp", 2
AZURE = "azure", 3


class TrainingStatus(BaseTitledEnum):
NOT_STARTED = "NotStarted", 1
IN_PROGRESS = "InProgress", 2
Expand Down
6 changes: 3 additions & 3 deletions src/superannotate/lib/core/repositories.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,18 @@
import boto3
from lib.core.conditions import Condition
from lib.core.entities import BaseEntity
from lib.core.entities import Entity
from lib.core.entities import ProjectEntity
from lib.core.entities import TmpBaseEntity
from lib.core.serviceproviders import SuperannotateServiceProvider


class BaseReadOnlyRepository(ABC):
@abstractmethod
def get_one(self, uuid: Union[Condition, int]) -> Optional[Union[BaseEntity, Entity]]:
def get_one(self, uuid: Union[Condition, int]) -> Optional[Union[BaseEntity, TmpBaseEntity]]:
raise NotImplementedError

@abstractmethod
def get_all(self, condition: Optional[Condition] = None) -> List[Union[BaseEntity, Entity]]:
def get_all(self, condition: Optional[Condition] = None) -> List[Union[BaseEntity, TmpBaseEntity]]:
raise NotImplementedError

@staticmethod
Expand Down
Loading