From 40a6951d517e509e0aee970a0d0baa132fd21c28 Mon Sep 17 00:00:00 2001 From: gionata405 Date: Fri, 27 Feb 2026 20:18:47 +0000 Subject: [PATCH] Add support for QA Checks Revalidation methods Implements three new methods on TranslationStatusResource: - start_qa_checks_revalidation(): POST /projects/{id}/qa-checks/revalidate - get_qa_checks_revalidation_status(): GET /projects/{id}/qa-checks/revalidate - cancel_qa_checks_revalidation(): DELETE /projects/{id}/qa-checks/revalidate Closes #236 --- .../translation_status/resource.py | 61 +++++++++++++++++++ .../test_translation_status_resources.py | 33 ++++++++++ 2 files changed, 94 insertions(+) diff --git a/crowdin_api/api_resources/translation_status/resource.py b/crowdin_api/api_resources/translation_status/resource.py index e438324..7a150d0 100644 --- a/crowdin_api/api_resources/translation_status/resource.py +++ b/crowdin_api/api_resources/translation_status/resource.py @@ -134,6 +134,67 @@ def get_project_progress( params=params, ) + def start_qa_checks_revalidation( + self, + projectId: Optional[int] = None, + ): + """ + Start QA Checks Revalidation. + + Triggers a new QA checks revalidation job for the project. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Translation-Status/operation/api.projects.qa-checks.revalidate.post + """ + + projectId = projectId or self.get_project_id() + + return self.requester.request( + method="post", + path=f"projects/{projectId}/qa-checks/revalidate", + ) + + def get_qa_checks_revalidation_status( + self, + projectId: Optional[int] = None, + ): + """ + Get QA Checks Revalidation Status. + + Returns the status of the currently running or last completed QA checks + revalidation job. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Translation-Status/operation/api.projects.qa-checks.revalidate.get + """ + + projectId = projectId or self.get_project_id() + + return self.requester.request( + method="get", + path=f"projects/{projectId}/qa-checks/revalidate", + ) + + def cancel_qa_checks_revalidation( + self, + projectId: Optional[int] = None, + ): + """ + Cancel QA Checks Revalidation. + + Cancels the currently running QA checks revalidation job. + + Link to documentation: + https://support.crowdin.com/developer/api/v2/#tag/Translation-Status/operation/api.projects.qa-checks.revalidate.delete + """ + + projectId = projectId or self.get_project_id() + + return self.requester.request( + method="delete", + path=f"projects/{projectId}/qa-checks/revalidate", + ) + def list_qa_check_issues( self, projectId: Optional[int] = None, diff --git a/crowdin_api/api_resources/translation_status/tests/test_translation_status_resources.py b/crowdin_api/api_resources/translation_status/tests/test_translation_status_resources.py index 0f74c13..d5f56b1 100644 --- a/crowdin_api/api_resources/translation_status/tests/test_translation_status_resources.py +++ b/crowdin_api/api_resources/translation_status/tests/test_translation_status_resources.py @@ -85,6 +85,39 @@ def test_get_project_progress(self, m_request, base_absolut_url): path="projects/1/languages/progress", ) + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_start_qa_checks_revalidation(self, m_request, base_absolut_url): + m_request.return_value = "response" + + resource = self.get_resource(base_absolut_url) + assert resource.start_qa_checks_revalidation(projectId=1) == "response" + m_request.assert_called_once_with( + method="post", + path="projects/1/qa-checks/revalidate", + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_get_qa_checks_revalidation_status(self, m_request, base_absolut_url): + m_request.return_value = "response" + + resource = self.get_resource(base_absolut_url) + assert resource.get_qa_checks_revalidation_status(projectId=1) == "response" + m_request.assert_called_once_with( + method="get", + path="projects/1/qa-checks/revalidate", + ) + + @mock.patch("crowdin_api.requester.APIRequester.request") + def test_cancel_qa_checks_revalidation(self, m_request, base_absolut_url): + m_request.return_value = "response" + + resource = self.get_resource(base_absolut_url) + assert resource.cancel_qa_checks_revalidation(projectId=1) == "response" + m_request.assert_called_once_with( + method="delete", + path="projects/1/qa-checks/revalidate", + ) + @pytest.mark.parametrize( "in_params,request_params", (