File size: 2,012 Bytes
151ec26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from sqlalchemy import Column, String, Integer, ForeignKey, Text, DateTime
from sqlalchemy.orm import relationship
from backend.app.models.base import BaseModel, utc_now


class MedicalDocument(BaseModel):
    __tablename__ = "medical_documents"

    user_id = Column(String(36), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
    filename = Column(String(255), nullable=False)
    original_filename = Column(String(255), nullable=False)
    file_path = Column(String(500), nullable=False)
    file_type = Column(String(50), nullable=False)
    file_size = Column(Integer, nullable=False)
    file_hash = Column(String(64), nullable=False)
    status = Column(String(50), default="PENDING", nullable=False)  # PENDING, PROCESSING, COMPLETED, FAILED
    error_message = Column(Text, nullable=True)

    # Relationships
    user = relationship("User", back_populates="documents", lazy="selectin")
    analysis = relationship("DocumentAnalysis", back_populates="document", uselist=False, cascade="all, delete-orphan", lazy="selectin")


class DocumentAnalysis(BaseModel):
    __tablename__ = "document_analyses"

    document_id = Column(String(36), ForeignKey("medical_documents.id", ondelete="CASCADE"), unique=True, nullable=False, index=True)
    raw_text = Column(Text, nullable=False)
    cleaned_text = Column(Text, nullable=True)
    summary = Column(Text, nullable=True)
    important_findings = Column(Text, nullable=True)  # JSON-encoded array or text
    detected_conditions = Column(Text, nullable=True)  # JSON-encoded array
    detected_medications = Column(Text, nullable=True)  # JSON-encoded array
    clinical_recommendations = Column(Text, nullable=True)
    processed_at = Column(DateTime(timezone=True), default=utc_now, nullable=False)

    # Relationships
    document = relationship("MedicalDocument", back_populates="analysis", lazy="selectin")
    entities = relationship("MedicalEntity", back_populates="analysis", cascade="all, delete-orphan", lazy="selectin")