filters.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. import django_filters
  2. from django.db.models import Q
  3. from extras.filters import CustomFieldFilterSet
  4. from tenancy.models import Tenant
  5. from utilities.filters import NullableModelMultipleChoiceFilter
  6. from .models import (
  7. ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer,
  8. Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackRole, Site,
  9. )
  10. class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet):
  11. q = django_filters.MethodFilter(
  12. action='search',
  13. label='Search',
  14. )
  15. tenant_id = NullableModelMultipleChoiceFilter(
  16. name='tenant',
  17. queryset=Tenant.objects.all(),
  18. label='Tenant (ID)',
  19. )
  20. tenant = NullableModelMultipleChoiceFilter(
  21. name='tenant',
  22. queryset=Tenant.objects.all(),
  23. to_field_name='slug',
  24. label='Tenant (slug)',
  25. )
  26. class Meta:
  27. model = Site
  28. fields = ['q', 'name', 'facility', 'asn']
  29. def search(self, queryset, value):
  30. qs_filter = Q(name__icontains=value) | Q(facility__icontains=value) | Q(physical_address__icontains=value) | \
  31. Q(shipping_address__icontains=value) | Q(comments__icontains=value)
  32. try:
  33. qs_filter |= Q(asn=int(value.strip()))
  34. except ValueError:
  35. pass
  36. return queryset.filter(qs_filter)
  37. class RackGroupFilter(django_filters.FilterSet):
  38. site_id = django_filters.ModelMultipleChoiceFilter(
  39. name='site',
  40. queryset=Site.objects.all(),
  41. label='Site (ID)',
  42. )
  43. site = django_filters.ModelMultipleChoiceFilter(
  44. name='site',
  45. queryset=Site.objects.all(),
  46. to_field_name='slug',
  47. label='Site (slug)',
  48. )
  49. class Meta:
  50. model = RackGroup
  51. fields = ['site_id', 'site']
  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',
  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 = ['q', 'site_id', 'site', '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(django_filters.FilterSet):
  111. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  112. name='manufacturer',
  113. queryset=Manufacturer.objects.all(),
  114. label='Manufacturer (ID)',
  115. )
  116. manufacturer = django_filters.ModelMultipleChoiceFilter(
  117. name='manufacturer',
  118. queryset=Manufacturer.objects.all(),
  119. to_field_name='slug',
  120. label='Manufacturer (slug)',
  121. )
  122. class Meta:
  123. model = DeviceType
  124. fields = ['manufacturer_id', 'manufacturer', 'model', 'part_number', 'u_height', 'is_console_server', 'is_pdu',
  125. 'is_network_device']
  126. class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
  127. q = django_filters.MethodFilter(
  128. action='search',
  129. label='Search',
  130. )
  131. site_id = django_filters.ModelMultipleChoiceFilter(
  132. name='rack__site',
  133. queryset=Site.objects.all(),
  134. label='Site (ID)',
  135. )
  136. site = django_filters.ModelMultipleChoiceFilter(
  137. name='rack__site',
  138. queryset=Site.objects.all(),
  139. to_field_name='slug',
  140. label='Site name (slug)',
  141. )
  142. rack_group_id = django_filters.ModelMultipleChoiceFilter(
  143. name='rack__group',
  144. queryset=RackGroup.objects.all(),
  145. label='Rack group (ID)',
  146. )
  147. rack_id = django_filters.ModelMultipleChoiceFilter(
  148. name='rack',
  149. queryset=Rack.objects.all(),
  150. label='Rack (ID)',
  151. )
  152. role_id = django_filters.ModelMultipleChoiceFilter(
  153. name='device_role',
  154. queryset=DeviceRole.objects.all(),
  155. label='Role (ID)',
  156. )
  157. role = django_filters.ModelMultipleChoiceFilter(
  158. name='device_role',
  159. queryset=DeviceRole.objects.all(),
  160. to_field_name='slug',
  161. label='Role (slug)',
  162. )
  163. tenant_id = NullableModelMultipleChoiceFilter(
  164. name='tenant',
  165. queryset=Tenant.objects.all(),
  166. label='Tenant (ID)',
  167. )
  168. tenant = NullableModelMultipleChoiceFilter(
  169. name='tenant',
  170. queryset=Tenant.objects.all(),
  171. to_field_name='slug',
  172. label='Tenant (slug)',
  173. )
  174. device_type_id = django_filters.ModelMultipleChoiceFilter(
  175. name='device_type',
  176. queryset=DeviceType.objects.all(),
  177. label='Device type (ID)',
  178. )
  179. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  180. name='device_type__manufacturer',
  181. queryset=Manufacturer.objects.all(),
  182. label='Manufacturer (ID)',
  183. )
  184. manufacturer = django_filters.ModelMultipleChoiceFilter(
  185. name='device_type__manufacturer',
  186. queryset=Manufacturer.objects.all(),
  187. to_field_name='slug',
  188. label='Manufacturer (slug)',
  189. )
  190. model = django_filters.ModelMultipleChoiceFilter(
  191. name='device_type',
  192. queryset=DeviceType.objects.all(),
  193. to_field_name='slug',
  194. label='Device model (slug)',
  195. )
  196. platform_id = NullableModelMultipleChoiceFilter(
  197. name='platform',
  198. queryset=Platform.objects.all(),
  199. label='Platform (ID)',
  200. )
  201. platform = NullableModelMultipleChoiceFilter(
  202. name='platform',
  203. queryset=Platform.objects.all(),
  204. to_field_name='slug',
  205. label='Platform (slug)',
  206. )
  207. status = django_filters.BooleanFilter(
  208. name='status',
  209. label='Status',
  210. )
  211. is_console_server = django_filters.BooleanFilter(
  212. name='device_type__is_console_server',
  213. label='Is a console server',
  214. )
  215. is_pdu = django_filters.BooleanFilter(
  216. name='device_type__is_pdu',
  217. label='Is a PDU',
  218. )
  219. is_network_device = django_filters.BooleanFilter(
  220. name='device_type__is_network_device',
  221. label='Is a network device',
  222. )
  223. class Meta:
  224. model = Device
  225. fields = ['q', 'name', 'serial', 'asset_tag', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id',
  226. 'manufacturer_id', 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server',
  227. 'is_pdu', 'is_network_device']
  228. def search(self, queryset, value):
  229. return queryset.filter(
  230. Q(name__icontains=value) |
  231. Q(serial__icontains=value.strip()) |
  232. Q(modules__serial__icontains=value.strip()) |
  233. Q(asset_tag=value.strip()) |
  234. Q(comments__icontains=value)
  235. ).distinct()
  236. class ConsolePortFilter(django_filters.FilterSet):
  237. device_id = django_filters.ModelMultipleChoiceFilter(
  238. name='device',
  239. queryset=Device.objects.all(),
  240. label='Device (ID)',
  241. )
  242. device = django_filters.ModelMultipleChoiceFilter(
  243. name='device',
  244. queryset=Device.objects.all(),
  245. to_field_name='name',
  246. label='Device (name)',
  247. )
  248. class Meta:
  249. model = ConsolePort
  250. fields = ['device_id', 'device', 'name']
  251. class ConsoleServerPortFilter(django_filters.FilterSet):
  252. device_id = django_filters.ModelMultipleChoiceFilter(
  253. name='device',
  254. queryset=Device.objects.all(),
  255. label='Device (ID)',
  256. )
  257. device = django_filters.ModelMultipleChoiceFilter(
  258. name='device',
  259. queryset=Device.objects.all(),
  260. to_field_name='name',
  261. label='Device (name)',
  262. )
  263. class Meta:
  264. model = ConsoleServerPort
  265. fields = ['device_id', 'device', 'name']
  266. class PowerPortFilter(django_filters.FilterSet):
  267. device_id = django_filters.ModelMultipleChoiceFilter(
  268. name='device',
  269. queryset=Device.objects.all(),
  270. label='Device (ID)',
  271. )
  272. device = django_filters.ModelMultipleChoiceFilter(
  273. name='device',
  274. queryset=Device.objects.all(),
  275. to_field_name='name',
  276. label='Device (name)',
  277. )
  278. class Meta:
  279. model = PowerPort
  280. fields = ['device_id', 'device', 'name']
  281. class PowerOutletFilter(django_filters.FilterSet):
  282. device_id = django_filters.ModelMultipleChoiceFilter(
  283. name='device',
  284. queryset=Device.objects.all(),
  285. label='Device (ID)',
  286. )
  287. device = django_filters.ModelMultipleChoiceFilter(
  288. name='device',
  289. queryset=Device.objects.all(),
  290. to_field_name='name',
  291. label='Device (name)',
  292. )
  293. class Meta:
  294. model = PowerOutlet
  295. fields = ['device_id', 'device', 'name']
  296. class InterfaceFilter(django_filters.FilterSet):
  297. device_id = django_filters.ModelMultipleChoiceFilter(
  298. name='device',
  299. queryset=Device.objects.all(),
  300. label='Device (ID)',
  301. )
  302. device = django_filters.ModelMultipleChoiceFilter(
  303. name='device',
  304. queryset=Device.objects.all(),
  305. to_field_name='name',
  306. label='Device (name)',
  307. )
  308. class Meta:
  309. model = Interface
  310. fields = ['device_id', 'device', 'name']
  311. class ConsoleConnectionFilter(django_filters.FilterSet):
  312. site = django_filters.MethodFilter(
  313. action='filter_site',
  314. label='Site (slug)',
  315. )
  316. class Meta:
  317. model = ConsoleServerPort
  318. def filter_site(self, queryset, value):
  319. value = value.strip()
  320. if not value:
  321. return queryset
  322. return queryset.filter(cs_port__device__rack__site__slug=value)
  323. class PowerConnectionFilter(django_filters.FilterSet):
  324. site = django_filters.MethodFilter(
  325. action='filter_site',
  326. label='Site (slug)',
  327. )
  328. class Meta:
  329. model = PowerOutlet
  330. def filter_site(self, queryset, value):
  331. value = value.strip()
  332. if not value:
  333. return queryset
  334. return queryset.filter(power_outlet__device__rack__site__slug=value)
  335. class InterfaceConnectionFilter(django_filters.FilterSet):
  336. site = django_filters.MethodFilter(
  337. action='filter_site',
  338. label='Site (slug)',
  339. )
  340. class Meta:
  341. model = InterfaceConnection
  342. def filter_site(self, queryset, value):
  343. value = value.strip()
  344. if not value:
  345. return queryset
  346. return queryset.filter(
  347. Q(interface_a__device__rack__site__slug=value) |
  348. Q(interface_b__device__rack__site__slug=value)
  349. )