From 80010f5b91176268a3c4bc5e2ffeceb146ff3c36 Mon Sep 17 00:00:00 2001 From: Peter Annabel Date: Wed, 6 Aug 2025 21:28:30 -0500 Subject: [PATCH] Fixed pagination. again because I'm a dumb dumb that passed parameters in the wrong order --- pyproject.toml | 2 +- .../simplesat/AnswersSearchEndpoint.py | 6 +-- .../endpoints/simplesat/QuestionsEndpoint.py | 6 +-- .../simplesat/ResponsesSearchEndpoint.py | 8 ++-- src/pysimplesat/interfaces.py | 2 +- .../responses/paginated_response.py | 46 +++++++++---------- src/simplesat_scratchpad.py | 7 +-- 7 files changed, 39 insertions(+), 38 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 356084f..54a0b90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pysimplesat" -version = "0.1.8" +version = "0.1.9" authors = [ { name="Peter Annabel", email="peter.annabel@gmail.com" }, ] diff --git a/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py b/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py index 1f46570..f979c0b 100644 --- a/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py @@ -26,7 +26,7 @@ class AnswersSearchEndpoint( self, page: int, params: SimpleSatRequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ) -> PaginatedResponse[Answer]: """ Performs a POST request against the /answers/search endpoint and returns an initialized PaginatedResponse object. @@ -42,13 +42,13 @@ class AnswersSearchEndpoint( else: params = {"page": page} return PaginatedResponse( - super()._make_request("POST", data=body, params=params), + super()._make_request("POST", data=data, params=params), Answer, self, "answers", page, params, - body, + data, ) def post(self, data: JSON | None = None, params: SimpleSatRequestParams | None = None) -> Answer: diff --git a/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py b/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py index 469b541..6ee0f34 100644 --- a/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py @@ -25,7 +25,7 @@ class QuestionsEndpoint( self, page: int, params: SimpleSatRequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ) -> PaginatedResponse[Question]: """ Performs a GET request against the /questions endpoint and returns an initialized PaginatedResponse object. @@ -41,13 +41,13 @@ class QuestionsEndpoint( else: params = {"page": page} return PaginatedResponse( - super()._make_request("GET", data=body, params=params), + super()._make_request("GET", data=data, params=params), Question, self, "questions", page, params, - body, + data, ) def get( diff --git a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py index 3a5deb3..55e721b 100644 --- a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py @@ -26,7 +26,7 @@ class ResponsesSearchEndpoint( self, page: int, params: SimpleSatRequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ) -> PaginatedResponse[Response]: """ Performs a POST request against the /responses/search endpoint and returns an initialized PaginatedResponse object. @@ -40,15 +40,15 @@ class ResponsesSearchEndpoint( if params: params["page"] = page else: - params = {"page[number]": page} + params = {"page": page} return PaginatedResponse( - super()._make_request("POST", data=body, params=params), + super()._make_request("POST", data=data, params=params), Response, self, "responses", page, params, - body, + data, ) def post(self, data: JSON | None = None, params: SimpleSatRequestParams | None = None) -> Response: diff --git a/src/pysimplesat/interfaces.py b/src/pysimplesat/interfaces.py index caec70f..3091b76 100644 --- a/src/pysimplesat/interfaces.py +++ b/src/pysimplesat/interfaces.py @@ -32,7 +32,7 @@ class IPaginateable(IMethodBase, Generic[TModel, TRequestParams]): self, page: int | None = 1, params: TRequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ) -> PaginatedResponse[TModel]: pass diff --git a/src/pysimplesat/responses/paginated_response.py b/src/pysimplesat/responses/paginated_response.py index d344961..9348106 100644 --- a/src/pysimplesat/responses/paginated_response.py +++ b/src/pysimplesat/responses/paginated_response.py @@ -43,7 +43,7 @@ class PaginatedResponse(Generic[TModel]): endpoint: str, page: int, params: RequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ) -> None: """ PaginatedResponse is a wrapper class for handling paginated responses from the @@ -58,7 +58,7 @@ class PaginatedResponse(Generic[TModel]): expected model type for the response data. This allows for type-safe handling of model instances throughout the class. """ - self._initialize(response, response_model, endpointmodel, endpoint, page, body, params) + self._initialize(response, response_model, endpointmodel, endpoint, page, params, data) def _initialize( self, @@ -68,7 +68,7 @@ class PaginatedResponse(Generic[TModel]): endpoint: str, page: int, params: RequestParams | None = None, - body: JSON | None = None, + data: JSON | None = None, ): """ Initialize the instance variables using the provided response, endpointmodel, and page size. @@ -76,7 +76,7 @@ class PaginatedResponse(Generic[TModel]): Args: response: The raw response object from the API. endpointmodel (SimpleSatEndpoint[TModel]): The endpointmodel associated with the response. - endpoint: The endpoint url to extract the data + endpoint: The endpoint url to extract the apidata """ self.response = response self.response_model = response_model @@ -96,9 +96,9 @@ class PaginatedResponse(Generic[TModel]): self.prev_page = page - 1 if page > 1 else 1 self.next_page = page + 1 self.params = params - self.body = body - self.data: list[TModel] = [response_model.model_validate(d) for d in response.json().get(endpoint, {})] - self.has_data = self.data and len(self.data) > 0 + self.data = data + self.apidata: list[TModel] = [response_model.model_validate(d) for d in response.json().get(endpoint, {})] + self.has_apidata = self.apidata and len(self.apidata) > 0 self.index = 0 def get_next_page(self) -> PaginatedResponse[TModel]: @@ -107,13 +107,13 @@ class PaginatedResponse(Generic[TModel]): Returns: PaginatedResponse[TModel]: The updated PaginatedResponse instance - with the data from the next page or None if there is no next page. + with the apidata from the next page or None if there is no next page. """ if not self.has_next_page or not self.next_page: - self.has_data = False + self.has_apidata = False return self - next_response = self.endpointmodel.paginated(self.next_page, self.params, self.body) + next_response = self.endpointmodel.paginated(self.next_page, self.params, self.data) self._initialize( next_response.response, next_response.response_model, @@ -121,7 +121,7 @@ class PaginatedResponse(Generic[TModel]): next_response.endpoint, self.next_page, self.params, - self.body, + self.data, ) return self @@ -131,20 +131,20 @@ class PaginatedResponse(Generic[TModel]): Returns: PaginatedResponse[TModel]: The updated PaginatedResponse instance - with the data from the next page or None if there is no next page. + with the apidata from the next page or None if there is no next page. """ if not self.has_prev_page or not self.prev_page: - self.has_data = False + self.has_apidata = False return self - prev_response = self.endpointmodel.paginated(self.prev_page, self.params, self.body) + prev_response = self.endpointmodel.paginated(self.prev_page, self.params, self.data) self._initialize( prev_response.response, prev_response.response_model, prev_response.endpointmodel, self.prev_page, self.params, - self.body, + self.data, ) return self @@ -155,8 +155,8 @@ class PaginatedResponse(Generic[TModel]): Yields: TModel: An instance of the model class for each item in the paginated response. """ - while self.has_data: - yield from self.data + while self.has_apidata: + yield from self.apidata self.get_next_page() def __iter__(self): @@ -175,20 +175,20 @@ class PaginatedResponse(Generic[TModel]): Returns: PaginatedResponse[TModel]: The current instance of the PaginatedResponse. """ - return self.data + return self.apidata def __next__(self): """ - Implement the iterator protocol by getting the next item in the data. + Implement the iterator protocol by getting the next item in the apidata. Returns: - TModel: The next item in the data. + TModel: The next item in the apidata. Raises: - StopIteration: If there are no more items in the data. + StopIteration: If there are no more items in the apidata. """ - if self.index < len(self.data): - result = self.data[self.index] + if self.index < len(self.apidata): + result = self.apidata[self.index] self.index += 1 return result else: diff --git a/src/simplesat_scratchpad.py b/src/simplesat_scratchpad.py index a506445..73a40a9 100644 --- a/src/simplesat_scratchpad.py +++ b/src/simplesat_scratchpad.py @@ -13,10 +13,11 @@ simplesat_api_client = SimpleSatAPIClient( #surveys = simplesat_api_client.surveys.get() #print(surveys) -body = {"start_date": "2025-04-11T17:00:00Z"} +data = {"start_date": "2015-04-11T17:00:00Z"} -page_responses = simplesat_api_client.responses.search.paginated(1, body=body) +page_responses = simplesat_api_client.responses.search.paginated(1, data=data) responses = page_responses.all() print(responses) for response in responses: - print(response.id) \ No newline at end of file + pass +# print(response.id) \ No newline at end of file