@@ -40,7 +40,7 @@ class AnnotationSpecsRelation:
40
40
choice_id : Dict [ChoiceKey , ChoiceKey ]
41
41
42
42
43
- def __first_true (iterable , default = None , pred = None ):
43
+ def _first_true (iterable , default = None , pred = None ):
44
44
return next (filter (pred , iterable ), default )
45
45
46
46
@@ -298,7 +298,8 @@ def copy_annotation(self, src: TaskFrameKey, dest: TaskFrameKey, account_id: str
298
298
src: コピー元のTaskFrame情報
299
299
dest: コピー先のTaskFrame情報
300
300
account_id: アノテーションを登録するユーザのアカウントID
301
- annotation_specs_relation: アノテーション仕様間の紐付け情報
301
+ annotation_specs_relation: アノテーション仕様間の紐付け情報。``get_annotation_specs_relation`` メソッドで紐付け情報を取得できる。
302
+ Noneの場合、コピー元のアノテーション仕様のID情報(ラベルID、属性ID、選択肢ID)を変換せずに、アノテーションをコピーします。
302
303
303
304
Returns:
304
305
アノテーションのコピー実施したかどうか
@@ -370,11 +371,42 @@ def __get_choice_name_en(choice: Dict[str, Any]) -> str:
370
371
messages = choice ["name" ]["messages" ]
371
372
return [e ["message" ] for e in messages if e ["lang" ] == "en-US" ][0 ]
372
373
374
+ def __get_dest_additional (self , src_additional : Dict [str , Any ], dest_additionals : List [Dict [str , Any ]],
375
+ src_labels : List [Dict [str , Any ]], dest_labels : List [Dict [str , Any ]],
376
+ dict_label_id : Dict [str , str ]) -> Optional [Dict [str , Any ]]:
377
+ src_additional_name_en = self .__get_additional_data_definition_name_en (src_additional )
378
+ for dest_additional in dest_additionals :
379
+ if src_additional_name_en != self .__get_additional_data_definition_name_en (dest_additional ):
380
+ continue
381
+
382
+ dest_label_contains_dest_additional = True
383
+ for src_label in src_labels :
384
+ if src_additional ["additional_data_definition_id" ] in src_label ["additional_data_definitions" ]:
385
+ dest_label_id = dict_label_id .get (src_label ["label_id" ])
386
+ if dest_label_id is None :
387
+ dest_label_contains_dest_additional = False
388
+ break
389
+
390
+ dest_label = _first_true (dest_labels , pred = lambda e , f = dest_label_id : e ["label_id" ] == f )
391
+ if dest_label is None :
392
+ dest_label_contains_dest_additional = False
393
+ break
394
+ if dest_additional ["additional_data_definition_id" ] not in dest_label [
395
+ "additional_data_definitions" ]:
396
+ dest_label_contains_dest_additional = False
397
+ break
398
+
399
+ if dest_label_contains_dest_additional :
400
+ return dest_additional
401
+
402
+ return None
403
+
373
404
def get_annotation_specs_relation (self , src_project_id : str , dest_project_id : str ) -> AnnotationSpecsRelation :
374
405
"""
375
- プロジェクト間のアノテーション仕様の紐付け情報を取得する。ラベル、属性、選択肢の英語名で紐付ける。
406
+ プロジェクト間のアノテーション仕様の紐付け情報を取得する。
407
+ ラベル、属性、選択肢の英語名で紐付ける。
408
+ ただし、属性は、参照されるラベルが一致していることも判定する。
376
409
紐付け先がない場合は無視する。
377
- ``copy_annotation`` メソッドで利用する。
378
410
379
411
Args:
380
412
src_project_id: 紐付け元のプロジェクトID
@@ -392,17 +424,17 @@ def get_annotation_specs_relation(self, src_project_id: str, dest_project_id: st
392
424
dict_label_id : Dict [str , str ] = {}
393
425
for src_label in src_annotation_specs ["labels" ]:
394
426
src_label_name_en = self .__get_label_name_en (src_label )
395
- dest_label = __first_true (dest_labels , pred = lambda e , f = src_label_name_en : self .__get_label_name_en (e ) == f )
427
+ dest_label = _first_true (dest_labels , pred = lambda e , f = src_label_name_en : self .__get_label_name_en (e ) == f )
396
428
if dest_label is not None :
397
429
dict_label_id [src_label ["label_id" ]] = dest_label ["label_id" ]
398
430
399
431
dict_additional_data_definition_id : Dict [str , str ] = {}
400
432
dict_choice_id : Dict [ChoiceKey , ChoiceKey ] = {}
401
433
for src_additional in src_annotation_specs ["additionals" ]:
402
- src_additional_name_en = self .__get_additional_data_definition_name_en (src_additional )
403
- dest_additional = __first_true (
404
- dest_additionals ,
405
- pred = lambda e , f = src_additional_name_en : self . __get_additional_data_definition_name_en ( e ) == f )
434
+ dest_additional = self .__get_dest_additional (src_additional = src_additional ,
435
+ dest_additionals = dest_additionals ,
436
+ src_labels = src_annotation_specs [ "labels" ] ,
437
+ dest_labels = dest_labels , dict_label_id = dict_label_id )
406
438
if dest_additional is None :
407
439
continue
408
440
@@ -412,8 +444,8 @@ def get_annotation_specs_relation(self, src_project_id: str, dest_project_id: st
412
444
dest_choices = dest_additional ["choices" ]
413
445
for src_choice in src_additional ["choices" ]:
414
446
src_choice_name_en = self .__get_choice_name_en (src_choice )
415
- dest_choice = __first_true (dest_choices ,
416
- pred = lambda e , f = src_choice_name_en : self .__get_choice_name_en (e ) == f )
447
+ dest_choice = _first_true (dest_choices ,
448
+ pred = lambda e , f = src_choice_name_en : self .__get_choice_name_en (e ) == f )
417
449
if dest_choice is not None :
418
450
dict_choice_id [ChoiceKey (src_additional ["additional_data_definition_id" ],
419
451
src_choice ["choice_id" ])] = ChoiceKey (
0 commit comments