Skip to content

Commit 92ac33d

Browse files
committed
4.3.4dev1 initial changes
1 parent 338a367 commit 92ac33d

File tree

11 files changed

+40
-22
lines changed

11 files changed

+40
-22
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class BaseEntity(TimedBaseModel):
4444
entropy_value: Optional[float] = Field(description="Priority score of given item")
4545
createdAt: str = Field(description="Date of creation")
4646
updatedAt: str = Field(description="Update date")
47+
is_pinned: Optional[bool]
4748

4849
class Config:
4950
extra = Extra.allow

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

33
from lib.core.entities.base import BaseEntity
4+
from lib.core.enums import ApprovalStatus
45
from lib.core.enums import SegmentationStatus
56
from pydantic import Extra
67
from pydantic import Field
@@ -11,7 +12,7 @@ class Config:
1112
extra = Extra.allow
1213

1314
def add_path(self, project_name: str, folder_name: str):
14-
self.path = f"{project_name}{f'/{folder_name}' if folder_name != 'root' else ''}/{self.name}"
15+
self.path = f"{project_name}{f'/{folder_name}' if folder_name != 'root' else ''}"
1516
return self
1617

1718
@staticmethod
@@ -30,13 +31,15 @@ class TmpImageEntity(Entity):
3031
segmentation_status: Optional[SegmentationStatus] = Field(
3132
SegmentationStatus.NOT_STARTED
3233
)
33-
approval_status: Optional[int] = Field(None)
34+
approval_status: Optional[ApprovalStatus] = Field(None)
3435

3536
class Config:
3637
extra = Extra.ignore
3738

3839

3940
class VideoEntity(Entity):
41+
approval_status: Optional[ApprovalStatus] = Field(None)
42+
4043
class Config:
4144
extra = Extra.ignore
4245

src/superannotate/lib/core/enums.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,12 @@ class SegmentationStatus(BaseTitledEnum):
127127
FAILED = "Failed", 4
128128

129129

130+
class ApprovalStatus(BaseTitledEnum):
131+
NONE = None, 0
132+
DISAPPROVED = "disapproved", 1
133+
APPROVED = "approved", 2
134+
135+
130136
class ProjectState(BaseTitledEnum):
131137
NOT_SYNCED = "Not synced", 1
132138
SYNCED = "Synced", 2

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from lib.core.entities import Entity
1010
from lib.core.entities import FolderEntity
1111
from lib.core.entities import ProjectEntity
12-
from lib.core.entities import TmpBaseEntity
1312
from lib.core.entities import TmpImageEntity
1413
from lib.core.entities import VideoEntity
1514
from lib.core.exceptions import AppException
@@ -20,7 +19,6 @@
2019
from lib.core.response import Response
2120
from lib.core.serviceproviders import SuperannotateServiceProvider
2221
from lib.core.usecases.base import BaseReportableUseCae
23-
from pydantic import parse_obj_as
2422

2523

