""" Model for storing reports generated from threats and analysis. """ from sqlalchemy import Column, String, Text, Integer, DateTime, ForeignKey, Enum, Table from sqlalchemy.orm import relationship import enum from datetime import datetime from typing import List from src.models.base import BaseModel from src.models.threat import ThreatSeverity # Many-to-many relationship table for reports and threats report_threats = Table( "report_threats", BaseModel.metadata, Column("report_id", Integer, ForeignKey("reports.id"), primary_key=True), Column("threat_id", Integer, ForeignKey("threats.id"), primary_key=True), ) class ReportType(enum.Enum): """Type of report.""" THREAT_DIGEST = "Threat Digest" DARK_WEB_ANALYSIS = "Dark Web Analysis" VULNERABILITY_ASSESSMENT = "Vulnerability Assessment" INCIDENT_RESPONSE = "Incident Response" THREAT_INTELLIGENCE = "Threat Intelligence" EXECUTIVE_SUMMARY = "Executive Summary" TECHNICAL_ANALYSIS = "Technical Analysis" WEEKLY_SUMMARY = "Weekly Summary" MONTHLY_SUMMARY = "Monthly Summary" CUSTOM = "Custom" class ReportStatus(enum.Enum): """Status of report.""" DRAFT = "Draft" REVIEW = "In Review" APPROVED = "Approved" PUBLISHED = "Published" ARCHIVED = "Archived" class Report(BaseModel): """Model for reports on threats and analysis.""" __tablename__ = "reports" # Report metadata report_id = Column(String(50), unique=True, nullable=False) title = Column(String(255), nullable=False) summary = Column(Text, nullable=False) content = Column(Text, nullable=False) report_type = Column(Enum(ReportType), nullable=False) status = Column(Enum(ReportStatus), nullable=False, default=ReportStatus.DRAFT) severity = Column(Enum(ThreatSeverity)) # Report scheduling and timing publish_date = Column(DateTime) time_period_start = Column(DateTime) time_period_end = Column(DateTime) # Keywords for searchability keywords = Column(String(500)) # Related entities author_id = Column(Integer, ForeignKey("users.id")) author = relationship("User") # Many-to-many relationship with threats threats = relationship( "Threat", secondary=report_threats, backref="reports" ) def __repr__(self): return f""