E2: сид справочника подразделений (РЦУ РЧС → 6 ОУМЧС → демо Г(Р)ОЧС Минской области), идемпотентный

This commit is contained in:
2026-09-09 21:46:20 +03:00
parent 39b2e296d1
commit d2860118d8
+67
View File
@@ -0,0 +1,67 @@
"""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, 'grochs', 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()