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})>"