75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
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()
|