From 9ce501dd11640c8d81a434cb29036fac1818a14a Mon Sep 17 00:00:00 2001 From: NotBigGhost Date: Sat, 18 Jul 2026 21:12:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8C:=20?= =?UTF-8?q?=C2=AB=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=B0=D1=8F=20=D1=84?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=86=D0=B8=D1=8F=C2=BB=20=E2=80=94=20=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=D0=B0=D1=8F=20=D0=B8=D0=B3=D1=80=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=20=D1=83=D1=87=D1=91=D1=82=D0=BE=D0=BC=20?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B4=D0=BE=D0=BC=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Под любимой (только ручной выбор) — основная: max по всем партиям, включая рандомные раздачи. Есть у любого сыгравшего игрока. Co-Authored-By: Claude Fable 5 --- backend/app/schemas/api.py | 2 ++ backend/app/services/stats_service.py | 3 +++ backend/tests/test_profile.py | 2 ++ frontend/src/api/schema.d.ts | 1 + frontend/src/components/ProfileStatsCard.tsx | 6 ++++++ 5 files changed, 14 insertions(+) diff --git a/backend/app/schemas/api.py b/backend/app/schemas/api.py index f5b8b86..2403c2a 100644 --- a/backend/app/schemas/api.py +++ b/backend/app/schemas/api.py @@ -331,7 +331,9 @@ class ProfileStats(BaseModel): factions: list[FactionStat] = [] best_faction: FactionStat | None = None worst_faction: FactionStat | None = None + # Любимая — по партиям с ручным выбором фракции; основная — по всем (включая рандом). most_played_faction: FactionStat | None = None + main_faction: FactionStat | None = None recent_form: list[RecentFormItem] = [] # Порог «Новичков» (MIN_GAMES) — чтобы UI единообразно подсвечивал # неподтверждённый рейтинг, не дублируя константу на фронте. diff --git a/backend/app/services/stats_service.py b/backend/app/services/stats_service.py index 687dcfc..7424dc1 100644 --- a/backend/app/services/stats_service.py +++ b/backend/app/services/stats_service.py @@ -206,6 +206,8 @@ def profile_stats(session: Session, user_id: int, group_id: int | None = None) - # рандомная раздача о предпочтениях не говорит. Нет ручных выборов — нет любимой. chosen = [f for f in factions if f["chosen_games"] > 0] most_played = max(chosen, key=lambda f: f["chosen_games"]) if chosen else None + # Основная — просто самая игранная, включая рандомные раздачи. + main = max(factions, key=lambda f: f["games"]) if factions else None return { "user_id": user_id, "overall": overall, @@ -213,6 +215,7 @@ def profile_stats(session: Session, user_id: int, group_id: int | None = None) - "best_faction": best, "worst_faction": worst, "most_played_faction": most_played, + "main_faction": main, "recent_form": _recent_form(session, user_id, group_id), "min_games": MIN_GAMES, } diff --git a/backend/tests/test_profile.py b/backend/tests/test_profile.py index fb17dbb..fb62917 100644 --- a/backend/tests/test_profile.py +++ b/backend/tests/test_profile.py @@ -157,6 +157,7 @@ def test_most_played_faction_ignores_random(client: TestClient, engine): stats = client.get("/api/users/me/stats").json() assert stats["most_played_faction"]["faction_id"] == fids[2] # B, хоть партий с A больше + assert stats["main_faction"]["faction_id"] == fids[0] # основная — по всем партиям # У соперника все фракции выбраны вручную — любимая считается как раньше. login(client, "Партнёр") @@ -183,3 +184,4 @@ def test_most_played_faction_absent_when_all_random(client: TestClient, engine): ) stats = client.get("/api/users/me/stats").json() assert stats["most_played_faction"] is None + assert stats["main_faction"]["faction_id"] == fids[0] # основная есть и у рандомщика diff --git a/frontend/src/api/schema.d.ts b/frontend/src/api/schema.d.ts index 09f298d..ff8fb94 100644 --- a/frontend/src/api/schema.d.ts +++ b/frontend/src/api/schema.d.ts @@ -1882,6 +1882,7 @@ export interface components { best_faction?: components["schemas"]["FactionStat"] | null; worst_faction?: components["schemas"]["FactionStat"] | null; most_played_faction?: components["schemas"]["FactionStat"] | null; + main_faction?: components["schemas"]["FactionStat"] | null; /** * Recent Form * @default [] diff --git a/frontend/src/components/ProfileStatsCard.tsx b/frontend/src/components/ProfileStatsCard.tsx index 009d565..adc1de7 100644 --- a/frontend/src/components/ProfileStatsCard.tsx +++ b/frontend/src/components/ProfileStatsCard.tsx @@ -44,6 +44,12 @@ export function ProfileStatsCard({ {stats.most_played_faction.name_ru} )} + {stats.main_faction && ( +
+
Основная фракция
+ {stats.main_faction.name_ru} +
+ )} ); }