54 lines
2.8 KiB
Python
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"),
|
|
)
|