Questions can belong to additional subcategories (junction table, counts, builder/bank filters, edit UI chips); response statistics dedupe duplicate options, match case-insensitively and exclude obsolete answers; AI question classification is command-line only (UI trigger removed); lab reference seed script with cited public pediatric ranges. Migration h1c2d3e4f506. 55 backend and 88 frontend tests pass.
29 lines
1.3 KiB
Python
29 lines
1.3 KiB
Python
from datetime import datetime
|
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text, UniqueConstraint
|
|
from sqlalchemy.orm import relationship
|
|
from app.database import Base
|
|
|
|
|
|
class QuestionCategory(Base):
|
|
__tablename__ = "question_categories"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
parent_id = Column(Integer, ForeignKey("question_categories.id", ondelete="RESTRICT", name="fk_question_categories_parent"), nullable=True)
|
|
name = Column(String, nullable=False)
|
|
description = Column(Text, nullable=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
questions = relationship("Question", back_populates="question_category",
|
|
foreign_keys="Question.question_category_id")
|
|
|
|
|
|
class QuestionCategoryLink(Base):
|
|
"""Additional (non-primary) category assignments for a question."""
|
|
|
|
__tablename__ = "question_category_links"
|
|
__table_args__ = (UniqueConstraint("question_id", "category_id", name="uq_question_category_link"),)
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
question_id = Column(Integer, ForeignKey("questions.id", ondelete="CASCADE"), nullable=False)
|
|
category_id = Column(Integer, ForeignKey("question_categories.id", ondelete="CASCADE"), nullable=False)
|