Spaces:
Running
Running
from flask_sqlalchemy import SQLAlchemy | |
from datetime import datetime | |
import enum | |
db = SQLAlchemy() | |
class Country(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
name = db.Column(db.String(100), unique=True, nullable=False) | |
region = db.Column(db.String(100), nullable=False) | |
cases = db.relationship("Case", backref="country_context", lazy=True) | |
reports = db.relationship("Report", backref="report_country_context", lazy=True) | |
def __repr__(self): | |
return f"<Country {self.name}>" | |
class CaseStatus(enum.Enum): | |
ACTIVE = "Active" | |
PENDING = "Pending" | |
COMPLETED = "Completed" | |
CLOSED = "Closed" | |
class Case(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
case_id_display = db.Column(db.String(50), unique=True, nullable=False) | |
case_type = db.Column(db.String(100), nullable=False) | |
suspect_name = db.Column(db.String(150), nullable=False) | |
profile_details = db.Column(db.Text, nullable=True) | |
evidence_summary = db.Column(db.Text, nullable=True) | |
status = db.Column(db.Enum(CaseStatus), default=CaseStatus.PENDING, nullable=False) | |
created_at = db.Column(db.DateTime, default=datetime.utcnow) | |
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) | |
country_id = db.Column(db.Integer, db.ForeignKey("country.id"), nullable=True) # For recommendation context | |
interrogation_sessions = db.relationship("InterrogationSession", backref="case", lazy=True, cascade="all, delete-orphan") | |
reports = db.relationship("Report", backref="case", lazy=True, cascade="all, delete-orphan") | |
def __repr__(self): | |
return f"<Case {self.case_id_display}>" | |
class InterrogationSession(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
case_id = db.Column(db.Integer, db.ForeignKey("case.id"), nullable=False) | |
session_date = db.Column(db.DateTime, default=datetime.utcnow) | |
summary_notes = db.Column(db.Text, nullable=True) | |
generated_questions = db.relationship("GeneratedQuestion", backref="session", lazy=True, cascade="all, delete-orphan") | |
def __repr__(self): | |
return f"<InterrogationSession {self.id} for Case {self.case_id}>" | |
class GeneratedQuestion(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
interrogation_session_id = db.Column(db.Integer, db.ForeignKey("interrogation_session.id"), nullable=False) | |
question_text = db.Column(db.Text, nullable=False) | |
category = db.Column(db.String(100), nullable=True) | |
generated_at = db.Column(db.DateTime, default=datetime.utcnow) | |
responses = db.relationship("InterrogationResponse", backref="question", lazy=True, cascade="all, delete-orphan") | |
def __repr__(self): | |
return f"<GeneratedQuestion {self.id}>" | |
class InterrogationResponse(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
generated_question_id = db.Column(db.Integer, db.ForeignKey("generated_question.id"), nullable=False) | |
response_text = db.Column(db.Text, nullable=True) | |
tags = db.Column(db.String(200), nullable=True) # e.g., "evasiveness,contradiction" | |
responded_at = db.Column(db.DateTime, default=datetime.utcnow) | |
def __repr__(self): | |
return f"<InterrogationResponse {self.id} for Question {self.generated_question_id}>" | |
class Report(db.Model): | |
id = db.Column(db.Integer, primary_key=True) | |
case_id = db.Column(db.Integer, db.ForeignKey("case.id"), nullable=False) | |
generated_at = db.Column(db.DateTime, default=datetime.utcnow) | |
llm_json_output = db.Column(db.Text, nullable=True) # Raw JSON from LLM | |
report_content_summary = db.Column(db.Text, nullable=True) # Processed summary for display | |
recommendations = db.Column(db.Text, nullable=True) # Country-specific recommendations | |
country_id = db.Column(db.Integer, db.ForeignKey("country.id"), nullable=True) # Context for recommendations | |
def __repr__(self): | |
return f"<Report {self.id} for Case {self.case_id}>" | |