diff --git a/backend/oasst_backend/api/v1/users.py b/backend/oasst_backend/api/v1/users.py index d7497610..4c4e0118 100644 --- a/backend/oasst_backend/api/v1/users.py +++ b/backend/oasst_backend/api/v1/users.py @@ -190,6 +190,7 @@ def update_user( user_id: UUID, enabled: Optional[bool] = None, notes: Optional[str] = None, + show_on_leaderboard: Optional[bool] = None, db: Session = Depends(deps.get_db), api_client: ApiClient = Depends(deps.get_trusted_api_client), ): @@ -197,7 +198,7 @@ def update_user( Update a user by global user ID. Only trusted clients can update users. """ ur = UserRepository(db, api_client) - ur.update_user(user_id, enabled, notes) + ur.update_user(user_id, enabled, notes, show_on_leaderboard) @router.delete("/{user_id}", status_code=HTTP_204_NO_CONTENT) diff --git a/backend/oasst_backend/models/user.py b/backend/oasst_backend/models/user.py index d882a15a..6b6dced4 100644 --- a/backend/oasst_backend/models/user.py +++ b/backend/oasst_backend/models/user.py @@ -30,6 +30,7 @@ class User(SQLModel, table=True): enabled: bool = Field(sa_column=sa.Column(sa.Boolean, nullable=False, server_default=sa.true())) notes: str = Field(sa_column=sa.Column(AutoString(length=1024), nullable=False, server_default="")) deleted: bool = Field(sa_column=sa.Column(sa.Boolean, nullable=False, server_default=sa.false())) + show_on_leaderboard: bool = Field(sa_column=sa.Column(sa.Boolean, nullable=False, server_default=sa.true())) def to_protocol_frontend_user(self): return protocol.FrontEndUser( diff --git a/backend/oasst_backend/user_repository.py b/backend/oasst_backend/user_repository.py index 873b0f6e..28c042e0 100644 --- a/backend/oasst_backend/user_repository.py +++ b/backend/oasst_backend/user_repository.py @@ -66,7 +66,13 @@ class UserRepository: return user @managed_tx_method(CommitMode.COMMIT) - def update_user(self, id: UUID, enabled: Optional[bool] = None, notes: Optional[str] = None) -> None: + def update_user( + self, + id: UUID, + enabled: Optional[bool] = None, + notes: Optional[str] = None, + show_on_leaderboard: Optional[bool] = None, + ) -> None: """ Update a user by global user ID to disable or set admin notes. Only trusted clients may update users. @@ -85,6 +91,8 @@ class UserRepository: user.enabled = enabled if notes is not None: user.notes = notes + if show_on_leaderboard is not None: + user.show_on_leaderboard = show_on_leaderboard self.db.add(user) diff --git a/backend/oasst_backend/user_stats_repository.py b/backend/oasst_backend/user_stats_repository.py index 8b0c17f0..81e5cb92 100644 --- a/backend/oasst_backend/user_stats_repository.py +++ b/backend/oasst_backend/user_stats_repository.py @@ -39,7 +39,7 @@ class UserStatsRepository: qry = ( self.session.query(User.id.label("user_id"), User.username, User.auth_method, User.display_name, UserStats) .join(UserStats, User.id == UserStats.user_id) - .filter(UserStats.time_frame == time_frame.value) + .filter(UserStats.time_frame == time_frame.value, User.show_on_leaderboard) .order_by(UserStats.rank) .limit(limit) ) @@ -250,7 +250,8 @@ FROM PARTITION BY time_frame ORDER BY leader_score DESC, user_id ) AS "rank", user_id, time_frame - FROM user_stats + FROM user_stats us2 + INNER JOIN "user" u ON us2.user_id = u.id AND u.show_on_leaderboard WHERE (:time_frame IS NULL OR time_frame = :time_frame)) AS r WHERE us.user_id = r.user_id