filters.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. import django_filters
  2. from netaddr.core import AddrFormatError
  3. from django.db.models import Q
  4. from extras.filters import CustomFieldFilterSet
  5. from tenancy.models import Tenant
  6. from utilities.filters import NullableModelMultipleChoiceFilter
  7. from .models import (
  8. ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer,
  9. Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
  10. )
  11. class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet):
  12. q = django_filters.MethodFilter(
  13. action='search',
  14. label='Search',
  15. )
  16. tenant_id = NullableModelMultipleChoiceFilter(
  17. name='tenant',
  18. queryset=Tenant.objects.all(),
  19. label='Tenant (ID)',
  20. )
  21. tenant = NullableModelMultipleChoiceFilter(
  22. name='tenant',
  23. queryset=Tenant.objects.all(),
  24. to_field_name='slug',
  25. label='Tenant (slug)',
  26. )
  27. class Meta:
  28. model = Site
  29. fields = ['q', 'name', 'facility', 'asn']
  30. def search(self, queryset, value):
  31. qs_filter = Q(name__icontains=value) | Q(facility__icontains=value) | Q(physical_address__icontains=value) | \
  32. Q(shipping_address__icontains=value) | Q(comments__icontains=value)
  33. try:
  34. qs_filter |= Q(asn=int(value.strip()))
  35. except ValueError:
  36. pass
  37. return queryset.filter(qs_filter)
  38. class RackGroupFilter(django_filters.FilterSet):
  39. site_id = django_filters.ModelMultipleChoiceFilter(
  40. name='site',
  41. queryset=Site.objects.all(),
  42. label='Site (ID)',
  43. )
  44. site = django_filters.ModelMultipleChoiceFilter(
  45. name='site__slug',
  46. queryset=Site.objects.all(),
  47. to_field_name='slug',
  48. label='Site (slug)',
  49. )
  50. class Meta:
  51. model = RackGroup
  52. class RackFilter(CustomFieldFilterSet, django_filters.FilterSet):
  53. q = django_filters.MethodFilter(
  54. action='search',
  55. label='Search',
  56. )
  57. site_id = django_filters.ModelMultipleChoiceFilter(
  58. name='site',
  59. queryset=Site.objects.all(),
  60. label='Site (ID)',
  61. )
  62. site = django_filters.ModelMultipleChoiceFilter(
  63. name='site__slug',
  64. queryset=Site.objects.all(),
  65. to_field_name='slug',
  66. label='Site (slug)',
  67. )
  68. group_id = NullableModelMultipleChoiceFilter(
  69. name='group',
  70. queryset=RackGroup.objects.all(),
  71. label='Group (ID)',
  72. )
  73. group = NullableModelMultipleChoiceFilter(
  74. name='group',
  75. queryset=RackGroup.objects.all(),
  76. to_field_name='slug',
  77. label='Group',
  78. )
  79. tenant_id = NullableModelMultipleChoiceFilter(
  80. name='tenant',
  81. queryset=Tenant.objects.all(),
  82. label='Tenant (ID)',
  83. )
  84. tenant = NullableModelMultipleChoiceFilter(
  85. name='tenant',
  86. queryset=Tenant.objects.all(),
  87. to_field_name='slug',
  88. label='Tenant (slug)',
  89. )
  90. role_id = NullableModelMultipleChoiceFilter(
  91. name='role',
  92. queryset=RackRole.objects.all(),
  93. label='Role (ID)',
  94. )
  95. role = NullableModelMultipleChoiceFilter(
  96. name='role',
  97. queryset=RackRole.objects.all(),
  98. to_field_name='slug',
  99. label='Role (slug)',
  100. )
  101. class Meta:
  102. model = Rack
  103. fields = ['u_height']
  104. def search(self, queryset, value):
  105. return queryset.filter(
  106. Q(name__icontains=value) |
  107. Q(facility_id__icontains=value) |
  108. Q(comments__icontains=value)
  109. )
  110. class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet):
  111. q = django_filters.MethodFilter(
  112. action='search',
  113. label='Search',
  114. )
  115. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  116. name='manufacturer',
  117. queryset=Manufacturer.objects.all(),
  118. label='Manufacturer (ID)',
  119. )
  120. manufacturer = django_filters.ModelMultipleChoiceFilter(
  121. name='manufacturer__slug',
  122. queryset=Manufacturer.objects.all(),
  123. to_field_name='slug',
  124. label='Manufacturer (slug)',
  125. )
  126. class Meta:
  127. model = DeviceType
  128. fields = ['model', 'part_number', 'u_height', 'is_console_server', 'is_pdu', 'is_network_device',
  129. 'subdevice_role']
  130. def search(self, queryset, value):
  131. return queryset.filter(
  132. Q(manufacturer__name__icontains=value) |
  133. Q(model__icontains=value) |
  134. Q(part_number__icontains=value) |
  135. Q(comments__icontains=value)
  136. )
  137. class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
  138. q = django_filters.MethodFilter(
  139. action='search',
  140. label='Search',
  141. )
  142. mac_address = django_filters.MethodFilter(
  143. action='_mac_address',
  144. label='MAC address',
  145. )
  146. site_id = django_filters.ModelMultipleChoiceFilter(
  147. name='rack__site',
  148. queryset=Site.objects.all(),
  149. label='Site (ID)',
  150. )
  151. site = django_filters.ModelMultipleChoiceFilter(
  152. name='rack__site__slug',
  153. queryset=Site.objects.all(),
  154. to_field_name='slug',
  155. label='Site name (slug)',
  156. )
  157. rack_group_id = django_filters.ModelMultipleChoiceFilter(
  158. name='rack__group',
  159. queryset=RackGroup.objects.all(),
  160. label='Rack group (ID)',
  161. )
  162. rack_id = django_filters.ModelMultipleChoiceFilter(
  163. name='rack',
  164. queryset=Rack.objects.all(),
  165. label='Rack (ID)',
  166. )
  167. role_id = django_filters.ModelMultipleChoiceFilter(
  168. name='device_role',
  169. queryset=DeviceRole.objects.all(),
  170. label='Role (ID)',
  171. )
  172. role = django_filters.ModelMultipleChoiceFilter(
  173. name='device_role__slug',
  174. queryset=DeviceRole.objects.all(),
  175. to_field_name='slug',
  176. label='Role (slug)',
  177. )
  178. tenant_id = NullableModelMultipleChoiceFilter(
  179. name='tenant',
  180. queryset=Tenant.objects.all(),
  181. label='Tenant (ID)',
  182. )
  183. tenant = NullableModelMultipleChoiceFilter(
  184. name='tenant',
  185. queryset=Tenant.objects.all(),
  186. to_field_name='slug',
  187. label='Tenant (slug)',
  188. )
  189. device_type_id = django_filters.ModelMultipleChoiceFilter(
  190. name='device_type',
  191. queryset=DeviceType.objects.all(),
  192. label='Device type (ID)',
  193. )
  194. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  195. name='device_type__manufacturer',
  196. queryset=Manufacturer.objects.all(),
  197. label='Manufacturer (ID)',
  198. )
  199. manufacturer = django_filters.ModelMultipleChoiceFilter(
  200. name='device_type__manufacturer__slug',
  201. queryset=Manufacturer.objects.all(),
  202. to_field_name='slug',
  203. label='Manufacturer (slug)',
  204. )
  205. model = django_filters.ModelMultipleChoiceFilter(
  206. name='device_type__slug',
  207. queryset=DeviceType.objects.all(),
  208. to_field_name='slug',
  209. label='Device model (slug)',
  210. )
  211. platform_id = NullableModelMultipleChoiceFilter(
  212. name='platform',
  213. queryset=Platform.objects.all(),
  214. label='Platform (ID)',
  215. )
  216. platform = NullableModelMultipleChoiceFilter(
  217. name='platform',
  218. queryset=Platform.objects.all(),
  219. to_field_name='slug',
  220. label='Platform (slug)',
  221. )
  222. status = django_filters.BooleanFilter(
  223. name='status',
  224. label='Status',
  225. )
  226. is_console_server = django_filters.BooleanFilter(
  227. name='device_type__is_console_server',
  228. label='Is a console server',
  229. )
  230. is_pdu = django_filters.BooleanFilter(
  231. name='device_type__is_pdu',
  232. label='Is a PDU',
  233. )
  234. is_network_device = django_filters.BooleanFilter(
  235. name='device_type__is_network_device',
  236. label='Is a network device',
  237. )
  238. class Meta:
  239. model = Device
  240. fields = ['name', 'serial', 'asset_tag']
  241. def search(self, queryset, value):
  242. return queryset.filter(
  243. Q(name__icontains=value) |
  244. Q(serial__icontains=value.strip()) |
  245. Q(modules__serial__icontains=value.strip()) |
  246. Q(asset_tag=value.strip()) |
  247. Q(comments__icontains=value)
  248. ).distinct()
  249. def _mac_address(self, queryset, value):
  250. value = value.strip()
  251. if not value:
  252. return queryset
  253. try:
  254. return queryset.filter(interfaces__mac_address=value).distinct()
  255. except AddrFormatError:
  256. return queryset.none()
  257. class ConsolePortFilter(django_filters.FilterSet):
  258. device_id = django_filters.ModelMultipleChoiceFilter(
  259. name='device',
  260. queryset=Device.objects.all(),
  261. label='Device (ID)',
  262. )
  263. device = django_filters.ModelMultipleChoiceFilter(
  264. name='device',
  265. queryset=Device.objects.all(),
  266. to_field_name='name',
  267. label='Device (name)',
  268. )
  269. class Meta:
  270. model = ConsolePort
  271. fields = ['name']
  272. class ConsoleServerPortFilter(django_filters.FilterSet):
  273. device_id = django_filters.ModelMultipleChoiceFilter(
  274. name='device',
  275. queryset=Device.objects.all(),
  276. label='Device (ID)',
  277. )
  278. device = django_filters.ModelMultipleChoiceFilter(
  279. name='device',
  280. queryset=Device.objects.all(),
  281. to_field_name='name',
  282. label='Device (name)',
  283. )
  284. class Meta:
  285. model = ConsoleServerPort
  286. fields = ['name']
  287. class PowerPortFilter(django_filters.FilterSet):
  288. device_id = django_filters.ModelMultipleChoiceFilter(
  289. name='device',
  290. queryset=Device.objects.all(),
  291. label='Device (ID)',
  292. )
  293. device = django_filters.ModelMultipleChoiceFilter(
  294. name='device',
  295. queryset=Device.objects.all(),
  296. to_field_name='name',
  297. label='Device (name)',
  298. )
  299. class Meta:
  300. model = PowerPort
  301. fields = ['name']
  302. class PowerOutletFilter(django_filters.FilterSet):
  303. device_id = django_filters.ModelMultipleChoiceFilter(
  304. name='device',
  305. queryset=Device.objects.all(),
  306. label='Device (ID)',
  307. )
  308. device = django_filters.ModelMultipleChoiceFilter(
  309. name='device',
  310. queryset=Device.objects.all(),
  311. to_field_name='name',
  312. label='Device (name)',
  313. )
  314. class Meta:
  315. model = PowerOutlet
  316. fields = ['name']
  317. class InterfaceFilter(django_filters.FilterSet):
  318. device_id = django_filters.ModelMultipleChoiceFilter(
  319. name='device',
  320. queryset=Device.objects.all(),
  321. label='Device (ID)',
  322. )
  323. device = django_filters.ModelMultipleChoiceFilter(
  324. name='device',
  325. queryset=Device.objects.all(),
  326. to_field_name='name',
  327. label='Device (name)',
  328. )
  329. class Meta:
  330. model = Interface
  331. fields = ['name']
  332. class ConsoleConnectionFilter(django_filters.FilterSet):
  333. site = django_filters.MethodFilter(
  334. action='filter_site',
  335. label='Site (slug)',
  336. )
  337. class Meta:
  338. model = ConsoleServerPort
  339. def filter_site(self, queryset, value):
  340. value = value.strip()
  341. if not value:
  342. return queryset
  343. return queryset.filter(cs_port__device__rack__site__slug=value)
  344. class PowerConnectionFilter(django_filters.FilterSet):
  345. site = django_filters.MethodFilter(
  346. action='filter_site',
  347. label='Site (slug)',
  348. )
  349. class Meta:
  350. model = PowerOutlet
  351. def filter_site(self, queryset, value):
  352. value = value.strip()
  353. if not value:
  354. return queryset
  355. return queryset.filter(power_outlet__device__rack__site__slug=value)
  356. class InterfaceConnectionFilter(django_filters.FilterSet):
  357. site = django_filters.MethodFilter(
  358. action='filter_site',
  359. label='Site (slug)',
  360. )
  361. class Meta:
  362. model = InterfaceConnection
  363. def filter_site(self, queryset, value):
  364. value = value.strip()
  365. if not value:
  366. return queryset
  367. return queryset.filter(
  368. Q(interface_a__device__rack__site__slug=value) |
  369. Q(interface_b__device__rack__site__slug=value)
  370. )