diff --git a/pyproject.toml b/pyproject.toml index a258725..4aa5d47 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pysimplesat" -version = "0.1.5" +version = "0.1.6" 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 c97143b..a180b6f 100644 --- a/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/AnswersSearchEndpoint.py @@ -25,7 +25,6 @@ class AnswersSearchEndpoint( def paginated( self, page: int, - limit: int, params: SimpleSatRequestParams | None = None, ) -> PaginatedResponse[Answer]: """ @@ -33,23 +32,20 @@ class AnswersSearchEndpoint( 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 + params["page"] = page else: - params = {"page[number]": page, "page[size]": limit} + params = {"page": page} return PaginatedResponse( super()._make_request("POST", params=params), Answer, self, "answers", page, - limit, params, ) diff --git a/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py b/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py index 25e78d6..83a5141 100644 --- a/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/QuestionsEndpoint.py @@ -24,7 +24,6 @@ class QuestionsEndpoint( def paginated( self, page: int, - limit: int, params: SimpleSatRequestParams | None = None, ) -> PaginatedResponse[Question]: """ @@ -32,23 +31,20 @@ class QuestionsEndpoint( 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[Question]: The initialized PaginatedResponse object. """ if params: - params["page[number]"] = page - params["page[size]"] = limit + params["page"] = page else: - params = {"page[number]": page, "page[size]": limit} + params = {"page": page} return PaginatedResponse( super()._make_request("GET", params=params), Question, self, "questions", page, - limit, params, ) diff --git a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py index 63163b2..de93df2 100644 --- a/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py +++ b/src/pysimplesat/endpoints/simplesat/ResponsesSearchEndpoint.py @@ -25,7 +25,6 @@ class ResponsesSearchEndpoint( def paginated( self, page: int, - limit: int, params: SimpleSatRequestParams | None = None, ) -> PaginatedResponse[Response]: """ @@ -33,28 +32,23 @@ class ResponsesSearchEndpoint( 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 + params["page"] = page else: - params = {"page[number]": page, "page[size]": limit} + params = {"page[number]": page} 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: """ Performs a POST request against the /responses/search endpoint. diff --git a/src/pysimplesat/interfaces.py b/src/pysimplesat/interfaces.py index f78b6f2..d52858a 100644 --- a/src/pysimplesat/interfaces.py +++ b/src/pysimplesat/interfaces.py @@ -30,8 +30,7 @@ class IPaginateable(IMethodBase, Generic[TModel, TRequestParams]): @abstractmethod def paginated( self, - page: int, - page_size: int, + page: int | None = 1, params: TRequestParams | None = None, ) -> PaginatedResponse[TModel]: pass diff --git a/src/pysimplesat/responses/paginated_response.py b/src/pysimplesat/responses/paginated_response.py index 490a720..1e6a1dc 100644 --- a/src/pysimplesat/responses/paginated_response.py +++ b/src/pysimplesat/responses/paginated_response.py @@ -42,7 +42,6 @@ class PaginatedResponse(Generic[TModel]): endpointmodel: IPaginateable, endpoint: str, page: int, - limit: int, params: RequestParams | None = None, ) -> None: """ @@ -58,7 +57,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, limit, params) + self._initialize(response, response_model, endpointmodel, endpoint, page, params) def _initialize( self, @@ -67,7 +66,6 @@ class PaginatedResponse(Generic[TModel]): endpointmodel: IPaginateable, endpoint: str, page: int, - limit: int, params: RequestParams | None = None, ): """ @@ -77,30 +75,25 @@ class PaginatedResponse(Generic[TModel]): 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 - limit (int): The number of items per page. """ self.response = response self.response_model = response_model self.endpointmodel = endpointmodel self.endpoint = endpoint - self.limit = limit # Get page data from the response body - try: - self.parsed_pagination_response = parse_response_body(json.loads(response.content.decode('utf-8'))) - if self.parsed_pagination_response is not None: - # SimpleSat API gives us a handy response to parse for Pagination - self.has_next_page: bool = self.parsed_pagination_response.get("has_next_page", False) - self.has_prev_page: bool = self.parsed_pagination_response.get("has_prev_page", False) - self.prev_page: int = self.parsed_pagination_response.get("prev_page", None) - self.next_page: int = self.parsed_pagination_response.get("next_page", None) - else: - # Haven't worked on this yet - self.has_next_page: bool = True - self.has_prev_page: bool = page > 1 - self.prev_page = page - 1 if page > 1 else 1 - self.next_page = page + 1 - except: - pass + self.parsed_pagination_response = parse_response_body(json.loads(response.content.decode('utf-8'))) + if self.parsed_pagination_response is not None: + # SimpleSat API gives us a handy response to parse for Pagination + self.has_next_page: bool = self.parsed_pagination_response.get("has_next_page", False) + self.has_prev_page: bool = self.parsed_pagination_response.get("has_prev_page", False) + self.prev_page: int = self.parsed_pagination_response.get("prev_page", None) + self.next_page: int = self.parsed_pagination_response.get("next_page", None) + else: + self.has_next_page: bool = True + self.has_prev_page: bool = page > 1 + self.prev_page = page - 1 if page > 1 else 1 + self.next_page = page + 1 + print(self.parsed_pagination_response) self.params = params 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 @@ -118,14 +111,13 @@ class PaginatedResponse(Generic[TModel]): self.has_data = False return self - next_response = self.endpointmodel.paginated(self.next_page, self.limit, self.params) + next_response = self.endpointmodel.paginated(self.next_page, self.params) self._initialize( next_response.response, next_response.response_model, next_response.endpointmodel, next_response.endpoint, self.next_page, - next_response.limit, self.params, ) return self @@ -142,13 +134,12 @@ class PaginatedResponse(Generic[TModel]): self.has_data = False return self - prev_response = self.endpointmodel.paginated(self.prev_page, self.limit, self.params) + prev_response = self.endpointmodel.paginated(self.prev_page, self.params) self._initialize( prev_response.response, prev_response.response_model, prev_response.endpointmodel, self.prev_page, - prev_response.limit, self.params, ) return self diff --git a/src/pysimplesat/types.py b/src/pysimplesat/types.py index 62b766c..12a90e2 100644 --- a/src/pysimplesat/types.py +++ b/src/pysimplesat/types.py @@ -21,7 +21,6 @@ class SimpleSatRequestParams(TypedDict): customFieldConditions: NotRequired[str] page_token: NotRequired[str] page: NotRequired[int] - limit: NotRequired[int] organization_id: NotRequired[int] platform: NotRequired[str] status: NotRequired[str] diff --git a/src/pysimplesat/utils/helpers.py b/src/pysimplesat/utils/helpers.py index 01d853d..79f08d3 100644 --- a/src/pysimplesat/utils/helpers.py +++ b/src/pysimplesat/utils/helpers.py @@ -65,8 +65,12 @@ def parse_response_body( previous: str | None = None result = {} + print(body) if body["previous"] is not None: - result["prev_page"] = parse_qs(urlparse(body["previous"]).query)['page'][0] + try: + result["prev_page"] = parse_qs(urlparse(body["previous"]).query)['page'][0] + except: + result["prev_page"] = 1 if body["next"] is not None: result["next_page"] = parse_qs(urlparse(body["next"]).query)['page'][0] diff --git a/src/simplesat_scratchpad.py b/src/simplesat_scratchpad.py index e4886c2..55a457f 100644 --- a/src/simplesat_scratchpad.py +++ b/src/simplesat_scratchpad.py @@ -14,7 +14,8 @@ simplesat_api_client = SimpleSatAPIClient( #surveys = simplesat_api_client.surveys.get() #print(surveys) -page_answers = simplesat_api_client.answers.search.paginated(1,1000) -answers = page_answers.all() -print(answers) -#print(answers.data) \ No newline at end of file +page_responses = simplesat_api_client.responses.search.paginated(1) +responses = page_responses.all() +print(responses) +for response in responses: + print(response.id) \ No newline at end of file