dikasterion/backend/app/models/case.py

54 lines
2.8 KiB
Python

from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, JSON, CheckConstraint
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.database import Base
class Case(Base):
__tablename__ = "cases"
id = Column(Integer, primary_key=True, index=True)
case_number = Column(String(20), unique=True, index=True, nullable=False)
plaintiff_id = Column(Integer, ForeignKey("users.id"), nullable=False)
defendant_id = Column(Integer, ForeignKey("users.id"), nullable=False)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=False)
evidence_urls = Column(JSON, default=list)
status = Column(String(20), nullable=False, default="pending") # pending, accepted, hearing, verdict, closed, declined
created_at = Column(DateTime(timezone=True), server_default=func.now())
hearing_deadline = Column(DateTime(timezone=True), nullable=True)
verdict_deadline = Column(DateTime(timezone=True), nullable=True)
verdict = Column(String(20), nullable=True) # guilty, innocent, dismissed
verdict_reason = Column(Text, nullable=True)
defendant_response = Column(Text, nullable=True)
# Relationships
plaintiff = relationship("User", foreign_keys=[plaintiff_id], backref="cases_as_plaintiff")
defendant = relationship("User", foreign_keys=[defendant_id], backref="cases_as_defendant")
judge_assignments = relationship("JudgeAssignment", back_populates="case", cascade="all, delete-orphan")
__table_args__ = (
CheckConstraint("status IN ('pending', 'accepted', 'hearing', 'verdict', 'closed', 'declined')", name="check_case_status"),
CheckConstraint("verdict IS NULL OR verdict IN ('guilty', 'innocent', 'dismissed')", name="check_verdict"),
)
class JudgeAssignment(Base):
__tablename__ = "judge_assignments"
id = Column(Integer, primary_key=True, index=True)
case_id = Column(Integer, ForeignKey("cases.id"), nullable=False)
judge_id = Column(Integer, ForeignKey("users.id"), nullable=False)
status = Column(String(20), nullable=False, default="pending") # pending, accepted, declined, voted
vote = Column(String(20), nullable=True) # guilty, innocent, abstain
reasoning = Column(Text, nullable=True)
assigned_at = Column(DateTime(timezone=True), server_default=func.now())
voted_at = Column(DateTime(timezone=True), nullable=True)
# Relationships
case = relationship("Case", back_populates="judge_assignments")
judge = relationship("User", backref="judge_assignments")
__table_args__ = (
CheckConstraint("status IN ('pending', 'accepted', 'declined', 'voted')", name="check_assignment_status"),
CheckConstraint("vote IS NULL OR vote IN ('guilty', 'innocent', 'abstain')", name="check_vote"),
)