Files
ds_scp_task_solution/app/core/models.py
T

127 lines
3.9 KiB
Python
Raw Normal View History

2025-07-17 22:20:25 +01:00
# Data models
from pydantic import BaseModel, Field
from typing import List, Dict, Optional, Any, Union
from datetime import datetime
from enum import Enum
import uuid
class DocumentStatus(str, Enum):
"""Enum for document processing status."""
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
class ComplianceLevel(str, Enum):
"""Enum for compliance severity levels."""
CRITICAL = "critical"
MAJOR = "major"
MINOR = "minor"
INFO = "info"
class ComplianceIssue(BaseModel):
"""Model for compliance issues found in the document."""
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
section: str
description: str
level: ComplianceLevel
line_number: Optional[int] = None
reasoning: str = "" # Detailed explanation of why this is an issue
standard_references: List[str] = [] # References to specific standards or requirements
recommendation: str
class DocumentMetadata(BaseModel):
"""Model for document metadata."""
filename: str
file_type: str
file_size: int # In bytes
upload_timestamp: datetime = Field(default_factory=datetime.now)
last_modified: Optional[datetime] = None
class DocumentEmbedding(BaseModel):
"""Model for document embeddings."""
embedding_id: str
embedding_model: str
vector_db: str
sections: Dict[str, str] # Section name to section ID in vector DB
class ComplianceReport(BaseModel):
"""Model for the generated compliance report."""
report_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
document_id: str
timestamp: datetime = Field(default_factory=datetime.now)
compliance_score: float # 0.0 to 1.0
summary: str
issues: List[ComplianceIssue] = []
applied_standards: List[str] = [] # Standards used for analysis
@property
def critical_issues_count(self) -> int:
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.CRITICAL)
@property
def major_issues_count(self) -> int:
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.MAJOR)
@property
def minor_issues_count(self) -> int:
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.MINOR)
@property
def info_issues_count(self) -> int:
return sum(1 for issue in self.issues if issue.level == ComplianceLevel.INFO)
class Document(BaseModel):
"""Model for document tracking."""
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
metadata: DocumentMetadata
embedding: Optional[DocumentEmbedding] = None
status: DocumentStatus = DocumentStatus.PENDING
version: int = 1 # Incremented on resubmissions
reports: List[str] = [] # List of report IDs
class DocumentUploadResponse(BaseModel):
"""Response model for document uploads."""
document_id: str
filename: str
status: DocumentStatus
message: str
class DocumentAnalysisResponse(BaseModel):
"""Response model for document analysis retrieval."""
document_id: str
status: DocumentStatus
report: Optional[ComplianceReport] = None
message: str
class RequirementSeverity(str, Enum):
"""Enum for requirement severity levels."""
CRITICAL = "critical"
MAJOR = "major"
MINOR = "minor"
INFO = "info"
class Requirement(BaseModel):
"""Model for a compliance requirement."""
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
description: str
severity: RequirementSeverity
details: Optional[str] = None
class Standard(BaseModel):
"""Model for a compliance standard."""
id: str = Field(default_factory=lambda: str(uuid.uuid4()))
name: str
description: str
requirements: List[Requirement] = []
class StandardUploadResponse(BaseModel):
"""Response model for standard uploads."""
standard_id: str
name: str
requirement_count: int
message: str