annofabcli 1.102.0__py3-none-any.whl → 1.102.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,7 @@ from dataclasses import dataclass
10
10
  from typing import Any, Optional
11
11
 
12
12
  import annofabapi
13
+ from annofabapi.models import ProjectMemberRole
13
14
  from annofabapi.utils import can_put_annotation
14
15
 
15
16
  import annofabcli
@@ -350,6 +351,8 @@ class CopyAnnotation(CommandLine):
350
351
  sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
351
352
 
352
353
  project_id = args.project_id
354
+ super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
355
+
353
356
  str_copy_target_list = get_list_from_args(args.input)
354
357
 
355
358
  copy_target_list = get_copy_target_list(str_copy_target_list)
@@ -421,6 +424,7 @@ def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argpa
421
424
  subcommand_name = "copy"
422
425
  subcommand_help = "アノテーションをコピーします."
423
426
  description = "タスク単位または入力データ単位で、アノテーションをコピーします。"
424
- parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description)
427
+ epilog = "オーナー、チェッカーまたはアノテータロールを持つユーザで実行してください。"
428
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
425
429
  parse_args(parser)
426
430
  return parser
@@ -356,7 +356,13 @@ class DeleteAnnotation(CommandLine):
356
356
  else:
357
357
  backup_dir = Path(args.backup)
358
358
 
359
- super().validate_project(project_id, [ProjectMemberRole.OWNER])
359
+ if args.force:
360
+ # --forceオプションが指定されている場合は、完了状態のタスクも削除する
361
+ # 完了状態のタスクを削除するには、オーナーロールである必要があるため、`args.force`で条件を分岐する
362
+ super().validate_project(project_id, [ProjectMemberRole.OWNER])
363
+ else:
364
+ super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
365
+
360
366
  main_obj = DeleteAnnotationMain(self.service, project_id, all_yes=args.yes, is_force=args.force)
361
367
 
362
368
  if args.json is not None:
@@ -452,7 +458,12 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
452
458
  f"(ex): ``{json.dumps(EXAMPLE_ANNOTATION_QUERY)}``",
453
459
  )
454
460
 
455
- parser.add_argument("--force", action="store_true", help="指定した場合は、完了状態のタスクのアノテーションも削除します。")
461
+ parser.add_argument(
462
+ "--force",
463
+ action="store_true",
464
+ help="指定した場合は、完了状態のタスクのアノテーションも削除します。"
465
+ "ただし、完了状態のタスクを削除するには、オーナーロールを持つユーザーが実行する必要があります。",
466
+ )
456
467
  parser.add_argument(
457
468
  "--backup",
458
469
  type=str,
@@ -469,7 +480,7 @@ def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argpa
469
480
  "タスク配下のアノテーションを削除します。ただし、作業中状態のタスクのアノテーションは削除できません。"
470
481
  "間違えてアノテーションを削除したときに復元できるようにするため、 ``--backup`` でバックアップ用のディレクトリを指定することを推奨します。"
471
482
  )
472
- epilog = "オーナロールを持つユーザで実行してください。"
483
+ epilog = "オーナーまたはチェッカーロールを持つユーザで実行してください。ただし``--force``オプションを指定した場合は、オーナーロールを持つユーザで実行してください。" # noqa: E501
473
484
 
474
485
  parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
475
486
  parse_args(parser)
@@ -12,6 +12,7 @@ from typing import Any, Optional
12
12
 
13
13
  import annofabapi
14
14
  import numpy
15
+ from annofabapi.models import ProjectMemberRole
15
16
  from annofabapi.pydantic_models.default_annotation_type import DefaultAnnotationType
16
17
  from annofabapi.pydantic_models.task_status import TaskStatus
17
18
  from annofabapi.segmentation import read_binary_image, write_binary_image
@@ -304,6 +305,8 @@ class MergeSegmentation(CommandLine):
304
305
  sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
305
306
 
306
307
  project_id = args.project_id
308
+ super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
309
+
307
310
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
308
311
  label_name_list = annofabcli.common.cli.get_list_from_args(args.label_name)
309
312
 
@@ -385,6 +388,7 @@ def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argpa
385
388
  "複数の塗りつぶしアノテーションを1つにまとめます。"
386
389
  "ラベルの種類を「塗りつぶし(インスタンスセグメンテーション)」から「塗りつぶしv2(セマンティックセグメンテーション)」に変更する場合などに有用です。"
