# coding: utf-8

"""
    Teambition Open API

    Teambition Open API

    The version of the OpenAPI document: 1.0.0
    Generated by OpenAPI Generator (https://openapi-generator.tech)

    Do not edit the class manually.
"""  # noqa: E501


import warnings
from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
from typing import Any, Dict, List, Optional, Tuple, Union
from typing_extensions import Annotated

from pydantic import Field, StrictBool, StrictFloat, StrictInt, StrictStr
from typing import Any, Dict, Optional, Union
from typing_extensions import Annotated
from teambition_oapi_sdk.model.add_project_group_member_v3_request import AddProjectGroupMemberV3Request
from teambition_oapi_sdk.model.add_project_group_member_v3_response import AddProjectGroupMemberV3Response
from teambition_oapi_sdk.model.archive_project_v3_response import ArchiveProjectV3Response
from teambition_oapi_sdk.model.assign_member_role_v3_request import AssignMemberRoleV3Request
from teambition_oapi_sdk.model.assign_member_role_v3_response import AssignMemberRoleV3Response
from teambition_oapi_sdk.model.batch_get_project_custom_filed_by_instance_ids_v3_response import BatchGetProjectCustomFiledByInstanceIdsV3Response
from teambition_oapi_sdk.model.complete_sprint_v3_response import CompleteSprintV3Response
from teambition_oapi_sdk.model.copy_project_async_v3_response import CopyProjectAsyncV3Response
from teambition_oapi_sdk.model.copy_project_v3_request import CopyProjectV3Request
from teambition_oapi_sdk.model.copy_project_v3_response import CopyProjectV3Response
from teambition_oapi_sdk.model.count_project_tasks_v3_response import CountProjectTasksV3Response
from teambition_oapi_sdk.model.create_bug_group_request import CreateBugGroupRequest
from teambition_oapi_sdk.model.create_bug_group_response import CreateBugGroupResponse
from teambition_oapi_sdk.model.create_org_project_role_v3_request import CreateOrgProjectRoleV3Request
from teambition_oapi_sdk.model.create_org_project_role_v3_response import CreateOrgProjectRoleV3Response
from teambition_oapi_sdk.model.create_project_from_template_v3_request import CreateProjectFromTemplateV3Request
from teambition_oapi_sdk.model.create_project_from_template_v3_response import CreateProjectFromTemplateV3Response
from teambition_oapi_sdk.model.create_project_group_v3_request import CreateProjectGroupV3Request
from teambition_oapi_sdk.model.create_project_group_v3_response import CreateProjectGroupV3Response
from teambition_oapi_sdk.model.create_project_link_v3_request import CreateProjectLinkV3Request
from teambition_oapi_sdk.model.create_project_link_v3_response import CreateProjectLinkV3Response
from teambition_oapi_sdk.model.create_project_member_v3_request import CreateProjectMemberV3Request
from teambition_oapi_sdk.model.create_project_member_v3_response import CreateProjectMemberV3Response
from teambition_oapi_sdk.model.create_project_role_v3_request import CreateProjectRoleV3Request
from teambition_oapi_sdk.model.create_project_role_v3_response import CreateProjectRoleV3Response
from teambition_oapi_sdk.model.create_project_status_v3_request import CreateProjectStatusV3Request
from teambition_oapi_sdk.model.create_project_status_v3_response import CreateProjectStatusV3Response
from teambition_oapi_sdk.model.create_project_tag_v3_request import CreateProjectTagV3Request
from teambition_oapi_sdk.model.create_project_tag_v3_response import CreateProjectTagV3Response
from teambition_oapi_sdk.model.create_project_template_v3_request import CreateProjectTemplateV3Request
from teambition_oapi_sdk.model.create_project_template_v3_response import CreateProjectTemplateV3Response
from teambition_oapi_sdk.model.create_project_v3_request import CreateProjectV3Request
from teambition_oapi_sdk.model.create_project_v3_response import CreateProjectV3Response
from teambition_oapi_sdk.model.create_role_from_template_v3_request import CreateRoleFromTemplateV3Request
from teambition_oapi_sdk.model.create_role_from_template_v3_response import CreateRoleFromTemplateV3Response
from teambition_oapi_sdk.model.create_sprint_v3_request import CreateSprintV3Request
from teambition_oapi_sdk.model.create_sprint_v3_response import CreateSprintV3Response
from teambition_oapi_sdk.model.create_status_custom_field_v3_request import CreateStatusCustomFieldV3Request
from teambition_oapi_sdk.model.create_status_custom_field_v3_response import CreateStatusCustomFieldV3Response
from teambition_oapi_sdk.model.create_task_group_v3_request import CreateTaskGroupV3Request
from teambition_oapi_sdk.model.create_task_group_v3_response import CreateTaskGroupV3Response
from teambition_oapi_sdk.model.create_task_stage_v3_request import CreateTaskStageV3Request
from teambition_oapi_sdk.model.create_task_stage_v3_response import CreateTaskStageV3Response
from teambition_oapi_sdk.model.create_taskflow_status_v3_request import CreateTaskflowStatusV3Request
from teambition_oapi_sdk.model.create_taskflow_status_v3_response import CreateTaskflowStatusV3Response
from teambition_oapi_sdk.model.create_taskflow_v3_request import CreateTaskflowV3Request
from teambition_oapi_sdk.model.create_taskflow_v3_response import CreateTaskflowV3Response
from teambition_oapi_sdk.model.create_test_plan_group_request import CreateTestPlanGroupRequest
from teambition_oapi_sdk.model.create_test_plan_group_response import CreateTestPlanGroupResponse
from teambition_oapi_sdk.model.create_test_plan_request import CreateTestPlanRequest
from teambition_oapi_sdk.model.create_test_plan_response import CreateTestPlanResponse
from teambition_oapi_sdk.model.delete_org_member_response import DeleteOrgMemberResponse
from teambition_oapi_sdk.model.delete_org_project_role_v3_response import DeleteOrgProjectRoleV3Response
from teambition_oapi_sdk.model.delete_project_group_v3_response import DeleteProjectGroupV3Response
from teambition_oapi_sdk.model.delete_project_link_v3_response import DeleteProjectLinkV3Response
from teambition_oapi_sdk.model.delete_project_member_v3_response import DeleteProjectMemberV3Response
from teambition_oapi_sdk.model.delete_project_role_v3_response import DeleteProjectRoleV3Response
from teambition_oapi_sdk.model.delete_project_template_v3_response import DeleteProjectTemplateV3Response
from teambition_oapi_sdk.model.delete_project_v3_response import DeleteProjectV3Response
from teambition_oapi_sdk.model.delete_project_v3_response_result import DeleteProjectV3ResponseResult
from teambition_oapi_sdk.model.delete_sprint_v3_response import DeleteSprintV3Response
from teambition_oapi_sdk.model.delete_task_flow_status_v3_response import DeleteTaskFlowStatusV3Response
from teambition_oapi_sdk.model.delete_taskflow_v3_response import DeleteTaskflowV3Response
from teambition_oapi_sdk.model.get_async_job_result_v3_response import GetAsyncJobResultV3Response
from teambition_oapi_sdk.model.get_member_roles_v3_response import GetMemberRolesV3Response
from teambition_oapi_sdk.model.get_project_links_v3_response import GetProjectLinksV3Response
from teambition_oapi_sdk.model.get_project_org_chart_response import GetProjectOrgChartResponse
from teambition_oapi_sdk.model.get_project_program_response import GetProjectProgramResponse
from teambition_oapi_sdk.model.get_project_table_custom_field_response import GetProjectTableCustomFieldResponse
from teambition_oapi_sdk.model.get_project_tags_v3_response import GetProjectTagsV3Response
from teambition_oapi_sdk.model.get_scenario_fields_v3_response import GetScenarioFieldsV3Response
from teambition_oapi_sdk.model.get_test_case_group_mappings_response import GetTestCaseGroupMappingsResponse
from teambition_oapi_sdk.model.install_project_app_v3_response import InstallProjectAppV3Response
from teambition_oapi_sdk.model.list_bug_groups_response import ListBugGroupsResponse
from teambition_oapi_sdk.model.list_org_project_roles_v3_response import ListOrgProjectRolesV3Response
from teambition_oapi_sdk.model.list_priorities_v3_response import ListPrioritiesV3Response
from teambition_oapi_sdk.model.list_project_apps_v3_response import ListProjectAppsV3Response
from teambition_oapi_sdk.model.list_project_group_members_v3_response import ListProjectGroupMembersV3Response
from teambition_oapi_sdk.model.list_project_members_v3_response import ListProjectMembersV3Response
from teambition_oapi_sdk.model.list_project_reminders_v3_response import ListProjectRemindersV3Response
from teambition_oapi_sdk.model.list_project_roles_v3_response import ListProjectRolesV3Response
from teambition_oapi_sdk.model.list_project_statuses_v3_response import ListProjectStatusesV3Response
from teambition_oapi_sdk.model.list_starred_projects_response import ListStarredProjectsResponse
from teambition_oapi_sdk.model.list_status_custom_fields_v3_response import ListStatusCustomFieldsV3Response
from teambition_oapi_sdk.model.list_status_executors_v3_response import ListStatusExecutorsV3Response
from teambition_oapi_sdk.model.list_status_field_groups_v3_response import ListStatusFieldGroupsV3Response
from teambition_oapi_sdk.model.list_status_validators_v3_response import ListStatusValidatorsV3Response
from teambition_oapi_sdk.model.list_story_groups_v3_response import ListStoryGroupsV3Response
from teambition_oapi_sdk.model.list_test_plan_groups_response import ListTestPlanGroupsResponse
from teambition_oapi_sdk.model.list_test_plans_response import ListTestPlansResponse
from teambition_oapi_sdk.model.list_user_projects_v3_response import ListUserProjectsV3Response
from teambition_oapi_sdk.model.move_task_flow_status_v3_request import MoveTaskFlowStatusV3Request
from teambition_oapi_sdk.model.query_group_projects_response import QueryGroupProjectsResponse
from teambition_oapi_sdk.model.query_project_groups_v3_response import QueryProjectGroupsV3Response
from teambition_oapi_sdk.model.query_projects_v3_response import QueryProjectsV3Response
from teambition_oapi_sdk.model.query_test_plan_groups_response import QueryTestPlanGroupsResponse
from teambition_oapi_sdk.model.query_test_plans_response import QueryTestPlansResponse
from teambition_oapi_sdk.model.remove_project_group_member_v3_response import RemoveProjectGroupMemberV3Response
from teambition_oapi_sdk.model.remove_status_custom_field_v3_request import RemoveStatusCustomFieldV3Request
from teambition_oapi_sdk.model.restart_sprint_v3_response import RestartSprintV3Response
from teambition_oapi_sdk.model.restore_project_v3_response import RestoreProjectV3Response
from teambition_oapi_sdk.model.search_org_task_flow_statuses_v3_response import SearchOrgTaskFlowStatusesV3Response
from teambition_oapi_sdk.model.search_project_custom_fileds_v3_response import SearchProjectCustomFiledsV3Response
from teambition_oapi_sdk.model.search_project_tags_v3_response import SearchProjectTagsV3Response
from teambition_oapi_sdk.model.search_project_tasks_v3_response import SearchProjectTasksV3Response
from teambition_oapi_sdk.model.search_project_templates_v3_response import SearchProjectTemplatesV3Response
from teambition_oapi_sdk.model.search_projects_tql_response import SearchProjectsTQLResponse
from teambition_oapi_sdk.model.search_sprints_v3_response import SearchSprintsV3Response
from teambition_oapi_sdk.model.search_stages_v3_response import SearchStagesV3Response
from teambition_oapi_sdk.model.search_task_groups_v3_response import SearchTaskGroupsV3Response
from teambition_oapi_sdk.model.search_taskflow_nodes_response import SearchTaskflowNodesResponse
from teambition_oapi_sdk.model.search_taskflow_statuses_v3_response import SearchTaskflowStatusesV3Response
from teambition_oapi_sdk.model.search_taskflows_v3_response import SearchTaskflowsV3Response
from teambition_oapi_sdk.model.star_project_response import StarProjectResponse
from teambition_oapi_sdk.model.start_sprint_v3_request import StartSprintV3Request
from teambition_oapi_sdk.model.start_sprint_v3_response import StartSprintV3Response
from teambition_oapi_sdk.model.suspend_project_v3_response import SuspendProjectV3Response
from teambition_oapi_sdk.model.uninstall_project_app_v3_response import UninstallProjectAppV3Response
from teambition_oapi_sdk.model.update_org_project_role_v3_request import UpdateOrgProjectRoleV3Request
from teambition_oapi_sdk.model.update_project_code_request import UpdateProjectCodeRequest
from teambition_oapi_sdk.model.update_project_code_response import UpdateProjectCodeResponse
from teambition_oapi_sdk.model.update_project_custom_field_position_request import UpdateProjectCustomFieldPositionRequest
from teambition_oapi_sdk.model.update_project_custom_field_position_response import UpdateProjectCustomFieldPositionResponse
from teambition_oapi_sdk.model.update_project_group_member_permission_v3_request import UpdateProjectGroupMemberPermissionV3Request
from teambition_oapi_sdk.model.update_project_group_member_permission_v3_response import UpdateProjectGroupMemberPermissionV3Response
from teambition_oapi_sdk.model.update_project_group_v3_request import UpdateProjectGroupV3Request
from teambition_oapi_sdk.model.update_project_group_v3_response import UpdateProjectGroupV3Response
from teambition_oapi_sdk.model.update_project_table_custom_field_request import UpdateProjectTableCustomFieldRequest
from teambition_oapi_sdk.model.update_project_table_custom_field_response import UpdateProjectTableCustomFieldResponse
from teambition_oapi_sdk.model.update_project_tags_v3_request import UpdateProjectTagsV3Request
from teambition_oapi_sdk.model.update_project_tags_v3_response import UpdateProjectTagsV3Response
from teambition_oapi_sdk.model.update_project_template_info_v3_request import UpdateProjectTemplateInfoV3Request
from teambition_oapi_sdk.model.update_project_template_info_v3_response import UpdateProjectTemplateInfoV3Response
from teambition_oapi_sdk.model.update_project_v3_request import UpdateProjectV3Request
from teambition_oapi_sdk.model.update_project_v3_response import UpdateProjectV3Response
from teambition_oapi_sdk.model.update_role_permissions_v3_request import UpdateRolePermissionsV3Request
from teambition_oapi_sdk.model.update_role_permissions_v3_response import UpdateRolePermissionsV3Response
from teambition_oapi_sdk.model.update_sprint_label_v3_request import UpdateSprintLabelV3Request
from teambition_oapi_sdk.model.update_sprint_label_v3_response import UpdateSprintLabelV3Response
from teambition_oapi_sdk.model.update_sprint_lock_v3_request import UpdateSprintLockV3Request
from teambition_oapi_sdk.model.update_sprint_lock_v3_response import UpdateSprintLockV3Response
from teambition_oapi_sdk.model.update_sprint_payload_v3_request import UpdateSprintPayloadV3Request
from teambition_oapi_sdk.model.update_sprint_payload_v3_response import UpdateSprintPayloadV3Response
from teambition_oapi_sdk.model.update_sprint_v3_response import UpdateSprintV3Response
from teambition_oapi_sdk.model.update_status_custom_field_v3_request import UpdateStatusCustomFieldV3Request
from teambition_oapi_sdk.model.update_status_executors_v3_request import UpdateStatusExecutorsV3Request
from teambition_oapi_sdk.model.update_status_executors_v3_response import UpdateStatusExecutorsV3Response
from teambition_oapi_sdk.model.update_status_field_groups_v3_request import UpdateStatusFieldGroupsV3Request
from teambition_oapi_sdk.model.update_status_validators_v3_request import UpdateStatusValidatorsV3Request
from teambition_oapi_sdk.model.update_task_flow_reject_status_v3_request import UpdateTaskFlowRejectStatusV3Request
from teambition_oapi_sdk.model.update_task_flow_status_name_v3_request import UpdateTaskFlowStatusNameV3Request
from teambition_oapi_sdk.model.update_task_flow_status_type_v3_request import UpdateTaskFlowStatusTypeV3Request
from teambition_oapi_sdk.model.update_task_flow_status_type_v3_response import UpdateTaskFlowStatusTypeV3Response
from teambition_oapi_sdk.model.update_task_group_title_v3_request import UpdateTaskGroupTitleV3Request
from teambition_oapi_sdk.model.update_task_group_title_v3_response import UpdateTaskGroupTitleV3Response
from teambition_oapi_sdk.model.update_task_stage_name_v3_request import UpdateTaskStageNameV3Request
from teambition_oapi_sdk.model.update_task_stage_name_v3_response import UpdateTaskStageNameV3Response
from teambition_oapi_sdk.model.update_taskflow_name_v3_request import UpdateTaskflowNameV3Request
from teambition_oapi_sdk.model.update_taskflow_name_v3_response import UpdateTaskflowNameV3Response
from teambition_oapi_sdk.model.update_test_case_group_request import UpdateTestCaseGroupRequest
from teambition_oapi_sdk.model.update_test_case_group_response import UpdateTestCaseGroupResponse

from teambition_oapi_sdk.api_client import ApiClient, RequestSerialized
from teambition_oapi_sdk.api_response import ApiResponse
from teambition_oapi_sdk.rest import RESTResponseType

