Spaces:
Running
Running
File size: 2,447 Bytes
bb6d7b4 |
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 |
"""
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"<Report(id={self.id}, report_id={self.report_id}, title={self.title})>" |