diff --git a/sendgrid/client.py b/sendgrid/client.py index 6a389de29..0cf69c3f8 100644 --- a/sendgrid/client.py +++ b/sendgrid/client.py @@ -17,6 +17,11 @@ from .resources.asm_global_suppressions import ASMGlobalSuppressions from .resources.suppressions import Suppressions from .resources.stats import Stats +from .resources.subusers import Subusers +from .resources.whitelabel_domains import WhitelabelDomains +from .resources.whitelabel_ips import WhitelabelIPs +from .resources.ip_pools import IPPools +from .resources.ip_addresses import IPAddresses class SendGridAPIClient(object): @@ -35,6 +40,7 @@ def __init__(self, apikey, **opts): self.host = opts.get('host', 'https://api.sendgrid.com') # urllib cannot connect to SSL servers using proxies self.proxies = opts.get('proxies', None) + self._basic = opts.get('basic', False) self.timeout = opts.get('timeout', 10) self.apikeys = APIKeys(self) @@ -43,6 +49,11 @@ def __init__(self, apikey, **opts): self.asm_global_suppressions = ASMGlobalSuppressions(self) self.suppressions = Suppressions(self) self.stats = Stats(self) + self.subusers = Subusers(self) + self.whitelabel_domains = WhitelabelDomains(self) + self.whitelabel_ips = WhitelabelIPs(self) + self.ip_pools = IPPools(self) + self.ips = IPAddresses(self) @property def apikey(self): @@ -60,7 +71,7 @@ def _build_request(self, url, json_header=False, method='GET', data=None): req = urllib_request.Request(url) req.get_method = lambda: method req.add_header('User-Agent', self.useragent) - req.add_header('Authorization', 'Bearer ' + self.apikey) + req.add_header('Authorization', ('Basic ' if self._basic else 'Bearer ') + self.apikey) if json_header: req.add_header('Content-Type', 'application/json') try: diff --git a/sendgrid/resources/api_keys.py b/sendgrid/resources/api_keys.py index e4c7fb8ab..7efcc9316 100644 --- a/sendgrid/resources/api_keys.py +++ b/sendgrid/resources/api_keys.py @@ -40,25 +40,31 @@ def client(self): # Get a list of active API keys def get(self): + self.name = None + self.endpoint = self._base_endpoint return self.client.get(self) # Create a new API key with name (string) def post(self, name): self.endpoint = self._base_endpoint data = {} + data['name'] = name + self.name = name - data['name'] = self.name + self.endpoint = self._base_endpoint return self.client.post(self, data) # Delete a API key def delete(self, api_key_id): + self.name = None self.endpoint = self._base_endpoint + "/" + api_key_id return self.client.delete(self) # Update a API key's name def patch(self, api_key_id, name): data = {} + data['name'] = name + self.name = name - data['name'] = self.name self.endpoint = self._base_endpoint + "/" + api_key_id return self.client.patch(self, data) \ No newline at end of file diff --git a/sendgrid/resources/ip_addresses.py b/sendgrid/resources/ip_addresses.py new file mode 100644 index 000000000..242fc0fd9 --- /dev/null +++ b/sendgrid/resources/ip_addresses.py @@ -0,0 +1,66 @@ +try: + from urllib.parse import quote_plus +except ImportError: # Python 2 + from urllib import quote_plus + +class IPAddresses(object): + + def __init__(self, client, **opts): + """ + Constructs SendGrid IP Pools object. + + See https://sendgrid.com/docs/API_Reference/Web_API_v3/IP_Management/ip_addresses.html + """ + self._base_endpoint = '/v3/ips' + self._endpoint = '/v3/ips' + self._client = client + + @property + def base_endpoint(self): + return self._base_endpoint + + @property + def endpoint(self): + endpoint = self._endpoint + return endpoint + + @endpoint.setter + def endpoint(self, value): + self._endpoint = value + + @property + def client(self): + return self._client + + def get(self): + """ + List all IP addresses + """ + self.endpoint = self._base_endpoint + return self.client.get(self) + + def post(self, ip_pool, ip): + """ + Add an IP address to the specified IP Pool + + :param ip_pool: str + :param ip: str + """ + data = {} + data['ip'] = ip + + self.endpoint = self._base_endpoint + '/pools/' + quote_plus(ip_pool) + '/ips' + return self.client.post(self, data) + + def delete(self, ip_pool, ip): + """ + Delete an IP address from the specified IP Pool + + :param ip_pool: str + :param ip: str + """ + self.endpoint = ( + self._base_endpoint + + '/pools/' + quote_plus(ip_pool) + + '/ips/' + quote_plus(ip)) + return self.client.delete(self) diff --git a/sendgrid/resources/ip_pools.py b/sendgrid/resources/ip_pools.py new file mode 100644 index 000000000..4e3b00acc --- /dev/null +++ b/sendgrid/resources/ip_pools.py @@ -0,0 +1,61 @@ +try: + from urllib.parse import quote_plus +except ImportError: # Python 2 + from urllib import quote_plus + +class IPPools(object): + + def __init__(self, client, **opts): + """ + Constructs SendGrid IP Pools object. + + See https://sendgrid.com/docs/API_Reference/Web_API_v3/IP_Management/ip_pools.html + """ + self._base_endpoint = '/v3/ips/pools' + self._endpoint = '/v3/ips/pools' + self._client = client + + @property + def base_endpoint(self): + return self._base_endpoint + + @property + def endpoint(self): + endpoint = self._endpoint + return endpoint + + @endpoint.setter + def endpoint(self, value): + self._endpoint = value + + @property + def client(self): + return self._client + + def get(self): + """ + List all IP pools + """ + self.endpoint = self._base_endpoint + return self.client.get(self) + + def post(self, name): + """ + Create a new IP pool + + :param name: str + """ + data = {} + data['name'] = name + + self.endpoint = self._base_endpoint + return self.client.post(self, data) + + def delete(self, name): + """ + Delete an IP pool + + :param name: str + """ + self.endpoint = self._base_endpoint + '/' + quote_plus(name) + return self.client.delete(self) diff --git a/sendgrid/resources/subusers.py b/sendgrid/resources/subusers.py new file mode 100644 index 000000000..7f6f7ce5c --- /dev/null +++ b/sendgrid/resources/subusers.py @@ -0,0 +1,75 @@ +class Subusers(object): + + def __init__(self, client, **opts): + """ + Constructs SendGrid Subusers object. + + https://sendgrid.com/docs/API_Reference/Web_API_v3/subusers.html + """ + self._base_endpoint = "/v3/subusers" + self._endpoint = "/v3/subusers" + self._client = client + + @property + def base_endpoint(self): + return self._base_endpoint + + @property + def endpoint(self): + endpoint = self._endpoint + return endpoint + + @endpoint.setter + def endpoint(self, value): + self._endpoint = value + + @property + def client(self): + return self._client + + def get(self): + """ + Get a list of subusers + """ + self.endpoint = self._base_endpoint + return self.client.get(self) + + def post(self, username, email, password, ips = []): + """ + Create a new subuser + + :param username: string + :param email: string + :param password: string + :param ips: string[] + """ + data = {} + data['username'] = username + data['email'] = email + data['password'] = password + data['ips'] = ips + + self.endpoint = self._base_endpoint + return self.client.post(self, data) + + def delete(self, username): + """ + Delete a subuser + + :param username: string + """ + self.endpoint = self._base_endpoint + "/" + username + return self.client.delete(self) + + def patch(self, username, disabled): + """ + Enable/disable a subuser + + :param username: string + :param disabled: bool + """ + data = {} + data['disabled'] = disabled + + self.endpoint = self._base_endpoint + "/" + username + return self.client.patch(self, data) diff --git a/sendgrid/resources/whitelabel_domains.py b/sendgrid/resources/whitelabel_domains.py new file mode 100644 index 000000000..5c5f45329 --- /dev/null +++ b/sendgrid/resources/whitelabel_domains.py @@ -0,0 +1,75 @@ +class WhitelabelDomains(object): + + def __init__(self, client, **opts): + """ + Constructs SendGrid WhitelabelDomains object. + + See https://sendgrid.com/docs/API_Reference/Web_API_v3/Whitelabel/domains.html + """ + self._base_endpoint = '/v3/whitelabel/domains' + self._endpoint = '/v3/whitelabel/domains' + self._client = client + + @property + def base_endpoint(self): + return self._base_endpoint + + @property + def endpoint(self): + endpoint = self._endpoint + return endpoint + + @endpoint.setter + def endpoint(self, value): + self._endpoint = value + + @property + def client(self): + return self._client + + def get(self): + """ + Get a list of whitelabel domains + """ + self.endpoint = self._base_endpoint + return self.client.get(self) + + def post(self, domain, subdomain, username, default): + """ + Create a new whitelabel domain + + :param domain: string + :param subdomain: string + :param username: string + :param default: bool + """ + data = {} + data['domain'] = domain + data['subdomain'] = subdomain + data['username'] = username + data['default'] = default + + self.endpoint = self._base_endpoint + return self.client.post(self, data) + + def delete(self, id): + """ + Delete a whitelabel domain + + :param id: int + """ + self.endpoint = self._base_endpoint + '/' + str(id) + return self.client.delete(self) + + def patch(self, id, default): + """ + Update a whitelabel domain + + :param id: int + :param default: bool + """ + data = {} + data['default'] = default + + self.endpoint = self._base_endpoint + '/' + str(id) + return self.client.patch(self, data) diff --git a/sendgrid/resources/whitelabel_ips.py b/sendgrid/resources/whitelabel_ips.py new file mode 100644 index 000000000..2cdace4e9 --- /dev/null +++ b/sendgrid/resources/whitelabel_ips.py @@ -0,0 +1,60 @@ +class WhitelabelIPs(object): + + def __init__(self, client, **opts): + """ + Constructs SendGrid WhitelabelIPs object. + + See https://sendgrid.com/docs/API_Reference/Web_API_v3/Whitelabel/ips.html + """ + self._base_endpoint = '/v3/whitelabel/ips' + self._endpoint = '/v3/whitelabel/ips' + self._client = client + + @property + def base_endpoint(self): + return self._base_endpoint + + @property + def endpoint(self): + endpoint = self._endpoint + return endpoint + + @endpoint.setter + def endpoint(self, value): + self._endpoint = value + + @property + def client(self): + return self._client + + def get(self): + """ + Get a list of whitelabel IPs + """ + self.endpoint = self._base_endpoint + return self.client.get(self) + + def post(self, ip, domain, subdomain): + """ + Create a new whitelabel IP + + :param ip: string + :param domain: string + :param subdomain: string + """ + data = {} + data['ip'] = ip + data['domain'] = domain + data['subdomain'] = subdomain + + self.endpoint = self._base_endpoint + return self.client.post(self, data) + + def delete(self, id): + """ + Delete a whitelabel IP + + :param id: int + """ + self.endpoint = self._base_endpoint + '/' + str(id) + return self.client.delete(self) diff --git a/test/test_api_keys.py b/test/test_api_keys.py index c7a0cc96f..efc4c9495 100644 --- a/test/test_api_keys.py +++ b/test/test_api_keys.py @@ -38,13 +38,19 @@ def test_apikeys_patch(self): status, msg = self.client.apikeys.patch(SG_KEY, name) self.assertEqual(status, 200) self.assertEqual(msg['name'], name) - + + self.test_apikeys_get() + def test_apikeys_delete(self): status, msg = self.client.apikeys.delete(SG_KEY) self.assertEqual(status, 204) + self.test_apikeys_get() + def test_apikeys_get(self): status, msg = self.client.apikeys.get() + self.assertEqual(self.client.apikeys.name, None) + self.assertEqual(self.client.apikeys.endpoint, "/v3/api_keys") self.assertEqual(status, 200) if __name__ == '__main__': diff --git a/test/test_ip_addresses.py b/test/test_ip_addresses.py new file mode 100644 index 000000000..f5c60c573 --- /dev/null +++ b/test/test_ip_addresses.py @@ -0,0 +1,50 @@ +from .base_test import BaseTest, MockSendGridAPIClientRequest +import os +try: + import unittest2 as unittest +except ImportError: + import unittest +try: + from StringIO import StringIO +except ImportError: # Python 3 + from io import StringIO + +import sendgrid +from sendgrid.client import SendGridAPIClient +from sendgrid.version import __version__ + +SG_KEY = os.getenv('SG_KEY') or 'SENDGRID_APIKEY' + +class TestIPAddresses(unittest.TestCase): + def setUp(self): + SendGridAPIClient = MockSendGridAPIClientRequest + self.client = SendGridAPIClient(SG_KEY) + + def test_ips_init(self): + self.ips = self.client.ips + self.assertEqual(self.ips.base_endpoint, "/v3/ips") + self.assertEqual(self.ips.endpoint, "/v3/ips") + self.assertEqual(self.ips.client, self.client) + + def test_ips_post(self): + ip_pool = 'test-pool' + ip = '10.1.2.3' + status, msg = self.client.ips.post(ip_pool, ip) + self.assertEqual(status, 201) + self.assertEqual(msg['ip'], ip) + + def test_ips_delete(self): + ip_pool = 'test-pools' + ip = '10.1.2.3' + status, msg = self.client.ips.delete(ip_pool, ip) + self.assertEqual(status, 204) + + self.test_ips_get() + + def test_ips_get(self): + status, msg = self.client.ips.get() + self.assertEqual(self.client.ips.endpoint, "/v3/ips") + self.assertEqual(status, 200) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_ip_pools.py b/test/test_ip_pools.py new file mode 100644 index 000000000..4d87be68b --- /dev/null +++ b/test/test_ip_pools.py @@ -0,0 +1,48 @@ +from .base_test import BaseTest, MockSendGridAPIClientRequest +import os +try: + import unittest2 as unittest +except ImportError: + import unittest +try: + from StringIO import StringIO +except ImportError: # Python 3 + from io import StringIO + +import sendgrid +from sendgrid.client import SendGridAPIClient +from sendgrid.version import __version__ + +SG_KEY = os.getenv('SG_KEY') or 'SENDGRID_APIKEY' + +class TestIPPools(unittest.TestCase): + def setUp(self): + SendGridAPIClient = MockSendGridAPIClientRequest + self.client = SendGridAPIClient(SG_KEY) + + def test_ip_pools_init(self): + self.ip_pools = self.client.ip_pools + self.assertEqual(self.ip_pools.base_endpoint, "/v3/ips/pools") + self.assertEqual(self.ip_pools.endpoint, "/v3/ips/pools") + self.assertEqual(self.ip_pools.client, self.client) + + def test_ip_pools_post(self): + name = 'test-pool' + status, msg = self.client.ip_pools.post(name) + self.assertEqual(status, 201) + self.assertEqual(msg['name'], name) + + def test_ip_pools_delete(self): + id = 'test-pools' + status, msg = self.client.ip_pools.delete(id) + self.assertEqual(status, 204) + + self.test_ip_pools_get() + + def test_ip_pools_get(self): + status, msg = self.client.ip_pools.get() + self.assertEqual(self.client.ip_pools.endpoint, "/v3/ips/pools") + self.assertEqual(status, 200) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_subusers.py b/test/test_subusers.py new file mode 100644 index 000000000..57ea753c0 --- /dev/null +++ b/test/test_subusers.py @@ -0,0 +1,60 @@ +from .base_test import BaseTest, MockSendGridAPIClientRequest +import os +try: + import unittest2 as unittest +except ImportError: + import unittest +try: + from StringIO import StringIO +except ImportError: # Python 3 + from io import StringIO + +import sendgrid +from sendgrid.client import SendGridAPIClient +from sendgrid.version import __version__ + +SG_KEY = os.getenv('SG_KEY') or 'SENDGRID_APIKEY' + +class TestSubusers(unittest.TestCase): + def setUp(self): + SendGridAPIClient = MockSendGridAPIClientRequest + self.client = SendGridAPIClient(SG_KEY) + + def test_subusers_init(self): + self.subusers = self.client.subusers + self.assertEqual(self.subusers.base_endpoint, "/v3/subusers") + self.assertEqual(self.subusers.endpoint, "/v3/subusers") + self.assertEqual(self.subusers.client, self.client) + + def test_subusers_post(self): + username = "test-subuser1" + email = "keiji+test-subuser1@nextdoor.com" + password = "password" + status, msg = self.client.subusers.post(username, email, password) + self.assertEqual(status, 201) + self.assertEqual(msg['username'], username) + self.assertEqual(msg['email'], email) + self.assertEqual(msg['password'], password) + + def test_subusers_patch(self): + username = "test-subuser1" + disabled = True + status, msg = self.client.subusers.patch(username, disabled) + self.assertEqual(status, 200) + + self.test_subusers_get() + + def test_subusers_delete(self): + username = "test-subuser1" + status, msg = self.client.subusers.delete(username) + self.assertEqual(status, 204) + + self.test_subusers_get() + + def test_subusers_get(self): + status, msg = self.client.subusers.get() + self.assertEqual(self.client.subusers.endpoint, "/v3/subusers") + self.assertEqual(status, 200) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_whitelabel_domains.py b/test/test_whitelabel_domains.py new file mode 100644 index 000000000..c4c20838f --- /dev/null +++ b/test/test_whitelabel_domains.py @@ -0,0 +1,62 @@ +from .base_test import BaseTest, MockSendGridAPIClientRequest +import os +try: + import unittest2 as unittest +except ImportError: + import unittest +try: + from StringIO import StringIO +except ImportError: # Python 3 + from io import StringIO + +import sendgrid +from sendgrid.client import SendGridAPIClient +from sendgrid.version import __version__ + +SG_KEY = os.getenv('SG_KEY') or 'SENDGRID_APIKEY' + +class TestWhitelabelDomains(unittest.TestCase): + def setUp(self): + SendGridAPIClient = MockSendGridAPIClientRequest + self.client = SendGridAPIClient(SG_KEY) + + def test_whitelabel_domains_init(self): + self.whitelabel_domains = self.client.whitelabel_domains + self.assertEqual(self.whitelabel_domains.base_endpoint, "/v3/whitelabel/domains") + self.assertEqual(self.whitelabel_domains.endpoint, "/v3/whitelabel/domains") + self.assertEqual(self.whitelabel_domains.client, self.client) + + def test_whitelabel_domains_post(self): + domain = "nextdoor-test-whitelabel.com" + subdomain = "test" + username = "test-subuser1" + default = True + status, msg = self.client.whitelabel_domains.post(domain, subdomain, username, default) + self.assertEqual(status, 201) + self.assertEqual(msg['domain'], domain) + self.assertEqual(msg['subdomain'], subdomain) + self.assertEqual(msg['username'], username) + self.assertEqual(msg['default'], default) + + def test_whitelabel_domains_patch(self): + id = 1 + default = False + status, msg = self.client.whitelabel_domains.patch(id, default) + self.assertEqual(status, 200) + + self.test_whitelabel_domains_get() + + def test_whitelabel_domains_delete(self): + id = 1 + status, msg = self.client.whitelabel_domains.delete(id) + self.assertEqual(status, 204) + + self.test_whitelabel_domains_get() + + def test_whitelabel_domains_get(self): + status, msg = self.client.whitelabel_domains.get() + self.assertEqual(self.client.whitelabel_domains.endpoint, "/v3/whitelabel/domains") + self.assertEqual(status, 200) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_whitelabel_ips.py b/test/test_whitelabel_ips.py new file mode 100644 index 000000000..47b3ca9b3 --- /dev/null +++ b/test/test_whitelabel_ips.py @@ -0,0 +1,52 @@ +from .base_test import BaseTest, MockSendGridAPIClientRequest +import os +try: + import unittest2 as unittest +except ImportError: + import unittest +try: + from StringIO import StringIO +except ImportError: # Python 3 + from io import StringIO + +import sendgrid +from sendgrid.client import SendGridAPIClient +from sendgrid.version import __version__ + +SG_KEY = os.getenv('SG_KEY') or 'SENDGRID_APIKEY' + +class TestWhitelabelIPs(unittest.TestCase): + def setUp(self): + SendGridAPIClient = MockSendGridAPIClientRequest + self.client = SendGridAPIClient(SG_KEY) + + def test_whitelabel_ips_init(self): + self.whitelabel_ips = self.client.whitelabel_ips + self.assertEqual(self.whitelabel_ips.base_endpoint, "/v3/whitelabel/ips") + self.assertEqual(self.whitelabel_ips.endpoint, "/v3/whitelabel/ips") + self.assertEqual(self.whitelabel_ips.client, self.client) + + def test_whitelabel_ips_post(self): + domain = "nextdoor-test-whitelabel.com" + subdomain = "test" + ip = '10.1.2.3' + status, msg = self.client.whitelabel_ips.post(ip, domain, subdomain) + self.assertEqual(status, 201) + self.assertEqual(msg['ip'], ip) + self.assertEqual(msg['domain'], domain) + self.assertEqual(msg['subdomain'], subdomain) + + def test_whitelabel_ips_delete(self): + id = 1 + status, msg = self.client.whitelabel_ips.delete(id) + self.assertEqual(status, 204) + + self.test_whitelabel_ips_get() + + def test_whitelabel_ips_get(self): + status, msg = self.client.whitelabel_ips.get() + self.assertEqual(self.client.whitelabel_ips.endpoint, "/v3/whitelabel/ips") + self.assertEqual(status, 200) + +if __name__ == '__main__': + unittest.main()