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} +
+ )} ); }