387
390
  )
388
- parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description)
391
+ epilog = "オーナー、チェッカーまたはアノテータロールを持つユーザで実行してください。"
392
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
389
393
  parse_args(parser)
390
394
  return parser
@@ -12,6 +12,7 @@ from typing import Any, Optional
12
12
 
13
13
  import annofabapi
14
14
  import numpy
15
+ from annofabapi.models import ProjectMemberRole
15
16
  from annofabapi.pydantic_models.task_status import TaskStatus
16
17
  from annofabapi.segmentation import read_binary_image, write_binary_image
17
18
  from annofabapi.utils import can_put_annotation
@@ -291,8 +292,11 @@ class RemoveSegmentationOverlap(CommandLine):
291
292
  sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
292
293
 
293
294
  project_id = args.project_id
295
+
294
296
  task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
295
297
 
298
+ super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
299
+
296
300
  main_obj = RemoveSegmentationOverlapMain(
297
301
  self.service,
298
302
  project_id=project_id,
@@ -338,6 +342,7 @@ def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argpa
338
342
  "Annofabでインスタンスセグメンテーションは重ねることができてしまいます。"
339
343
  "この重なりをなくしたいときに有用です。"
340
344
  )
341
- parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description)
345
+ epilog = "オーナー、チェッカーまたはアノテータロールを持つユーザで実行してください。"
346
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, subcommand_help, description, epilog=epilog)
342
347
  parse_args(parser)
343
348
  return parser
@@ -7,6 +7,7 @@ from typing import Any, Optional
7
7
 
8
8
  import annofabapi
9
9
  import more_itertools
10
+ from annofabapi.models import OrganizationMemberRole
10
11
 
11
12
  import annofabcli
12
13
  import annofabcli.common.cli
@@ -35,8 +36,14 @@ class DeleteOrganizationMemberMain(CommandLineWithConfirm):
35
36
  def get_member(organization_member_list: list[dict[str, Any]], user_id: str) -> Optional[dict[str, Any]]:
36
37
  return more_itertools.first_true(organization_member_list, pred=lambda e: e["user_id"] == user_id)
37
38
 
38
- def main(self, organization_name: str, user_ids: Collection[str]) -> None:
39
- logger.info(f"{len(user_ids)} 件のユーザを組織'{organization_name}'から脱退させます。")
39
+ def delete_organization_members_from_organization(self, organization_name: str, user_ids: Collection[str]) -> None:
40
+ if not self.facade.contains_any_organization_member_role(
41
+ organization_name, {OrganizationMemberRole.ADMINISTRATOR, OrganizationMemberRole.OWNER}
42
+ ):
43
+ logger.warning(f"組織'{organization_name}'に所属していないか、組織メンバーを脱退できるロールを持たないため、スキップします。")
44
+ return
45
+
46
+ logger.info(f"{len(user_ids)} 件のメンバーを組織'{organization_name}'から脱退させます。")
40
47
 
41
48
  member_list = self.service.wrapper.get_all_organization_members(organization_name)
42
49
 
@@ -45,24 +52,30 @@ class DeleteOrganizationMemberMain(CommandLineWithConfirm):
45
52
  for user_id in user_ids:
46
53
  member = self.get_member(member_list, user_id)
47
54
  if member is None:
48
- logger.warning(f"組織メンバにuser_id='{user_id}'のユーザが存在しません。")
55
+ logger.warning(f"組織'{organization_name}'に user_id='{user_id}'のメンバーが存在しません。")
49
56
  continue
50
57
 
51
58
  if not self.confirm_processing(
52
- f"user_id='{user_id}'のユーザを組織から脱退させますか? :: username='{member['username']}', role='{member['role']}'"
59
+ f"組織'{organization_name}'に所属する user_id='{user_id}'のメンバーを脱退させますか? :: username='{member['username']}'"
53
60
  ):
54
61
  continue
55
62
 
56
- logger.debug(f"user_id='{user_id}'のユーザを組織から脱退させます。 :: username='{member['username']}', role='{member['role']}'")
57
63
  try:
58
64
  self.service.api.delete_organization_member(organization_name, user_id)
59
- logger.debug(f"user_id='{user_id}'のユーザを組織'{organization_name}'から脱退させました。")
65
+ logger.debug(f"組織'{organization_name}'から user_id='{user_id}'のメンバーを脱退させました。")
60
66
  success_count += 1
