Skip to content

Commit f48347c

Browse files
authored
Merge pull request #857 from superannotateai/FRIDAY-5185
feat(sdk): accept project/folder IDs across SDK methods
2 parents e248ee5 + c0ceefa commit f48347c

1 file changed

Lines changed: 29 additions & 79 deletions

File tree

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

Lines changed: 29 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@
7171
from lib.infrastructure.annotation_adapter import BaseMultimodalAnnotationAdapter
7272
from lib.infrastructure.annotation_adapter import MultimodalSmallAnnotationAdapter
7373
from lib.infrastructure.annotation_adapter import MultimodalLargeAnnotationAdapter
74-
from lib.infrastructure.utils import extract_project_folder
7574
from lib.infrastructure.validators import wrap_error
7675
from lib.app.serializers import WMProjectSerializer
7776
from lib.core.entities.work_managament import WMUserTypeEnum
@@ -322,7 +321,7 @@ def get_project_by_id(self, project_id: int):
322321
:return: project metadata
323322
:rtype: dict
324323
"""
325-
response = self.controller.get_project_by_id(project_id=project_id)
324+
response = self.controller.get_project(project_id=project_id)
326325

327326
return ProjectSerializer(response.data).serialize()
328327

@@ -372,7 +371,7 @@ def get_item_by_id(
372371
:return: item metadata
373372
:rtype: dict
374373
"""
375-
project_response = self.controller.get_project_by_id(project_id=project_id)
374+
project_response = self.controller.get_project(project_id=project_id)
376375
project_response.raise_for_status()
377376

