diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 85f3c9155687..8efb0ea96d7f 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -106,6 +106,7 @@ association_proxy, AssociationProxy, ) +from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.ext.orderinglist import ordering_list from sqlalchemy.orm import ( aliased, @@ -155,6 +156,7 @@ UUIDType, ) from galaxy.model.database_object_names import NAMING_CONVENTION +from galaxy.model.db.user import get_user_for_private_role from galaxy.model.item_attrs import ( get_item_annotation_str, UsesAnnotations, @@ -3747,7 +3749,7 @@ class Role(Base, Dictifiable, RepresentById): id: Mapped[int] = mapped_column(primary_key=True) create_time: Mapped[datetime] = mapped_column(default=now, nullable=True) update_time: Mapped[datetime] = mapped_column(default=now, onupdate=now, nullable=True) - name: Mapped[str] = mapped_column(String(255), index=True) + _name: Mapped[str] = mapped_column("name", String(255), index=True) description: Mapped[Optional[str]] = mapped_column(TEXT) type: Mapped[Optional[str]] = mapped_column(String(40), index=True) deleted: Mapped[Optional[bool]] = mapped_column(index=True, default=False) @@ -3766,6 +3768,19 @@ class types(str, Enum): ADMIN = "admin" SHARING = "sharing" + @hybrid_property + def name(self): + if self.type == Role.types.PRIVATE: + session = object_session(self) + user = get_user_for_private_role(session, self) + return f"private role for {user.email}" + else: + return self._name + + @name.setter + def name(self, name): + self._name = name + @staticmethod def default_name(role_type): return f"{role_type.value} role" diff --git a/test/unit/data/model/db/test_role.py b/test/unit/data/model/db/test_role.py index 213314c5c609..af90ce4484d2 100644 --- a/test/unit/data/model/db/test_role.py +++ b/test/unit/data/model/db/test_role.py @@ -7,6 +7,23 @@ from . import have_same_elements +def test_role_name_property(session, make_role, make_user_and_role): + r1 = make_role(name="foo") + u, r2 = make_user_and_role(email="joe@bar.com") + + # Verify private role name references user + assert r1.name == "foo" + assert r2.name == "private role for joe@bar.com" + + # Update user's email + u.email = "updated@bar.com" + session.add(u) + session.commit() + + # Verify private role name references updated user's email + assert r2.name == "private role for updated@bar.com" + + def test_get_npns_roles(session, make_role): make_role(deleted=True) make_role(type=Role.types.PRIVATE)