filters.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. from __future__ import unicode_literals
  2. import django_filters
  3. from netaddr import IPNetwork
  4. from netaddr.core import AddrFormatError
  5. from django.db.models import Q
  6. from dcim.models import Site, Device, Interface
  7. from extras.filters import CustomFieldFilterSet
  8. from tenancy.models import Tenant
  9. from utilities.filters import NumericInFilter
  10. from virtualization.models import VirtualMachine
  11. from .models import (
  12. Aggregate, IPAddress, IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, Prefix, PREFIX_STATUS_CHOICES, RIR, Role,
  13. Service, VLAN, VLAN_STATUS_CHOICES, VLANGroup, VRF,
  14. )
  15. class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet):
  16. id__in = NumericInFilter(name='id', lookup_expr='in')
  17. q = django_filters.CharFilter(
  18. method='search',
  19. label='Search',
  20. )
  21. tenant_id = django_filters.ModelMultipleChoiceFilter(
  22. queryset=Tenant.objects.all(),
  23. label='Tenant (ID)',
  24. )
  25. tenant = django_filters.ModelMultipleChoiceFilter(
  26. name='tenant',
  27. queryset=Tenant.objects.all(),
  28. to_field_name='slug',
  29. label='Tenant (slug)',
  30. )
  31. def search(self, queryset, name, value):
  32. if not value.strip():
  33. return queryset
  34. return queryset.filter(
  35. Q(name__icontains=value) |
  36. Q(rd__icontains=value) |
  37. Q(description__icontains=value)
  38. )
  39. class Meta:
  40. model = VRF
  41. fields = ['name', 'rd', 'enforce_unique']
  42. class RIRFilter(django_filters.FilterSet):
  43. id__in = NumericInFilter(name='id', lookup_expr='in')
  44. class Meta:
  45. model = RIR
  46. fields = ['name', 'slug', 'is_private']
  47. class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet):
  48. id__in = NumericInFilter(name='id', lookup_expr='in')
  49. q = django_filters.CharFilter(
  50. method='search',
  51. label='Search',
  52. )
  53. rir_id = django_filters.ModelMultipleChoiceFilter(
  54. queryset=RIR.objects.all(),
  55. label='RIR (ID)',
  56. )
  57. rir = django_filters.ModelMultipleChoiceFilter(
  58. name='rir__slug',
  59. queryset=RIR.objects.all(),
  60. to_field_name='slug',
  61. label='RIR (slug)',
  62. )
  63. class Meta:
  64. model = Aggregate
  65. fields = ['family', 'date_added']
  66. def search(self, queryset, name, value):
  67. if not value.strip():
  68. return queryset
  69. qs_filter = Q(description__icontains=value)
  70. try:
  71. prefix = str(IPNetwork(value.strip()).cidr)
  72. qs_filter |= Q(prefix__net_contains_or_equals=prefix)
  73. except (AddrFormatError, ValueError):
  74. pass
  75. return queryset.filter(qs_filter)
  76. class RoleFilter(django_filters.FilterSet):
  77. class Meta:
  78. model = Role
  79. fields = ['name', 'slug']
  80. class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
  81. id__in = NumericInFilter(name='id', lookup_expr='in')
  82. q = django_filters.CharFilter(
  83. method='search',
  84. label='Search',
  85. )
  86. parent = django_filters.CharFilter(
  87. method='search_by_parent',
  88. label='Parent prefix',
  89. )
  90. mask_length = django_filters.NumberFilter(
  91. method='filter_mask_length',
  92. label='Mask length',
  93. )
  94. vrf_id = django_filters.ModelMultipleChoiceFilter(
  95. queryset=VRF.objects.all(),
  96. label='VRF',
  97. )
  98. vrf = django_filters.ModelMultipleChoiceFilter(
  99. name='vrf',
  100. queryset=VRF.objects.all(),
  101. to_field_name='rd',
  102. label='VRF (RD)',
  103. )
  104. tenant_id = django_filters.ModelMultipleChoiceFilter(
  105. queryset=Tenant.objects.all(),
  106. label='Tenant (ID)',
  107. )
  108. tenant = django_filters.ModelMultipleChoiceFilter(
  109. name='tenant',
  110. queryset=Tenant.objects.all(),
  111. to_field_name='slug',
  112. label='Tenant (slug)',
  113. )
  114. site_id = django_filters.ModelMultipleChoiceFilter(
  115. queryset=Site.objects.all(),
  116. label='Site (ID)',
  117. )
  118. site = django_filters.ModelMultipleChoiceFilter(
  119. name='site',
  120. queryset=Site.objects.all(),
  121. to_field_name='slug',
  122. label='Site (slug)',
  123. )
  124. vlan_id = django_filters.ModelMultipleChoiceFilter(
  125. queryset=VLAN.objects.all(),
  126. label='VLAN (ID)',
  127. )
  128. vlan_vid = django_filters.NumberFilter(
  129. name='vlan__vid',
  130. label='VLAN number (1-4095)',
  131. )
  132. role_id = django_filters.ModelMultipleChoiceFilter(
  133. queryset=Role.objects.all(),
  134. label='Role (ID)',
  135. )
  136. role = django_filters.ModelMultipleChoiceFilter(
  137. name='role',
  138. queryset=Role.objects.all(),
  139. to_field_name='slug',
  140. label='Role (slug)',
  141. )
  142. status = django_filters.MultipleChoiceFilter(
  143. choices=PREFIX_STATUS_CHOICES
  144. )
  145. class Meta:
  146. model = Prefix
  147. fields = ['family', 'is_pool']
  148. def search(self, queryset, name, value):
  149. if not value.strip():
  150. return queryset
  151. qs_filter = Q(description__icontains=value)
  152. try:
  153. prefix = str(IPNetwork(value.strip()).cidr)
  154. qs_filter |= Q(prefix__net_contains_or_equals=prefix)
  155. except (AddrFormatError, ValueError):
  156. pass
  157. return queryset.filter(qs_filter)
  158. def search_by_parent(self, queryset, name, value):
  159. value = value.strip()
  160. if not value:
  161. return queryset
  162. try:
  163. query = str(IPNetwork(value).cidr)
  164. return queryset.filter(prefix__net_contained_or_equal=query)
  165. except (AddrFormatError, ValueError):
  166. return queryset.none()
  167. def filter_mask_length(self, queryset, name, value):
  168. if not value:
  169. return queryset
  170. return queryset.filter(prefix__net_mask_length=value)
  171. class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet):
  172. id__in = NumericInFilter(name='id', lookup_expr='in')
  173. q = django_filters.CharFilter(
  174. method='search',
  175. label='Search',
  176. )
  177. parent = django_filters.CharFilter(
  178. method='search_by_parent',
  179. label='Parent prefix',
  180. )
  181. mask_length = django_filters.NumberFilter(
  182. method='filter_mask_length',
  183. label='Mask length',
  184. )
  185. vrf_id = django_filters.ModelMultipleChoiceFilter(
  186. queryset=VRF.objects.all(),
  187. label='VRF',
  188. )
  189. vrf = django_filters.ModelMultipleChoiceFilter(
  190. name='vrf',
  191. queryset=VRF.objects.all(),
  192. to_field_name='rd',
  193. label='VRF (RD)',
  194. )
  195. tenant_id = django_filters.ModelMultipleChoiceFilter(
  196. queryset=Tenant.objects.all(),
  197. label='Tenant (ID)',
  198. )
  199. tenant = django_filters.ModelMultipleChoiceFilter(
  200. name='tenant',
  201. queryset=Tenant.objects.all(),
  202. to_field_name='slug',
  203. label='Tenant (slug)',
  204. )
  205. device_id = django_filters.ModelMultipleChoiceFilter(
  206. name='interface__device',
  207. queryset=Device.objects.all(),
  208. label='Device (ID)',
  209. )
  210. device = django_filters.ModelMultipleChoiceFilter(
  211. name='interface__device__name',
  212. queryset=Device.objects.all(),
  213. to_field_name='name',
  214. label='Device (name)',
  215. )
  216. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  217. name='interface__virtual_machine',
  218. queryset=VirtualMachine.objects.all(),
  219. label='Virtual machine (ID)',
  220. )
  221. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  222. name='interface__virtual_machine__name',
  223. queryset=VirtualMachine.objects.all(),
  224. to_field_name='name',
  225. label='Virtual machine (name)',
  226. )
  227. interface_id = django_filters.ModelMultipleChoiceFilter(
  228. queryset=Interface.objects.all(),
  229. label='Interface (ID)',
  230. )
  231. status = django_filters.MultipleChoiceFilter(
  232. choices=IPADDRESS_STATUS_CHOICES
  233. )
  234. role = django_filters.MultipleChoiceFilter(
  235. choices=IPADDRESS_ROLE_CHOICES
  236. )
  237. class Meta:
  238. model = IPAddress
  239. fields = ['family']
  240. def search(self, queryset, name, value):
  241. if not value.strip():
  242. return queryset
  243. qs_filter = (
  244. Q(description__icontains=value) |
  245. Q(address__istartswith=value)
  246. )
  247. return queryset.filter(qs_filter)
  248. def search_by_parent(self, queryset, name, value):
  249. value = value.strip()
  250. if not value:
  251. return queryset
  252. try:
  253. query = str(IPNetwork(value.strip()).cidr)
  254. return queryset.filter(address__net_host_contained=query)
  255. except (AddrFormatError, ValueError):
  256. return queryset.none()
  257. def filter_mask_length(self, queryset, name, value):
  258. if not value:
  259. return queryset
  260. return queryset.filter(address__net_mask_length=value)
  261. class VLANGroupFilter(django_filters.FilterSet):
  262. site_id = django_filters.ModelMultipleChoiceFilter(
  263. queryset=Site.objects.all(),
  264. label='Site (ID)',
  265. )
  266. site = django_filters.ModelMultipleChoiceFilter(
  267. name='site',
  268. queryset=Site.objects.all(),
  269. to_field_name='slug',
  270. label='Site (slug)',
  271. )
  272. class Meta:
  273. model = VLANGroup
  274. fields = ['name', 'slug']
  275. class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet):
  276. id__in = NumericInFilter(name='id', lookup_expr='in')
  277. q = django_filters.CharFilter(
  278. method='search',
  279. label='Search',
  280. )
  281. site_id = django_filters.ModelMultipleChoiceFilter(
  282. queryset=Site.objects.all(),
  283. label='Site (ID)',
  284. )
  285. site = django_filters.ModelMultipleChoiceFilter(
  286. name='site',
  287. queryset=Site.objects.all(),
  288. to_field_name='slug',
  289. label='Site (slug)',
  290. )
  291. group_id = django_filters.ModelMultipleChoiceFilter(
  292. queryset=VLANGroup.objects.all(),
  293. label='Group (ID)',
  294. )
  295. group = django_filters.ModelMultipleChoiceFilter(
  296. name='group',
  297. queryset=VLANGroup.objects.all(),
  298. to_field_name='slug',
  299. label='Group',
  300. )
  301. tenant_id = django_filters.ModelMultipleChoiceFilter(
  302. queryset=Tenant.objects.all(),
  303. label='Tenant (ID)',
  304. )
  305. tenant = django_filters.ModelMultipleChoiceFilter(
  306. name='tenant',
  307. queryset=Tenant.objects.all(),
  308. to_field_name='slug',
  309. label='Tenant (slug)',
  310. )
  311. role_id = django_filters.ModelMultipleChoiceFilter(
  312. queryset=Role.objects.all(),
  313. label='Role (ID)',
  314. )
  315. role = django_filters.ModelMultipleChoiceFilter(
  316. name='role',
  317. queryset=Role.objects.all(),
  318. to_field_name='slug',
  319. label='Role (slug)',
  320. )
  321. status = django_filters.MultipleChoiceFilter(
  322. choices=VLAN_STATUS_CHOICES
  323. )
  324. class Meta:
  325. model = VLAN
  326. fields = ['vid', 'name']
  327. def search(self, queryset, name, value):
  328. if not value.strip():
  329. return queryset
  330. qs_filter = Q(name__icontains=value) | Q(description__icontains=value)
  331. try:
  332. qs_filter |= Q(vid=int(value.strip()))
  333. except ValueError:
  334. pass
  335. return queryset.filter(qs_filter)
  336. class ServiceFilter(django_filters.FilterSet):
  337. device_id = django_filters.ModelMultipleChoiceFilter(
  338. queryset=Device.objects.all(),
  339. label='Device (ID)',
  340. )
  341. device = django_filters.ModelMultipleChoiceFilter(
  342. name='device__name',
  343. queryset=Device.objects.all(),
  344. to_field_name='name',
  345. label='Device (name)',
  346. )
  347. virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
  348. queryset=VirtualMachine.objects.all(),
  349. label='Virtual machine (ID)',
  350. )
  351. virtual_machine = django_filters.ModelMultipleChoiceFilter(
  352. name='virtual_machine__name',
  353. queryset=VirtualMachine.objects.all(),
  354. to_field_name='name',
  355. label='Virtual machine (name)',
  356. )
  357. class Meta:
  358. model = Service
  359. fields = ['name', 'protocol', 'port']