Newer
Older
Swen Vermeul
committed
from .attribute import AttrHolder
Swen Vermeul
committed
from .openbis_object import OpenBisObject
Swen Vermeul
committed
from .utils import VERBOSE
class Person(OpenBisObject):
Swen Vermeul
committed
"""managing openBIS persons"""
Swen Vermeul
committed
def __init__(self, openbis_obj, data=None, **kwargs):
Swen Vermeul
committed
self.__dict__["openbis"] = openbis_obj
self.__dict__["a"] = AttrHolder(openbis_obj, "person")
Swen Vermeul
committed
if data is not None:
self.a(data)
Swen Vermeul
committed
self.__dict__["data"] = data
Swen Vermeul
committed
if kwargs is not None:
for key in kwargs:
setattr(self, key, kwargs[key])
def __dir__(self):
"""all the available methods and attributes that should be displayed
when using the autocompletion feature (TAB) in Jupyter
"""
return [
Swen Vermeul
committed
"permId",
"userId",
"firstName",
"lastName",
"email",
"registrator",
"registrationDate",
"space",
"get_roles()",
"assign_role(role, space)",
"revoke_role(role)",
Swen Vermeul
committed
]
def get_roles(self, **search_args):
Swen Vermeul
committed
"""Get all roles that are assigned to this person.
Swen Vermeul
committed
Provide additional search arguments to refine your search.
Usage::
person.get_roles()
person.get_roles(space='TEST_SPACE')
"""
return self.openbis.get_role_assignments(person=self, **search_args)
def assign_role(self, role, **kwargs):
try:
self.openbis.assign_role(role=role, person=self, **kwargs)
if VERBOSE:
print(f"Role {role} successfully assigned to person {self.userId}")
Swen Vermeul
committed
except ValueError as e:
Swen Vermeul
committed
if "exists" in str(e):
Swen Vermeul
committed
if VERBOSE:
print(f"Role {role} already assigned to person {self.userId}")
Swen Vermeul
committed
else:
raise ValueError(str(e))
Swen Vermeul
committed
def revoke_role(self, role, space=None, project=None, reason="no reason specified"):
"""Revoke a role from this person."""
Swen Vermeul
committed
techId = None
if isinstance(role, int):
techId = role
else:
Swen Vermeul
committed
query = {"role": role}
Swen Vermeul
committed
if space is None:
Swen Vermeul
committed
query["space"] = ""
Swen Vermeul
committed
else:
Swen Vermeul
committed
if isinstance(space, str):
query["space"] = space.upper()
else:
query["space"] = space.code.upper()
Swen Vermeul
committed
if project is None:
Swen Vermeul
committed
query["project"] = ""
Swen Vermeul
committed
else:
Swen Vermeul
committed
if isinstance(project, str):
query["project"] = project.upper()
else:
query["project"] = project.code.upper()
Swen Vermeul
committed
# build a query string for dataframe
querystr = " & ".join(f'{key} == "{value}"' for key, value in query.items())
Swen Vermeul
committed
roles = self.get_roles().df
if len(roles) == 0:
if VERBOSE:
Swen Vermeul
committed
print(
f"Role {role} has already been revoked from person {self.code}"
)
Swen Vermeul
committed
return
Swen Vermeul
committed
techId = roles.query(querystr)["techId"].values[0]
Swen Vermeul
committed
# finally delete the role assignment
ra = self.openbis.get_role_assignment(techId)
ra.delete(reason)
if VERBOSE:
print(f"Role {role} successfully revoked from person {self.code}")
Swen Vermeul
committed
return
def __str__(self):
return f'{self.get("firstName")} {self.get("lastName")}'
Swen Vermeul
committed
def delete(self, reason):
raise ValueError("Persons cannot be deleted")
def save(self):
if self.is_new:
request = self._new_attrs()
resp = self.openbis._post_request(self.openbis.as_v3, request)
Swen Vermeul
committed
if VERBOSE:
print("Person successfully created.")
new_person_data = self.openbis.get_person(resp[0]["permId"], only_data=True)
Swen Vermeul
committed
self._set_data(new_person_data)
return self
else:
request = self._up_attrs()
self.openbis._post_request(self.openbis.as_v3, request)
Swen Vermeul
committed
if VERBOSE:
print("Person successfully updated.")
Swen Vermeul
committed
new_person_data = self.openbis.get_person(self.permId, only_data=True)
self._set_data(new_person_data)