diff --git a/annofabapi/__version__.py b/annofabapi/__version__.py index a66f599c..e72781a7 100644 --- a/annofabapi/__version__.py +++ b/annofabapi/__version__.py @@ -1 +1 @@ -__version__ = "0.38.11" +__version__ = "0.39.0" diff --git a/annofabapi/dataclass/project.py b/annofabapi/dataclass/project.py index 5efce606..b5dcc30f 100644 --- a/annofabapi/dataclass/project.py +++ b/annofabapi/dataclass/project.py @@ -60,6 +60,12 @@ class ProjectConfiguration(DataClassJsonMixin): private_storage_aws_iam_role_arn: Optional[str] """AWS IAMロール。ビジネスプランでのS3プライベートストレージの認可で使います。 [S3プライベートストレージの認可の設定についてはこちら](/docs/faq/#m0b240)をご覧ください。 """ + plugin_id: Optional[str] + """プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ + + custom_task_assignment_plugin_id: Optional[str] + """プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ + @dataclass class Project(DataClassJsonMixin): diff --git a/annofabapi/dataclass/task.py b/annofabapi/dataclass/task.py index 56ffb122..045b8388 100644 --- a/annofabapi/dataclass/task.py +++ b/annofabapi/dataclass/task.py @@ -113,3 +113,6 @@ class Task(DataClassJsonMixin): sampling: Optional[str] """* `inspection_skipped` - このタスクが抜取検査の対象外となり、検査フェーズをスキップしたことを表す。 * `inspection_stages_skipped` - このタスクが抜取検査の対象外となり、検査フェーズのステージを一部スキップしたことを表す。 * `acceptance_skipped` - このタスクが抜取検査の対象外となり、受入フェーズをスキップしたことを表す。 * `inspection_and_acceptance_skipped` - このタスクが抜取検査の対象外となり、検査・受入フェーズをスキップしたことを表す 未指定時はこのタスクが抜取検査の対象となったことを表す。(通常のワークフローを通過する) """ + + metadata: Optional[Dict[str, Any]] + """ユーザーが自由に登録できるkey-value型のメタデータです。 keyにはメタデータ名、valueには値を指定してください。 valueには文字列、数値、真偽値を指定できます。 """ diff --git a/annofabapi/generated_api.py b/annofabapi/generated_api.py index 2f8f7f9f..45d5a26f 100644 --- a/annofabapi/generated_api.py +++ b/annofabapi/generated_api.py @@ -711,10 +711,10 @@ def get_input_data_list( Args: project_id (str): プロジェクトID (required) query_params (Dict[str, Any]): Query Parameters - input_data_id (str): 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。 - input_data_name (str): 入力データ名での部分一致検索で使用。1文字以上あれば使用します。 + input_data_id (str): 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 + input_data_name (str): 入力データ名での部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 input_data_path (str): 入力データパスでの部分一致検索で使用。1文字以上あれば使用します。 - task_id (str): 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。条件に合致した先頭100件のタスクに使われている入力データを検索します。 + task_id (str): 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 _from (str): 更新日時での範囲検索で使用(ISO 8601 拡張形式) to (str): 更新日時での範囲検索で使用(ISO 8601 拡張形式) page (int): 検索結果のうち、取得したいページの番号(1始まり) @@ -2791,6 +2791,35 @@ def operate_task( } return self._request_wrapper(http_method, url_path, **keyword_params) + def patch_tasks_metadata( + self, project_id: str, request_body: Optional[Any] = None, **kwargs + ) -> Tuple[Any, requests.Response]: + """タスクメタデータの一括更新 + https://annofab.com/docs/api/#operation/patchTasksMetadata + + + authorizations: ProjectDataUser + + + 複数の既存タスクのメタデータを一括更新します。 + + Args: + project_id (str): プロジェクトID (required) + request_body (Any): Request Body + request_body (dict(str, __DictStrKeyAnyValue__)): (required) + + Returns: + Tuple[Message, requests.Response] + + + """ + url_path = f"/projects/{project_id}/tasks/metadata" + http_method = "PATCH" + keyword_params: Dict[str, Any] = { + "request_body": request_body, + } + return self._request_wrapper(http_method, url_path, **keyword_params) + def put_task( self, project_id: str, task_id: str, request_body: Optional[Any] = None, **kwargs ) -> Tuple[Any, requests.Response]: diff --git a/annofabapi/models.py b/annofabapi/models.py index a18e1753..dbf8904b 100644 --- a/annofabapi/models.py +++ b/annofabapi/models.py @@ -2745,14 +2745,18 @@ class OrganizationMemberStatus(Enum): 組織ID。[値の制約についてはこちら。](#section/API-Convention/APIID) * plugin_id: str プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) +* plugin_type: PluginType + * plugin_name: str プラグインの名前です。 プラグイン一覧や、プロジェクトで使うプラグインを選ぶときなどに表示されます。 * description: str プラグインの説明です。 プラグイン一覧や、プロジェクトで使うプラグインを選ぶときなどに表示されます。 * annotation_editor_url: str - カスタムアノテーションエディタでタスクを開くための URL です。 プラグインを使用するプロジェクトのタスク一覧などで使用されます。 この URL には、タスクを特定するための以下のパラメータを必ず埋め込んでください。 * `{projectId}` * `{taskId}` 以下のパラメーターは任意で指定します。 * `{inputDataId}`: アノテーション一覧などから、特定の入力データにフォーカスした状態でタスクを開くときなどに指定します。 * `{annotationId}`: アノテーション一覧などから、特定のアノテーションにフォーカスした状態でタスクを開くときなどに指定します。 + カスタムアノテーションエディタでタスクを開くための URL です。 プラグインを使用するプロジェクトのタスク一覧などで使用されます。 プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 この URL には、タスクを特定するための以下のパラメータを必ず埋め込んでください。 * `{projectId}` * `{taskId}` 以下のパラメーターは任意で指定します。 * `{inputDataId}`: アノテーション一覧などから、特定の入力データにフォーカスした状態でタスクを開くときなどに指定します。 * `{annotationId}`: アノテーション一覧などから、特定のアノテーションにフォーカスした状態でタスクを開くときなどに指定します。 +* task_assignment_url: str + 「カスタムタスク割当API」のURLです。 プラグイン種別がカスタムタスク割当の場合のみ有効です。 #### カスタムタスク割当APIについて。 * 独自のアルゴリズムで作業者にタスクを割当するAPIです。 * AnnoFabから提供されるものではなく、第三者 (ユーザー様) が用意します。 * 作業者がタスク一覧やアノテーションエディタのタスク取得ボタンを押すと、指定したURLに複数の情報 (※1) と共にHTTPリクエスト (POST) が送られます。 * カスタムタスク割当APIでは、AnnoFabで提供しているAPI (※2) を使用して作業者にタスクを割当してください。 * タスクの割当に成功した場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: 割当した単一のタスク * ステータスコード: 200 * 作業者に割当できるタスクがない場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: `{\"errors\": [{\"error_code\": \"MISSING_RESOURCE\"}]}` * ステータスコード: 404 * 作業者の認証トークンの期限が切れている場合があります。その場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: `{\"errors\": [{\"error_code\": \"EXPIRED_TOKEN\"}]}` * ステータスコード: 401 #### Preflightリクエストについて。 * AnnoFabからカスタムタスク割当APIへCross-OriginなHTTPリクエストを送信するより前に、ブラウザの仕様により「Preflightリクエスト」と呼ばれるHTTPリクエストが送られます。 * カスタムタスク割当を利用するためには、カスタムタスク割当APIとは別に「Preflightリクエスト対応API」を用意する必要があります。 * 以下の要件を満たす「Preflightリクエスト対応API」を用意してください。 * URL: カスタムタスク割当APIと同じURL * HTTPメソッド: OPTIONS * レスポンスヘッダ: * `Access-Control-Allow-Origin: https://annofab.com` * `Access-Control-Allow-Headers: Content-Type` * レスポンスボディ: 空(から) * ステータスコード: 200 ※1 以下の情報が送られます。 * HTTPボディ (JSON形式) * `authorization_token` : 作業者の認証トークン。AnnoFabのAPIを利用する際に使用します。 * `project_id` : タスクの割当リクエストが行われたプロジェクトのID。 * `phase` : 作業者が割当を要求したタスクフェーズ。このフェーズのタスクを割当してください。 ※2 例えば以下のAPIがあります。(詳しい情報はAPIドキュメントを参照してください) * `getMyAccount` : 作業者のアカウント情報を取得できます。 * `getTasks` : プロジェクトのタスクを取得できます。 * `assignTasks` : 作業者にタスクを割当することができます。 * compatible_input_data_types: List[InputDataType] - プラグインが対応している入力データです。 + プラグインが対応している入力データです。 プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 * created_datetime: str * updated_datetime: str @@ -2846,6 +2850,16 @@ class OrganizationMemberStatus(Enum): """ + +class PluginType(Enum): + """ + プラグイン種別。 * `custom_annotation_editor` - カスタムアノテーションエディタ用のプラグインを表します。 * `custom_task_assignment` - カスタムタスク割当用のプラグインを表します。 + """ + + ANNOTATION_EDITOR = "custom_annotation_editor" + TASK_ASSIGNMENT = "custom_task_assignment" + + Point = Dict[str, Any] """ 座標 @@ -3067,6 +3081,10 @@ class PricePlan(Enum): 抜取受入率。0-100のパーセント値で指定し、未指定の場合は100%として扱う。 * private_storage_aws_iam_role_arn: str AWS IAMロール。ビジネスプランでのS3プライベートストレージの認可で使います。 [S3プライベートストレージの認可の設定についてはこちら](/docs/faq/#m0b240)をご覧ください。 +* plugin_id: str + プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) +* custom_task_assignment_plugin_id: str + プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ @@ -3096,6 +3114,10 @@ class PricePlan(Enum): 抜取受入率。0-100のパーセント値で指定し、未指定の場合は100%として扱う。 * private_storage_aws_iam_role_arn: str AWS IAMロール。ビジネスプランでのS3プライベートストレージの認可で使います。 [S3プライベートストレージの認可の設定についてはこちら](/docs/faq/#m0b240)をご覧ください。 +* plugin_id: str + プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) +* custom_task_assignment_plugin_id: str + プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ @@ -3451,14 +3473,18 @@ class ProjectStatus(Enum): Kyes of Dict +* plugin_type: PluginType + * plugin_name: str プラグインの名前です。 プラグイン一覧や、プロジェクトで使うプラグインを選ぶときなどに表示されます。 * description: str プラグインの説明です。 プラグイン一覧や、プロジェクトで使うプラグインを選ぶときなどに表示されます。 * annotation_editor_url: str - カスタムアノテーションエディタでタスクを開くための URL です。 プラグインを使用するプロジェクトのタスク一覧などで使用されます。 この URL には、タスクを特定するための以下のパラメータを必ず埋め込んでください。 * `{projectId}` * `{taskId}` 以下のパラメーターは任意で指定します。 * `{inputDataId}`: アノテーション一覧などから、特定の入力データにフォーカスした状態でタスクを開くときなどに指定します。 * `{annotationId}`: アノテーション一覧などから、特定のアノテーションにフォーカスした状態でタスクを開くときなどに指定します。 + カスタムアノテーションエディタでタスクを開くための URL です。 プラグインを使用するプロジェクトのタスク一覧などで使用されます。 プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 この URL には、タスクを特定するための以下のパラメータを必ず埋め込んでください。 * `{projectId}` * `{taskId}` 以下のパラメーターは任意で指定します。 * `{inputDataId}`: アノテーション一覧などから、特定の入力データにフォーカスした状態でタスクを開くときなどに指定します。 * `{annotationId}`: アノテーション一覧などから、特定のアノテーションにフォーカスした状態でタスクを開くときなどに指定します。 +* task_assignment_url: str + 「カスタムタスク割当API」のURLです。 プラグイン種別がカスタムタスク割当の場合のみ有効です。 #### カスタムタスク割当APIについて。 * 独自のアルゴリズムで作業者にタスクを割当するAPIです。 * AnnoFabから提供されるものではなく、第三者 (ユーザー様) が用意します。 * 作業者がタスク一覧やアノテーションエディタのタスク取得ボタンを押すと、指定したURLに複数の情報 (※1) と共にHTTPリクエスト (POST) が送られます。 * カスタムタスク割当APIでは、AnnoFabで提供しているAPI (※2) を使用して作業者にタスクを割当してください。 * タスクの割当に成功した場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: 割当した単一のタスク * ステータスコード: 200 * 作業者に割当できるタスクがない場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: `{\"errors\": [{\"error_code\": \"MISSING_RESOURCE\"}]}` * ステータスコード: 404 * 作業者の認証トークンの期限が切れている場合があります。その場合は以下のHTTPレスポンスを返却してください。 * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` * レスポンスボディ: `{\"errors\": [{\"error_code\": \"EXPIRED_TOKEN\"}]}` * ステータスコード: 401 #### Preflightリクエストについて。 * AnnoFabからカスタムタスク割当APIへCross-OriginなHTTPリクエストを送信するより前に、ブラウザの仕様により「Preflightリクエスト」と呼ばれるHTTPリクエストが送られます。 * カスタムタスク割当を利用するためには、カスタムタスク割当APIとは別に「Preflightリクエスト対応API」を用意する必要があります。 * 以下の要件を満たす「Preflightリクエスト対応API」を用意してください。 * URL: カスタムタスク割当APIと同じURL * HTTPメソッド: OPTIONS * レスポンスヘッダ: * `Access-Control-Allow-Origin: https://annofab.com` * `Access-Control-Allow-Headers: Content-Type` * レスポンスボディ: 空(から) * ステータスコード: 200 ※1 以下の情報が送られます。 * HTTPボディ (JSON形式) * `authorization_token` : 作業者の認証トークン。AnnoFabのAPIを利用する際に使用します。 * `project_id` : タスクの割当リクエストが行われたプロジェクトのID。 * `phase` : 作業者が割当を要求したタスクフェーズ。このフェーズのタスクを割当してください。 ※2 例えば以下のAPIがあります。(詳しい情報はAPIドキュメントを参照してください) * `getMyAccount` : 作業者のアカウント情報を取得できます。 * `getTasks` : プロジェクトのタスクを取得できます。 * `assignTasks` : 作業者にタスクを割当することができます。 * compatible_input_data_types: List[InputDataType] - プラグインが対応している入力データです。 + プラグインが対応している入力データです。 プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 * last_updated_datetime: str 新規作成時は未指定、更新時は必須(更新前の日時) @@ -3846,6 +3872,8 @@ class SupplementaryDataType(Enum): * sampling: str * `inspection_skipped` - このタスクが抜取検査の対象外となり、検査フェーズをスキップしたことを表す。 * `inspection_stages_skipped` - このタスクが抜取検査の対象外となり、検査フェーズのステージを一部スキップしたことを表す。 * `acceptance_skipped` - このタスクが抜取検査の対象外となり、受入フェーズをスキップしたことを表す。 * `inspection_and_acceptance_skipped` - このタスクが抜取検査の対象外となり、検査・受入フェーズをスキップしたことを表す 未指定時はこのタスクが抜取検査の対象となったことを表す。(通常のワークフローを通過する) +* metadata: __DictStrKeyAnyValue__ + ユーザーが自由に登録できるkey-value型のメタデータです。 keyにはメタデータ名、valueには値を指定してください。 valueには文字列、数値、真偽値を指定できます。 """ @@ -3908,12 +3936,13 @@ class SupplementaryDataType(Enum): class TaskAssignmentType(Enum): """ - プロジェクトで使用するタスクの割当方式。 * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 + プロジェクトで使用するタスクの割当方式。 * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 * `custom` - タスク割当アルゴリズム (API) を独自に定義してタスクを割当する方式です。 """ RANDOM = "random" SELECTION = "selection" RANDOM_AND_SELECTION = "random_and_selection" + CUSTOM = "custom" TaskGenerateRequest = Dict[str, Any] @@ -4203,6 +4232,8 @@ class TaskPhase(Enum): * input_data_id_list: List[str] +* metadata: __DictStrKeyAnyValue__ + ユーザーが自由に登録できるkey-value型のメタデータです。 keyにはメタデータ名、valueには値を指定してください。 valueには文字列、数値、真偽値を指定できます。 """ diff --git a/generate/swagger/swagger-api-components.yaml b/generate/swagger/swagger-api-components.yaml index d49ff12f..0707f724 100644 --- a/generate/swagger/swagger-api-components.yaml +++ b/generate/swagger/swagger-api-components.yaml @@ -627,6 +627,7 @@ components: required: - organization_id - plugin_id + - plugin_type - compatible_input_data_types - created_datetime - updated_datetime @@ -635,12 +636,16 @@ components: $ref: "#/components/schemas/OrganizationId" plugin_id: $ref: "#/components/schemas/PluginId" + plugin_type: + $ref: "#/components/schemas/PluginType" plugin_name: $ref: "#/components/schemas/PluginName" description: $ref: "#/components/schemas/PluginDescription" annotation_editor_url: $ref: "#/components/schemas/AnnotationEditorUrl" + task_assignment_url: + $ref: "#/components/schemas/TaskAssignmentUrl" compatible_input_data_types: $ref: "#/components/schemas/PluginCompatibleInputDataTypes" created_datetime: @@ -652,14 +657,19 @@ components: PutOrganizationPluginRequest: type: object required: + - plugin_type - compatible_input_data_types properties: + plugin_type: + $ref: "#/components/schemas/PluginType" plugin_name: $ref: "#/components/schemas/PluginName" description: $ref: "#/components/schemas/PluginDescription" annotation_editor_url: $ref: "#/components/schemas/AnnotationEditorUrl" + task_assignment_url: + $ref: "#/components/schemas/TaskAssignmentUrl" compatible_input_data_types: $ref: "#/components/schemas/PluginCompatibleInputDataTypes" last_updated_datetime: @@ -669,6 +679,15 @@ components: example: "12345678-abcd-1234-abcd-1234abcd5678" description: | プラグインID。[値の制約についてはこちら。](#section/API-Convention/APIID) + PluginType: + type: string + enum: + - custom_annotation_editor + - custom_task_assignment + description: | + プラグイン種別。 + * `custom_annotation_editor` - カスタムアノテーションエディタ用のプラグインを表します。 + * `custom_task_assignment` - カスタムタスク割当用のプラグインを表します。 PluginName: type: string example: "foo-bar" @@ -688,12 +707,14 @@ components: example: ["custom"] description: | プラグインが対応している入力データです。 + プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 AnnotationEditorUrl: type: string example: "https://example.com/my/editors?p={projectId}&t={taskId}" description: | カスタムアノテーションエディタでタスクを開くための URL です。 プラグインを使用するプロジェクトのタスク一覧などで使用されます。 + プラグイン種別がカスタムアノテーションエディタの場合のみ有効です。 この URL には、タスクを特定するための以下のパラメータを必ず埋め込んでください。 @@ -704,6 +725,57 @@ components: * `{inputDataId}`: アノテーション一覧などから、特定の入力データにフォーカスした状態でタスクを開くときなどに指定します。 * `{annotationId}`: アノテーション一覧などから、特定のアノテーションにフォーカスした状態でタスクを開くときなどに指定します。 + TaskAssignmentUrl: + type: string + example: "https://example.com/my/editors?p={projectId}&t={taskId}" + description: | + 「カスタムタスク割当API」のURLです。 + プラグイン種別がカスタムタスク割当の場合のみ有効です。 + + #### カスタムタスク割当APIについて。 + + * 独自のアルゴリズムで作業者にタスクを割当するAPIです。 + * AnnoFabから提供されるものではなく、第三者 (ユーザー様) が用意します。 + * 作業者がタスク一覧やアノテーションエディタのタスク取得ボタンを押すと、指定したURLに複数の情報 (※1) と共にHTTPリクエスト (POST) が送られます。 + * カスタムタスク割当APIでは、AnnoFabで提供しているAPI (※2) を使用して作業者にタスクを割当してください。 + * タスクの割当に成功した場合は以下のHTTPレスポンスを返却してください。 + * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` + * レスポンスボディ: 割当した単一のタスク + * ステータスコード: 200 + * 作業者に割当できるタスクがない場合は以下のHTTPレスポンスを返却してください。 + * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` + * レスポンスボディ: `{"errors": [{"error_code": "MISSING_RESOURCE"}]}` + * ステータスコード: 404 + * 作業者の認証トークンの期限が切れている場合があります。その場合は以下のHTTPレスポンスを返却してください。 + * レスポンスヘッダ: `Access-Control-Allow-Origin: https://annofab.com` + * レスポンスボディ: `{"errors": [{"error_code": "EXPIRED_TOKEN"}]}` + * ステータスコード: 401 + + #### Preflightリクエストについて。 + + * AnnoFabからカスタムタスク割当APIへCross-OriginなHTTPリクエストを送信するより前に、ブラウザの仕様により「Preflightリクエスト」と呼ばれるHTTPリクエストが送られます。 + * カスタムタスク割当を利用するためには、カスタムタスク割当APIとは別に「Preflightリクエスト対応API」を用意する必要があります。 + * 以下の要件を満たす「Preflightリクエスト対応API」を用意してください。 + * URL: カスタムタスク割当APIと同じURL + * HTTPメソッド: OPTIONS + * レスポンスヘッダ: + * `Access-Control-Allow-Origin: https://annofab.com` + * `Access-Control-Allow-Headers: Content-Type` + * レスポンスボディ: 空(から) + * ステータスコード: 200 + + ※1 以下の情報が送られます。 + + * HTTPボディ (JSON形式) + * `authorization_token` : 作業者の認証トークン。AnnoFabのAPIを利用する際に使用します。 + * `project_id` : タスクの割当リクエストが行われたプロジェクトのID。 + * `phase` : 作業者が割当を要求したタスクフェーズ。このフェーズのタスクを割当してください。 + + ※2 例えば以下のAPIがあります。(詳しい情報はAPIドキュメントを参照してください) + + * `getMyAccount` : 作業者のアカウント情報を取得できます。 + * `getTasks` : プロジェクトのタスクを取得できます。 + * `assignTasks` : 作業者にタスクを割当することができます。 MyOrganization: type: object @@ -1011,6 +1083,14 @@ components: AWS IAMロール。ビジネスプランでのS3プライベートストレージの認可で使います。 [S3プライベートストレージの認可の設定についてはこちら](/docs/faq/#m0b240)をご覧ください。 example: "arn:aws:iam::123456789012:role/AnnoFabPrivateStorageAccessor" + plugin_id: + $ref: "#/components/schemas/PluginId" + description: | + カスタムアノテーションエディタのプラグインID。カスタムプロジェクトの場合は必須です。 + custom_task_assignment_plugin_id: + $ref: "#/components/schemas/PluginId" + description: | + `task_assignment_type`に`custom`を設定している場合のみ、カスタムタスク割当のプラグインIDを設定してください。 ProjectSummary: type: object properties: @@ -1025,12 +1105,14 @@ components: - random - selection - random_and_selection + - custom description: | プロジェクトで使用するタスクの割当方式。 * `random` - タスクフェーズのみを指定してランダムにタスクを自身に割当する方式です。 * `selection` - 担当者とタスクを明示的に指定してタスクを割当する方式です。プロジェクトオーナーもしくはチェッカーのみ、自身以外のプロジェクトメンバーを担当者に指定できます。 * `random_and_selection` - ランダム割当と選択割当の両機能を使用する方式です。 + * `custom` - タスク割当アルゴリズム (API) を独自に定義してタスクを割当する方式です。 JobInfo: type: object properties: @@ -1608,6 +1690,12 @@ components: } no_label: $ref: "#/components/schemas/InspectionStatisticsPhrases" + PatchTasksMetadataRequest: + type: object + description: タスクIDとメタデータのkey-valueペア(Dictionary)です。 + additionalProperties: { + $ref: "#/components/schemas/TaskMetadata" + } InspectionStatisticsPhrases: type: object description: ラベル外指摘の集計結果 @@ -2490,6 +2578,8 @@ components: * `inspection_and_acceptance_skipped` - このタスクが抜取検査の対象外となり、検査・受入フェーズをスキップしたことを表す 未指定時はこのタスクが抜取検査の対象となったことを表す。(通常のワークフローを通過する) + metadata: + $ref: "#/components/schemas/TaskMetadata" TaskPhase: type: string enum: @@ -2521,15 +2611,24 @@ components: * `complete` - 完了。次のフェーズへ進む * `rejected` - 差戻し。修正のため、`annotation`フェーズへ戻る。[operateTask](#operation/operateTask) APIのリクエストボディに渡すときのみ利用する。その他のAPIのリクエストやレスポンスには使われない。 * `cancelled` - 提出取消し。修正のため、前フェーズへ戻る。[operateTask](#operation/operateTask) APIのリクエストボディに渡すときのみ利用する。その他のAPIのリクエストやレスポンスには使われない。 + TaskMetadata: + type: object + description: | + ユーザーが自由に登録できるkey-value型のメタデータです。 + keyにはメタデータ名、valueには値を指定してください。 + valueには文字列、数値、真偽値を指定できます。 TaskRequest: type: object required: - input_data_id_list + - metadata properties: input_data_id_list: type: array items: $ref: "#/components/schemas/InputDataId" + metadata: + $ref: "#/components/schemas/TaskMetadata" TaskGenerateRequest: type: object required: diff --git a/generate/swagger/swagger.v2.yaml b/generate/swagger/swagger.v2.yaml index b3402934..ab606b6d 100644 --- a/generate/swagger/swagger.v2.yaml +++ b/generate/swagger/swagger.v2.yaml @@ -115,7 +115,7 @@ info: 上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。 - version: 0.94.7 + version: 0.95.7 title: AnnoFab Web API x-logo: url: "https://annofab.com/images/logo_landscape.png" diff --git a/generate/swagger/swagger.yaml b/generate/swagger/swagger.yaml index ed8de7cc..03a0ee3b 100644 --- a/generate/swagger/swagger.yaml +++ b/generate/swagger/swagger.yaml @@ -116,7 +116,7 @@ info: 上記例 `account_id_count` は、タスクのフィールド `account_id` でタスクを分類したところ「`account_id` が `c5eee002` であるタスクが9件、`9f110e48` であるタスクが5件、`b25dfeb3` であるタスクが1件」だったという結果を表しています。 また、AggregationResultの集約の件数は、合計で10000件以下に制限されており、それを超える件数がある場合は上位10000件が取得されます。もし、省略された部分を取得したい場合は、検索条件を縛って結果に上る集約の数を減らしてください。 - version: 0.94.7 + version: 0.95.7 title: AnnoFab Web API x-logo: url: "https://annofab.com/images/logo_landscape.png" @@ -3572,6 +3572,46 @@ paths: $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch" "503": $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance" + /projects/{project_id}/tasks/metadata: + patch: + tags: + - af-task + summary: タスクメタデータの一括更新 + description: | + 複数の既存タスクのメタデータを一括更新します。 + security: + - ProjectDataUser: [] + operationId: patchTasksMetadata + parameters: + - name: project_id + in: path + description: プロジェクトID + required: true + schema: + $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" + requestBody: + required: true + content: + application/json: + schema: + $ref: "swagger-api-components.yaml#/components/schemas/PatchTasksMetadataRequest" + responses: + "200": + $ref: "swagger-api-components.yaml#/components/responses/SuccessMessage" + "400": + $ref: "swagger-api-components.yaml#/components/responses/ErrorInvalidRequest" + "401": + $ref: "swagger-api-components.yaml#/components/responses/ErrorUnauthorizedApi" + "403": + $ref: "swagger-api-components.yaml#/components/responses/ErrorForbiddenResource" + "409": + description: 停止中プロジェクトに対する操作のため失敗 + content: + application/json: + schema: + $ref: "swagger-api-components.yaml#/components/schemas/ErrorStateMismatch" + "503": + $ref: "swagger-api-components.yaml#/components/responses/ErrorUnderMaintenance" /projects/{project_id}/tasks/{task_id}/operate: post: tags: @@ -4317,13 +4357,13 @@ paths: $ref: "swagger-api-components.yaml#/components/schemas/ProjectId" - name: input_data_id in: query - description: 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。 + description: 入力データIDでの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 required: false schema: $ref: "swagger-api-components.yaml#/components/schemas/InputDataId" - name: input_data_name in: query - description: 入力データ名での部分一致検索で使用。1文字以上あれば使用します。 + description: 入力データ名での部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。 required: false schema: type: string @@ -4335,7 +4375,7 @@ paths: type: string - name: task_id in: query - description: 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。条件に合致した先頭100件のタスクに使われている入力データを検索します。 + description: 入力データが紐づくタスクIDの部分一致検索で使用。1文字以上あれば使用します。大文字小文字は区別しません。条件に合致した先頭100件のタスクに使われている入力データを検索します。 required: false schema: type: string diff --git a/poetry.lock b/poetry.lock index ae4b515d..bdcd398d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -149,7 +149,7 @@ marker = "sys_platform == \"win32\"" name = "colorama" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" +version = "0.4.4" [[package]] category = "dev" @@ -269,7 +269,7 @@ description = "iniconfig: brain-dead simple config-ini parsing" name = "iniconfig" optional = false python-versions = "*" -version = "1.0.1" +version = "1.1.1" [[package]] category = "dev" @@ -277,7 +277,7 @@ description = "A Python utility / library to sort Python imports." name = "isort" optional = false python-versions = ">=3.6,<4.0" -version = "5.5.5" +version = "5.6.4" [package.extras] colors = ["colorama (>=0.4.3,<0.5.0)"] @@ -361,7 +361,7 @@ description = "Optional static typing for Python" name = "mypy" optional = false python-versions = ">=3.5" -version = "0.782" +version = "0.790" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -565,7 +565,7 @@ description = "Alternative regular expression module, to replace re." name = "regex" optional = false python-versions = "*" -version = "2020.9.27" +version = "2020.10.11" [[package]] category = "main" @@ -839,8 +839,7 @@ click = [ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, ] coverage = [ {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, @@ -911,12 +910,11 @@ importlib-metadata = [ {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, ] iniconfig = [ - {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, - {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ - {file = "isort-5.5.5-py3-none-any.whl", hash = "sha256:87355bbc3465bf096a8bf09c4dd949b6b9294958c478740442fd9fbd01b817f2"}, - {file = "isort-5.5.5.tar.gz", hash = "sha256:47e0fdc03aed3a9ba507284f90e4b3b6f2a4725d919816a7b547675befc38ffb"}, + {file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"}, + {file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"}, ] jinja2 = [ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, @@ -997,20 +995,20 @@ more-itertools = [ {file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"}, ] mypy = [ - {file = "mypy-0.782-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:2c6cde8aa3426c1682d35190b59b71f661237d74b053822ea3d748e2c9578a7c"}, - {file = "mypy-0.782-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9c7a9a7ceb2871ba4bac1cf7217a7dd9ccd44c27c2950edbc6dc08530f32ad4e"}, - {file = "mypy-0.782-cp35-cp35m-win_amd64.whl", hash = "sha256:c05b9e4fb1d8a41d41dec8786c94f3b95d3c5f528298d769eb8e73d293abc48d"}, - {file = "mypy-0.782-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:6731603dfe0ce4352c555c6284c6db0dc935b685e9ce2e4cf220abe1e14386fd"}, - {file = "mypy-0.782-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f05644db6779387ccdb468cc47a44b4356fc2ffa9287135d05b70a98dc83b89a"}, - {file = "mypy-0.782-cp36-cp36m-win_amd64.whl", hash = "sha256:b7fbfabdbcc78c4f6fc4712544b9b0d6bf171069c6e0e3cb82440dd10ced3406"}, - {file = "mypy-0.782-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:3fdda71c067d3ddfb21da4b80e2686b71e9e5c72cca65fa216d207a358827f86"}, - {file = "mypy-0.782-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7df6eddb6054d21ca4d3c6249cae5578cb4602951fd2b6ee2f5510ffb098707"}, - {file = "mypy-0.782-cp37-cp37m-win_amd64.whl", hash = "sha256:a4a2cbcfc4cbf45cd126f531dedda8485671545b43107ded25ce952aac6fb308"}, - {file = "mypy-0.782-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6bb93479caa6619d21d6e7160c552c1193f6952f0668cdda2f851156e85186fc"}, - {file = "mypy-0.782-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:81c7908b94239c4010e16642c9102bfc958ab14e36048fa77d0be3289dda76ea"}, - {file = "mypy-0.782-cp38-cp38-win_amd64.whl", hash = "sha256:5dd13ff1f2a97f94540fd37a49e5d255950ebcdf446fb597463a40d0df3fac8b"}, - {file = "mypy-0.782-py3-none-any.whl", hash = "sha256:e0b61738ab504e656d1fe4ff0c0601387a5489ca122d55390ade31f9ca0e252d"}, - {file = "mypy-0.782.tar.gz", hash = "sha256:eff7d4a85e9eea55afa34888dfeaccde99e7520b51f867ac28a48492c0b1130c"}, + {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"}, + {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"}, + {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"}, + {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"}, + {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"}, + {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"}, + {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"}, + {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"}, + {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"}, + {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"}, + {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"}, + {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"}, + {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"}, + {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -1077,27 +1075,33 @@ pytz = [ {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] regex = [ - {file = "regex-2020.9.27-cp27-cp27m-win32.whl", hash = "sha256:d23a18037313714fb3bb5a94434d3151ee4300bae631894b1ac08111abeaa4a3"}, - {file = "regex-2020.9.27-cp27-cp27m-win_amd64.whl", hash = "sha256:84e9407db1b2eb368b7ecc283121b5e592c9aaedbe8c78b1a2f1102eb2e21d19"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5f18875ac23d9aa2f060838e8b79093e8bb2313dbaaa9f54c6d8e52a5df097be"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae91972f8ac958039920ef6e8769277c084971a142ce2b660691793ae44aae6b"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9a02d0ae31d35e1ec12a4ea4d4cca990800f66a917d0fb997b20fbc13f5321fc"}, - {file = "regex-2020.9.27-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ebbe29186a3d9b0c591e71b7393f1ae08c83cb2d8e517d2a822b8f7ec99dfd8b"}, - {file = "regex-2020.9.27-cp36-cp36m-win32.whl", hash = "sha256:4707f3695b34335afdfb09be3802c87fa0bc27030471dbc082f815f23688bc63"}, - {file = "regex-2020.9.27-cp36-cp36m-win_amd64.whl", hash = "sha256:9bc13e0d20b97ffb07821aa3e113f9998e84994fe4d159ffa3d3a9d1b805043b"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f1b3afc574a3db3b25c89161059d857bd4909a1269b0b3cb3c904677c8c4a3f7"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5533a959a1748a5c042a6da71fe9267a908e21eded7a4f373efd23a2cbdb0ecc"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:1fe0a41437bbd06063aa184c34804efa886bcc128222e9916310c92cd54c3b4c"}, - {file = "regex-2020.9.27-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:c570f6fa14b9c4c8a4924aaad354652366577b4f98213cf76305067144f7b100"}, - {file = "regex-2020.9.27-cp37-cp37m-win32.whl", hash = "sha256:eda4771e0ace7f67f58bc5b560e27fb20f32a148cbc993b0c3835970935c2707"}, - {file = "regex-2020.9.27-cp37-cp37m-win_amd64.whl", hash = "sha256:60b0e9e6dc45683e569ec37c55ac20c582973841927a85f2d8a7d20ee80216ab"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux1_i686.whl", hash = "sha256:088afc8c63e7bd187a3c70a94b9e50ab3f17e1d3f52a32750b5b77dbe99ef5ef"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:eaf548d117b6737df379fdd53bdde4f08870e66d7ea653e230477f071f861121"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:41bb65f54bba392643557e617316d0d899ed5b4946dccee1cb6696152b29844b"}, - {file = "regex-2020.9.27-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:8d69cef61fa50c8133382e61fd97439de1ae623fe943578e477e76a9d9471637"}, - {file = "regex-2020.9.27-cp38-cp38-win32.whl", hash = "sha256:f2388013e68e750eaa16ccbea62d4130180c26abb1d8e5d584b9baf69672b30f"}, - {file = "regex-2020.9.27-cp38-cp38-win_amd64.whl", hash = "sha256:4318d56bccfe7d43e5addb272406ade7a2274da4b70eb15922a071c58ab0108c"}, - {file = "regex-2020.9.27.tar.gz", hash = "sha256:a6f32aea4260dfe0e55dc9733ea162ea38f0ea86aa7d0f77b15beac5bf7b369d"}, + {file = "regex-2020.10.11-cp27-cp27m-win32.whl", hash = "sha256:4f5c0fe46fb79a7adf766b365cae56cafbf352c27358fda811e4a1dc8216d0db"}, + {file = "regex-2020.10.11-cp27-cp27m-win_amd64.whl", hash = "sha256:39a5ef30bca911f5a8a3d4476f5713ed4d66e313d9fb6755b32bec8a2e519635"}, + {file = "regex-2020.10.11-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7c4fc5a8ec91a2254bb459db27dbd9e16bba1dabff638f425d736888d34aaefa"}, + {file = "regex-2020.10.11-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d537e270b3e6bfaea4f49eaf267984bfb3628c86670e9ad2a257358d3b8f0955"}, + {file = "regex-2020.10.11-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a8240df4957a5b0e641998a5d78b3c4ea762c845d8cb8997bf820626826fde9a"}, + {file = "regex-2020.10.11-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:4302153abb96859beb2c778cc4662607a34175065fc2f33a21f49eb3fbd1ccd3"}, + {file = "regex-2020.10.11-cp36-cp36m-win32.whl", hash = "sha256:c077c9d04a040dba001cf62b3aff08fd85be86bccf2c51a770c77377662a2d55"}, + {file = "regex-2020.10.11-cp36-cp36m-win_amd64.whl", hash = "sha256:46ab6070b0d2cb85700b8863b3f5504c7f75d8af44289e9562195fe02a8dd72d"}, + {file = "regex-2020.10.11-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d629d750ebe75a88184db98f759633b0a7772c2e6f4da529f0027b4a402c0e2f"}, + {file = "regex-2020.10.11-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e7ef296b84d44425760fe813cabd7afbb48c8dd62023018b338bbd9d7d6f2f0"}, + {file = "regex-2020.10.11-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:e490f08897cb44e54bddf5c6e27deca9b58c4076849f32aaa7a0b9f1730f2c20"}, + {file = "regex-2020.10.11-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:850339226aa4fec04916386577674bb9d69abe0048f5d1a99f91b0004bfdcc01"}, + {file = "regex-2020.10.11-cp37-cp37m-win32.whl", hash = "sha256:60c4f64d9a326fe48e8738c3dbc068e1edc41ff7895a9e3723840deec4bc1c28"}, + {file = "regex-2020.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:8ba3efdd60bfee1aa784dbcea175eb442d059b576934c9d099e381e5a9f48930"}, + {file = "regex-2020.10.11-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2308491b3e6c530a3bb38a8a4bb1dc5fd32cbf1e11ca623f2172ba17a81acef1"}, + {file = "regex-2020.10.11-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b8806649983a1c78874ec7e04393ef076805740f6319e87a56f91f1767960212"}, + {file = "regex-2020.10.11-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a2a31ee8a354fa3036d12804730e1e20d58bc4e250365ead34b9c30bbe9908c3"}, + {file = "regex-2020.10.11-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9d53518eeed12190744d366ec4a3f39b99d7daa705abca95f87dd8b442df4ad"}, + {file = "regex-2020.10.11-cp38-cp38-win32.whl", hash = "sha256:3d5a8d007116021cf65355ada47bf405656c4b3b9a988493d26688275fde1f1c"}, + {file = "regex-2020.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:f579caecbbca291b0fcc7d473664c8c08635da2f9b1567c22ea32311c86ef68c"}, + {file = "regex-2020.10.11-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8c8c42aa5d3ac9a49829c4b28a81bebfa0378996f9e0ca5b5ab8a36870c3e5ee"}, + {file = "regex-2020.10.11-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c529ba90c1775697a65b46c83d47a2d3de70f24d96da5d41d05a761c73b063af"}, + {file = "regex-2020.10.11-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:6cf527ec2f3565248408b61dd36e380d799c2a1047eab04e13a2b0c15dd9c767"}, + {file = "regex-2020.10.11-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:671c51d352cfb146e48baee82b1ee8d6ffe357c292f5e13300cdc5c00867ebfc"}, + {file = "regex-2020.10.11-cp39-cp39-win32.whl", hash = "sha256:a63907332531a499b8cdfd18953febb5a4c525e9e7ca4ac147423b917244b260"}, + {file = "regex-2020.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1a16afbfadaadc1397353f9b32e19a65dc1d1804c80ad73a14f435348ca017ad"}, + {file = "regex-2020.10.11.tar.gz", hash = "sha256:463e770c48da76a8da82b8d4a48a541f314e0df91cbb6d873a341dbe578efafd"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, diff --git a/pyproject.toml b/pyproject.toml index 8db91d66..3b7fcd4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "annofabapi" -version = "0.38.11" +version = "0.39.0" description = "Python Clinet Library of AnnoFab WebAPI (https://annofab.com/docs/api/)" authors = ["yuji38kwmt "] maintainers = ["yuji38kwmt "] diff --git a/tests/data/dataclass/project.json b/tests/data/dataclass/project.json index 6db3287f..e132ffa1 100644 --- a/tests/data/dataclass/project.json +++ b/tests/data/dataclass/project.json @@ -2,26 +2,28 @@ "project_id": "a2345678-abcd-1234-abcd-1234abcd5678", "organization_id": "b2345678-abcd-1234-abcd-1234abcd5678", "title": "sample", - "overview": "", + "overview": "sample", "project_status": "active", "input_data_type": "image", "created_datetime": "2019-04-19T16:29:41.06+09:00", - "updated_datetime": "2019-11-06T10:30:57.575+09:00", + "updated_datetime": "2020-09-09T15:11:37.312+09:00", "configuration": { "number_of_inspections": 0, - "assignee_rule_of_resubmitted_task": "no_assignee", + "assignee_rule_of_resubmitted_task": "fixed", "task_assignment_type": "random_and_selection", - "max_tasks_per_member": 10, + "max_tasks_per_member": 1, "max_tasks_per_member_including_hold": 20, "private_storage_aws_iam_role_arn": null, + "plugin_id": null, + "custom_task_assignment_plugin_id": null, "input_data_set_id_list": [ "90788848-4c48-4314-86b0-d2c12138dab5" ], "input_data_max_long_side_length": null, - "sampling_inspection_rate": null, - "sampling_acceptance_rate": null + "sampling_inspection_rate": 85, + "sampling_acceptance_rate": 100 }, "summary": { - "last_tasks_updated_datetime": "2019-11-19T17:26:51.348+09:00" + "last_tasks_updated_datetime": "2020-10-15T00:28:20.643+09:00" } } \ No newline at end of file diff --git a/tests/data/dataclass/task.json b/tests/data/dataclass/task.json index 9d635dcc..7b18e816 100644 --- a/tests/data/dataclass/task.json +++ b/tests/data/dataclass/task.json @@ -51,5 +51,6 @@ "number_of_rejections": 1, "started_datetime": "2019-08-22T12:08:09.266+09:00", "updated_datetime": "2019-08-22T12:08:13.906+09:00", - "sampling": null + "sampling": null, + "metadata":{} } diff --git a/tests/test_api.py b/tests/test_api.py index 0a4576b1..9e982fa1 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -437,6 +437,11 @@ def test_batch_update_tasks(self): content = api.batch_update_tasks(project_id, request_body=request_body)[0] assert type(content) == list + def test_patch_tasks_metadata(self): + request_body = {task_id: {"alice": "foo", "bob": 1.23, "charlie": False}} + content, _ = api.patch_tasks_metadata(project_id, request_body) + assert type(content) == dict + class TestWebhook: def test_get_webhooks(self):