Cleanup for easier builds using hudson.
[redakcja.git] / lib / wlapi / __init__.py
diff --git a/lib/wlapi/__init__.py b/lib/wlapi/__init__.py
new file mode 100644 (file)
index 0000000..3284211
--- /dev/null
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
+"""
+   Abstraction over API for wolnelektury.pl
+"""
+import urllib2
+import functools
+import django.utils.simplejson as json
+import logging
+logger = logging.getLogger("fnp.lib.wlapi")
+
+
+class APICallException(Exception):
+
+    def __init__(self, cause=None):
+        super(Exception, self).__init__()
+        self.cause = cause
+
+    def __unicode__(self):
+        return u"%s, cause: %s" % (type(self).__name__, repr(self.cause))
+
+    def __str__(self):
+        return self.__unicode__().encode('utf-8')
+
+
+def api_call(path, format="json"):
+    def wrapper(func):
+
+        @functools.wraps(func)
+        def wrapped(self, *args, **kwargs):
+            generator = func(self, *args, **kwargs)
+
+            data = generator.next()
+
+            # prepare request
+            rq = urllib2.Request(self.base_url + path + ".json")
+
+            # will send POST when there is data, GET otherwise
+            if data is not None:
+                rq.add_data(json.dumps(data))
+                rq.add_header("Content-Type", "application/json")
+
+            try:
+                anwser = json.load(self.opener.open(rq))
+                return generator.send(anwser)
+            except StopIteration:
+                # by default, just return the anwser as a shorthand
+                return anwser
+            except urllib2.HTTPError, error:
+                return self._http_error(error)
+            except Exception, error:
+                return self._error(error)
+        return wrapped
+
+    return wrapper
+
+
+class WLAPI(object):
+
+    def __init__(self, **config_dict):
+        self.base_url = config_dict['URL']
+        self.auth_realm = config_dict['AUTH_REALM']
+        self.auth_user = config_dict['AUTH_USER']
+
+        digest_handler = urllib2.HTTPDigestAuthHandler()
+        digest_handler.add_password(
+                    realm=self.auth_realm, uri=self.base_url,
+                    user=self.auth_user, passwd=config_dict['AUTH_PASSWD'])
+
+        basic_handler = urllib2.HTTPBasicAuthHandler()
+        basic_handler.add_password(
+                    realm=self.auth_realm, uri=self.base_url,
+                    user=self.auth_user, passwd=config_dict['AUTH_PASSWD'])
+
+        self.opener = urllib2.build_opener(digest_handler, basic_handler)
+
+    def _http_error(self, error):
+        message = error.read()
+        logger.debug("HTTP ERROR: %s", message)
+        return self._error(message)
+
+    def _error(self, error):
+        raise APICallException(error)
+
+    @api_call("books")
+    def list_books(self):
+        yield
+
+    @api_call("books")
+    def publish_book(self, document):
+        yield {"text": document.text, "compressed": False}