Skip to content

Commit 5279f83

Browse files
committed
Add ability to filter objects with EMPTY purls in PackageURLFilter #92
Signed-off-by: Thomas Druez <[email protected]>
1 parent 1d2431f commit 5279f83

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

CHANGELOG.rst

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Changelog
22
=========
33

4+
0.10.1 (unreleased)
5+
-------------------
6+
7+
- Add ability to filter objects with EMPTY purls in PackageURLFilter #92
8+
49
0.10.0 (2022-06-27)
510
-------------------
611

src/packageurl/contrib/django/filters.py

+22-6
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,34 @@
2929

3030
class PackageURLFilter(django_filters.CharFilter):
3131
"""
32-
Filter by a Package URL string.
33-
Empty values are not applied to the QuerySet.
32+
Filter by an exact Package URL string.
33+
The special "EMPTY" value allows to retrieve objects with empty
34+
Package URL.
3435
35-
This filter depends on a `for_package_url` method available on the Model
36-
Manager, see for example `PackageURLQuerySetMixin`.
36+
This filter depends on a `for_package_url` and `empty_package_url`
37+
methods to be available on the Model Manager,
38+
see for example `PackageURLQuerySetMixin`.
3739
"""
3840

41+
is_empty = "EMPTY"
42+
help_text = (
43+
"Match Package URL. "
44+
'Use "EMPTY" as value to retrieve objects with empty Package URL.'
45+
)
46+
47+
def __init__(self, *args, **kwargs):
48+
kwargs.setdefault("help_text", self.help_text)
49+
super().__init__(*args, **kwargs)
50+
3951
def filter(self, qs, value):
40-
empty_values = ([], (), {}, "", None)
41-
if value in empty_values:
52+
none_values = ([], (), {}, "", None)
53+
if value in none_values:
4254
return qs
4355

4456
if self.distinct:
4557
qs = qs.distinct()
58+
59+
if value == self.is_empty:
60+
return qs.empty_package_url()
61+
4662
return qs.for_package_url(value)

src/packageurl/contrib/django/models.py

+6
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ def for_package_url(self, purl_str):
7575
return self.filter(**lookups)
7676
return self.none()
7777

78+
def empty_package_url(self):
79+
"""
80+
Return objects with empty Package URL.
81+
"""
82+
return self.filter(models.Q(type="") | models.Q(name=""))
83+
7884

7985
class PackageURLQuerySet(PackageURLQuerySetMixin, models.QuerySet):
8086
pass

0 commit comments

Comments
 (0)