1
1
import django_filters
2
+ import netaddr
2
3
from django .db .models import Q
3
-
4
+ from netaddr . core import AddrFormatError
4
5
# With netbox v2.11.3 TagFilter was moved to extras
5
6
try :
6
7
from utilities .filters import TagFilter
@@ -122,7 +123,6 @@ class BGPSessionFilterSet(django_filters.FilterSet):
122
123
to_field_name = 'address' ,
123
124
label = 'Remote Address' ,
124
125
)
125
-
126
126
device_id = django_filters .ModelMultipleChoiceFilter (
127
127
field_name = 'device__id' ,
128
128
queryset = Device .objects .all (),
@@ -135,6 +135,14 @@ class BGPSessionFilterSet(django_filters.FilterSet):
135
135
to_field_name = 'name' ,
136
136
label = 'Device (name)' ,
137
137
)
138
+ by_remote_address = django_filters .CharFilter (
139
+ method = 'search_by_remote_ip' ,
140
+ label = 'Remote Address' ,
141
+ )
142
+ by_local_address = django_filters .CharFilter (
143
+ method = 'search_by_local_ip' ,
144
+ label = 'Local Address' ,
145
+ )
138
146
139
147
class Meta :
140
148
model = BGPSession
@@ -152,6 +160,24 @@ def search(self, queryset, name, value):
152
160
)
153
161
return queryset .filter (qs_filter )
154
162
163
+ def search_by_remote_ip (self , queryset , name , value ):
164
+ if not value .strip ():
165
+ return queryset
166
+ try :
167
+ query = str (netaddr .IPNetwork (value ).cidr )
168
+ return queryset .filter (remote_address__address = query )
169
+ except (AddrFormatError , ValueError ):
170
+ return queryset .none ()
171
+
172
+ def search_by_local_ip (self , queryset , name , value ):
173
+ if not value .strip ():
174
+ return queryset
175
+ try :
176
+ query = str (netaddr .IPNetwork (value ).cidr )
177
+ return queryset .filter (local_address__address = query )
178
+ except (AddrFormatError , ValueError ):
179
+ return queryset .none ()
180
+
155
181
156
182
class RoutingPolicyFilterSet (django_filters .FilterSet ):
157
183
q = django_filters .CharFilter (
0 commit comments