Skip to content

Commit

Permalink
Add method to retrieve roles with resolved names
Browse files Browse the repository at this point in the history
  • Loading branch information
jdavcs committed Oct 23, 2024
1 parent 2be02a6 commit cd0b567
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 1 deletion.
1 change: 1 addition & 0 deletions lib/galaxy/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3758,6 +3758,7 @@ class Role(Base, Dictifiable, RepresentById):
dict_collection_visible_keys = ["id", "name"]
dict_element_visible_keys = ["id", "name", "description", "type"]
private_id = None
private_role_name_prefix = "private role for "

class types(str, Enum):
PRIVATE = "private"
Expand Down
17 changes: 17 additions & 0 deletions lib/galaxy/model/db/role.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,28 @@

from galaxy.model import (
Role,
User,
UserRoleAssociation,
)
from galaxy.model.scoped_session import galaxy_scoped_session


def get_roles_with_resolved_names(session):
"""
Return list of roles with names resolved against associated user
NOTE: do not update roles from this list, otherwise, the resolved name will be saved.
"""
stmt = select(Role, User.email).outerjoin(Role.users).outerjoin(User)
data = session.execute(stmt)
roles = []
for row in data:
role, email = row[0], row[1]
if role.type == Role.types.PRIVATE:
role.name = f"{Role.private_role_name_prefix}{email}"
roles.append(role)
return roles


def get_npns_roles(session):
"""
non-private, non-sharing roles
Expand Down
38 changes: 37 additions & 1 deletion test/unit/data/model/db/test_role.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,48 @@
from galaxy.model import Role
from sqlalchemy import select

from galaxy.model import (
Role,
User,
)
from galaxy.model.db.role import (
get_npns_roles,
get_private_user_role,
get_roles_by_ids,
get_roles_with_resolved_names,
)
from . import have_same_elements


def test_get_roles_with_resolved_names(session, make_user_and_role, make_role):
u1, r1 = make_user_and_role(email="jack@foo.com")
u2, r2 = make_user_and_role(email="jill@bar.com")
r3 = make_role(name="foo")
r4 = make_role(name="bar")

roles = get_roles_with_resolved_names(session)
role_names = [r.name for r in roles]
assert len(role_names) == 4
assert "foo" in role_names
assert "bar" in role_names
assert "private role for jack@foo.com" in role_names
assert "private role for jill@bar.com" in role_names

# update user emails
u1.email = "updated-jack@foo.com"
u2.email = "updated-jill@bar.com"
session.add_all([u1, u2])
session.commit()

# verify role names reflect updated emails
roles = get_roles_with_resolved_names(session)
role_names = [r.name for r in roles]
assert len(role_names) == 4
assert "foo" in role_names
assert "bar" in role_names
assert "private role for updated-jack@foo.com" in role_names
assert "private role for updated-jill@bar.com" in role_names


def test_get_npns_roles(session, make_role):
make_role(deleted=True)
make_role(type=Role.types.PRIVATE)
Expand Down

0 comments on commit cd0b567

Please sign in to comment.