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
|
@@ -11,7 +11,6 @@ from collections.abc import Collection, Sequence
|
|
|
11
11
|
from enum import Enum
|
|
12
12
|
from functools import partial
|
|
13
13
|
from pathlib import Path
|
|
14
|
-
from typing import Optional, Union
|
|
15
14
|
|
|
16
15
|
import bokeh
|
|
17
16
|
import numpy
|
|
@@ -22,7 +21,6 @@ from bokeh.models.annotations.labels import Title
|
|
|
22
21
|
from bokeh.models.widgets.markups import PreText
|
|
23
22
|
from bokeh.plotting import ColumnDataSource, figure
|
|
24
23
|
|
|
25
|
-
import annofabcli
|
|
26
24
|
import annofabcli.common.cli
|
|
27
25
|
from annofabcli.common.cli import (
|
|
28
26
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -49,9 +47,9 @@ def plot_video_duration(
|
|
|
49
47
|
output_file: Path,
|
|
50
48
|
*,
|
|
51
49
|
time_unit: TimeUnit,
|
|
52
|
-
bin_width:
|
|
53
|
-
project_id:
|
|
54
|
-
project_title:
|
|
50
|
+
bin_width: float | None = None,
|
|
51
|
+
project_id: str | None = None,
|
|
52
|
+
project_title: str | None = None,
|
|
55
53
|
) -> None:
|
|
56
54
|
"""
|
|
57
55
|
ラベルごとの区間アノテーションの長さのヒストグラムを出力します。
|
|
@@ -66,7 +64,7 @@ def plot_video_duration(
|
|
|
66
64
|
|
|
67
65
|
def create_figure(
|
|
68
66
|
durations: Sequence[float],
|
|
69
|
-
bins:
|
|
67
|
+
bins: int | numpy.ndarray,
|
|
70
68
|
histogram_range: tuple[float, float],
|
|
71
69
|
title: str,
|
|
72
70
|
x_axis_label: str,
|
|
@@ -75,10 +73,10 @@ def plot_video_duration(
|
|
|
75
73
|
hist, bin_edges = numpy.histogram(durations, bins=bins, range=histogram_range)
|
|
76
74
|
|
|
77
75
|
df_histogram = pandas.DataFrame({"frequency": hist, "left": bin_edges[:-1], "right": bin_edges[1:]})
|
|
78
|
-
df_histogram["interval"] = [f"{left:.1f} to {right:.1f}" for left, right in zip(df_histogram["left"], df_histogram["right"])]
|
|
76
|
+
df_histogram["interval"] = [f"{left:.1f} to {right:.1f}" for left, right in zip(df_histogram["left"], df_histogram["right"], strict=False)]
|
|
79
77
|
|
|
80
78
|
source = ColumnDataSource(df_histogram)
|
|
81
|
-
fig = figure(
|
|
79
|
+
fig = figure( # type: ignore[call-arg]
|
|
82
80
|
width=400,
|
|
83
81
|
height=300,
|
|
84
82
|
x_axis_label=x_axis_label,
|
|
@@ -108,7 +106,7 @@ def plot_video_duration(
|
|
|
108
106
|
if bins_sequence[-1] == max_duration:
|
|
109
107
|
bins_sequence = numpy.append(bins_sequence, bins_sequence[-1] + bin_width)
|
|
110
108
|
|
|
111
|
-
bins:
|
|
109
|
+
bins: int | numpy.ndarray = bins_sequence
|
|
112
110
|
else:
|
|
113
111
|
bins = BIN_COUNT
|
|
114
112
|
|
|
@@ -142,10 +140,10 @@ def get_video_duration_list(
|
|
|
142
140
|
input_data_json: Path,
|
|
143
141
|
task_json: Path,
|
|
144
142
|
*,
|
|
145
|
-
input_data_ids:
|
|
143
|
+
input_data_ids: Collection[str] | None = None,
|
|
146
144
|
from_datetime: datetime.datetime | None = None,
|
|
147
145
|
to_datetime: datetime.datetime | None = None,
|
|
148
|
-
task_ids:
|
|
146
|
+
task_ids: Collection[str] | None = None,
|
|
149
147
|
) -> list[float]:
|
|
150
148
|
"""
|
|
151
149
|
入力データである動画の長さ(単位は秒)の一覧を取得します。
|
|
@@ -214,13 +212,13 @@ class VisualizeVideoDuration(CommandLine):
|
|
|
214
212
|
output_html: Path,
|
|
215
213
|
*,
|
|
216
214
|
time_unit: TimeUnit,
|
|
217
|
-
project_id:
|
|
218
|
-
project_title:
|
|
219
|
-
bin_width:
|
|
220
|
-
input_data_ids:
|
|
221
|
-
task_ids:
|
|
222
|
-
from_date:
|
|
223
|
-
to_date:
|
|
215
|
+
project_id: str | None = None,
|
|
216
|
+
project_title: str | None = None,
|
|
217
|
+
bin_width: float | None = None,
|
|
218
|
+
input_data_ids: Collection[str] | None = None,
|
|
219
|
+
task_ids: Collection[str] | None = None,
|
|
220
|
+
from_date: str | None = None,
|
|
221
|
+
to_date: str | None = None,
|
|
224
222
|
) -> None:
|
|
225
223
|
tz_info = datetime.datetime.now().astimezone().tzinfo
|
|
226
224
|
from_datetime = datetime.datetime.fromisoformat(from_date).astimezone(tz_info) if from_date is not None else None
|
|
@@ -250,7 +248,7 @@ class VisualizeVideoDuration(CommandLine):
|
|
|
250
248
|
if not self.validate(args):
|
|
251
249
|
sys.exit(COMMAND_LINE_ERROR_STATUS_CODE)
|
|
252
250
|
|
|
253
|
-
project_id:
|
|
251
|
+
project_id: str | None = args.project_id
|
|
254
252
|
if project_id is not None:
|
|
255
253
|
super().validate_project(project_id, project_member_roles=[ProjectMemberRole.OWNER, ProjectMemberRole.TRAINING_DATA_USER])
|
|
256
254
|
project, _ = self.service.api.get_project(project_id)
|
|
@@ -392,7 +390,7 @@ def main(args: argparse.Namespace) -> None:
|
|
|
392
390
|
VisualizeVideoDuration(service, facade, args).main()
|
|
393
391
|
|
|
394
392
|
|
|
395
|
-
def add_parser(subparsers:
|
|
393
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
396
394
|
subcommand_name = "visualize_video_duration"
|
|
397
395
|
subcommand_help = "動画の長さをヒストグラムで可視化します。"
|
|
398
396
|
epilog = "オーナロールまたはアノテーションユーザロールを持つユーザで実行してください。"
|
|
@@ -3,7 +3,7 @@ import logging
|
|
|
3
3
|
import sys
|
|
4
4
|
from collections import defaultdict
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
import annofabapi
|
|
9
9
|
import pandas
|
|
@@ -11,7 +11,7 @@ import requests
|
|
|
11
11
|
from annofabapi.models import ProjectMemberRole
|
|
12
12
|
from more_itertools import first_true
|
|
13
13
|
|
|
14
|
-
import annofabcli
|
|
14
|
+
import annofabcli.common.cli
|
|
15
15
|
from annofabcli.common.cli import (
|
|
16
16
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
17
17
|
ArgumentParser,
|
|
@@ -36,7 +36,7 @@ def get_input_data_supplementary_data_dict_from_csv(csv_path: Path) -> InputData
|
|
|
36
36
|
dtype={"input_data_id": "string", "supplementary_data_id": "string"},
|
|
37
37
|
)
|
|
38
38
|
input_data_dict: InputDataSupplementaryDataDict = defaultdict(list)
|
|
39
|
-
for input_data_id, supplementary_data_id in zip(df["input_data_id"], df["supplementary_data_id"]):
|
|
39
|
+
for input_data_id, supplementary_data_id in zip(df["input_data_id"], df["supplementary_data_id"], strict=False):
|
|
40
40
|
input_data_dict[input_data_id].append(supplementary_data_id)
|
|
41
41
|
return input_data_dict
|
|
42
42
|
|
|
@@ -70,7 +70,7 @@ class DeleteSupplementaryDataMain(CommandLineWithConfirm):
|
|
|
70
70
|
|
|
71
71
|
"""
|
|
72
72
|
|
|
73
|
-
def _get_supplementary_data_list(supplementary_data_id: str) ->
|
|
73
|
+
def _get_supplementary_data_list(supplementary_data_id: str) -> dict[str, Any] | None:
|
|
74
74
|
return first_true(supplementary_data_list, pred=lambda e: e["supplementary_data_id"] == supplementary_data_id)
|
|
75
75
|
|
|
76
76
|
input_data = self.service.wrapper.get_input_data_or_none(project_id, input_data_id)
|
|
@@ -275,7 +275,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
275
275
|
parser.set_defaults(subcommand_func=main)
|
|
276
276
|
|
|
277
277
|
|
|
278
|
-
def add_parser(subparsers:
|
|
278
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
279
279
|
subcommand_name = "delete"
|
|
280
280
|
subcommand_help = "補助情報を削除します。"
|
|
281
281
|
description = "補助情報を削除します。"
|
|
@@ -7,12 +7,12 @@ import logging
|
|
|
7
7
|
import multiprocessing
|
|
8
8
|
import tempfile
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any
|
|
11
11
|
|
|
12
12
|
import annofabapi
|
|
13
13
|
from annofabapi.models import SupplementaryData
|
|
14
14
|
|
|
15
|
-
import annofabcli
|
|
15
|
+
import annofabcli.common.cli
|
|
16
16
|
from annofabcli.common.cli import PARALLELISM_CHOICES, ArgumentParser, CommandLine, build_annofabapi_resource_and_login
|
|
17
17
|
from annofabcli.common.download import DownloadingFile
|
|
18
18
|
from annofabcli.common.enums import FormatArgument
|
|
@@ -72,7 +72,7 @@ class ListSupplementaryDataMain:
|
|
|
72
72
|
logger.warning(f"input_data_id='{input_data_index}': 補助情報の取得に失敗しました。", exc_info=True)
|
|
73
73
|
return []
|
|
74
74
|
|
|
75
|
-
def get_all_supplementary_data_list(self, input_data_id_list: list[str], *, parallelism:
|
|
75
|
+
def get_all_supplementary_data_list(self, input_data_id_list: list[str], *, parallelism: int | None = None) -> list[SupplementaryData]:
|
|
76
76
|
"""
|
|
77
77
|
補助情報一覧を取得する。
|
|
78
78
|
"""
|
|
@@ -168,7 +168,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
168
168
|
parser.set_defaults(subcommand_func=main)
|
|
169
169
|
|
|
170
170
|
|
|
171
|
-
def add_parser(subparsers:
|
|
171
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
172
172
|
subcommand_name = "list"
|
|
173
173
|
subcommand_help = "補助情報一覧を出力します。"
|
|
174
174
|
description = "補助情報一覧を出力します。"
|
|
@@ -7,7 +7,7 @@ from dataclasses import dataclass
|
|
|
7
7
|
from functools import partial
|
|
8
8
|
from multiprocessing import Pool
|
|
9
9
|
from pathlib import Path
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any
|
|
11
11
|
|
|
12
12
|
import annofabapi
|
|
13
13
|
import pandas
|
|
@@ -16,7 +16,7 @@ from annofabapi.models import ProjectMemberRole, SupplementaryData
|
|
|
16
16
|
from dataclasses_json import DataClassJsonMixin
|
|
17
17
|
from more_itertools import first_true
|
|
18
18
|
|
|
19
|
-
import annofabcli
|
|
19
|
+
import annofabcli.common.cli
|
|
20
20
|
from annofabcli.common.cli import (
|
|
21
21
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
22
22
|
PARALLELISM_CHOICES,
|
|
@@ -49,9 +49,9 @@ class CliSupplementaryData(DataClassJsonMixin):
|
|
|
49
49
|
input_data_id: str
|
|
50
50
|
supplementary_data_name: str
|
|
51
51
|
supplementary_data_path: str
|
|
52
|
-
supplementary_data_id:
|
|
53
|
-
supplementary_data_type:
|
|
54
|
-
supplementary_data_number:
|
|
52
|
+
supplementary_data_id: str | None = None
|
|
53
|
+
supplementary_data_type: str | None = None
|
|
54
|
+
supplementary_data_number: int | None = None
|
|
55
55
|
|
|
56
56
|
|
|
57
57
|
@dataclass
|
|
@@ -64,9 +64,9 @@ class SupplementaryDataForPut:
|
|
|
64
64
|
supplementary_data_id: str
|
|
65
65
|
supplementary_data_name: str
|
|
66
66
|
supplementary_data_path: str
|
|
67
|
-
supplementary_data_type:
|
|
67
|
+
supplementary_data_type: str | None
|
|
68
68
|
supplementary_data_number: int
|
|
69
|
-
last_updated_datetime:
|
|
69
|
+
last_updated_datetime: str | None
|
|
70
70
|
|
|
71
71
|
|
|
72
72
|
class SubPutSupplementaryData:
|
|
@@ -249,7 +249,7 @@ class PutSupplementaryData(CommandLine):
|
|
|
249
249
|
supplementary_data_list: list[CliSupplementaryData],
|
|
250
250
|
*,
|
|
251
251
|
overwrite: bool = False,
|
|
252
|
-
parallelism:
|
|
252
|
+
parallelism: int | None = None,
|
|
253
253
|
) -> None:
|
|
254
254
|
"""
|
|
255
255
|
補助情報を一括で登録する。
|
|
@@ -412,7 +412,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
412
412
|
parser.set_defaults(subcommand_func=main)
|
|
413
413
|
|
|
414
414
|
|
|
415
|
-
def add_parser(subparsers:
|
|
415
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
416
416
|
subcommand_name = "put"
|
|
417
417
|
subcommand_help = "補助情報を登録します。"
|
|
418
418
|
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.supplementary.delete_supplementary_data
|
|
7
5
|
import annofabcli.supplementary.list_supplementary_data
|
|
@@ -17,7 +15,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
17
15
|
annofabcli.supplementary.put_supplementary_data.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 = "supplementary"
|
|
22
20
|
subcommand_help = "補助情報関係のサブコマンド"
|
|
23
21
|
description = "補助情報関係のサブコマンド"
|
|
@@ -6,7 +6,7 @@ import multiprocessing
|
|
|
6
6
|
import sys
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from functools import partial
|
|
9
|
-
from typing import Any
|
|
9
|
+
from typing import Any
|
|
10
10
|
|
|
11
11
|
import annofabapi
|
|
12
12
|
import more_itertools
|
|
@@ -14,7 +14,6 @@ import requests
|
|
|
14
14
|
from annofabapi.dataclass.task import Task
|
|
15
15
|
from annofabapi.models import ProjectMemberRole, TaskPhase, TaskStatus
|
|
16
16
|
|
|
17
|
-
import annofabcli
|
|
18
17
|
import annofabcli.common.cli
|
|
19
18
|
from annofabcli.common.cli import (
|
|
20
19
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -43,12 +42,12 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
|
|
|
43
42
|
self.project_id = project_id
|
|
44
43
|
self.facade = AnnofabApiFacade(service)
|
|
45
44
|
|
|
46
|
-
self._project_members_dict:
|
|
45
|
+
self._project_members_dict: dict[str, dict[str, Any]] | None = None
|
|
47
46
|
"""プロジェクトメンバー情報を保持する変数"""
|
|
48
47
|
|
|
49
48
|
CommandLineWithConfirm.__init__(self, all_yes)
|
|
50
49
|
|
|
51
|
-
def get_project_member_from_account_id(self, account_id: str) ->
|
|
50
|
+
def get_project_member_from_account_id(self, account_id: str) -> dict[str, Any] | None:
|
|
52
51
|
"""account_idからプロジェクトメンバを取得します。"""
|
|
53
52
|
if self._project_members_dict is None:
|
|
54
53
|
project_member_list = self.service.wrapper.get_all_project_members(self.project_id)
|
|
@@ -59,10 +58,10 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
|
|
|
59
58
|
def cancel_acceptance_for_task(
|
|
60
59
|
self,
|
|
61
60
|
task_id: str,
|
|
62
|
-
acceptor:
|
|
61
|
+
acceptor: User | None = None,
|
|
63
62
|
assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
|
|
64
|
-
task_query:
|
|
65
|
-
task_index:
|
|
63
|
+
task_query: TaskQuery | None = None,
|
|
64
|
+
task_index: int | None = None,
|
|
66
65
|
dryrun: bool = False, # noqa: FBT001, FBT002
|
|
67
66
|
) -> bool:
|
|
68
67
|
logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
|
|
@@ -77,7 +76,7 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
|
|
|
77
76
|
logger.warning(f"{logging_prefix}: task_id = {task_id} は受入完了でありません。status = {task['status']}, phase={task['phase']}")
|
|
78
77
|
return False
|
|
79
78
|
|
|
80
|
-
actual_acceptor:
|
|
79
|
+
actual_acceptor: User | None = None
|
|
81
80
|
if assign_last_acceptor:
|
|
82
81
|
# 最後の受入フェーズの担当者の情報を取得する
|
|
83
82
|
acceptor_account_id = task["account_id"]
|
|
@@ -119,9 +118,9 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
|
|
|
119
118
|
def cancel_acceptance_for_wrapper(
|
|
120
119
|
self,
|
|
121
120
|
tpl: tuple[int, str],
|
|
122
|
-
acceptor:
|
|
121
|
+
acceptor: User | None = None,
|
|
123
122
|
assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
|
|
124
|
-
task_query:
|
|
123
|
+
task_query: TaskQuery | None = None,
|
|
125
124
|
dryrun: bool = False, # noqa: FBT001, FBT002
|
|
126
125
|
) -> bool:
|
|
127
126
|
task_index, task_id = tpl
|
|
@@ -141,10 +140,10 @@ class CancelAcceptanceMain(CommandLineWithConfirm):
|
|
|
141
140
|
def cancel_acceptance_for_task_list( # noqa: ANN201
|
|
142
141
|
self,
|
|
143
142
|
task_id_list: list[str],
|
|
144
|
-
acceptor:
|
|
143
|
+
acceptor: User | None = None,
|
|
145
144
|
assign_last_acceptor: bool = True, # noqa: FBT001, FBT002
|
|
146
|
-
task_query:
|
|
147
|
-
parallelism:
|
|
145
|
+
task_query: TaskQuery | None = None,
|
|
146
|
+
parallelism: int | None = None,
|
|
148
147
|
dryrun: bool = False, # noqa: FBT001, FBT002
|
|
149
148
|
):
|
|
150
149
|
"""
|
|
@@ -221,13 +220,13 @@ class CancelAcceptance(CommandLine):
|
|
|
221
220
|
|
|
222
221
|
task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
|
|
223
222
|
|
|
224
|
-
assigned_acceptor_user_id:
|
|
223
|
+
assigned_acceptor_user_id: str | None = args.assigned_acceptor_user_id
|
|
225
224
|
|
|
226
225
|
# 最後の受入フェーズの担当者に割り当てるか否か
|
|
227
226
|
assign_last_acceptor = not args.not_assign and assigned_acceptor_user_id is None
|
|
228
227
|
|
|
229
228
|
# 受入担当者の情報を取得する
|
|
230
|
-
acceptor:
|
|
229
|
+
acceptor: User | None = None # 受入担当者
|
|
231
230
|
if assigned_acceptor_user_id is not None:
|
|
232
231
|
project_member_list = self.service.wrapper.get_all_project_members(args.project_id)
|
|
233
232
|
member = more_itertools.first_true(project_member_list, pred=lambda e: e["user_id"] == assigned_acceptor_user_id)
|
|
@@ -241,7 +240,7 @@ class CancelAcceptance(CommandLine):
|
|
|
241
240
|
acceptor = User(account_id=member["account_id"], user_id=member["user_id"], username=member["username"])
|
|
242
241
|
|
|
243
242
|
dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
|
|
244
|
-
task_query:
|
|
243
|
+
task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
|
|
245
244
|
|
|
246
245
|
super().validate_project(args.project_id, [ProjectMemberRole.OWNER])
|
|
247
246
|
main_obj = CancelAcceptanceMain(self.service, project_id=args.project_id, all_yes=args.yes)
|
|
@@ -304,7 +303,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
304
303
|
parser.set_defaults(subcommand_func=main)
|
|
305
304
|
|
|
306
305
|
|
|
307
|
-
def add_parser(subparsers:
|
|
306
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
308
307
|
subcommand_name = "cancel_acceptance"
|
|
309
308
|
subcommand_help = "受入が完了したタスクに対して、受入を取り消します。"
|
|
310
309
|
description = "受入が完了したタスクに対して、受入を取り消します。"
|
|
@@ -3,14 +3,12 @@ import logging
|
|
|
3
3
|
import multiprocessing
|
|
4
4
|
import sys
|
|
5
5
|
from functools import partial
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
import annofabapi
|
|
9
8
|
import requests
|
|
10
9
|
from annofabapi.dataclass.task import Task
|
|
11
10
|
from annofabapi.models import ProjectMemberRole, TaskStatus
|
|
12
11
|
|
|
13
|
-
import annofabcli
|
|
14
12
|
import annofabcli.common.cli
|
|
15
13
|
from annofabcli.common.cli import (
|
|
16
14
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -63,9 +61,9 @@ class ChangeOperatorMain:
|
|
|
63
61
|
self,
|
|
64
62
|
project_id: str,
|
|
65
63
|
task_id: str,
|
|
66
|
-
new_account_id:
|
|
67
|
-
task_query:
|
|
68
|
-
task_index:
|
|
64
|
+
new_account_id: str | None = None,
|
|
65
|
+
task_query: TaskQuery | None = None,
|
|
66
|
+
task_index: int | None = None,
|
|
69
67
|
) -> bool:
|
|
70
68
|
logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
|
|
71
69
|
dict_task = self.service.wrapper.get_task_or_none(project_id, task_id)
|
|
@@ -115,8 +113,8 @@ class ChangeOperatorMain:
|
|
|
115
113
|
self,
|
|
116
114
|
tpl: tuple[int, str],
|
|
117
115
|
project_id: str,
|
|
118
|
-
task_query:
|
|
119
|
-
new_account_id:
|
|
116
|
+
task_query: TaskQuery | None = None,
|
|
117
|
+
new_account_id: str | None = None,
|
|
120
118
|
) -> bool:
|
|
121
119
|
task_index, task_id = tpl
|
|
122
120
|
try:
|
|
@@ -136,9 +134,9 @@ class ChangeOperatorMain:
|
|
|
136
134
|
project_id: str,
|
|
137
135
|
task_id_list: list[str],
|
|
138
136
|
*,
|
|
139
|
-
new_user_id:
|
|
140
|
-
task_query:
|
|
141
|
-
parallelism:
|
|
137
|
+
new_user_id: str | None = None,
|
|
138
|
+
task_query: TaskQuery | None = None,
|
|
139
|
+
parallelism: int | None = None,
|
|
142
140
|
) -> None:
|
|
143
141
|
"""
|
|
144
142
|
指定した複数のタスクの担当者を変更します。
|
|
@@ -219,7 +217,7 @@ class ChangeOperator(CommandLine):
|
|
|
219
217
|
return
|
|
220
218
|
|
|
221
219
|
dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
|
|
222
|
-
task_query:
|
|
220
|
+
task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
|
|
223
221
|
|
|
224
222
|
project_id = args.project_id
|
|
225
223
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER])
|
|
@@ -270,7 +268,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
270
268
|
parser.set_defaults(subcommand_func=main)
|
|
271
269
|
|
|
272
270
|
|
|
273
|
-
def add_parser(subparsers:
|
|
271
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
274
272
|
subcommand_name = "change_operator"
|
|
275
273
|
subcommand_help = "タスクの担当者を変更します。"
|
|
276
274
|
description = "タスクの担当者を変更します。作業中状態、完了状態のタスクは、担当者を変更できません。保留中状態のタスクは、デフォルトでは担当者を変更できません。"
|
|
@@ -3,14 +3,12 @@ import logging
|
|
|
3
3
|
import multiprocessing
|
|
4
4
|
import sys
|
|
5
5
|
from functools import partial
|
|
6
|
-
from typing import Optional
|
|
7
6
|
|
|
8
7
|
import annofabapi
|
|
9
8
|
import requests
|
|
10
9
|
from annofabapi.dataclass.task import Task
|
|
11
10
|
from annofabapi.models import ProjectMemberRole, TaskStatus
|
|
12
11
|
|
|
13
|
-
import annofabcli
|
|
14
12
|
import annofabcli.common.cli
|
|
15
13
|
from annofabcli.common.cli import (
|
|
16
14
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -39,8 +37,8 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
|
|
|
39
37
|
self,
|
|
40
38
|
project_id: str,
|
|
41
39
|
task_id: str,
|
|
42
|
-
task_index:
|
|
43
|
-
task_query:
|
|
40
|
+
task_index: int | None = None,
|
|
41
|
+
task_query: TaskQuery | None = None,
|
|
44
42
|
) -> bool:
|
|
45
43
|
logging_prefix = f"{task_index + 1} 件目" if task_index is not None else ""
|
|
46
44
|
dict_task = self.service.wrapper.get_task_or_none(project_id, task_id)
|
|
@@ -79,7 +77,7 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
|
|
|
79
77
|
self,
|
|
80
78
|
tpl: tuple[int, str],
|
|
81
79
|
project_id: str,
|
|
82
|
-
task_query:
|
|
80
|
+
task_query: TaskQuery | None = None,
|
|
83
81
|
) -> bool:
|
|
84
82
|
task_index, task_id = tpl
|
|
85
83
|
try:
|
|
@@ -97,8 +95,8 @@ class ChangeStatusToBreakMain(CommandLineWithConfirm):
|
|
|
97
95
|
self,
|
|
98
96
|
project_id: str,
|
|
99
97
|
task_id_list: list[str],
|
|
100
|
-
task_query:
|
|
101
|
-
parallelism:
|
|
98
|
+
task_query: TaskQuery | None = None,
|
|
99
|
+
parallelism: int | None = None,
|
|
102
100
|
):
|
|
103
101
|
"""
|
|
104
102
|
タスクのステータスを休憩中に変更する。
|
|
@@ -172,7 +170,7 @@ class ChangeStatusToBreak(CommandLine):
|
|
|
172
170
|
task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
|
|
173
171
|
|
|
174
172
|
dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
|
|
175
|
-
task_query:
|
|
173
|
+
task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
|
|
176
174
|
|
|
177
175
|
project_id = args.project_id
|
|
178
176
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
|
|
@@ -210,7 +208,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
210
208
|
parser.set_defaults(subcommand_func=main)
|
|
211
209
|
|
|
212
210
|
|
|
213
|
-
def add_parser(subparsers:
|
|
211
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
214
212
|
subcommand_name = "change_status_to_break"
|
|
215
213
|
subcommand_help = "タスクのステータスを休憩中に変更します。"
|
|
216
214
|
description = "タスクのステータスを休憩中に変更します。ただし、操作対象のタスクは作業中か保留中である必要があります。"
|
|
@@ -6,14 +6,12 @@ import multiprocessing
|
|
|
6
6
|
import sys
|
|
7
7
|
import uuid
|
|
8
8
|
from functools import partial
|
|
9
|
-
from typing import Optional
|
|
10
9
|
|
|
11
10
|
import annofabapi
|
|
12
11
|
import requests
|
|
13
12
|
from annofabapi.dataclass.task import Task
|
|
14
13
|
from annofabapi.models import ProjectMemberRole, TaskStatus
|
|
15
14
|
|
|
16
|
-
import annofabcli
|
|
17
15
|
import annofabcli.common.cli
|
|
18
16
|
from annofabcli.common.cli import (
|
|
19
17
|
COMMAND_LINE_ERROR_STATUS_CODE,
|
|
@@ -68,9 +66,9 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
|
|
|
68
66
|
self,
|
|
69
67
|
task_id: str,
|
|
70
68
|
*,
|
|
71
|
-
comment:
|
|
72
|
-
task_index:
|
|
73
|
-
task_query:
|
|
69
|
+
comment: str | None = None,
|
|
70
|
+
task_index: int | None = None,
|
|
71
|
+
task_query: TaskQuery | None = None,
|
|
74
72
|
) -> bool:
|
|
75
73
|
"""
|
|
76
74
|
Args:
|
|
@@ -155,8 +153,8 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
|
|
|
155
153
|
self,
|
|
156
154
|
tpl: tuple[int, str],
|
|
157
155
|
*,
|
|
158
|
-
comment:
|
|
159
|
-
task_query:
|
|
156
|
+
comment: str | None = None,
|
|
157
|
+
task_query: TaskQuery | None = None,
|
|
160
158
|
) -> bool:
|
|
161
159
|
task_index, task_id = tpl
|
|
162
160
|
try:
|
|
@@ -174,9 +172,9 @@ class ChangingStatusToOnHoldMain(CommandLineWithConfirm):
|
|
|
174
172
|
self,
|
|
175
173
|
task_id_list: list[str],
|
|
176
174
|
*,
|
|
177
|
-
comment:
|
|
178
|
-
task_query:
|
|
179
|
-
parallelism:
|
|
175
|
+
comment: str | None = None,
|
|
176
|
+
task_query: TaskQuery | None = None,
|
|
177
|
+
parallelism: int | None = None,
|
|
180
178
|
):
|
|
181
179
|
"""
|
|
182
180
|
タスクのステータスを保留中に変更する。
|
|
@@ -246,7 +244,7 @@ class ChangingStatusToOnHold(CommandLine):
|
|
|
246
244
|
task_id_list = annofabcli.common.cli.get_list_from_args(args.task_id)
|
|
247
245
|
|
|
248
246
|
dict_task_query = annofabcli.common.cli.get_json_from_args(args.task_query)
|
|
249
|
-
task_query:
|
|
247
|
+
task_query: TaskQuery | None = TaskQuery.from_dict(dict_task_query) if dict_task_query is not None else None
|
|
250
248
|
|
|
251
249
|
project_id = args.project_id
|
|
252
250
|
super().validate_project(project_id, [ProjectMemberRole.OWNER, ProjectMemberRole.ACCEPTER, ProjectMemberRole.WORKER])
|
|
@@ -286,7 +284,7 @@ def parse_args(parser: argparse.ArgumentParser) -> None:
|
|
|
286
284
|
parser.set_defaults(subcommand_func=main)
|
|
287
285
|
|
|
288
286
|
|
|
289
|
-
def add_parser(subparsers:
|
|
287
|
+
def add_parser(subparsers: argparse._SubParsersAction | None = None) -> argparse.ArgumentParser:
|
|
290
288
|
subcommand_name = "change_status_to_on_hold"
|
|
291
289
|
subcommand_help = "タスクのステータスを保留に変更します。"
|
|
292
290
|
description = "タスクのステータスを保留に変更します。ただし、操作対象のタスクのステータスは休憩中か未着手である必要があります。"
|