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
74 lines
3.3 KiB
Python
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()
|