filters.py 11 KB

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