61
67
 
62
68
  except Exception: # pylint: disable=broad-except
63
- logger.warning(f"user_id='{user_id}'のユーザを組織'{organization_name}'から脱退させるのに失敗しました。", exc_info=True)
69
+ logger.warning(f"組織'{organization_name}'から user_id='{user_id}'のメンバーを脱退させるのに失敗しました。", exc_info=True)
70
+
71
+ logger.info(f"{success_count} / {len(user_ids)} 件のメンバーを組織'{organization_name}'から脱退させました。")
64
72
 
65
- logger.info(f"{success_count} / {len(user_ids)} 件のユーザを組織'{organization_name}'から脱退させました。")
73
+ def delete_organization_members_from_organizations(self, organization_names: list[str], user_ids: Collection[str]) -> None:
74
+ for organization_name in organization_names:
75
+ try:
76
+ self.delete_organization_members_from_organization(organization_name, user_ids)
77
+ except Exception: # pylint
78
+ logger.warning(f"組織'{organization_name}'からメンバーを脱退させるのに失敗しました。", exc_info=True)
66
79
 
67
80
 
68
81
  class DeleteOrganizationMember(CommandLine):
@@ -70,9 +83,10 @@ class DeleteOrganizationMember(CommandLine):
70
83
  args = self.args
71
84
 
72
85
  user_id_list = annofabcli.common.cli.get_list_from_args(args.user_id)
86
+ organization_name_list = annofabcli.common.cli.get_list_from_args(args.organization)
73
87
 
74
88
  main_obj = DeleteOrganizationMemberMain(self.service, all_yes=args.yes)
75
- main_obj.main(organization_name=args.organization, user_ids=user_id_list)
89
+ main_obj.delete_organization_members_from_organizations(organization_name_list, user_id_list)
76
90
 
77
91
 
78
92
  def main(args: argparse.Namespace) -> None:
@@ -82,7 +96,14 @@ def main(args: argparse.Namespace) -> None:
82
96
 
83
97
 
84
98
  def parse_args(parser: argparse.ArgumentParser) -> None:
85
- parser.add_argument("-org", "--organization", required=True, type=str, help="対象の組織の組織名を指定してください。")
99
+ parser.add_argument(
100
+ "-org",
101
+ "--organization",
102
+ nargs="+",
103
+ required=True,
104
+ type=str,
105
+ help="対象の組織名を指定してます。 ``file://`` を先頭に付けると、一覧が記載されたファイルを指定できます。",
106
+ )
86
107
 
87
108
  parser.add_argument(
88
109
  "-u",
@@ -90,7 +111,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
90
111
  type=str,
91
112
  nargs="+",
92
113
  required=True,
93
- help="組織から脱退させるユーザのuser_idを指定してください。 ``file://`` を先頭に付けると、一覧が記載されたファイルを指定できます。",
114
+ help="組織から脱退させるメンバーのuser_idを指定します。 ``file://`` を先頭に付けると、一覧が記載されたファイルを指定できます。",
94
115
  )
95
116
 
96
117
  parser.set_defaults(subcommand_func=main)
@@ -98,10 +119,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
98
119
 
99
120
  def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
100
121
  subcommand_name = "delete"
101
- subcommand_help = "組織からユーザを脱退させます。"
102
- description = "組織からユーザを脱退させます。"
122
+ subcommand_help = "組織からメンバーを脱退させます。"
103
123
  epilog = "組織オーナまたは組織管理者ロールを持つユーザで実行してください。"
104
124
 
105
- parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, command_help=subcommand_help, description=description, epilog=epilog)
125
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, command_help=subcommand_help, epilog=epilog)
106
126
  parse_args(parser)
107
127
  return parser
@@ -29,8 +29,14 @@ class InviteOrganizationMemberMain(CommandLineWithConfirm):
29
29
  self.facade = AnnofabApiFacade(service)
30
30
  super().__init__(all_yes)
31
31
 
