Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions crowdin_api/api_resources/reports/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -1324,3 +1324,128 @@ def generate_organization_translation_costs_post_editing_general_report(
},
},
)


class UserReportSettingsTemplatesResource(BaseReportSettingsTemplatesResource):
"""
Resource for User Report Settings Templates API.

Supporting the endpoints for managing user report settings templates.
Link to documentation:
https://developer.crowdin.com/api/v2/#tag/User-Report-Settings-Templates
"""

def get_user_report_settings_templates_path(
self,
userId: int,
reportSettingsTemplateId: Optional[int] = None
):
if reportSettingsTemplateId is not None:
return f"users/{userId}/reports/settings-templates/{reportSettingsTemplateId}"

return f"users/{userId}/reports/settings-templates"

def list_user_report_settings_template(
self,
userId: int,
offset: Optional[int] = None,
limit: Optional[int] = None
):
"""
List User Report Settings Templates.

Link to documentation:
https://developer.crowdin.com/api/v2/#operation/api.users.reports.settings-templates.getMany
"""
return self._get_entire_data(
method="get",
path=self.get_user_report_settings_templates_path(userId=userId),
params=self.get_page_params(offset=offset, limit=limit),
)

def add_user_report_settings_template(
self,
userId: int,
name: str,
currency: Currency,
unit: Unit,
config: Config,
):
"""
Add User Report Settings Template.

Link to documentation:
https://developer.crowdin.com/api/v2/#operation/api.users.reports.settings-templates.post
"""
return self.requester.request(
method="post",
path=self.get_user_report_settings_templates_path(
userId=userId,
),
request_data={
"name": name,
"currency": currency,
"unit": unit,
"mode": "simple",
"config": config,
}
)

def get_user_report_settings_template(
self,
userId: int,
reportSettingsTemplateId: int,
):
"""
Get User Report Settings Template.

Link to documentation:
https://developer.crowdin.com/api/v2/#operation/api.users.reports.settings-templates.get
"""
return self.requester.request(
method="get",
path=self.get_user_report_settings_templates_path(
userId=userId,
reportSettingsTemplateId=reportSettingsTemplateId
),
)

def edit_user_report_settings_template(
self,
userId: int,
reportSettingsTemplateId: int,
data: Iterable[ReportSettingsTemplatesPatchRequest],
):
"""
Edit User Report Settings Template.

Link to documentation:
https://developer.crowdin.com/api/v2/#operation/api.users.reports.settings-templates.patch
"""
return self.requester.request(
method="patch",
path=self.get_user_report_settings_templates_path(
userId=userId,
reportSettingsTemplateId=reportSettingsTemplateId
),
request_data=data,
)

def delete_user_report_settings_template(
self,
userId: int,
reportSettingsTemplateId: int,
):
"""
Delete User Report Settings Template.

Link to documentation:
https://developer.crowdin.com/api/v2/#operation/api.users.reports.settings-templates.delete
"""
return self.requester.request(
method="delete",
path=self.get_user_report_settings_templates_path(
userId=userId,
reportSettingsTemplateId=reportSettingsTemplateId
),
)
202 changes: 202 additions & 0 deletions crowdin_api/api_resources/reports/tests/test_reports_resources.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
from crowdin_api.api_resources.reports.types import BaseRates, Match
from crowdin_api.requester import APIRequester

from crowdin_api.api_resources.reports.resource import UserReportSettingsTemplatesResource


class TestReportsResource:
resource_class = ReportsResource
Expand Down Expand Up @@ -2163,3 +2165,203 @@ def test_delete_report_settings_template(self, m_request, base_absolut_url):
reportSettingsTemplateId=1
)
)


class TestUserReportSettingsTemplatesResource:
resource_class = UserReportSettingsTemplatesResource

def get_resource(self, base_absolut_url):
return self.resource_class(requester=APIRequester(base_url=base_absolut_url))

