""" RadarResult — сохранённый результат прохождения теста в виде значений по осям. RadarResultItem — отдельная ось с итоговым значением внутри результата. """ from sqlalchemy import Column, Float, String, DateTime, ForeignKey, UniqueConstraint from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import func from .simple_base import Base import uuid class RadarResult(Base): """Итоговый результат (набор баллов по осям) за одно прохождение теста.""" __tablename__ = "radar_results" __table_args__ = (UniqueConstraint("response_id", name="uq_radar_response"),) id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) response_id = Column(UUID(as_uuid=True), ForeignKey("responses.id", ondelete="CASCADE"), nullable=False, unique=True) computed_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) # Путь к сохранённому SVG-файлу (относительно APP_PATH/data/radar/) image_path = Column(String(512), nullable=True) items = relationship("RadarResultItem", backref="result", cascade="all, delete-orphan", passive_deletes=True) class RadarResultItem(Base): """Значение по одной оси в рамках результата.""" __tablename__ = "radar_result_items" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) result_id = Column(UUID(as_uuid=True), ForeignKey("radar_results.id", ondelete="CASCADE"), nullable=False) dimension_id = Column(UUID(as_uuid=True), ForeignKey("scale_dimensions.id", ondelete="SET NULL"), nullable=True) dimension_name = Column(String(255), nullable=False) # снимок имени на момент расчёта dimension_color = Column(String(32), nullable=True) # снимок цвета dimension_position = Column(Float, nullable=True) # порядок на диаграмме value = Column(Float, nullable=False, default=0.0) __all__ = ["Base", "RadarResult", "RadarResultItem"]