Skip to content

Commit 1a80008

Browse files
author
Guillaume Badi
committed
clean
1 parent 1369431 commit 1a80008

File tree

14 files changed

+99
-644
lines changed

14 files changed

+99
-644
lines changed

README.md

Lines changed: 45 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,136 +1,47 @@
11
#Simple Mailjet APIv3 wrapper (WIP)
22

3-
## Usage:
4-
5-
In [1]: from mailjet import Client
6-
7-
In [2]: c = Client(auth=(API_KEY, API_SECRET))
8-
9-
In [3]: c.
10-
c.AXTesting c.CampaignGraphStats c.Contactslist c.MessageInformation c.OpenStats
11-
c.Aggregategraphstatistics c.CampaignOverview c.DomainStats c.MessageSentStats c.ParseRoute
12-
c.ApiKey c.CampaignStats c.EventCallbackURL c.MessageState c.Preferences
13-
c.ApiKeyAccess c.ClickStats c.GEOStats c.MessageStats c.Sender
14-
c.ApiKeyTotals c.Contact c.GraphStats c.MetaSender c.SenderStats
15-
c.ApiToken c.ContactData c.ListRecipient c.Metadata c.ToplinkClicked
16-
c.Batchjob c.ContactFilter c.ListRecipientstatistics c.MyProfile c.Trigger
17-
c.BounceStats c.ContactHistoryData c.ListStats c.Newsletter c.User
18-
c.CSVImport c.ContactMetadata c.ManyContacts c.NewsletterTemplate c.UseragentStats
19-
c.Campaign c.ContactStats c.Message c.NewsletterTemplateCategory c.Widget
20-
c.CampaignAggregate c.ContactsListSignup c.MessageHistory c.OpenInformation c.WidgetCustomValue
21-
22-
In [4]: c.Campaign.get_many
23-
Out[4]: {u'Count': 0, u'Data': [], u'Total': 0}
24-
25-
In [5: c.Campaign.get(1)
26-
Out[5:
27-
{u'Count': 1,
28-
u'Data': [{u'CampaignType': 2,
29-
u'ClickTracked': 3,
30-
u'CreatedAt': u'2014-11-27T14:38:11Z',
31-
u'CustomValue': u'mj.nl=1',
32-
u'FirstMessageID': 16888499051509351,
33-
u'FromEmail': u'[email protected]',
34-
u'FromID': 2,
35-
u'FromName': u'Tom',
36-
u'HasHtmlCount': 3,
37-
u'HasTxtCount': 3,
38-
u'ID': 1,
39-
u'IsDeleted': False,
40-
u'IsStarred': False,
41-
u'ListID': 1,
42-
u'NewsLetterID': 1,
43-
u'OpenTracked': 3,
44-
u'SendEndAt': u'2014-11-27T14:38:11Z',
45-
u'SendStartAt': u'2014-11-27T14:38:11Z',
46-
u'SpamassScore': 1.464,
47-
u'Status': 0,
48-
u'Subject': u'Test',
49-
u'UnsubscribeTrackedCount': 0}],
50-
u'Total': 1}
51-
52-
53-
In [6]: c.Campaign.get(2)
54-
55-
DoesNotExistError Traceback (most recent call last)
56-
<ipython-input-8-4a064dbddd21> in <module>()
57-
58-
...
59-
60-
DoesNotExistError: {'info': u'', 'request': <PreparedRequest [GET]>, 'message': u'Object not found', 'response_parsed': {u'StatusCode': 404, u'ErrorInfo': u'', u'ErrorMessage
61-
': u'Object not found'}, 'response': <Response [404]>}
62-
63-
64-
In [7]: c.Campaign.
65-
c.Campaign.create c.Campaign.delete c.Campaign.get c.Campaign.get_many c.Campaign.new c.Campaign.update
66-
67-
In [8]: help(c.Campaign)
68-
Help on Campaign in module mailjet.client object:
69-
70-
class Campaign(Endpoint)
71-
| Method resolution order:
72-
| Campaign
73-
| Endpoint
74-
| __builtin__.object
75-
|
76-
| Methods inherited from Endpoint:
77-
|
78-
| __init__(self, url, doc, auth)
79-
|
80-
| create(self, data, **kwargs)
81-
|
82-
| delete(self, res_id, **kwargs)
83-
|
84-
| get(self, res_id, **kwargs)
85-
|
86-
| get_many(self, **kwargs)
87-
|
88-
| new = create(self, data, **kwargs)
89-
|
90-
| update(self, res_id, data, **kwargs)
91-
|
92-
| ----------------------------------------------------------------------
93-
| Data descriptors inherited from Endpoint:
94-
|
95-
| __dict__
96-
| dictionary for instance variables (if defined)
97-
|
98-
| __weakref__
99-
| list of weak references to the object (if defined)
100-
101-
102-
In [9]: c.Campaign._doc
103-
Out[9]: 'http://dev.mailjet.com/email-api/v3/campaign'
104-
105-
In [10]: c.Campaign._url
106-
Out[10]: 'https://api.mailjet.com/v3/REST/campaign'
107-
108-
In [11]: data={
109-
'AllowedAccess': 'campaigns,contacts,reports,stats,preferences,property,contact_filter,account,pricing',
110-
'TokenType': 'iframe',
111-
'ValidFor': 500000,
112-
'IsActive': True}
113-
114-
115-
In [12]: c.ApiToken.create(data=data)
116-
Out[12]:
117-
{u'Count': 1,
118-
u'Data': [{u'APIKeyID': 111111,
119-
u'AllowedAccess': u'campaigns,contacts,reports,stats,preferences,property,contact_filter,account,pricing',
120-
u'CatchedIp': u'127.0.0.1',
121-
u'CreatedAt': u'2014-11-29T15:30:05Z',
122-
u'FirstUsedAt': u'',
123-
u'ID': 1536460,
124-
u'IsActive': True,
125-
u'Lang': u'',
126-
u'LastUsedAt': u'',
127-
u'SentData': u'',
128-
u'Timezone': u'',
129-
u'Token': u'xxxxxxxxxxxxxxxxxxxxxxxF4FE61C3BBC3146F9FA17A760F171250C10502C212EF00DE3A6F66DD68C494885F2F3BD49AB407019BD0D894B8885DE7',
130-
u'TokenType': u'iframe',
131-
u'ValidFor': 500000}],
132-
u'Total': 1}
133-
134-
## TODOs:
135-
136-
- tests
3+
## Getting Started
4+
5+
First, make sure you have an API key, and an API secret.
6+
Once you got them, save them in your environment:
7+
8+
```
9+
export MJ_APIKEY_PUBLIC='your api key'
10+
export MJ_APIKEY_PRIVATE='your api secret'
11+
```
12+
13+
``` python
14+
# import the mailjet wrapper
15+
from mailjet import Client
16+
import os
17+
18+
# Get your environment Mailjet keys
19+
API_KEY = os.environ['MJ_APIKEY_PUBLIC']
20+
API_SECRET = os.environ['MJ_APIKEY_PRIVATE']
21+
22+
mailjet = Client(auth=(API_KEY, API_SECRET))
23+
24+
```
25+
26+
## Make a `GET` request:
27+
``` python
28+
# get every contacts
29+
result = mailjet.contact.get()
30+
```
31+
32+
## `GET` request with filters:
33+
``` python
34+
# get the 2 first contacts
35+
result = mailjet.contact.get(filters={'limit': 2})
36+
```
37+
## `POST` request
38+
``` python
39+
# Register a new sender email address
40+
result = mailjet.sender.post(data={'email': '[email protected]'})
41+
```
42+
43+
## Combine an resource with an action
44+
``` python
45+
# Get the contact lists of contact #2
46+
result = mailjet.Contact_getcontactslists(id=2)
47+
```

mailjet/client.py

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import requests
88
from requests.compat import urljoin
99

10+
requests.packages.urllib3.disable_warnings()
1011

1112
class Config(object):
1213
API_URL = 'https://api.mailjet.com/v3/REST/'
@@ -92,31 +93,31 @@ def __getitem__(self, key):
9293

9394
class Endpoint(object):
9495

95-
def __init__(self, url, doc, auth):
96-
self._url, self._doc, self._auth = url, doc, auth
96+
def __init__(self, url, doc, auth, action=None):
97+
self._url, self._doc, self._auth, self.action = url, doc, auth, action
9798

9899
def __doc__(self):
99100
return self._doc
100101

101-
def _get(self, res_id=None, **kwargs):
102-
return api_call(self._auth, 'get', self._url, resource_id=res_id, **kwargs)
102+
def _get(self, filters=None, action_id=None, id=None, **kwargs):
103+
return api_call(self._auth, 'get', self._url, action=self.action, action_id=action_id, filters=filters, resource_id=id, **kwargs)
103104

104-
def get_many(self, **kwargs):
105-
return self._get(**kwargs)
105+
def get_many(self, filters=None, action_id=None, **kwargs):
106+
return self._get(filters=filters, **kwargs)
106107

107-
def get(self, res_id, **kwargs):
108-
return self._get(res_id, **kwargs)
108+
def get(self, id=None, filters=None, action_id=None, **kwargs):
109+
return self._get(id=id, filters=filters, **kwargs)
109110

110-
def create(self, data, **kwargs):
111-
return api_call(self._auth, 'post', self._url, data=data, **kwargs)
111+
def create(self, data, filters=None, action_id=None, **kwargs):
112+
return api_call(self._auth, 'post', self._url, data=data, action=self.action, action_id=action_id, filters=filters, **kwargs)
112113

113114
new = create
114115

115-
def update(self, res_id, data, **kwargs):
116-
return api_call(self._auth, 'put', self._url, resource_id=res_id, data=data, **kwargs)
116+
def update(self, res_id, data, filters=None, action_id=None, **kwargs):
117+
return api_call(self._auth, 'put', self._url, resource_id=res_id, data=data, action=self.action, action_id=action_id, filters=filters, **kwargs)
117118

118119
def delete(self, res_id, **kwargs):
119-
return api_call(self._auth, 'delete', self._url, resource_id=res_id, **kwargs)
120+
return api_call(self._auth, 'delete', self._url, action=self.action, action_id=action_id, resource_id=res_id, **kwargs)
120121

121122

122123
class Client(object):
@@ -129,21 +130,25 @@ def __dir__(self):
129130
return self.endpoints
130131

131132
def __getattr__(self, name):
133+
split = name.split('_')
134+
name = split[0]
135+
if (len(split) > 1):
136+
action = split[1]
132137
if name in self.endpoints:
133138
url, doc = self.config[name]
134-
return type(name, (Endpoint,), {})(url=url, doc=doc, auth=self.auth)
139+
return type(name, (Endpoint,), {})(url=url, doc=doc, action=action, auth=self.auth)
135140
raise AttributeError
136141

137142

138-
def api_call(auth, method, url, data=None, resource_id=None, extra_headers=None,
139-
timeout=60, debug=False, **kwargs):
140-
data, url = build_body_and_url(url, method=method,
141-
data=data, resource_id=resource_id)
143+
def api_call(auth, method, url, data=None, filters=None, resource_id=None, extra_headers=None,
144+
timeout=60, debug=False, action=None, action_id=None, **kwargs):
145+
url = build_url(url, method=method, action=action, resource_id=resource_id, action_id=action_id)
146+
print method, url, data
142147
headers = build_headers(extra_headers)
143148
req_method = getattr(requests, method)
144149

145150
try:
146-
response = req_method(url, data=data, headers=headers, auth=auth,
151+
response = req_method(url, data=data, params=filters, headers=headers, auth=auth,
147152
timeout=timeout, verify=False, stream=False)
148153

149154
return parse_response(response, debug=debug)
@@ -167,13 +172,15 @@ def build_headers(extra_headers=None):
167172
return headers
168173

169174

170-
def build_body_and_url(url, method, data=None, resource_id=None):
171-
data = json.dumps(data) if data else None
172-
175+
def build_url(url, method, action=None, resource_id=None, action_id=None):
173176
if resource_id:
174177
url += '/%d' % resource_id
178+
if action:
179+
url += '/%s' % action
180+
if action_id:
181+
url += '/%d' % action_id
175182

176-
return data, url
183+
return url
177184

178185

179186
def parse_response(response, debug=False):
@@ -188,29 +195,29 @@ def parse_response(response, debug=False):
188195
logging.debug('RESP_HEADERS: %s' % response.headers)
189196
logging.debug('RESP_CODE: %s' % response.status_code)
190197

191-
if response.status_code > 300:
192-
errors = data
193-
exc_data = dict(message=errors.get('ErrorMessage', None),
194-
info=errors.get('ErrorInfo', None),
195-
response_parsed=data,
196-
response=response,
197-
request=response.request,
198-
)
199-
200-
if response.status_code == 401:
201-
raise AuthorizationError(exc_data)
202-
elif response.status_code == 403:
203-
raise ActionDeniedError(exc_data)
204-
elif response.status_code == 404:
205-
raise DoesNotExistError(exc_data)
206-
elif response.status_code == 422:
207-
raise ValidationError(exc_data)
208-
elif response.status_code >= 500:
209-
logging.error('Critical API error', exc_info=True, extra=exc_data)
210-
raise CriticalApiError(errors)
211-
elif response.status_code >= 400:
212-
logging.error('API error', exc_info=True, extra=exc_data)
213-
raise ApiError(exc_data)
198+
# if response.status_code > 300:
199+
# errors = data
200+
# exc_data = dict(message=errors.get('ErrorMessage', None),
201+
# info=errors.get('ErrorInfo', None),
202+
# response_parsed=data,
203+
# response=response,
204+
# request=response.request,
205+
# )
206+
#
207+
# if response.status_code == 401:
208+
# raise AuthorizationError(exc_data)
209+
# elif response.status_code == 403:
210+
# raise ActionDeniedError(exc_data)
211+
# elif response.status_code == 404:
212+
# raise DoesNotExistError(exc_data)
213+
# elif response.status_code == 422:
214+
# raise ValidationError(exc_data)
215+
# elif response.status_code >= 500:
216+
# logging.error('Critical API error', exc_info=True, extra=exc_data)
217+
# raise CriticalApiError(errors)
218+
# elif response.status_code >= 400:
219+
# logging.error('API error', exc_info=True, extra=exc_data)
220+
# raise ApiError(exc_data)
214221

215222
return data
216223

mailjetv3

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 412ea58a46e1f786f6f27d7055c7c2ef6ccaaa03

mailjetv3/.gitignore

Lines changed: 0 additions & 30 deletions
This file was deleted.

mailjetv3/LICENSE

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)