File size: 3,960 Bytes
e6ecc60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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}>"