lct-55: ошибка адреса и сообщение в 112

This commit is contained in:
kaifarikman 2026-09-28 00:55:28 +03:00 • committed by gglamer
commit f0c9015f2b
14 changed files with 267 additions and 7 deletions

View file

@ -5,12 +5,15 @@
на старте приложения, а не тихо игнорироваться и всплывать посреди занятия.
"""
from pydantic import BaseModel, ConfigDict, Field, model_validator
from typing import Literal
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
from app.domain.classifiers import DDSCode, IncidentType, Level, Outcome
from app.domain.events import Mood
from app.domain.kio import EDITABLE_KIO_FIELDS, KIO
from app.domain.statuses import NEXT, SERVICE_STATUS_LABELS, ServiceStatus
from app.scoring.address import address_matches
from app.scoring.taxonomy import METRIC_MAP
@ -174,6 +177,21 @@ FALLBACK_NOTIFY: dict[str, str] = {
}
class DdsCardError(Strict):
"""Заложенное расхождение готовой карточки с эталоном для занятия ДДС."""
field: Literal["address"]
card_value: str = Field(min_length=3)
@field_validator("card_value")
@classmethod
def nonempty_card_value(cls, value: str) -> str:
value = value.strip()
if len(value) < 3:
raise ValueError("dds_card_error.card_value: укажите неверный адрес карточки")
return value
class Scenario(Strict):
id: str
title: str
@ -202,6 +220,7 @@ class Scenario(Strict):
# справка и передача в другой регион разбираются в lct-36.
outcome: Outcome = Outcome.CARD
dds_decision: DdsDecision = DdsDecision()
dds_card_error: DdsCardError | None = None
# Готовая КИО, сформированная курсантом и утверждённая преподавателем.
# Для системных сценариев поле отсутствует; ДДС использует снимок как
@ -258,6 +277,19 @@ class Scenario(Strict):
)
return self
@model_validator(mode="after")
def valid_dds_card_error(self):
error = self.dds_card_error
if error is None:
return self
if not self.ground_truth.address or not self.ground_truth.address.strip():
raise ValueError("dds_card_error: для ошибки адреса нужен ground_truth.address")
if self.student_card is not None:
raise ValueError("dds_card_error: используйте отдельный учебный сценарий без student_card")
if address_matches(self.ground_truth.address, error.card_value):
raise ValueError("dds_card_error: адрес карточки должен отличаться от эталона")
return self
@model_validator(mode="after")
def unique_reference_ids(self):
for label, values in (