annofabcli 1.111.2__py3-none-any.whl → 1.113.0__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.
- annofabcli/__main__.py +1 -2
- annofabcli/annotation/annotation_query.py +10 -10
- annofabcli/annotation/change_annotation_attributes.py +10 -10
- annofabcli/annotation/change_annotation_attributes_per_annotation.py +4 -5
- annofabcli/annotation/change_annotation_properties.py +14 -14
- annofabcli/annotation/copy_annotation.py +6 -6
- annofabcli/annotation/create_classification_annotation.py +7 -7
- annofabcli/annotation/delete_annotation.py +9 -9
- annofabcli/annotation/download_annotation_zip.py +1 -3
- annofabcli/annotation/dump_annotation.py +8 -8
- annofabcli/annotation/import_annotation.py +13 -13
- annofabcli/annotation/list_annotation.py +9 -9
- annofabcli/annotation/list_annotation_count.py +2 -3
- annofabcli/annotation/merge_segmentation.py +6 -6
- annofabcli/annotation/remove_segmentation_overlap.py +5 -5
- annofabcli/annotation/restore_annotation.py +7 -7
- annofabcli/annotation/subcommand_annotation.py +1 -2
- annofabcli/annotation_specs/add_attribute_restriction.py +4 -5
- annofabcli/annotation_specs/attribute_restriction.py +8 -8
- annofabcli/annotation_specs/export_annotation_specs.py +4 -5
- annofabcli/annotation_specs/get_annotation_specs_with_attribute_id_replaced.py +3 -4
- annofabcli/annotation_specs/get_annotation_specs_with_choice_id_replaced.py +3 -4
- annofabcli/annotation_specs/get_annotation_specs_with_label_id_replaced.py +3 -4
- annofabcli/annotation_specs/list_annotation_specs_attribute.py +9 -10
- annofabcli/annotation_specs/list_annotation_specs_choice.py +9 -10
- annofabcli/annotation_specs/list_annotation_specs_history.py +3 -3
- annofabcli/annotation_specs/list_annotation_specs_label.py +8 -9
- annofabcli/annotation_specs/list_annotation_specs_label_attribute.py +10 -11
- annofabcli/annotation_specs/list_attribute_restriction.py +2 -4
- annofabcli/annotation_specs/list_label_color.py +2 -3
- annofabcli/annotation_specs/put_label_color.py +3 -4
- annofabcli/annotation_specs/subcommand_annotation_specs.py +1 -3
- annofabcli/annotation_zip/list_annotation_3d_bounding_box.py +365 -0
- annofabcli/annotation_zip/list_annotation_bounding_box_2d.py +37 -38
- annofabcli/annotation_zip/list_polygon_annotation.py +390 -0
- annofabcli/annotation_zip/list_polyline_annotation.py +402 -0
- annofabcli/annotation_zip/list_range_annotation.py +25 -15
- annofabcli/annotation_zip/list_single_point_annotation.py +25 -34
- annofabcli/annotation_zip/subcommand_annotation_zip.py +7 -2
- annofabcli/annotation_zip/validate_annotation.py +8 -7
- annofabcli/comment/delete_comment.py +4 -6
- annofabcli/comment/download_comment_json.py +4 -6
- annofabcli/comment/list_all_comment.py +5 -6
- annofabcli/comment/list_comment.py +3 -4
- annofabcli/comment/put_comment.py +9 -10
- annofabcli/comment/put_comment_simply.py +5 -6
- annofabcli/comment/put_inspection_comment.py +1 -3
- annofabcli/comment/put_inspection_comment_simply.py +1 -3
- annofabcli/comment/put_onhold_comment.py +1 -3
- annofabcli/comment/put_onhold_comment_simply.py +1 -3
- annofabcli/comment/subcommand_comment.py +1 -3
- annofabcli/common/bokeh.py +4 -4
- annofabcli/common/cli.py +18 -17
- annofabcli/common/download.py +28 -29
- annofabcli/common/facade.py +37 -38
- annofabcli/common/image.py +14 -14
- annofabcli/common/utils.py +8 -8
- annofabcli/common/visualize.py +13 -13
- annofabcli/experimental/list_out_of_range_annotation_for_movie.py +3 -4
- annofabcli/experimental/subcommand_experimental.py +1 -3
- annofabcli/filesystem/draw_annotation.py +27 -27
- annofabcli/filesystem/filter_annotation.py +9 -10
- annofabcli/filesystem/mask_user_info.py +15 -15
- annofabcli/filesystem/merge_annotation.py +9 -9
- annofabcli/filesystem/subcommand_filesystem.py +1 -3
- annofabcli/input_data/copy_input_data.py +8 -9
- annofabcli/input_data/delete_input_data.py +3 -3
- annofabcli/input_data/delete_metadata_key_of_input_data.py +3 -5
- annofabcli/input_data/download_input_data_json.py +4 -6
- annofabcli/input_data/list_all_input_data.py +9 -9
- annofabcli/input_data/list_all_input_data_merged_task.py +5 -5
- annofabcli/input_data/list_input_data.py +5 -5
- annofabcli/input_data/put_input_data.py +6 -6
- annofabcli/input_data/put_input_data_with_zip.py +3 -4
- annofabcli/input_data/subcommand_input_data.py +1 -3
- annofabcli/input_data/update_input_data.py +6 -8
- annofabcli/input_data/update_metadata_of_input_data.py +3 -5
- annofabcli/instruction/copy_instruction.py +5 -6
- annofabcli/instruction/download_instruction.py +5 -6
- annofabcli/instruction/list_instruction_history.py +3 -3
- annofabcli/instruction/subcommand_instruction.py +1 -3
- annofabcli/instruction/upload_instruction.py +3 -4
- annofabcli/job/delete_job.py +2 -3
- annofabcli/job/list_job.py +5 -5
- annofabcli/job/list_last_job.py +4 -4
- annofabcli/job/subcommand_job.py +1 -3
- annofabcli/job/wait_job.py +4 -5
- annofabcli/my_account/get_my_account.py +2 -3
- annofabcli/my_account/subcommand_my_account.py +1 -3
- annofabcli/organization/list_organization.py +2 -3
- annofabcli/organization/subcommand_organization.py +1 -3
- annofabcli/organization_member/change_organization_member.py +3 -4
- annofabcli/organization_member/delete_organization_member.py +3 -4
- annofabcli/organization_member/invite_organization_member.py +1 -3
- annofabcli/organization_member/list_organization_member.py +3 -3
- annofabcli/organization_member/subcommand_organization_member.py +1 -3
- annofabcli/project/change_organization_of_project.py +4 -4
- annofabcli/project/change_project_status.py +4 -4
- annofabcli/project/copy_project.py +5 -5
- annofabcli/project/create_project.py +8 -8
- annofabcli/project/diff_projects.py +4 -5
- annofabcli/project/list_project.py +5 -5
- annofabcli/project/put_project.py +2 -3
- annofabcli/project/subcommand_project.py +1 -2
- annofabcli/project/update_configuration.py +4 -4
- annofabcli/project/update_project.py +6 -8
- annofabcli/project_member/change_project_members.py +8 -8
- annofabcli/project_member/copy_project_members.py +4 -4
- annofabcli/project_member/drop_project_members.py +2 -3
- annofabcli/project_member/invite_project_members.py +1 -3
- annofabcli/project_member/list_users.py +2 -3
- annofabcli/project_member/put_project_members.py +6 -6
- annofabcli/project_member/subcommand_project_member.py +1 -3
- annofabcli/stat_visualization/mask_visualization_dir.py +8 -9
- annofabcli/stat_visualization/merge_visualization_dir.py +6 -7
- annofabcli/stat_visualization/subcommand_stat_visualization.py +1 -2
- annofabcli/stat_visualization/summarize_whole_performance_csv.py +1 -2
- annofabcli/stat_visualization/write_graph.py +2 -3
- annofabcli/stat_visualization/write_performance_rating_csv.py +20 -27
- annofabcli/statistics/histogram.py +5 -6
- annofabcli/statistics/linegraph.py +13 -14
- annofabcli/statistics/list_annotation_area.py +38 -13
- annofabcli/statistics/list_annotation_attribute.py +9 -10
- annofabcli/statistics/list_annotation_attribute_filled_count.py +30 -31
- annofabcli/statistics/list_annotation_count.py +57 -58
- annofabcli/statistics/list_annotation_duration.py +33 -34
- annofabcli/statistics/list_video_duration.py +4 -5
- annofabcli/statistics/list_worktime.py +4 -4
- annofabcli/statistics/scatter.py +9 -8
- annofabcli/statistics/subcommand_statistics.py +1 -4
- annofabcli/statistics/summarize_task_count.py +4 -6
- annofabcli/statistics/summarize_task_count_by_task_id_group.py +2 -4
- annofabcli/statistics/summarize_task_count_by_user.py +1 -3
- annofabcli/statistics/visualization/dataframe/annotation_count.py +5 -4
- annofabcli/statistics/visualization/dataframe/annotation_duration.py +2 -3
- annofabcli/statistics/visualization/dataframe/cumulative_productivity.py +15 -17
- annofabcli/statistics/visualization/dataframe/productivity_per_date.py +17 -19
- annofabcli/statistics/visualization/dataframe/project_performance.py +3 -12
- annofabcli/statistics/visualization/dataframe/task.py +11 -12
- annofabcli/statistics/visualization/dataframe/task_worktime_by_phase_user.py +9 -10
- annofabcli/statistics/visualization/dataframe/user_performance.py +21 -19
- annofabcli/statistics/visualization/dataframe/whole_performance.py +3 -4
- annofabcli/statistics/visualization/dataframe/whole_productivity_per_date.py +12 -14
- annofabcli/statistics/visualization/dataframe/worktime_per_date.py +11 -13
- annofabcli/statistics/visualization/filtering_query.py +7 -7
- annofabcli/statistics/visualization/project_dir.py +27 -14
- annofabcli/statistics/visualize_annotation_count.py +22 -23
- annofabcli/statistics/visualize_annotation_duration.py +21 -22
- annofabcli/statistics/visualize_statistics.py +36 -33
- annofabcli/statistics/visualize_video_duration.py +18 -20
- annofabcli/supplementary/delete_supplementary_data.py +5 -5
- annofabcli/supplementary/list_supplementary_data.py +4 -4
- annofabcli/supplementary/put_supplementary_data.py +9 -9
- annofabcli/supplementary/subcommand_supplementary.py +1 -3
- annofabcli/task/cancel_acceptance.py +16 -17
- annofabcli/task/change_operator.py +10 -12
- annofabcli/task/change_status_to_break.py +7 -9
- annofabcli/task/change_status_to_on_hold.py +10 -12
- annofabcli/task/complete_tasks.py +17 -18
- annofabcli/task/copy_tasks.py +3 -5
- annofabcli/task/delete_metadata_key_of_task.py +4 -6
- annofabcli/task/delete_tasks.py +7 -7
- annofabcli/task/download_task_json.py +4 -6
- annofabcli/task/list_all_tasks.py +8 -8
- annofabcli/task/list_all_tasks_added_task_history.py +14 -13
- annofabcli/task/list_tasks.py +7 -7
- annofabcli/task/list_tasks_added_task_history.py +10 -10
- annofabcli/task/put_tasks.py +5 -6
- annofabcli/task/put_tasks_by_count.py +2 -3
- annofabcli/task/reject_tasks.py +18 -20
- annofabcli/task/subcommand_task.py +1 -3
- annofabcli/task/update_metadata_of_task.py +5 -6
- annofabcli/task_history/download_task_history_json.py +4 -6
- annofabcli/task_history/list_all_task_history.py +6 -7
- annofabcli/task_history/list_task_history.py +4 -5
- annofabcli/task_history/subcommand_task_history.py +1 -3
- annofabcli/task_history_event/download_task_history_event_json.py +4 -6
- annofabcli/task_history_event/list_all_task_history_event.py +7 -7
- annofabcli/task_history_event/list_worktime.py +17 -16
- annofabcli/task_history_event/subcommand_task_history_event.py +1 -2
- {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/METADATA +9 -15
- annofabcli-1.113.0.dist-info/RECORD +231 -0
- {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/WHEEL +1 -1
- annofabcli-1.111.2.dist-info/RECORD +0 -228
- {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/entry_points.txt +0 -0
- {annofabcli-1.111.2.dist-info → annofabcli-1.113.0.dist-info}/licenses/LICENSE +0 -0
annofabcli/task/reject_tasks.py
CHANGED
|
@@ -6,16 +6,14 @@ import multiprocessing
|
|
|
6
6
|
import sys
|
|
7
7
|
import uuid
|
|
8
8
|
from functools import partial
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
|
-
import annofabapi.utils
|
|
13
12
|
import requests
|
|
14
13
|
from annofabapi.dataclass.task import Task
|
|
15
14
|
from annofabapi.models import InputDataType, ProjectMemberRole, TaskPhase, TaskStatus
|
|
16
15
|
from annofabapi.plugin import EditorPluginId
|
|
17
16
|
|
|
18
|
-
import annofabcli
|
|
19
17
|
import annofabcli.common.cli
|
|
20
18
|
from annofabcli.common.cli import (
|
|
21
19
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -32,7 +30,7 @@ logger = logging.getLogger(__name__)
|
|
|
32
30
|
|
|
33
31
|
|
|
34
32
|
class RejectTasksMain(CommandLineWithConfirm):
|
|
35
|
-
def __init__(self, service: annofabapi.Resource, *, comment_data:
|
|
33
|
+
def __init__(self, service: annofabapi.Resource, *, comment_data: dict[str, Any] | None, all_yes: bool = False) -> None:
|
|
36
34
|
self.service = service
|
|
37
35
|
self.facade = AnnofabApiFacade(service)
|
|
38
36
|
self.comment_data = comment_data
|
|
@@ -70,7 +68,7 @@ class RejectTasksMain(CommandLineWithConfirm):
|
|
|
70
68
|
|
|
71
69
|
self.service.api.batch_update_comments(project_id, task["task_id"], first_input_data_id, request_body=req_inspection)
|
|
72
70
|
|
|
73
|
-
def confirm_reject_task(self, task_id: str, assign_last_annotator: bool, assigned_annotator_user_id:
|
|
71
|
+
def confirm_reject_task(self, task_id: str, assign_last_annotator: bool, assigned_annotator_user_id: str | None) -> bool: # noqa: FBT001
|
|
74
72
|
confirm_message = f"task_id='{task_id}' のタスクを差し戻しますか?"
|
|
75
73
|
if assign_last_annotator:
|
|
76
74
|
confirm_message += "最後の教師付フェーズの担当者を割り当てます。"
|
|
@@ -114,9 +112,9 @@ class RejectTasksMain(CommandLineWithConfirm):
|
|
|
114
112
|
task: dict[str, Any],
|
|
115
113
|
*,
|
|
116
114
|
assign_last_annotator: bool,
|
|
117
|
-
assigned_annotator_user_id:
|
|
115
|
+
assigned_annotator_user_id: str | None,
|
|
118
116
|
cancel_acceptance: bool = False,
|
|
119
|
-
task_query:
|
|
117
|
+
task_query: TaskQuery | None = None,
|
|
120
118
|
) -> bool:
|
|
121
119
|
"""
|
|
122
120
|
以下の状態を見て、差し戻し可能かどうかを判断します。
|
|
@@ -151,12 +149,12 @@ class RejectTasksMain(CommandLineWithConfirm):
|
|
|
151
149
|
project_id: str,
|
|
152
150
|
task_id: str,
|
|
153
151
|
*,
|
|
154
|
-
inspection_comment:
|
|
152
|
+
inspection_comment: str | None = None,
|
|
155
153
|
assign_last_annotator: bool = True,
|
|
156
|
-
assigned_annotator_user_id:
|
|
154
|
+
assigned_annotator_user_id: str | None = None,
|
|
157
155
|
cancel_acceptance: bool = False,
|
|
158
|
-
task_query:
|
|
159
|
-
task_index:
|
|
156
|
+
task_query: TaskQuery | None = None,
|
|
157
|
+
task_index: int | None = None,
|
|
160
158
|
) -> bool:
|
|
161
159
|
"""
|
|
162
160
|
タスクを差し戻します。
|
|
@@ -235,11 +233,11 @@ class RejectTasksMain(CommandLineWithConfirm):
|
|
|
235
233
|
self,
|
|
236
234
|
tpl: tuple[int, str],
|
|
237
235
|
project_id: str,
|
|
238
|
-
inspection_comment:
|
|
236
|
+
inspection_comment: str | None = None,
|
|
239
237
|
assign_last_annotator: bool = True, # noqa: FBT001, FBT002
|
|
240
|
-
assigned_annotator_user_id:
|
|
238
|
+
assigned_annotator_user_id: str | None = None,
|
|
241
239
|
cancel_acceptance: bool = False, # noqa: FBT001, FBT002
|
|
242
|
-
task_query:
|
|
240
|
+
task_query: TaskQuery | None = None,
|
|
243
241
|
) -> bool:
|
|
244
242
|
task_index, task_id = tpl
|
|
245
243
|
try:
|
|
@@ -261,12 +259,12 @@ class RejectTasksMain(CommandLineWithConfirm):
|
|
|
261
259
|
self,
|
|
262
260
|
project_id: str,
|
|
263
261
|
task_id_list: list[str],
|
|
264
|
-
inspection_comment:
|
|
262
|
+
inspection_comment: str | None = None,
|
|
265
263
|
assign_last_annotator: bool = True, # noqa: FBT001, FBT002
|
|
266
|
-
assigned_annotator_user_id:
|
|
264
|
+
assigned_annotator_user_id: str | None = None,
|
|
267
265
|
cancel_acceptance: bool = False, # noqa: FBT001, FBT002
|
|
268
|
-
task_query:
|
|
269
|
-
parallelism:
|
|
266
|
+
task_query: TaskQuery | None = None,
|
|
267
|
+
parallelism: int | None = None,
|
|
270
268
|
) -> None:
|
|
271
269
|
if task_query is not None:
|
|
272
270
|
task_query = self.facade.set_account_id_of_task_query(project_id, task_query)
|
|
@@ -339,7 +337,7 @@ class RejectTasks(CommandLine):
|
|
|
339
337
|
super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
|
|
340
338
|
|
|
341
339
|
dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
|
|
342
|
-
task_query:
|
|
340
|
+
task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
|
|
343
341
|
|
|
344
342
|
comment_data = annofabcli.common.cli.get_json_from_args(args.comment_data)
|
|
345
343
|
custom_project_type = CustomProjectType(args.custom_project_type) if args.custom_project_type is not None else None
|
|
@@ -447,7 +445,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
447
445
|
parser.set_defaults(subcommand_func=main)
|
|
448
446
|
|
|
449
447
|
|
|
450
|
-
def add_parser(subparsers:
|
|
448
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
451
449
|
subcommand_name = "reject"
|
|
452
450
|
subcommand_help = "タスクを差し戻します。"
|
|
453
451
|
description = "タスクを差し戻します。差し戻す際、検査コメントを付与することもできます。作業中状態のタスクに対しては差し戻せません。"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
|
-
import annofabcli
|
|
5
3
|
import annofabcli.common.cli
|
|
6
4
|
import annofabcli.task.cancel_acceptance
|
|
7
5
|
import annofabcli.task.change_operator
|
|
@@ -45,7 +43,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
45
43
|
annofabcli.task.update_metadata_of_task.add_parser(subparsers)
|
|
46
44
|
|
|
47
45
|
|
|
48
|
-
def add_parser(subparsers:
|
|
46
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
49
47
|
subcommand_name = "task"
|
|
50
48
|
subcommand_help = "タスク関係のサブコマンド"
|
|
51
49
|
description = "タスク関係のサブコマンド"
|
|
@@ -8,12 +8,11 @@ import multiprocessing
|
|
|
8
8
|
import sys
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import partial
|
|
11
|
-
from typing import Any
|
|
11
|
+
from typing import Any
|
|
12
12
|
|
|
13
13
|
import annofabapi
|
|
14
14
|
from annofabapi.models import ProjectMemberRole
|
|
15
15
|
|
|
16
|
-
import annofabcli
|
|
17
16
|
import annofabcli.common.cli
|
|
18
17
|
from annofabcli.common.cli import (
|
|
19
18
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -27,7 +26,7 @@ from annofabcli.common.facade import AnnofabApiFacade
|
|
|
27
26
|
|
|
28
27
|
logger = logging.getLogger(__name__)
|
|
29
28
|
|
|
30
|
-
Metadata = dict[str,
|
|
29
|
+
Metadata = dict[str, str | bool | int]
|
|
31
30
|
|
|
32
31
|
|
|
33
32
|
@dataclass(frozen=True)
|
|
@@ -42,7 +41,7 @@ class UpdateMetadataOfTaskMain(CommandLineWithConfirm):
|
|
|
42
41
|
service: annofabapi.Resource,
|
|
43
42
|
*,
|
|
44
43
|
is_overwrite_metadata: bool,
|
|
45
|
-
parallelism:
|
|
44
|
+
parallelism: int | None = None,
|
|
46
45
|
all_yes: bool = False,
|
|
47
46
|
) -> None:
|
|
48
47
|
self.service = service
|
|
@@ -61,7 +60,7 @@ class UpdateMetadataOfTaskMain(CommandLineWithConfirm):
|
|
|
61
60
|
project_id: str,
|
|
62
61
|
task_id: str,
|
|
63
62
|
metadata: dict[str, Any],
|
|
64
|
-
task_index:
|
|
63
|
+
task_index: int | None = None,
|
|
65
64
|
) -> bool:
|
|
66
65
|
logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
|
|
67
66
|
task = self.service.wrapper.get_task_or_none(project_id, task_id)
|
|
@@ -272,7 +271,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
272
271
|
parser.set_defaults(subcommand_func=main)
|
|
273
272
|
|
|
274
273
|
|
|
275
|
-
def add_parser(subparsers:
|
|
274
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
276
275
|
subcommand_name = "update_metadata"
|
|
277
276
|
subcommand_help = "タスクのメタデータを更新します。"
|
|
278
277
|
description = "タスクのメタデータを上書きして更新します。"
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from annofabapi.models import ProjectMemberRole
|
|
7
6
|
|
|
8
|
-
import annofabcli
|
|
9
7
|
import annofabcli.common.cli
|
|
10
8
|
from annofabcli.common.cli import CommandLine, build_annofabapi_resource_and_login
|
|
11
9
|
from annofabcli.common.download import DownloadingFile
|
|
@@ -15,17 +13,17 @@ logger = logging.getLogger(__name__)
|
|
|
15
13
|
|
|
16
14
|
|
|
17
15
|
class DownloadingTaskHistory(CommandLine):
|
|
18
|
-
def download_task_history_json(self, project_id: str, output_file: Path)
|
|
16
|
+
def download_task_history_json(self, project_id: str, output_file: Path) -> None:
|
|
19
17
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
|
|
20
18
|
project_title = self.facade.get_project_title(project_id)
|
|
21
|
-
logger.info(f"{project_title}
|
|
19
|
+
logger.info(f"project_id='{project_id}'のタスク履歴全件ファイルをダウンロードします。 :: project_title='{project_title}'")
|
|
22
20
|
|
|
23
21
|
obj = DownloadingFile(self.service)
|
|
24
22
|
obj.download_task_history_json(
|
|
25
23
|
project_id,
|
|
26
24
|
str(output_file),
|
|
27
25
|
)
|
|
28
|
-
logger.info(f"
|
|
26
|
+
logger.info(f"project_id='{project_id}'のタスク履歴全件ファイルをダウンロードしました。 :: output='{output_file}', project_title='{project_title}'")
|
|
29
27
|
|
|
30
28
|
def main(self) -> None:
|
|
31
29
|
args = self.args
|
|
@@ -50,7 +48,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
50
48
|
parser.set_defaults(subcommand_func=main)
|
|
51
49
|
|
|
52
50
|
|
|
53
|
-
def add_parser(subparsers:
|
|
51
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
54
52
|
subcommand_name = "download"
|
|
55
53
|
subcommand_help = "タスク履歴全件ファイルをダウンロードします。"
|
|
56
54
|
epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
|
|
@@ -3,12 +3,11 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
import tempfile
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
import annofabapi
|
|
9
8
|
from annofabapi.models import TaskHistory
|
|
10
9
|
|
|
11
|
-
import annofabcli
|
|
10
|
+
import annofabcli.common.cli
|
|
12
11
|
from annofabcli.common.cli import ArgumentParser, CommandLine, build_annofabapi_resource_and_login
|
|
13
12
|
from annofabcli.common.download import DownloadingFile
|
|
14
13
|
from annofabcli.common.enums import FormatArgument
|
|
@@ -27,7 +26,7 @@ class ListTaskHistoryWithJsonMain:
|
|
|
27
26
|
self.facade = AnnofabApiFacade(service)
|
|
28
27
|
|
|
29
28
|
@staticmethod
|
|
30
|
-
def filter_task_history_dict(task_history_dict: TaskHistoryDict, task_id_list:
|
|
29
|
+
def filter_task_history_dict(task_history_dict: TaskHistoryDict, task_id_list: list[str] | None = None) -> TaskHistoryDict:
|
|
31
30
|
if task_id_list is None:
|
|
32
31
|
return task_history_dict
|
|
33
32
|
|
|
@@ -40,7 +39,7 @@ class ListTaskHistoryWithJsonMain:
|
|
|
40
39
|
filtered_task_history_dict[task_id] = task_history_list
|
|
41
40
|
return filtered_task_history_dict
|
|
42
41
|
|
|
43
|
-
def get_task_history_dict(self, project_id: str, task_history_json:
|
|
42
|
+
def get_task_history_dict(self, project_id: str, task_history_json: Path | None = None, task_id_list: list[str] | None = None) -> TaskHistoryDict:
|
|
44
43
|
"""出力対象のタスク履歴情報を取得する"""
|
|
45
44
|
if task_history_json is None:
|
|
46
45
|
downloading_obj = DownloadingFile(self.service)
|
|
@@ -78,8 +77,8 @@ class ListTaskHistoryWithJson(CommandLine):
|
|
|
78
77
|
def print_task_history_list( # noqa: ANN201
|
|
79
78
|
self,
|
|
80
79
|
project_id: str,
|
|
81
|
-
task_history_json:
|
|
82
|
-
task_id_list:
|
|
80
|
+
task_history_json: Path | None,
|
|
81
|
+
task_id_list: list[str] | None,
|
|
83
82
|
arg_format: FormatArgument,
|
|
84
83
|
):
|
|
85
84
|
"""
|
|
@@ -151,7 +150,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
151
150
|
parser.set_defaults(subcommand_func=main)
|
|
152
151
|
|
|
153
152
|
|
|
154
|
-
def add_parser(subparsers:
|
|
153
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
155
154
|
subcommand_name = "list_all"
|
|
156
155
|
subcommand_help = "すべてのタスク履歴の一覧を出力します。"
|
|
157
156
|
description = (
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Optional
|
|
4
3
|
|
|
5
4
|
import annofabapi
|
|
6
5
|
from annofabapi.models import TaskHistory
|
|
7
6
|
|
|
8
|
-
import annofabcli
|
|
7
|
+
import annofabcli.common.cli
|
|
9
8
|
from annofabcli.common.cli import ArgumentParser, CommandLine, build_annofabapi_resource_and_login
|
|
10
9
|
from annofabcli.common.enums import FormatArgument
|
|
11
10
|
from annofabcli.common.facade import AnnofabApiFacade
|
|
@@ -53,7 +52,7 @@ class ListTaskHistoryMain:
|
|
|
53
52
|
all_task_list = self.service.wrapper.get_all_tasks(project_id)
|
|
54
53
|
return [e["task_id"] for e in all_task_list]
|
|
55
54
|
|
|
56
|
-
def get_task_history_dict_for_output(self, project_id: str, task_id_list:
|
|
55
|
+
def get_task_history_dict_for_output(self, project_id: str, task_id_list: list[str] | None = None) -> TaskHistoryDict:
|
|
57
56
|
"""出力対象のタスク履歴情報を取得する"""
|
|
58
57
|
if task_id_list is None:
|
|
59
58
|
task_id_list = self.get_all_task_id_list(project_id)
|
|
@@ -78,7 +77,7 @@ class ListTaskHistory(CommandLine):
|
|
|
78
77
|
def print_task_history_list(
|
|
79
78
|
self,
|
|
80
79
|
project_id: str,
|
|
81
|
-
task_id_list:
|
|
80
|
+
task_id_list: list[str] | None,
|
|
82
81
|
arg_format: FormatArgument,
|
|
83
82
|
) -> None:
|
|
84
83
|
"""
|
|
@@ -143,7 +142,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
143
142
|
parser.set_defaults(subcommand_func=main)
|
|
144
143
|
|
|
145
144
|
|
|
146
|
-
def add_parser(subparsers:
|
|
145
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
147
146
|
subcommand_name = "list"
|
|
148
147
|
subcommand_help = "タスク履歴の一覧を出力します。"
|
|
149
148
|
description = "タスク履歴の一覧を出力します。"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
|
-
import annofabcli
|
|
5
3
|
import annofabcli.common.cli
|
|
6
4
|
import annofabcli.task_history.download_task_history_json
|
|
7
5
|
import annofabcli.task_history.list_all_task_history
|
|
@@ -17,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
17
15
|
annofabcli.task_history.list_all_task_history.add_parser(subparsers)
|
|
18
16
|
|
|
19
17
|
|
|
20
|
-
def add_parser(subparsers:
|
|
18
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
21
19
|
subcommand_name = "task_history"
|
|
22
20
|
subcommand_help = "タスク履歴関係のサブコマンド"
|
|
23
21
|
description = "タスク履歴関係のサブコマンド"
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import logging
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from annofabapi.models import ProjectMemberRole
|
|
7
6
|
|
|
8
|
-
import annofabcli
|
|
9
7
|
import annofabcli.common.cli
|
|
10
8
|
from annofabcli.common.cli import CommandLine, build_annofabapi_resource_and_login
|
|
11
9
|
from annofabcli.common.download import DownloadingFile
|
|
@@ -15,17 +13,17 @@ logger = logging.getLogger(__name__)
|
|
|
15
13
|
|
|
16
14
|
|
|
17
15
|
class DownloadingTaskHistoryEvent(CommandLine):
|
|
18
|
-
def download_task_history_event_json(self, project_id: str, output_file: Path)
|
|
16
|
+
def download_task_history_event_json(self, project_id: str, output_file: Path) -> None:
|
|
19
17
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
|
|
20
18
|
project_title = self.facade.get_project_title(project_id)
|
|
21
|
-
logger.info(f"{project_title}
|
|
19
|
+
logger.info(f"project_id='{project_id}'のタスク履歴イベント全件ファイルをダウンロードします。 :: project_title='{project_title}'")
|
|
22
20
|
|
|
23
21
|
obj = DownloadingFile(self.service)
|
|
24
22
|
obj.download_task_history_event_json(
|
|
25
23
|
project_id,
|
|
26
24
|
str(output_file),
|
|
27
25
|
)
|
|
28
|
-
logger.info(f"
|
|
26
|
+
logger.info(f"project_id='{project_id}'のタスク履歴イベント全件ファイルをダウンロードしました。 :: output='{output_file}', project_title='{project_title}'")
|
|
29
27
|
|
|
30
28
|
def main(self) -> None:
|
|
31
29
|
args = self.args
|
|
@@ -50,7 +48,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
50
48
|
parser.set_defaults(subcommand_func=main)
|
|
51
49
|
|
|
52
50
|
|
|
53
|
-
def add_parser(subparsers:
|
|
51
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
54
52
|
subcommand_name = "download"
|
|
55
53
|
subcommand_help = "タスク履歴イベント全件ファイルをダウンロードします。"
|
|
56
54
|
epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
|
|
@@ -5,13 +5,13 @@ import json
|
|
|
5
5
|
import logging
|
|
6
6
|
import tempfile
|
|
7
7
|
from pathlib import Path
|
|
8
|
-
from typing import Any
|
|
8
|
+
from typing import Any
|
|
9
9
|
|
|
10
10
|
import annofabapi
|
|
11
11
|
import pandas
|
|
12
12
|
from annofabapi.models import TaskHistoryEvent
|
|
13
13
|
|
|
14
|
-
import annofabcli
|
|
14
|
+
import annofabcli.common.cli
|
|
15
15
|
from annofabcli.common.cli import (
|
|
16
16
|
ArgumentParser,
|
|
17
17
|
CommandLine,
|
|
@@ -31,7 +31,7 @@ class ListTaskHistoryEventWithJsonMain:
|
|
|
31
31
|
self.service = service
|
|
32
32
|
|
|
33
33
|
@staticmethod
|
|
34
|
-
def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list:
|
|
34
|
+
def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: list[str] | None = None) -> list[TaskHistoryEvent]:
|
|
35
35
|
if task_id_list is not None:
|
|
36
36
|
result = []
|
|
37
37
|
task_id_set = set(task_id_list)
|
|
@@ -43,7 +43,7 @@ class ListTaskHistoryEventWithJsonMain:
|
|
|
43
43
|
|
|
44
44
|
return task_history_event_list
|
|
45
45
|
|
|
46
|
-
def get_task_history_event_list(self, project_id: str, task_history_event_json:
|
|
46
|
+
def get_task_history_event_list(self, project_id: str, task_history_event_json: Path | None = None, task_id_list: list[str] | None = None) -> list[dict[str, Any]]:
|
|
47
47
|
if task_history_event_json is None:
|
|
48
48
|
downloading_obj = DownloadingFile(self.service)
|
|
49
49
|
# `NamedTemporaryFile`を使わない理由: Windowsで`PermissionError`が発生するため
|
|
@@ -72,8 +72,8 @@ class ListTaskHistoryEventWithJson(CommandLine):
|
|
|
72
72
|
def print_task_history_event_list(
|
|
73
73
|
self,
|
|
74
74
|
project_id: str,
|
|
75
|
-
task_history_event_json:
|
|
76
|
-
task_id_list:
|
|
75
|
+
task_history_event_json: Path | None,
|
|
76
|
+
task_id_list: list[str] | None,
|
|
77
77
|
arg_format: FormatArgument,
|
|
78
78
|
) -> None:
|
|
79
79
|
super().validate_project(project_id, project_member_roles=None)
|
|
@@ -165,7 +165,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
165
165
|
parser.set_defaults(subcommand_func=main)
|
|
166
166
|
|
|
167
167
|
|
|
168
|
-
def add_parser(subparsers:
|
|
168
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
169
169
|
subcommand_name = "list_all"
|
|
170
170
|
subcommand_help = "すべてのタスク履歴イベントの一覧を出力します。"
|
|
171
171
|
description = "すべてのタスク履歴イベントの一覧を出力します。\n出力されるタスク履歴イベントは、コマンドを実行した日の02:00(JST)頃の状態です。最新の情報を出力する方法はありません。"
|
|
@@ -6,7 +6,7 @@ import logging
|
|
|
6
6
|
from collections import defaultdict
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from pathlib import Path
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
12
|
import pandas
|
|
@@ -14,7 +14,8 @@ from annofabapi.models import TaskHistoryEvent, TaskStatus
|
|
|
14
14
|
from dataclasses_json import DataClassJsonMixin
|
|
15
15
|
from dateutil.parser import parse
|
|
16
16
|
|
|
17
|
-
import annofabcli
|
|
17
|
+
import annofabcli.common.cli
|
|
18
|
+
import annofabcli.common.utils
|
|
18
19
|
from annofabcli.common.cli import (
|
|
19
20
|
ArgumentParser,
|
|
20
21
|
CommandLine,
|
|
@@ -45,9 +46,9 @@ class RequestOfTaskHistoryEvent(DataClassJsonMixin):
|
|
|
45
46
|
|
|
46
47
|
status: str
|
|
47
48
|
force: bool
|
|
48
|
-
account_id:
|
|
49
|
-
user_id:
|
|
50
|
-
username:
|
|
49
|
+
account_id: str | None
|
|
50
|
+
user_id: str | None
|
|
51
|
+
username: str | None
|
|
51
52
|
|
|
52
53
|
|
|
53
54
|
@dataclass
|
|
@@ -72,7 +73,7 @@ class ListWorktimeFromTaskHistoryEventMain:
|
|
|
72
73
|
self.visualize = AddProps(service, project_id)
|
|
73
74
|
|
|
74
75
|
@staticmethod
|
|
75
|
-
def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list:
|
|
76
|
+
def filter_task_history_event(task_history_event_list: list[TaskHistoryEvent], task_id_list: list[str] | None = None) -> list[TaskHistoryEvent]:
|
|
76
77
|
if task_id_list is not None:
|
|
77
78
|
result = []
|
|
78
79
|
task_id_set = set(task_id_list)
|
|
@@ -84,7 +85,7 @@ class ListWorktimeFromTaskHistoryEventMain:
|
|
|
84
85
|
|
|
85
86
|
return task_history_event_list
|
|
86
87
|
|
|
87
|
-
def get_task_history_event_list(self, project_id: str, task_history_event_json:
|
|
88
|
+
def get_task_history_event_list(self, project_id: str, task_history_event_json: Path | None = None) -> list[dict[str, Any]]:
|
|
88
89
|
if task_history_event_json is None:
|
|
89
90
|
downloading_obj = DownloadingFile(self.service)
|
|
90
91
|
cache_dir = annofabcli.common.utils.get_cache_dir()
|
|
@@ -103,8 +104,8 @@ class ListWorktimeFromTaskHistoryEventMain:
|
|
|
103
104
|
def _create_task_history_event_dict(
|
|
104
105
|
task_history_event_list: list[TaskHistoryEvent],
|
|
105
106
|
*,
|
|
106
|
-
task_ids:
|
|
107
|
-
account_ids:
|
|
107
|
+
task_ids: set[str] | None,
|
|
108
|
+
account_ids: set[str] | None,
|
|
108
109
|
) -> dict[str, list[TaskHistoryEvent]]:
|
|
109
110
|
"""
|
|
110
111
|
keyがtask_id, valueがタスク履歴イベントのlistであるdictを生成する。
|
|
@@ -229,9 +230,9 @@ class ListWorktimeFromTaskHistoryEventMain:
|
|
|
229
230
|
def get_worktime_list(
|
|
230
231
|
self,
|
|
231
232
|
project_id: str,
|
|
232
|
-
task_history_event_json:
|
|
233
|
-
task_id_list:
|
|
234
|
-
user_id_list:
|
|
233
|
+
task_history_event_json: Path | None = None,
|
|
234
|
+
task_id_list: list[str] | None = None,
|
|
235
|
+
user_id_list: list[str] | None = None,
|
|
235
236
|
) -> list[WorktimeFromTaskHistoryEvent]:
|
|
236
237
|
all_task_history_event_list = self.get_task_history_event_list(project_id, task_history_event_json=task_history_event_json)
|
|
237
238
|
|
|
@@ -251,9 +252,9 @@ class ListWorktimeFromTaskHistoryEvent(CommandLine):
|
|
|
251
252
|
def print_worktime_from_task_history_event(
|
|
252
253
|
self,
|
|
253
254
|
project_id: str,
|
|
254
|
-
task_history_event_json:
|
|
255
|
-
task_id_list:
|
|
256
|
-
user_id_list:
|
|
255
|
+
task_history_event_json: Path | None,
|
|
256
|
+
task_id_list: list[str] | None,
|
|
257
|
+
user_id_list: list[str] | None,
|
|
257
258
|
arg_format: FormatArgument,
|
|
258
259
|
) -> None:
|
|
259
260
|
super().validate_project(project_id, project_member_roles=None)
|
|
@@ -366,7 +367,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
366
367
|
parser.set_defaults(subcommand_func=main)
|
|
367
368
|
|
|
368
369
|
|
|
369
|
-
def add_parser(subparsers:
|
|
370
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
370
371
|
subcommand_name = "list_worktime"
|
|
371
372
|
subcommand_help = "タスク履歴イベントから作業時間の一覧を出力します。"
|
|
372
373
|
description = "タスク履歴イベントから作業時間の一覧を出力します。\nタスク履歴より詳細な作業時間の情報を出力します。"
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import argparse
|
|
2
|
-
from typing import Optional
|
|
3
2
|
|
|
4
3
|
import annofabcli.task_history_event.download_task_history_event_json
|
|
5
4
|
import annofabcli.task_history_event.list_all_task_history_event
|
|
@@ -16,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
16
15
|
annofabcli.task_history_event.list_worktime.add_parser(subparsers)
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
def add_parser(subparsers:
|
|
18
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
20
19
|
subcommand_name = "task_history_event"
|
|
21
20
|
subcommand_help = "タスク履歴イベント関係のサブコマンド"
|
|
22
21
|
description = "タスク履歴イベント関係のサブコマンド。task_history_eventコマンドはベータ版です。予告なく変更される場合があります。"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: annofabcli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.113.0
|
|
4
4
|
Summary: Utility Command Line Interface for AnnoFab
|
|
5
5
|
Author: Kurusugawa Computer Inc.
|
|
6
6
|
License: MIT
|
|
@@ -10,25 +10,28 @@ Classifier: Development Status :: 4 - Beta
|
|
|
10
10
|
Classifier: Environment :: Console
|
|
11
11
|
Classifier: Intended Audience :: Developers
|
|
12
12
|
Classifier: Operating System :: OS Independent
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
18
|
Classifier: Topic :: Utilities
|
|
19
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
|
+
Requires-Dist: annofabapi-3dpc-extensions
|
|
20
21
|
Requires-Dist: annofabapi>=1.5.1
|
|
21
|
-
Requires-Dist: bokeh
|
|
22
|
+
Requires-Dist: bokeh>=3.8
|
|
22
23
|
Requires-Dist: dictdiffer
|
|
23
24
|
Requires-Dist: isodate
|
|
24
25
|
Requires-Dist: more-itertools
|
|
25
26
|
Requires-Dist: numpy
|
|
26
27
|
Requires-Dist: pandas<3,>=2
|
|
27
28
|
Requires-Dist: pillow
|
|
29
|
+
Requires-Dist: pydantic>=2.12; python_version >= '3.14'
|
|
28
30
|
Requires-Dist: pyquery
|
|
29
31
|
Requires-Dist: python-datauri
|
|
30
32
|
Requires-Dist: pyyaml
|
|
31
33
|
Requires-Dist: requests
|
|
34
|
+
Requires-Dist: shapely
|
|
32
35
|
Requires-Dist: typing-extensions>=4.5
|
|
33
36
|
Requires-Dist: ulid-py>=1.1.0
|
|
34
37
|
Description-Content-Type: text/markdown
|
|
@@ -58,7 +61,7 @@ Description-Content-Type: text/markdown
|
|
|
58
61
|
* TODO
|
|
59
62
|
|
|
60
63
|
# Requirements
|
|
61
|
-
* Python 3.
|
|
64
|
+
* Python 3.10+
|
|
62
65
|
|
|
63
66
|
# Install
|
|
64
67
|
|
|
@@ -110,13 +113,4 @@ $ annofabcli annotation list_count --project_id prj1 --task_id file://task.txt -
|
|
|
110
113
|
$ annofabcli task reject --project_id prj1 --task_id file://tasks.txt --cancel_acceptance \
|
|
111
114
|
--comment "carラベルのoccluded属性を見直してください"
|
|
112
115
|
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
# 補足
|
|
116
|
-
|
|
117
|
-
# Windowsでannofabcliを使う場合
|
|
118
|
-
WindowsのコマンドプロンプトやPowerShellでannofabcliを使う場合、JSON文字列内の二重引用をエスケープする必要があります。
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
> annofabcli task list --project_id prj1 --task_query '{"\status\": \"complete\"}'
|
|
122
|
-
```
|
|
116
|
+
```
|