@pytest.mark.parametrize(
"incoming_data, path",
(
({"userId": 1}, "users/1/reports/settings-templates"),
(
{"userId": 1, "reportSettingsTemplateId": 1},
"users/1/reports/settings-templates/1"
),
),
)
def test_get_user_report_settings_templates_path(
self, incoming_data, path, base_absolut_url
):
resource = self.get_resource(base_absolut_url)
assert resource.get_user_report_settings_templates_path(**incoming_data) == path

@pytest.mark.parametrize(
"incoming_data, request_params",
(
(
{},
{
"limit": 25,
"offset": 0,
},
),
(
{
"limit": 10,
"offset": 2,
},
{
"limit": 10,
"offset": 2,
},
),
),
)
@mock.patch("crowdin_api.requester.APIRequester.request")
def test_list_user_report_settings_template(
self,
m_request,
incoming_data,
request_params,
base_absolut_url
):
m_request.return_value = "response"

resource = self.get_resource(base_absolut_url)
assert resource.list_user_report_settings_template(userId=1, **incoming_data) == "response"
m_request.assert_called_once_with(
method="get",
path=resource.get_user_report_settings_templates_path(userId=1),
params=request_params,
)

@pytest.mark.parametrize(
"incoming_data, request_data",
(
(
{
"name": "test_name",
"currency": Currency.UAH,
"unit": Unit.WORDS,
"config": {
"regularRates": [
{
"mode": "tm_match",
"value": 0.1
}
],
"individualRates": [
{
"languageIds": ["uk"],
"userIds": [1],
"rates": [
{
"mode": "tm_match",
"value": 0.1
}
]
}
]
}
},
{
"name": "test_name",
"currency": Currency.UAH,
"unit": Unit.WORDS,
"mode": "simple",
"config": {
"regularRates": [
{
"mode": "tm_match",
"value": 0.1
}
],
"individualRates": [
{
"languageIds": ["uk"],
"userIds": [1],
"rates": [
{
"mode": "tm_match",
"value": 0.1
}
]
}
]
}
},
),
),
)
@mock.patch("crowdin_api.requester.APIRequester.request")
def test_add_user_report_settings_template(
self,
m_request,
incoming_data,
request_data,
base_absolut_url
):
m_request.return_value = "response"

resource = self.get_resource(base_absolut_url)
assert resource.add_user_report_settings_template(userId=1, **incoming_data) == "response"
m_request.assert_called_once_with(
method="post",
path=resource.get_user_report_settings_templates_path(userId=1),
request_data=request_data,
)

@mock.patch("crowdin_api.requester.APIRequester.request")
def test_get_user_report_settings_template(self, m_request, base_absolut_url):
m_request.return_value = "response"

resource = self.get_resource(base_absolut_url)
assert resource.get_user_report_settings_template(
userId=1,
reportSettingsTemplateId=1
) == "response"
m_request.assert_called_once_with(
method="get",
path=resource.get_user_report_settings_templates_path(
userId=1,
reportSettingsTemplateId=1
),
)

@mock.patch("crowdin_api.requester.APIRequester.request")
def test_edit_user_report_settings_template(self, m_request, base_absolut_url):
m_request.return_value = "response"

data = [
{
"value": "test",
"op": PatchOperation.REPLACE,
"path": ReportSettingsTemplatesPatchPath.NAME,
}
]

resource = self.get_resource(base_absolut_url)
assert resource.edit_user_report_settings_template(
userId=1,
reportSettingsTemplateId=1,
data=data
) == "response"
m_request.assert_called_once_with(
method="patch",
path=resource.get_user_report_settings_templates_path(
userId=1,
reportSettingsTemplateId=1
),
request_data=data,
)

@mock.patch("crowdin_api.requester.APIRequester.request")
def test_delete_user_report_settings_template(self, m_request, base_absolut_url):
m_request.return_value = "response"

resource = self.get_resource(base_absolut_url)
assert resource.delete_user_report_settings_template(
userId=1,
reportSettingsTemplateId=1
) == "response"
m_request.assert_called_once_with(
method="delete",
path=resource.get_user_report_settings_templates_path(
userId=1,
reportSettingsTemplateId=1
),
)