filters.py 11 KB

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