cr-connect-workflow/crc/scripts/ldap.py

77 lines
2.8 KiB
Python
Executable File

import copy
from flask import g
from crc import app
from crc.api.common import ApiError
from crc.scripts.script import Script
from crc.services.ldap_service import LdapService
from crc.services.user_service import UserService
class Ldap(Script):
"""This Script allows to be introduced as part of a workflow and called from there, taking
a UID (or several) as input and looking it up through LDAP to return the person's details.
If no user id is specified, returns information about the current user."""
def get_description(self):
return """
Attempts to create a dictionary with person details, using the
provided argument (a UID) and look it up through LDAP. If no UID is
provided, then returns information about the current user.
Examples:
supervisor_info = ldap(supervisor_uid) // Sets the supervisor information to ldap details for the given uid.
"""
def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs):
return {
"display_name": "John Smith",
"given_name": "Johnismidges Ego Smithogglesnots",
"email_address": "jes@ogglesnots.org",
"telephone_number": "540-457-0023",
"title": "Prodigious Experilisious Emeritus Eqs.",
"department": "Department of Cheese and Fungus Combustibles",
"affiliation": "Not really",
"sponsor_type": "Department of Fungus",
"uid": "jes42",
"proper_name": "Smith"
}
def do_task(self, task, study_id, workflow_id, *args, **kwargs):
return self.set_users_info_in_task(task, args)
def set_users_info_in_task(self, task, args):
if len(args) > 1:
raise ApiError(code="invalid_argument",
message="Ldap takes at most one argument, the "
"UID for the person we want to look up.")
if len(args) < 1:
if UserService.has_user():
uid = UserService.current_user().uid
else:
uid = args[0]
try:
user_info = LdapService.user_info(uid)
except ApiError as ae:
app.logger.info(ae)
return {}
except Exception as e:
app.logger.info(e)
return {}
else:
user_info_dict = {
"display_name": user_info.display_name,
"given_name": user_info.given_name,
"email_address": user_info.email_address,
"telephone_number": user_info.telephone_number,
"title": user_info.title,
"department": user_info.department,
"affiliation": user_info.affiliation,
"sponsor_type": user_info.sponsor_type,
"uid": user_info.uid,
"proper_name": user_info.proper_name()
}
return user_info_dict