| """ |
| 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 |
|
|
| |
| 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_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)) |
| |
| |
| publish_date = Column(DateTime) |
| time_period_start = Column(DateTime) |
| time_period_end = Column(DateTime) |
| |
| |
| keywords = Column(String(500)) |
| |
| |
| author_id = Column(Integer, ForeignKey("users.id")) |
| author = relationship("User") |
| |
| |
| threats = relationship( |
| "Threat", |
| secondary=report_threats, |
| backref="reports" |
| ) |
| |
| def __repr__(self): |
| return f"<Report(id={self.id}, report_id={self.report_id}, title={self.title})>" |