@@ -130,6 +130,23 @@ class Meta:
130130 ]
131131
132132
133+ class HasComplianceIssueFilter (django_filters .BooleanFilter ):
134+ """Filter objects that have a compliance alert (warning or error) on their usage policy."""
135+
136+ def __init__ (self , * args , ** kwargs ):
137+ kwargs .setdefault ("label" , _ ("Compliance issues" ))
138+ kwargs .setdefault ("field_name" , "compliance_alert" )
139+ super ().__init__ (* args , ** kwargs )
140+
141+ def filter (self , qs , value ):
142+ if value is None :
143+ return qs
144+ lookup = {f"{ self .field_name } __in" : ["warning" , "error" ]}
145+ if value :
146+ return qs .filter (** lookup )
147+ return qs .exclude (** lookup )
148+
149+
133150class BaseProductRelationFilterSet (DataspacedFilterSet ):
134151 field_name_prefix = None
135152 dropdown_fields = [
@@ -149,6 +166,7 @@ class BaseProductRelationFilterSet(DataspacedFilterSet):
149166 )
150167 is_modified = BooleanChoiceFilter ()
151168 object_type = django_filters .CharFilter (
169+ label = "Item type" ,
152170 method = "filter_object_type" ,
153171 widget = DropDownWidget (
154172 anchor = "#inventory" ,
@@ -178,6 +196,14 @@ class BaseProductRelationFilterSet(DataspacedFilterSet):
178196 to_field_name = "key" ,
179197 queryset = License .objects .only ("key" , "short_name" , "dataspace__id" ),
180198 )
199+ has_licenses = HasValueFilter (
200+ label = _ ("Has licenses" ),
201+ field_name = "license_expression" ,
202+ )
203+ license_compliance_issues = HasComplianceIssueFilter (
204+ label = "License compliance issues" ,
205+ field_name = "licenses__usage_policy__compliance_alert" ,
206+ )
181207
182208 @staticmethod
183209 def filter_object_type (queryset , name , value ):
@@ -244,6 +270,9 @@ class ProductComponentFilterSet(BaseProductRelationFilterSet):
244270 anchor = "#inventory" , right_align = True , link_content = '<i class="fas fa-bug"></i>'
245271 ),
246272 )
273+ compliance_issues = HasComplianceIssueFilter (
274+ field_name = "component__usage_policy__compliance_alert" ,
275+ )
247276
248277 class Meta :
249278 model = ProductComponent
@@ -256,23 +285,6 @@ class Meta:
256285 ]
257286
258287
259- class HasComplianceIssueFilter (django_filters .BooleanFilter ):
260- """Filter objects that have a compliance alert (warning or error) on their usage policy."""
261-
262- def __init__ (self , * args , ** kwargs ):
263- kwargs .setdefault ("label" , _ ("Compliance issues" ))
264- kwargs .setdefault ("field_name" , "compliance_alert" )
265- super ().__init__ (* args , ** kwargs )
266-
267- def filter (self , qs , value ):
268- if value is None :
269- return qs
270- lookup = {f"{ self .field_name } __in" : ["warning" , "error" ]}
271- if value :
272- return qs .filter (** lookup )
273- return qs .exclude (** lookup )
274-
275-
276288class ProductPackageFilterSet (BaseProductRelationFilterSet ):
277289 field_name_prefix = "package"
278290 dropdown_fields = [
@@ -331,18 +343,9 @@ class ProductPackageFilterSet(BaseProductRelationFilterSet):
331343 ("unknown" , _ ("Reachability not known" )),
332344 ),
333345 )
334- has_licenses = HasValueFilter (
335- label = _ ("Has licenses" ),
336- field_name = "license_expression" ,
337- )
338346 compliance_issues = HasComplianceIssueFilter (
339- label = "Package compliance issues" ,
340347 field_name = "package__usage_policy__compliance_alert" ,
341348 )
342- license_compliance_issues = HasComplianceIssueFilter (
343- label = "License compliance issues" ,
344- field_name = "licenses__usage_policy__compliance_alert" ,
345- )
346349
347350 class Meta :
348351 model = ProductPackage
@@ -356,9 +359,6 @@ class Meta:
356359 "vulnerability_analyses__justification" ,
357360 "is_reachable" ,
358361 "exploitability" ,
359- "has_licenses" ,
360- "compliance_issues" ,
361- "license_compliance_issues" ,
362362 ]
363363
364364 def __init__ (self , * args , ** kwargs ):
0 commit comments