|
1 | 1 | # pylint: disable=too-many-lines
|
2 | 2 | import asyncio
|
3 | 3 | import copy
|
| 4 | +import datetime |
4 | 5 | import logging
|
5 | 6 | import mimetypes
|
6 | 7 | import time
|
@@ -2025,6 +2026,7 @@ def _get_working_description_from_labor(labor: Dict[str, Any]) -> Optional[str]:
|
2025 | 2026 |
|
2026 | 2027 | def get_labor_control_worktime(
|
2027 | 2028 | self,
|
| 2029 | + *, |
2028 | 2030 | organization_id: Optional[str] = None,
|
2029 | 2031 | project_id: Optional[str] = None,
|
2030 | 2032 | account_id: Optional[str] = None,
|
@@ -2070,8 +2072,47 @@ def _to_new_data(labor: Dict[str, Any]) -> Dict[str, Any]:
|
2070 | 2072 | "from": from_date,
|
2071 | 2073 | "to": to_date,
|
2072 | 2074 | }
|
2073 |
| - labor_list, _ = self.api.get_labor_control(query_params) |
2074 |
| - return [_to_new_data(e) for e in labor_list] |
| 2075 | + try: |
| 2076 | + labor_list, _ = self.api.get_labor_control(query_params) |
| 2077 | + return [_to_new_data(e) for e in labor_list] |
| 2078 | + except requests.HTTPError as e: |
| 2079 | + # "502 Server Error"が発生するときは、取得するレスポンスが大きすぎる可能性があるので、取得期間を分割する。 |
| 2080 | + # ただし、取得する期間が指定されている場合のみ |
| 2081 | + # 注意:5XX系のエラーだと、backoffでリトライがタイムアウトしてから、この関数で処理される |
| 2082 | + DATE_FORMAT = "%Y-%m-%d" |
| 2083 | + if e.response.status_code == requests.codes.bad_gateway and from_date is not None and to_date is not None: |
| 2084 | + dt_from_date = datetime.datetime.strptime(from_date, DATE_FORMAT) |
| 2085 | + dt_to_date = datetime.datetime.strptime(to_date, DATE_FORMAT) |
| 2086 | + diff_days = (dt_to_date - dt_from_date).days |
| 2087 | + |
| 2088 | + dt_new_to_date = dt_from_date + datetime.timedelta(days=diff_days // 2) |
| 2089 | + dt_new_from_date = dt_new_to_date + datetime.timedelta(days=1) |
| 2090 | + logger.debug( |
| 2091 | + "取得対象の期間が広すぎるため、データを取得できませんでした。" |
| 2092 | + f"取得対象の期間を{from_date}~{dt_new_to_date.strftime(DATE_FORMAT)}, " |
| 2093 | + f"{dt_new_from_date.strftime(DATE_FORMAT)}~{to_date}に分割して、再度取得します。" |
| 2094 | + ) |
| 2095 | + tmp_list = [] |
| 2096 | + tmp1 = self.get_labor_control_worktime( |
| 2097 | + organization_id=organization_id, |
| 2098 | + project_id=project_id, |
| 2099 | + account_id=account_id, |
| 2100 | + from_date=from_date, |
| 2101 | + to_date=dt_new_to_date.strftime(DATE_FORMAT), |
| 2102 | + ) |
| 2103 | + tmp_list.extend(tmp1) |
| 2104 | + |
| 2105 | + tmp2 = self.get_labor_control_worktime( |
| 2106 | + organization_id=organization_id, |
| 2107 | + project_id=project_id, |
| 2108 | + account_id=account_id, |
| 2109 | + from_date=dt_new_from_date.strftime(DATE_FORMAT), |
| 2110 | + to_date=to_date, |
| 2111 | + ) |
| 2112 | + tmp_list.extend(tmp2) |
| 2113 | + return tmp_list |
| 2114 | + |
| 2115 | + raise e |
2075 | 2116 |
|
2076 | 2117 | def get_labor_control_availability(
|
2077 | 2118 | self, account_id: str, from_date: Optional[str] = None, to_date: Optional[str] = None
|
|
0 commit comments