new shems

This commit is contained in:
2026-04-01 14:18:52 +05:00
parent 4e9b89fbe5
commit 22bbc3a0a6
15 changed files with 1793 additions and 133 deletions

41
bd/tables/radar_result.py Normal file
View File

@@ -0,0 +1,41 @@
"""
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"]

37
bd/tables/scale.py Normal file
View File

@@ -0,0 +1,37 @@
"""
ScaleDimension — ось/сфера радарной диаграммы, привязанная к тесту.
ChoiceScore — расшифровка варианта ответа: сколько баллов в какую ось он вносит.
"""
from sqlalchemy import Column, String, Float, Integer, ForeignKey, Text
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from .simple_base import Base
import uuid
class ScaleDimension(Base):
"""Ось/категория радарной диаграммы для конкретного теста."""
__tablename__ = "scale_dimensions"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
poll_id = Column(UUID(as_uuid=True), ForeignKey("polls.id", ondelete="CASCADE"), nullable=False)
name = Column(String(255), nullable=False) # напр. "ЗДОРОВЬЕ"
description = Column(Text, nullable=True)
color = Column(String(32), nullable=True) # напр. "#FF8C00"
position = Column(Integer, nullable=True) # порядок на диаграмме
scores = relationship("ChoiceScore", backref="dimension", cascade="all, delete-orphan", passive_deletes=True)
class ChoiceScore(Base):
"""Расшифровка: вклад конкретного варианта ответа в конкретную ось."""
__tablename__ = "choice_scores"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
choice_id = Column(UUID(as_uuid=True), ForeignKey("choices.id", ondelete="CASCADE"), nullable=False)
dimension_id = Column(UUID(as_uuid=True), ForeignKey("scale_dimensions.id", ondelete="CASCADE"), nullable=False)
score = Column(Float, nullable=False, default=1.0) # значение, которое добавляется при выборе
__all__ = ["Base", "ScaleDimension", "ChoiceScore"]