52 lines
2.0 KiB
Python
52 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
from uuid import UUID, uuid4
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.persistence.discovery_models import CriterionDefinitionRecord
|
|
|
|
|
|
def get_definition_by_key(session: Session, key: str) -> CriterionDefinitionRecord | None:
|
|
return session.scalars(select(CriterionDefinitionRecord).where(CriterionDefinitionRecord.key == key)).first()
|
|
|
|
|
|
def get_definition(session: Session, definition_id: UUID) -> CriterionDefinitionRecord | None:
|
|
return session.get(CriterionDefinitionRecord, definition_id)
|
|
|
|
|
|
def upsert_definition(session: Session, payload: dict[str, Any]) -> CriterionDefinitionRecord:
|
|
key = str(payload["key"])
|
|
existing = get_definition_by_key(session, key)
|
|
if existing is not None:
|
|
if payload.get("label"):
|
|
existing.label = str(payload["label"])
|
|
if payload.get("scoring_attribute_key"):
|
|
existing.scoring_attribute_key = str(payload["scoring_attribute_key"])
|
|
if payload.get("product_category_id"):
|
|
existing.product_category_id = str(payload["product_category_id"])
|
|
if payload.get("origin"):
|
|
existing.origin = str(payload["origin"])
|
|
if payload.get("source"):
|
|
existing.source = str(payload["source"])
|
|
return existing
|
|
row = CriterionDefinitionRecord(
|
|
id=payload.get("id") or uuid4(),
|
|
key=key,
|
|
origin=str(payload.get("origin") or "SOURCE"),
|
|
source=payload.get("source"),
|
|
product_category_id=payload.get("product_category_id"),
|
|
label=str(payload.get("label") or key),
|
|
value_type=str(payload["value_type"]),
|
|
unit=payload.get("unit"),
|
|
semantic=payload.get("semantic"),
|
|
category=payload.get("category") or payload.get("product_category_id"),
|
|
description=payload.get("description"),
|
|
scoring_attribute_key=payload.get("scoring_attribute_key"),
|
|
)
|
|
session.add(row)
|
|
session.flush()
|
|
return row
|