from osmclient.common.exceptions import ClientException
from osmclient.common.exceptions import NotFound
import json
-# import yaml
class User(object):
def create(self, name, user):
"""Creates a new OSM user
"""
- if len(user["projects"]) == 1:
+ if not user["projects"] or (len(user["projects"]) == 1 and not user["projects"][0]):
+ del user["projects"]
+ elif len(user["projects"]) == 1:
user["projects"] = user["projects"][0].split(",")
+
+ if user["project_role_mappings"]:
+ project_role_mappings = []
+
+ for set_mapping in user["project_role_mappings"]:
+ set_mapping_clean = [m.strip() for m in set_mapping.split(",")]
+ project, roles = set_mapping_clean[0], set_mapping_clean[1:]
+
+ for role in roles:
+ mapping = {"project": project, "role": role}
+
+ if mapping not in project_role_mappings:
+ project_role_mappings.append(mapping)
+
+ user["project_role_mappings"] = project_role_mappings
+ else:
+ del user["project_role_mappings"]
+
http_code, resp = self._http.post_cmd(endpoint=self._apiBase,
postfields_dict=user)
#print('HTTP CODE: {}'.format(http_code))
"""Updates an existing OSM user identified by name
"""
myuser = self.get(name)
- http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase,myuser['_id']),
- postfields_dict=user)
- #print('HTTP CODE: {}'.format(http_code))
- #print('RESP: {}'.format(resp))
- if http_code in (200, 201, 202, 204):
+ update_user = {
+ "username": myuser["username"],
+ "project_role_mappings": myuser["project_role_mappings"]
+ }
+
+ # if password is defined, update the password
+ if user["password"]:
+ update_user["password"] = user["password"]
+
+ if user["set-project"]:
+ for set_project in user["set-project"]:
+ set_project_clean = [m.strip() for m in set_project.split(",")]
+ project, roles = set_project_clean[0], set_project_clean[1:]
+
+ update_user["project_role_mappings"] = [mapping for mapping
+ in update_user["project_role_mappings"]
+ if mapping["project"] != project]
+
+ for role in roles:
+ mapping = {"project": project, "role": role}
+ update_user["project_role_mappings"].append(mapping)
+
+ if user["remove-project"]:
+ for remove_project in user["remove-project"]:
+ update_user["project_role_mappings"] = [mapping for mapping
+ in update_user["project_role_mappings"]
+ if mapping["project"] != remove_project]
+
+ if user["add-project-role"]:
+ for add_project_role in user["add-project-role"]:
+ add_project_role_clean = [m.strip() for m in add_project_role.split(",")]
+ project, roles = add_project_role_clean[0], add_project_role_clean[1:]
+
+ for role in roles:
+ mapping = {"project": project, "role": role}
+ if mapping not in update_user["project_role_mappings"]:
+ update_user["project_role_mappings"].append(mapping)
+
+ if user["remove-project-role"]:
+ for remove_project_role in user["remove-project-role"]:
+ remove_project_role_clean = [m.strip() for m in remove_project_role.split(",")]
+ project, roles = remove_project_role_clean[0], remove_project_role_clean[1:]
+
+ for role in roles:
+ mapping_to_remove = {"project": project, "role": role}
+ update_user["project_role_mappings"] = [mapping for mapping
+ in update_user["project_role_mappings"]
+ if mapping != mapping_to_remove]
+
+ if not user["password"] and not user["set-project"] and not user["remove-project"] \
+ and not user["add-project-role"] and not user["remove-project-role"]:
+ raise ClientException("At least one parameter should be defined.")
+
+ http_code, resp = self._http.put_cmd(endpoint='{}/{}'.format(self._apiBase, myuser['_id']),
+ postfields_dict=update_user)
+ # print('HTTP CODE: {}'.format(http_code))
+ # print('RESP: {}'.format(resp))
+ if http_code in (200, 201, 202):
if resp:
resp = json.loads(resp)
if not resp or 'id' not in resp:
raise ClientException('unexpected response from server - {}'.format(
resp))
print(resp['id'])
+ elif http_code == 204:
+ print('Updated')
else:
msg = ""
if resp: