"""Справочные данные: дополнения и фракции. Идемпотентный сидинг по `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: """Создаёт/обновляет дополнения и фракции. Безопасно вызывать многократно.""" 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.name_ru = name_ru fac.expansion_id = expansion.id # type: ignore[assignment] fac.sort_order = order session.commit()