58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
"""Read and update administrator-managed risk-model configuration."""
|
|
|
|
from decimal import Decimal
|
|
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.domain.model_config import DEFAULT_FREQUENCY_CAP, DEFAULT_FREQUENCY_COEFFICIENT, DEFAULT_WEIGHTS
|
|
from app.models.entities import OperationAudit, RiskModelConfig, UserAccount
|
|
from app.schemas.model_config import ModelWeightConfigData, ModelWeightConfigUpdate
|
|
|
|
|
|
class ModelConfigService:
|
|
def __init__(self, session: AsyncSession) -> None:
|
|
self.session = session
|
|
|
|
async def get(self) -> ModelWeightConfigData:
|
|
row = await self.session.get(RiskModelConfig, 1)
|
|
if row is None:
|
|
return ModelWeightConfigData(
|
|
weights=DEFAULT_WEIGHTS,
|
|
frequency_coefficient=DEFAULT_FREQUENCY_COEFFICIENT,
|
|
frequency_cap=DEFAULT_FREQUENCY_CAP,
|
|
)
|
|
return self._to_data(row)
|
|
|
|
async def update(self, payload: ModelWeightConfigUpdate, user: UserAccount) -> ModelWeightConfigData:
|
|
row = await self.session.get(RiskModelConfig, 1)
|
|
if row is None:
|
|
row = RiskModelConfig(id=1)
|
|
self.session.add(row)
|
|
row.weights = payload.weights
|
|
row.frequency_coefficient = Decimal(str(payload.frequency_coefficient))
|
|
row.frequency_cap = Decimal(str(payload.frequency_cap))
|
|
row.updated_by = user.emp_no
|
|
self.session.add(
|
|
OperationAudit(
|
|
actor_user_id=user.id,
|
|
actor_emp_no=user.emp_no,
|
|
action="model_weight.update",
|
|
resource_type="risk_model_config",
|
|
resource_id="1",
|
|
audit_metadata=payload.model_dump(),
|
|
)
|
|
)
|
|
await self.session.flush()
|
|
await self.session.refresh(row)
|
|
return self._to_data(row)
|
|
|
|
@staticmethod
|
|
def _to_data(row: RiskModelConfig) -> ModelWeightConfigData:
|
|
return ModelWeightConfigData(
|
|
weights={key: float(value) for key, value in row.weights.items()},
|
|
frequency_coefficient=float(row.frequency_coefficient),
|
|
frequency_cap=float(row.frequency_cap),
|
|
updated_by=row.updated_by,
|
|
updated_at=row.updated_at,
|
|
)
|