Skip to content

Commit 4e3a54a

Browse files
nareksaNarek Mkhitaryan
authored andcommitted
Merge pull request #772 from superannotateai/FRIDAY_3644_v2
Add shortcuts
2 parents 38d8106 + f5c294f commit 4e3a54a

File tree

3 files changed

+74
-93
lines changed

3 files changed

+74
-93
lines changed

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

Lines changed: 24 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575

7676
logger = logging.getLogger("sa")
7777

78-
# NotEmptyStr = TypeVar("NotEmptyStr", bound=constr(strict=True, min_length=1))
7978
NotEmptyStr = constr(strict=True, min_length=1)
8079

8180
PROJECT_STATUS = Literal["NotStarted", "InProgress", "Completed", "OnHold"]
@@ -666,26 +665,11 @@ def get_user_scores(
666665
},
667666
]
668667
"""
669-
670-
if isinstance(project, str):
671-
project_name, folder_name = extract_project_folder(project)
672-
project, folder = self.controller.get_project_folder(
673-
project_name, folder_name
674-
)
675-
else:
676-
project_pk, folder_pk = project
677-
if isinstance(project_pk, int) and isinstance(folder_pk, int):
678-
project = self.controller.get_project_by_id(project_pk).data
679-
folder = self.controller.get_folder_by_id(folder_pk, project.id).data
680-
elif isinstance(project_pk, str) and isinstance(folder_pk, str):
681-
project = self.controller.get_project(project_pk)
682-
folder = self.controller.get_folder(project, folder_pk)
683-
else:
684-
raise AppException("Provided project param is not valid.")
668+
project, folder = self.controller.get_project_folder(project)
669+
item = self.controller.get_item(project=project, folder=folder, item=item)
685670
response = BaseSerializer.serialize_iterable(
686671
self.controller.work_management.get_user_scores(
687672
project=project,
688-
folder=folder,
689673
item=item,
690674
scored_user=scored_user,
691675
provided_score_names=score_names,
@@ -744,24 +728,10 @@ def set_user_scores(
744728
)
745729
746730
"""
747-
if isinstance(project, str):
748-
project_name, folder_name = extract_project_folder(project)
749-
project, folder = self.controller.get_project_folder(
750-
project_name, folder_name
751-
)
752-
else:
753-
project_pk, folder_pk = project
754-
if isinstance(project_pk, int) and isinstance(folder_pk, int):
755-
project = self.controller.get_project_by_id(project_pk).data
756-
folder = self.controller.get_folder_by_id(folder_pk, project.id).data
757-
elif isinstance(project_pk, str) and isinstance(folder_pk, str):
758-
project = self.controller.get_project(project_pk)
759-
folder = self.controller.get_folder(project, folder_pk)
760-
else:
761-
raise AppException("Provided project param is not valid.")
731+
project, folder = self.controller.get_project_folder(project)
732+
item = self.controller.get_item(project=project, folder=folder, item=item)
762733
self.controller.work_management.set_user_scores(
763734
project=project,
764-
folder=folder,
765735
item=item,
766736
scored_user=scored_user,
767737
scores=scores,
@@ -1170,7 +1140,7 @@ def get_folder_metadata(self, project: NotEmptyStr, folder_name: NotEmptyStr):
11701140
:return: metadata of folder
11711141
:rtype: dict
11721142
"""
1173-
project, folder = self.controller.get_project_folder(project, folder_name)
1143+
project, folder = self.controller.get_project_folder((project, folder_name))
11741144
if not folder:
11751145
raise AppException("Folder not found.")
11761146
return BaseSerializer(folder).serialize(exclude={"completedCount", "is_root"})
@@ -1722,7 +1692,9 @@ def assign_folder(
17221692

17231693
if not verified_users:
17241694
return
1725-
project, folder = self.controller.get_project_folder(project_name, folder_name)
1695+
project, folder = self.controller.get_project_folder(
1696+
(project_name, folder_name)
1697+
)
17261698
response = self.controller.folders.assign_users(
17271699
project=project,
17281700
folder=folder,
@@ -2680,7 +2652,9 @@ def upload_annotations_from_folder_to_project(
26802652
logger.info(
26812653
f"Uploading {len(annotation_paths)} annotations from {folder_path} to the project {project_folder_name}."
26822654
)
2683-
project, folder = self.controller.get_project_folder(project_name, folder_name)
2655+
project, folder = self.controller.get_project_folder(
2656+
(project_name, folder_name)
2657+
)
26842658
response = self.controller.annotations.upload_from_folder(
26852659
project=project,
26862660
folder=folder,
@@ -3179,7 +3153,9 @@ def upload_priority_scores(self, project: NotEmptyStr, scores: List[PriorityScor
31793153
scores = parse_obj_as(List[PriorityScoreEntity], scores)
31803154
project_name, folder_name = extract_project_folder(project)
31813155
project_folder_name = project
3182-
project, folder = self.controller.get_project_folder(project_name, folder_name)
3156+
project, folder = self.controller.get_project_folder(
3157+
(project_name, folder_name)
3158+
)
31833159
response = self.controller.projects.upload_priority_scores(
31843160
project, folder, scores, project_folder_name
31853161
)
@@ -3900,7 +3876,7 @@ def attach_items(
39003876
f"Attaching {len(_unique_attachments)} file(s) to project {project}."
39013877
)
39023878
project, folder = self.controller.get_project_folder(
3903-
project_name, folder_name
3879+
(project_name, folder_name)
39043880
)
39053881
response = self.controller.items.attach(
39063882
project=project,
@@ -4128,7 +4104,9 @@ def download_annotations(
41284104
:rtype: str
41294105
"""
41304106
project_name, folder_name = extract_project_folder(project)
4131-
project, folder = self.controller.get_project_folder(project_name, folder_name)
4107+
project, folder = self.controller.get_project_folder(
4108+
(project_name, folder_name)
4109+
)
41324110
response = self.controller.annotations.download(
41334111
project=project,
41344112
folder=folder,
@@ -4408,7 +4386,9 @@ def upload_custom_values(
44084386
"""
44094387

44104388
project_name, folder_name = extract_project_folder(project)
4411-
project, folder = self.controller.get_project_folder(project_name, folder_name)
4389+
project, folder = self.controller.get_project_folder(
4390+
(project_name, folder_name)
4391+
)
44124392
response = self.controller.custom_fields.upload_values(
44134393
project=project, folder=folder, items=items
44144394
)
@@ -4445,7 +4425,9 @@ def delete_custom_values(
44454425
)
44464426
"""
44474427
project_name, folder_name = extract_project_folder(project)
4448-
project, folder = self.controller.get_project_folder(project_name, folder_name)
4428+
project, folder = self.controller.get_project_folder(
4429+
(project_name, folder_name)
4430+
)
44494431
response = self.controller.custom_fields.delete_values(
44504432
project=project, folder=folder, items=items
44514433
)

src/superannotate/lib/infrastructure/controller.py

Lines changed: 49 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -266,38 +266,21 @@ def update_user_activity(
266266
)
267267
res.raise_for_status()
268268

269-
def _get_score_item(self, item: Union[int, str], project_id: int, folder_id: int):
270-
if isinstance(item, int):
271-
item = self.service_provider.item_service.get(
272-
project_id=project_id, item_id=item
273-
).data
274-
else:
275-
items = self.service_provider.item_service.list(
276-
project_id, folder_id, Filter("name", item, OperatorEnum.EQ)
277-
)
278-
item = next(iter(items), None)
279-
if not item:
280-
raise AppException("Item not found.")
281-
return item
282-
283269
def get_user_scores(
284270
self,
285271
project: ProjectEntity,
286-
folder: FolderEntity,
287-
item: Union[int, str],
272+
item: BaseItemEntity,
288273
scored_user: str,
289274
provided_score_names: Optional[List[str]] = None,
290275
):
291-
item = self._get_score_item(item, project.id, folder.id)
292-
293276
score_fields_res = self.service_provider.work_management.list_scores()
294277

295278
# validate provided score names
296279
all_score_names = [s.name for s in score_fields_res.data]
297280
if provided_score_names and set(provided_score_names) - set(all_score_names):
298281
raise AppException("Please provide valid score names.")
299282

300-
score_id_field_options_map = {s.id: s for s in score_fields_res.data}
283+
score_id_form_entity_map = {s.id: s for s in score_fields_res.data}
301284

302285
score_values = self.service_provider.telemetry_scoring.get_score_values(
303286
project_id=project.id, item_id=item.id, user_id=scored_user
@@ -306,18 +289,18 @@ def get_user_scores(
306289

307290
scores = []
308291
for s_id, s_values in score_id_values_map.items():
309-
score_field = score_id_field_options_map.get(s_id)
310-
if score_field:
292+
score_entity = score_id_form_entity_map.get(s_id)
293+
if score_entity:
311294
score = ScoreEntity(
312295
id=s_id,
313-
name=score_field.name,
296+
name=score_entity.name,
314297
value=s_values.value,
315298
weight=s_values.weight,
316-
createdAt=score_field.createdAt,
317-
updatedAt=score_field.updatedAt,
299+
createdAt=score_entity.createdAt,
300+
updatedAt=score_entity.updatedAt,
318301
)
319302
if provided_score_names:
320-
if score_field.name in provided_score_names:
303+
if score_entity.name in provided_score_names:
321304
scores.append(score)
322305
else:
323306
scores.append(score)
@@ -352,37 +335,33 @@ def _validate_scores(
352335
def set_user_scores(
353336
self,
354337
project: ProjectEntity,
355-
folder: FolderEntity,
356-
item: Union[int, str],
338+
item: BaseItemEntity,
357339
scored_user: str,
358340
scores: List[Dict[str, Any]],
359341
):
360-
item = self._get_score_item(item, project.id, folder.id)
361-
362-
filters = {"email": scored_user}
363-
users = self.list_users(project=project, **filters)
342+
users = self.list_users(project=project, email=scored_user)
364343
if not users:
365-
raise AppException("Please provide a valid email assigned to the project.")
344+
raise AppException("User not found.")
366345
user = users[0]
367-
user_role = user.role
368-
user.role = self.service_provider.get_role_name(project, int(user_role))
346+
role_id = user.role
347+
role_name = self.service_provider.get_role_name(project, int(role_id))
369348

370-
score_fields_res = self.service_provider.work_management.list_scores()
371-
all_score_names = [s.name for s in score_fields_res.data]
372-
score_name_field_options_map = {s.name: s for s in score_fields_res.data}
349+
score_name_field_options_map = {
350+
s.name: s for s in self.service_provider.work_management.list_scores().data
351+
}
373352

374353
# get validate scores
375354
scores: List[ScorePayloadEntity] = self._validate_scores(
376-
scores, all_score_names
355+
scores, list(score_name_field_options_map.keys())
377356
)
378357

379358
scores_to_create: List[dict] = []
380359
for s in scores:
381360
score_to_create = {
382361
"item_id": item.id,
383362
"score_id": score_name_field_options_map[s.name].id,
384-
"user_role_name": user.role,
385-
"user_role": user_role,
363+
"user_role_name": role_name,
364+
"user_role": role_id,
386365
"user_id": user.email,
387366
"value": s.value,
388367
"weight": s.weight,
@@ -1488,14 +1467,7 @@ def get_project_folder_by_path(
14881467
self, path: Union[str, Path]
14891468
) -> Tuple[ProjectEntity, FolderEntity]:
14901469
project_name, folder_name = extract_project_folder(path)
1491-
return self.get_project_folder(project_name, folder_name)
1492-
1493-
def get_project_folder(
1494-
self, project_name: str, folder_name: str = None
1495-
) -> Tuple[ProjectEntity, FolderEntity]:
1496-
project = self.get_project(project_name)
1497-
folder = self.get_folder(project, folder_name)
1498-
return project, folder
1470+
return self.get_project_folder((project_name, folder_name))
14991471

15001472
def get_project(self, name: str) -> ProjectEntity:
15011473
project = self.projects.get_by_name(name).data
@@ -1865,3 +1837,32 @@ def query_items_count(self, project_name: str, query: str = None) -> int:
18651837
if response.errors:
18661838
raise AppException(response.errors)
18671839
return response.data["count"]
1840+
1841+
def get_project_folder(
1842+
self, path: Union[str, Tuple[int, int], Tuple[str, str]]
1843+
) -> Tuple[ProjectEntity, Optional[FolderEntity]]:
1844+
if isinstance(path, str):
1845+
project_name, folder_name = extract_project_folder(path)
1846+
project = self.get_project(project_name)
1847+
return project, self.get_folder(project, folder_name)
1848+
1849+
if isinstance(path, tuple) and len(path) == 2:
1850+
project_pk, folder_pk = path
1851+
if all(isinstance(x, int) for x in path):
1852+
return (
1853+
self.get_project_by_id(project_pk).data,
1854+
self.get_folder_by_id(folder_pk, project_pk).data,
1855+
)
1856+
if all(isinstance(x, str) for x in path):
1857+
project = self.get_project(project_pk)
1858+
return project, self.get_folder(project, folder_pk)
1859+
1860+
raise AppException("Provided project param is not valid.")
1861+
1862+
def get_item(
1863+
self, project: ProjectEntity, folder: FolderEntity, item: Union[int, str]
1864+
) -> BaseItemEntity:
1865+
if isinstance(item, int):
1866+
return self.get_item_by_id(item_id=item, project=project)
1867+
else:
1868+
return self.items.get_by_name(project, folder, item)

tests/integration/work_management/test_user_scoring.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,7 @@ def test_set_get_scores_negative_cases(self):
251251
)
252252

253253
# case with invalid scored_user
254-
with self.assertRaisesRegexp(
255-
AppException, "Please provide a valid email assigned to the project."
256-
):
254+
with self.assertRaisesRegexp(AppException, "User not found."):
257255
sa.set_user_scores(
258256
project=self.PROJECT_NAME,
259257
item=item_name,

0 commit comments

Comments
 (0)