From 18ba951ea9e1b2a2cf2a2c1c88d4215ed2e23783 Mon Sep 17 00:00:00 2001 From: Peter Annabel Date: Fri, 1 Aug 2025 08:27:09 -0500 Subject: [PATCH] Handled pagination for the search post requests --- .../simplesat/AnswersSearchEndpoint.py | 36 ++++++++++++++++++- .../simplesat/ResponsesSearchEndpoint.py | 36 +++++++++++++++++++ src/pysimplesat/models/simplesat/__init__.py | 4 +-- src/simplesat_scratchpad.py | 8 +++-- 4 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py b/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py index c9371c3..c97143b 100644 --- a/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py @@ -1,8 +1,10 @@ from pysimplesat.endpoints.base.base_endpoint import SimpleSatEndpoint from pysimplesat.interfaces import ( IPostable, + IPaginateable, ) from pysimplesat.models.simplesat import Answer +from pysimplesat.responses.paginated_response import PaginatedResponse from pysimplesat.types import ( JSON, SimpleSatRequestParams, @@ -12,13 +14,45 @@ from pysimplesat.types import ( class AnswersSearchEndpoint( SimpleSatEndpoint, IPostable[Answer, SimpleSatRequestParams], + IPaginateable[Answer, SimpleSatRequestParams], ): def __init__(self, client, parent_endpoint=None) -> None: SimpleSatEndpoint.__init__(self, client, "search", parent_endpoint=parent_endpoint) IPostable.__init__(self, Answer) + IPaginateable.__init__(self, Answer) + + def paginated( + self, + page: int, + limit: int, + params: SimpleSatRequestParams | None = None, + ) -> PaginatedResponse[Answer]: + """ + Performs a POST request against the /answers/search endpoint and returns an initialized PaginatedResponse object. + + Parameters: + page (int): The page number to request. + limit (int): The number of results to return per page. + params (dict[str, int | str]): The parameters to send in the request query string. + Returns: + PaginatedResponse[Answer]: The initialized PaginatedResponse object. + """ + if params: + params["page[number]"] = page + params["page[size]"] = limit + else: + params = {"page[number]": page, "page[size]": limit} + return PaginatedResponse( + super()._make_request("POST", params=params), + Answer, + self, + "answers", + page, + limit, + params, + ) - #TODO: How do I paginate a post? def post(self, data: JSON | None = None, params: SimpleSatRequestParams | None = None) -> Answer: """ Performs a POST request against the /answers/search endpoint. diff --git a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py index 2b51879..63163b2 100644 --- a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py @@ -1,8 +1,10 @@ from pysimplesat.endpoints.base.base_endpoint import SimpleSatEndpoint from pysimplesat.interfaces import ( IPostable, + IPaginateable, ) from pysimplesat.models.simplesat import Response +from pysimplesat.responses.paginated_response import PaginatedResponse from pysimplesat.types import ( JSON, SimpleSatRequestParams, @@ -12,11 +14,45 @@ from pysimplesat.types import ( class ResponsesSearchEndpoint( SimpleSatEndpoint, IPostable[Response, SimpleSatRequestParams], + IPaginateable[Response, SimpleSatRequestParams], ): def __init__(self, client, parent_endpoint=None) -> None: SimpleSatEndpoint.__init__(self, client, "search", parent_endpoint=parent_endpoint) IPostable.__init__(self, Response) + IPaginateable.__init__(self, Response) + + def paginated( + self, + page: int, + limit: int, + params: SimpleSatRequestParams | None = None, + ) -> PaginatedResponse[Response]: + """ + Performs a POST request against the /responses/search endpoint and returns an initialized PaginatedResponse object. + + Parameters: + page (int): The page number to request. + limit (int): The number of results to return per page. + params (dict[str, int | str]): The parameters to send in the request query string. + Returns: + PaginatedResponse[Response]: The initialized PaginatedResponse object. + """ + if params: + params["page[number]"] = page + params["page[size]"] = limit + else: + params = {"page[number]": page, "page[size]": limit} + return PaginatedResponse( + super()._make_request("POST", params=params), + Response, + self, + "responses", + page, + limit, + params, + ) + #TODO: How do I paginate a post? def post(self, data: JSON | None = None, params: SimpleSatRequestParams | None = None) -> Response: diff --git a/src/pysimplesat/models/simplesat/__init__.py b/src/pysimplesat/models/simplesat/__init__.py index 157d296..c91c770 100644 --- a/src/pysimplesat/models/simplesat/__init__.py +++ b/src/pysimplesat/models/simplesat/__init__.py @@ -55,8 +55,8 @@ class TeamMember(SimpleSatModel): class Response(SimpleSatModel): survey_id: int | None = Field(default=None, alias="SurveyId") tags: list | None = Field(default=None, alias="Tags") - answers: dict[str, Any] | None = Field(default=None, alias="Answers") - team_members: dict[str, Any] | None = Field(default=None, alias="TeamMembers") + answers: list[dict[str, Any]] | None = Field(default=None, alias="Answers") + team_members: list[dict[str, Any]] | None = Field(default=None, alias="TeamMembers") ticket: dict[str, Any] | None = Field(default=None, alias="Ticket") customer: dict[str, Any] | None = Field(default=None, alias="Customer") diff --git a/src/simplesat_scratchpad.py b/src/simplesat_scratchpad.py index 4fab02b..6925aac 100644 --- a/src/simplesat_scratchpad.py +++ b/src/simplesat_scratchpad.py @@ -11,5 +11,9 @@ simplesat_api_client = SimpleSatAPIClient( privatekey, ) -#account = simplesat_api_client.account.get() -#print(account) +#surveys = simplesat_api_client.surveys.get() +#print(surveys) + +answers = simplesat_api_client.responses.search.paginated(1,5) +print(answers) +print(answers.data) \ No newline at end of file