378377
if (
@@ -714,10 +713,7 @@ def list_users(
714713
715714
"""
716715
if project is not None:
717-
if isinstance(project, int):
718-
project = self.controller.get_project_by_id(project).data
719-
else:
720-
project = self.controller.get_project(project)
716+
project = self.controller.get_project(project)
721717
response = BaseSerializer.serialize_iterable(
722718
self.controller.work_management.list_users(
723719
project=project, include=include, **filters
@@ -958,11 +954,7 @@ def set_contributors_categories(
958954
if not categories:
959955
AppException("Categories should be a list of strings or '*'.")
960956

961-
project = (
962-
self.controller.get_project_by_id(project).data
963-
if isinstance(project, int)
964-
else self.controller.get_project(project)
965-
)
957+
project = self.controller.get_project(project)
966958
self.controller.check_multimodal_project_categorization(project)
967959

968960
self.controller.work_management.set_remove_contributor_categories(
@@ -1008,11 +1000,7 @@ def remove_contributors_categories(
10081000
if not categories:
10091001
AppException("Categories should be a list of strings or '*'.")
10101002

1011-
project = (
1012-
self.controller.get_project_by_id(project).data
1013-
if isinstance(project, int)
1014-
else self.controller.get_project(project)
1015-
)
1003+
project = self.controller.get_project(project)
10161004
self.controller.check_multimodal_project_categorization(project)
10171005

10181006
self.controller.work_management.set_remove_contributor_categories(
@@ -1064,11 +1052,7 @@ def retrieve_context(
10641052
raise e
10651053
return False, None
10661054

1067-
project = (
1068-
self.controller.get_project_by_id(project).data
1069-
if isinstance(project, int)
1070-
else self.controller.get_project(project)
1071-
)
1055+
project = self.controller.get_project(project)
10721056
if project.type != ProjectType.MULTIMODAL:
10731057
raise AppException(
10741058
"This function is only supported for Multimodal projects."
@@ -1429,11 +1413,7 @@ def create_categories(
14291413
if not categories:
14301414
raise AppException("Categories should be a list of strings.")
14311415

1432-
project = (
1433-
self.controller.get_project_by_id(project).data
1434-
if isinstance(project, int)
1435-
else self.controller.get_project(project)
1436-
)
1416+
project = self.controller.get_project(project)
14371417
self.controller.check_multimodal_project_categorization(project)
14381418

14391419
response = (
@@ -1483,11 +1463,7 @@ def list_categories(self, project: NotEmptyStr | int):
14831463
]
14841464
14851465
"""
1486-
project = (
1487-
self.controller.get_project_by_id(project).data
1488-
if isinstance(project, int)
1489-
else self.controller.get_project(project)
1490-
)
1466+
project = self.controller.get_project(project)
14911467
self.controller.check_multimodal_project_categorization(project)
14921468

14931469
response = (
@@ -1529,11 +1505,7 @@ def remove_categories(
15291505
if not categories:
15301506
AppException("Categories should be a list of strings or '*'.")
15311507

1532-
project = (
1533-
self.controller.get_project_by_id(project).data
1534-
if isinstance(project, int)
1535-
else self.controller.get_project(project)
1536-
)
1508+
project = self.controller.get_project(project)
15371509
self.controller.check_multimodal_project_categorization(project)
15381510

15391511
query = EmptyQuery()
@@ -1589,16 +1561,14 @@ def create_folder(self, project: NotEmptyStr | int, folder_name: NotEmptyStr):
15891561
if res.errors:
15901562
raise AppException(res.errors)
15911563

1592-
def delete_project(self, project: NotEmptyStr | dict):
1564+
def delete_project(self, project: NotEmptyStr | int):
15931565
"""Deletes the project
15941566
1595-
:param project: project name
1567+
:param project: project name or ID
15961568
:type project: str
15971569
"""
1598-
name = project
1599-
if isinstance(project, dict):
1600-
name = project["name"]
1601-
self.controller.projects.delete(name=name)
1570+
project = self.controller.get_project(project)
1571+
self.controller.projects.delete(name=project.name)
16021572

16031573
def rename_project(self, project: NotEmptyStr | int, new_name: NotEmptyStr):
16041574
"""Renames the project
@@ -1868,11 +1838,7 @@ def list_folders(
18681838
}
18691839
]
18701840
"""
1871-
project_entity = (
1872-
self.controller.get_project_by_id(project).data
1873-
if isinstance(project, int)
1874-
else self.controller.get_project(project)
1875-
)
1841+
project_entity = self.controller.get_project(project)
18761842

18771843
valid_fields = FolderFilters.__annotations__
18781844
chain = QueryBuilderChain(
@@ -2410,11 +2376,7 @@ def set_project_custom_field(
24102376
value=1738671238.759,
24112377
)
24122378
"""
2413-
project = (
2414-
self.controller.get_project_by_id(project).data
2415-
if isinstance(project, int)
2416-
else self.controller.get_project(project)
2417-
)
2379+
project = self.controller.get_project(project)
24182380
self.controller.work_management.set_custom_field_value(
24192381
entity_id=project.id,
24202382
field_name=custom_field_name,
@@ -2868,9 +2830,9 @@ def prepare_export(
28682830
28692831
client.download_export("Project Name", export, "path_to_download")
28702832
"""
2871-
project, folder = self.controller.get_project_folder(project)
2833+
project = self.controller.get_project(project)
28722834
if folder_names is None:
2873-
folders = [folder.name] if folder else []
2835+
folders = []
28742836
else:
28752837
folders = folder_names
28762838
integration_name = kwargs.get("integration_name")
@@ -2933,11 +2895,7 @@ def delete_exports(
29332895
exports="*"
29342896
)
29352897
"""
2936-
project_entity = (
2937-
self.controller.get_project_by_id(project).data
2938-
if isinstance(project, int)
2939-
else self.controller.get_project(project)
2940-
)
2898+
project_entity = self.controller.get_project(project)
29412899
response = self.controller.delete_exports(
29422900
project=project_entity, exports=exports
29432901
)
@@ -3268,7 +3226,7 @@ def delete_annotation_class(
32683226
raise AppException(wrap_error(e))
32693227
else:
32703228
annotation_class = AnnotationClassEntity(**annotation_class)
3271-
project = self.controller.projects.get_by_name(project).data
3229+
project = self.controller.get_project(project)
32723230

32733231
self.controller.annotation_classes.delete(
32743232
project=project, annotation_class=annotation_class
@@ -3641,15 +3599,17 @@ def upload_annotations_from_folder_to_project(
36413599
:rtype: tuple of list of strs
36423600
"""
36433601

3644-
project_name, folder_name = extract_project_folder(project)
3602+
project, folder = self.controller.get_project_folder(project)
36453603
if keep_status is not None:
36463604
warnings.warn(
36473605
DeprecationWarning(
36483606
"The “keep_status” parameter is deprecated. "
36493607
"Please use the “set_annotation_statuses” function instead."
36503608
)
36513609
)
3652-
project_folder_name = project_name + (f"/{folder_name}" if folder_name else "")
3610+
project_folder_name = project.name + (
3611+
f"/{folder.name}" if not folder.is_root else ""
3612+
)
36533613

36543614
if recursive_subfolders:
36553615
logger.info(
@@ -3668,7 +3628,6 @@ def upload_annotations_from_folder_to_project(
36683628
logger.info(
36693629
f"Uploading {len(annotation_paths)} annotations from {folder_path} to the project {project_folder_name}."
36703630
)
3671-
project, folder = self.controller.get_project_folder(project)
36723631
response = self.controller.annotations.upload_from_folder(
36733632
project=project,
36743633
folder=folder,
@@ -3715,7 +3674,6 @@ def upload_image_annotations(
37153674
37163675
"""
37173676

3718-
_, folder_name = extract_project_folder(project)
37193677
if keep_status is not None:
37203678
warnings.warn(
37213679
DeprecationWarning(
@@ -3732,9 +3690,6 @@ def upload_image_annotations(
37323690
logger.info("Uploading annotations from %s.", annotation_json)
37333691
with open(annotation_json, "rb") as f:
37343692
annotation_json = json.load(f)
3735-
folder = self.controller.get_folder(project, folder_name)
3736-
if not folder:
3737-
raise AppException("Folder not found.")
37383693

37393694
items = self.controller.items.list_items(project, folder, name=image_name)
37403695
image = next(iter(items), None)
@@ -4161,7 +4116,9 @@ def upload_priority_scores(
41614116
"""
41624117
scores = TypeAdapter(list[PriorityScoreEntity]).validate_python(scores)
41634118
project, folder = self.controller.get_project_folder(project)
4164-
project_folder_name = project.name + "" if folder.is_root else f"/{folder.name}"
4119+
project_folder_name = project.name + (
4120+
"" if folder.is_root else f"/{folder.name}"
4121+
)
41654122
response = self.controller.projects.upload_priority_scores(
41664123
project, folder, scores, project_folder_name
41674124
)
@@ -4693,11 +4650,7 @@ def list_items(
46934650
assignee__user_id="qa@example.com"
46944651
)
46954652
"""
4696-
project = (
4697-
self.controller.get_project_by_id(project).data
4698-
if isinstance(project, int)
4699-
else self.controller.get_project(project)
4700-
)
4653+
project = self.controller.get_project(project)
47014654
if (
47024655
include
47034656
and "categories" in include
@@ -5294,10 +5247,7 @@ def download_annotations(
52945247
52955248
52965249
"""
5297-
project_name, folder_name = extract_project_folder(project)
5298-
project, folder = self.controller.get_project_folder(
5299-
(project_name, folder_name)
5300-
)
5250+
project, folder = self.controller.get_project_folder(project)
53015251
response = self.controller.annotations.download(
53025252
project=project,
53035253
folder=folder,
@@ -5823,7 +5773,7 @@ def item_context(
58235773
project = self.controller.get_project(path[0])
58245774
folder = self.controller.get_folder(project, path[1])
58255775
elif len(path) == 2 and all([isinstance(i, int) for i in path]):
5826-
project = self.controller.get_project_by_id(path[0]).data
5776+
project = self.controller.get_project(path[0]).data
58275777
folder = self.controller.get_folder_by_id(path[1], project.id).data
58285778
else:
58295779
raise AppException("Invalid path provided.")

0 commit comments

Comments
 (0)