From f401f1855b39634fccccfb28af85423fafc7af74 Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Thu, 6 May 2021 11:46:36 +0200 Subject: [PATCH 1/6] added ability to connect via encrypted urls --- pyade/__init__.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/pyade/__init__.py b/pyade/__init__.py index 58af574..837658f 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -292,6 +292,21 @@ def _send_request(self, func, **params): return(element) + def _send_crypted_request(self, data): + """Send a request""" + params = dict() + params['data'] = data + + self.logger.debug("send %s" % hide_dict_values(params)) + response = requests.get(self.url, params=params) + self.logger.debug(response) + self.logger.debug(response.text) + element = ET.fromstring(response.text) + + self._parse_error(element) + + return(element) + def _parse_error(self, element): """Parses XML message and raises an Exception if this XML message is an error on server side""" @@ -307,6 +322,16 @@ def connect(self): self.sessionId = returned_sessionId return(returned_sessionId is not None) + def connectCrypted(self, data): + """Connect to server with a crypted url""" + element = self._send_crypted_request(data) + try : + returned_sessionId = element.attrib["id"] + self.sessionId = returned_sessionId + return(returned_sessionId is not None) + except: # The crypted data was probably not a connect request + return false + def disconnect(self): """Disconnect from server""" function = 'disconnect' From 0e90adb8ce9d81b91c2c700ceca39200a8c91fff Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Fri, 7 May 2021 09:07:36 +0200 Subject: [PATCH 2/6] add fatherIds to getRessources option --- pyade/__init__.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pyade/__init__.py b/pyade/__init__.py index 837658f..b2253ec 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -115,8 +115,7 @@ class Config(HiddenDict): password is never displayed but is stored in this class""" def __init__(self, **kwargs): super(Config, self).__init__(hidden_keys=['password'], **kwargs) -# super(Config, self).__init__(hidden_keys=['password'], -# replace_keys={'url': 'server'}, **kwargs) + #super(Config, self).__init__(hidden_keys=['password'],replace_keys={'url': 'server'}, **kwargs) @staticmethod def create(**default_values): @@ -244,7 +243,7 @@ def __init__(self, url, login, password): 'type', 'email', 'url', 'size', 'quantity', 'code', 'address1', 'address2', 'zipCode', 'state', 'city', 'country', 'telephone', 'fax', 'timezone', 'jobCategory', 'manager', 'codeX', 'codeY', - 'codeZ', 'info', 'detail']), + 'codeZ', 'info', 'detail', 'fatherIds']), 'getActivities': set(['tree', 'id', 'name', 'resources', 'type', 'url', 'capacity', 'duration', 'repetition', 'code', 'timezone', 'codeX', 'codeY', 'codeZ', 'maxSeats', 'seatseLeft', 'info']), @@ -360,7 +359,7 @@ def _create_list_of_objects(self, category, lst): def getProjects(self, **kwargs): """Returns (list of) projects""" function = 'getProjects' -# element = self._send_request(function, detail=detail, id=id) + #element = self._send_request(function, detail=detail, id=id) element = self._send_request(function, **kwargs) lst_projects = element.findall('project') lst_projects = self._create_list_of('project', lst_projects) @@ -437,7 +436,7 @@ def getCaracteristics(self, **kwargs): def getDate(self, week, day, slot): """Returns date object from week, day, slot""" function = 'getDate' -# self._test_opt_params(kwargs, function) # no keyword arguments (kwargs) + #self._test_opt_params(kwargs, function) # no keyword arguments (kwargs) element = self._send_request(function, week=week, day=day, slot=slot) date = Date(**element.attrib) return(date) @@ -450,7 +449,7 @@ def imageET(self, **kwargs): if 'function' not in kwargs.keys(): kwargs['function'] = function -# self._test_opt_params(kwargs, function) + #self._test_opt_params(kwargs, function) if 'sessionId' not in kwargs.keys(): if self.sessionId is not None: @@ -475,7 +474,7 @@ def first_date(self): def week_id(self, date=datetime.date.today()): """Returns week number for a given date""" -# week = ((date1-date0)/7).days + #week = ((date1-date0)/7).days if self._first_date is None: self._first_date = self.first_date() From 27c4ba6a29bdaa7010a82c50d31ccca6058274af Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Fri, 7 May 2021 10:05:01 +0200 Subject: [PATCH 3/6] adding cryptedLogin in config + refactoring --- pyade/__init__.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/pyade/__init__.py b/pyade/__init__.py index b2253ec..8855717 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -74,7 +74,8 @@ def get_info(key, default_value=None): try: return(os.environ[ENV_VAR_KEY]) except: - logging.warning("You should pass %s using --%s or using environment variable %r" % (key, key, ENV_VAR_KEY)) + #logging.warning("You should pass %s using --%s or using environment variable %r" % (key, key, ENV_VAR_KEY)) + #user only provide crypted url, or login/password, the warning is no more appropriate return(default_value) else: return(default_value) @@ -120,7 +121,7 @@ def __init__(self, **kwargs): @staticmethod def create(**default_values): d = Config() - for key in ['url', 'login', 'password']: + for key in ['url', 'login', 'password', 'cryptedLogin']: if key in default_values.keys(): d[key] = get_info(key, default_values[key]) else: @@ -222,10 +223,11 @@ def create_object(self, typ, **kwargs): class ADEWebAPI(): """Class to manage ADE Web API (reader only)""" - def __init__(self, url, login, password): + def __init__(self, url, login, password, cryptedLogin): self.url = url self.login = login self.password = password + self.cryptedLogin = cryptedLogin self.sessionId = None @@ -315,21 +317,17 @@ def _parse_error(self, element): def connect(self): """Connect to server""" function = 'connect' - element = self._send_request(function, - login=self.login, password=self.password) - returned_sessionId = element.attrib["id"] - self.sessionId = returned_sessionId - return(returned_sessionId is not None) - - def connectCrypted(self, data): - """Connect to server with a crypted url""" - element = self._send_crypted_request(data) - try : + if(self.login!=None and self.password!=None): + element = self._send_request(function, login=self.login, password=self.password) + elif(self.cryptedLogin!=None): + element = self._send_crypted_request(self.cryptedLogin) + + try: returned_sessionId = element.attrib["id"] + except: + returned_sessionId = None self.sessionId = returned_sessionId return(returned_sessionId is not None) - except: # The crypted data was probably not a connect request - return false def disconnect(self): """Disconnect from server""" From 6d0b0602c85c3df2031619787c16a2e300af8289 Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Mon, 10 May 2021 15:36:51 +0200 Subject: [PATCH 4/6] bugfix: error message was hardcoded for all functions --- pyade/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyade/__init__.py b/pyade/__init__.py index 8855717..b45fe02 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -342,7 +342,7 @@ def _test_opt_params(self, given_params, function): opt_params = self.opt_params[function] given_params = set(given_params.keys()) msg = "One (or many) parameters of '%s' call are not allowed. %s is not in %s" \ - % ('getResources', given_params-opt_params, opt_params) + % (function, given_params-opt_params, opt_params) assert given_params <= opt_params, msg def _create_list_of_dicts(self, category, lst): From 37117f2c4a60906c246b6313eeeb8c8ef6309a78 Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Mon, 10 May 2021 15:42:41 +0200 Subject: [PATCH 5/6] bugfix: add `detail` parameter to getActivities --- pyade/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyade/__init__.py b/pyade/__init__.py index b45fe02..b413467 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -248,7 +248,7 @@ def __init__(self, url, login, password, cryptedLogin): 'codeZ', 'info', 'detail', 'fatherIds']), 'getActivities': set(['tree', 'id', 'name', 'resources', 'type', 'url', 'capacity', 'duration', 'repetition', 'code', 'timezone', 'codeX', - 'codeY', 'codeZ', 'maxSeats', 'seatseLeft', 'info']), + 'codeY', 'codeZ', 'maxSeats', 'seatseLeft', 'info', 'detail']), 'getEvents': set(['eventId', 'activities', 'name', 'resources', 'weeks', 'days', 'date', 'detail']), 'getCosts': set(['id', 'name']), From 6325f44384276e5c2213f9772e07d4c1ccb03590 Mon Sep 17 00:00:00 2001 From: Gilles Mertens Date: Wed, 12 May 2021 13:32:24 +0200 Subject: [PATCH 6/6] bugfix : connect not returning bool when no exception is thrown --- pyade/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyade/__init__.py b/pyade/__init__.py index b413467..6e25a39 100644 --- a/pyade/__init__.py +++ b/pyade/__init__.py @@ -321,13 +321,13 @@ def connect(self): element = self._send_request(function, login=self.login, password=self.password) elif(self.cryptedLogin!=None): element = self._send_crypted_request(self.cryptedLogin) - + try: returned_sessionId = element.attrib["id"] except: returned_sessionId = None - self.sessionId = returned_sessionId - return(returned_sessionId is not None) + self.sessionId = returned_sessionId + return(returned_sessionId is not None) def disconnect(self): """Disconnect from server"""