Skip to content

Commit 04904fb

Browse files
committed
Added ability to filter by item category
1 parent abfa5b3 commit 04904fb

File tree

12 files changed

+129
-12
lines changed

12 files changed

+129
-12
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3418,7 +3418,7 @@ def list_items(
34183418
exclude = {"meta", "annotator_email", "qa_email"}
34193419
if not include_custom_metadata:
34203420
exclude.add("custom_metadata")
3421-
return BaseSerializer.serialize_iterable(res, exclude=exclude)
3421+
return BaseSerializer.serialize_iterable(res, exclude=exclude, by_alias=False)
34223422

34233423
def list_projects(
34243424
self,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from lib.core.entities.classes import AnnotationClassEntity
55
from lib.core.entities.folder import FolderEntity
66
from lib.core.entities.integrations import IntegrationEntity
7+
from lib.core.entities.items import CategoryEntity
78
from lib.core.entities.items import ClassificationEntity
89
from lib.core.entities.items import DocumentEntity
910
from lib.core.entities.items import ImageEntity
@@ -12,7 +13,6 @@
1213
from lib.core.entities.items import TiledEntity
1314
from lib.core.entities.items import VideoEntity
1415
from lib.core.entities.project import AttachmentEntity
15-
from lib.core.entities.project import CategoryEntity
1616
from lib.core.entities.project import ContributorEntity
1717
from lib.core.entities.project import CustomFieldEntity
1818
from lib.core.entities.project import ProjectEntity

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class ItemFilters(BaseFilters):
2929
assignments__user_role__in: Optional[List[str]]
3030
assignments__user_role__ne: Optional[str]
3131
assignments__user_role__notin: Optional[List[str]]
32+
categories__value: Optional[str]
33+
categories__value__in: Optional[List[str]]
3234

3335

3436
class ProjectFilters(BaseFilters):

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Optional
33

44
from lib.core.entities.base import BaseItemEntity
5-
from lib.core.entities.base import TimedBaseModel
5+
from lib.core.entities.project import TimedBaseModel
66
from lib.core.enums import ApprovalStatus
77
from lib.core.enums import ProjectType
88
from lib.core.pydantic_v1 import Extra
@@ -18,9 +18,17 @@ class Config:
1818
extra = Extra.ignore
1919

2020

21+
class CategoryEntity(TimedBaseModel):
22+
id: int
23+
value: str = Field(None, alias="name")
24+
25+
class Config:
26+
extra = Extra.ignore
27+
28+
2129
class MultiModalItemCategoryEntity(TimedBaseModel):
2230
id: int = Field(None, alias="category_id")
23-
name: str = Field(None, alias="category_name")
31+
value: str = Field(None, alias="category_name")
2432

2533
class Config:
2634
extra = Extra.ignore

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,3 @@ def is_system(self):
187187

188188
class Config:
189189
extra = Extra.ignore
190-
191-
192-
class CategoryEntity(BaseModel):
193-
id: Optional[int]
194-
name: Optional[str]

src/superannotate/lib/core/serviceproviders.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -696,6 +696,12 @@ class BaseServiceProvider:
696696
def get_role_id(self, project: entities.ProjectEntity, role_name: str) -> int:
697697
raise NotImplementedError
698698

699+
@abstractmethod
700+
def get_category_id(
701+
self, project: entities.ProjectEntity, category_name: str
702+
) -> int:
703+
raise NotImplementedError
704+
699705
@abstractmethod
700706
def get_role_name(self, project: entities.ProjectEntity, role_id: int) -> str:
701707
raise NotImplementedError

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,8 +2098,10 @@ def execute(self):
20982098
if categorization_enabled:
20992099
item_id_category_map = {}
21002100
for item_name in uploaded_annotations:
2101-
category = name_annotation_map[item_name]["metadata"].get(
2102-
"item_category"
2101+
category = (
2102+
name_annotation_map[item_name]["metadata"]
2103+
.get("item_category", {})
2104+
.get("value")
21032105
)
21042106
if category:
21052107
item_id_category_map[name_item_map[item_name].id] = category

src/superannotate/lib/infrastructure/annotation_adapter.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ def get_component_value(self, component_id: str):
4444
return None
4545

4646
def set_component_value(self, component_id: str, value: Any):
47-
self.annotation.setdefault("data", {}).setdefault(component_id, {})["value"] = value
47+
self.annotation.setdefault("data", {}).setdefault(component_id, {})[
48+
"value"
49+
] = value
4850
return self
4951

5052

src/superannotate/lib/infrastructure/query_builder.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ def handle(self, filters: Dict[str, Any], query: Query = None) -> Query:
113113
for key, val in filters.items():
114114
_keys = key.split("__")
115115
val = self._handle_special_fields(_keys, val)
116+
if _keys[0] == "categories" and _keys[1] == "value":
117+
_keys[1] = "category_id"
116118
condition, _key = determine_condition_and_key(_keys)
117119
query &= Filter(_key, val, condition)
118120
return super().handle(filters, query)
@@ -147,6 +149,14 @@ def _handle_special_fields(self, keys: List[str], val):
147149
]
148150
else:
149151
val = self._service_provider.get_role_id(self._project, val)
152+
elif keys[0] == "categories" and keys[1] == "value":
153+
if isinstance(val, list):
154+
val = [
155+
self._service_provider.get_category_id(self._project, i)
156+
for i in val
157+
]
158+
else:
159+
val = self._service_provider.get_category_id(self._project, val)
150160
return val
151161

152162

src/superannotate/lib/infrastructure/serviceprovider.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ def list_custom_field_names(self, entity: CustomFieldEntityEnum) -> List[str]:
7979
self.client.team_id, entity=entity
8080
)
8181

82+
def get_category_id(
83+
self, project: entities.ProjectEntity, category_name: str
84+
) -> int:
85+
return self._cached_work_management_repository.get_category_id(
86+
project, category_name
87+
)
88+
8289
def get_custom_field_id(
8390
self, field_name: str, entity: CustomFieldEntityEnum
8491
) -> int:

0 commit comments

Comments
 (0)