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