Skip to content

Commit

Permalink
feat: set_settings endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
fundthmcalculus committed Sep 23, 2024
1 parent 55ea088 commit 431a180
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/pyconnectwise/clients/change_request_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from pyconnectwise.endpoints.change_request import GetStatsEndpoint
from pyconnectwise.endpoints.change_request.AclsRolesEndpoint import AclsRolesEndpoint
from pyconnectwise.endpoints.change_request.LoginEndpoint import LoginEndpoint
from pyconnectwise.endpoints.change_request.SettingsEndpoint import SettingsEndpoint
from pyconnectwise.endpoints.change_request.TemplateEndpoint import TemplateEndpoint
from pyconnectwise.endpoints.change_request.UsersEndpoint import UsersEndpoint
from pyconnectwise.models.change_request import LoginMsg, LoginObject
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from typing import TYPE_CHECKING

from pyconnectwise.endpoints.base.connectwise_endpoint import ConnectWiseEndpoint
from pyconnectwise.endpoints.change_request.SetSettingsEndpoint import SetSettingsEndpoint
from pyconnectwise.interfaces import IGettable, IPostable
from pyconnectwise.models.change_request import SettingsData, SettingsObject, SetSettingsMsg
from pyconnectwise.types import JSON, ConnectWiseChangeApprovalRequestParams

if TYPE_CHECKING:
from pyconnectwise.clients.connectwise_client import ConnectWiseClient


class DefaultSettingsEndpoint(
ConnectWiseEndpoint,
):
def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None:
ConnectWiseEndpoint.__init__(self, client, "DefaultSettings", parent_endpoint=parent_endpoint)

@property
def set_settings(self) -> SetSettingsEndpoint:
return SetSettingsEndpoint(self.client, parent_endpoint=self)

33 changes: 33 additions & 0 deletions src/pyconnectwise/endpoints/change_request/SetSettingsEndpoint.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
from typing import TYPE_CHECKING

from pyconnectwise.endpoints.base.connectwise_endpoint import ConnectWiseEndpoint
from pyconnectwise.interfaces import IGettable, IPostable
from pyconnectwise.models.change_request import SettingsData, SettingsObject, SetSettingsMsg, SetSettingsObject
from pyconnectwise.types import JSON, ConnectWiseChangeApprovalRequestParams

if TYPE_CHECKING:
from pyconnectwise.clients.connectwise_client import ConnectWiseClient


class SetSettingsEndpoint(
ConnectWiseEndpoint,
IPostable[SetSettingsMsg, ConnectWiseChangeApprovalRequestParams],
):
def __init__(self, client: "ConnectWiseClient", parent_endpoint: ConnectWiseEndpoint = None) -> None:
ConnectWiseEndpoint.__init__(self, client, "set_settings", parent_endpoint=parent_endpoint)

def post(
self, data: JSON | None = None, params: ConnectWiseChangeApprovalRequestParams | None = None
) -> SetSettingsMsg:
"""
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(SetSettingsObject, super()._make_request("POST", data=data, params=params).json())
return obj.msg

12 changes: 12 additions & 0 deletions src/pyconnectwise/endpoints/change_request/SettingsEndpoint.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import TYPE_CHECKING

from pyconnectwise.endpoints.base.connectwise_endpoint import ConnectWiseEndpoint
from pyconnectwise.endpoints.change_request.DefaultSettingsEndpoint import DefaultSettingsEndpoint
from pyconnectwise.interfaces import IGettable
from pyconnectwise.models.change_request import SettingsData, SettingsObject
from pyconnectwise.types import JSON, ConnectWiseChangeApprovalRequestParams
Expand Down Expand Up @@ -32,3 +33,14 @@ def get(
obj = self._parse_one(SettingsObject, super()._make_request("GET", data=data, params=params).json())
# TODO - `total`, `current`, which is paginated?
return obj.msg.data

@property
def default_settings(self) -> DefaultSettingsEndpoint:
"""
Get the default settings for change requests.
Returns:
SettingsData: The parsed response data.
"""
return DefaultSettingsEndpoint(self.client, parent_endpoint=self)

19 changes: 19 additions & 0 deletions src/pyconnectwise/models/change_request/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -404,3 +404,22 @@ class TemplateMsg(ConnectWiseModel):
class TemplateObject(ConnectWiseModel):
status: Annotated[str | None, Field(alias="status")] = None
msg: Annotated[TemplateMsg | None, Field(alias="msg")] = None


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


class SetSettingsMsg(ConnectWiseModel):
id: Annotated[str | None, Field(alias="_id")] = None
options: Annotated[SetSettingsOptions | 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 SetSettingsObject(ConnectWiseModel):
status: Annotated[str | None, Field(alias="status")] = None
msg: Annotated[SetSettingsMsg | None, Field(alias="msg")] = None
2 changes: 2 additions & 0 deletions src/pyconnectwise/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ class ConnectWiseManageRequestParams(TypedDict):

class ConnectWiseChangeApprovalRequestParams(TypedDict):
perColConditions: NotRequired[dict[str, str]]
skip: NotRequired[int]
limit: NotRequired[int]
orderBy: NotRequired[list[dict[str, str]]]


Expand Down
31 changes: 30 additions & 1 deletion tests/clients/test_change_approvals.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ def test_get_change_approval():
change_approval = client.change_request.id(change_request_id).get()
assert change_approval.id == change_request_id
change_approvals = client.change_request.get(params=ConnectWiseChangeApprovalRequestParams(orderBy=[{"updated": -1}]))
assert len(change_approvals) > 0
assert len(change_approvals) > 20
change_approvals = client.change_request.get(params=ConnectWiseChangeApprovalRequestParams(skip=0, limit=20, orderBy=[{"updated": -1}]))
assert len(change_approvals) == 20


def test_get_user():
Expand Down Expand Up @@ -102,6 +104,33 @@ def test_get_stats():
assert len(final_stats) > 0


def test_set_default_settings():
client = change_approval_client_init()
client.auth_login()
# TODO - Make this data object cleaner?
final_stats = client.settings.default_settings.set_settings.post(data={"params": {
"options": {
"hideClosedCr": True,
"latestPerFormat": 196,
}
}})
assert final_stats is not None
assert final_stats.name == "DefaultSettings"
assert final_stats.options.hide_closed_cr is True
assert final_stats.options.latest_per_format == 196
# Reset the settings
final_stats = client.settings.default_settings.set_settings.post(data={"params": {
"options": {
"hideClosedCr": False,
"latestPerFormat": 195,
}
}})
assert final_stats is not None
assert final_stats.name == "DefaultSettings"
assert final_stats.options.hide_closed_cr is False
assert final_stats.options.latest_per_format == 195


def test_login():
client = change_approval_client_init()
client.auth_login()
Expand Down

0 comments on commit 431a180

Please sign in to comment.