diff options
author | Filipp Lepalaan <filipp@mac.com> | 2017-02-24 15:42:31 +0200 |
---|---|---|
committer | Filipp Lepalaan <filipp@mac.com> | 2017-02-24 15:42:31 +0200 |
commit | fcf01fca44c4b1096ff3e628265c8802d4c4560f (patch) | |
tree | 37858c756bed33335b8bb71cf67e9766590d65c3 /bimclient | |
parent | f998a6bca5ab48ee2d5ce5f52f6a93cff2485c9e (diff) | |
download | bimclient-fcf01fca44c4b1096ff3e628265c8802d4c4560f.tar.gz bimclient-fcf01fca44c4b1096ff3e628265c8802d4c4560f.tar.bz2 bimclient-fcf01fca44c4b1096ff3e628265c8802d4c4560f.zip |
Diffstat (limited to 'bimclient')
-rw-r--r-- | bimclient/__init__.py | 5 | ||||
-rw-r--r-- | bimclient/bimclient.py | 52 |
2 files changed, 45 insertions, 12 deletions
diff --git a/bimclient/__init__.py b/bimclient/__init__.py index e69de29..f429e02 100644 --- a/bimclient/__init__.py +++ b/bimclient/__init__.py @@ -0,0 +1,5 @@ +__title__ = 'bimclient' +__version__ = '0.1' +__author__ = 'Filipp Lepalaan' +__license__ = 'BSD' +__copyright__ = 'Copyright 2017 Filipp Lepalaan' diff --git a/bimclient/bimclient.py b/bimclient/bimclient.py index 0f0873c..9991822 100644 --- a/bimclient/bimclient.py +++ b/bimclient/bimclient.py @@ -1,6 +1,9 @@ +import os import json -import logging import base64 +import shelve +import urllib +import logging import tempfile import subprocess @@ -25,14 +28,17 @@ class Session(object): """ Sends a request to the BIM server. """ - url = self.url + method params = {} + url = self.url + method + + if type(data) is str: + data = json.loads(data) if self.session_id: params['session-id'] = self.session_id if data: - self._request = requests.post(url, json=data) + self._request = requests.post(url, params=params, json=data) else: self._request = requests.get(url, params=params) @@ -47,7 +53,14 @@ class Session(object): self.response = self._request.json() except ValueError: raise Exception(self._text) - + + if type(self.response) == dict: + if self.response.get('error-code'): + raise Exception(self.response.get('error-message')) + + if self.response.get('status', 0) == 400: + raise Exception(self.response.get('message')) + if method.endswith('get-server-info'): self.server = self.response self.id = self.response.get('serverId') @@ -73,30 +86,45 @@ class Session(object): stdout=subprocess.PIPE) o, e = p.communicate(password + '00000000') password = base64.b64encode(o) - return password def login(self, username, password): """ Authenticates with the BIM server. + Returns self for further queries. """ - self.request('management/latest/get-server-public-key') - password = self.encrypt_password(password) - d = {'username': username, 'password': password} - logging.debug('Auth request: %s' % d) - self.request('management/latest/create-session', data=d) + db = os.path.join(tempfile.gettempdir(), 'bimclient_db') + cache = shelve.open(db) + session = cache.get('session') + + if session: + logging.debug('Using cached session: %s' % session) + self.response = session + else: + self.request('management/latest/get-server-public-key') + password = self.encrypt_password(password) + d = {'username': username, 'password': password} + self.request('management/latest/create-session', data=d) + cache['session'] = self.response + cache.close() + logging.debug(self.response) + self.user_id = self.response.get('user-id') self.session_id = self.response.get('session-id') self.session_timeout = self.response.get('expire-timeout') - if not self.user_id: + if self.user_id: + logging.debug('Logged in as %s' % self.user_id) + else: raise Exception('Authentication failed') return self def projects(self): - self.request('management/latest/get-projects-by-criterion') + data = json.loads('{"$and":[{"$or":[{"$eq":{"id":"projectRoot"}},{"$eq":{"$parentId":"projectRoot"}}]}]}') + self.request('management/latest/get-resources-by-criterion', data=data) + logging.debug(self.response) return self.response |