Librarian in regular requirements.
[redakcja.git] / apps / apiclient / __init__.py
1 import urllib
2
3 import json
4 import oauth2
5
6 from apiclient.settings import WL_CONSUMER_KEY, WL_CONSUMER_SECRET, WL_API_URL, BETA_API_URL
7
8
9 if WL_CONSUMER_KEY and WL_CONSUMER_SECRET:
10     wl_consumer = oauth2.Consumer(WL_CONSUMER_KEY, WL_CONSUMER_SECRET)
11 else:
12     wl_consumer = None
13
14
15 class ApiError(BaseException):
16     pass
17
18
19 class NotAuthorizedError(BaseException):
20     pass
21
22
23 def api_call(user, path, data=None, beta=False):
24     from .models import OAuthConnection
25     api_url = BETA_API_URL if beta else WL_API_URL
26     conn = OAuthConnection.get(user=user, beta=beta)
27     if not conn.access:
28         raise NotAuthorizedError("No WL authorization for user %s." % user)
29     token = oauth2.Token(conn.token, conn.token_secret)
30     client = oauth2.Client(wl_consumer, token)
31     if data is not None:
32         data = json.dumps(data)
33         data = urllib.urlencode({"data": data})
34         resp, content = client.request(
35                 "%s%s" % (api_url, path),
36                 method="POST",
37                 body=data)
38     else:
39         resp, content = client.request(
40                 "%s%s" % (api_url, path))
41     status = resp['status']
42
43     if status == '200':
44         return json.loads(content)
45     elif status.startswith('2'):
46         return
47     elif status == '401':
48         raise ApiError('User not authorized for publishing.')
49     else:
50         raise ApiError("WL API call error %s, path: %s" % (status, path))
51