From 2112f4d89ec9412971bdcdaf03961825f142eb6e Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:21:06 +0900 Subject: [PATCH 1/6] =?UTF-8?q?get=5Flabor=5Fcontrol=5Fworktime:=20502=20e?= =?UTF-8?q?rror=E3=81=8C=E7=99=BA=E7=94=9F=E3=81=97=E3=81=A6=E3=82=82?= =?UTF-8?q?=E5=87=A6=E7=90=86=E3=81=8C=E7=B6=99=E7=B6=9A=E3=81=A7=E3=81=8D?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- annofabapi/wrapper.py | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/annofabapi/wrapper.py b/annofabapi/wrapper.py index da3830fd..e2e5b9cd 100644 --- a/annofabapi/wrapper.py +++ b/annofabapi/wrapper.py @@ -1,6 +1,7 @@ # pylint: disable=too-many-lines import asyncio import copy +import datetime import logging import mimetypes import time @@ -2025,6 +2026,7 @@ def _get_working_description_from_labor(labor: Dict[str, Any]) -> Optional[str]: def get_labor_control_worktime( self, + *, organization_id: Optional[str] = None, project_id: Optional[str] = None, account_id: Optional[str] = None, @@ -2070,7 +2072,43 @@ def _to_new_data(labor: Dict[str, Any]) -> Dict[str, Any]: "from": from_date, "to": to_date, } - labor_list, _ = self.api.get_labor_control(query_params) + try: + labor_list, _ = self.api.get_labor_control(query_params) + except requests.HTTPError as e: + # "502 Server Error"が発生するときは、取得するレスポンスが大きすぎる可能性があるので、取得期間を分割する。 + # ただし、取得する期間が指定されている場合のみ + # 注意:5XX系のエラーだと、backoffでリトライがタイムアウトしてから、この関数で処理される + DATE_FORMAT = "%Y-%m-%d" + if e.response.status_code == requests.codes.bad_gateway and from_date is not None and to_date is not None: + dt_from_date = datetime.datetime.strptime(from_date, DATE_FORMAT) + dt_to_date = datetime.datetime.strptime(to_date, DATE_FORMAT) + diff_days = (dt_to_date - dt_from_date).days + + dt_new_to_date = dt_from_date + datetime.timedelta(days=diff_days // 2) + dt_new_from_date = dt_new_to_date + datetime.timedelta(days=1) + logger.debug( + f"取得対象の期間が広すぎるため、データを取得できませんでした。取得対象の期間を{from_date}~{str(dt_new_to_date)}, {str(dt_new_from_date)}~{to_date}に分割して、再度取得します。" + ) + labor_list = [] + tmp1 = self.get_labor_control_worktime( + organization_id=organization_id, + project_id=project_id, + account_id=account_id, + from_date=from_date, + to_date=str(dt_new_to_date), + ) + labor_list.extend(tmp1) + + tmp2 = self.get_labor_control_worktime( + organization_id=organization_id, + project_id=project_id, + account_id=account_id, + from_date=str(dt_new_from_date), + to_date=to_date, + ) + labor_list.extend(tmp2) + + raise e return [_to_new_data(e) for e in labor_list] def get_labor_control_availability( From c19f7aaf6d787f3df2f354e64c50729a06bd1670 Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:23:52 +0900 Subject: [PATCH 2/6] format --- annofabapi/wrapper.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/annofabapi/wrapper.py b/annofabapi/wrapper.py index e2e5b9cd..88d32a9d 100644 --- a/annofabapi/wrapper.py +++ b/annofabapi/wrapper.py @@ -2087,7 +2087,8 @@ def _to_new_data(labor: Dict[str, Any]) -> Dict[str, Any]: dt_new_to_date = dt_from_date + datetime.timedelta(days=diff_days // 2) dt_new_from_date = dt_new_to_date + datetime.timedelta(days=1) logger.debug( - f"取得対象の期間が広すぎるため、データを取得できませんでした。取得対象の期間を{from_date}~{str(dt_new_to_date)}, {str(dt_new_from_date)}~{to_date}に分割して、再度取得します。" + "取得対象の期間が広すぎるため、データを取得できませんでした。" + f"取得対象の期間を{from_date}~{str(dt_new_to_date)}, {str(dt_new_from_date)}~{to_date}に分割して、再度取得します。" ) labor_list = [] tmp1 = self.get_labor_control_worktime( From e1d0e343245c13c67285573cad277195af11312e Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:24:37 +0900 Subject: [PATCH 3/6] update swagger --- annofabapi/dataclass/annotation.py | 28 ++++++++++---------- generate/swagger/swagger-api-components.yaml | 18 +++++++++++++ generate/swagger/swagger.v2.yaml | 2 +- generate/swagger/swagger.yaml | 2 +- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/annofabapi/dataclass/annotation.py b/annofabapi/dataclass/annotation.py index b2c4c997..7ab05168 100644 --- a/annofabapi/dataclass/annotation.py +++ b/annofabapi/dataclass/annotation.py @@ -173,28 +173,28 @@ class FullAnnotationAdditionalData(DataClassJsonMixin): class FullAnnotationDetail(DataClassJsonMixin): """ """ - annotation_id: Optional[str] + annotation_id: str """アノテーションID。[値の制約についてはこちら。](#section/API-Convention/APIID)
annotation_type が classification の場合は label_id と同じ値が格納されます。 """ - user_id: Optional[str] + user_id: str """""" - label_id: Optional[str] + label_id: str """""" - label_name: Optional[InternationalizationMessage] + label_name: InternationalizationMessage """""" - annotation_type: Optional[AnnotationType] + annotation_type: AnnotationType """""" - data_holding_type: Optional[AnnotationDataHoldingType] + data_holding_type: AnnotationDataHoldingType """""" data: FullAnnotationData """""" - additional_data_list: Optional[List[FullAnnotationAdditionalData]] + additional_data_list: List[FullAnnotationAdditionalData] """""" @@ -202,22 +202,22 @@ class FullAnnotationDetail(DataClassJsonMixin): class FullAnnotation(DataClassJsonMixin): """ """ - project_id: Optional[str] + project_id: str """プロジェクトID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ - task_id: Optional[str] + task_id: str """タスクID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ - task_phase: Optional[TaskPhase] + task_phase: TaskPhase """""" - task_phase_stage: Optional[int] + task_phase_stage: int """""" - task_status: Optional[TaskStatus] + task_status: TaskStatus """""" - input_data_id: Optional[str] + input_data_id: str """入力データID。[値の制約についてはこちら。](#section/API-Convention/APIID) """ input_data_name: Optional[str] @@ -229,7 +229,7 @@ class FullAnnotation(DataClassJsonMixin): updated_datetime: Optional[str] """""" - annotation_format_version: Optional[str] + annotation_format_version: str """アノテーションフォーマットのバージョンです。 アノテーションフォーマットとは、プロジェクト個別のアノテーション仕様ではなく、AnnoFabのアノテーション構造のことです。 したがって、アノテーション仕様を更新しても、このバージョンは変化しません。 バージョンの読み方と更新ルールは、業界慣習の[Semantic Versioning](https://semver.org/)にもとづきます。 JSONに出力されるアノテーションフォーマットのバージョンは、アノテーションZIPが作成される時点のものが使われます。 すなわち、`1.0.0`の時点のタスクで作成したアノテーションであっても、フォーマットが `1.0.1` に上がった次のZIP作成時では `1.0.1` となります。 バージョンを固定してZIPを残しておきたい場合は、プロジェクトが完了した時点でZIPをダウンロードして保管しておくか、またはプロジェクトを「停止中」にします。 """ diff --git a/generate/swagger/swagger-api-components.yaml b/generate/swagger/swagger-api-components.yaml index c2e667e3..2ccf322a 100644 --- a/generate/swagger/swagger-api-components.yaml +++ b/generate/swagger/swagger-api-components.yaml @@ -4162,6 +4162,15 @@ components: is_foo_bar_buz: true FullAnnotation: type: object + required: + - project_id + - task_id + - task_phase + - task_phase_stage + - task_status + - input_data_id + - details + - annotation_format_version properties: project_id: $ref: "#/components/schemas/ProjectId" @@ -4190,6 +4199,15 @@ components: $ref: "#/components/schemas/AnnotationFormatVersion" FullAnnotationDetail: type: object + required: + - annotation_id + - user_id + - label_id + - label_name + - annotation_type + - data_holding_type + - data + - additional_data_list properties: annotation_id: $ref: "#/components/schemas/AnnotationId" diff --git a/generate/swagger/swagger.v2.yaml b/generate/swagger/swagger.v2.yaml index 069e5d4e..c5695cb4 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.120.0 + version: 0.121.0 title: AnnoFab Web API x-logo: url: "https://annofab.com/resource/images/logo_landscape.png" diff --git a/generate/swagger/swagger.yaml b/generate/swagger/swagger.yaml index 0440ac9a..49e08532 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.120.0 + version: 0.121.0 title: AnnoFab Web API x-logo: url: "https://annofab.com/resource/images/logo_landscape.png" From b41f3db2e2d7b9d4a42fee0eabf5370519354b44 Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:24:54 +0900 Subject: [PATCH 4/6] =?UTF-8?q?auto=20save=E3=82=92=E8=BE=9E=E3=82=81?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 70a72adc..798716d7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -39,12 +39,6 @@ ".venv/lib/python3.8/site-packages/" ], "python.analysis.completeFunctionParens": true, - "[python]": { - "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.organizeImports": true - }, - }, "python.testing.autoTestDiscoverOnSaveEnabled": false, } \ No newline at end of file From 91d6e2a4709dd0375f06430d506baef3158c0de8 Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:51:00 +0900 Subject: [PATCH 5/6] update --- annofabapi/wrapper.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/annofabapi/wrapper.py b/annofabapi/wrapper.py index 88d32a9d..2987b1fa 100644 --- a/annofabapi/wrapper.py +++ b/annofabapi/wrapper.py @@ -2074,6 +2074,7 @@ def _to_new_data(labor: Dict[str, Any]) -> Dict[str, Any]: } try: labor_list, _ = self.api.get_labor_control(query_params) + return [_to_new_data(e) for e in labor_list] except requests.HTTPError as e: # "502 Server Error"が発生するときは、取得するレスポンスが大きすぎる可能性があるので、取得期間を分割する。 # ただし、取得する期間が指定されている場合のみ @@ -2088,29 +2089,30 @@ def _to_new_data(labor: Dict[str, Any]) -> Dict[str, Any]: dt_new_from_date = dt_new_to_date + datetime.timedelta(days=1) logger.debug( "取得対象の期間が広すぎるため、データを取得できませんでした。" - f"取得対象の期間を{from_date}~{str(dt_new_to_date)}, {str(dt_new_from_date)}~{to_date}に分割して、再度取得します。" + f"取得対象の期間を{from_date}~{dt_new_to_date.strftime(DATE_FORMAT)}, " + f"{dt_new_from_date.strftime(DATE_FORMAT)}~{to_date}に分割して、再度取得します。" ) - labor_list = [] + tmp_list = [] tmp1 = self.get_labor_control_worktime( organization_id=organization_id, project_id=project_id, account_id=account_id, from_date=from_date, - to_date=str(dt_new_to_date), + to_date=dt_new_to_date.strftime(DATE_FORMAT), ) - labor_list.extend(tmp1) + tmp_list.extend(tmp1) tmp2 = self.get_labor_control_worktime( organization_id=organization_id, project_id=project_id, account_id=account_id, - from_date=str(dt_new_from_date), + from_date=dt_new_from_date.strftime(DATE_FORMAT), to_date=to_date, ) - labor_list.extend(tmp2) + tmp_list.extend(tmp2) + return tmp_list raise e - return [_to_new_data(e) for e in labor_list] def get_labor_control_availability( self, account_id: str, from_date: Optional[str] = None, to_date: Optional[str] = None From 07e71bb985c62da4f76e1c9a10b03b84939f161a Mon Sep 17 00:00:00 2001 From: yuji38kwmt Date: Tue, 14 Sep 2021 00:55:19 +0900 Subject: [PATCH 6/6] version up --- annofabapi/__version__.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/annofabapi/__version__.py b/annofabapi/__version__.py index bf97bc40..24c25942 100644 --- a/annofabapi/__version__.py +++ b/annofabapi/__version__.py @@ -1 +1 @@ -__version__ = "0.47.0" +__version__ = "0.47.1" diff --git a/pyproject.toml b/pyproject.toml index 8eabf58f..713a73f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "annofabapi" -version = "0.47.0" +version = "0.47.1" description = "Python Clinet Library of AnnoFab WebAPI (https://annofab.com/docs/api/)" authors = ["yuji38kwmt"] license = "MIT"