aboutsummaryrefslogtreecommitdiffstats
path: root/bimclient
diff options
context:
space:
mode:
authorFilipp Lepalaan <filipp@mac.com>2017-02-24 15:42:31 +0200
committerFilipp Lepalaan <filipp@mac.com>2017-02-24 15:42:31 +0200
commitfcf01fca44c4b1096ff3e628265c8802d4c4560f (patch)
tree37858c756bed33335b8bb71cf67e9766590d65c3 /bimclient
parentf998a6bca5ab48ee2d5ce5f52f6a93cff2485c9e (diff)
downloadbimclient-master.tar.gz
bimclient-master.tar.bz2
bimclient-master.zip
Added session_id cachingHEADmaster
Diffstat (limited to 'bimclient')
-rw-r--r--bimclient/__init__.py5
-rw-r--r--bimclient/bimclient.py52
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