33from django .shortcuts import redirect
44from django .urls import reverse
55from django .utils .translation import gettext_lazy as _
6+ from django .views .generic .base import TemplateView
67from tools .ooi_helpers import format_attr_name
78from tools .view_helpers import existing_ooi_type , get_mandatory_fields , url_with_querystring
89
@@ -29,54 +30,6 @@ def get_related_objects(self, observed_at):
2930 related .append (rel )
3031 return related
3132
32-
33- class OOIFindingManager (SingleOOITreeMixin ):
34- def get_findings (self ) -> list [Finding ]:
35- findings = []
36- for relation in self .tree .root .children .values ():
37- for child in relation :
38- ooi = self .tree .store [str (child .reference )]
39- if isinstance (ooi , Finding ) and ooi .reference != self .tree .root .reference :
40- findings .append (ooi )
41- return findings
42-
43- def count_findings_per_severity (self ) -> Counter :
44- counter = Counter ({severity : 0 for severity in RiskLevelSeverity })
45- for finding in self .get_findings ():
46- finding_type : FindingType | None = self .tree .store .get (str (finding .finding_type ), None )
47- if finding_type is not None and finding_type .risk_severity is not None :
48- counter .update ([finding_type .risk_severity ])
49- else :
50- counter .update ([RiskLevelSeverity .UNKNOWN ])
51- return counter
52-
53- def get_finding_details_sorted_by_score_desc (self ) -> list [tuple [Finding , FindingType ]]:
54- finding_details = self .get_finding_details ()
55- return list (sorted (finding_details , key = lambda x : x [1 ].risk_score or 0 , reverse = True ))
56-
57- def get_finding_details (self ) -> list [tuple [Finding , FindingType ]]:
58- return [(finding , self .tree .store [str (finding .finding_type )]) for finding in self .get_findings ()]
59-
60-
61- class OOIRelatedObjectAddView (OOIRelatedObjectManager ):
62- template_name = "oois/ooi_detail_add_related_object.html"
63-
64- def get (self , request , * args , ** kwargs ):
65- if "ooi_id" in request .GET :
66- self .ooi_id = self .get_ooi (pk = request .GET .get ("ooi_id" ))
67-
68- if "add_ooi_type" in request .GET :
69- ooi_type_choice = self .split_ooi_type_choice (request .GET ["add_ooi_type" ])
70- if existing_ooi_type (ooi_type_choice ["ooi_type" ]):
71- return redirect (self .ooi_add_url (self .ooi_id , ** ooi_type_choice ))
72-
73- if "status_code" in kwargs :
74- response = super ().get (request , * args , ** kwargs )
75- response .status_code = kwargs ["status_code" ]
76- return response
77-
78- return super ().get (request , * args , ** kwargs )
79-
8033 def split_ooi_type_choice (self , ooi_type_choice ) -> dict [str , str ]:
8134 ooi_type = ooi_type_choice .split ("|" , 1 )
8235
@@ -146,6 +99,54 @@ def get_ooi_types_input_values(self, ooi: OOI) -> list[dict[str, str]]:
14699
147100 return input_values
148101
102+
103+ class OOIFindingManager (SingleOOITreeMixin ):
104+ def get_findings (self ) -> list [Finding ]:
105+ findings = []
106+ for relation in self .tree .root .children .values ():
107+ for child in relation :
108+ ooi = self .tree .store [str (child .reference )]
109+ if isinstance (ooi , Finding ) and ooi .reference != self .tree .root .reference :
110+ findings .append (ooi )
111+ return findings
112+
113+ def count_findings_per_severity (self ) -> Counter :
114+ counter = Counter ({severity : 0 for severity in RiskLevelSeverity })
115+ for finding in self .get_findings ():
116+ finding_type : FindingType | None = self .tree .store .get (str (finding .finding_type ), None )
117+ if finding_type is not None and finding_type .risk_severity is not None :
118+ counter .update ([finding_type .risk_severity ])
119+ else :
120+ counter .update ([RiskLevelSeverity .UNKNOWN ])
121+ return counter
122+
123+ def get_finding_details_sorted_by_score_desc (self ) -> list [tuple [Finding , FindingType ]]:
124+ finding_details = self .get_finding_details ()
125+ return list (sorted (finding_details , key = lambda x : x [1 ].risk_score or 0 , reverse = True ))
126+
127+ def get_finding_details (self ) -> list [tuple [Finding , FindingType ]]:
128+ return [(finding , self .tree .store [str (finding .finding_type )]) for finding in self .get_findings ()]
129+
130+
131+ class OOIRelatedObjectAddView (OOIRelatedObjectManager , TemplateView ):
132+ template_name = "oois/ooi_detail_add_related_object.html"
133+
134+ def get (self , request , * args , ** kwargs ):
135+ if "ooi_id" in request .GET :
136+ self .ooi_id = self .get_ooi (pk = request .GET ["ooi_id" ])
137+
138+ if "add_ooi_type" in request .GET :
139+ ooi_type_choice = self .split_ooi_type_choice (request .GET ["add_ooi_type" ])
140+ if existing_ooi_type (ooi_type_choice ["ooi_type" ]):
141+ return redirect (self .ooi_add_url (self .ooi_id , ** ooi_type_choice ))
142+
143+ if "status_code" in kwargs :
144+ response = super ().get (request , * args , ** kwargs )
145+ response .status_code = kwargs ["status_code" ]
146+ return response
147+
148+ return super ().get (request , * args , ** kwargs )
149+
149150 def get_context_data (self , ** kwargs ):
150151 context = super ().get_context_data (** kwargs )
151152 context ["ooi_id" ] = self .ooi_id
0 commit comments