32
- def main(self, organization_name: str, user_ids: Collection[str], role: str) -> None:
33
- logger.info(f"{len(user_ids)} 件のユーザを組織'{organization_name}'に招待して、ロール'{role}'を付与します。")
32
+ def invite_members_to_organization(self, organization_name: str, user_ids: Collection[str], role: str) -> None:
33
+ if not self.facade.contains_any_organization_member_role(
34
+ organization_name, {OrganizationMemberRole.ADMINISTRATOR, OrganizationMemberRole.OWNER}
35
+ ):
36
+ logger.warning(f"組織'{organization_name}'に所属していないか、組織メンバーを招待できるロールを持たないため、スキップします。")
37
+ return
38
+
39
+ logger.info(f"{len(user_ids)} 件のメンバーを組織'{organization_name}'に招待して、ロール'{role}'を付与します。")
34
40
 
35
41
  organization_member_list = self.service.wrapper.get_all_organization_members(organization_name)
36
42
  all_user_ids = {e["user_id"] for e in organization_member_list}
@@ -39,21 +45,28 @@ class InviteOrganizationMemberMain(CommandLineWithConfirm):
39
45
  success_count = 0
40
46
  for user_id in user_ids:
41
47
  if user_id in all_user_ids:
42
- logger.warning(f"user_id='{user_id}'のユーザは、すでに組織'{organization_name}'に存在しています。")
48
+ logger.warning(f"user_id='{user_id}'のメンバーは、すでに組織'{organization_name}'に存在しているため、スキップします。")
43
49
  continue
44
50
 
45
- if not self.confirm_processing(f"user_id='{user_id}'のユーザを組織'{organization_name}'に招待しますか? :: role='{role}'"):
51
+ if not self.confirm_processing(f"user_id='{user_id}'のメンバーを組織'{organization_name}'に招待して、ロール'{role}'を付与しますか?"):
46
52
  continue
47
53
 
48
54
  try:
49
55
  self.service.api.invite_organization_member(organization_name, user_id, request_body={"role": role})
50
- logger.debug(f"user_id='{user_id}'のユーザを組織'{organization_name}'に招待しました。")
56
+ logger.debug(f"user_id='{user_id}'のメンバーを組織'{organization_name}'に招待しました。")
51
57
  success_count += 1
52
58
 
53
59
  except Exception: # pylint: disable=broad-except
54
- logger.warning(f"user_id='{user_id}'のユーザを組織'{organization_name}'に招待するのに失敗しました。", exc_info=True)
60
+ logger.warning(f"user_id='{user_id}'のメンバーを組織'{organization_name}'に招待するのに失敗しました。", exc_info=True)
61
+
62
+ logger.info(f"{success_count} / {len(user_ids)} 件のメンバーを組織'{organization_name}'に招待しました。")
55
63
 
56
- logger.info(f"{success_count} / {len(user_ids)} 件のユーザを組織'{organization_name}'に招待しました。")
64
+ def invite_members_to_organizations(self, organization_names: list[str], user_ids: Collection[str], role: str) -> None:
65
+ for organization_name in organization_names:
66
+ try:
67
+ self.invite_members_to_organization(organization_name, user_ids, role)
68
+ except Exception: # pylint
69
+ logger.warning(f"組織'{organization_name}'にメンバーを招待するのに失敗しました。", exc_info=True)
57
70
 
58
71
 
59
72
  class InviteOrganizationMember(CommandLine):
@@ -61,9 +74,10 @@ class InviteOrganizationMember(CommandLine):
61
74
  args = self.args
62
75
 
63
76
  user_id_list = annofabcli.common.cli.get_list_from_args(args.user_id)
77
+ organization_name_list = annofabcli.common.cli.get_list_from_args(args.organization)
64
78
 
65
79
  main_obj = InviteOrganizationMemberMain(self.service, all_yes=args.yes)
66
- main_obj.main(organization_name=args.organization, user_ids=user_id_list, role=args.role)
80
+ main_obj.invite_members_to_organizations(organization_name_list, user_id_list, role=args.role)
67
81
 
68
82
 
69
83
  def main(args: argparse.Namespace) -> None:
@@ -73,7 +87,7 @@ def main(args: argparse.Namespace) -> None:
73
87
 
74
88
 
75
89
  def parse_args(parser: argparse.ArgumentParser) -> None:
76
- parser.add_argument("-org", "--organization", required=True, type=str, help="対象の組織の組織名を指定してください。")
90
+ parser.add_argument("-org", "--organization", nargs="+", required=True, type=str, help="招待先の組織名を指定してください。")
77
91
 