2624
class GetItem(BaseReportableUseCae):
@@ -113,12 +111,12 @@ def execute(self) -> Response:
113111
folder_id=None if self._folder.name == "root" else self._folder.uuid,
114112
)
115113
if service_response.ok:
116-
data = parse_obj_as(
117-
List[TmpBaseEntity],
118-
[Entity.map_fields(i) for i in service_response.data],
119-
)
120-
for i, item in enumerate(data):
121-
data[i] = GetItem.serialize_entity(item, self._project)
114+
data = []
115+
for i, item in enumerate(service_response.data):
116+
tmp_item = GetItem.serialize_entity(Entity(**Entity.map_fields(item)), self._project)
117+
folder_path = f"{'/' + item['folder_name'] if not item['is_root_folder'] else ''}"
118+
tmp_item.path = f"{self._project.name}" + folder_path
119+
data.append(tmp_item)
122120
self._response.data = data
123121
else:
124122
self._response.errors = service_response.data

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ def validate_fuse(self):
7474
def validate_folder_names(self):
7575
if self._folder_names:
7676
condition = (
77-
Condition("team_id", self._project.team_id, EQ) &
78-
Condition("project_id", self._project.id, EQ)
77+
Condition("team_id", self._project.team_id, EQ)
78+
& Condition("project_id", self._project.id, EQ)
7979
)
8080
existing_folders = {folder.name for folder in self._folders.get_all(condition)}
8181
folder_names_set = set(self._folder_names)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ def execute(self):
546546
self._project_to_create.upload_state = (
547547
constances.UploadState.INITIAL.value
548548
)
549+
self._project_to_create.status = constances.ProjectStatus.NotStarted.value
549550
project = self._projects.insert(self._project_to_create)
550551
self.reporter.log_info(
551552
f"Created project {self._project_to_create.name} with type"

src/superannotate/lib/infrastructure/services.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,10 @@ def get_annotations(
10751075
reporter: Reporter,
10761076
) -> List[dict]:
10771077
import nest_asyncio
1078+
import platform
1079+
1080+
if platform.system().lower() == 'windows':
1081+
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
10781082

10791083
nest_asyncio.apply()
10801084

@@ -1140,6 +1144,7 @@ def saqul_query(
11401144
params = {
11411145
"team_id": team_id,
11421146
"project_id": project_id,
1147+
"includeFolderNames": True
11431148
}
11441149
if folder_id:
11451150
params["folder_id"] = folder_id

src/superannotate/version.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
__version__ = "4.3.3b1"
2-
1+
__version__ = "4.3.4dev1"

tests/integration/items/test_get_item_metadata.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,19 @@ def test_get_item_metadata(self):
2727
self.PROJECT_NAME, self.folder_path, annotation_status="InProgress"
2828
)
2929
item_metadata = sa.get_item_metadata(self.PROJECT_NAME, self.IMAGE_NAME)
30-
assert item_metadata["path"] == f"{self.PROJECT_NAME}/{self.IMAGE_NAME}"
30+
assert item_metadata["path"] == f"{self.PROJECT_NAME}"
3131
assert item_metadata["prediction_status"] == "NotStarted"
3232
assert item_metadata["segmentation_status"] == None
3333
assert item_metadata["annotation_status"] == "InProgress"
34+
assert item_metadata["approval_status"] == None
3435

3536
def test_attached_items_paths(self):
3637
sa.attach_image_urls_to_project(self.PROJECT_NAME, self.scv_path)
3738
sa.add_contributors_to_project(self.PROJECT_NAME, ["shab.prog@gmail.com"], "QA")
3839
sa.assign_images(self.PROJECT_NAME, [self.ATTACHED_IMAGE_NAME], "shab.prog@gmail.com")
3940
item = sa.get_item_metadata(self.PROJECT_NAME, self.ATTACHED_IMAGE_NAME)
4041
assert item["url"] == 'https://drive.google.com/uc?export=download&id=1vwfCpTzcjxoEA4hhDxqapPOVvLVeS7ZS'
41-
assert item["path"] == f"{self.PROJECT_NAME}/{self.ATTACHED_IMAGE_NAME}"
42+
assert item["path"] == f"{self.PROJECT_NAME}"
4243

4344

4445
class TestGetEntityMetadataPixel(BaseTestCase):
@@ -57,7 +58,7 @@ def test_get_item_metadata(self):
5758
self.PROJECT_NAME, self.folder_path, annotation_status="InProgress"
5859
)
5960
item_metadata = sa.get_item_metadata(self.PROJECT_NAME, self.IMAGE_NAME)
60-
assert item_metadata["path"] == f"{self.PROJECT_NAME}/{self.IMAGE_NAME}"
61+
assert item_metadata["path"] == f"{self.PROJECT_NAME}"
6162
assert item_metadata["prediction_status"] == "NotStarted"
6263
assert item_metadata["segmentation_status"] == "NotStarted"
6364
assert item_metadata["annotation_status"] == "InProgress"
@@ -84,6 +85,6 @@ def test_get_item_metadata(self):
8485
]
8586
)
8687
item_metadata = sa.get_item_metadata(self.PROJECT_NAME, self.ITEM_NAME)
87-
assert item_metadata["path"] == f"{self.PROJECT_NAME}/{self.ITEM_NAME}"
88+
assert item_metadata["path"] == f"{self.PROJECT_NAME}"
8889
assert "prediction_status" not in item_metadata
8990
assert "segmentation_status" not in item_metadata

tests/integration/items/test_saqul_query.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class TestEntitiesSearchVector(BaseTestCase):
99
PROJECT_NAME = "TestEntitiesSearchVector"
1010
PROJECT_DESCRIPTION = "TestEntitiesSearchVector"
1111
PROJECT_TYPE = "Vector"
12+
FOLDER_NAME = "test_folder"
1213
TEST_FOLDER_PATH = "data_set/sample_project_vector"
1314
TEST_QUERY = "instance(type =bbox )"
1415
TEST_INVALID_QUERY = "!instance(type =bbox )!"
@@ -18,19 +19,20 @@ def folder_path(self):
1819
return os.path.join(Path(__file__).parent.parent.parent, self.TEST_FOLDER_PATH)
1920

2021
def test_query(self):
22+
sa.create_folder(self.PROJECT_NAME, self.FOLDER_NAME)
2123
sa.upload_images_from_folder_to_project(
22-
self.PROJECT_NAME, self.folder_path, annotation_status="InProgress"
24+
f"{self.PROJECT_NAME}/{self.FOLDER_NAME}", self.folder_path, annotation_status="InProgress"
2325
)
2426
sa.create_annotation_classes_from_classes_json(
2527
self.PROJECT_NAME, f"{self.folder_path}/classes/classes.json"
2628
)
2729
_, _, _ = sa.upload_annotations_from_folder_to_project(
28-
self.PROJECT_NAME, self.folder_path
30+
f"{self.PROJECT_NAME}/{self.FOLDER_NAME}", self.folder_path
2931
)
3032

31-
entities = sa.query(self.PROJECT_NAME, self.TEST_QUERY)
33+
entities = sa.query(f"{self.PROJECT_NAME}/{self.FOLDER_NAME}", self.TEST_QUERY)
3234
self.assertEqual(len(entities), 1)
33-
assert all([entity["path"] is None for entity in entities])
35+
assert all([entity["path"] == f"{self.PROJECT_NAME}/{self.FOLDER_NAME}" for entity in entities])
3436

3537
def test_validate_saqul_query(self):
3638
try:

0 commit comments

Comments
 (0)