class ProjectApi:
    """NOTE: This class is auto generated by OpenAPI Generator
    Ref: https://openapi-generator.tech

    Do not edit the class manually.
    """

    def __init__(self, api_client=None) -> None:
        if api_client is None:
            api_client = ApiClient.get_default()
        self.api_client = api_client

    @validate_call
    def add_project_group_member_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> AddProjectGroupMemberV3Response:
        """创建项目分组成员

        创建项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AddProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def add_project_group_member_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[AddProjectGroupMemberV3Response]:
        """创建项目分组成员

        创建项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AddProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def add_project_group_member_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目分组成员

        创建项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AddProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _add_project_group_member_v3_serialize(
        self,
        project_tag_id,
        x_operator_id,
        x_tenant_id,
        add_project_group_member_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if add_project_group_member_v3_request is not None:
            _body_params = add_project_group_member_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}/member/create"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-tag/{projectTagId}/member/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def add_project_members_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectMemberV3Response:
        """创建项目成员 v2

        创建项目成员 v2

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def add_project_members_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectMemberV3Response]:
        """创建项目成员 v2

        创建项目成员 v2

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def add_project_members_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目成员 v2

        创建项目成员 v2

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._add_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _add_project_members_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_member_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_member_v3_request is not None:
            _body_params = create_project_member_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member/create-v2"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/member/create-v2',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def archive_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ArchiveProjectV3Response:
        """项目放入回收站

        项目放入回收站

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._archive_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ArchiveProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def archive_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ArchiveProjectV3Response]:
        """项目放入回收站

        项目放入回收站

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._archive_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ArchiveProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def archive_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """项目放入回收站

        项目放入回收站

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._archive_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ArchiveProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _archive_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/archive"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/archive',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def assign_member_role_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        assign_member_role_v3_request: Optional[AssignMemberRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> AssignMemberRoleV3Response:
        """修改项目成员的角色

        修改项目成员的角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param assign_member_role_v3_request: 
        :type assign_member_role_v3_request: AssignMemberRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._assign_member_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            assign_member_role_v3_request=assign_member_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AssignMemberRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def assign_member_role_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        assign_member_role_v3_request: Optional[AssignMemberRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[AssignMemberRoleV3Response]:
        """修改项目成员的角色

        修改项目成员的角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param assign_member_role_v3_request: 
        :type assign_member_role_v3_request: AssignMemberRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._assign_member_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            assign_member_role_v3_request=assign_member_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AssignMemberRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def assign_member_role_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        assign_member_role_v3_request: Optional[AssignMemberRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """修改项目成员的角色

        修改项目成员的角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param assign_member_role_v3_request: 
        :type assign_member_role_v3_request: AssignMemberRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._assign_member_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            assign_member_role_v3_request=assign_member_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "AssignMemberRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _assign_member_role_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        assign_member_role_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if assign_member_role_v3_request is not None:
            _body_params = assign_member_role_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member/role/assign"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/member/role/assign',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def batch_get_project_custom_filed_by_instance_ids_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 如果存在会检查该成员可见的任务")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId，用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> BatchGetProjectCustomFiledByInstanceIdsV3Response:
        """批量根据instanceId查询字段

        批量根据instanceId查询字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 如果存在会检查该成员可见的任务
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param instance_ids: 字段InstanceId，用逗号组合
        :type instance_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._batch_get_project_custom_filed_by_instance_ids_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            instance_ids=instance_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "BatchGetProjectCustomFiledByInstanceIdsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def batch_get_project_custom_filed_by_instance_ids_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 如果存在会检查该成员可见的任务")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId，用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[BatchGetProjectCustomFiledByInstanceIdsV3Response]:
        """批量根据instanceId查询字段

        批量根据instanceId查询字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 如果存在会检查该成员可见的任务
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param instance_ids: 字段InstanceId，用逗号组合
        :type instance_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._batch_get_project_custom_filed_by_instance_ids_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            instance_ids=instance_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "BatchGetProjectCustomFiledByInstanceIdsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def batch_get_project_custom_filed_by_instance_ids_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 如果存在会检查该成员可见的任务")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId，用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """批量根据instanceId查询字段

        批量根据instanceId查询字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 如果存在会检查该成员可见的任务
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param instance_ids: 字段InstanceId，用逗号组合
        :type instance_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._batch_get_project_custom_filed_by_instance_ids_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            instance_ids=instance_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "BatchGetProjectCustomFiledByInstanceIdsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _batch_get_project_custom_filed_by_instance_ids_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        instance_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if instance_ids is not None:
            
            _query_params.append(('instanceIds', instance_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/customfield/get-by-instance"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/customfield/get-by-instance',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def complete_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CompleteSprintV3Response:
        """完成迭代

        完成迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._complete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CompleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def complete_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CompleteSprintV3Response]:
        """完成迭代

        完成迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._complete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CompleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def complete_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """完成迭代

        完成迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._complete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CompleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _complete_sprint_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/complete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/complete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def copy_project_async_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CopyProjectAsyncV3Response:
        """异步复制项目

        异步复制项目, 不等待复制项目完成，需要轮询获取状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_async_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectAsyncV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def copy_project_async_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CopyProjectAsyncV3Response]:
        """异步复制项目

        异步复制项目, 不等待复制项目完成，需要轮询获取状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_async_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectAsyncV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def copy_project_async_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """异步复制项目

        异步复制项目, 不等待复制项目完成，需要轮询获取状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_async_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectAsyncV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _copy_project_async_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        wait_for_completion,
        copy_project_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if wait_for_completion is not None:
            
            _query_params.append(('waitForCompletion', wait_for_completion))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if copy_project_v3_request is not None:
            _body_params = copy_project_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/copy-async"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/copy-async',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def copy_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CopyProjectV3Response:
        """复制项目

        复制项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def copy_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CopyProjectV3Response]:
        """复制项目

        复制项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def copy_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        copy_project_v3_request: Optional[CopyProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """复制项目

        复制项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param copy_project_v3_request: 
        :type copy_project_v3_request: CopyProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._copy_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            wait_for_completion=wait_for_completion,
            copy_project_v3_request=copy_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CopyProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _copy_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        wait_for_completion,
        copy_project_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if wait_for_completion is not None:
            
            _query_params.append(('waitForCompletion', wait_for_completion))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if copy_project_v3_request is not None:
            _body_params = copy_project_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/copy"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/copy',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def count_project_tasks_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CountProjectTasksV3Response:
        """计数项目任务

        计数项目任务

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._count_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CountProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def count_project_tasks_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CountProjectTasksV3Response]:
        """计数项目任务

        计数项目任务

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._count_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CountProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def count_project_tasks_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """计数项目任务

        计数项目任务

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._count_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CountProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _count_project_tasks_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        q,
        include_archived,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if include_archived is not None:
            
            _query_params.append(('includeArchived', include_archived))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/task/count"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/task/count',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_bug_group(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateBugGroupResponse:
        """创建缺陷分类

        创建缺陷分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_bug_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_bug_group_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateBugGroupResponse]:
        """创建缺陷分类

        创建缺陷分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_bug_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_bug_group_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建缺陷分类

        创建缺陷分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_bug_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_bug_group_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_bug_group_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_bug_group_request is not None:
            _body_params = create_bug_group_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/bug/commongroup/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/bug/commongroup/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_org_project_role_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_org_project_role_v3_request: Optional[CreateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateOrgProjectRoleV3Response:
        """创建企业后台项目角色

        创建企业后台项目角色

        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_org_project_role_v3_request: 
        :type create_org_project_role_v3_request: CreateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_org_project_role_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_org_project_role_v3_request=create_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_org_project_role_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_org_project_role_v3_request: Optional[CreateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateOrgProjectRoleV3Response]:
        """创建企业后台项目角色

        创建企业后台项目角色

        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_org_project_role_v3_request: 
        :type create_org_project_role_v3_request: CreateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_org_project_role_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_org_project_role_v3_request=create_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_org_project_role_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_org_project_role_v3_request: Optional[CreateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建企业后台项目角色

        创建企业后台项目角色

        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_org_project_role_v3_request: 
        :type create_org_project_role_v3_request: CreateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_org_project_role_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_org_project_role_v3_request=create_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_org_project_role_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        create_org_project_role_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_org_project_role_v3_request is not None:
            _body_params = create_org_project_role_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-role/create"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-role/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_from_template_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        create_project_from_template_v3_request: Optional[CreateProjectFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectFromTemplateV3Response:
        """从模板创建项目

        从模板创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param create_project_from_template_v3_request: 
        :type create_project_from_template_v3_request: CreateProjectFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_from_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            wait_for_completion=wait_for_completion,
            create_project_from_template_v3_request=create_project_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_from_template_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        create_project_from_template_v3_request: Optional[CreateProjectFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectFromTemplateV3Response]:
        """从模板创建项目

        从模板创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param create_project_from_template_v3_request: 
        :type create_project_from_template_v3_request: CreateProjectFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_from_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            wait_for_completion=wait_for_completion,
            create_project_from_template_v3_request=create_project_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_from_template_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        wait_for_completion: Annotated[Optional[StrictBool], Field(description="是否等待项目下资源全部复制完成")] = None,
        create_project_from_template_v3_request: Optional[CreateProjectFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """从模板创建项目

        从模板创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param wait_for_completion: 是否等待项目下资源全部复制完成
        :type wait_for_completion: bool
        :param create_project_from_template_v3_request: 
        :type create_project_from_template_v3_request: CreateProjectFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_from_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            wait_for_completion=wait_for_completion,
            create_project_from_template_v3_request=create_project_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_from_template_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        organization_id,
        wait_for_completion,
        create_project_from_template_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        if wait_for_completion is not None:
            
            _query_params.append(('waitForCompletion', wait_for_completion))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_from_template_v3_request is not None:
            _body_params = create_project_from_template_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/create-from-template"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/create-from-template',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_group_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_group_v3_request: Optional[CreateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectGroupV3Response:
        """创建项目分组

        创建项目分组

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_group_v3_request: 
        :type create_project_group_v3_request: CreateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_group_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_group_v3_request=create_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_group_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_group_v3_request: Optional[CreateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectGroupV3Response]:
        """创建项目分组

        创建项目分组

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_group_v3_request: 
        :type create_project_group_v3_request: CreateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_group_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_group_v3_request=create_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_group_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_group_v3_request: Optional[CreateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目分组

        创建项目分组

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_group_v3_request: 
        :type create_project_group_v3_request: CreateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_group_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_group_v3_request=create_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_group_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        create_project_group_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_group_v3_request is not None:
            _body_params = create_project_group_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/create"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-tag/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_link_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_link_v3_request: Optional[CreateProjectLinkV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectLinkV3Response:
        """创建项目关联

        创建项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_link_v3_request: 
        :type create_project_link_v3_request: CreateProjectLinkV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_link_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_link_v3_request=create_project_link_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_link_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_link_v3_request: Optional[CreateProjectLinkV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectLinkV3Response]:
        """创建项目关联

        创建项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_link_v3_request: 
        :type create_project_link_v3_request: CreateProjectLinkV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_link_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_link_v3_request=create_project_link_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_link_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_link_v3_request: Optional[CreateProjectLinkV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目关联

        创建项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_link_v3_request: 
        :type create_project_link_v3_request: CreateProjectLinkV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_link_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_link_v3_request=create_project_link_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_link_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_link_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_link_v3_request is not None:
            _body_params = create_project_link_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/objectlinks"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/objectlinks',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_member_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectMemberV3Response:
        """创建项目成员(弃用)

        创建项目成员(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_member_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectMemberV3Response]:
        """创建项目成员(弃用)

        创建项目成员(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_member_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目成员(弃用)

        创建项目成员(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_member_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_member_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_member_v3_request is not None:
            _body_params = create_project_member_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/member/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_role_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_role_v3_request: Optional[CreateProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectRoleV3Response:
        """创建项目角色

        创建项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_role_v3_request: 
        :type create_project_role_v3_request: CreateProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_role_v3_request=create_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_role_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_role_v3_request: Optional[CreateProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectRoleV3Response]:
        """创建项目角色

        创建项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_role_v3_request: 
        :type create_project_role_v3_request: CreateProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_role_v3_request=create_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_role_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_role_v3_request: Optional[CreateProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目角色

        创建项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_role_v3_request: 
        :type create_project_role_v3_request: CreateProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_role_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_role_v3_request=create_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_role_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_role_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_role_v3_request is not None:
            _body_params = create_project_role_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/role/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/role/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_status_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_status_v3_request: Optional[CreateProjectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectStatusV3Response:
        """创建项目状态

        创建项目状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_status_v3_request: 
        :type create_project_status_v3_request: CreateProjectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_status_v3_request=create_project_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_status_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_status_v3_request: Optional[CreateProjectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectStatusV3Response]:
        """创建项目状态

        创建项目状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_status_v3_request: 
        :type create_project_status_v3_request: CreateProjectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_status_v3_request=create_project_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_status_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_status_v3_request: Optional[CreateProjectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目状态

        创建项目状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_status_v3_request: 
        :type create_project_status_v3_request: CreateProjectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_status_v3_request=create_project_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_status_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_status_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_status_v3_request is not None:
            _body_params = create_project_status_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/status/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_tag_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_tag_v3_request: Optional[CreateProjectTagV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectTagV3Response:
        """创建项目标签

        创建项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_tag_v3_request: 
        :type create_project_tag_v3_request: CreateProjectTagV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_tag_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_tag_v3_request=create_project_tag_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTagV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_tag_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_tag_v3_request: Optional[CreateProjectTagV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectTagV3Response]:
        """创建项目标签

        创建项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_tag_v3_request: 
        :type create_project_tag_v3_request: CreateProjectTagV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_tag_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_tag_v3_request=create_project_tag_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTagV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_tag_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_tag_v3_request: Optional[CreateProjectTagV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目标签

        创建项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_tag_v3_request: 
        :type create_project_tag_v3_request: CreateProjectTagV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_tag_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_tag_v3_request=create_project_tag_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTagV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_tag_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_tag_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_tag_v3_request is not None:
            _body_params = create_project_tag_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/tag/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/tag/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_template_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_template_v3_request: Optional[CreateProjectTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectTemplateV3Response:
        """创建项目模版

        创建项目模版

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_template_v3_request: 
        :type create_project_template_v3_request: CreateProjectTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_template_v3_request=create_project_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_template_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_template_v3_request: Optional[CreateProjectTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectTemplateV3Response]:
        """创建项目模版

        创建项目模版

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_template_v3_request: 
        :type create_project_template_v3_request: CreateProjectTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_template_v3_request=create_project_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_template_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_template_v3_request: Optional[CreateProjectTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目模版

        创建项目模版

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_template_v3_request: 
        :type create_project_template_v3_request: CreateProjectTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_template_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_template_v3_request=create_project_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_template_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        create_project_template_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_template_v3_request is not None:
            _body_params = create_project_template_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-template/create"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-template/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_project_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        create_project_v3_request: Optional[CreateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateProjectV3Response:
        """创建项目

        创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param create_project_v3_request: 
        :type create_project_v3_request: CreateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            create_project_v3_request=create_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_project_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        create_project_v3_request: Optional[CreateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateProjectV3Response]:
        """创建项目

        创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param create_project_v3_request: 
        :type create_project_v3_request: CreateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            create_project_v3_request=create_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_project_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        create_project_v3_request: Optional[CreateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目

        创建项目

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param create_project_v3_request: 
        :type create_project_v3_request: CreateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_project_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            create_project_v3_request=create_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_project_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        organization_id,
        create_project_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_v3_request is not None:
            _body_params = create_project_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/create"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_role_from_template_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_role_from_template_v3_request: Optional[CreateRoleFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateRoleFromTemplateV3Response:
        """引入企业后台项目角色到项目

        引入企业后台项目角色到项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_role_from_template_v3_request: 
        :type create_role_from_template_v3_request: CreateRoleFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_role_from_template_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_role_from_template_v3_request=create_role_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateRoleFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_role_from_template_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_role_from_template_v3_request: Optional[CreateRoleFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateRoleFromTemplateV3Response]:
        """引入企业后台项目角色到项目

        引入企业后台项目角色到项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_role_from_template_v3_request: 
        :type create_role_from_template_v3_request: CreateRoleFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_role_from_template_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_role_from_template_v3_request=create_role_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateRoleFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_role_from_template_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_role_from_template_v3_request: Optional[CreateRoleFromTemplateV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """引入企业后台项目角色到项目

        引入企业后台项目角色到项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_role_from_template_v3_request: 
        :type create_role_from_template_v3_request: CreateRoleFromTemplateV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_role_from_template_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_role_from_template_v3_request=create_role_from_template_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateRoleFromTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_role_from_template_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_role_from_template_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_role_from_template_v3_request is not None:
            _body_params = create_role_from_template_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/role/create-by-project-role"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/role/create-by-project-role',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateSprintV3Response:
        """创建迭代

        创建迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_sprint_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateSprintV3Response]:
        """创建迭代

        创建迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_sprint_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建迭代

        创建迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_sprint_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_sprint_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_sprint_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_sprint_v3_request is not None:
            _body_params = create_sprint_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/sprint/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_status_custom_field_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_status_custom_field_v3_request: Optional[CreateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateStatusCustomFieldV3Response:
        """更新项目概览自定义字段值

        更新项目概览自定义字段值

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_status_custom_field_v3_request: 
        :type create_status_custom_field_v3_request: CreateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_status_custom_field_v3_request=create_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateStatusCustomFieldV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_status_custom_field_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_status_custom_field_v3_request: Optional[CreateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateStatusCustomFieldV3Response]:
        """更新项目概览自定义字段值

        更新项目概览自定义字段值

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_status_custom_field_v3_request: 
        :type create_status_custom_field_v3_request: CreateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_status_custom_field_v3_request=create_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateStatusCustomFieldV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_status_custom_field_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_status_custom_field_v3_request: Optional[CreateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目概览自定义字段值

        更新项目概览自定义字段值

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_status_custom_field_v3_request: 
        :type create_status_custom_field_v3_request: CreateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_status_custom_field_v3_request=create_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateStatusCustomFieldV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_status_custom_field_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_status_custom_field_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_status_custom_field_v3_request is not None:
            _body_params = create_status_custom_field_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/customfield/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/status/customfield/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_story_group(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateBugGroupResponse:
        """创建需求分类

        创建需求分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_story_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_story_group_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateBugGroupResponse]:
        """创建需求分类

        创建需求分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_story_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_story_group_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_bug_group_request: Optional[CreateBugGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建需求分类

        创建需求分类

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_bug_group_request: 
        :type create_bug_group_request: CreateBugGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_story_group_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_bug_group_request=create_bug_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateBugGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_story_group_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_bug_group_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_bug_group_request is not None:
            _body_params = create_bug_group_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/story/commongroup/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/story/commongroup/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_task_group_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_group_v3_request: Optional[CreateTaskGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTaskGroupV3Response:
        """创建任务分组

        创建任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_group_v3_request: 
        :type create_task_group_v3_request: CreateTaskGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_group_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_group_v3_request=create_task_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_task_group_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_group_v3_request: Optional[CreateTaskGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTaskGroupV3Response]:
        """创建任务分组

        创建任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_group_v3_request: 
        :type create_task_group_v3_request: CreateTaskGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_group_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_group_v3_request=create_task_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_task_group_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_group_v3_request: Optional[CreateTaskGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建任务分组

        创建任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_group_v3_request: 
        :type create_task_group_v3_request: CreateTaskGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_group_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_group_v3_request=create_task_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_task_group_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_task_group_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_task_group_v3_request is not None:
            _body_params = create_task_group_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/tasklist/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/tasklist/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_task_stage_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_stage_v3_request: Optional[CreateTaskStageV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTaskStageV3Response:
        """创建任务列表

        创建任务列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_stage_v3_request: 
        :type create_task_stage_v3_request: CreateTaskStageV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_stage_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_stage_v3_request=create_task_stage_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskStageV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_task_stage_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_stage_v3_request: Optional[CreateTaskStageV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTaskStageV3Response]:
        """创建任务列表

        创建任务列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_stage_v3_request: 
        :type create_task_stage_v3_request: CreateTaskStageV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_stage_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_stage_v3_request=create_task_stage_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskStageV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_task_stage_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_task_stage_v3_request: Optional[CreateTaskStageV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建任务列表

        创建任务列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_task_stage_v3_request: 
        :type create_task_stage_v3_request: CreateTaskStageV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_task_stage_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_task_stage_v3_request=create_task_stage_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskStageV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_task_stage_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_task_stage_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_task_stage_v3_request is not None:
            _body_params = create_task_stage_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/stage/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/stage/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_taskflow_status_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_status_v3_request: Optional[CreateTaskflowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTaskflowStatusV3Response:
        """创建项目工作流状态

        创建项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_status_v3_request: 
        :type create_taskflow_status_v3_request: CreateTaskflowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_status_v3_request=create_taskflow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_taskflow_status_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_status_v3_request: Optional[CreateTaskflowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTaskflowStatusV3Response]:
        """创建项目工作流状态

        创建项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_status_v3_request: 
        :type create_taskflow_status_v3_request: CreateTaskflowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_status_v3_request=create_taskflow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_taskflow_status_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_status_v3_request: Optional[CreateTaskflowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目工作流状态

        创建项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_status_v3_request: 
        :type create_taskflow_status_v3_request: CreateTaskflowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_status_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_status_v3_request=create_taskflow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_taskflow_status_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_taskflow_status_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_taskflow_status_v3_request is not None:
            _body_params = create_taskflow_status_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflowstatus/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_taskflow_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_v3_request: Optional[CreateTaskflowV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTaskflowV3Response:
        """创建项目工作流

        创建项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_v3_request: 
        :type create_taskflow_v3_request: CreateTaskflowV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_v3_request=create_taskflow_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_taskflow_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_v3_request: Optional[CreateTaskflowV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTaskflowV3Response]:
        """创建项目工作流

        创建项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_v3_request: 
        :type create_taskflow_v3_request: CreateTaskflowV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_v3_request=create_taskflow_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_taskflow_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_taskflow_v3_request: Optional[CreateTaskflowV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建项目工作流

        创建项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_taskflow_v3_request: 
        :type create_taskflow_v3_request: CreateTaskflowV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_taskflow_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_taskflow_v3_request=create_taskflow_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_taskflow_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_taskflow_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_taskflow_v3_request is not None:
            _body_params = create_taskflow_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflow/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflow/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_test_plan(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_request: Optional[CreateTestPlanRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTestPlanResponse:
        """创建测试计划

        创建测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_request: 
        :type create_test_plan_request: CreateTestPlanRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_request=create_test_plan_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_test_plan_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_request: Optional[CreateTestPlanRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTestPlanResponse]:
        """创建测试计划

        创建测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_request: 
        :type create_test_plan_request: CreateTestPlanRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_request=create_test_plan_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_test_plan_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_request: Optional[CreateTestPlanRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建测试计划

        创建测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_request: 
        :type create_test_plan_request: CreateTestPlanRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_request=create_test_plan_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_test_plan_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_test_plan_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_test_plan_request is not None:
            _body_params = create_test_plan_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testplan/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/testplan/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def create_test_plan_group(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_group_request: Optional[CreateTestPlanGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateTestPlanGroupResponse:
        """创建测试计划分组

        创建测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_group_request: 
        :type create_test_plan_group_request: CreateTestPlanGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_group_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_group_request=create_test_plan_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def create_test_plan_group_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_group_request: Optional[CreateTestPlanGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateTestPlanGroupResponse]:
        """创建测试计划分组

        创建测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_group_request: 
        :type create_test_plan_group_request: CreateTestPlanGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_group_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_group_request=create_test_plan_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def create_test_plan_group_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="创建者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_test_plan_group_request: Optional[CreateTestPlanGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建测试计划分组

        创建测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 创建者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_test_plan_group_request: 
        :type create_test_plan_group_request: CreateTestPlanGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._create_test_plan_group_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_test_plan_group_request=create_test_plan_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateTestPlanGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _create_test_plan_group_serialize(
        self,
        project_id,
        testplan_id,
        x_operator_id,
        x_tenant_id,
        create_test_plan_group_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if testplan_id is not None:
            _path_params['testplanId'] = testplan_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_test_plan_group_request is not None:
            _body_params = create_test_plan_group_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testplan/{testplanId}/commongroup/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'testplanId' + '}', str(testplan_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/testplan/{testplanId}/commongroup/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_org_project_role_v3(
        self,
        role_id: Annotated[StrictStr, Field(description="角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteOrgProjectRoleV3Response:
        """删除企业后台项目角色

        删除企业后台项目角色

        :param role_id: 角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_org_project_role_v3_with_http_info(
        self,
        role_id: Annotated[StrictStr, Field(description="角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteOrgProjectRoleV3Response]:
        """删除企业后台项目角色

        删除企业后台项目角色

        :param role_id: 角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_org_project_role_v3_without_preload_content(
        self,
        role_id: Annotated[StrictStr, Field(description="角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除企业后台项目角色

        删除企业后台项目角色

        :param role_id: 角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_org_project_role_v3_serialize(
        self,
        role_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if role_id is not None:
            _path_params['roleId'] = role_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-role/{roleId}/delete"
        url = url.replace('{' + 'roleId' + '}', str(role_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-role/{roleId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_group_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectGroupV3Response:
        """删除项目分组

        删除项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_group_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectGroupV3Response]:
        """删除项目分组

        删除项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_group_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目分组

        删除项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_group_v3_serialize(
        self,
        project_tag_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='DELETE',
            resource_path='/v3/project-tag/{projectTagId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_link_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        objectlink_id: Annotated[StrictStr, Field(description="关联 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectLinkV3Response:
        """删除项目关联

        删除项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param objectlink_id: 关联 ID (required)
        :type objectlink_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_link_v3_serialize(
            project_id=project_id,
            objectlink_id=objectlink_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_link_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        objectlink_id: Annotated[StrictStr, Field(description="关联 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectLinkV3Response]:
        """删除项目关联

        删除项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param objectlink_id: 关联 ID (required)
        :type objectlink_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_link_v3_serialize(
            project_id=project_id,
            objectlink_id=objectlink_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_link_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        objectlink_id: Annotated[StrictStr, Field(description="关联 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目关联

        删除项目关联

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param objectlink_id: 关联 ID (required)
        :type objectlink_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_link_v3_serialize(
            project_id=project_id,
            objectlink_id=objectlink_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectLinkV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_link_v3_serialize(
        self,
        project_id,
        objectlink_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if objectlink_id is not None:
            _path_params['objectlinkId'] = objectlink_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/objectlinks/{objectlinkId}"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'objectlinkId' + '}', str(objectlink_id))

        return self.api_client.param_serialize(
            method='DELETE',
            resource_path='/v3/project/{projectId}/objectlinks/{objectlinkId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_member_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectMemberV3Response:
        """删除项目成员

        删除项目成员

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_member_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectMemberV3Response]:
        """删除项目成员

        删除项目成员

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_member_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_project_member_v3_request: Optional[CreateProjectMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目成员

        删除项目成员

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_project_member_v3_request: 
        :type create_project_member_v3_request: CreateProjectMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_member_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_project_member_v3_request=create_project_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_member_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        create_project_member_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_project_member_v3_request is not None:
            _body_params = create_project_member_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/member/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_role_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectRoleV3Response:
        """移除项目角色

        移除项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_role_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_role_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectRoleV3Response]:
        """移除项目角色

        移除项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_role_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_role_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """移除项目角色

        移除项目角色

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_role_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_role_v3_serialize(
        self,
        project_id,
        role_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if role_id is not None:
            _path_params['roleId'] = role_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/role/{roleId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'roleId' + '}', str(role_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/role/{roleId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_template_v3(
        self,
        template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectTemplateV3Response:
        """删除项目模版

        删除项目模版

        :param template_id: 项目模板 ID (required)
        :type template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_template_v3_serialize(
            template_id=template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_template_v3_with_http_info(
        self,
        template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectTemplateV3Response]:
        """删除项目模版

        删除项目模版

        :param template_id: 项目模板 ID (required)
        :type template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_template_v3_serialize(
            template_id=template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_template_v3_without_preload_content(
        self,
        template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目模版

        删除项目模版

        :param template_id: 项目模板 ID (required)
        :type template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_template_v3_serialize(
            template_id=template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectTemplateV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_template_v3_serialize(
        self,
        template_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if template_id is not None:
            _path_params['templateId'] = template_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-template/{templateId}"
        url = url.replace('{' + 'templateId' + '}', str(template_id))

        return self.api_client.param_serialize(
            method='DELETE',
            resource_path='/v3/project-template/{templateId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteProjectV3Response:
        """删除项目

        删除项目

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteProjectV3Response]:
        """删除项目

        删除项目

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目

        删除项目

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteSprintV3Response:
        """删除迭代

        删除迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteSprintV3Response]:
        """删除迭代

        删除迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除迭代

        删除迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_sprint_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_status_custom_field_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        customfield_id: Annotated[StrictStr, Field(description="自定义字段ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteOrgMemberResponse:
        """删除项目概览自定义字段(弃用)

        删除项目概览自定义字段(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param customfield_id: 自定义字段ID (required)
        :type customfield_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_status_custom_field_v3_serialize(
            project_id=project_id,
            customfield_id=customfield_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_status_custom_field_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        customfield_id: Annotated[StrictStr, Field(description="自定义字段ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteOrgMemberResponse]:
        """删除项目概览自定义字段(弃用)

        删除项目概览自定义字段(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param customfield_id: 自定义字段ID (required)
        :type customfield_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_status_custom_field_v3_serialize(
            project_id=project_id,
            customfield_id=customfield_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_status_custom_field_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        customfield_id: Annotated[StrictStr, Field(description="自定义字段ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目概览自定义字段(弃用)

        删除项目概览自定义字段(弃用)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param customfield_id: 自定义字段ID (required)
        :type customfield_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_status_custom_field_v3_serialize(
            project_id=project_id,
            customfield_id=customfield_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_status_custom_field_v3_serialize(
        self,
        project_id,
        customfield_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if customfield_id is not None:
            _path_params['customfieldId'] = customfield_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/customfield/{customfieldId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'customfieldId' + '}', str(customfield_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/status/customfield/{customfieldId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_task_flow_status_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        archive_when_implemented: Annotated[Optional[StrictBool], Field(description="如果存在这个工作流节点的任务，是否自动归档替换删除.")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteTaskFlowStatusV3Response:
        """删除项目工作流状态

        删除项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param archive_when_implemented: 如果存在这个工作流节点的任务，是否自动归档替换删除.
        :type archive_when_implemented: bool
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            archive_when_implemented=archive_when_implemented,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskFlowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_task_flow_status_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        archive_when_implemented: Annotated[Optional[StrictBool], Field(description="如果存在这个工作流节点的任务，是否自动归档替换删除.")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteTaskFlowStatusV3Response]:
        """删除项目工作流状态

        删除项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param archive_when_implemented: 如果存在这个工作流节点的任务，是否自动归档替换删除.
        :type archive_when_implemented: bool
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            archive_when_implemented=archive_when_implemented,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskFlowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_task_flow_status_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        archive_when_implemented: Annotated[Optional[StrictBool], Field(description="如果存在这个工作流节点的任务，是否自动归档替换删除.")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目工作流状态

        删除项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param archive_when_implemented: 如果存在这个工作流节点的任务，是否自动归档替换删除.
        :type archive_when_implemented: bool
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            archive_when_implemented=archive_when_implemented,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskFlowStatusV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_task_flow_status_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        archive_when_implemented,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        if archive_when_implemented is not None:
            
            _query_params.append(('archiveWhenImplemented', archive_when_implemented))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def delete_taskflow_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteTaskflowV3Response:
        """删除项目工作流

        删除项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_taskflow_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def delete_taskflow_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteTaskflowV3Response]:
        """删除项目工作流

        删除项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_taskflow_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def delete_taskflow_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目工作流

        删除项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._delete_taskflow_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteTaskflowV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _delete_taskflow_v3_serialize(
        self,
        project_id,
        taskflow_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if taskflow_id is not None:
            _path_params['taskflowId'] = taskflow_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflow/{taskflowId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'taskflowId' + '}', str(taskflow_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflow/{taskflowId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_async_job_result_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        keys: Annotated[Optional[StrictStr], Field(description="异步 job 的 readyKey，多个以逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetAsyncJobResultV3Response:
        """获取异步 job 执行结果

        获取异步 job 执行结果，执行完毕则返回结果，否则继续用 readyKey 轮询

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param keys: 异步 job 的 readyKey，多个以逗号分隔
        :type keys: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_async_job_result_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            keys=keys,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetAsyncJobResultV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_async_job_result_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        keys: Annotated[Optional[StrictStr], Field(description="异步 job 的 readyKey，多个以逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetAsyncJobResultV3Response]:
        """获取异步 job 执行结果

        获取异步 job 执行结果，执行完毕则返回结果，否则继续用 readyKey 轮询

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param keys: 异步 job 的 readyKey，多个以逗号分隔
        :type keys: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_async_job_result_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            keys=keys,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetAsyncJobResultV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_async_job_result_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        keys: Annotated[Optional[StrictStr], Field(description="异步 job 的 readyKey，多个以逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取异步 job 执行结果

        获取异步 job 执行结果，执行完毕则返回结果，否则继续用 readyKey 轮询

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param keys: 异步 job 的 readyKey，多个以逗号分隔
        :type keys: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_async_job_result_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            keys=keys,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetAsyncJobResultV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_async_job_result_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        keys,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if keys is not None:
            
            _query_params.append(('keys', keys))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/async-job/list"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/async-job/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_member_roles_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="查询用户ID， 用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetMemberRolesV3Response:
        """获取项目成员角色（包含权限穿透角色）

        获取项目成员角色（包含权限穿透角色）

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 查询用户ID， 用逗号组合
        :type user_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_member_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetMemberRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_member_roles_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="查询用户ID， 用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetMemberRolesV3Response]:
        """获取项目成员角色（包含权限穿透角色）

        获取项目成员角色（包含权限穿透角色）

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 查询用户ID， 用逗号组合
        :type user_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_member_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetMemberRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_member_roles_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="查询用户ID， 用逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目成员角色（包含权限穿透角色）

        获取项目成员角色（包含权限穿透角色）

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 查询用户ID， 用逗号组合
        :type user_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_member_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetMemberRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_member_roles_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        user_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if user_ids is not None:
            
            _query_params.append(('userIds', user_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member-role"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/member-role',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_project_links_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetProjectLinksV3Response:
        """获取项目关联列表

        获取项目关联列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_links_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectLinksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_project_links_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetProjectLinksV3Response]:
        """获取项目关联列表

        获取项目关联列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_links_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectLinksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_project_links_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目关联列表

        获取项目关联列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_links_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectLinksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_project_links_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/objectlinks"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/objectlinks',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_project_org_chart(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetProjectOrgChartResponse:
        """获取项目组织架构图

        获取项目组织架构图

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_org_chart_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectOrgChartResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_project_org_chart_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetProjectOrgChartResponse]:
        """获取项目组织架构图

        获取项目组织架构图

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_org_chart_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectOrgChartResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_project_org_chart_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目组织架构图

        获取项目组织架构图

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_org_chart_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectOrgChartResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_project_org_chart_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/preference/project-team"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/preference/project-team',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_project_program(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetProjectProgramResponse:
        """查询项目所属项目集id

        查询项目所属项目集id

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_program_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectProgramResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_project_program_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetProjectProgramResponse]:
        """查询项目所属项目集id

        查询项目所属项目集id

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_program_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectProgramResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_project_program_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目所属项目集id

        查询项目所属项目集id

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_program_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectProgramResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_project_program_serialize(
        self,
        project_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/program/query"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/program/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_project_table_custom_field(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        customfield_id: Optional[StrictStr] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetProjectTableCustomFieldResponse:
        """获取项目的表格自定义字段

        获取项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param customfield_id: 
        :type customfield_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            customfield_id=customfield_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_project_table_custom_field_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        customfield_id: Optional[StrictStr] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetProjectTableCustomFieldResponse]:
        """获取项目的表格自定义字段

        获取项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param customfield_id: 
        :type customfield_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            customfield_id=customfield_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_project_table_custom_field_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        customfield_id: Optional[StrictStr] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目的表格自定义字段

        获取项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param customfield_id: 
        :type customfield_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            customfield_id=customfield_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_project_table_custom_field_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        customfield_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if customfield_id is not None:
            
            _query_params.append(('customfieldId', customfield_id))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/customfield/table"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/customfield/table',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_project_tags_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetProjectTagsV3Response:
        """查看项目的项目分组

        查看项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_project_tags_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetProjectTagsV3Response]:
        """查看项目的项目分组

        查看项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_project_tags_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查看项目的项目分组

        查看项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_project_tags_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/project-tag"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/project-tag',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_scenario_fields_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        sfc_ids: Annotated[Optional[StrictStr], Field(description="任务类型ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="搜索关键字")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量(默认为50)")] = None,
        object_types: Annotated[Optional[StrictStr], Field(description="查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  ")] = None,
        sources: Annotated[Optional[StrictStr], Field(description="是否来自安装应用,可能有 application.risk | application.story | application.bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetScenarioFieldsV3Response:
        """获取项目任务类型

        获取项目任务类型

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param sfc_ids: 任务类型ID集合，逗号组合
        :type sfc_ids: str
        :param q: 搜索关键字
        :type q: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量(默认为50)
        :type page_size: int
        :param object_types: 查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  
        :type object_types: str
        :param sources: 是否来自安装应用,可能有 application.risk | application.story | application.bug
        :type sources: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_scenario_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            sfc_ids=sfc_ids,
            q=q,
            page_token=page_token,
            page_size=page_size,
            object_types=object_types,
            sources=sources,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetScenarioFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_scenario_fields_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        sfc_ids: Annotated[Optional[StrictStr], Field(description="任务类型ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="搜索关键字")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量(默认为50)")] = None,
        object_types: Annotated[Optional[StrictStr], Field(description="查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  ")] = None,
        sources: Annotated[Optional[StrictStr], Field(description="是否来自安装应用,可能有 application.risk | application.story | application.bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetScenarioFieldsV3Response]:
        """获取项目任务类型

        获取项目任务类型

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param sfc_ids: 任务类型ID集合，逗号组合
        :type sfc_ids: str
        :param q: 搜索关键字
        :type q: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量(默认为50)
        :type page_size: int
        :param object_types: 查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  
        :type object_types: str
        :param sources: 是否来自安装应用,可能有 application.risk | application.story | application.bug
        :type sources: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_scenario_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            sfc_ids=sfc_ids,
            q=q,
            page_token=page_token,
            page_size=page_size,
            object_types=object_types,
            sources=sources,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetScenarioFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_scenario_fields_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        sfc_ids: Annotated[Optional[StrictStr], Field(description="任务类型ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="搜索关键字")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量(默认为50)")] = None,
        object_types: Annotated[Optional[StrictStr], Field(description="查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  ")] = None,
        sources: Annotated[Optional[StrictStr], Field(description="是否来自安装应用,可能有 application.risk | application.story | application.bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目任务类型

        获取项目任务类型

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param sfc_ids: 任务类型ID集合，逗号组合
        :type sfc_ids: str
        :param q: 搜索关键字
        :type q: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量(默认为50)
        :type page_size: int
        :param object_types: 查询指定资源类型的字段配置,以逗号分隔,例如:'task,testcase' 默认为task，可选值： - 'task' 任务 - 'testcase' 测试用例 - 'event' 日程  
        :type object_types: str
        :param sources: 是否来自安装应用,可能有 application.risk | application.story | application.bug
        :type sources: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_scenario_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            sfc_ids=sfc_ids,
            q=q,
            page_token=page_token,
            page_size=page_size,
            object_types=object_types,
            sources=sources,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetScenarioFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_scenario_fields_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        sfc_ids,
        q,
        page_token,
        page_size,
        object_types,
        sources,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if sfc_ids is not None:
            
            _query_params.append(('sfcIds', sfc_ids))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if object_types is not None:
            
            _query_params.append(('objectTypes', object_types))
            
        if sources is not None:
            
            _query_params.append(('sources', sources))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/scenariofieldconfig/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/scenariofieldconfig/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def get_test_case_group_mappings(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testcase_ids: Annotated[Optional[StrictStr], Field(description="测试用例ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> GetTestCaseGroupMappingsResponse:
        """批量获取测试用例与归属分组的对应关系

        批量获取测试用例与归属分组的对应关系

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testcase_ids: 测试用例ID 集合,使用逗号分隔
        :type testcase_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_test_case_group_mappings_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            testcase_ids=testcase_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetTestCaseGroupMappingsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def get_test_case_group_mappings_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testcase_ids: Annotated[Optional[StrictStr], Field(description="测试用例ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[GetTestCaseGroupMappingsResponse]:
        """批量获取测试用例与归属分组的对应关系

        批量获取测试用例与归属分组的对应关系

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testcase_ids: 测试用例ID 集合,使用逗号分隔
        :type testcase_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_test_case_group_mappings_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            testcase_ids=testcase_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetTestCaseGroupMappingsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def get_test_case_group_mappings_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testcase_ids: Annotated[Optional[StrictStr], Field(description="测试用例ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """批量获取测试用例与归属分组的对应关系

        批量获取测试用例与归属分组的对应关系

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testcase_ids: 测试用例ID 集合,使用逗号分隔
        :type testcase_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._get_test_case_group_mappings_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            testcase_ids=testcase_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "GetTestCaseGroupMappingsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _get_test_case_group_mappings_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        testcase_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if testcase_ids is not None:
            
            _query_params.append(('testcaseIds', testcase_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testcase/commongroup-mapping"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/testcase/commongroup-mapping',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def install_project_app_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> InstallProjectAppV3Response:
        """安装项目应用

        安装项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._install_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "InstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def install_project_app_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[InstallProjectAppV3Response]:
        """安装项目应用

        安装项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._install_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "InstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def install_project_app_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """安装项目应用

        安装项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._install_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "InstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _install_project_app_v3_serialize(
        self,
        project_id,
        app_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if app_id is not None:
            _path_params['appId'] = app_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/application/{appId}/create"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'appId' + '}', str(app_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/application/{appId}/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_bug_groups(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="缺陷分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父缺陷分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页缺陷分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListBugGroupsResponse:
        """获取缺陷分类列表

        获取缺陷分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 缺陷分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父缺陷分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页缺陷分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_bug_groups_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListBugGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_bug_groups_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="缺陷分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父缺陷分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页缺陷分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListBugGroupsResponse]:
        """获取缺陷分类列表

        获取缺陷分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 缺陷分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父缺陷分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页缺陷分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_bug_groups_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListBugGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_bug_groups_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="缺陷分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父缺陷分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页缺陷分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取缺陷分类列表

        获取缺陷分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 缺陷分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父缺陷分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页缺陷分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_bug_groups_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListBugGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_bug_groups_serialize(
        self,
        project_id,
        x_tenant_id,
        commongroup_ids,
        parent_commongroup_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if commongroup_ids is not None:
            
            _query_params.append(('commongroupIds', commongroup_ids))
            
        if parent_commongroup_id is not None:
            
            _query_params.append(('parentCommongroupId', parent_commongroup_id))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/bug/commongroup"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/bug/commongroup',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_org_project_roles_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业 Id")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListOrgProjectRolesV3Response:
        """获取企业后台项目角色

        获取企业后台项目角色

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业 Id
        :type organization_id: str
        :param page_size: 返回数量
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_org_project_roles_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListOrgProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_org_project_roles_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业 Id")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListOrgProjectRolesV3Response]:
        """获取企业后台项目角色

        获取企业后台项目角色

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业 Id
        :type organization_id: str
        :param page_size: 返回数量
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_org_project_roles_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListOrgProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_org_project_roles_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业 Id")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取企业后台项目角色

        获取企业后台项目角色

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业 Id
        :type organization_id: str
        :param page_size: 返回数量
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_org_project_roles_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListOrgProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_org_project_roles_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        organization_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-role/list"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-role/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_priorities_v3(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListPrioritiesV3Response:
        """查询企业优先级

        查询企业优先级

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID
        :type organization_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_priorities_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListPrioritiesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_priorities_v3_with_http_info(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListPrioritiesV3Response]:
        """查询企业优先级

        查询企业优先级

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID
        :type organization_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_priorities_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListPrioritiesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_priorities_v3_without_preload_content(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询企业优先级

        查询企业优先级

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID
        :type organization_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_priorities_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListPrioritiesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_priorities_v3_serialize(
        self,
        x_tenant_id,
        organization_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/priority/list"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/priority/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_apps_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        app_ids: Annotated[Optional[StrictStr], Field(description="应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="installed 或者 all，默认查询已经安装的应用")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectAppsV3Response:
        """查询项目应用列表

        查询项目应用列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param app_ids: 应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID
        :type app_ids: str
        :param scope: installed 或者 all，默认查询已经安装的应用
        :type scope: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_apps_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            app_ids=app_ids,
            scope=scope,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectAppsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_apps_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        app_ids: Annotated[Optional[StrictStr], Field(description="应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="installed 或者 all，默认查询已经安装的应用")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectAppsV3Response]:
        """查询项目应用列表

        查询项目应用列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param app_ids: 应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID
        :type app_ids: str
        :param scope: installed 或者 all，默认查询已经安装的应用
        :type scope: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_apps_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            app_ids=app_ids,
            scope=scope,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectAppsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_apps_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        app_ids: Annotated[Optional[StrictStr], Field(description="应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="installed 或者 all，默认查询已经安装的应用")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目应用列表

        查询项目应用列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param app_ids: 应用ID集合，逗号分隔，如果传递该参数仅查询指定 应用ID
        :type app_ids: str
        :param scope: installed 或者 all，默认查询已经安装的应用
        :type scope: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_apps_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            app_ids=app_ids,
            scope=scope,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectAppsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_apps_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        app_ids,
        scope,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if app_ids is not None:
            
            _query_params.append(('appIds', app_ids))
            
        if scope is not None:
            
            _query_params.append(('scope', scope))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/application/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/application/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_group_members_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectGroupMembersV3Response:
        """获取项目分组成员列表

        获取项目分组成员列表

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_group_members_v3_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectGroupMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_group_members_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectGroupMembersV3Response]:
        """获取项目分组成员列表

        获取项目分组成员列表

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_group_members_v3_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectGroupMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_group_members_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目分组成员列表

        获取项目分组成员列表

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_group_members_v3_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectGroupMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_group_members_v3_serialize(
        self,
        project_tag_id,
        x_tenant_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}/member/list"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-tag/{projectTagId}/member/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_members_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="如果传递，仅查询这些用户ID， 用逗号组合")] = None,
        project_role_id: Annotated[Optional[StrictStr], Field(description="项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="每一页数量")] = None,
        skip: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectMembersV3Response:
        """获取项目成员列表

        获取项目成员列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 如果传递，仅查询这些用户ID， 用逗号组合
        :type user_ids: str
        :param project_role_id: 项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询
        :type project_role_id: str
        :param limit: 每一页数量
        :type limit: int
        :param skip: 分页
        :type skip: int
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            project_role_id=project_role_id,
            limit=limit,
            skip=skip,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_members_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="如果传递，仅查询这些用户ID， 用逗号组合")] = None,
        project_role_id: Annotated[Optional[StrictStr], Field(description="项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="每一页数量")] = None,
        skip: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectMembersV3Response]:
        """获取项目成员列表

        获取项目成员列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 如果传递，仅查询这些用户ID， 用逗号组合
        :type user_ids: str
        :param project_role_id: 项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询
        :type project_role_id: str
        :param limit: 每一页数量
        :type limit: int
        :param skip: 分页
        :type skip: int
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            project_role_id=project_role_id,
            limit=limit,
            skip=skip,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_members_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        user_ids: Annotated[Optional[StrictStr], Field(description="如果传递，仅查询这些用户ID， 用逗号组合")] = None,
        project_role_id: Annotated[Optional[StrictStr], Field(description="项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询")] = None,
        limit: Annotated[Optional[StrictInt], Field(description="每一页数量")] = None,
        skip: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目成员列表

        获取项目成员列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param user_ids: 如果传递，仅查询这些用户ID， 用逗号组合
        :type user_ids: str
        :param project_role_id: 项目角色ID，仅查询拥有该角色的成员，并且仅支持单个角色查询
        :type project_role_id: str
        :param limit: 每一页数量
        :type limit: int
        :param skip: 分页
        :type skip: int
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_members_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            user_ids=user_ids,
            project_role_id=project_role_id,
            limit=limit,
            skip=skip,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectMembersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_members_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        user_ids,
        project_role_id,
        limit,
        skip,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if user_ids is not None:
            
            _query_params.append(('userIds', user_ids))
            
        if project_role_id is not None:
            
            _query_params.append(('projectRoleId', project_role_id))
            
        if limit is not None:
            
            _query_params.append(('limit', limit))
            
        if skip is not None:
            
            _query_params.append(('skip', skip))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/member"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/member',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_reminders_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectRemindersV3Response:
        """获取项目「默认任务提醒」列表

        获取项目「默认任务提醒」列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页数量
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_reminders_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRemindersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_reminders_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectRemindersV3Response]:
        """获取项目「默认任务提醒」列表

        获取项目「默认任务提醒」列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页数量
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_reminders_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRemindersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_reminders_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页数量")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目「默认任务提醒」列表

        获取项目「默认任务提醒」列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页数量
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_reminders_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRemindersV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_reminders_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/reminder/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/reminder/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_roles_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        level: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="角色等级")] = None,
        include_hidden: Annotated[Optional[StrictBool], Field(description="是否返回隐藏角色,默认为否")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectRolesV3Response:
        """获取项目角色列表

        获取项目角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param level: 角色等级
        :type level: float
        :param include_hidden: 是否返回隐藏角色,默认为否
        :type include_hidden: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            level=level,
            include_hidden=include_hidden,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_roles_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        level: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="角色等级")] = None,
        include_hidden: Annotated[Optional[StrictBool], Field(description="是否返回隐藏角色,默认为否")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectRolesV3Response]:
        """获取项目角色列表

        获取项目角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param level: 角色等级
        :type level: float
        :param include_hidden: 是否返回隐藏角色,默认为否
        :type include_hidden: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            level=level,
            include_hidden=include_hidden,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_roles_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        level: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="角色等级")] = None,
        include_hidden: Annotated[Optional[StrictBool], Field(description="是否返回隐藏角色,默认为否")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取项目角色列表

        获取项目角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param level: 角色等级
        :type level: float
        :param include_hidden: 是否返回隐藏角色,默认为否
        :type include_hidden: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_roles_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            level=level,
            include_hidden=include_hidden,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectRolesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_roles_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        page_size,
        page_token,
        level,
        include_hidden,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if level is not None:
            
            _query_params.append(('level', level))
            
        if include_hidden is not None:
            
            _query_params.append(('includeHidden', include_hidden))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/role"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/role',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_project_statuses_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        render_html: Annotated[Optional[StrictBool], Field(description="是否对富文本内容html渲染，仅对白名单的应用开放")] = None,
        html_expire_seconds: Annotated[Optional[StrictInt], Field(description="渲染html时内容过期时间，默认为 1800(秒)")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListProjectStatusesV3Response:
        """查询项目状态和状态历史

        查询项目状态和状态历史

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 分页大小
        :type page_size: int
        :param render_html: 是否对富文本内容html渲染，仅对白名单的应用开放
        :type render_html: bool
        :param html_expire_seconds: 渲染html时内容过期时间，默认为 1800(秒)
        :type html_expire_seconds: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_token=page_token,
            page_size=page_size,
            render_html=render_html,
            html_expire_seconds=html_expire_seconds,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_project_statuses_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        render_html: Annotated[Optional[StrictBool], Field(description="是否对富文本内容html渲染，仅对白名单的应用开放")] = None,
        html_expire_seconds: Annotated[Optional[StrictInt], Field(description="渲染html时内容过期时间，默认为 1800(秒)")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListProjectStatusesV3Response]:
        """查询项目状态和状态历史

        查询项目状态和状态历史

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 分页大小
        :type page_size: int
        :param render_html: 是否对富文本内容html渲染，仅对白名单的应用开放
        :type render_html: bool
        :param html_expire_seconds: 渲染html时内容过期时间，默认为 1800(秒)
        :type html_expire_seconds: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_token=page_token,
            page_size=page_size,
            render_html=render_html,
            html_expire_seconds=html_expire_seconds,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_project_statuses_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        render_html: Annotated[Optional[StrictBool], Field(description="是否对富文本内容html渲染，仅对白名单的应用开放")] = None,
        html_expire_seconds: Annotated[Optional[StrictInt], Field(description="渲染html时内容过期时间，默认为 1800(秒)")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目状态和状态历史

        查询项目状态和状态历史

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 分页大小
        :type page_size: int
        :param render_html: 是否对富文本内容html渲染，仅对白名单的应用开放
        :type render_html: bool
        :param html_expire_seconds: 渲染html时内容过期时间，默认为 1800(秒)
        :type html_expire_seconds: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_project_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_token=page_token,
            page_size=page_size,
            render_html=render_html,
            html_expire_seconds=html_expire_seconds,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListProjectStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_project_statuses_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        page_token,
        page_size,
        render_html,
        html_expire_seconds,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if render_html is not None:
            
            _query_params.append(('renderHtml', render_html))
            
        if html_expire_seconds is not None:
            
            _query_params.append(('htmlExpireSeconds', html_expire_seconds))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/status/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_starred_projects(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStarredProjectsResponse:
        """查询用户星标项目

        查询用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_starred_projects_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStarredProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_starred_projects_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStarredProjectsResponse]:
        """查询用户星标项目

        查询用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_starred_projects_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStarredProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_starred_projects_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询用户星标项目

        查询用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_starred_projects_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStarredProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_starred_projects_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-star/query"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-star/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_status_custom_fields_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStatusCustomFieldsV3Response:
        """查询项目概览自定义字段列表

        查询项目概览自定义字段列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_custom_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusCustomFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_status_custom_fields_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStatusCustomFieldsV3Response]:
        """查询项目概览自定义字段列表

        查询项目概览自定义字段列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_custom_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusCustomFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_status_custom_fields_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目概览自定义字段列表

        查询项目概览自定义字段列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_custom_fields_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusCustomFieldsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_status_custom_fields_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/customfield/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/status/customfield/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_status_executors_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStatusExecutorsV3Response:
        """列出项目工作流状态流转执行角色列表

        列出项目工作流状态流转执行角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_status_executors_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStatusExecutorsV3Response]:
        """列出项目工作流状态流转执行角色列表

        列出项目工作流状态流转执行角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_status_executors_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """列出项目工作流状态流转执行角色列表

        列出项目工作流状态流转执行角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_status_executors_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/executor/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/executor/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_status_field_groups_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStatusFieldGroupsV3Response:
        """查询项目概览字段分组列表

        查询项目概览字段分组列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_status_field_groups_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStatusFieldGroupsV3Response]:
        """查询项目概览字段分组列表

        查询项目概览字段分组列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_status_field_groups_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目概览字段分组列表

        查询项目概览字段分组列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_status_field_groups_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/field-group/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/status/field-group/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_status_validators_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStatusValidatorsV3Response:
        """列出项目工作流状态流转校验列表

        列出项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusValidatorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_status_validators_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStatusValidatorsV3Response]:
        """列出项目工作流状态流转校验列表

        列出项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusValidatorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_status_validators_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """列出项目工作流状态流转校验列表

        列出项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusValidatorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_status_validators_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/validator/list"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/validator/list',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_story_groups_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="需求分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父需求分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页需求分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStoryGroupsV3Response:
        """获取需求分类列表

        获取需求分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 需求分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父需求分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页需求分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_story_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStoryGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_story_groups_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="需求分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父需求分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页需求分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStoryGroupsV3Response]:
        """获取需求分类列表

        获取需求分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 需求分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父需求分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页需求分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_story_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStoryGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_story_groups_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="需求分类 ID集合，逗号分隔")] = None,
        parent_commongroup_id: Annotated[Optional[StrictStr], Field(description="父需求分类 ID")] = None,
        page_size: Annotated[Optional[StrictStr], Field(description="每页需求分类数量，默认为 50")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取需求分类列表

        获取需求分类列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 需求分类 ID集合，逗号分隔
        :type commongroup_ids: str
        :param parent_commongroup_id: 父需求分类 ID
        :type parent_commongroup_id: str
        :param page_size: 每页需求分类数量，默认为 50
        :type page_size: str
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_story_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            parent_commongroup_id=parent_commongroup_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStoryGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_story_groups_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        commongroup_ids,
        parent_commongroup_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if commongroup_ids is not None:
            
            _query_params.append(('commongroupIds', commongroup_ids))
            
        if parent_commongroup_id is not None:
            
            _query_params.append(('parentCommongroupId', parent_commongroup_id))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/story/commongroup"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/story/commongroup',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_test_plan_groups(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListTestPlanGroupsResponse:
        """获取测试计划分组列表

        获取测试计划分组列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plan_groups_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_test_plan_groups_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListTestPlanGroupsResponse]:
        """获取测试计划分组列表

        获取测试计划分组列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plan_groups_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_test_plan_groups_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testplan_id: Annotated[StrictStr, Field(description="测试计划 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取测试计划分组列表

        获取测试计划分组列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testplan_id: 测试计划 ID (required)
        :type testplan_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plan_groups_serialize(
            project_id=project_id,
            testplan_id=testplan_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_test_plan_groups_serialize(
        self,
        project_id,
        testplan_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if testplan_id is not None:
            _path_params['testplanId'] = testplan_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testplan/{testplanId}/commongroup"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'testplanId' + '}', str(testplan_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/testplan/{testplanId}/commongroup',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_test_plans(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量, 默认 50 条")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListTestPlansResponse:
        """获取测试计划

        获取测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 返回数量, 默认 50 条
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_test_plans_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量, 默认 50 条")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListTestPlansResponse]:
        """获取测试计划

        获取测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 返回数量, 默认 50 条
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_test_plans_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="返回数量, 默认 50 条")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="pageToken")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取测试计划

        获取测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param page_size: 返回数量, 默认 50 条
        :type page_size: int
        :param page_token: pageToken
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_test_plans_serialize(
        self,
        project_id,
        x_tenant_id,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testplan"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/testplan',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def list_user_projects_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔")] = None,
        project_role_levels: Annotated[Optional[StrictStr], Field(description="过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者")] = None,
        sort_by: Annotated[Optional[StrictStr], Field(description="排序，可选 `updated:desc` 或者 `pinyin:asc`")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListUserProjectsV3Response:
        """获取用户参与项目

        获取用户参与项目

        :param x_operator_id: 查询人 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param project_ids: 项目ID集合，逗号分隔
        :type project_ids: str
        :param project_role_levels: 过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者
        :type project_role_levels: str
        :param sort_by: 排序，可选 `updated:desc` 或者 `pinyin:asc`
        :type sort_by: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_user_projects_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            project_ids=project_ids,
            project_role_levels=project_role_levels,
            sort_by=sort_by,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListUserProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def list_user_projects_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔")] = None,
        project_role_levels: Annotated[Optional[StrictStr], Field(description="过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者")] = None,
        sort_by: Annotated[Optional[StrictStr], Field(description="排序，可选 `updated:desc` 或者 `pinyin:asc`")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListUserProjectsV3Response]:
        """获取用户参与项目

        获取用户参与项目

        :param x_operator_id: 查询人 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param project_ids: 项目ID集合，逗号分隔
        :type project_ids: str
        :param project_role_levels: 过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者
        :type project_role_levels: str
        :param sort_by: 排序，可选 `updated:desc` 或者 `pinyin:asc`
        :type sort_by: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_user_projects_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            project_ids=project_ids,
            project_role_levels=project_role_levels,
            sort_by=sort_by,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListUserProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def list_user_projects_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔")] = None,
        project_role_levels: Annotated[Optional[StrictStr], Field(description="过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者")] = None,
        sort_by: Annotated[Optional[StrictStr], Field(description="排序，可选 `updated:desc` 或者 `pinyin:asc`")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """获取用户参与项目

        获取用户参与项目

        :param x_operator_id: 查询人 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param project_ids: 项目ID集合，逗号分隔
        :type project_ids: str
        :param project_role_levels: 过滤指定的项目角色等级，逗号分割，可以填写 0,1,2 分别表示成员, 管理员, 拥有者
        :type project_role_levels: str
        :param sort_by: 排序，可选 `updated:desc` 或者 `pinyin:asc`
        :type sort_by: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._list_user_projects_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            project_ids=project_ids,
            project_role_levels=project_role_levels,
            sort_by=sort_by,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListUserProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _list_user_projects_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        project_ids,
        project_role_levels,
        sort_by,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if project_ids is not None:
            
            _query_params.append(('projectIds', project_ids))
            
        if project_role_levels is not None:
            
            _query_params.append(('projectRoleLevels', project_role_levels))
            
        if sort_by is not None:
            
            _query_params.append(('sortBy', sort_by))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/user-joined"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/user-joined',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def move_task_flow_status_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        move_task_flow_status_v3_request: Optional[MoveTaskFlowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskFlowStatusTypeV3Response:
        """更新项目工作流状态位置

        更新项目工作流状态位置

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param move_task_flow_status_v3_request: 
        :type move_task_flow_status_v3_request: MoveTaskFlowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._move_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            move_task_flow_status_v3_request=move_task_flow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def move_task_flow_status_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        move_task_flow_status_v3_request: Optional[MoveTaskFlowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskFlowStatusTypeV3Response]:
        """更新项目工作流状态位置

        更新项目工作流状态位置

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param move_task_flow_status_v3_request: 
        :type move_task_flow_status_v3_request: MoveTaskFlowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._move_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            move_task_flow_status_v3_request=move_task_flow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def move_task_flow_status_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        move_task_flow_status_v3_request: Optional[MoveTaskFlowStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态位置

        更新项目工作流状态位置

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param move_task_flow_status_v3_request: 
        :type move_task_flow_status_v3_request: MoveTaskFlowStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._move_task_flow_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            move_task_flow_status_v3_request=move_task_flow_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _move_task_flow_status_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        move_task_flow_status_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if move_task_flow_status_v3_request is not None:
            _body_params = move_task_flow_status_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/move"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/move',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def query_group_projects(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_suspended: Annotated[Optional[StrictBool], Field(description="是否包含归档项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> QueryGroupProjectsResponse:
        """根据项目分组 ID 查询项目

        根据项目分组 ID 查询项目

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_suspended: 是否包含归档项目，默认 false
        :type include_suspended: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_group_projects_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            include_suspended=include_suspended,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryGroupProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def query_group_projects_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_suspended: Annotated[Optional[StrictBool], Field(description="是否包含归档项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[QueryGroupProjectsResponse]:
        """根据项目分组 ID 查询项目

        根据项目分组 ID 查询项目

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_suspended: 是否包含归档项目，默认 false
        :type include_suspended: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_group_projects_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            include_suspended=include_suspended,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryGroupProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def query_group_projects_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小，默认 1000")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_suspended: Annotated[Optional[StrictBool], Field(description="是否包含归档项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """根据项目分组 ID 查询项目

        根据项目分组 ID 查询项目

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param page_size: 分页大小，默认 1000
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_suspended: 是否包含归档项目，默认 false
        :type include_suspended: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_group_projects_serialize(
            project_tag_id=project_tag_id,
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            page_size=page_size,
            page_token=page_token,
            include_suspended=include_suspended,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryGroupProjectsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _query_group_projects_serialize(
        self,
        project_tag_id,
        x_tenant_id,
        organization_id,
        page_size,
        page_token,
        include_suspended,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if include_suspended is not None:
            
            _query_params.append(('includeSuspended', include_suspended))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}/project/query"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-tag/{projectTagId}/project/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def query_project_groups_v3(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        ids: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        parent_project_tag_id: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        q: Annotated[Optional[StrictStr], Field(description="项目分组模糊查询关键词")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> QueryProjectGroupsV3Response:
        """查询项目分组

        查询项目分组

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param ids: 项目分组ID列表，用逗号分隔。
        :type ids: str
        :param parent_project_tag_id: 项目分组ID列表，用逗号分隔。
        :type parent_project_tag_id: str
        :param q: 项目分组模糊查询关键词
        :type q: str
        :param page_size: 分页
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_project_groups_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            ids=ids,
            parent_project_tag_id=parent_project_tag_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def query_project_groups_v3_with_http_info(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        ids: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        parent_project_tag_id: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        q: Annotated[Optional[StrictStr], Field(description="项目分组模糊查询关键词")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[QueryProjectGroupsV3Response]:
        """查询项目分组

        查询项目分组

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param ids: 项目分组ID列表，用逗号分隔。
        :type ids: str
        :param parent_project_tag_id: 项目分组ID列表，用逗号分隔。
        :type parent_project_tag_id: str
        :param q: 项目分组模糊查询关键词
        :type q: str
        :param page_size: 分页
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_project_groups_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            ids=ids,
            parent_project_tag_id=parent_project_tag_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def query_project_groups_v3_without_preload_content(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        organization_id: Annotated[Optional[StrictStr], Field(description="企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致")] = None,
        ids: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        parent_project_tag_id: Annotated[Optional[StrictStr], Field(description="项目分组ID列表，用逗号分隔。")] = None,
        q: Annotated[Optional[StrictStr], Field(description="项目分组模糊查询关键词")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目分组

        查询项目分组

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param organization_id: 企业ID, 如果提供`x-tenant-id`, query中不是必须的, 如果提供必须和`x-tenant-id`一致
        :type organization_id: str
        :param ids: 项目分组ID列表，用逗号分隔。
        :type ids: str
        :param parent_project_tag_id: 项目分组ID列表，用逗号分隔。
        :type parent_project_tag_id: str
        :param q: 项目分组模糊查询关键词
        :type q: str
        :param page_size: 分页
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_project_groups_v3_serialize(
            x_tenant_id=x_tenant_id,
            organization_id=organization_id,
            ids=ids,
            parent_project_tag_id=parent_project_tag_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _query_project_groups_v3_serialize(
        self,
        x_tenant_id,
        organization_id,
        ids,
        parent_project_tag_id,
        q,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if organization_id is not None:
            
            _query_params.append(('organizationId', organization_id))
            
        if ids is not None:
            
            _query_params.append(('ids', ids))
            
        if parent_project_tag_id is not None:
            
            _query_params.append(('parentProjectTagId', parent_project_tag_id))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/query"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-tag/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def query_projects_v3(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3")] = None,
        name: Annotated[Optional[StrictStr], Field(description="项目名字(模糊匹配)")] = None,
        unique_id_prefix: Annotated[Optional[StrictStr], Field(description="任务编号前缀(也叫做项目编号)")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        source_id: Annotated[Optional[StrictStr], Field(description="原始项目ID")] = None,
        visible: Annotated[Optional[StrictStr], Field(description="项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 ")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> QueryProjectsV3Response:
        """查询项目

        查询项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param project_ids: 项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3
        :type project_ids: str
        :param name: 项目名字(模糊匹配)
        :type name: str
        :param unique_id_prefix: 任务编号前缀(也叫做项目编号)
        :type unique_id_prefix: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param source_id: 原始项目ID
        :type source_id: str
        :param visible: 项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 
        :type visible: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_projects_v3_serialize(
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            project_ids=project_ids,
            name=name,
            unique_id_prefix=unique_id_prefix,
            page_size=page_size,
            page_token=page_token,
            source_id=source_id,
            visible=visible,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def query_projects_v3_with_http_info(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3")] = None,
        name: Annotated[Optional[StrictStr], Field(description="项目名字(模糊匹配)")] = None,
        unique_id_prefix: Annotated[Optional[StrictStr], Field(description="任务编号前缀(也叫做项目编号)")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        source_id: Annotated[Optional[StrictStr], Field(description="原始项目ID")] = None,
        visible: Annotated[Optional[StrictStr], Field(description="项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 ")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[QueryProjectsV3Response]:
        """查询项目

        查询项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param project_ids: 项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3
        :type project_ids: str
        :param name: 项目名字(模糊匹配)
        :type name: str
        :param unique_id_prefix: 任务编号前缀(也叫做项目编号)
        :type unique_id_prefix: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param source_id: 原始项目ID
        :type source_id: str
        :param visible: 项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 
        :type visible: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_projects_v3_serialize(
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            project_ids=project_ids,
            name=name,
            unique_id_prefix=unique_id_prefix,
            page_size=page_size,
            page_token=page_token,
            source_id=source_id,
            visible=visible,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def query_projects_v3_without_preload_content(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3")] = None,
        name: Annotated[Optional[StrictStr], Field(description="项目名字(模糊匹配)")] = None,
        unique_id_prefix: Annotated[Optional[StrictStr], Field(description="任务编号前缀(也叫做项目编号)")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        source_id: Annotated[Optional[StrictStr], Field(description="原始项目ID")] = None,
        visible: Annotated[Optional[StrictStr], Field(description="项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 ")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目

        查询项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param project_ids: 项目ID集合，逗号分隔，例如: projectId1,projectId2,projectId3
        :type project_ids: str
        :param name: 项目名字(模糊匹配)
        :type name: str
        :param unique_id_prefix: 任务编号前缀(也叫做项目编号)
        :type unique_id_prefix: str
        :param page_size: 分页大小
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param source_id: 原始项目ID
        :type source_id: str
        :param visible: 项目可见性 - 'project': 私有项目 - 'organization': 企业公开项目 
        :type visible: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_projects_v3_serialize(
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            project_ids=project_ids,
            name=name,
            unique_id_prefix=unique_id_prefix,
            page_size=page_size,
            page_token=page_token,
            source_id=source_id,
            visible=visible,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryProjectsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _query_projects_v3_serialize(
        self,
        x_tenant_id,
        x_operator_id,
        project_ids,
        name,
        unique_id_prefix,
        page_size,
        page_token,
        source_id,
        visible,
        include_template,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if project_ids is not None:
            
            _query_params.append(('projectIds', project_ids))
            
        if name is not None:
            
            _query_params.append(('name', name))
            
        if unique_id_prefix is not None:
            
            _query_params.append(('uniqueIdPrefix', unique_id_prefix))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if source_id is not None:
            
            _query_params.append(('sourceId', source_id))
            
        if visible is not None:
            
            _query_params.append(('visible', visible))
            
        if include_template is not None:
            
            _query_params.append(('includeTemplate', include_template))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        if x_operator_id is not None:
            _header_params['X-Operator-Id'] = x_operator_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/query"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def query_test_plan_groups(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="分组 ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> QueryTestPlanGroupsResponse:
        """查询测试计划分组

        查询测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 分组 ID 集合,使用逗号分隔
        :type commongroup_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plan_groups_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def query_test_plan_groups_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="分组 ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[QueryTestPlanGroupsResponse]:
        """查询测试计划分组

        查询测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 分组 ID 集合,使用逗号分隔
        :type commongroup_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plan_groups_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def query_test_plan_groups_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        commongroup_ids: Annotated[Optional[StrictStr], Field(description="分组 ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询测试计划分组

        查询测试计划分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param commongroup_ids: 分组 ID 集合,使用逗号分隔
        :type commongroup_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plan_groups_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            commongroup_ids=commongroup_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlanGroupsResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _query_test_plan_groups_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        commongroup_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if commongroup_ids is not None:
            
            _query_params.append(('commongroupIds', commongroup_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/commongroup/query"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/commongroup/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def query_test_plans(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testplan_ids: Annotated[Optional[StrictStr], Field(description="测试计划ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> QueryTestPlansResponse:
        """查询测试计划

        查询测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testplan_ids: 测试计划ID 集合,使用逗号分隔
        :type testplan_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            testplan_ids=testplan_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def query_test_plans_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testplan_ids: Annotated[Optional[StrictStr], Field(description="测试计划ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[QueryTestPlansResponse]:
        """查询测试计划

        查询测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testplan_ids: 测试计划ID 集合,使用逗号分隔
        :type testplan_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            testplan_ids=testplan_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def query_test_plans_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        testplan_ids: Annotated[Optional[StrictStr], Field(description="测试计划ID 集合,使用逗号分隔")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询测试计划

        查询测试计划

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param testplan_ids: 测试计划ID 集合,使用逗号分隔
        :type testplan_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._query_test_plans_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            testplan_ids=testplan_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "QueryTestPlansResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _query_test_plans_serialize(
        self,
        project_id,
        x_tenant_id,
        testplan_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if testplan_ids is not None:
            
            _query_params.append(('testplanIds', testplan_ids))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testplan/query"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/testplan/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def remove_project_group_member_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RemoveProjectGroupMemberV3Response:
        """删除项目分组成员

        删除项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RemoveProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def remove_project_group_member_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RemoveProjectGroupMemberV3Response]:
        """删除项目分组成员

        删除项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RemoveProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def remove_project_group_member_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        add_project_group_member_v3_request: Optional[AddProjectGroupMemberV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目分组成员

        删除项目分组成员

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param add_project_group_member_v3_request: 
        :type add_project_group_member_v3_request: AddProjectGroupMemberV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_project_group_member_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            add_project_group_member_v3_request=add_project_group_member_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RemoveProjectGroupMemberV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _remove_project_group_member_v3_serialize(
        self,
        project_tag_id,
        x_operator_id,
        x_tenant_id,
        add_project_group_member_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if add_project_group_member_v3_request is not None:
            _body_params = add_project_group_member_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}/member/delete"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-tag/{projectTagId}/member/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def remove_status_custom_field_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        remove_status_custom_field_v3_request: Optional[RemoveStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteOrgMemberResponse:
        """删除项目概览自定义字段

        删除项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param remove_status_custom_field_v3_request: 
        :type remove_status_custom_field_v3_request: RemoveStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            remove_status_custom_field_v3_request=remove_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def remove_status_custom_field_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        remove_status_custom_field_v3_request: Optional[RemoveStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteOrgMemberResponse]:
        """删除项目概览自定义字段

        删除项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param remove_status_custom_field_v3_request: 
        :type remove_status_custom_field_v3_request: RemoveStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            remove_status_custom_field_v3_request=remove_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def remove_status_custom_field_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        remove_status_custom_field_v3_request: Optional[RemoveStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目概览自定义字段

        删除项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param remove_status_custom_field_v3_request: 
        :type remove_status_custom_field_v3_request: RemoveStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._remove_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            remove_status_custom_field_v3_request=remove_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _remove_status_custom_field_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        remove_status_custom_field_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if remove_status_custom_field_v3_request is not None:
            _body_params = remove_status_custom_field_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/customfield/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/status/customfield/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def restart_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RestartSprintV3Response:
        """重新开始迭代

        重新开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restart_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def restart_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RestartSprintV3Response]:
        """重新开始迭代

        重新开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restart_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def restart_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """重新开始迭代

        重新开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restart_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _restart_sprint_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/restart"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/restart',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def restore_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RestoreProjectV3Response:
        """恢复归档项目

        恢复归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restore_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestoreProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def restore_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[RestoreProjectV3Response]:
        """恢复归档项目

        恢复归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restore_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestoreProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def restore_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """恢复归档项目

        恢复归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._restore_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "RestoreProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _restore_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/suspend-restore"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/suspend-restore',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_org_task_flow_statuses_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页工作流长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchOrgTaskFlowStatusesV3Response:
        """搜索企业工作流状态

        搜索企业工作流状态

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页工作流长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_org_task_flow_statuses_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            tf_ids=tf_ids,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchOrgTaskFlowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_org_task_flow_statuses_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页工作流长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchOrgTaskFlowStatusesV3Response]:
        """搜索企业工作流状态

        搜索企业工作流状态

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页工作流长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_org_task_flow_statuses_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            tf_ids=tf_ids,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchOrgTaskFlowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_org_task_flow_statuses_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页工作流长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索企业工作流状态

        搜索企业工作流状态

        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页工作流长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_org_task_flow_statuses_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            tf_ids=tf_ids,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchOrgTaskFlowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_org_task_flow_statuses_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        tf_ids,
        q,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if tf_ids is not None:
            
            _query_params.append(('tfIds', tf_ids))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/tfs/search"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/tfs/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_project_custom_fileds_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） ")] = None,
        q: Annotated[Optional[StrictStr], Field(description="过滤字段名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sfc_id: Annotated[Optional[StrictStr], Field(description="任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd ")] = None,
        cf_ids: Annotated[Optional[StrictStr], Field(description="自定义字段ID集合，逗号组合")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId集合，用逗号组合")] = None,
        original_ids: Annotated[Optional[StrictStr], Field(description="字段OriginalIds集合，用逗号组合")] = None,
        subtype: Annotated[Optional[StrictStr], Field(description="任务类型 story | bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchProjectCustomFiledsV3Response:
        """搜索项目自定义字段

        搜索项目自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param scope: 根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） 
        :type scope: str
        :param q: 过滤字段名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sfc_id: 任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd 
        :type sfc_id: str
        :param cf_ids: 自定义字段ID集合，逗号组合
        :type cf_ids: str
        :param instance_ids: 字段InstanceId集合，用逗号组合
        :type instance_ids: str
        :param original_ids: 字段OriginalIds集合，用逗号组合
        :type original_ids: str
        :param subtype: 任务类型 story | bug
        :type subtype: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_custom_fileds_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            scope=scope,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sfc_id=sfc_id,
            cf_ids=cf_ids,
            instance_ids=instance_ids,
            original_ids=original_ids,
            subtype=subtype,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectCustomFiledsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_project_custom_fileds_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） ")] = None,
        q: Annotated[Optional[StrictStr], Field(description="过滤字段名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sfc_id: Annotated[Optional[StrictStr], Field(description="任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd ")] = None,
        cf_ids: Annotated[Optional[StrictStr], Field(description="自定义字段ID集合，逗号组合")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId集合，用逗号组合")] = None,
        original_ids: Annotated[Optional[StrictStr], Field(description="字段OriginalIds集合，用逗号组合")] = None,
        subtype: Annotated[Optional[StrictStr], Field(description="任务类型 story | bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchProjectCustomFiledsV3Response]:
        """搜索项目自定义字段

        搜索项目自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param scope: 根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） 
        :type scope: str
        :param q: 过滤字段名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sfc_id: 任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd 
        :type sfc_id: str
        :param cf_ids: 自定义字段ID集合，逗号组合
        :type cf_ids: str
        :param instance_ids: 字段InstanceId集合，用逗号组合
        :type instance_ids: str
        :param original_ids: 字段OriginalIds集合，用逗号组合
        :type original_ids: str
        :param subtype: 任务类型 story | bug
        :type subtype: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_custom_fileds_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            scope=scope,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sfc_id=sfc_id,
            cf_ids=cf_ids,
            instance_ids=instance_ids,
            original_ids=original_ids,
            subtype=subtype,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectCustomFiledsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_project_custom_fileds_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        scope: Annotated[Optional[StrictStr], Field(description="根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） ")] = None,
        q: Annotated[Optional[StrictStr], Field(description="过滤字段名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sfc_id: Annotated[Optional[StrictStr], Field(description="任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd ")] = None,
        cf_ids: Annotated[Optional[StrictStr], Field(description="自定义字段ID集合，逗号组合")] = None,
        instance_ids: Annotated[Optional[StrictStr], Field(description="字段InstanceId集合，用逗号组合")] = None,
        original_ids: Annotated[Optional[StrictStr], Field(description="字段OriginalIds集合，用逗号组合")] = None,
        subtype: Annotated[Optional[StrictStr], Field(description="任务类型 story | bug")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索项目自定义字段

        搜索项目自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param scope: 根据不同应用场景获取字段, 应用场景可选值： - taskTableHeader  获取任务列表视图表头可用字段 - searcherAdd  获取筛选器可用字段 - taskExportHeader  获取任务导出可用字段 - sfcAdd  获取任务类型可添加字段 - kanbanCardAdd  获取看板卡片可用字段 - all  获取所有字段（默认） 
        :type scope: str
        :param q: 过滤字段名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sfc_id: 任务类型ID，获取该sfcId中的字段，需配合scope使用: taskTableHeader, searcherAdd, kanbanCardAdd 
        :type sfc_id: str
        :param cf_ids: 自定义字段ID集合，逗号组合
        :type cf_ids: str
        :param instance_ids: 字段InstanceId集合，用逗号组合
        :type instance_ids: str
        :param original_ids: 字段OriginalIds集合，用逗号组合
        :type original_ids: str
        :param subtype: 任务类型 story | bug
        :type subtype: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_custom_fileds_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            scope=scope,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sfc_id=sfc_id,
            cf_ids=cf_ids,
            instance_ids=instance_ids,
            original_ids=original_ids,
            subtype=subtype,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectCustomFiledsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_project_custom_fileds_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        scope,
        q,
        page_size,
        page_token,
        sfc_id,
        cf_ids,
        instance_ids,
        original_ids,
        subtype,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if scope is not None:
            
            _query_params.append(('scope', scope))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if sfc_id is not None:
            
            _query_params.append(('sfcId', sfc_id))
            
        if cf_ids is not None:
            
            _query_params.append(('cfIds', cf_ids))
            
        if instance_ids is not None:
            
            _query_params.append(('instanceIds', instance_ids))
            
        if original_ids is not None:
            
            _query_params.append(('originalIds', original_ids))
            
        if subtype is not None:
            
            _query_params.append(('subtype', subtype))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/customfield/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/customfield/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_project_tags_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询标签名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tag_ids: Annotated[Optional[StrictStr], Field(description="标签ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchProjectTagsV3Response:
        """搜索项目标签

        搜索项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询标签名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tag_ids: 标签ID集合，逗号组合
        :type tag_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tags_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tag_ids=tag_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_project_tags_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询标签名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tag_ids: Annotated[Optional[StrictStr], Field(description="标签ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchProjectTagsV3Response]:
        """搜索项目标签

        搜索项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询标签名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tag_ids: 标签ID集合，逗号组合
        :type tag_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tags_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tag_ids=tag_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_project_tags_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询标签名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tag_ids: Annotated[Optional[StrictStr], Field(description="标签ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索项目标签

        搜索项目标签

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询标签名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tag_ids: 标签ID集合，逗号组合
        :type tag_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tags_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tag_ids=tag_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_project_tags_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        q,
        page_size,
        page_token,
        tag_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if tag_ids is not None:
            
            _query_params.append(('tagIds', tag_ids))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/tag/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/tag/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_project_tasks_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量，默认为10")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchProjectTasksV3Response:
        """查询项目任务

        查询项目任务。TQL使用方法可参考：[项目下任务搜索 TQL 说明](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量，默认为10
        :type page_size: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            page_token=page_token,
            page_size=page_size,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_project_tasks_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量，默认为10")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchProjectTasksV3Response]:
        """查询项目任务

        查询项目任务。TQL使用方法可参考：[项目下任务搜索 TQL 说明](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量，默认为10
        :type page_size: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            page_token=page_token,
            page_size=page_size,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_project_tasks_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="查询人ID, 有些查询语句依赖查询人")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)")] = None,
        include_archived: Annotated[Optional[StrictBool], Field(description="是否包含已归档任务, 默认 false")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页任务数量，默认为10")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """查询项目任务

        查询项目任务。TQL使用方法可参考：[项目下任务搜索 TQL 说明](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 查询人ID, 有些查询语句依赖查询人
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 查询语句 参考[TQL查询文档](https://open.teambition.com/docs/documents/639982966b99d5002b510f0b)
        :type q: str
        :param include_archived: 是否包含已归档任务, 默认 false
        :type include_archived: bool
        :param page_token: 分页标
        :type page_token: str
        :param page_size: 每页任务数量，默认为10
        :type page_size: int
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_tasks_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            include_archived=include_archived,
            page_token=page_token,
            page_size=page_size,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTasksV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_project_tasks_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        q,
        include_archived,
        page_token,
        page_size,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if include_archived is not None:
            
            _query_params.append(('includeArchived', include_archived))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/task/query"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/task/query',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_project_templates_v3(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID，如果传递操作人，以操作人视角权限查询模板")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        pt_ids: Annotated[Optional[StrictStr], Field(description="模板ID集合，逗号组合")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId")] = None,
        include_draft: Annotated[Optional[StrictBool], Field(description="是否包含草稿态模板")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchProjectTemplatesV3Response:
        """搜索企业项目模板

        搜索企业项目模板

        :param x_operator_id: 操作人ID，如果传递操作人，以操作人视角权限查询模板
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param pt_ids: 模板ID集合，逗号组合
        :type pt_ids: str
        :param project_ids: 模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId
        :type project_ids: str
        :param include_draft: 是否包含草稿态模板
        :type include_draft: bool
        :param q: 模糊查询名字
        :type q: str
        :param page_size: 分页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_templates_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            pt_ids=pt_ids,
            project_ids=project_ids,
            include_draft=include_draft,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTemplatesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_project_templates_v3_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID，如果传递操作人，以操作人视角权限查询模板")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        pt_ids: Annotated[Optional[StrictStr], Field(description="模板ID集合，逗号组合")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId")] = None,
        include_draft: Annotated[Optional[StrictBool], Field(description="是否包含草稿态模板")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchProjectTemplatesV3Response]:
        """搜索企业项目模板

        搜索企业项目模板

        :param x_operator_id: 操作人ID，如果传递操作人，以操作人视角权限查询模板
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param pt_ids: 模板ID集合，逗号组合
        :type pt_ids: str
        :param project_ids: 模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId
        :type project_ids: str
        :param include_draft: 是否包含草稿态模板
        :type include_draft: bool
        :param q: 模糊查询名字
        :type q: str
        :param page_size: 分页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_templates_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            pt_ids=pt_ids,
            project_ids=project_ids,
            include_draft=include_draft,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTemplatesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_project_templates_v3_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID，如果传递操作人，以操作人视角权限查询模板")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        pt_ids: Annotated[Optional[StrictStr], Field(description="模板ID集合，逗号组合")] = None,
        project_ids: Annotated[Optional[StrictStr], Field(description="模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId")] = None,
        include_draft: Annotated[Optional[StrictBool], Field(description="是否包含草稿态模板")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索企业项目模板

        搜索企业项目模板

        :param x_operator_id: 操作人ID，如果传递操作人，以操作人视角权限查询模板
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param pt_ids: 模板ID集合，逗号组合
        :type pt_ids: str
        :param project_ids: 模板对应的项目ID集合，逗号组合，对应项目模型上的 sourceId
        :type project_ids: str
        :param include_draft: 是否包含草稿态模板
        :type include_draft: bool
        :param q: 模糊查询名字
        :type q: str
        :param page_size: 分页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_project_templates_v3_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            pt_ids=pt_ids,
            project_ids=project_ids,
            include_draft=include_draft,
            q=q,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectTemplatesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_project_templates_v3_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        pt_ids,
        project_ids,
        include_draft,
        q,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if pt_ids is not None:
            
            _query_params.append(('ptIds', pt_ids))
            
        if project_ids is not None:
            
            _query_params.append(('projectIds', project_ids))
            
        if include_draft is not None:
            
            _query_params.append(('includeDraft', include_draft))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-template/search"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project-template/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_projects_tql(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tql: Annotated[Optional[StrictStr], Field(description="项目搜索TQL语句")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小, 默认 10")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchProjectsTQLResponse:
        """通过TQL搜索项目

        通过TQL搜索项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tql: 项目搜索TQL语句
        :type tql: str
        :param page_size: 分页大小, 默认 10
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_projects_tql_serialize(
            x_tenant_id=x_tenant_id,
            tql=tql,
            page_size=page_size,
            page_token=page_token,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectsTQLResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_projects_tql_with_http_info(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tql: Annotated[Optional[StrictStr], Field(description="项目搜索TQL语句")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小, 默认 10")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchProjectsTQLResponse]:
        """通过TQL搜索项目

        通过TQL搜索项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tql: 项目搜索TQL语句
        :type tql: str
        :param page_size: 分页大小, 默认 10
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_projects_tql_serialize(
            x_tenant_id=x_tenant_id,
            tql=tql,
            page_size=page_size,
            page_token=page_token,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectsTQLResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_projects_tql_without_preload_content(
        self,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tql: Annotated[Optional[StrictStr], Field(description="项目搜索TQL语句")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="分页大小, 默认 10")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        include_template: Annotated[Optional[StrictBool], Field(description="是否包含模板项目，默认 false")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """通过TQL搜索项目

        通过TQL搜索项目

        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tql: 项目搜索TQL语句
        :type tql: str
        :param page_size: 分页大小, 默认 10
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param include_template: 是否包含模板项目，默认 false
        :type include_template: bool
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_projects_tql_serialize(
            x_tenant_id=x_tenant_id,
            tql=tql,
            page_size=page_size,
            page_token=page_token,
            include_template=include_template,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchProjectsTQLResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_projects_tql_serialize(
        self,
        x_tenant_id,
        tql,
        page_size,
        page_token,
        include_template,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        if tql is not None:
            
            _query_params.append(('tql', tql))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if include_template is not None:
            
            _query_params.append(('includeTemplate', include_template))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/project/search"

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/project/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_sprints_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="迭代名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sprint_ids: Annotated[Optional[StrictStr], Field(description="迭代 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchSprintsV3Response:
        """迭代搜索

        迭代搜索

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 迭代名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sprint_ids: 迭代 ID 集合，逗号组合
        :type sprint_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_sprints_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sprint_ids=sprint_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchSprintsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_sprints_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="迭代名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sprint_ids: Annotated[Optional[StrictStr], Field(description="迭代 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchSprintsV3Response]:
        """迭代搜索

        迭代搜索

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 迭代名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sprint_ids: 迭代 ID 集合，逗号组合
        :type sprint_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_sprints_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sprint_ids=sprint_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchSprintsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_sprints_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="迭代名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        sprint_ids: Annotated[Optional[StrictStr], Field(description="迭代 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """迭代搜索

        迭代搜索

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 迭代名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param sprint_ids: 迭代 ID 集合，逗号组合
        :type sprint_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_sprints_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            sprint_ids=sprint_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchSprintsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_sprints_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        q,
        page_size,
        page_token,
        sprint_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if sprint_ids is not None:
            
            _query_params.append(('sprintIds', sprint_ids))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/sprint/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_stages_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tasklist_id: Annotated[Optional[StrictStr], Field(description="项目分组 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="任务列表名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        stage_ids: Annotated[Optional[StrictStr], Field(description="任务列表 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchStagesV3Response:
        """搜索任务列表

        搜索任务列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tasklist_id: 项目分组 ID
        :type tasklist_id: str
        :param q: 任务列表名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param stage_ids: 任务列表 ID 集合，逗号组合
        :type stage_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_stages_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            tasklist_id=tasklist_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            stage_ids=stage_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchStagesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_stages_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tasklist_id: Annotated[Optional[StrictStr], Field(description="项目分组 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="任务列表名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        stage_ids: Annotated[Optional[StrictStr], Field(description="任务列表 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchStagesV3Response]:
        """搜索任务列表

        搜索任务列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tasklist_id: 项目分组 ID
        :type tasklist_id: str
        :param q: 任务列表名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param stage_ids: 任务列表 ID 集合，逗号组合
        :type stage_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_stages_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            tasklist_id=tasklist_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            stage_ids=stage_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchStagesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_stages_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        tasklist_id: Annotated[Optional[StrictStr], Field(description="项目分组 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="任务列表名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        stage_ids: Annotated[Optional[StrictStr], Field(description="任务列表 ID 集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索任务列表

        搜索任务列表

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param tasklist_id: 项目分组 ID
        :type tasklist_id: str
        :param q: 任务列表名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param stage_ids: 任务列表 ID 集合，逗号组合
        :type stage_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_stages_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            tasklist_id=tasklist_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            stage_ids=stage_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchStagesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_stages_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        tasklist_id,
        q,
        page_size,
        page_token,
        stage_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if tasklist_id is not None:
            
            _query_params.append(('tasklistId', tasklist_id))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if stage_ids is not None:
            
            _query_params.append(('stageIds', stage_ids))
            
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/stage/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/stage/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_task_groups_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊任务分组名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tasklist_ids: Annotated[Optional[StrictStr], Field(description="任务分组ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchTaskGroupsV3Response:
        """搜索任务分组

        搜索任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊任务分组名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tasklist_ids: 任务分组ID集合，逗号组合
        :type tasklist_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_task_groups_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tasklist_ids=tasklist_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_task_groups_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊任务分组名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tasklist_ids: Annotated[Optional[StrictStr], Field(description="任务分组ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchTaskGroupsV3Response]:
        """搜索任务分组

        搜索任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊任务分组名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tasklist_ids: 任务分组ID集合，逗号组合
        :type tasklist_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_task_groups_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tasklist_ids=tasklist_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_task_groups_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊任务分组名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tasklist_ids: Annotated[Optional[StrictStr], Field(description="任务分组ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索任务分组

        搜索任务分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊任务分组名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tasklist_ids: 任务分组ID集合，逗号组合
        :type tasklist_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_task_groups_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tasklist_ids=tasklist_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_task_groups_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        q,
        page_size,
        page_token,
        tasklist_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if tasklist_ids is not None:
            
            _query_params.append(('tasklistIds', tasklist_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/tasklist/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/tasklist/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_taskflow_nodes(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        taskflow_id: Annotated[Optional[StrictStr], Field(description="工作流ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊搜索字符串")] = None,
        node_ids: Annotated[Optional[StrictStr], Field(description="节点ID列表，逗号分隔")] = None,
        page_size: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchTaskflowNodesResponse:
        """搜索项目工作流节点

        搜索项目工作流节点

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param taskflow_id: 工作流ID
        :type taskflow_id: str
        :param q: 模糊搜索字符串
        :type q: str
        :param node_ids: 节点ID列表，逗号分隔
        :type node_ids: str
        :param page_size: 每页长度
        :type page_size: float
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_nodes_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            taskflow_id=taskflow_id,
            q=q,
            node_ids=node_ids,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowNodesResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_taskflow_nodes_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        taskflow_id: Annotated[Optional[StrictStr], Field(description="工作流ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊搜索字符串")] = None,
        node_ids: Annotated[Optional[StrictStr], Field(description="节点ID列表，逗号分隔")] = None,
        page_size: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchTaskflowNodesResponse]:
        """搜索项目工作流节点

        搜索项目工作流节点

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param taskflow_id: 工作流ID
        :type taskflow_id: str
        :param q: 模糊搜索字符串
        :type q: str
        :param node_ids: 节点ID列表，逗号分隔
        :type node_ids: str
        :param page_size: 每页长度
        :type page_size: float
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_nodes_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            taskflow_id=taskflow_id,
            q=q,
            node_ids=node_ids,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowNodesResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_taskflow_nodes_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        taskflow_id: Annotated[Optional[StrictStr], Field(description="工作流ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊搜索字符串")] = None,
        node_ids: Annotated[Optional[StrictStr], Field(description="节点ID列表，逗号分隔")] = None,
        page_size: Annotated[Optional[Union[StrictFloat, StrictInt]], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索项目工作流节点

        搜索项目工作流节点

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param taskflow_id: 工作流ID
        :type taskflow_id: str
        :param q: 模糊搜索字符串
        :type q: str
        :param node_ids: 节点ID列表，逗号分隔
        :type node_ids: str
        :param page_size: 每页长度
        :type page_size: float
        :param page_token: 分页标
        :type page_token: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_nodes_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            taskflow_id=taskflow_id,
            q=q,
            node_ids=node_ids,
            page_size=page_size,
            page_token=page_token,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowNodesResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_taskflow_nodes_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        taskflow_id,
        q,
        node_ids,
        page_size,
        page_token,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if taskflow_id is not None:
            
            _query_params.append(('taskflowId', taskflow_id))
            
        if q is not None:
            
            _query_params.append(('q', q))
            
        if node_ids is not None:
            
            _query_params.append(('nodeIds', node_ids))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflow/node/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/taskflow/node/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_taskflow_statuses_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流状态名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        tfs_ids: Annotated[Optional[StrictStr], Field(description="工作流状态ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchTaskflowStatusesV3Response:
        """搜索项目工作流状态

        搜索项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流状态名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param tfs_ids: 工作流状态ID集合，逗号组合
        :type tfs_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            tfs_ids=tfs_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_taskflow_statuses_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流状态名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        tfs_ids: Annotated[Optional[StrictStr], Field(description="工作流状态ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchTaskflowStatusesV3Response]:
        """搜索项目工作流状态

        搜索项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流状态名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param tfs_ids: 工作流状态ID集合，逗号组合
        :type tfs_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            tfs_ids=tfs_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_taskflow_statuses_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流状态名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        tfs_ids: Annotated[Optional[StrictStr], Field(description="工作流状态ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索项目工作流状态

        搜索项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流状态名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param tfs_ids: 工作流状态ID集合，逗号组合
        :type tfs_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflow_statuses_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            tfs_ids=tfs_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowStatusesV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_taskflow_statuses_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        q,
        page_size,
        page_token,
        tf_ids,
        tfs_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if tf_ids is not None:
            
            _query_params.append(('tfIds', tf_ids))
            
        if tfs_ids is not None:
            
            _query_params.append(('tfsIds', tfs_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/taskflowstatus/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def search_taskflows_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SearchTaskflowsV3Response:
        """搜索项目工作流

        搜索项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflows_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def search_taskflows_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SearchTaskflowsV3Response]:
        """搜索项目工作流

        搜索项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflows_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def search_taskflows_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        q: Annotated[Optional[StrictStr], Field(description="模糊查询工作流名字")] = None,
        page_size: Annotated[Optional[StrictInt], Field(description="每页长度")] = None,
        page_token: Annotated[Optional[StrictStr], Field(description="分页标")] = None,
        tf_ids: Annotated[Optional[StrictStr], Field(description="工作流ID集合，逗号组合")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """搜索项目工作流

        搜索项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param q: 模糊查询工作流名字
        :type q: str
        :param page_size: 每页长度
        :type page_size: int
        :param page_token: 分页标
        :type page_token: str
        :param tf_ids: 工作流ID集合，逗号组合
        :type tf_ids: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._search_taskflows_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            q=q,
            page_size=page_size,
            page_token=page_token,
            tf_ids=tf_ids,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SearchTaskflowsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _search_taskflows_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        q,
        page_size,
        page_token,
        tf_ids,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        if q is not None:
            
            _query_params.append(('q', q))
            
        if page_size is not None:
            
            _query_params.append(('pageSize', page_size))
            
        if page_token is not None:
            
            _query_params.append(('pageToken', page_token))
            
        if tf_ids is not None:
            
            _query_params.append(('tfIds', tf_ids))
            
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflow/search"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='GET',
            resource_path='/v3/project/{projectId}/taskflow/search',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def star_project(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        delete_project_v3_response_result: Optional[DeleteProjectV3ResponseResult] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> StarProjectResponse:
        """创建用户星标项目

        创建用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param delete_project_v3_response_result: 
        :type delete_project_v3_response_result: DeleteProjectV3ResponseResult
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._star_project_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            delete_project_v3_response_result=delete_project_v3_response_result,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StarProjectResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def star_project_with_http_info(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        delete_project_v3_response_result: Optional[DeleteProjectV3ResponseResult] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[StarProjectResponse]:
        """创建用户星标项目

        创建用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param delete_project_v3_response_result: 
        :type delete_project_v3_response_result: DeleteProjectV3ResponseResult
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._star_project_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            delete_project_v3_response_result=delete_project_v3_response_result,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StarProjectResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def star_project_without_preload_content(
        self,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        delete_project_v3_response_result: Optional[DeleteProjectV3ResponseResult] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """创建用户星标项目

        创建用户星标项目

        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param delete_project_v3_response_result: 
        :type delete_project_v3_response_result: DeleteProjectV3ResponseResult
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._star_project_serialize(
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            delete_project_v3_response_result=delete_project_v3_response_result,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StarProjectResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _star_project_serialize(
        self,
        x_operator_id,
        x_tenant_id,
        delete_project_v3_response_result,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if delete_project_v3_response_result is not None:
            _body_params = delete_project_v3_response_result


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-star/create"

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-star/create',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def start_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        start_sprint_v3_request: Optional[StartSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> StartSprintV3Response:
        """开始迭代

        开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param start_sprint_v3_request: 
        :type start_sprint_v3_request: StartSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._start_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            start_sprint_v3_request=start_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def start_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        start_sprint_v3_request: Optional[StartSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[StartSprintV3Response]:
        """开始迭代

        开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param start_sprint_v3_request: 
        :type start_sprint_v3_request: StartSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._start_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            start_sprint_v3_request=start_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def start_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        start_sprint_v3_request: Optional[StartSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """开始迭代

        开始迭代

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param start_sprint_v3_request: 
        :type start_sprint_v3_request: StartSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._start_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            start_sprint_v3_request=start_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "StartSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _start_sprint_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        start_sprint_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if start_sprint_v3_request is not None:
            _body_params = start_sprint_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/start"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/start',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def suspend_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> SuspendProjectV3Response:
        """归档项目

        归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._suspend_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SuspendProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def suspend_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[SuspendProjectV3Response]:
        """归档项目

        归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._suspend_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SuspendProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def suspend_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """归档项目

        归档项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._suspend_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "SuspendProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _suspend_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )


        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/suspend"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/suspend',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def uninstall_project_app_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UninstallProjectAppV3Response:
        """删除项目应用

        删除项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._uninstall_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UninstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def uninstall_project_app_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UninstallProjectAppV3Response]:
        """删除项目应用

        删除项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._uninstall_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UninstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def uninstall_project_app_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        app_id: Annotated[StrictStr, Field(description="应用ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        body: Optional[Dict[str, Any]] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """删除项目应用

        删除项目应用

        :param project_id: 项目ID (required)
        :type project_id: str
        :param app_id: 应用ID (required)
        :type app_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param body: 
        :type body: object
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._uninstall_project_app_v3_serialize(
            project_id=project_id,
            app_id=app_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            body=body,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UninstallProjectAppV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _uninstall_project_app_v3_serialize(
        self,
        project_id,
        app_id,
        x_operator_id,
        x_tenant_id,
        body,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if app_id is not None:
            _path_params['appId'] = app_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if body is not None:
            _body_params = body


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/application/{appId}/delete"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'appId' + '}', str(app_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/application/{appId}/delete',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_org_project_role_v3(
        self,
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="修改用户ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_org_project_role_v3_request: Optional[UpdateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> CreateOrgProjectRoleV3Response:
        """更新企业后台项目角色

        更新企业后台项目角色

        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 修改用户ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_org_project_role_v3_request: 
        :type update_org_project_role_v3_request: UpdateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_org_project_role_v3_request=update_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_org_project_role_v3_with_http_info(
        self,
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="修改用户ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_org_project_role_v3_request: Optional[UpdateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[CreateOrgProjectRoleV3Response]:
        """更新企业后台项目角色

        更新企业后台项目角色

        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 修改用户ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_org_project_role_v3_request: 
        :type update_org_project_role_v3_request: UpdateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_org_project_role_v3_request=update_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_org_project_role_v3_without_preload_content(
        self,
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="修改用户ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_org_project_role_v3_request: Optional[UpdateOrgProjectRoleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新企业后台项目角色

        更新企业后台项目角色

        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 修改用户ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_org_project_role_v3_request: 
        :type update_org_project_role_v3_request: UpdateOrgProjectRoleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_org_project_role_v3_serialize(
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_org_project_role_v3_request=update_org_project_role_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "CreateOrgProjectRoleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_org_project_role_v3_serialize(
        self,
        role_id,
        x_operator_id,
        x_tenant_id,
        update_org_project_role_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if role_id is not None:
            _path_params['roleId'] = role_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_org_project_role_v3_request is not None:
            _body_params = update_org_project_role_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-role/{roleId}"
        url = url.replace('{' + 'roleId' + '}', str(role_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-role/{roleId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_code(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_code_request: Optional[UpdateProjectCodeRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectCodeResponse:
        """更新项目编号

        更新项目编号

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_code_request: 
        :type update_project_code_request: UpdateProjectCodeRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_code_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_code_request=update_project_code_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCodeResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_code_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_code_request: Optional[UpdateProjectCodeRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectCodeResponse]:
        """更新项目编号

        更新项目编号

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_code_request: 
        :type update_project_code_request: UpdateProjectCodeRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_code_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_code_request=update_project_code_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCodeResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_code_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_code_request: Optional[UpdateProjectCodeRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目编号

        更新项目编号

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_code_request: 
        :type update_project_code_request: UpdateProjectCodeRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_code_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_code_request=update_project_code_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCodeResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_code_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        update_project_code_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_code_request is not None:
            _body_params = update_project_code_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/unique-id-prefix"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/unique-id-prefix',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_custom_field_position(
        self,
        project_id: StrictStr,
        customfield_link_id: StrictStr,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="租户 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        update_project_custom_field_position_request: Optional[UpdateProjectCustomFieldPositionRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectCustomFieldPositionResponse:
        """更新项目概览自定义字段位置

        更新项目概览自定义字段位置

        :param project_id: (required)
        :type project_id: str
        :param customfield_link_id:  (required)
        :type customfield_link_id: str
        :param x_tenant_id: 租户 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param update_project_custom_field_position_request:
        :type update_project_custom_field_position_request: UpdateProjectCustomFieldPositionRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_custom_field_position_serialize(
            project_id=project_id,
            customfield_link_id=customfield_link_id,
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            update_project_custom_field_position_request=update_project_custom_field_position_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCustomFieldPositionResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_custom_field_position_with_http_info(
        self,
        project_id: StrictStr,
        customfield_link_id: StrictStr,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="租户 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        update_project_custom_field_position_request: Optional[UpdateProjectCustomFieldPositionRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectCustomFieldPositionResponse]:
        """更新项目概览自定义字段位置

        更新项目概览自定义字段位置

        :param project_id: (required)
        :type project_id: str
        :param customfield_link_id:  (required)
        :type customfield_link_id: str
        :param x_tenant_id: 租户 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param update_project_custom_field_position_request:
        :type update_project_custom_field_position_request: UpdateProjectCustomFieldPositionRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_custom_field_position_serialize(
            project_id=project_id,
            customfield_link_id=customfield_link_id,
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            update_project_custom_field_position_request=update_project_custom_field_position_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCustomFieldPositionResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_custom_field_position_without_preload_content(
        self,
        project_id: StrictStr,
        customfield_link_id: StrictStr,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="租户 ID")] = None,
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        update_project_custom_field_position_request: Optional[UpdateProjectCustomFieldPositionRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目概览自定义字段位置

        更新项目概览自定义字段位置

        :param project_id: (required)
        :type project_id: str
        :param customfield_link_id:  (required)
        :type customfield_link_id: str
        :param x_tenant_id: 租户 ID
        :type x_tenant_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param update_project_custom_field_position_request:
        :type update_project_custom_field_position_request: UpdateProjectCustomFieldPositionRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_custom_field_position_serialize(
            project_id=project_id,
            customfield_link_id=customfield_link_id,
            x_tenant_id=x_tenant_id,
            x_operator_id=x_operator_id,
            update_project_custom_field_position_request=update_project_custom_field_position_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectCustomFieldPositionResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_custom_field_position_serialize(
        self,
        project_id,
        customfield_link_id,
        x_tenant_id,
        x_operator_id,
        update_project_custom_field_position_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if customfield_link_id is not None:
            _path_params['customfieldLinkId'] = customfield_link_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        if x_operator_id is not None:
            _header_params['X-Operator-Id'] = x_operator_id
        # process the form parameters
        # process the body parameter
        if update_project_custom_field_position_request is not None:
            _body_params = update_project_custom_field_position_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/customfieldLink/{customfieldLinkId}/pos"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'customfieldLinkId' + '}', str(customfield_link_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/customfieldLink/{customfieldLinkId}/pos',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_group_member_permission_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_member_permission_v3_request: Optional[UpdateProjectGroupMemberPermissionV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectGroupMemberPermissionV3Response:
        """更新项目分组成员权限

        更新项目分组成员权限

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_member_permission_v3_request: 
        :type update_project_group_member_permission_v3_request: UpdateProjectGroupMemberPermissionV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_member_permission_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_member_permission_v3_request=update_project_group_member_permission_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupMemberPermissionV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_group_member_permission_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_member_permission_v3_request: Optional[UpdateProjectGroupMemberPermissionV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectGroupMemberPermissionV3Response]:
        """更新项目分组成员权限

        更新项目分组成员权限

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_member_permission_v3_request: 
        :type update_project_group_member_permission_v3_request: UpdateProjectGroupMemberPermissionV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_member_permission_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_member_permission_v3_request=update_project_group_member_permission_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupMemberPermissionV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_group_member_permission_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_member_permission_v3_request: Optional[UpdateProjectGroupMemberPermissionV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目分组成员权限

        更新项目分组成员权限

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_member_permission_v3_request: 
        :type update_project_group_member_permission_v3_request: UpdateProjectGroupMemberPermissionV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_member_permission_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_member_permission_v3_request=update_project_group_member_permission_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupMemberPermissionV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_group_member_permission_v3_serialize(
        self,
        project_tag_id,
        x_operator_id,
        x_tenant_id,
        update_project_group_member_permission_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_group_member_permission_v3_request is not None:
            _body_params = update_project_group_member_permission_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}/member/permissions/update"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project-tag/{projectTagId}/member/permissions/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_group_v3(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_v3_request: Optional[UpdateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectGroupV3Response:
        """修改项目分组

        修改项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_v3_request: 
        :type update_project_group_v3_request: UpdateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_v3_request=update_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_group_v3_with_http_info(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_v3_request: Optional[UpdateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectGroupV3Response]:
        """修改项目分组

        修改项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_v3_request: 
        :type update_project_group_v3_request: UpdateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_v3_request=update_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_group_v3_without_preload_content(
        self,
        project_tag_id: Annotated[StrictStr, Field(description="项目分组 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_group_v3_request: Optional[UpdateProjectGroupV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """修改项目分组

        修改项目分组

        :param project_tag_id: 项目分组 ID (required)
        :type project_tag_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_group_v3_request: 
        :type update_project_group_v3_request: UpdateProjectGroupV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_group_v3_serialize(
            project_tag_id=project_tag_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_group_v3_request=update_project_group_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectGroupV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_group_v3_serialize(
        self,
        project_tag_id,
        x_operator_id,
        x_tenant_id,
        update_project_group_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_tag_id is not None:
            _path_params['projectTagId'] = project_tag_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_group_v3_request is not None:
            _body_params = update_project_group_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-tag/{projectTagId}"
        url = url.replace('{' + 'projectTagId' + '}', str(project_tag_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project-tag/{projectTagId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_table_custom_field(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_table_custom_field_request: Optional[UpdateProjectTableCustomFieldRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectTableCustomFieldResponse:
        """更新项目的表格自定义字段

        更新项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_table_custom_field_request: 
        :type update_project_table_custom_field_request: UpdateProjectTableCustomFieldRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_table_custom_field_request=update_project_table_custom_field_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_table_custom_field_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_table_custom_field_request: Optional[UpdateProjectTableCustomFieldRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectTableCustomFieldResponse]:
        """更新项目的表格自定义字段

        更新项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_table_custom_field_request: 
        :type update_project_table_custom_field_request: UpdateProjectTableCustomFieldRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_table_custom_field_request=update_project_table_custom_field_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_table_custom_field_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Optional[StrictStr] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_table_custom_field_request: Optional[UpdateProjectTableCustomFieldRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目的表格自定义字段

        更新项目的表格自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_table_custom_field_request: 
        :type update_project_table_custom_field_request: UpdateProjectTableCustomFieldRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_table_custom_field_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_table_custom_field_request=update_project_table_custom_field_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTableCustomFieldResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_table_custom_field_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        update_project_table_custom_field_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_table_custom_field_request is not None:
            _body_params = update_project_table_custom_field_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/customfield/table"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/customfield/table',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_tags_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_tags_v3_request: Optional[UpdateProjectTagsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectTagsV3Response:
        """更新项目的项目分组

        更新项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_tags_v3_request: 
        :type update_project_tags_v3_request: UpdateProjectTagsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_tags_v3_request=update_project_tags_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_tags_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_tags_v3_request: Optional[UpdateProjectTagsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectTagsV3Response]:
        """更新项目的项目分组

        更新项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_tags_v3_request: 
        :type update_project_tags_v3_request: UpdateProjectTagsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_tags_v3_request=update_project_tags_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_tags_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_tags_v3_request: Optional[UpdateProjectTagsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目的项目分组

        更新项目的项目分组

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_tags_v3_request: 
        :type update_project_tags_v3_request: UpdateProjectTagsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_tags_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_tags_v3_request=update_project_tags_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTagsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_tags_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        update_project_tags_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_tags_v3_request is not None:
            _body_params = update_project_tags_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/project-tag"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/project-tag',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_template_info_v3(
        self,
        project_template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_template_info_v3_request: Optional[UpdateProjectTemplateInfoV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectTemplateInfoV3Response:
        """修改项目模板基本信息

        修改项目模板基本信息

        :param project_template_id: 项目模板 ID (required)
        :type project_template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_template_info_v3_request: 
        :type update_project_template_info_v3_request: UpdateProjectTemplateInfoV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_template_info_v3_serialize(
            project_template_id=project_template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_template_info_v3_request=update_project_template_info_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTemplateInfoV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_template_info_v3_with_http_info(
        self,
        project_template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_template_info_v3_request: Optional[UpdateProjectTemplateInfoV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectTemplateInfoV3Response]:
        """修改项目模板基本信息

        修改项目模板基本信息

        :param project_template_id: 项目模板 ID (required)
        :type project_template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_template_info_v3_request: 
        :type update_project_template_info_v3_request: UpdateProjectTemplateInfoV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_template_info_v3_serialize(
            project_template_id=project_template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_template_info_v3_request=update_project_template_info_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTemplateInfoV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_template_info_v3_without_preload_content(
        self,
        project_template_id: Annotated[StrictStr, Field(description="项目模板 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_template_info_v3_request: Optional[UpdateProjectTemplateInfoV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """修改项目模板基本信息

        修改项目模板基本信息

        :param project_template_id: 项目模板 ID (required)
        :type project_template_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_template_info_v3_request: 
        :type update_project_template_info_v3_request: UpdateProjectTemplateInfoV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_template_info_v3_serialize(
            project_template_id=project_template_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_template_info_v3_request=update_project_template_info_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectTemplateInfoV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_template_info_v3_serialize(
        self,
        project_template_id,
        x_operator_id,
        x_tenant_id,
        update_project_template_info_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_template_id is not None:
            _path_params['projectTemplateId'] = project_template_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_template_info_v3_request is not None:
            _body_params = update_project_template_info_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project-template/{projectTemplateId}"
        url = url.replace('{' + 'projectTemplateId' + '}', str(project_template_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project-template/{projectTemplateId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_project_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_v3_request: Optional[UpdateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateProjectV3Response:
        """更新项目

        更新项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_v3_request: 
        :type update_project_v3_request: UpdateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_v3_request=update_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_project_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_v3_request: Optional[UpdateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateProjectV3Response]:
        """更新项目

        更新项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_v3_request: 
        :type update_project_v3_request: UpdateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_v3_request=update_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_project_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作人ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_project_v3_request: Optional[UpdateProjectV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目

        更新项目

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作人ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_project_v3_request: 
        :type update_project_v3_request: UpdateProjectV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_project_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_project_v3_request=update_project_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateProjectV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_project_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        update_project_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_project_v3_request is not None:
            _body_params = update_project_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_role_permissions_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_role_permissions_v3_request: Optional[UpdateRolePermissionsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateRolePermissionsV3Response:
        """修改项目角色的权限项

        修改项目角色的权限项

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_role_permissions_v3_request: 
        :type update_role_permissions_v3_request: UpdateRolePermissionsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_role_permissions_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_role_permissions_v3_request=update_role_permissions_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateRolePermissionsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_role_permissions_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_role_permissions_v3_request: Optional[UpdateRolePermissionsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateRolePermissionsV3Response]:
        """修改项目角色的权限项

        修改项目角色的权限项

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_role_permissions_v3_request: 
        :type update_role_permissions_v3_request: UpdateRolePermissionsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_role_permissions_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_role_permissions_v3_request=update_role_permissions_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateRolePermissionsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_role_permissions_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        role_id: Annotated[StrictStr, Field(description="项目角色ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_role_permissions_v3_request: Optional[UpdateRolePermissionsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """修改项目角色的权限项

        修改项目角色的权限项

        :param project_id: 项目ID (required)
        :type project_id: str
        :param role_id: 项目角色ID (required)
        :type role_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_role_permissions_v3_request: 
        :type update_role_permissions_v3_request: UpdateRolePermissionsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_role_permissions_v3_serialize(
            project_id=project_id,
            role_id=role_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_role_permissions_v3_request=update_role_permissions_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateRolePermissionsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_role_permissions_v3_serialize(
        self,
        project_id,
        role_id,
        x_operator_id,
        x_tenant_id,
        update_role_permissions_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if role_id is not None:
            _path_params['roleId'] = role_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_role_permissions_v3_request is not None:
            _body_params = update_role_permissions_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/role/{roleId}/permission/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'roleId' + '}', str(role_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/role/{roleId}/permission/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_sprint_label_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_label_v3_request: Optional[UpdateSprintLabelV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateSprintLabelV3Response:
        """迭代标签更新

        迭代标签更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_label_v3_request: 
        :type update_sprint_label_v3_request: UpdateSprintLabelV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_label_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_label_v3_request=update_sprint_label_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLabelV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_sprint_label_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_label_v3_request: Optional[UpdateSprintLabelV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateSprintLabelV3Response]:
        """迭代标签更新

        迭代标签更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_label_v3_request: 
        :type update_sprint_label_v3_request: UpdateSprintLabelV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_label_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_label_v3_request=update_sprint_label_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLabelV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_sprint_label_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_label_v3_request: Optional[UpdateSprintLabelV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """迭代标签更新

        迭代标签更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_label_v3_request: 
        :type update_sprint_label_v3_request: UpdateSprintLabelV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_label_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_label_v3_request=update_sprint_label_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLabelV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_sprint_label_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_tenant_id,
        update_sprint_label_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_sprint_label_v3_request is not None:
            _body_params = update_sprint_label_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/label/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/label/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_sprint_lock_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_lock_v3_request: Optional[UpdateSprintLockV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateSprintLockV3Response:
        """迭代锁定

        迭代锁定

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_lock_v3_request: 
        :type update_sprint_lock_v3_request: UpdateSprintLockV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_lock_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_sprint_lock_v3_request=update_sprint_lock_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLockV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_sprint_lock_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_lock_v3_request: Optional[UpdateSprintLockV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateSprintLockV3Response]:
        """迭代锁定

        迭代锁定

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_lock_v3_request: 
        :type update_sprint_lock_v3_request: UpdateSprintLockV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_lock_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_sprint_lock_v3_request=update_sprint_lock_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLockV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_sprint_lock_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_lock_v3_request: Optional[UpdateSprintLockV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """迭代锁定

        迭代锁定

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_lock_v3_request: 
        :type update_sprint_lock_v3_request: UpdateSprintLockV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_lock_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_sprint_lock_v3_request=update_sprint_lock_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintLockV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_sprint_lock_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        update_sprint_lock_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_sprint_lock_v3_request is not None:
            _body_params = update_sprint_lock_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/lock/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/lock/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_sprint_payload_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_payload_v3_request: Optional[UpdateSprintPayloadV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateSprintPayloadV3Response:
        """迭代操作限制更新

        迭代操作限制更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_payload_v3_request: 
        :type update_sprint_payload_v3_request: UpdateSprintPayloadV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_payload_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_payload_v3_request=update_sprint_payload_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintPayloadV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_sprint_payload_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_payload_v3_request: Optional[UpdateSprintPayloadV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateSprintPayloadV3Response]:
        """迭代操作限制更新

        迭代操作限制更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_payload_v3_request: 
        :type update_sprint_payload_v3_request: UpdateSprintPayloadV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_payload_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_payload_v3_request=update_sprint_payload_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintPayloadV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_sprint_payload_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_sprint_payload_v3_request: Optional[UpdateSprintPayloadV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """迭代操作限制更新

        迭代操作限制更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_sprint_payload_v3_request: 
        :type update_sprint_payload_v3_request: UpdateSprintPayloadV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_payload_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_tenant_id=x_tenant_id,
            update_sprint_payload_v3_request=update_sprint_payload_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintPayloadV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_sprint_payload_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_tenant_id,
        update_sprint_payload_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_sprint_payload_v3_request is not None:
            _body_params = update_sprint_payload_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/payload/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/payload/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_sprint_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateSprintV3Response:
        """迭代更新

        迭代更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_sprint_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateSprintV3Response]:
        """迭代更新

        迭代更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_sprint_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        sprint_id: Annotated[StrictStr, Field(description="迭代 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        create_sprint_v3_request: Optional[CreateSprintV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """迭代更新

        迭代更新

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param sprint_id: 迭代 ID (required)
        :type sprint_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param create_sprint_v3_request: 
        :type create_sprint_v3_request: CreateSprintV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_sprint_v3_serialize(
            project_id=project_id,
            sprint_id=sprint_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            create_sprint_v3_request=create_sprint_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateSprintV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_sprint_v3_serialize(
        self,
        project_id,
        sprint_id,
        x_operator_id,
        x_tenant_id,
        create_sprint_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if sprint_id is not None:
            _path_params['sprintId'] = sprint_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if create_sprint_v3_request is not None:
            _body_params = create_sprint_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/sprint/{sprintId}/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'sprintId' + '}', str(sprint_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/sprint/{sprintId}/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_status_custom_field_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_custom_field_v3_request: Optional[UpdateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> DeleteOrgMemberResponse:
        """更新项目概览自定义字段

        更新项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_custom_field_v3_request: 
        :type update_status_custom_field_v3_request: UpdateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_custom_field_v3_request=update_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_status_custom_field_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_custom_field_v3_request: Optional[UpdateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[DeleteOrgMemberResponse]:
        """更新项目概览自定义字段

        更新项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_custom_field_v3_request: 
        :type update_status_custom_field_v3_request: UpdateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_custom_field_v3_request=update_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_status_custom_field_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_custom_field_v3_request: Optional[UpdateStatusCustomFieldV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目概览自定义字段

        更新项目概览自定义字段

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_custom_field_v3_request: 
        :type update_status_custom_field_v3_request: UpdateStatusCustomFieldV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_custom_field_v3_serialize(
            project_id=project_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_custom_field_v3_request=update_status_custom_field_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "DeleteOrgMemberResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_status_custom_field_v3_serialize(
        self,
        project_id,
        x_operator_id,
        x_tenant_id,
        update_status_custom_field_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_status_custom_field_v3_request is not None:
            _body_params = update_status_custom_field_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/customfield/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/status/customfield/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_status_executors_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_executors_v3_request: Optional[UpdateStatusExecutorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateStatusExecutorsV3Response:
        """更新项目工作流状态流转角色列表

        更新项目工作流状态流转角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_executors_v3_request: 
        :type update_status_executors_v3_request: UpdateStatusExecutorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_executors_v3_request=update_status_executors_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_status_executors_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_executors_v3_request: Optional[UpdateStatusExecutorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateStatusExecutorsV3Response]:
        """更新项目工作流状态流转角色列表

        更新项目工作流状态流转角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_executors_v3_request: 
        :type update_status_executors_v3_request: UpdateStatusExecutorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_executors_v3_request=update_status_executors_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_status_executors_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_executors_v3_request: Optional[UpdateStatusExecutorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态流转角色列表

        更新项目工作流状态流转角色列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_executors_v3_request: 
        :type update_status_executors_v3_request: UpdateStatusExecutorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_executors_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_executors_v3_request=update_status_executors_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_status_executors_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        update_status_executors_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_status_executors_v3_request is not None:
            _body_params = update_status_executors_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/executor/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/executor/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_status_field_groups_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_field_groups_v3_request: Optional[UpdateStatusFieldGroupsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ListStatusFieldGroupsV3Response:
        """更新项目概览字段分组列表

        更新项目概览字段分组列表，覆盖式全量更新

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_field_groups_v3_request: 
        :type update_status_field_groups_v3_request: UpdateStatusFieldGroupsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            update_status_field_groups_v3_request=update_status_field_groups_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_status_field_groups_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_field_groups_v3_request: Optional[UpdateStatusFieldGroupsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[ListStatusFieldGroupsV3Response]:
        """更新项目概览字段分组列表

        更新项目概览字段分组列表，覆盖式全量更新

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_field_groups_v3_request: 
        :type update_status_field_groups_v3_request: UpdateStatusFieldGroupsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            update_status_field_groups_v3_request=update_status_field_groups_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_status_field_groups_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_field_groups_v3_request: Optional[UpdateStatusFieldGroupsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目概览字段分组列表

        更新项目概览字段分组列表，覆盖式全量更新

        :param project_id: 项目ID (required)
        :type project_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_field_groups_v3_request: 
        :type update_status_field_groups_v3_request: UpdateStatusFieldGroupsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_field_groups_v3_serialize(
            project_id=project_id,
            x_tenant_id=x_tenant_id,
            update_status_field_groups_v3_request=update_status_field_groups_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "ListStatusFieldGroupsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_status_field_groups_v3_serialize(
        self,
        project_id,
        x_tenant_id,
        update_status_field_groups_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        # process the query parameters
        # process the header parameters
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_status_field_groups_v3_request is not None:
            _body_params = update_status_field_groups_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/status/field-group"
        url = url.replace('{' + 'projectId' + '}', str(project_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/status/field-group',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_status_validators_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_validators_v3_request: Optional[UpdateStatusValidatorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateStatusExecutorsV3Response:
        """更新项目工作流状态流转校验列表

        更新项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_validators_v3_request: 
        :type update_status_validators_v3_request: UpdateStatusValidatorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_validators_v3_request=update_status_validators_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_status_validators_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_validators_v3_request: Optional[UpdateStatusValidatorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateStatusExecutorsV3Response]:
        """更新项目工作流状态流转校验列表

        更新项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_validators_v3_request: 
        :type update_status_validators_v3_request: UpdateStatusValidatorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_validators_v3_request=update_status_validators_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_status_validators_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_status_validators_v3_request: Optional[UpdateStatusValidatorsV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态流转校验列表

        更新项目工作流状态流转校验列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_status_validators_v3_request: 
        :type update_status_validators_v3_request: UpdateStatusValidatorsV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_status_validators_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_status_validators_v3_request=update_status_validators_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateStatusExecutorsV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_status_validators_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        update_status_validators_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_status_validators_v3_request is not None:
            _body_params = update_status_validators_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/validator/update"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/validator/update',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_task_flow_reject_status_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_reject_status_v3_request: Optional[UpdateTaskFlowRejectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskFlowStatusTypeV3Response:
        """更新项目工作流状态流转列表

        更新项目工作流状态流转列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_reject_status_v3_request: 
        :type update_task_flow_reject_status_v3_request: UpdateTaskFlowRejectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_reject_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_reject_status_v3_request=update_task_flow_reject_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_task_flow_reject_status_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_reject_status_v3_request: Optional[UpdateTaskFlowRejectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskFlowStatusTypeV3Response]:
        """更新项目工作流状态流转列表

        更新项目工作流状态流转列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_reject_status_v3_request: 
        :type update_task_flow_reject_status_v3_request: UpdateTaskFlowRejectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_reject_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_reject_status_v3_request=update_task_flow_reject_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_task_flow_reject_status_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_reject_status_v3_request: Optional[UpdateTaskFlowRejectStatusV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态流转列表

        更新项目工作流状态流转列表

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_reject_status_v3_request: 
        :type update_task_flow_reject_status_v3_request: UpdateTaskFlowRejectStatusV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_reject_status_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_reject_status_v3_request=update_task_flow_reject_status_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_task_flow_reject_status_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        update_task_flow_reject_status_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_task_flow_reject_status_v3_request is not None:
            _body_params = update_task_flow_reject_status_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/rejectstatus"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/rejectstatus',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_task_flow_status_name_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_name_v3_request: Optional[UpdateTaskFlowStatusNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskFlowStatusTypeV3Response:
        """更新项目工作流状态名字

        更新项目工作流状态名字

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_name_v3_request: 
        :type update_task_flow_status_name_v3_request: UpdateTaskFlowStatusNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_name_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_name_v3_request=update_task_flow_status_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_task_flow_status_name_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_name_v3_request: Optional[UpdateTaskFlowStatusNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskFlowStatusTypeV3Response]:
        """更新项目工作流状态名字

        更新项目工作流状态名字

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_name_v3_request: 
        :type update_task_flow_status_name_v3_request: UpdateTaskFlowStatusNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_name_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_name_v3_request=update_task_flow_status_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_task_flow_status_name_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_name_v3_request: Optional[UpdateTaskFlowStatusNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态名字

        更新项目工作流状态名字

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_name_v3_request: 
        :type update_task_flow_status_name_v3_request: UpdateTaskFlowStatusNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_name_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_name_v3_request=update_task_flow_status_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_task_flow_status_name_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        update_task_flow_status_name_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_task_flow_status_name_v3_request is not None:
            _body_params = update_task_flow_status_name_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/name"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/name',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_task_flow_status_type_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_type_v3_request: Optional[UpdateTaskFlowStatusTypeV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskFlowStatusTypeV3Response:
        """更新项目工作流状态

        更新项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_type_v3_request: 
        :type update_task_flow_status_type_v3_request: UpdateTaskFlowStatusTypeV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_type_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_type_v3_request=update_task_flow_status_type_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_task_flow_status_type_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_type_v3_request: Optional[UpdateTaskFlowStatusTypeV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskFlowStatusTypeV3Response]:
        """更新项目工作流状态

        更新项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_type_v3_request: 
        :type update_task_flow_status_type_v3_request: UpdateTaskFlowStatusTypeV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_type_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_type_v3_request=update_task_flow_status_type_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_task_flow_status_type_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tfs_id: Annotated[StrictStr, Field(description="工作流状态ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_flow_status_type_v3_request: Optional[UpdateTaskFlowStatusTypeV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流状态

        更新项目工作流状态

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tfs_id: 工作流状态ID (required)
        :type tfs_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_flow_status_type_v3_request: 
        :type update_task_flow_status_type_v3_request: UpdateTaskFlowStatusTypeV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_flow_status_type_v3_serialize(
            project_id=project_id,
            tfs_id=tfs_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_flow_status_type_v3_request=update_task_flow_status_type_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskFlowStatusTypeV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_task_flow_status_type_v3_serialize(
        self,
        project_id,
        tfs_id,
        x_operator_id,
        x_tenant_id,
        update_task_flow_status_type_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tfs_id is not None:
            _path_params['tfsId'] = tfs_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_task_flow_status_type_v3_request is not None:
            _body_params = update_task_flow_status_type_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflowstatus/{tfsId}/kind"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tfsId' + '}', str(tfs_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/taskflowstatus/{tfsId}/kind',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_task_group_title_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tasklist_id: Annotated[StrictStr, Field(description="任务分组ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_group_title_v3_request: Optional[UpdateTaskGroupTitleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskGroupTitleV3Response:
        """更新任务分组名称

        更新任务分组名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tasklist_id: 任务分组ID (required)
        :type tasklist_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_group_title_v3_request: 
        :type update_task_group_title_v3_request: UpdateTaskGroupTitleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_group_title_v3_serialize(
            project_id=project_id,
            tasklist_id=tasklist_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_group_title_v3_request=update_task_group_title_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskGroupTitleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_task_group_title_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tasklist_id: Annotated[StrictStr, Field(description="任务分组ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_group_title_v3_request: Optional[UpdateTaskGroupTitleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskGroupTitleV3Response]:
        """更新任务分组名称

        更新任务分组名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tasklist_id: 任务分组ID (required)
        :type tasklist_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_group_title_v3_request: 
        :type update_task_group_title_v3_request: UpdateTaskGroupTitleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_group_title_v3_serialize(
            project_id=project_id,
            tasklist_id=tasklist_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_group_title_v3_request=update_task_group_title_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskGroupTitleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_task_group_title_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        tasklist_id: Annotated[StrictStr, Field(description="任务分组ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_group_title_v3_request: Optional[UpdateTaskGroupTitleV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新任务分组名称

        更新任务分组名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param tasklist_id: 任务分组ID (required)
        :type tasklist_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_group_title_v3_request: 
        :type update_task_group_title_v3_request: UpdateTaskGroupTitleV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_group_title_v3_serialize(
            project_id=project_id,
            tasklist_id=tasklist_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_group_title_v3_request=update_task_group_title_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskGroupTitleV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_task_group_title_v3_serialize(
        self,
        project_id,
        tasklist_id,
        x_operator_id,
        x_tenant_id,
        update_task_group_title_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if tasklist_id is not None:
            _path_params['tasklistId'] = tasklist_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_task_group_title_v3_request is not None:
            _body_params = update_task_group_title_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/tasklist/{tasklistId}/title"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'tasklistId' + '}', str(tasklist_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/tasklist/{tasklistId}/title',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_task_stage_name_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        stage_id: Annotated[StrictStr, Field(description="任务列表ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_stage_name_v3_request: Optional[UpdateTaskStageNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskStageNameV3Response:
        """更新任务列表名称

        更新任务列表名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param stage_id: 任务列表ID (required)
        :type stage_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_stage_name_v3_request: 
        :type update_task_stage_name_v3_request: UpdateTaskStageNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_stage_name_v3_serialize(
            project_id=project_id,
            stage_id=stage_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_stage_name_v3_request=update_task_stage_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskStageNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_task_stage_name_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        stage_id: Annotated[StrictStr, Field(description="任务列表ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_stage_name_v3_request: Optional[UpdateTaskStageNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskStageNameV3Response]:
        """更新任务列表名称

        更新任务列表名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param stage_id: 任务列表ID (required)
        :type stage_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_stage_name_v3_request: 
        :type update_task_stage_name_v3_request: UpdateTaskStageNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_stage_name_v3_serialize(
            project_id=project_id,
            stage_id=stage_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_stage_name_v3_request=update_task_stage_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskStageNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_task_stage_name_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        stage_id: Annotated[StrictStr, Field(description="任务列表ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_task_stage_name_v3_request: Optional[UpdateTaskStageNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新任务列表名称

        更新任务列表名称

        :param project_id: 项目ID (required)
        :type project_id: str
        :param stage_id: 任务列表ID (required)
        :type stage_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_task_stage_name_v3_request: 
        :type update_task_stage_name_v3_request: UpdateTaskStageNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_task_stage_name_v3_serialize(
            project_id=project_id,
            stage_id=stage_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_task_stage_name_v3_request=update_task_stage_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskStageNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_task_stage_name_v3_serialize(
        self,
        project_id,
        stage_id,
        x_operator_id,
        x_tenant_id,
        update_task_stage_name_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if stage_id is not None:
            _path_params['stageId'] = stage_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_task_stage_name_v3_request is not None:
            _body_params = update_task_stage_name_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/stage/{stageId}/name"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'stageId' + '}', str(stage_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/stage/{stageId}/name',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_taskflow_name_v3(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_taskflow_name_v3_request: Optional[UpdateTaskflowNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTaskflowNameV3Response:
        """更新项目工作流

        更新项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_taskflow_name_v3_request: 
        :type update_taskflow_name_v3_request: UpdateTaskflowNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_taskflow_name_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_taskflow_name_v3_request=update_taskflow_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskflowNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_taskflow_name_v3_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_taskflow_name_v3_request: Optional[UpdateTaskflowNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTaskflowNameV3Response]:
        """更新项目工作流

        更新项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_taskflow_name_v3_request: 
        :type update_taskflow_name_v3_request: UpdateTaskflowNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_taskflow_name_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_taskflow_name_v3_request=update_taskflow_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskflowNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_taskflow_name_v3_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目ID")],
        taskflow_id: Annotated[StrictStr, Field(description="工作流ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_taskflow_name_v3_request: Optional[UpdateTaskflowNameV3Request] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目工作流

        更新项目工作流

        :param project_id: 项目ID (required)
        :type project_id: str
        :param taskflow_id: 工作流ID (required)
        :type taskflow_id: str
        :param x_operator_id: 操作者ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_taskflow_name_v3_request: 
        :type update_taskflow_name_v3_request: UpdateTaskflowNameV3Request
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_taskflow_name_v3_serialize(
            project_id=project_id,
            taskflow_id=taskflow_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_taskflow_name_v3_request=update_taskflow_name_v3_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTaskflowNameV3Response",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_taskflow_name_v3_serialize(
        self,
        project_id,
        taskflow_id,
        x_operator_id,
        x_tenant_id,
        update_taskflow_name_v3_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if taskflow_id is not None:
            _path_params['taskflowId'] = taskflow_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_taskflow_name_v3_request is not None:
            _body_params = update_taskflow_name_v3_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/taskflow/{taskflowId}/name"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'taskflowId' + '}', str(taskflow_id))

        return self.api_client.param_serialize(
            method='PUT',
            resource_path='/v3/project/{projectId}/taskflow/{taskflowId}/name',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )


    @validate_call
    def update_test_case_group(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testcase_id: Annotated[StrictStr, Field(description="测试用例 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_test_case_group_request: Optional[UpdateTestCaseGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> UpdateTestCaseGroupResponse:
        """更新项目级测试用例分组

        更新项目级测试用例分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testcase_id: 测试用例 ID (required)
        :type testcase_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_test_case_group_request: 
        :type update_test_case_group_request: UpdateTestCaseGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_test_case_group_serialize(
            project_id=project_id,
            testcase_id=testcase_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_test_case_group_request=update_test_case_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTestCaseGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        ).data

    @validate_call
    def update_test_case_group_with_http_info(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testcase_id: Annotated[StrictStr, Field(description="测试用例 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_test_case_group_request: Optional[UpdateTestCaseGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> ApiResponse[UpdateTestCaseGroupResponse]:
        """更新项目级测试用例分组

        更新项目级测试用例分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testcase_id: 测试用例 ID (required)
        :type testcase_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_test_case_group_request: 
        :type update_test_case_group_request: UpdateTestCaseGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_test_case_group_serialize(
            project_id=project_id,
            testcase_id=testcase_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_test_case_group_request=update_test_case_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTestCaseGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        response_data.read()
        return self.api_client.response_deserialize(
            response_data=response_data,
            response_types_map=_response_types_map,
        )

    @validate_call
    def update_test_case_group_without_preload_content(
        self,
        project_id: Annotated[StrictStr, Field(description="项目 ID")],
        testcase_id: Annotated[StrictStr, Field(description="测试用例 ID")],
        x_operator_id: Annotated[Optional[StrictStr], Field(description="操作者 ID")] = None,
        x_tenant_id: Annotated[Optional[StrictStr], Field(description="企业 ID")] = None,
        update_test_case_group_request: Optional[UpdateTestCaseGroupRequest] = None,
        _request_timeout: Union[
            None,
            Annotated[StrictFloat, Field(gt=0)],
            Tuple[
                Annotated[StrictFloat, Field(gt=0)],
                Annotated[StrictFloat, Field(gt=0)]
            ]
        ] = None,
        _request_auth: Optional[Dict[StrictStr, Any]] = None,
        _content_type: Optional[StrictStr] = None,
        _headers: Optional[Dict[StrictStr, Any]] = None,
        _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
    ) -> RESTResponseType:
        """更新项目级测试用例分组

        更新项目级测试用例分组

        :param project_id: 项目 ID (required)
        :type project_id: str
        :param testcase_id: 测试用例 ID (required)
        :type testcase_id: str
        :param x_operator_id: 操作者 ID
        :type x_operator_id: str
        :param x_tenant_id: 企业 ID
        :type x_tenant_id: str
        :param update_test_case_group_request: 
        :type update_test_case_group_request: UpdateTestCaseGroupRequest
        :param _request_timeout: timeout setting for this request. If one
                                 number provided, it will be total request
                                 timeout. It can also be a pair (tuple) of
                                 (connection, read) timeouts.
        :type _request_timeout: int, tuple(int, int), optional
        :param _request_auth: set to override the auth_settings for an a single
                              request; this effectively ignores the
                              authentication in the spec for a single request.
        :type _request_auth: dict, optional
        :param _content_type: force content-type for the request.
        :type _content_type: str, Optional
        :param _headers: set to override the headers for a single
                         request; this effectively ignores the headers
                         in the spec for a single request.
        :type _headers: dict, optional
        :param _host_index: set to override the host_index for a single
                            request; this effectively ignores the host_index
                            in the spec for a single request.
        :type _host_index: int, optional
        :return: Returns the result object.
        """ # noqa: E501

        _param = self._update_test_case_group_serialize(
            project_id=project_id,
            testcase_id=testcase_id,
            x_operator_id=x_operator_id,
            x_tenant_id=x_tenant_id,
            update_test_case_group_request=update_test_case_group_request,
            _request_auth=_request_auth,
            _content_type=_content_type,
            _headers=_headers,
            _host_index=_host_index
        )

        _response_types_map: Dict[str, Optional[str]] = {
            '200': "UpdateTestCaseGroupResponse",
        }

        method, url, header_params, body, post_params = _param
        response_data = self.api_client.call_api(
            method=method,
            url=url,
            header_params=header_params,
            body=body,
            post_params=post_params,
            _request_timeout=_request_timeout
        )
        return response_data.response

    def _update_test_case_group_serialize(
        self,
        project_id,
        testcase_id,
        x_operator_id,
        x_tenant_id,
        update_test_case_group_request,
        _request_auth,
        _content_type,
        _headers,
        _host_index,
    ) -> RequestSerialized:

        _host = 'https://open.teambition.com/api'  

        _collection_formats: Dict[str, str] = {
        }

        _path_params: Dict[str, str] = {}
        _query_params: List[Tuple[str, str]] = []
        _header_params: Dict[str, Optional[str]] = _headers or {}
        _form_params: List[Tuple[str, str]] = []
        _files: Dict[
            str, Union[str, bytes, List[str], List[bytes], List[Tuple[str, bytes]]]
        ] = {}
        _body_params: Optional[bytes] = None

        # process the path parameters
        if project_id is not None:
            _path_params['projectId'] = project_id
        if testcase_id is not None:
            _path_params['testcaseId'] = testcase_id
        # process the query parameters
        # process the header parameters
        if x_operator_id is not None:
            _header_params['x-operator-id'] = x_operator_id
        if x_tenant_id is not None:
            _header_params['X-Tenant-Id'] = x_tenant_id
        # process the form parameters
        # process the body parameter
        if update_test_case_group_request is not None:
            _body_params = update_test_case_group_request


        # set the HTTP header `Accept`
        if 'Accept' not in _header_params:
            _header_params['Accept'] = self.api_client.select_header_accept(
                [
                    'application/json'
                ]
            )

        # set the HTTP header `Content-Type`
        if _content_type:
            _header_params['Content-Type'] = _content_type
        else:
            _default_content_type = (
                self.api_client.select_header_content_type(
                    [
                        'application/json'
                    ]
                )
            )
            if _default_content_type is not None:
                _header_params['Content-Type'] = _default_content_type

        # authentication setting
        _auth_settings: List[str] = [
            'appToken'
        ]

        # Build the full URL
        url = _host + "/v3/project/{projectId}/testcase/{testcaseId}/commongroup"
        url = url.replace('{' + 'projectId' + '}', str(project_id))
        url = url.replace('{' + 'testcaseId' + '}', str(testcase_id))

        return self.api_client.param_serialize(
            method='POST',
            resource_path='/v3/project/{projectId}/testcase/{testcaseId}/commongroup',
            path_params=_path_params,
            query_params=_query_params,
            header_params=_header_params,
            body=_body_params,
            post_params=_form_params,
            files=_files,
            auth_settings=_auth_settings,
            collection_formats=_collection_formats,
            _host=_host,
            _request_auth=_request_auth
        )

