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..f36461b 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,227 @@ 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 +2094,160 @@ 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"