From 6a1e7d452e8b87cf9d6f689588ab0f6c97c67bd5 Mon Sep 17 00:00:00 2001 From: scaleway-bot Date: Thu, 16 Jan 2025 15:39:32 +0000 Subject: [PATCH] feat: update generated APIs --- .../scaleway_async/account/v3/__init__.py | 24 ++ .../scaleway_async/account/v3/api.py | 242 ++++++++++++++++++ .../scaleway_async/account/v3/marshalling.py | 177 +++++++++++++ .../scaleway_async/account/v3/types.py | 205 +++++++++++++++ scaleway/scaleway/account/v3/__init__.py | 24 ++ scaleway/scaleway/account/v3/api.py | 242 ++++++++++++++++++ scaleway/scaleway/account/v3/marshalling.py | 177 +++++++++++++ scaleway/scaleway/account/v3/types.py | 205 +++++++++++++++ 8 files changed, 1296 insertions(+) diff --git a/scaleway-async/scaleway_async/account/v3/__init__.py b/scaleway-async/scaleway_async/account/v3/__init__.py index 262de9a5f..1d357a35a 100644 --- a/scaleway-async/scaleway_async/account/v3/__init__.py +++ b/scaleway-async/scaleway_async/account/v3/__init__.py @@ -1,23 +1,47 @@ # This file was automatically generated. DO NOT EDIT. # If you have any remark or suggestion do not hesitate to open an issue. +from .types import ContractType +from .types import ListContractSignaturesRequestOrderBy from .types import ListProjectsRequestOrderBy +from .types import Contract +from .types import ContractSignature from .types import Project +from .types import CheckContractSignatureResponse +from .types import ContractApiCheckContractSignatureRequest +from .types import ContractApiCreateContractSignatureRequest +from .types import ContractApiDownloadContractSignatureRequest +from .types import ContractApiListContractSignaturesRequest +from .types import ContractApiValidateContractSignatureRequest +from .types import ListContractSignaturesResponse from .types import ListProjectsResponse from .types import ProjectApiCreateProjectRequest from .types import ProjectApiDeleteProjectRequest from .types import ProjectApiGetProjectRequest from .types import ProjectApiListProjectsRequest from .types import ProjectApiUpdateProjectRequest +from .api import AccountV3ContractAPI from .api import AccountV3ProjectAPI __all__ = [ + "ContractType", + "ListContractSignaturesRequestOrderBy", "ListProjectsRequestOrderBy", + "Contract", + "ContractSignature", "Project", + "CheckContractSignatureResponse", + "ContractApiCheckContractSignatureRequest", + "ContractApiCreateContractSignatureRequest", + "ContractApiDownloadContractSignatureRequest", + "ContractApiListContractSignaturesRequest", + "ContractApiValidateContractSignatureRequest", + "ListContractSignaturesResponse", "ListProjectsResponse", "ProjectApiCreateProjectRequest", "ProjectApiDeleteProjectRequest", "ProjectApiGetProjectRequest", "ProjectApiListProjectsRequest", "ProjectApiUpdateProjectRequest", + "AccountV3ContractAPI", "AccountV3ProjectAPI", ] diff --git a/scaleway-async/scaleway_async/account/v3/api.py b/scaleway-async/scaleway_async/account/v3/api.py index f45364b6f..05626874f 100644 --- a/scaleway-async/scaleway_async/account/v3/api.py +++ b/scaleway-async/scaleway_async/account/v3/api.py @@ -4,24 +4,266 @@ from typing import List, Optional from scaleway_core.api import API +from scaleway_core.bridge import ( + ScwFile, + unmarshal_ScwFile, +) from scaleway_core.utils import ( random_name, validate_path_param, fetch_all_pages_async, ) from .types import ( + ContractType, + ListContractSignaturesRequestOrderBy, ListProjectsRequestOrderBy, + CheckContractSignatureResponse, + ContractApiCheckContractSignatureRequest, + ContractApiCreateContractSignatureRequest, + ContractSignature, + ListContractSignaturesResponse, ListProjectsResponse, Project, ProjectApiCreateProjectRequest, ProjectApiUpdateProjectRequest, ) from .marshalling import ( + unmarshal_ContractSignature, unmarshal_Project, + unmarshal_CheckContractSignatureResponse, + unmarshal_ListContractSignaturesResponse, unmarshal_ListProjectsResponse, + marshal_ContractApiCheckContractSignatureRequest, + marshal_ContractApiCreateContractSignatureRequest, marshal_ProjectApiCreateProjectRequest, marshal_ProjectApiUpdateProjectRequest, ) +from ...std.types import ( + LanguageCode as StdLanguageCode, +) + + +class AccountV3ContractAPI(API): + """ + The Contract API allows you to manage contracts. + """ + + async def download_contract_signature( + self, + *, + contract_signature_id: str, + locale: Optional[StdLanguageCode] = None, + ) -> ScwFile: + """ + Download a contract content. + :param contract_signature_id: The contract signature ID. + :param locale: The locale requested for the content of the contract. + :return: :class:`ScwFile ` + + Usage: + :: + + result = await api.download_contract_signature( + contract_signature_id="example", + ) + """ + + param_contract_signature_id = validate_path_param( + "contract_signature_id", contract_signature_id + ) + + res = self._request( + "GET", + f"/account/v3/contract-signatures/{param_contract_signature_id}/download", + params={ + "locale": locale, + }, + ) + + self._throw_on_error(res) + return unmarshal_ScwFile(res.json()) + + async def create_contract_signature( + self, + *, + contract_name: str, + validated: bool, + contract_type: Optional[ContractType] = None, + organization_id: Optional[str] = None, + ) -> ContractSignature: + """ + Create a signature for your Organization for the latest version of the requested contract. + :param contract_name: The name of the contract. + :param validated: Whether the contract is validated at creation. + :param contract_type: The type of the contract. + :param organization_id: ID of the Organization. + :return: :class:`ContractSignature ` + + Usage: + :: + + result = await api.create_contract_signature( + contract_name="example", + validated=False, + ) + """ + + res = self._request( + "POST", + "/account/v3/contract-signatures", + body=marshal_ContractApiCreateContractSignatureRequest( + ContractApiCreateContractSignatureRequest( + contract_name=contract_name, + validated=validated, + contract_type=contract_type, + organization_id=organization_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ContractSignature(res.json()) + + async def validate_contract_signature( + self, + *, + contract_signature_id: str, + ) -> ContractSignature: + """ + Sign a contract for your Organization. + :param contract_signature_id: The contract linked to your Organization you want to sign. + :return: :class:`ContractSignature ` + + Usage: + :: + + result = await api.validate_contract_signature( + contract_signature_id="example", + ) + """ + + param_contract_signature_id = validate_path_param( + "contract_signature_id", contract_signature_id + ) + + res = self._request( + "POST", + f"/account/v3/contract-signatures/{param_contract_signature_id}/validate", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_ContractSignature(res.json()) + + async def check_contract_signature( + self, + *, + contract_name: str, + organization_id: Optional[str] = None, + contract_type: Optional[ContractType] = None, + ) -> CheckContractSignatureResponse: + """ + Check if a contract is signed for your Organization. + :param contract_name: Filter on contract name. + :param organization_id: ID of the Organization to check the contract signature for. + :param contract_type: Filter on contract type. + :return: :class:`CheckContractSignatureResponse ` + + Usage: + :: + + result = await api.check_contract_signature( + contract_name="example", + ) + """ + + res = self._request( + "POST", + "/account/v3/contract-signatures/check", + body=marshal_ContractApiCheckContractSignatureRequest( + ContractApiCheckContractSignatureRequest( + contract_name=contract_name, + organization_id=organization_id, + contract_type=contract_type, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_CheckContractSignatureResponse(res.json()) + + async def list_contract_signatures( + self, + *, + page: Optional[int] = None, + page_size: Optional[int] = None, + order_by: Optional[ListContractSignaturesRequestOrderBy] = None, + organization_id: Optional[str] = None, + ) -> ListContractSignaturesResponse: + """ + List contract signatures for an Organization. + :param page: The page number for the returned contracts. + :param page_size: The maximum number of contracts per page. + :param order_by: How the contracts are ordered in the response. + :param organization_id: Filter on Organization ID. + :return: :class:`ListContractSignaturesResponse ` + + Usage: + :: + + result = await api.list_contract_signatures() + """ + + res = self._request( + "GET", + "/account/v3/contract-signatures", + params={ + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListContractSignaturesResponse(res.json()) + + async def list_contract_signatures_all( + self, + *, + page: Optional[int] = None, + page_size: Optional[int] = None, + order_by: Optional[ListContractSignaturesRequestOrderBy] = None, + organization_id: Optional[str] = None, + ) -> List[ContractSignature]: + """ + List contract signatures for an Organization. + :param page: The page number for the returned contracts. + :param page_size: The maximum number of contracts per page. + :param order_by: How the contracts are ordered in the response. + :param organization_id: Filter on Organization ID. + :return: :class:`List[ContractSignature] ` + + Usage: + :: + + result = await api.list_contract_signatures_all() + """ + + return await fetch_all_pages_async( + type=ListContractSignaturesResponse, + key="contract_signatures", + fetcher=self.list_contract_signatures, + args={ + "page": page, + "page_size": page_size, + "order_by": order_by, + "organization_id": organization_id, + }, + ) class AccountV3ProjectAPI(API): diff --git a/scaleway-async/scaleway_async/account/v3/marshalling.py b/scaleway-async/scaleway_async/account/v3/marshalling.py index adf14cd3a..f6e3445a6 100644 --- a/scaleway-async/scaleway_async/account/v3/marshalling.py +++ b/scaleway-async/scaleway_async/account/v3/marshalling.py @@ -6,13 +6,101 @@ from scaleway_core.profile import ProfileDefaults from .types import ( + Contract, + ContractSignature, Project, + CheckContractSignatureResponse, + ListContractSignaturesResponse, ListProjectsResponse, + ContractApiCheckContractSignatureRequest, + ContractApiCreateContractSignatureRequest, ProjectApiCreateProjectRequest, ProjectApiUpdateProjectRequest, ) +def unmarshal_Contract(data: Any) -> Contract: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Contract' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("type", None) + if field is not None: + args["type_"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("version", None) + if field is not None: + args["version"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Contract(**args) + + +def unmarshal_ContractSignature(data: Any) -> ContractSignature: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ContractSignature' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("signed_at", None) + if field is not None: + args["signed_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["signed_at"] = None + + field = data.get("expires_at", None) + if field is not None: + args["expires_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["expires_at"] = None + + field = data.get("contract", None) + if field is not None: + args["contract"] = unmarshal_Contract(field) + else: + args["contract"] = None + + return ContractSignature(**args) + + def unmarshal_Project(data: Any) -> Project: if not isinstance(data, dict): raise TypeError( @@ -52,6 +140,52 @@ def unmarshal_Project(data: Any) -> Project: return Project(**args) +def unmarshal_CheckContractSignatureResponse( + data: Any, +) -> CheckContractSignatureResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'CheckContractSignatureResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("created", None) + if field is not None: + args["created"] = field + + field = data.get("validated", None) + if field is not None: + args["validated"] = field + + return CheckContractSignatureResponse(**args) + + +def unmarshal_ListContractSignaturesResponse( + data: Any, +) -> ListContractSignaturesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListContractSignaturesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + field = data.get("contract_signatures", None) + if field is not None: + args["contract_signatures"] = ( + [unmarshal_ContractSignature(v) for v in field] + if field is not None + else None + ) + + return ListContractSignaturesResponse(**args) + + def unmarshal_ListProjectsResponse(data: Any) -> ListProjectsResponse: if not isinstance(data, dict): raise TypeError( @@ -73,6 +207,49 @@ def unmarshal_ListProjectsResponse(data: Any) -> ListProjectsResponse: return ListProjectsResponse(**args) +def marshal_ContractApiCheckContractSignatureRequest( + request: ContractApiCheckContractSignatureRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.contract_name is not None: + output["contract_name"] = request.contract_name + + if request.organization_id is not None: + output["organization_id"] = ( + request.organization_id or defaults.default_organization_id + ) + + if request.contract_type is not None: + output["contract_type"] = str(request.contract_type) + + return output + + +def marshal_ContractApiCreateContractSignatureRequest( + request: ContractApiCreateContractSignatureRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.contract_name is not None: + output["contract_name"] = request.contract_name + + if request.validated is not None: + output["validated"] = request.validated + + if request.contract_type is not None: + output["contract_type"] = str(request.contract_type) + + if request.organization_id is not None: + output["organization_id"] = ( + request.organization_id or defaults.default_organization_id + ) + + return output + + def marshal_ProjectApiCreateProjectRequest( request: ProjectApiCreateProjectRequest, defaults: ProfileDefaults, diff --git a/scaleway-async/scaleway_async/account/v3/types.py b/scaleway-async/scaleway_async/account/v3/types.py index 915bdd224..9973bf316 100644 --- a/scaleway-async/scaleway_async/account/v3/types.py +++ b/scaleway-async/scaleway_async/account/v3/types.py @@ -11,6 +11,34 @@ StrEnumMeta, ) +from ...std.types import ( + LanguageCode as StdLanguageCode, +) + + +class ContractType(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_TYPE = "unknown_type" + GLOBAL = "global" + K8S = "k8s" + INSTANCE = "instance" + CONTAINER = "container" + BAREMETAL = "baremetal" + + def __str__(self) -> str: + return str(self.value) + + +class ListContractSignaturesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + SIGNED_AT_ASC = "signed_at_asc" + SIGNED_AT_DESC = "signed_at_desc" + EXPIRES_AT_ASC = "expires_at_asc" + EXPIRES_AT_DESC = "expires_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + class ListProjectsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" @@ -22,6 +50,72 @@ def __str__(self) -> str: return str(self.value) +@dataclass +class Contract: + id: str + """ + ID of the contract. + """ + + type_: ContractType + """ + The type of the contract. + """ + + name: str + """ + The name of the contract. + """ + + version: int + """ + The version of the contract. + """ + + created_at: Optional[datetime] + """ + The creation date of the contract. + """ + + updated_at: Optional[datetime] + """ + The last modification date of the contract. + """ + + +@dataclass +class ContractSignature: + id: str + """ + ID of the contract signature. + """ + + organization_id: str + """ + The Organization ID which signed the contract. + """ + + created_at: Optional[datetime] + """ + The creation date of the contract signature. + """ + + signed_at: Optional[datetime] + """ + The signing date of the contract signature. + """ + + expires_at: Optional[datetime] + """ + The expiration date of the contract signature. + """ + + contract: Optional[Contract] + """ + The contract signed. + """ + + @dataclass class Project: id: str @@ -55,6 +149,117 @@ class Project: """ +@dataclass +class CheckContractSignatureResponse: + created: bool + """ + Whether a signature has been requested for this contract. + """ + + validated: bool + """ + Whether the signature for this contract has been validated. + """ + + +@dataclass +class ContractApiCheckContractSignatureRequest: + contract_name: str + """ + Filter on contract name. + """ + + organization_id: Optional[str] + """ + ID of the Organization to check the contract signature for. + """ + + contract_type: Optional[ContractType] + """ + Filter on contract type. + """ + + +@dataclass +class ContractApiCreateContractSignatureRequest: + contract_name: str + """ + The name of the contract. + """ + + validated: bool + """ + Whether the contract is validated at creation. + """ + + contract_type: Optional[ContractType] + """ + The type of the contract. + """ + + organization_id: Optional[str] + """ + ID of the Organization. + """ + + +@dataclass +class ContractApiDownloadContractSignatureRequest: + contract_signature_id: str + """ + The contract signature ID. + """ + + locale: Optional[StdLanguageCode] + """ + The locale requested for the content of the contract. + """ + + +@dataclass +class ContractApiListContractSignaturesRequest: + page: Optional[int] + """ + The page number for the returned contracts. + """ + + page_size: Optional[int] + """ + The maximum number of contracts per page. + """ + + order_by: Optional[ListContractSignaturesRequestOrderBy] + """ + How the contracts are ordered in the response. + """ + + organization_id: Optional[str] + """ + Filter on Organization ID. + """ + + +@dataclass +class ContractApiValidateContractSignatureRequest: + contract_signature_id: str + """ + The contract linked to your Organization you want to sign. + """ + + +@dataclass +class ListContractSignaturesResponse: + total_count: int + """ + The total number of contract signatures. + """ + + contract_signatures: List[ContractSignature] + """ + The paginated returned contract signatures. + """ + + @dataclass class ListProjectsResponse: total_count: int diff --git a/scaleway/scaleway/account/v3/__init__.py b/scaleway/scaleway/account/v3/__init__.py index 262de9a5f..1d357a35a 100644 --- a/scaleway/scaleway/account/v3/__init__.py +++ b/scaleway/scaleway/account/v3/__init__.py @@ -1,23 +1,47 @@ # This file was automatically generated. DO NOT EDIT. # If you have any remark or suggestion do not hesitate to open an issue. +from .types import ContractType +from .types import ListContractSignaturesRequestOrderBy from .types import ListProjectsRequestOrderBy +from .types import Contract +from .types import ContractSignature from .types import Project +from .types import CheckContractSignatureResponse +from .types import ContractApiCheckContractSignatureRequest +from .types import ContractApiCreateContractSignatureRequest +from .types import ContractApiDownloadContractSignatureRequest +from .types import ContractApiListContractSignaturesRequest +from .types import ContractApiValidateContractSignatureRequest +from .types import ListContractSignaturesResponse from .types import ListProjectsResponse from .types import ProjectApiCreateProjectRequest from .types import ProjectApiDeleteProjectRequest from .types import ProjectApiGetProjectRequest from .types import ProjectApiListProjectsRequest from .types import ProjectApiUpdateProjectRequest +from .api import AccountV3ContractAPI from .api import AccountV3ProjectAPI __all__ = [ + "ContractType", + "ListContractSignaturesRequestOrderBy", "ListProjectsRequestOrderBy", + "Contract", + "ContractSignature", "Project", + "CheckContractSignatureResponse", + "ContractApiCheckContractSignatureRequest", + "ContractApiCreateContractSignatureRequest", + "ContractApiDownloadContractSignatureRequest", + "ContractApiListContractSignaturesRequest", + "ContractApiValidateContractSignatureRequest", + "ListContractSignaturesResponse", "ListProjectsResponse", "ProjectApiCreateProjectRequest", "ProjectApiDeleteProjectRequest", "ProjectApiGetProjectRequest", "ProjectApiListProjectsRequest", "ProjectApiUpdateProjectRequest", + "AccountV3ContractAPI", "AccountV3ProjectAPI", ] diff --git a/scaleway/scaleway/account/v3/api.py b/scaleway/scaleway/account/v3/api.py index 30a39207c..5619ae907 100644 --- a/scaleway/scaleway/account/v3/api.py +++ b/scaleway/scaleway/account/v3/api.py @@ -4,24 +4,266 @@ from typing import List, Optional from scaleway_core.api import API +from scaleway_core.bridge import ( + ScwFile, + unmarshal_ScwFile, +) from scaleway_core.utils import ( random_name, validate_path_param, fetch_all_pages, ) from .types import ( + ContractType, + ListContractSignaturesRequestOrderBy, ListProjectsRequestOrderBy, + CheckContractSignatureResponse, + ContractApiCheckContractSignatureRequest, + ContractApiCreateContractSignatureRequest, + ContractSignature, + ListContractSignaturesResponse, ListProjectsResponse, Project, ProjectApiCreateProjectRequest, ProjectApiUpdateProjectRequest, ) from .marshalling import ( + unmarshal_ContractSignature, unmarshal_Project, + unmarshal_CheckContractSignatureResponse, + unmarshal_ListContractSignaturesResponse, unmarshal_ListProjectsResponse, + marshal_ContractApiCheckContractSignatureRequest, + marshal_ContractApiCreateContractSignatureRequest, marshal_ProjectApiCreateProjectRequest, marshal_ProjectApiUpdateProjectRequest, ) +from ...std.types import ( + LanguageCode as StdLanguageCode, +) + + +class AccountV3ContractAPI(API): + """ + The Contract API allows you to manage contracts. + """ + + def download_contract_signature( + self, + *, + contract_signature_id: str, + locale: Optional[StdLanguageCode] = None, + ) -> ScwFile: + """ + Download a contract content. + :param contract_signature_id: The contract signature ID. + :param locale: The locale requested for the content of the contract. + :return: :class:`ScwFile ` + + Usage: + :: + + result = api.download_contract_signature( + contract_signature_id="example", + ) + """ + + param_contract_signature_id = validate_path_param( + "contract_signature_id", contract_signature_id + ) + + res = self._request( + "GET", + f"/account/v3/contract-signatures/{param_contract_signature_id}/download", + params={ + "locale": locale, + }, + ) + + self._throw_on_error(res) + return unmarshal_ScwFile(res.json()) + + def create_contract_signature( + self, + *, + contract_name: str, + validated: bool, + contract_type: Optional[ContractType] = None, + organization_id: Optional[str] = None, + ) -> ContractSignature: + """ + Create a signature for your Organization for the latest version of the requested contract. + :param contract_name: The name of the contract. + :param validated: Whether the contract is validated at creation. + :param contract_type: The type of the contract. + :param organization_id: ID of the Organization. + :return: :class:`ContractSignature ` + + Usage: + :: + + result = api.create_contract_signature( + contract_name="example", + validated=False, + ) + """ + + res = self._request( + "POST", + "/account/v3/contract-signatures", + body=marshal_ContractApiCreateContractSignatureRequest( + ContractApiCreateContractSignatureRequest( + contract_name=contract_name, + validated=validated, + contract_type=contract_type, + organization_id=organization_id, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_ContractSignature(res.json()) + + def validate_contract_signature( + self, + *, + contract_signature_id: str, + ) -> ContractSignature: + """ + Sign a contract for your Organization. + :param contract_signature_id: The contract linked to your Organization you want to sign. + :return: :class:`ContractSignature ` + + Usage: + :: + + result = api.validate_contract_signature( + contract_signature_id="example", + ) + """ + + param_contract_signature_id = validate_path_param( + "contract_signature_id", contract_signature_id + ) + + res = self._request( + "POST", + f"/account/v3/contract-signatures/{param_contract_signature_id}/validate", + body={}, + ) + + self._throw_on_error(res) + return unmarshal_ContractSignature(res.json()) + + def check_contract_signature( + self, + *, + contract_name: str, + organization_id: Optional[str] = None, + contract_type: Optional[ContractType] = None, + ) -> CheckContractSignatureResponse: + """ + Check if a contract is signed for your Organization. + :param contract_name: Filter on contract name. + :param organization_id: ID of the Organization to check the contract signature for. + :param contract_type: Filter on contract type. + :return: :class:`CheckContractSignatureResponse ` + + Usage: + :: + + result = api.check_contract_signature( + contract_name="example", + ) + """ + + res = self._request( + "POST", + "/account/v3/contract-signatures/check", + body=marshal_ContractApiCheckContractSignatureRequest( + ContractApiCheckContractSignatureRequest( + contract_name=contract_name, + organization_id=organization_id, + contract_type=contract_type, + ), + self.client, + ), + ) + + self._throw_on_error(res) + return unmarshal_CheckContractSignatureResponse(res.json()) + + def list_contract_signatures( + self, + *, + page: Optional[int] = None, + page_size: Optional[int] = None, + order_by: Optional[ListContractSignaturesRequestOrderBy] = None, + organization_id: Optional[str] = None, + ) -> ListContractSignaturesResponse: + """ + List contract signatures for an Organization. + :param page: The page number for the returned contracts. + :param page_size: The maximum number of contracts per page. + :param order_by: How the contracts are ordered in the response. + :param organization_id: Filter on Organization ID. + :return: :class:`ListContractSignaturesResponse ` + + Usage: + :: + + result = api.list_contract_signatures() + """ + + res = self._request( + "GET", + "/account/v3/contract-signatures", + params={ + "order_by": order_by, + "organization_id": organization_id + or self.client.default_organization_id, + "page": page, + "page_size": page_size or self.client.default_page_size, + }, + ) + + self._throw_on_error(res) + return unmarshal_ListContractSignaturesResponse(res.json()) + + def list_contract_signatures_all( + self, + *, + page: Optional[int] = None, + page_size: Optional[int] = None, + order_by: Optional[ListContractSignaturesRequestOrderBy] = None, + organization_id: Optional[str] = None, + ) -> List[ContractSignature]: + """ + List contract signatures for an Organization. + :param page: The page number for the returned contracts. + :param page_size: The maximum number of contracts per page. + :param order_by: How the contracts are ordered in the response. + :param organization_id: Filter on Organization ID. + :return: :class:`List[ContractSignature] ` + + Usage: + :: + + result = api.list_contract_signatures_all() + """ + + return fetch_all_pages( + type=ListContractSignaturesResponse, + key="contract_signatures", + fetcher=self.list_contract_signatures, + args={ + "page": page, + "page_size": page_size, + "order_by": order_by, + "organization_id": organization_id, + }, + ) class AccountV3ProjectAPI(API): diff --git a/scaleway/scaleway/account/v3/marshalling.py b/scaleway/scaleway/account/v3/marshalling.py index adf14cd3a..f6e3445a6 100644 --- a/scaleway/scaleway/account/v3/marshalling.py +++ b/scaleway/scaleway/account/v3/marshalling.py @@ -6,13 +6,101 @@ from scaleway_core.profile import ProfileDefaults from .types import ( + Contract, + ContractSignature, Project, + CheckContractSignatureResponse, + ListContractSignaturesResponse, ListProjectsResponse, + ContractApiCheckContractSignatureRequest, + ContractApiCreateContractSignatureRequest, ProjectApiCreateProjectRequest, ProjectApiUpdateProjectRequest, ) +def unmarshal_Contract(data: Any) -> Contract: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'Contract' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("type", None) + if field is not None: + args["type_"] = field + + field = data.get("name", None) + if field is not None: + args["name"] = field + + field = data.get("version", None) + if field is not None: + args["version"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("updated_at", None) + if field is not None: + args["updated_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["updated_at"] = None + + return Contract(**args) + + +def unmarshal_ContractSignature(data: Any) -> ContractSignature: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ContractSignature' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("id", None) + if field is not None: + args["id"] = field + + field = data.get("organization_id", None) + if field is not None: + args["organization_id"] = field + + field = data.get("created_at", None) + if field is not None: + args["created_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["created_at"] = None + + field = data.get("signed_at", None) + if field is not None: + args["signed_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["signed_at"] = None + + field = data.get("expires_at", None) + if field is not None: + args["expires_at"] = parser.isoparse(field) if isinstance(field, str) else field + else: + args["expires_at"] = None + + field = data.get("contract", None) + if field is not None: + args["contract"] = unmarshal_Contract(field) + else: + args["contract"] = None + + return ContractSignature(**args) + + def unmarshal_Project(data: Any) -> Project: if not isinstance(data, dict): raise TypeError( @@ -52,6 +140,52 @@ def unmarshal_Project(data: Any) -> Project: return Project(**args) +def unmarshal_CheckContractSignatureResponse( + data: Any, +) -> CheckContractSignatureResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'CheckContractSignatureResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("created", None) + if field is not None: + args["created"] = field + + field = data.get("validated", None) + if field is not None: + args["validated"] = field + + return CheckContractSignatureResponse(**args) + + +def unmarshal_ListContractSignaturesResponse( + data: Any, +) -> ListContractSignaturesResponse: + if not isinstance(data, dict): + raise TypeError( + "Unmarshalling the type 'ListContractSignaturesResponse' failed as data isn't a dictionary." + ) + + args: Dict[str, Any] = {} + + field = data.get("total_count", None) + if field is not None: + args["total_count"] = field + + field = data.get("contract_signatures", None) + if field is not None: + args["contract_signatures"] = ( + [unmarshal_ContractSignature(v) for v in field] + if field is not None + else None + ) + + return ListContractSignaturesResponse(**args) + + def unmarshal_ListProjectsResponse(data: Any) -> ListProjectsResponse: if not isinstance(data, dict): raise TypeError( @@ -73,6 +207,49 @@ def unmarshal_ListProjectsResponse(data: Any) -> ListProjectsResponse: return ListProjectsResponse(**args) +def marshal_ContractApiCheckContractSignatureRequest( + request: ContractApiCheckContractSignatureRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.contract_name is not None: + output["contract_name"] = request.contract_name + + if request.organization_id is not None: + output["organization_id"] = ( + request.organization_id or defaults.default_organization_id + ) + + if request.contract_type is not None: + output["contract_type"] = str(request.contract_type) + + return output + + +def marshal_ContractApiCreateContractSignatureRequest( + request: ContractApiCreateContractSignatureRequest, + defaults: ProfileDefaults, +) -> Dict[str, Any]: + output: Dict[str, Any] = {} + + if request.contract_name is not None: + output["contract_name"] = request.contract_name + + if request.validated is not None: + output["validated"] = request.validated + + if request.contract_type is not None: + output["contract_type"] = str(request.contract_type) + + if request.organization_id is not None: + output["organization_id"] = ( + request.organization_id or defaults.default_organization_id + ) + + return output + + def marshal_ProjectApiCreateProjectRequest( request: ProjectApiCreateProjectRequest, defaults: ProfileDefaults, diff --git a/scaleway/scaleway/account/v3/types.py b/scaleway/scaleway/account/v3/types.py index 915bdd224..9973bf316 100644 --- a/scaleway/scaleway/account/v3/types.py +++ b/scaleway/scaleway/account/v3/types.py @@ -11,6 +11,34 @@ StrEnumMeta, ) +from ...std.types import ( + LanguageCode as StdLanguageCode, +) + + +class ContractType(str, Enum, metaclass=StrEnumMeta): + UNKNOWN_TYPE = "unknown_type" + GLOBAL = "global" + K8S = "k8s" + INSTANCE = "instance" + CONTAINER = "container" + BAREMETAL = "baremetal" + + def __str__(self) -> str: + return str(self.value) + + +class ListContractSignaturesRequestOrderBy(str, Enum, metaclass=StrEnumMeta): + SIGNED_AT_ASC = "signed_at_asc" + SIGNED_AT_DESC = "signed_at_desc" + EXPIRES_AT_ASC = "expires_at_asc" + EXPIRES_AT_DESC = "expires_at_desc" + NAME_ASC = "name_asc" + NAME_DESC = "name_desc" + + def __str__(self) -> str: + return str(self.value) + class ListProjectsRequestOrderBy(str, Enum, metaclass=StrEnumMeta): CREATED_AT_ASC = "created_at_asc" @@ -22,6 +50,72 @@ def __str__(self) -> str: return str(self.value) +@dataclass +class Contract: + id: str + """ + ID of the contract. + """ + + type_: ContractType + """ + The type of the contract. + """ + + name: str + """ + The name of the contract. + """ + + version: int + """ + The version of the contract. + """ + + created_at: Optional[datetime] + """ + The creation date of the contract. + """ + + updated_at: Optional[datetime] + """ + The last modification date of the contract. + """ + + +@dataclass +class ContractSignature: + id: str + """ + ID of the contract signature. + """ + + organization_id: str + """ + The Organization ID which signed the contract. + """ + + created_at: Optional[datetime] + """ + The creation date of the contract signature. + """ + + signed_at: Optional[datetime] + """ + The signing date of the contract signature. + """ + + expires_at: Optional[datetime] + """ + The expiration date of the contract signature. + """ + + contract: Optional[Contract] + """ + The contract signed. + """ + + @dataclass class Project: id: str @@ -55,6 +149,117 @@ class Project: """ +@dataclass +class CheckContractSignatureResponse: + created: bool + """ + Whether a signature has been requested for this contract. + """ + + validated: bool + """ + Whether the signature for this contract has been validated. + """ + + +@dataclass +class ContractApiCheckContractSignatureRequest: + contract_name: str + """ + Filter on contract name. + """ + + organization_id: Optional[str] + """ + ID of the Organization to check the contract signature for. + """ + + contract_type: Optional[ContractType] + """ + Filter on contract type. + """ + + +@dataclass +class ContractApiCreateContractSignatureRequest: + contract_name: str + """ + The name of the contract. + """ + + validated: bool + """ + Whether the contract is validated at creation. + """ + + contract_type: Optional[ContractType] + """ + The type of the contract. + """ + + organization_id: Optional[str] + """ + ID of the Organization. + """ + + +@dataclass +class ContractApiDownloadContractSignatureRequest: + contract_signature_id: str + """ + The contract signature ID. + """ + + locale: Optional[StdLanguageCode] + """ + The locale requested for the content of the contract. + """ + + +@dataclass +class ContractApiListContractSignaturesRequest: + page: Optional[int] + """ + The page number for the returned contracts. + """ + + page_size: Optional[int] + """ + The maximum number of contracts per page. + """ + + order_by: Optional[ListContractSignaturesRequestOrderBy] + """ + How the contracts are ordered in the response. + """ + + organization_id: Optional[str] + """ + Filter on Organization ID. + """ + + +@dataclass +class ContractApiValidateContractSignatureRequest: + contract_signature_id: str + """ + The contract linked to your Organization you want to sign. + """ + + +@dataclass +class ListContractSignaturesResponse: + total_count: int + """ + The total number of contract signatures. + """ + + contract_signatures: List[ContractSignature] + """ + The paginated returned contract signatures. + """ + + @dataclass class ListProjectsResponse: total_count: int