Files
ForbiddenStarsApp/backend/app/seed/reference_data.py
T
NotBigGhostandClaude Opus 5 1bc3940ee8 Справочники: сидинг не откатывает имя фракции, заданное админом
seed_reference_data идёт при каждом старте (entrypoint.sh, lifespan) и
перезаписывал name_ru существующих фракций значением из кода — переименование
из админки жило до ближайшего рестарта. Теперь имя из кода получает только
новая фракция; дополнение и порядок синхронизируются как раньше. #72

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
2026-09-19 00:01:19 +03:00

74 lines
3.3 KiB
Python

"""Справочные данные: дополнения и фракции. Идемпотентный сидинг по `code`."""
from __future__ import annotations
from sqlmodel import Session, select
from app.models import Expansion, Faction
# (code, name_ru, is_base, sort_order)
EXPANSIONS: list[tuple[str, str, bool, int]] = [
("base", "Базовая игра", True, 0),
("forgotten_worlds", "Forgotten Worlds", False, 1),
("forsaken_voids", "Forsaken Voids", False, 2),
]
# (code, name_ru, expansion_code, sort_order)
FACTIONS: list[tuple[str, str, str, int]] = [
# База
("orks", "Орки", "base", 0),
("ultramarines", "Ультрамарины", "base", 1),
("eldar", "Эльдары", "base", 2),
("chaos", "Хаоситы", "base", 3),
# Forgotten Worlds
("astra_militarum", "Имперская гвардия", "forgotten_worlds", 0),
("tau", "Тау", "forgotten_worlds", 1),
("necrons", "Некроны", "forgotten_worlds", 2),
("tyranids", "Тираниды", "forgotten_worlds", 3),
# Forsaken Voids
("inquisition", "Инквизиция", "forsaken_voids", 0),
("sisters_of_battle", "Сёстры битвы", "forsaken_voids", 1),
("drukhari", "Друкхари", "forsaken_voids", 2),
("adeptus_mechanicus", "Адептус Механикус", "forsaken_voids", 3),
]
def seed_reference_data(session: Session) -> None:
"""Создаёт/обновляет дополнения и фракции. Безопасно вызывать многократно.
Идёт при каждом старте (entrypoint.sh, lifespan dev), поэтому не перетирает то, что
правят руками: имя существующей фракции меняет админка (admin_service.rename_faction),
и после создания записи источник правды для него — БД (#72). Имя из кода получает
только новая фракция; поправить имя существующей — админкой или миграцией.
Служебные поля (дополнение, порядок) и всё у дополнений синхронизируются с кодом."""
code_to_expansion: dict[str, Expansion] = {}
for code, name_ru, is_base, order in EXPANSIONS:
exp = session.exec(select(Expansion).where(Expansion.code == code)).first()
if exp is None:
exp = Expansion(code=code, name_ru=name_ru, is_base=is_base, sort_order=order)
session.add(exp)
else:
exp.name_ru = name_ru
exp.is_base = is_base
exp.sort_order = order
code_to_expansion[code] = exp
session.flush() # получить id дополнений
for code, name_ru, exp_code, order in FACTIONS:
expansion = code_to_expansion[exp_code]
fac = session.exec(select(Faction).where(Faction.code == code)).first()
if fac is None:
fac = Faction(
code=code,
name_ru=name_ru,
expansion_id=expansion.id, # type: ignore[arg-type]
sort_order=order,
)
session.add(fac)
else:
fac.expansion_id = expansion.id # type: ignore[assignment]
fac.sort_order = order
session.commit()