diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index 563e89ec144..0786651e8d9 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -10736,6 +10736,20 @@ WorkflowInvocationStep.subworkflow_invocation_id = column_property( # .preferences[pref_name] = pref_value User.preferences = association_proxy("_preferences", "value", creator=UserPreference) +# Optimized version of getting the current Galaxy session. +# See https://github.com/sqlalchemy/sqlalchemy/discussions/7638 for approach +session_partition = select( + GalaxySession, + func.row_number().over(order_by=GalaxySession.update_time, partition_by=GalaxySession.user_id).label("index"), +).alias() +partitioned_session = aliased(GalaxySession, session_partition) +User.current_galaxy_session = relationship( + partitioned_session, + primaryjoin=and_(partitioned_session.user_id == User.id, session_partition.c.index < 2), + uselist=False, + viewonly=True, +) + @event.listens_for(HistoryDatasetCollectionAssociation, "init") def receive_init(target, args, kwargs): diff --git a/lib/galaxy/webapps/base/webapp.py b/lib/galaxy/webapps/base/webapp.py index 1223712fb03..07054b552d5 100644 --- a/lib/galaxy/webapps/base/webapp.py +++ b/lib/galaxy/webapps/base/webapp.py @@ -835,7 +835,7 @@ class GalaxyWebTransaction(base.DefaultWebTransaction, context.ProvidesHistoryCo history = None set_permissions = False try: - users_last_session = user.galaxy_sessions[0] + users_last_session = user.current_galaxy_session except Exception: users_last_session = None if ( diff --git a/lib/galaxy/webapps/galaxy/controllers/admin.py b/lib/galaxy/webapps/galaxy/controllers/admin.py index 8cfacf0bf30..77142ca9669 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin.py @@ -77,7 +77,7 @@ class UserListGrid(grids.Grid): class LastLoginColumn(grids.GridColumn): def get_value(self, trans, grid, user): if user.galaxy_sessions: - return self.format(user.galaxy_sessions[0].update_time) + return self.format(user.current_galaxy_session.update_time) return "never" def sort(self, trans, query, ascending, column_name=None): diff --git a/lib/galaxy/webapps/reports/controllers/users.py b/lib/galaxy/webapps/reports/controllers/users.py index 773f2dcd691..1e651e69eb1 100644 --- a/lib/galaxy/webapps/reports/controllers/users.py +++ b/lib/galaxy/webapps/reports/controllers/users.py @@ -164,8 +164,9 @@ class Users(BaseUIController, ReportQueryBuilder): .filter(galaxy.model.User.table.c.deleted == false()) .order_by(galaxy.model.User.table.c.email) ): - if user.galaxy_sessions: - last_galaxy_session = user.galaxy_sessions[0] + current_galaxy_session = user.current_galaxy_session + if current_galaxy_session: + last_galaxy_session = current_galaxy_session if last_galaxy_session.update_time < cutoff_time: users.append((user.email, last_galaxy_session.update_time.strftime("%Y-%m-%d"))) else: diff --git a/lib/tool_shed/grids/admin_grids.py b/lib/tool_shed/grids/admin_grids.py index f38378677b3..45a4dcd1ff1 100644 --- a/lib/tool_shed/grids/admin_grids.py +++ b/lib/tool_shed/grids/admin_grids.py @@ -46,8 +46,8 @@ class UserGrid(grids.Grid): class LastLoginColumn(grids.GridColumn): def get_value(self, trans, grid, user): - if user.galaxy_sessions: - return self.format(user.galaxy_sessions[0].update_time) + if user.current_galaxy_session: + return self.format(user.current_galaxy_session.update_time) return "never" class StatusColumn(grids.GridColumn):