1
1
from datetime import datetime
2
2
from pyramid .authorization import Allow
3
3
from sedate import utcnow
4
+ from riskmatrix .orm .softdelete_base import SoftDeleteMixin
4
5
from sqlalchemy import ForeignKey
5
6
from sqlalchemy import UniqueConstraint
6
7
from sqlalchemy .ext .hybrid import hybrid_property
12
13
13
14
from riskmatrix .models import Asset
14
15
from riskmatrix .models import Risk
16
+ from riskmatrix .models .risk_assessment_info import RiskAssessmentInfo
15
17
from riskmatrix .orm .meta import Base
16
18
from riskmatrix .orm .meta import UUIDStr
17
19
from riskmatrix .orm .meta import UUIDStrPK
18
-
20
+ from sqlalchemy .types import JSON
21
+ from dataclasses import dataclass
22
+ from sqlalchemy_serializer import SerializerMixin
19
23
20
24
from typing import Any , ClassVar
21
25
from typing import TYPE_CHECKING
22
26
if TYPE_CHECKING :
23
27
from riskmatrix .types import ACL
24
28
25
29
26
- class RiskAssessment (Base ):
30
+ class RiskAssessment (SoftDeleteMixin , Base , SerializerMixin ):
27
31
28
32
__tablename__ = 'risk_assessment'
29
33
__table_args__ = (
30
- UniqueConstraint ('risk_id' , 'asset_id' ),
34
+ UniqueConstraint ('risk_id' , 'asset_id' , 'risk_assessment_info_id' ),
31
35
)
32
36
33
37
id : Mapped [UUIDStrPK ]
@@ -40,33 +44,53 @@ class RiskAssessment(Base):
40
44
index = True ,
41
45
)
42
46
47
+ risk_assessment_info_id : Mapped [UUIDStr ] = mapped_column (
48
+ ForeignKey ('risk_assessment_info.id' , ondelete = 'CASCADE' ),
49
+ index = True ,
50
+ )
51
+
43
52
meta : Mapped [dict [str , Any ]] = mapped_column (default = {})
44
53
impact : Mapped [int | None ]
45
54
likelihood : Mapped [int | None ]
46
55
47
56
created : Mapped [datetime ] = mapped_column (default = utcnow )
48
57
modified : Mapped [datetime | None ] = mapped_column (onupdate = utcnow )
49
58
59
+ state_at_finish : Mapped [JSON | None ] = mapped_column (JSON , nullable = True )
60
+
50
61
risk : Mapped [Risk ] = relationship (
51
62
back_populates = 'assessments' ,
52
63
lazy = 'joined'
53
64
)
65
+
54
66
asset : Mapped [Asset ] = relationship (
55
67
back_populates = 'assessments' ,
56
68
lazy = 'joined'
57
69
)
58
70
71
+ risk_assessment_info : Mapped [RiskAssessmentInfo ] = relationship (
72
+ back_populates = 'assessments' ,
73
+ lazy = 'joined'
74
+ )
75
+
76
+ risk_assessment_info_id : Mapped [UUIDStr ] = mapped_column (
77
+ ForeignKey ('risk_assessment_info.id' , ondelete = 'CASCADE' ),
78
+ index = True ,
79
+ )
80
+
59
81
def __init__ (
60
82
self ,
61
83
asset : Asset ,
62
84
risk : Risk ,
85
+ info : 'RiskAssessmentInfo' ,
63
86
** meta : Any
64
87
):
65
88
self .id = str (uuid4 ())
66
89
self .created = utcnow ()
67
90
self .asset = asset
68
91
self .risk = risk
69
92
self .meta = meta
93
+ self .risk_assessment_info = info
70
94
71
95
@validates ('impact' , 'likelihood' )
72
96
def ensure_larger_than_one (
0 commit comments