diff --git a/lib/galaxy/managers/group_users.py b/lib/galaxy/managers/group_users.py new file mode 100644 index 00000000000..e9e995bb8c2 --- /dev/null +++ b/lib/galaxy/managers/group_users.py @@ -0,0 +1,115 @@ +import logging + +from galaxy.util import unicodify +from galaxy.web import url_for + +log = logging.getLogger(__name__) + + +class GroupUsersManager: + """Interface/service object shared by controllers for interacting with group users.""" + + def __init__(self, app) -> None: + self._app = app + + def index(self, trans, group_id, **kwd): + """ + Displays a collection (list) of groups. + """ + decoded_group_id = trans.security.decode_id(group_id) + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + except Exception: + group = None + if not group: + trans.response.status = 400 + return "Invalid group id ( %s ) specified." % str(group_id) + rval = [] + try: + for uga in group.users: + user = uga.user + encoded_id = trans.security.encode_id(user.id) + rval.append(dict(id=encoded_id, + email=user.email, + url=url_for('group_user', group_id=group_id, id=encoded_id, ))) + except Exception as e: + rval = "Error in group API at listing users" + log.error(rval + ": %s", unicodify(e)) + trans.response.status = 500 + return rval + + def show(self, trans, id, group_id, **kwd): + """ + Displays information about a group user. + """ + user_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_user_id = trans.security.decode_id(user_id) + item = None + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) + for uga in group.users: + if uga.user == user: + item = dict(id=user_id, + email=user.email, + url=url_for('group_user', group_id=group_id, id=user_id)) # TODO Fix This + if not item: + item = f"user {user.email} not in group {group.name}" + except Exception as e: + item = f"Error in group_user API group {group.name} user {user.email}" + log.error(item + ": %s", unicodify(e)) + return item + + def update(self, trans, id, group_id, **kwd): + """ + Adds a user to a group + """ + user_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_user_id = trans.security.decode_id(user_id) + item = None + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) + for uga in group.users: + if uga.user == user: + item = dict(id=user_id, + email=user.email, + url=url_for('group_user', group_id=group_id, id=user_id)) + if not item: + uga = trans.app.model.UserGroupAssociation(user, group) + # Add UserGroupAssociations + trans.sa_session.add(uga) + trans.sa_session.flush() + item = dict(id=user_id, + email=user.email, + url=url_for('group_user', group_id=group_id, id=user_id)) + except Exception as e: + item = f"Error in group_user API Adding user {user.email} to group {group.name}" + log.error(item + ": %s", unicodify(e)) + return item + + def delete(self, trans, id, group_id, **kwd): + """ + Removes a user from a group + """ + user_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_user_id = trans.security.decode_id(user_id) + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) + for uga in group.users: + if uga.user == user: + trans.sa_session.delete(uga) + trans.sa_session.flush() + item = dict(id=user_id, + email=user.email, + url=url_for('group_user', group_id=group_id, id=user_id)) + if not item: + item = f"user {user.email} not in group {group.name}" + except Exception as e: + item = f"Error in group_user API Removing user {user.email} from group {group.name}" + log.error(item + ": %s", unicodify(e)) + return item diff --git a/lib/galaxy/webapps/galaxy/api/group_users.py b/lib/galaxy/webapps/galaxy/api/group_users.py index 123d8640402..f33499263aa 100644 --- a/lib/galaxy/webapps/galaxy/api/group_users.py +++ b/lib/galaxy/webapps/galaxy/api/group_users.py @@ -3,18 +3,22 @@ API operations on Group objects. """ import logging -from galaxy.util import unicodify +from galaxy.managers.group_users import GroupUsersManager from galaxy.web import ( expose_api, require_admin, ) -from galaxy.webapps.base.controller import BaseAPIController, url_for +from galaxy.webapps.base.controller import BaseAPIController log = logging.getLogger(__name__) class GroupUsersAPIController(BaseAPIController): + def __init__(self, app): + super().__init__(app) + self.manager = GroupUsersManager(app) + @require_admin @expose_api def index(self, trans, group_id, **kwd): @@ -22,27 +26,7 @@ class GroupUsersAPIController(BaseAPIController): GET /api/groups/{encoded_group_id}/users Displays a collection (list) of groups. """ - decoded_group_id = trans.security.decode_id(group_id) - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - except Exception: - group = None - if not group: - trans.response.status = 400 - return "Invalid group id ( %s ) specified." % str(group_id) - rval = [] - try: - for uga in group.users: - user = uga.user - encoded_id = trans.security.encode_id(user.id) - rval.append(dict(id=encoded_id, - email=user.email, - url=url_for('group_user', group_id=group_id, id=encoded_id, ))) - except Exception as e: - rval = "Error in group API at listing users" - log.error(rval + ": %s", unicodify(e)) - trans.response.status = 500 - return rval + return self.manager.index(trans, group_id) @require_admin @expose_api @@ -51,24 +35,7 @@ class GroupUsersAPIController(BaseAPIController): GET /api/groups/{encoded_group_id}/users/{encoded_user_id} Displays information about a group user. """ - user_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_user_id = trans.security.decode_id(user_id) - item = None - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) - for uga in group.users: - if uga.user == user: - item = dict(id=user_id, - email=user.email, - url=url_for('group_user', group_id=group_id, id=user_id)) # TODO Fix This - if not item: - item = f"user {user.email} not in group {group.name}" - except Exception as e: - item = f"Error in group_user API group {group.name} user {user.email}" - log.error(item + ": %s", unicodify(e)) - return item + return self.manager.show(trans, id, group_id) @require_admin @expose_api @@ -77,30 +44,7 @@ class GroupUsersAPIController(BaseAPIController): PUT /api/groups/{encoded_group_id}/users/{encoded_user_id} Adds a user to a group """ - user_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_user_id = trans.security.decode_id(user_id) - item = None - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) - for uga in group.users: - if uga.user == user: - item = dict(id=user_id, - email=user.email, - url=url_for('group_user', group_id=group_id, id=user_id)) - if not item: - uga = trans.app.model.UserGroupAssociation(user, group) - # Add UserGroupAssociations - trans.sa_session.add(uga) - trans.sa_session.flush() - item = dict(id=user_id, - email=user.email, - url=url_for('group_user', group_id=group_id, id=user_id)) - except Exception as e: - item = f"Error in group_user API Adding user {user.email} to group {group.name}" - log.error(item + ": %s", unicodify(e)) - return item + return self.manager.update(trans, id, group_id) @require_admin @expose_api @@ -109,22 +53,4 @@ class GroupUsersAPIController(BaseAPIController): DELETE /api/groups/{encoded_group_id}/users/{encoded_user_id} Removes a user from a group """ - user_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_user_id = trans.security.decode_id(user_id) - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - user = trans.sa_session.query(trans.app.model.User).get(decoded_user_id) - for uga in group.users: - if uga.user == user: - trans.sa_session.delete(uga) - trans.sa_session.flush() - item = dict(id=user_id, - email=user.email, - url=url_for('group_user', group_id=group_id, id=user_id)) - if not item: - item = f"user {user.email} not in group {group.name}" - except Exception as e: - item = f"Error in group_user API Removing user {user.email} from group {group.name}" - log.error(item + ": %s", unicodify(e)) - return item + return self.manager.delete(trans, id, group_id)