"""E2-сид: справочник подразделений МЧС (иерархия РЦУ РЧС → ОУМЧС → Г(Р)ОЧС). Идемпотентный: существующие названия не дублируются. Запуск: docker exec vector-backend sh -c 'cd /app && python backend/seed_units.py' """ from __future__ import annotations import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from backend.database import SessionLocal # noqa: E402 from backend.models import MchsUnit # noqa: E402 OBLASTS = [ ('Минское областное управление МЧС', 'oblast'), ('Брестское областное управление МЧС', 'oblast'), ('Витебское областное управление МЧС', 'oblast'), ('Гомельское областное управление МЧС', 'oblast'), ('Гродненское областное управление МЧС', 'oblast'), ('Могилёвское областное управление МЧС', 'oblast'), ] # Демо-набор Г(Р)ОЧС по одной области (Минская) — реальный справочник наполняется # региональными админами через админку/скрипт при развёртывании. MINSK_RAYONS = [ 'Борисовский ГРОЧС', 'Жодинский ГРОЧС', 'Слуцкий ГРОЧС', 'Молодечненский ГРОЧС', 'Столбцовский ГРОЧС', ] def get_or_create(db, name, kind, parent_id=None): existing = db.query(MchsUnit).filter_by(name=name).first() if existing: return existing u = MchsUnit(name=name, kind=kind, parent_id=parent_id) db.add(u) db.flush() return u def main(): db = SessionLocal() try: rcu = get_or_create(db, 'РЦУ РЧС', 'rcu') created = 0 for name, kind in OBLASTS: before = db.query(MchsUnit).filter_by(name=name).count() oblast = get_or_create(db, name, kind, rcu.id) if not before: created += 1 minsk = db.query(MchsUnit).filter_by(name=OBLASTS[0][0]).first() for name in MINSK_RAYONS: before = db.query(MchsUnit).filter_by(name=name).count() get_or_create(db, name, 'gor_rayon', minsk.id) if not before: created += 1 db.commit() total = db.query(MchsUnit).count() print(f'сид подразделений: создано {created}, всего {total}') finally: db.close() if __name__ == '__main__': main()