import json from uuid import uuid4 from sqlalchemy import asc, delete, select from app.db.session import AsyncSessionLocal from app.models.scheme_sector import SchemeSectorRecord async def replace_scheme_version_sectors( *, scheme_id: str, scheme_version_id: str, sectors: list[dict], ) -> None: async with AsyncSessionLocal() as session: await session.execute( delete(SchemeSectorRecord).where( SchemeSectorRecord.scheme_version_id == scheme_version_id ) ) for item in sectors: row = SchemeSectorRecord( sector_record_id=uuid4().hex, scheme_id=scheme_id, scheme_version_id=scheme_version_id, element_id=item.get("id"), sector_id=item.get("sector_id"), name=item.get("sector_id") or item.get("id") or "unnamed-sector", classes_raw=json.dumps(item.get("classes", []), ensure_ascii=False), ) session.add(row) await session.commit() async def list_scheme_version_sectors(scheme_version_id: str) -> list[SchemeSectorRecord]: async with AsyncSessionLocal() as session: result = await session.execute( select(SchemeSectorRecord) .where(SchemeSectorRecord.scheme_version_id == scheme_version_id) .order_by(asc(SchemeSectorRecord.id)) ) return list(result.scalars().all()) async def clone_scheme_version_sectors( *, source_scheme_version_id: str, target_scheme_version_id: str, ) -> None: async with AsyncSessionLocal() as session: result = await session.execute( select(SchemeSectorRecord).where( SchemeSectorRecord.scheme_version_id == source_scheme_version_id ) ) rows = list(result.scalars().all()) for row in rows: session.add( SchemeSectorRecord( sector_record_id=uuid4().hex, scheme_id=row.scheme_id, scheme_version_id=target_scheme_version_id, element_id=row.element_id, sector_id=row.sector_id, name=row.name, classes_raw=row.classes_raw, ) ) await session.commit()