diff --git a/src/pyconnectwise/clients/change_request_client.py b/src/pyconnectwise/clients/change_request_client.py index befd74ff..b3428188 100644 --- a/src/pyconnectwise/clients/change_request_client.py +++ b/src/pyconnectwise/clients/change_request_client.py @@ -4,9 +4,10 @@ from pyconnectwise.clients.connectwise_client import ConnectWiseClient from pyconnectwise.config import Config +from pyconnectwise.endpoints.change_request.UsersEndpoint import UsersEndpoint if typing.TYPE_CHECKING: - from pyconnectwise.endpoints.change_request.ChangeRequestEndpoint import ChangeRequestEndpoint + from pyconnectwise.endpoints.change_request.ChangeRequestsEndpoint import ChangeRequestsEndpoint from pyconnectwise.endpoints.change_request.ChangeTypeEndpoint import ChangeTypeEndpoint @@ -63,10 +64,10 @@ def __init__( # Initializing endpoints @property - def change_request(self) -> "ChangeRequestEndpoint": - from pyconnectwise.endpoints.change_request.ChangeRequestEndpoint import ChangeRequestEndpoint + def change_request(self) -> "ChangeRequestsEndpoint": + from pyconnectwise.endpoints.change_request.ChangeRequestsEndpoint import ChangeRequestsEndpoint - return ChangeRequestEndpoint(self) + return ChangeRequestsEndpoint(self) @property def change_type(self) -> "ChangeTypeEndpoint": @@ -104,6 +105,11 @@ def audit_log(self): # Yes, this has a different route than the plural version raise NotImplementedError("audit log singular endpoint not implemented yet.") + @property + def users(self) -> "UsersEndpoint": + from pyconnectwise.endpoints.change_request.UsersEndpoint import UsersEndpoint + return UsersEndpoint(self) + def login(self) -> None: """ Logs in to the ConnectWise Change Approval API and retrieves the new cookie diff --git a/src/pyconnectwise/endpoints/change_request/ChangeRequestEndpoint.py b/src/pyconnectwise/endpoints/change_request/ChangeRequestsEndpoint.py similarity index 99% rename from src/pyconnectwise/endpoints/change_request/ChangeRequestEndpoint.py rename to src/pyconnectwise/endpoints/change_request/ChangeRequestsEndpoint.py index 0b048e1c..66987457 100644 --- a/src/pyconnectwise/endpoints/change_request/ChangeRequestEndpoint.py +++ b/src/pyconnectwise/endpoints/change_request/ChangeRequestsEndpoint.py @@ -11,7 +11,7 @@ from pyconnectwise.clients.connectwise_client import ConnectWiseClient -class ChangeRequestEndpoint( +class ChangeRequestsEndpoint( ConnectWiseEndpoint, IGettable[list[ChangeRequestMsg], ConnectWiseManageRequestParams], IPostable[ChangeRequestMsg, ConnectWiseManageRequestParams], diff --git a/src/pyconnectwise/endpoints/change_request/ChangeTypeEndpoint.py b/src/pyconnectwise/endpoints/change_request/ChangeTypeEndpoint.py index 2137e3f3..9659d2dc 100644 --- a/src/pyconnectwise/endpoints/change_request/ChangeTypeEndpoint.py +++ b/src/pyconnectwise/endpoints/change_request/ChangeTypeEndpoint.py @@ -12,8 +12,6 @@ class ChangeTypeEndpoint( ConnectWiseEndpoint, IGettable[list[ChangeRequestMsg], ConnectWiseManageRequestParams], - IPostable[ChangeRequestMsg, ConnectWiseManageRequestParams], - IPaginateable[ChangeRequestMsg, ConnectWiseManageRequestParams], ): def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None: ConnectWiseEndpoint.__init__(self, client, "change_type", parent_endpoint=parent_endpoint) diff --git a/src/pyconnectwise/endpoints/change_request/UserIdEndpoint.py b/src/pyconnectwise/endpoints/change_request/UserIdEndpoint.py new file mode 100644 index 00000000..56846109 --- /dev/null +++ b/src/pyconnectwise/endpoints/change_request/UserIdEndpoint.py @@ -0,0 +1,31 @@ +from typing import TYPE_CHECKING + +from pyconnectwise.endpoints.base.connectwise_endpoint import ConnectWiseEndpoint +from pyconnectwise.interfaces import IGettable +from pyconnectwise.models.change_request import ChangeRequestMsg, UserIdMsg, UserIdObject +from pyconnectwise.types import JSON, ConnectWiseManageRequestParams + +if TYPE_CHECKING: + from pyconnectwise.clients.connectwise_client import ConnectWiseClient + + +class UserIdEndpoint( + ConnectWiseEndpoint, + IGettable[list[ChangeRequestMsg], ConnectWiseManageRequestParams], +): + def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None: + ConnectWiseEndpoint.__init__(self, client, "{id}", parent_endpoint=parent_endpoint) + IGettable.__init__(self, list[ChangeRequestMsg]) + + def get(self, data: JSON | None = None, params: ConnectWiseManageRequestParams | None = None) -> UserIdMsg: + """ + Performs a GET request against the /api/change_requests endpoint. + + Parameters: + data (dict[str, Any]): The data to send in the request body. + params (dict[str, int | str]): The parameters to send in the request query string. + Returns: + list[ChangeRequestMsg]: The parsed response data. + """ + obj = self._parse_one(UserIdObject, super()._make_request("GET", data=data, params=params).json()) + return obj.msg diff --git a/src/pyconnectwise/endpoints/change_request/UsersEndpoint.py b/src/pyconnectwise/endpoints/change_request/UsersEndpoint.py new file mode 100644 index 00000000..c5fbe423 --- /dev/null +++ b/src/pyconnectwise/endpoints/change_request/UsersEndpoint.py @@ -0,0 +1,42 @@ +from typing import TYPE_CHECKING + +from pyconnectwise.endpoints.base.connectwise_endpoint import ConnectWiseEndpoint +from pyconnectwise.endpoints.change_request.UserIdEndpoint import UserIdEndpoint +from pyconnectwise.interfaces import IGettable +from pyconnectwise.models.change_request import ChangeRequestMsg, ChangeTypeData, UserIdMsg +from pyconnectwise.types import JSON, ConnectWiseManageRequestParams + +if TYPE_CHECKING: + from pyconnectwise.clients.connectwise_client import ConnectWiseClient + + +class UsersEndpoint( + ConnectWiseEndpoint, + IGettable[list[ChangeRequestMsg], ConnectWiseManageRequestParams], +): + def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None: + ConnectWiseEndpoint.__init__(self, client, "users", parent_endpoint=parent_endpoint) + IGettable.__init__(self, list[ChangeTypeData]) + + # TODO - Handle paginated? + + # TODO - Figure out if there are other endpoints! + # TODO - Handle the fact that the TLD is different! + + def id(self, _id: str) -> UserIdEndpoint: + child = UserIdEndpoint(self.client, parent_endpoint=self) + child._id = _id + return child + + def get(self, data: JSON | None = None, params: ConnectWiseManageRequestParams | None = None) -> list[UserIdMsg]: + """ + Performs a GET request against the /api/change_requests endpoint. + + Parameters: + data (dict[str, Any]): The data to send in the request body. + params (dict[str, int | str]): The parameters to send in the request query string. + Returns: + list[ChangeTypeData]: The parsed response data. + """ + # TODO - Throw out the msg total, current information + return self._parse_many(UserIdMsg, super()._make_request("GET", data=data, params=params).json()) diff --git a/src/pyconnectwise/models/change_request/__init__.py b/src/pyconnectwise/models/change_request/__init__.py index efa69dda..1f1a3727 100644 --- a/src/pyconnectwise/models/change_request/__init__.py +++ b/src/pyconnectwise/models/change_request/__init__.py @@ -245,3 +245,25 @@ class ChangeTypeMsg(ConnectWiseModel): class ChangeTypeObject(ConnectWiseModel): status: Annotated[str | None, Field(alias="status")] = None msg: Annotated[ChangeTypeMsg | None, Field(alias="msg")] = None + + +class UserIdMsg(ConnectWiseModel): + id: Annotated[str | None, Field(alias="_id")] = None + user_name: Annotated[str | None, Field(alias="userName")] = None + company: Annotated[str | None, Field(alias="company")] = None + domain: Annotated[str | None, Field(alias="domain")] = None + role: Annotated[str | None, Field(alias="role")] = None + password: Annotated[str | None, Field(alias="password")] = None + status: Annotated[str | None, Field(alias="status")] = None + wizard_complete: Annotated[bool | None, Field(alias="wizardComplete")] = None + direct_ticket_url: Annotated[bool | None, Field(alias="directTicketUrl")] = None + partner_id: Annotated[str | None, Field(alias="partnerId")] = None + api_key: Annotated[str | None, Field(alias="apiKey")] = None + created: Annotated[int | None, Field(alias="created")] = None + updated: Annotated[int | None, Field(alias="updated")] = None + is_agree: Annotated[bool | None, Field(alias="isAgree")] = None + + +class UserIdObject(ConnectWiseModel): + status: Annotated[str | None, Field(alias="status")] = None + msg: Annotated[UserIdMsg | None, Field(alias="msg")] = None diff --git a/tests/clients/test_change_approvals.py b/tests/clients/test_change_approvals.py index c5065d4d..2b2ac112 100644 --- a/tests/clients/test_change_approvals.py +++ b/tests/clients/test_change_approvals.py @@ -43,6 +43,15 @@ def test_get_change_approval(): assert change_approval.id == change_request_id +def test_get_user(): + # Testing with real data. :D + test_id = "642bfee39d2d780477bdc662" + client = change_approval_client_init() + client.login() + user_info = client.users.id(test_id).get() + assert user_info.id == test_id + + def test_login(): client = change_approval_client_init() client.login()