40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Iterable
|
|
|
|
from sqlalchemy import delete
|
|
from sqlalchemy.orm import Session
|
|
|
|
from rf4_research.gear_components import GearComponentIdentity
|
|
|
|
from .models import CatchReport, CatchTackleComponent
|
|
|
|
|
|
def replace_tackle_components(
|
|
session: Session,
|
|
report: CatchReport,
|
|
components: Iterable[GearComponentIdentity],
|
|
*,
|
|
source_system: str | None,
|
|
source_url: str | None = None,
|
|
raw_payload: dict | None = None,
|
|
) -> None:
|
|
"""Replace the ordered evidence for a report while keeping imports idempotent."""
|
|
session.flush()
|
|
session.execute(
|
|
delete(CatchTackleComponent).where(CatchTackleComponent.catch_report_id == report.id)
|
|
)
|
|
session.add_all(
|
|
CatchTackleComponent(
|
|
catch_report_id=report.id,
|
|
role=component.role,
|
|
position=component.position,
|
|
raw_value=component.raw_value,
|
|
source_system=source_system,
|
|
source_external_id=component.source_external_id,
|
|
source_url=source_url,
|
|
raw_payload=raw_payload,
|
|
)
|
|
for component in components
|
|
)
|