78
92
  parser.add_argument(
79
93
  "-u",
@@ -81,7 +95,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
81
95
  type=str,
82
96
  nargs="+",
83
97
  required=True,
84
- help="組織に招待するユーザのuser_idを指定してください。 ``file://`` を先頭に付けると、一覧が記載されたファイルを指定できます。",
98
+ help="組織に招待するメンバーのuser_idを指定してます。 ``file://`` を先頭に付けると、一覧が記載されたファイルを指定できます。",
85
99
  )
86
100
 
87
101
  role_choices = [e.value for e in OrganizationMemberRole]
@@ -90,7 +104,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
90
104
  type=str,
91
105
  choices=role_choices,
92
106
  required=True,
93
- help="招待するユーザに割り当てる組織メンバのロールを指定してください。",
107
+ help="招待するメンバーに割り当てるロールを指定してください。",
94
108
  )
95
109
 
96
110
  parser.set_defaults(subcommand_func=main)
@@ -98,10 +112,9 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
98
112
 
99
113
  def add_parser(subparsers: Optional[argparse._SubParsersAction] = None) -> argparse.ArgumentParser:
100
114
  subcommand_name = "invite"
101
- subcommand_help = "組織にユーザを招待します。"
102
- description = "組織にユーザを招待します。"
115
+ subcommand_help = "組織にメンバーを招待します。"
103
116
  epilog = "組織オーナまたは組織管理者ロールを持つユーザで実行してください。"
104
117
 
105
- parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, command_help=subcommand_help, description=description, epilog=epilog)
118
+ parser = annofabcli.common.cli.add_parser(subparsers, subcommand_name, command_help=subcommand_help, epilog=epilog)
106
119
  parse_args(parser)
107
120
  return parser
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: annofabcli
3
- Version: 1.102.0
3
+ Version: 1.102.1
4
4
  Summary: Utility Command Line Interface for AnnoFab
5
5
  Author: Kurusugawa Computer Inc.
6
6
  License: MIT
@@ -5,15 +5,15 @@ annofabcli/annotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
5
5
  annofabcli/annotation/annotation_query.py,sha256=ke3W3RT1-WfFzwt-TXcQwGmghG34vcKJkM_jxgbNKjU,15922
6
6
  annofabcli/annotation/change_annotation_attributes.py,sha256=GcabzuTeUhGHibYxOhoSgB9RR1ACmtrdxdmGGCiUnNQ,17200
7
7
  annofabcli/annotation/change_annotation_properties.py,sha256=Zgxl2GVuoMsFComW5Wkaip3UKeOyPpH9T0FMsngpswc,18427
8
- annofabcli/annotation/copy_annotation.py,sha256=Zy8sS7Hy4DVPLgtRrppEVuesfzj4rq07vXM783k6Akg,18165
9
- annofabcli/annotation/delete_annotation.py,sha256=1rwuPTd_bnrmq_pVrzojy-1i7nAAme6MaTQEfKmq4n0,22696
8
+ annofabcli/annotation/copy_annotation.py,sha256=79kJOfz_U_PIcP89HXdMW0HN5wiN5i-AxdjkwFgg5rQ,18482
9
+ annofabcli/annotation/delete_annotation.py,sha256=pZb48d7lRYEAYOFPOi_pt3rnOG5YNGuq-oPbjTOFEXc,23462
10
10
  annofabcli/annotation/download_annotation_zip.py,sha256=P_ZpdqIaSFEmB8jjpdykcRhh2tVlHxSlXFrYreJjShE,3282
11
11
  annofabcli/annotation/dump_annotation.py,sha256=bVEQeRYfskEKo5QjZ-bT6zsBon8u4bRySVy-CmJJTm8,7493
12
12
  annofabcli/annotation/import_annotation.py,sha256=Yg032TQgnBVUaG12Kjvta2YLvSk4NN9CvdZTWtZta28,33799
13
13
  annofabcli/annotation/list_annotation.py,sha256=B8ZFI7SRQPy-TgbpaX-tzXhveViY17YuCPE9BuK9mrs,10790
14
14
  annofabcli/annotation/list_annotation_count.py,sha256=T9fbaoxWeDJIVgW_YgHRldbwrVZWiE-57lfJrDQrj80,6474
