diff --git a/annofabcli/comment/put_comment.py b/annofabcli/comment/put_comment.py index 8c7c188f..c7e6b5f3 100644 --- a/annofabcli/comment/put_comment.py +++ b/annofabcli/comment/put_comment.py @@ -15,6 +15,7 @@ from annofabcli.comment.utils import get_comment_type_name from annofabcli.common.cli import CommandLineWithConfirm from annofabcli.common.facade import AnnofabApiFacade +from annofabcli.common.type_util import assert_noreturn logger = logging.getLogger(__name__) @@ -109,13 +110,13 @@ def change_to_working_status(self, project_id: str, task: Dict[str, Any]) -> Dic try: if task["account_id"] != self.service.api.account_id: self.service.wrapper.change_task_operator(project_id, task_id, self.service.api.account_id) - logger.debug(f"{task_id}: 担当者を自分自身に変更しました。") + logger.debug(f"task_id='{task_id}' :: 担当者を自分自身に変更しました。") changed_task = self.service.wrapper.change_task_status_to_working(project_id, task_id) return changed_task # noqa: TRY300 except requests.HTTPError: - logger.warning(f"{task_id}: 担当者の変更、または作業中状態への変更に失敗しました。", exc_info=True) + logger.warning(f"task_id='{task_id}' :: 担当者の変更、または作業中状態への変更に失敗しました。", exc_info=True) raise def _can_add_comment( @@ -126,12 +127,12 @@ def _can_add_comment( if self.comment_type == CommentType.INSPECTION: # noqa: SIM102 if task["phase"] == TaskPhase.ANNOTATION.value: - logger.warning(f"task_id='{task_id}': 教師付フェーズなので、検査コメントを付与できません。") + logger.warning(f"task_id='{task_id}' :: フェーズが検査/受入でないため検査コメントを付与できません。 :: task_phase='{task['phase']}'") return False if task["status"] not in [TaskStatus.NOT_STARTED.value, TaskStatus.WORKING.value, TaskStatus.BREAK.value]: logger.warning( - f"task_id='{task_id}' : タスクの状態が未着手,作業中,休憩中 以外の状態なので、コメントを付与できません。(task_status='{task['status']}')" # noqa: E501 + f"task_id='{task_id}' :: タスクの状態が未着手,作業中,休憩中 以外の状態なので、コメントを付与できません。 :: task_status='{task['status']}'" # noqa: E501 ) return False return True @@ -151,16 +152,16 @@ def add_comments_for_task( task_index: タスクの連番 Returns: - 付与したコメントの数 + コメントを付与した入力データの個数 """ logging_prefix = f"{task_index+1} 件目" if task_index is not None else "" task = self.service.wrapper.get_task_or_none(self.project_id, task_id) if task is None: - logger.warning(f"{logging_prefix} : task_id='{task_id}' のタスクは存在しないので、スキップします。") + logger.warning(f"{logging_prefix} :: task_id='{task_id}' のタスクは存在しないので、スキップします。") return 0 - logger.debug(f"{logging_prefix} : task_id = {task['task_id']}, status = {task['status']}, phase = {task['phase']}, ") + logger.debug(f"{logging_prefix} : task_id='{task['task_id']}', status='{task['status']}', phase='{task['phase']}'") if not self._can_add_comment( task=task, @@ -175,25 +176,28 @@ def add_comments_for_task( added_comments_count = 0 for input_data_id, comments in comments_for_task.items(): if input_data_id not in task["input_data_id_list"]: - logger.warning(f"{logging_prefix} : task_id='{task_id}'のタスクに input_data_id='{input_data_id}'の入力データは存在しません。") + logger.warning(f"{logging_prefix} :: task_id='{task_id}'のタスクに input_data_id='{input_data_id}'の入力データは存在しません。") continue try: # コメントを付与する - request_body = self._create_request_body(task=changed_task, input_data_id=input_data_id, comments=comments) - self.service.api.batch_update_comments(self.project_id, task_id, input_data_id, request_body=request_body) - added_comments_count += 1 - logger.debug(f"{logging_prefix} : task_id={task_id}, input_data_id={input_data_id}: {len(comments)}件のコメントを付与しました。") + if len(comments) > 0: + request_body = self._create_request_body(task=changed_task, input_data_id=input_data_id, comments=comments) + self.service.api.batch_update_comments(self.project_id, task_id, input_data_id, request_body=request_body) + added_comments_count += 1 + logger.debug( + f"{logging_prefix} :: task_id='{task_id}', input_data_id='{input_data_id}' :: {len(comments)}件のコメントを付与しました。" + ) except Exception: # pylint: disable=broad-except logger.warning( - f"{logging_prefix} : task_id={task_id}, input_data_id={input_data_id}: コメントの付与に失敗しました。", + f"{logging_prefix} :: task_id={task_id}, input_data_id={input_data_id}: コメントの付与に失敗しました。", exc_info=True, ) - finally: - self.service.wrapper.change_task_status_to_break(self.project_id, task_id) - # 担当者が変えている場合は、元に戻す - if task["account_id"] != changed_task["account_id"]: - self.service.wrapper.change_task_operator(self.project_id, task_id, task["account_id"]) - logger.debug(f"{task_id}: 担当者を元のユーザ( account_id={task['account_id']})に戻しました。") + + self.service.wrapper.change_task_status_to_break(self.project_id, task_id) + # 担当者が変えている場合は、元に戻す + if task["account_id"] != changed_task["account_id"]: + self.service.wrapper.change_task_operator(self.project_id, task_id, task["account_id"]) + logger.debug(f"{logging_prefix} :: task_id='{task_id}' :: 担当者を元のユーザ( account_id='{task['account_id']}')に戻しました。") return added_comments_count @@ -232,7 +236,7 @@ def add_comments_for_task_list( ) added_comments_count += result except Exception: # pylint: disable=broad-except - logger.warning(f"task_id={task_id}: コメントの付与に失敗しました。", exc_info=True) + logger.warning(f"task_id='{task_id}' :: コメントの付与に失敗しました。", exc_info=True) continue logger.info(f"{added_comments_count} / {comments_count} 件の入力データに{self.comment_type_name}を付与しました。") @@ -286,10 +290,12 @@ def convert_onhold_comment(comment: dict[str, Any]) -> AddedComment: elif comment_type == CommentType.ONHOLD: func_convert = convert_onhold_comment else: - raise RuntimeError(f"{comment_type=}が無効な値です。") - - return { - task_id: {input_data_id: [func_convert(e) for e in comments]} - for task_id, comments_for_task in dict_comments.items() - for input_data_id, comments in comments_for_task.items() - } + assert_noreturn(comment_type) + + result = {} + for task_id, comments_for_task in dict_comments.items(): + sub_result = { + input_data_id: [func_convert(e) for e in comments] for input_data_id, comments in comments_for_task.items() if len(comments) > 0 + } + result.update({task_id: sub_result}) + return result diff --git a/annofabcli/comment/put_inspection_comment.py b/annofabcli/comment/put_inspection_comment.py index 61c78b19..8cdc87cd 100644 --- a/annofabcli/comment/put_inspection_comment.py +++ b/annofabcli/comment/put_inspection_comment.py @@ -44,7 +44,6 @@ def main(self) -> None: dict_comments = annofabcli.common.cli.get_json_from_args(args.json) comments_for_task_list = convert_cli_comments(dict_comments, comment_type=CommentType.INSPECTION) - main_obj = PutCommentMain(self.service, project_id=args.project_id, comment_type=CommentType.INSPECTION, all_yes=self.all_yes) main_obj.add_comments_for_task_list( comments_for_task_list=comments_for_task_list, diff --git a/annofabcli/common/type_util.py b/annofabcli/common/type_util.py new file mode 100644 index 00000000..d7199cc3 --- /dev/null +++ b/annofabcli/common/type_util.py @@ -0,0 +1,6 @@ +from typing import NoReturn + + +def assert_noreturn(x: NoReturn) -> NoReturn: + """python 3.11 以降に追加されたassert_neverの代わり""" + raise AssertionError(f"Invalid value: {x!r}") # x!rは repr(x)と等価