Skip to content

Commit

Permalink
feat: Settings endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
fundthmcalculus committed Sep 23, 2024
1 parent ec41438 commit b303d1e
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 2 deletions.
5 changes: 5 additions & 0 deletions src/pyconnectwise/clients/change_request_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,11 @@ def login(self) -> "LoginEndpoint":
from pyconnectwise.endpoints.change_request.LoginEndpoint import LoginEndpoint
return LoginEndpoint(self)

@property
def settings(self) -> "SettingsEndpoint":
from pyconnectwise.endpoints.change_request.SettingsEndpoint import SettingsEndpoint
return SettingsEndpoint(self)

def auth_login(self) -> None:
"""
Logs in to the ConnectWise Change Approval API and retrieves the new cookie
Expand Down
32 changes: 32 additions & 0 deletions src/pyconnectwise/endpoints/change_request/SettingsEndpoint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
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, SettingsData, SettingsObject
from pyconnectwise.types import JSON, ConnectWiseChangeApprovalRequestParams

if TYPE_CHECKING:
from pyconnectwise.clients.connectwise_client import ConnectWiseClient


class SettingsEndpoint(
ConnectWiseEndpoint,
IGettable[list[SettingsData], ConnectWiseChangeApprovalRequestParams],
):
def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None:
ConnectWiseEndpoint.__init__(self, client, "settings", parent_endpoint=parent_endpoint)
IGettable.__init__(self, list[SettingsData])

def get(self, data: JSON | None = None, params: ConnectWiseChangeApprovalRequestParams | None = None) -> list[SettingsData]:
"""
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(SettingsObject, super()._make_request("GET", data=data, params=params).json())
# TODO - `total`, `current`, which is paginated?
return obj.msg.data
25 changes: 25 additions & 0 deletions src/pyconnectwise/models/change_request/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,31 @@ class LoginMsg(ConnectWiseModel):
is_instance_login: Annotated[bool | None, Field(alias="isInstanceLogin")] = None


class SettingsOptions(ConnectWiseModel):
hide_closed_cr: Annotated[bool | None, Field(alias="hideClosedCr")] = None
latest_per_format: Annotated[int | None, Field(alias="latestPerFormat")] = None


class LoginObject(ConnectWiseModel):
status: Annotated[str | None, Field(alias="status")] = None
msg: Annotated[LoginMsg | None, Field(alias="msg")] = None


class SettingsData(ConnectWiseModel):
_id: Annotated[str | None, Field(alias="_id")] = None
options: Annotated[SettingsOptions | None, Field(alias="options")] = None
name: Annotated[str | None, Field(alias="name")] = None
partner_id: Annotated[str | None, Field(alias="partnerId")] = None
created: Annotated[int | None, Field(alias="created")] = None
updated: Annotated[int | None, Field(alias="updated")] = None


class SettingsMsg(ConnectWiseModel):
total: Annotated[int | None, Field(alias="total")] = None
current: Annotated[int | None, Field(alias="current")] = None
data: Annotated[list[SettingsData] | None, Field(alias="data")] = None


class SettingsObject(ConnectWiseModel):
status: Annotated[str | None, Field(alias="status")] = None
msg: Annotated[SettingsMsg | None, Field(alias="msg")] = None
2 changes: 1 addition & 1 deletion src/pyconnectwise/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class ConnectWiseAutomateRequestParams(TypedDict):


GenericRequestParams: TypeAlias = dict[str, Literals]
RequestParams: TypeAlias = ConnectWiseManageRequestParams | ConnectWiseAutomateRequestParams | GenericRequestParams
RequestParams: TypeAlias = ConnectWiseManageRequestParams | ConnectWiseChangeApprovalRequestParams | ConnectWiseAutomateRequestParams | GenericRequestParams
PatchRequestData: TypeAlias = list[Patch]
RequestData: TypeAlias = JSON | PatchRequestData
RequestMethod: TypeAlias = Literal["GET", "POST", "PUT", "PATCH", "DELETE"]
13 changes: 12 additions & 1 deletion tests/clients/test_change_approvals.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

from pyconnectwise.clients.change_request_client import ConnectWiseChangeApprovalClient
import pathlib

from pyconnectwise.types import ConnectWiseChangeApprovalRequestParams

current_path = pathlib.Path(__file__).parent.resolve()
# In current directory, load the .env file
assert load_dotenv(os.path.join(current_path,".env"))
Expand Down Expand Up @@ -59,7 +62,15 @@ def test_get_acl_roles():
assert obj_data is not None
assert len(obj_data) > 0

obj_filter_data = client.acl_roles.get(params={"Member_RecID": client.login_msg.rec_id})
obj_filter_data = client.acl_roles.get(params=ConnectWiseChangeApprovalRequestParams(perColConditions={"Member_RecID": client.login_msg.rec_id}))
assert obj_filter_data is not None
assert len(obj_filter_data) > 0


def test_get_settings():
client = change_approval_client_init()
client.auth_login()
obj_filter_data = client.settings.get(params=ConnectWiseChangeApprovalRequestParams(perColConditions={"name": "DefaultSettings"}))
assert obj_filter_data is not None
assert len(obj_filter_data) > 0

Expand Down

0 comments on commit b303d1e

Please sign in to comment.