From 3f49ea92133c68efe1499047ddf4a62c9bd90224 Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 18 Feb 2021 20:12:07 +0100 Subject: [PATCH] Move controller logic to GroupRolesManager --- lib/galaxy/managers/group_roles.py | 115 +++++++++++++++++++ lib/galaxy/webapps/galaxy/api/group_roles.py | 94 ++------------- 2 files changed, 125 insertions(+), 84 deletions(-) create mode 100644 lib/galaxy/managers/group_roles.py diff --git a/lib/galaxy/managers/group_roles.py b/lib/galaxy/managers/group_roles.py new file mode 100644 index 00000000000..cc0218e6178 --- /dev/null +++ b/lib/galaxy/managers/group_roles.py @@ -0,0 +1,115 @@ +import logging + +from galaxy.util import unicodify +from galaxy.web import url_for + +log = logging.getLogger(__name__) + + +class GroupRolesManager: + """Interface/service object shared by controllers for interacting with group roles.""" + + def __init__(self, app) -> None: + self._app = app + + def index(self, trans, group_id): + """ + Returns a collection (list) of roles. + """ + 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 gra in group.roles: + role = gra.role + encoded_id = trans.security.encode_id(role.id) + rval.append(dict(id=encoded_id, + name=role.name, + url=url_for('group_role', group_id=group_id, id=encoded_id, ))) + except Exception as e: + rval = "Error in group API at listing roles" + log.error(rval + ": %s", unicodify(e)) + trans.response.status = 500 + return rval + + def show(self, trans, id, group_id): + """ + Returns information about a group role. + """ + role_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_role_id = trans.security.decode_id(role_id) + item = None + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) + for gra in group.roles: + if gra.role == role: + item = dict(id=role_id, + name=role.name, + url=url_for('group_role', group_id=group_id, id=role_id)) # TODO Fix This + if not item: + item = f"role {role.name} not in group {group.name}" + except Exception as e: + item = f"Error in group_role API group {group.name} role {role.name}" + log.error(item + ": %s", unicodify(e)) + return item + + def update(self, trans, id, group_id): + """ + Adds a role to a group + """ + role_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_role_id = trans.security.decode_id(role_id) + item = None + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) + for gra in group.roles: + if gra.role == role: + item = dict(id=role_id, + name=role.name, + url=url_for('group_role', group_id=group_id, id=role_id)) + if not item: + gra = trans.app.model.GroupRoleAssociation(group, role) + # Add GroupRoleAssociation + trans.sa_session.add(gra) + trans.sa_session.flush() + item = dict(id=role_id, + name=role.name, + url=url_for('group_role', group_id=group_id, id=role_id)) + except Exception as e: + item = f"Error in group_role API Adding role {role.name} to group {group.name}" + log.error(item + ": %s", unicodify(e)) + return item + + def delete(self, trans, id, group_id): + """ + Removes a role from a group + """ + role_id = id + decoded_group_id = trans.security.decode_id(group_id) + decoded_role_id = trans.security.decode_id(role_id) + try: + group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) + role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) + for gra in group.roles: + if gra.role == role: + trans.sa_session.delete(gra) + trans.sa_session.flush() + item = dict(id=role_id, + name=role.name, + url=url_for('group_role', group_id=group_id, id=role_id)) + if not item: + item = f"role {role.name} not in group {group.name}" + except Exception as e: + item = f"Error in group_role API Removing role {role.name} from group {group.name}" + log.error(item + ": %s", unicodify(e)) + return item diff --git a/lib/galaxy/webapps/galaxy/api/group_roles.py b/lib/galaxy/webapps/galaxy/api/group_roles.py index 3f944803dd6..d7361b5ec5c 100644 --- a/lib/galaxy/webapps/galaxy/api/group_roles.py +++ b/lib/galaxy/webapps/galaxy/api/group_roles.py @@ -3,18 +3,22 @@ API operations on Group objects. """ import logging -from galaxy.util import unicodify +from galaxy.managers.group_roles import GroupRolesManager 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 GroupRolesAPIController(BaseAPIController): + def __init__(self, app): + super().__init__(app) + self.manager = GroupRolesManager(app) + @require_admin @expose_api def index(self, trans, group_id, **kwd): @@ -22,27 +26,7 @@ class GroupRolesAPIController(BaseAPIController): GET /api/groups/{encoded_group_id}/roles 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 gra in group.roles: - role = gra.role - encoded_id = trans.security.encode_id(role.id) - rval.append(dict(id=encoded_id, - name=role.name, - url=url_for('group_role', group_id=group_id, id=encoded_id, ))) - except Exception as e: - rval = "Error in group API at listing roles" - 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 GroupRolesAPIController(BaseAPIController): GET /api/groups/{encoded_group_id}/roles/{encoded_role_id} Displays information about a group role. """ - role_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_role_id = trans.security.decode_id(role_id) - item = None - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) - for gra in group.roles: - if gra.role == role: - item = dict(id=role_id, - name=role.name, - url=url_for('group_role', group_id=group_id, id=role_id)) # TODO Fix This - if not item: - item = f"role {role.name} not in group {group.name}" - except Exception as e: - item = f"Error in group_role API group {group.name} role {role.name}" - 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 GroupRolesAPIController(BaseAPIController): PUT /api/groups/{encoded_group_id}/roles/{encoded_role_id} Adds a role to a group """ - role_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_role_id = trans.security.decode_id(role_id) - item = None - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) - for gra in group.roles: - if gra.role == role: - item = dict(id=role_id, - name=role.name, - url=url_for('group_role', group_id=group_id, id=role_id)) - if not item: - gra = trans.app.model.GroupRoleAssociation(group, role) - # Add GroupRoleAssociation - trans.sa_session.add(gra) - trans.sa_session.flush() - item = dict(id=role_id, - name=role.name, - url=url_for('group_role', group_id=group_id, id=role_id)) - except Exception as e: - item = f"Error in group_role API Adding role {role.name} 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 GroupRolesAPIController(BaseAPIController): DELETE /api/groups/{encoded_group_id}/roles/{encoded_role_id} Removes a role from a group """ - role_id = id - decoded_group_id = trans.security.decode_id(group_id) - decoded_role_id = trans.security.decode_id(role_id) - try: - group = trans.sa_session.query(trans.app.model.Group).get(decoded_group_id) - role = trans.sa_session.query(trans.app.model.Role).get(decoded_role_id) - for gra in group.roles: - if gra.role == role: - trans.sa_session.delete(gra) - trans.sa_session.flush() - item = dict(id=role_id, - name=role.name, - url=url_for('group_role', group_id=group_id, id=role_id)) - if not item: - item = f"role {role.name} not in group {group.name}" - except Exception as e: - item = f"Error in group_role API Removing role {role.name} from group {group.name}" - log.error(item + ": %s", unicodify(e)) - return item + return self.manager.delete(trans, id, group_id)