diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index 7e398c1e4..fffeb32d3 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -762,6 +762,14 @@ class UsersTable: ) return count + @staticmethod + def is_active(user: UserModel) -> bool: + """Compute active status from an already-loaded UserModel (no DB hit).""" + if user.last_active_at: + three_minutes_ago = int(time.time()) - 180 + return user.last_active_at >= three_minutes_ago + return False + def is_user_active(self, user_id: str, db: Optional[Session] = None) -> bool: with get_db_context(db) as db: user = db.query(User).filter_by(id=user_id).first() diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index 1748eaf7e..3add5023e 100644 --- a/backend/open_webui/routers/channels.py +++ b/backend/open_webui/routers/channels.py @@ -204,7 +204,7 @@ async def get_channels( UserIdNameStatusResponse( **{ **user.model_dump(), - "is_active": Users.is_user_active(user.id, db=db), + "is_active": Users.is_active(user), } ) for user in Users.get_users_by_user_ids(user_ids, db=db) @@ -424,7 +424,7 @@ async def get_channel_by_id( UserIdNameStatusResponse( **{ **user.model_dump(), - "is_active": Users.is_user_active(user.id, db=db), + "is_active": Users.is_active(user), } ) for user in Users.get_users_by_user_ids(user_ids, db=db) @@ -541,7 +541,7 @@ async def get_channel_members_by_id( return { "users": [ UserModelResponse( - **user.model_dump(), is_active=Users.is_user_active(user.id, db=db) + **user.model_dump(), is_active=Users.is_active(user) ) for user in users ], @@ -576,7 +576,7 @@ async def get_channel_members_by_id( return { "users": [ UserModelResponse( - **user.model_dump(), is_active=Users.is_user_active(user.id, db=db) + **user.model_dump(), is_active=Users.is_active(user) ) for user in users ],