Skip to content

Commit d50e2d4

Browse files
authored
Fix issue #42: Add GeneralApi, related models, examples, tests.
1 parent afc1905 commit d50e2d4

21 files changed

+967
-0
lines changed

examples/general/__init__.py

Whitespace-only changes.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import mailtrap as mt
2+
from mailtrap.models.accounts import AccountAccess
3+
from mailtrap.models.common import DeletedObject
4+
5+
API_TOKEN = "YOUR_API_TOKEN"
6+
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
7+
8+
client = mt.MailtrapClient(token=API_TOKEN)
9+
account_accesses_api = client.general_api.account_accesses
10+
11+
12+
def get_account_accesses(account_id: int) -> list[AccountAccess]:
13+
return account_accesses_api.get_list(account_id=account_id)
14+
15+
16+
def delete_account_access(account_id: int, account_access_id: int) -> DeletedObject:
17+
return account_accesses_api.delete(
18+
account_id=account_id, account_access_id=account_access_id
19+
)
20+
21+
22+
if __name__ == "__main__":
23+
print(get_account_accesses(ACCOUNT_ID))

examples/general/accounts.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import mailtrap as mt
2+
from mailtrap.models.accounts import Account
3+
4+
API_TOKEN = "YOUR_API_TOKEN"
5+
6+
client = mt.MailtrapClient(token=API_TOKEN)
7+
accounts_api = client.general_api.accounts
8+
9+
10+
def get_accounts() -> list[Account]:
11+
return accounts_api.get_list()
12+
13+
14+
if __name__ == "__main__":
15+
print(get_accounts())

examples/general/billing.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import mailtrap as mt
2+
from mailtrap.models.billing import BillingCycleUsage
3+
4+
API_TOKEN = "YOUR_API_TOKEN"
5+
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
6+
7+
client = mt.MailtrapClient(token=API_TOKEN)
8+
billing_api = client.general_api.billing
9+
10+
11+
def get_current_billing_usage(account_id: int) -> BillingCycleUsage:
12+
return billing_api.get_current_billing_usage(account_id=account_id)
13+
14+
15+
if __name__ == "__main__":
16+
print(get_current_billing_usage(ACCOUNT_ID))

examples/general/permissions.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import mailtrap as mt
2+
from mailtrap.models.permissions import PermissionResource
3+
from mailtrap.models.permissions import UpdatePermissionsResponse
4+
5+
API_TOKEN = "YOUR_API_TOKEN"
6+
ACCOUNT_ID = "YOUR_ACCOUNT_ID"
7+
8+
client = mt.MailtrapClient(token=API_TOKEN)
9+
permissions_api = client.general_api.permissions
10+
11+
12+
def get_permission_resources(account_id: int) -> list[PermissionResource]:
13+
return permissions_api.get_resources(account_id=account_id)
14+
15+
16+
def bulk_permissions_update(
17+
account_id: int,
18+
account_access_id: int,
19+
permissions: list[mt.PermissionResourceParams],
20+
) -> UpdatePermissionsResponse:
21+
return permissions_api.bulk_permissions_update(
22+
account_id=account_id,
23+
account_access_id=account_access_id,
24+
permissions=permissions,
25+
)
26+
27+
28+
if __name__ == "__main__":
29+
print(get_permission_resources(ACCOUNT_ID))

mailtrap/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from .exceptions import AuthorizationError
66
from .exceptions import ClientConfigurationError
77
from .exceptions import MailtrapError
8+
from .models.accounts import AccountAccessFilterParams
89
from .models.contacts import ContactListParams
910
from .models.contacts import CreateContactFieldParams
1011
from .models.contacts import CreateContactParams
@@ -24,6 +25,7 @@
2425
from .models.mail import Mail
2526
from .models.mail import MailFromTemplate
2627
from .models.messages import UpdateEmailMessageParams
28+
from .models.permissions import PermissionResourceParams
2729
from .models.projects import ProjectParams
2830
from .models.templates import CreateEmailTemplateParams
2931
from .models.templates import UpdateEmailTemplateParams

