@@ -28,20 +28,14 @@ def evaluate(self, decision_point):
2828 if target == DecisionPoint .TARGET_VULNERABILITY :
2929 queryset = decision_point .query .get_qs (user = self .user )
3030 return queryset .filter (
31- Q (
32- pk__in = self .product .get_vulnerability_qs ().values ("pk" )
33- )
34- | Q (
35- pk__in = self .product .affected_by_vulnerabilities .values ("pk" )
36- )
31+ Q (pk__in = self .product .get_vulnerability_qs ().values ("pk" ))
32+ | Q (pk__in = self .product .affected_by_vulnerabilities .values ("pk" ))
3733 ).exists ()
3834
3935 if target == DecisionPoint .TARGET_PRODUCT :
4036 return self ._product_matches_query (decision_point .query )
4137
42- raise ValueError (
43- f"Unknown target { target } "
44- )
38+ raise ValueError (f"Unknown target { target } " )
4539
4640 def _product_matches_query (self , query ):
4741 q_objects = []
@@ -53,10 +47,8 @@ def _product_matches_query(self, query):
5347 if not q_objects :
5448 return False
5549
56- queryset = (
57- Product .unsecured_objects
58- .scope (self .product .dataspace )
59- .filter (pk = self .product .pk )
50+ queryset = Product .unsecured_objects .scope (self .product .dataspace ).filter (
51+ pk = self .product .pk
6052 )
6153 operator_type = operator .or_ if query .operator == "or" else operator .and_
6254 return queryset .filter (reduce (operator_type , q_objects )).exists ()
@@ -66,7 +58,6 @@ class RuleMatcher:
6658
6759 @staticmethod
6860 def matches (rule , vector ):
69-
7061 """
7162 vector
7263
@@ -82,20 +73,12 @@ def matches(rule, vector):
8273
8374 expected = condition .expected
8475
85- actual = vector [
86- condition .decision_point .name
87- ]
76+ actual = vector [condition .decision_point .name ]
8877
89- if (
90- expected == ExpectedValue .TRUE
91- and not actual
92- ):
78+ if expected == ExpectedValue .TRUE and not actual :
9379 return False
9480
95- if (
96- expected == ExpectedValue .FALSE
97- and actual
98- ):
81+ if expected == ExpectedValue .FALSE and actual :
9982 return False
10083
10184 return True
@@ -109,14 +92,10 @@ def __init__(self, ruleset):
10992
11093 def evaluate (self , vector ):
11194
112- rules = (
113- self .ruleset .rules
114- .prefetch_related (
115- "conditions" ,
116- "decision" ,
117- )
118- .order_by ("priority" )
119- )
95+ rules = self .ruleset .rules .prefetch_related (
96+ "conditions" ,
97+ "decision" ,
98+ ).order_by ("priority" )
12099
121100 for rule in rules :
122101
@@ -130,7 +109,6 @@ def evaluate(self, vector):
130109
131110
132111class EvaluationEngine :
133-
134112 """
135113 Public entry point.
136114
@@ -142,33 +120,20 @@ class EvaluationEngine:
142120 )
143121 """
144122
145- def evaluate (
146- self ,
147- product ,
148- rulesets ,
149- user = None ,
150- ):
151-
152- decision_point_evaluator = (
153- DecisionPointEvaluator (
154- product ,
155- user = user ,
156- )
123+ def evaluate (self , product , rulesets , user = None ):
124+
125+ decision_point_evaluator = DecisionPointEvaluator (
126+ product ,
127+ user = user ,
157128 )
158129
159130 vector = {}
160131
161- decision_points = (
162- self .get_all_decision_points (
163- rulesets
164- )
165- )
132+ decision_points = self .get_all_decision_points (rulesets )
166133
167134 for dp in decision_points :
168135
169- vector [dp .name ] = (
170- decision_point_evaluator .evaluate (dp )
171- )
136+ vector [dp .name ] = decision_point_evaluator .evaluate (dp )
172137
173138 winning = None
174139
@@ -178,48 +143,29 @@ def evaluate(
178143 if not ruleset .enabled :
179144 continue
180145
181- decision = (
182- RulesetEvaluator (
183- ruleset
184- ).evaluate (vector )
185- )
146+ decision = RulesetEvaluator (ruleset ).evaluate (vector )
186147
187- if (
188- winning is None
189- or ruleset .precedence
190- > winning_precedence
191- ):
148+ if winning is None or ruleset .precedence > winning_precedence :
192149 winning = decision
193- winning_precedence = (
194- ruleset .precedence
195- )
150+ winning_precedence = ruleset .precedence
196151
197152 return EvaluationResult (
198153 decision = winning ,
199154 decision_vector = vector ,
200155 )
201156
202157 @staticmethod
203- def get_all_decision_points (
204- rulesets ,
205- ):
158+ def get_all_decision_points (rulesets ):
206159
207160 seen = {}
208161
209162 for ruleset in rulesets :
210163 if not ruleset .enabled :
211164 continue
212165
213- for rule in (
214- ruleset .rules
215- .prefetch_related (
216- "conditions__decision_point"
217- )
218- ):
166+ for rule in ruleset .rules .prefetch_related ("conditions__decision_point" ):
219167
220- for condition in (
221- rule .conditions .all ()
222- ):
168+ for condition in rule .conditions .all ():
223169 dp = condition .decision_point
224170 if not dp .enabled :
225171 continue
@@ -231,23 +177,11 @@ def get_all_decision_points(
231177
232178class EvaluationResult :
233179
234- def __init__ (
235- self ,
236- decision ,
237- decision_vector ,
238- ):
239-
180+ def __init__ (self , decision , decision_vector ):
240181 self .decision = decision
241-
242182 self .vector = decision_vector
243183
244184 def __repr__ (self ):
245-
246185 return (
247- f"<EvaluationResult "
248- f"decision={ self .decision } "
249- f"vector={ self .vector } >"
186+ f"<EvaluationResult " f"decision={ self .decision } " f"vector={ self .vector } >"
250187 )
251-
252-
253- # Have policies that are more related to real life examples
0 commit comments