From 8f10f120c2817f8fd40a6f422de30a1017346441 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Wed, 1 Oct 2025 03:59:50 +0300 Subject: [PATCH 1/6] feat(reports): add support for new schemas --- crowdin_api/api_resources/reports/resource.py | 296 ++++++++++++++ .../reports/tests/test_reports_resources.py | 381 ++++++++++++++++++ 2 files changed, 677 insertions(+) diff --git a/crowdin_api/api_resources/reports/resource.py b/crowdin_api/api_resources/reports/resource.py index 8c9a00c..3b6757a 100644 --- a/crowdin_api/api_resources/reports/resource.py +++ b/crowdin_api/api_resources/reports/resource.py @@ -160,6 +160,204 @@ def generate_contribution_raw_data_report( }, ) + def generate_source_content_updates_report( + self, + project_id: Optional[int] = None, + unit: Optional[Unit] = None, + format: Optional[Format] = Format.XLSX, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Report(Contribution Raw Data). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "source-content-updates", + "schema": { + "unit": unit, + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + + def generate_project_members_report( + self, + project_id: Optional[int] = None, + format: Optional[Format] = Format.XLSX, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Report(Project Members). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "project-members", + "schema": { + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + + def generate_editor_issues_report( + self, + project_id: Optional[int] = None, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + format: Optional[Format] = Format.XLSX, + issue_type: Optional[str] = None, + ): + """ + Generate Report(Editor Issues). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "editor-issues", + "schema": { + "dateFrom": date_from, + "dateTo": date_to, + "format": format, + "issueType": issue_type + }, + }, + ) + + def generate_qa_check_issues_report( + self, + project_id: Optional[int] = None, + format: Optional[Format] = Format.XLSX, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Report(Qa Check Issues). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "qa-check-issues", + "schema": { + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + + def generate_saving_activity_report( + self, + project_id: Optional[int] = None, + unit: Optional[Unit] = None, + language_id: Optional[str] = None, + format: Optional[Format] = Format.XLSX, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Report(Saving Activity). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "saving-activity", + "schema": { + "unit": unit, + "languageId": language_id, + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + + def generate_translation_activity_report( + self, + project_id: Optional[int] = None, + unit: Optional[Unit] = None, + language_id: Optional[str] = None, + format: Optional[Format] = Format.XLSX, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Report(Translation Activity). + + Link to documentation: + https://developer.crowdin.com/api/v2/#operation/api.projects.reports.post + + Link to documentation for enterprise: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.projects.reports.post + """ + + project_id = project_id or self.get_project_id() + + return self.generate_report( + projectId=project_id, + request_data={ + "name": "translation-activity", + "schema": { + "unit": unit, + "languageId": language_id, + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + def generate_pre_translate_accuracy_general_report( self, projectId: Optional[int] = None, @@ -1276,6 +1474,104 @@ def generate_group_translation_costs_post_editing_general_report( }, ) + def generate_group_task_usage_report( + self, + group_id: int, + format: Optional[Format] = None, + type: Optional[str] = None, + project_ids: Optional[Iterable[int]] = None, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + group_by: Optional[GroupBy] = None, + type_task: Optional[int] = None, + language_id: Optional[str] = None, + creator_id: Optional[int] = None, + assignee_id: Optional[int] = None, + ): + """ + Generate Group Report (Task Usage Report). + + Link to documentation: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.reports.post + """ + + return self.generate_group_report( + group_id=group_id, + request_data={ + "name": "group-task-usage", + "schema": { + "projectIds": project_ids, + "format": format, + "type": type, + "dateFrom": date_from, + "dateTo": date_to, + "groupBy": group_by, + "typeTask": type_task, + "languageId": language_id, + "creatorId": creator_id, + "assigneeId": assignee_id, + }, + }, + ) + + def generate_group_qa_check_issues_report( + self, + group_id: int, + project_ids: Optional[Iterable[int]] = None, + format: Optional[Format] = None, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Group Report (Group Qa Check Issues Report). + + Link to documentation: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.reports.post + """ + + return self.generate_group_report( + group_id=group_id, + request_data={ + "name": "group-qa-check-issues", + "schema": { + "projectIds": project_ids, + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + + def generate_group_translation_activity_report( + self, + group_id: int, + unit: Optional[Unit] = None, + project_ids: Optional[Iterable[int]] = None, + format: Optional[Format] = None, + date_from: Optional[datetime] = None, + date_to: Optional[datetime] = None, + ): + """ + Generate Group Report (Group translation consumption). + + Link to documentation: + https://developer.crowdin.com/enterprise/api/v2/#operation/api.groups.reports.post + """ + + return self.generate_group_report( + group_id=group_id, + request_data={ + "name": "group-translation-activity", + "schema": { + "unit": unit, + "projectIds": project_ids, + "format": format, + "dateFrom": date_from, + "dateTo": date_to, + }, + }, + ) + @staticmethod def get_organization_reports_path(report_id: Optional[str] = None): if report_id is not None: diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index 141bd67..1d776c7 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -635,6 +635,230 @@ def test_generate_contribution_raw_data_report( request_data={"name": "contribution-raw-data", "schema": schema}, ) + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + { + "unit": Unit.WORDS, + "format": Format.XLSX, + }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None, + }, + ), + ( + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + def test_generate_source_content_updates_report( + self, m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = self.get_resource(base_absolut_url) + result = resource.generate_source_content_updates_report(project_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + projectId=1, + request_data={ + "name": "source-content-updates", + "schema": expected_schema, + }, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + {"format": Format.XLSX}, + { + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None + }, + ), + ( + { + "format": Format.XLSX, + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + }, + { + "format": Format.XLSX, + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + def test_generate_project_members_report( + self, m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = self.get_resource(base_absolut_url) + result = resource.generate_project_members_report(project_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + projectId=1, + request_data={"name": "project-members", "schema": expected_schema}, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + {}, + { + "dateFrom": None, + "dateTo": None, + "format": Format.XLSX, + "issueType": None + }, + ), + ( + { + "date_from": datetime(2022, 5, 1), + "date_to": datetime(2022, 6, 1), + "format": Format.XLSX, + "issue_type": "uncategorized", + }, + { + "dateFrom": datetime(2022, 5, 1), + "dateTo": datetime(2022, 6, 1), + "format": Format.XLSX, + "issueType": "uncategorized", + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + def test_generate_editor_issues_report( + self, m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + resource = self.get_resource(base_absolut_url) + result = resource.generate_editor_issues_report(project_id=1, **in_params) + assert result == "response" + m_generate_report.assert_called_once_with( + projectId=1, + request_data={"name": "editor-issues", "schema": expected_schema}, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + {}, + { + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None + }, + ), + ( + { + "format": Format.XLSX, + "date_from": datetime(2023, 4, 1), + "date_to": datetime(2023, 4, 30), + }, + { + "format": Format.XLSX, + "dateFrom": datetime(2023, 4, 1), + "dateTo": datetime(2023, 4, 30), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + def test_generate_qa_check_issues_report( + self, m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = self.get_resource(base_absolut_url) + result = resource.generate_qa_check_issues_report(project_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + projectId=1, + request_data={"name": "qa-check-issues", "schema": expected_schema}, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + { + "unit": Unit.WORDS, + "language_id": "uk" + }, + { + "unit": Unit.WORDS, + "languageId": "uk", + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None, + }, + ), + ( + { + "unit": Unit.WORDS, + "language_id": "de", + "format": Format.XLSX, + "date_from": datetime(2023, 2, 1), + "date_to": datetime(2023, 2, 28), + }, + { + "unit": Unit.WORDS, + "languageId": "de", + "format": Format.XLSX, + "dateFrom": datetime(2023, 2, 1), + "dateTo": datetime(2023, 2, 28), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + def test_generate_saving_activity_report( + self, m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = self.get_resource(base_absolut_url) + result = resource.generate_saving_activity_report(project_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + projectId=1, + request_data={"name": "saving-activity", "schema": expected_schema}, + ) + @pytest.mark.parametrize( "in_params, schema", [ @@ -1873,6 +2097,163 @@ def test_generate_organization_translation_costs_post_editing_general_report( request_data={"name": "group-translation-costs-pe", "schema": schema}, ) + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + { + "format": Format.XLSX, + "type": "all" + }, + { + "projectIds": None, + "format": Format.XLSX, + "type": "all", + "dateFrom": None, + "dateTo": None, + "groupBy": None, + "typeTask": None, + "languageId": None, + "creatorId": None, + "assigneeId": None, + }, + ), + ( + { + "project_ids": [1], + "format": Format.XLSX, + "type": "translate", + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + "group_by": GroupBy.USER, + "type_task": 2, + "language_id": "uk", + "creator_id": 10, + "assignee_id": 20, + }, + { + "projectIds": [1], + "format": Format.XLSX, + "type": "translate", + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + "groupBy": GroupBy.USER, + "typeTask": 2, + "languageId": "uk", + "creatorId": 10, + "assigneeId": 20, + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") + def test_generate_group_task_usage_report( + self,m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = EnterpriseReportsResource(base_absolut_url) + result = resource.generate_group_task_usage_report(group_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + group_id=1, + request_data={"name": "group-task-usage", "schema": expected_schema}, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + {}, + { + "projectIds": None, + "format": None, + "dateFrom": None, + "dateTo": None + }, + ), + ( + { + "project_ids": [1], + "format": Format.XLSX, + "date_from": datetime(2022, 5, 1), + "date_to": datetime(2022, 6, 1), + }, + { + "projectIds": [1], + "format": Format.XLSX, + "dateFrom": datetime(2022, 5, 1), + "dateTo": datetime(2022, 6, 1), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") + def test_generate_group_qa_check_issues_report( + self,m_generate_report, in_params, expected_schema, base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = EnterpriseReportsResource(base_absolut_url) + result = resource.generate_group_qa_check_issues_report(group_id=1, **in_params) + assert result == "response" + + m_generate_report.assert_called_once_with( + group_id=1, + request_data={"name": "group-qa-check-issues", "schema": expected_schema}, + ) + + @pytest.mark.parametrize( + "in_params, expected_schema", + [ + ( + { + "unit": Unit.WORDS + }, + { + "unit": Unit.WORDS, + "projectIds": None, + "format": None, + "dateFrom": None, + "dateTo": None, + }, + ), + ( + { + "unit": Unit.WORDS, + "project_ids": [1, 2, 3], + "format": Format.XLSX, + "date_from": datetime(2024, 1, 1), + "date_to": datetime(2024, 1, 31), + }, + { + "unit": Unit.WORDS, + "projectIds": [1, 2, 3], + "format": Format.XLSX, + "dateFrom": datetime(2024, 1, 1), + "dateTo": datetime(2024, 1, 31), + }, + ), + ] + ) + + @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") + def test_generate_group_translation_activity_report( + self, m_generate_report, in_params, expected_schema,base_absolut_url + ): + m_generate_report.return_value = "response" + + resource = EnterpriseReportsResource(base_absolut_url) + result = resource.generate_group_translation_activity_report(group_id=1, **in_params) + assert result == "response" + m_generate_report.assert_called_once_with( + group_id=1, + request_data={"name": "group-translation-activity", "schema": expected_schema}, + ) + @mock.patch("crowdin_api.requester.APIRequester.request") def test_check_report_generation_status(self, m_request, base_absolut_url): m_request.return_value = "response" From b8b0672ff4ac112483184b72f069deac1fa68fc1 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Wed, 1 Oct 2025 04:04:55 +0300 Subject: [PATCH 2/6] fix: indent --- .../reports/tests/test_reports_resources.py | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index 1d776c7..2a7a0f9 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -639,30 +639,30 @@ def test_generate_contribution_raw_data_report( "in_params, expected_schema", [ ( - { - "unit": Unit.WORDS, - "format": Format.XLSX, - }, - { - "unit": Unit.WORDS, - "format": Format.XLSX, - "dateFrom": None, - "dateTo": None, - }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None, + }, ), ( - { - "unit": Unit.WORDS, - "format": Format.XLSX, - "date_from": datetime(2023, 1, 1), - "date_to": datetime(2023, 12, 31), - }, - { - "unit": Unit.WORDS, - "format": Format.XLSX, - "dateFrom": datetime(2023, 1, 1), - "dateTo": datetime(2023, 12, 31), - }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + }, + { + "unit": Unit.WORDS, + "format": Format.XLSX, + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + }, ), ] ) From 6920c7128b1e01ec6bcc5ff59c42caecdb165627 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Wed, 1 Oct 2025 04:08:16 +0300 Subject: [PATCH 3/6] fix: indent --- .../reports/tests/test_reports_resources.py | 152 +++++++++--------- 1 file changed, 76 insertions(+), 76 deletions(-) diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index 2a7a0f9..c366651 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -689,24 +689,24 @@ def test_generate_source_content_updates_report( "in_params, expected_schema", [ ( - {"format": Format.XLSX}, - { - "format": Format.XLSX, - "dateFrom": None, - "dateTo": None - }, + {"format": Format.XLSX}, + { + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None + }, ), ( - { - "format": Format.XLSX, - "date_from": datetime(2023, 1, 1), - "date_to": datetime(2023, 12, 31), - }, - { - "format": Format.XLSX, - "dateFrom": datetime(2023, 1, 1), - "dateTo": datetime(2023, 12, 31), - }, + { + "format": Format.XLSX, + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + }, + { + "format": Format.XLSX, + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + }, ), ] ) @@ -730,27 +730,27 @@ def test_generate_project_members_report( "in_params, expected_schema", [ ( - {}, - { - "dateFrom": None, - "dateTo": None, - "format": Format.XLSX, - "issueType": None - }, + {}, + { + "dateFrom": None, + "dateTo": None, + "format": Format.XLSX, + "issueType": None + }, ), ( - { - "date_from": datetime(2022, 5, 1), - "date_to": datetime(2022, 6, 1), - "format": Format.XLSX, - "issue_type": "uncategorized", - }, - { - "dateFrom": datetime(2022, 5, 1), - "dateTo": datetime(2022, 6, 1), - "format": Format.XLSX, - "issueType": "uncategorized", - }, + { + "date_from": datetime(2022, 5, 1), + "date_to": datetime(2022, 6, 1), + "format": Format.XLSX, + "issue_type": "uncategorized", + }, + { + "dateFrom": datetime(2022, 5, 1), + "dateTo": datetime(2022, 6, 1), + "format": Format.XLSX, + "issueType": "uncategorized", + }, ), ] ) @@ -772,24 +772,24 @@ def test_generate_editor_issues_report( "in_params, expected_schema", [ ( - {}, - { - "format": Format.XLSX, - "dateFrom": None, - "dateTo": None - }, + {}, + { + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None + }, ), ( - { - "format": Format.XLSX, - "date_from": datetime(2023, 4, 1), - "date_to": datetime(2023, 4, 30), - }, - { - "format": Format.XLSX, - "dateFrom": datetime(2023, 4, 1), - "dateTo": datetime(2023, 4, 30), - }, + { + "format": Format.XLSX, + "date_from": datetime(2023, 4, 1), + "date_to": datetime(2023, 4, 30), + }, + { + "format": Format.XLSX, + "dateFrom": datetime(2023, 4, 1), + "dateTo": datetime(2023, 4, 30), + }, ), ] ) @@ -813,33 +813,33 @@ def test_generate_qa_check_issues_report( "in_params, expected_schema", [ ( - { - "unit": Unit.WORDS, - "language_id": "uk" - }, - { - "unit": Unit.WORDS, - "languageId": "uk", - "format": Format.XLSX, - "dateFrom": None, - "dateTo": None, - }, + { + "unit": Unit.WORDS, + "language_id": "uk" + }, + { + "unit": Unit.WORDS, + "languageId": "uk", + "format": Format.XLSX, + "dateFrom": None, + "dateTo": None, + }, ), ( - { - "unit": Unit.WORDS, - "language_id": "de", - "format": Format.XLSX, - "date_from": datetime(2023, 2, 1), - "date_to": datetime(2023, 2, 28), - }, - { - "unit": Unit.WORDS, - "languageId": "de", - "format": Format.XLSX, - "dateFrom": datetime(2023, 2, 1), - "dateTo": datetime(2023, 2, 28), - }, + { + "unit": Unit.WORDS, + "language_id": "de", + "format": Format.XLSX, + "date_from": datetime(2023, 2, 1), + "date_to": datetime(2023, 2, 28), + }, + { + "unit": Unit.WORDS, + "languageId": "de", + "format": Format.XLSX, + "dateFrom": datetime(2023, 2, 1), + "dateTo": datetime(2023, 2, 28), + }, ), ] ) From a1c8688f99294d894f0d55d11e0e071e64ad6d93 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Wed, 1 Oct 2025 04:11:48 +0300 Subject: [PATCH 4/6] fix: indent --- .../reports/tests/test_reports_resources.py | 166 +++++++++--------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index c366651..6e36236 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -2101,48 +2101,48 @@ def test_generate_organization_translation_costs_post_editing_general_report( "in_params, expected_schema", [ ( - { - "format": Format.XLSX, - "type": "all" - }, - { - "projectIds": None, - "format": Format.XLSX, - "type": "all", - "dateFrom": None, - "dateTo": None, - "groupBy": None, - "typeTask": None, - "languageId": None, - "creatorId": None, - "assigneeId": None, - }, + { + "format": Format.XLSX, + "type": "all" + }, + { + "projectIds": None, + "format": Format.XLSX, + "type": "all", + "dateFrom": None, + "dateTo": None, + "groupBy": None, + "typeTask": None, + "languageId": None, + "creatorId": None, + "assigneeId": None, + }, ), ( - { - "project_ids": [1], - "format": Format.XLSX, - "type": "translate", - "date_from": datetime(2023, 1, 1), - "date_to": datetime(2023, 12, 31), - "group_by": GroupBy.USER, - "type_task": 2, - "language_id": "uk", - "creator_id": 10, - "assignee_id": 20, - }, - { - "projectIds": [1], - "format": Format.XLSX, - "type": "translate", - "dateFrom": datetime(2023, 1, 1), - "dateTo": datetime(2023, 12, 31), - "groupBy": GroupBy.USER, - "typeTask": 2, - "languageId": "uk", - "creatorId": 10, - "assigneeId": 20, - }, + { + "project_ids": [1], + "format": Format.XLSX, + "type": "translate", + "date_from": datetime(2023, 1, 1), + "date_to": datetime(2023, 12, 31), + "group_by": GroupBy.USER, + "type_task": 2, + "language_id": "uk", + "creator_id": 10, + "assignee_id": 20, + }, + { + "projectIds": [1], + "format": Format.XLSX, + "type": "translate", + "dateFrom": datetime(2023, 1, 1), + "dateTo": datetime(2023, 12, 31), + "groupBy": GroupBy.USER, + "typeTask": 2, + "languageId": "uk", + "creatorId": 10, + "assigneeId": 20, + }, ), ] ) @@ -2166,27 +2166,27 @@ def test_generate_group_task_usage_report( "in_params, expected_schema", [ ( - {}, - { - "projectIds": None, - "format": None, - "dateFrom": None, - "dateTo": None - }, + {}, + { + "projectIds": None, + "format": None, + "dateFrom": None, + "dateTo": None + }, ), ( - { - "project_ids": [1], - "format": Format.XLSX, - "date_from": datetime(2022, 5, 1), - "date_to": datetime(2022, 6, 1), - }, - { - "projectIds": [1], - "format": Format.XLSX, - "dateFrom": datetime(2022, 5, 1), - "dateTo": datetime(2022, 6, 1), - }, + { + "project_ids": [1], + "format": Format.XLSX, + "date_from": datetime(2022, 5, 1), + "date_to": datetime(2022, 6, 1), + }, + { + "projectIds": [1], + "format": Format.XLSX, + "dateFrom": datetime(2022, 5, 1), + "dateTo": datetime(2022, 6, 1), + }, ), ] ) @@ -2210,32 +2210,32 @@ def test_generate_group_qa_check_issues_report( "in_params, expected_schema", [ ( - { - "unit": Unit.WORDS - }, - { - "unit": Unit.WORDS, - "projectIds": None, - "format": None, - "dateFrom": None, - "dateTo": None, - }, + { + "unit": Unit.WORDS + }, + { + "unit": Unit.WORDS, + "projectIds": None, + "format": None, + "dateFrom": None, + "dateTo": None, + }, ), ( - { - "unit": Unit.WORDS, - "project_ids": [1, 2, 3], - "format": Format.XLSX, - "date_from": datetime(2024, 1, 1), - "date_to": datetime(2024, 1, 31), - }, - { - "unit": Unit.WORDS, - "projectIds": [1, 2, 3], - "format": Format.XLSX, - "dateFrom": datetime(2024, 1, 1), - "dateTo": datetime(2024, 1, 31), - }, + { + "unit": Unit.WORDS, + "project_ids": [1, 2, 3], + "format": Format.XLSX, + "date_from": datetime(2024, 1, 1), + "date_to": datetime(2024, 1, 31), + }, + { + "unit": Unit.WORDS, + "projectIds": [1, 2, 3], + "format": Format.XLSX, + "dateFrom": datetime(2024, 1, 1), + "dateTo": datetime(2024, 1, 31), + }, ), ] ) From 0dcdb52421d17369d6145c0e2e6b46fd96d09bbc Mon Sep 17 00:00:00 2001 From: Max Inno Date: Wed, 1 Oct 2025 04:27:03 +0300 Subject: [PATCH 5/6] fix: indent --- .../api_resources/reports/tests/test_reports_resources.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index 6e36236..9f73ed9 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -2149,7 +2149,7 @@ def test_generate_organization_translation_costs_post_editing_general_report( @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_task_usage_report( - self,m_generate_report, in_params, expected_schema, base_absolut_url + self, m_generate_report, in_params, expected_schema, base_absolut_url ): m_generate_report.return_value = "response" @@ -2193,7 +2193,7 @@ def test_generate_group_task_usage_report( @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_qa_check_issues_report( - self,m_generate_report, in_params, expected_schema, base_absolut_url + self, m_generate_report, in_params, expected_schema, base_absolut_url ): m_generate_report.return_value = "response" @@ -2242,7 +2242,7 @@ def test_generate_group_qa_check_issues_report( @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_translation_activity_report( - self, m_generate_report, in_params, expected_schema,base_absolut_url + self, m_generate_report, in_params, expected_schema, base_absolut_url ): m_generate_report.return_value = "response" From 30943c3b761056be439b9047b67be6b00a741774 Mon Sep 17 00:00:00 2001 From: Max Inno Date: Fri, 17 Oct 2025 10:53:06 +0300 Subject: [PATCH 6/6] fix: indent --- .../reports/tests/test_reports_resources.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/crowdin_api/api_resources/reports/tests/test_reports_resources.py b/crowdin_api/api_resources/reports/tests/test_reports_resources.py index 9f73ed9..f36461b 100644 --- a/crowdin_api/api_resources/reports/tests/test_reports_resources.py +++ b/crowdin_api/api_resources/reports/tests/test_reports_resources.py @@ -666,7 +666,6 @@ def test_generate_contribution_raw_data_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") def test_generate_source_content_updates_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -710,7 +709,6 @@ def test_generate_source_content_updates_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") def test_generate_project_members_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -754,7 +752,6 @@ def test_generate_project_members_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") def test_generate_editor_issues_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -793,7 +790,6 @@ def test_generate_editor_issues_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") def test_generate_qa_check_issues_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -843,8 +839,9 @@ def test_generate_qa_check_issues_report( ), ] ) - - @mock.patch("crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report") + @mock.patch( + "crowdin_api.api_resources.reports.resource.BaseReportsResource.generate_report" + ) def test_generate_saving_activity_report( self, m_generate_report, in_params, expected_schema, base_absolut_url ): @@ -2146,7 +2143,6 @@ def test_generate_organization_translation_costs_post_editing_general_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_task_usage_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -2190,7 +2186,6 @@ def test_generate_group_task_usage_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_qa_check_issues_report( self, m_generate_report, in_params, expected_schema, base_absolut_url @@ -2239,7 +2234,6 @@ def test_generate_group_qa_check_issues_report( ), ] ) - @mock.patch("crowdin_api.api_resources.reports.resource.EnterpriseReportsResource.generate_group_report") def test_generate_group_translation_activity_report( self, m_generate_report, in_params, expected_schema, base_absolut_url