Merge pull request 'Путаница в рейтинге группы (#76)' (#78) from issue-76-group-rating-members into dev
Reviewed-on: #78
This commit was merged in pull request #78.
This commit is contained in:
@@ -109,8 +109,13 @@ def leaderboard(
|
||||
*,
|
||||
history: list[RatedMatch] | None = None,
|
||||
rep: Replay | None = None,
|
||||
member_ids: set[int] | None = None,
|
||||
) -> dict:
|
||||
"""Топ: общий или группы. history/rep — уже посчитанные (home их переиспользует)."""
|
||||
"""Топ: общий или группы. history/rep — уже посчитанные (home их переиспользует).
|
||||
|
||||
member_ids — показывать только этих игроков (топ группы — её текущий состав, #76).
|
||||
Фильтруется вывод, а не расчёт: партии с ушедшим игроком остаются в цепочке и влияют
|
||||
на рейтинг оставшихся. Места нумеруются уже после фильтра."""
|
||||
if history is None:
|
||||
history = load_history(session, group_id)
|
||||
if rep is None:
|
||||
@@ -119,7 +124,8 @@ def leaderboard(
|
||||
by_user: dict[int, list[tuple[RatedMatch, RatedSeat]]] = defaultdict(list)
|
||||
for m in history:
|
||||
for s in m.seats:
|
||||
by_user[s.user_id].append((m, s))
|
||||
if member_ids is None or s.user_id in member_ids:
|
||||
by_user[s.user_id].append((m, s))
|
||||
users = (
|
||||
{u.id: u for u in session.exec(select(User).where(User.id.in_(list(by_user)))).all()}
|
||||
if by_user
|
||||
@@ -263,7 +269,15 @@ def profile_stats(
|
||||
|
||||
def group_stats(session: Session, group_id: int) -> dict:
|
||||
history = load_history(session, group_id)
|
||||
board = leaderboard(session, group_id, history=history, rep=replay(history))
|
||||
members = membership_service.list_members(session, group_id)
|
||||
# Список игроков группы — только её текущий состав: удалённый из группы в нём не висит.
|
||||
board = leaderboard(
|
||||
session,
|
||||
group_id,
|
||||
history=history,
|
||||
rep=replay(history),
|
||||
member_ids={u.id for _m, u in members}, # type: ignore[misc]
|
||||
)
|
||||
last_played = max((m.played_at for m in history), default=None)
|
||||
|
||||
games: dict[int, int] = defaultdict(int)
|
||||
@@ -293,7 +307,7 @@ def group_stats(session: Session, group_id: int) -> dict:
|
||||
e["user_id"] for e in board["provisional"]
|
||||
}
|
||||
inactive = []
|
||||
for _m, u in membership_service.list_members(session, group_id):
|
||||
for _m, u in members:
|
||||
if u.id in played_ids:
|
||||
continue
|
||||
inactive.append(
|
||||
|
||||
Reference in New Issue
Block a user