15
- annofabcli/annotation/merge_segmentation.py,sha256=ldEQlcyCrog0KFYn92sTkScZQ7gmTjlujuCsKBemjhU,17950
16
- annofabcli/annotation/remove_segmentation_overlap.py,sha256=gONYqaI0PMEGYJduB4JsmGBn3LCY9JtLSFgosWYyc3M,15957
15
+ annofabcli/annotation/merge_segmentation.py,sha256=FuUrDG6HqMOna4BDJtC-NpqUBdQn45Oi-hzFyAVtDng,18267
16
+ annofabcli/annotation/remove_segmentation_overlap.py,sha256=NIwz45DwuBO6p-Zsty1WdI4eAJbzqUJkDLiJFZirX2k,16275
17
17
  annofabcli/annotation/restore_annotation.py,sha256=B3zitm-xB5ZuZy7c-6umiltK49Gdu3Di7YWTqNhJ22g,14704
18
18
  annofabcli/annotation/subcommand_annotation.py,sha256=ku9mzb7zZilHcjf1MFV1E7EJ8OvfSUDHpcunM38teto,2122
19
19
  annofabcli/annotation_specs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -106,8 +106,8 @@ annofabcli/organization/list_organization.py,sha256=kafkiBHd4nkJ_fqxJwYcuU79mqzE
106
106
  annofabcli/organization/subcommand_organization.py,sha256=EM-3uU45T9H51kcQGVR6a-mmU9nLd9akP2-tULq2RY0,719
107
107
  annofabcli/organization_member/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
108
  annofabcli/organization_member/change_organization_member.py,sha256=DrRnVHTXRp5kE8ezgkXofuL0tgpvEPxwF8MowCDv27Q,4918
109
- annofabcli/organization_member/delete_organization_member.py,sha256=n_TI5oLUwWi3UzaffrtmwoVvsQhqh_KocxCPxAc3JXM,4304
110
- annofabcli/organization_member/invite_organization_member.py,sha256=LndGMPOSTn5nlnu_Gg8XUcXe4oG6-31jbPjv7Gz9h0k,4249
109
+ annofabcli/organization_member/delete_organization_member.py,sha256=tHMHMxNUpM-wpGP7ycyMh5lmifKMD802FHEuCRMIQNo,5305
110
+ annofabcli/organization_member/invite_organization_member.py,sha256=5sixK8WqUGl7DAOyIRxQ-uf106FYMHl4k7VtF1SatfQ,5177
111
111
  annofabcli/organization_member/list_organization_member.py,sha256=zaZECajTok6N_HJvH2xAwB62qMOJjaIwabTdTfTwMJY,3588
112
112
  annofabcli/organization_member/subcommand_organization_member.py,sha256=iK-Y4PxG5J8fu0Bnf8NBixv81BRXvr3BiVUyUb3ET7A,1289
113
113
  annofabcli/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -207,8 +207,8 @@ annofabcli/task_history_event/download_task_history_event_json.py,sha256=hQLVbQ0
207
207
  annofabcli/task_history_event/list_all_task_history_event.py,sha256=JQEgwOIXbbTIfeX23AVaoySHViOR9UGm9uoXuhVEBqo,6446
208
208
  annofabcli/task_history_event/list_worktime.py,sha256=9jsRYa2C9bva8E1Aqxv9CCKDuCP0MvbiaIyQFTDpjqY,13150
209
209
  annofabcli/task_history_event/subcommand_task_history_event.py,sha256=mJVJoT4RXk4HWnY7-Nrsl4If-gtaIIEXd2z7eFZwM2I,1260
210
- annofabcli-1.102.0.dist-info/METADATA,sha256=nxOd0drqHnw28-7Kf3aA0qxKodxsNDV8HgqjX5Nnqxw,5286
211
- annofabcli-1.102.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
212
- annofabcli-1.102.0.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
213
- annofabcli-1.102.0.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
214
- annofabcli-1.102.0.dist-info/RECORD,,
210
+ annofabcli-1.102.1.dist-info/METADATA,sha256=dagbVH22HM5jYGQFjhCTeWBOGeFpZKnzfYMix15O8VU,5286
211
+ annofabcli-1.102.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
212
+ annofabcli-1.102.1.dist-info/entry_points.txt,sha256=C2uSUc-kkLJpoK_mDL5FEMAdorLEMPfwSf8VBMYnIFM,56
213
+ annofabcli-1.102.1.dist-info/licenses/LICENSE,sha256=pcqWYfxFtxBzhvKp3x9MXNM4xciGb2eFewaRhXUNHlo,1081
214
+ annofabcli-1.102.1.dist-info/RECORD,,