mailtrap/api/general.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from mailtrap.api.resources.account_accesses import AccountAccessesApi
2+
from mailtrap.api.resources.accounts import AccountsApi
3+
from mailtrap.api.resources.billing import BillingApi
4+
from mailtrap.api.resources.permissions import PermissionsApi
5+
from mailtrap.http import HttpClient
6+
7+
8+
class GeneralApi:
9+
def __init__(self, client: HttpClient) -> None:
10+
self._client = client
11+
12+
@property
13+
def accounts(self) -> AccountsApi:
14+
return AccountsApi(client=self._client)
15+
16+
@property
17+
def account_accesses(self) -> AccountAccessesApi:
18+
return AccountAccessesApi(client=self._client)
19+
20+
@property
21+
def billing(self) -> BillingApi:
22+
return BillingApi(client=self._client)
23+
24+
@property
25+
def permissions(self) -> PermissionsApi:
26+
return PermissionsApi(client=self._client)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from typing import Optional
2+
from urllib.parse import quote
3+
4+
from mailtrap.http import HttpClient
5+
from mailtrap.models.accounts import AccountAccess
6+
from mailtrap.models.accounts import AccountAccessFilterParams
7+
from mailtrap.models.common import DeletedObject
8+
9+
10+
class AccountAccessesApi:
11+
def __init__(self, client: HttpClient) -> None:
12+
self._client = client
13+
14+
def get_list(
15+
self, account_id: int, filter_params: Optional[AccountAccessFilterParams] = None
16+
) -> list[AccountAccess]:
17+
"""
18+
Get list of account accesses for which specifier_type is User or Invite.
19+
You have to have account admin/owner permissions for this endpoint to work.
20+
If you specify project_ids, inbox_ids or domain_ids, the endpoint will return
21+
account accesses for these resources.
22+
"""
23+
response = self._client.get(
24+
self._api_path(account_id),
25+
params=filter_params.api_data if filter_params else None,
26+
)
27+
return [AccountAccess(**account_access) for account_access in response]
28+
29+
def delete(self, account_id: int, account_access_id: int) -> DeletedObject:
30+
"""
31+
If specifier type is User, it removes user permissions.
32+
If specifier type is Invite or ApiToken, it removes specifier
33+
along with permissions. You have to be an account admin/owner
34+
for this method to work.
35+
"""
36+
self._client.delete(self._api_path(account_id, account_access_id))
37+
return DeletedObject(account_access_id)
38+
39+
def _api_path(self, account_id: int, account_access_id: Optional[int] = None) -> str:
40+
path = f"/api/accounts/{account_id}/account_accesses"
41+
if account_access_id is not None:
42+
return f"{path}/{quote(str(account_access_id), safe='')}"
43+
return path

mailtrap/api/resources/accounts.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from mailtrap.http import HttpClient
2+
from mailtrap.models.accounts import Account
3+
4+
5+
class AccountsApi:
6+
def __init__(self, client: HttpClient) -> None:
7+
self._client = client
8+
9+
def get_list(self) -> list[Account]:
10+
"""Get a list of your Mailtrap accounts."""
11+
response = self._client.get("/api/accounts")
12+
return [Account(**account) for account in response]

mailtrap/api/resources/billing.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from mailtrap.http import HttpClient
2+
from mailtrap.models.billing import BillingCycleUsage
3+
4+
5+
class BillingApi:
6+
def __init__(self, client: HttpClient) -> None:
7+
self._client = client
8+
9+
def get_current_billing_usage(self, account_id: int) -> BillingCycleUsage:
10+
"""Get current billing cycle usage for Email Testing and Email Sending."""
11+
response = self._client.get(f"/api/accounts/{account_id}/billing/usage")
12+
return BillingCycleUsage(**response)

0 commit comments

Comments
 (0)