Error handling fix.
[redakcja.git] / src / apiclient / __init__.py
index 5eee2fd..44546d3 100644 (file)
@@ -1,7 +1,9 @@
+# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
 import json
-import oauth2
 from urllib.parse import urlencode
-
+import oauth2
 from apiclient.settings import WL_CONSUMER_KEY, WL_CONSUMER_SECRET, WL_API_URL, BETA_API_URL
 
 
@@ -19,7 +21,7 @@ class NotAuthorizedError(BaseException):
     pass
 
 
-def api_call(user, path, data=None, beta=False):
+def api_call(user, path, data=None, beta=False, method=None, as_json=False):
     from .models import OAuthConnection
     api_url = BETA_API_URL if beta else WL_API_URL
     conn = OAuthConnection.get(user=user, beta=beta)
@@ -29,22 +31,30 @@ def api_call(user, path, data=None, beta=False):
     client = oauth2.Client(wl_consumer, token)
     if data is not None:
         data = json.dumps(data)
-        data = urlencode({"data": data})
+        headers = {}
+        if as_json:
+            headers["Content-Type"] = 'application/json'
+        else:
+            data = urlencode({"data": data})
+        data = data.encode('utf-8')
+
         resp, content = client.request(
-                "%s%s" % (api_url, path),
-                method="POST",
-                body=data)
+            "%s%s" % (api_url, path),
+            method=method or 'POST',
+            headers=headers,
+            body=data)
     else:
         resp, content = client.request(
-                "%s%s" % (api_url, path))
+            "%s%s" % (api_url, path),
+            method=method or 'GET'
+        )
     status = resp['status']
 
-    if status == '200':
+    if status in ('200', '201'):
         return json.loads(content)
     elif status.startswith('2'):
         return
     elif status == '401':
         raise ApiError('User not authorized for publishing.')
     else:
-        raise ApiError("WL API call error %s, path: %s" % (status, path))
-
+        raise ApiError("WL API call error %s, path: %s, body: %s" % (status, path, content))