filters.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  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, 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. value = value.strip()
  29. qs_filter = Q(name__icontains=value) | Q(facility__icontains=value) | Q(physical_address__icontains=value) | \
  30. Q(shipping_address__icontains=value)
  31. try:
  32. qs_filter |= Q(asn=int(value))
  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(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. class Meta:
  90. model = Rack
  91. fields = ['q', 'site_id', 'site', 'u_height']
  92. def search(self, queryset, value):
  93. value = value.strip()
  94. return queryset.filter(
  95. Q(name__icontains=value) |
  96. Q(facility_id__icontains=value)
  97. )
  98. class DeviceTypeFilter(django_filters.FilterSet):
  99. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  100. name='manufacturer',
  101. queryset=Manufacturer.objects.all(),
  102. label='Manufacturer (ID)',
  103. )
  104. manufacturer = django_filters.ModelMultipleChoiceFilter(
  105. name='manufacturer',
  106. queryset=Manufacturer.objects.all(),
  107. to_field_name='slug',
  108. label='Manufacturer (slug)',
  109. )
  110. class Meta:
  111. model = DeviceType
  112. fields = ['manufacturer_id', 'manufacturer', 'model', 'part_number', 'u_height', 'is_console_server', 'is_pdu',
  113. 'is_network_device']
  114. class DeviceFilter(django_filters.FilterSet):
  115. q = django_filters.MethodFilter(
  116. action='search',
  117. label='Search',
  118. )
  119. site_id = django_filters.ModelMultipleChoiceFilter(
  120. name='rack__site',
  121. queryset=Site.objects.all(),
  122. label='Site (ID)',
  123. )
  124. site = django_filters.ModelMultipleChoiceFilter(
  125. name='rack__site',
  126. queryset=Site.objects.all(),
  127. to_field_name='slug',
  128. label='Site name (slug)',
  129. )
  130. rack_group_id = django_filters.ModelMultipleChoiceFilter(
  131. name='rack__group',
  132. queryset=RackGroup.objects.all(),
  133. label='Rack group (ID)',
  134. )
  135. rack_id = django_filters.ModelMultipleChoiceFilter(
  136. name='rack',
  137. queryset=Rack.objects.all(),
  138. label='Rack (ID)',
  139. )
  140. role_id = django_filters.ModelMultipleChoiceFilter(
  141. name='device_role',
  142. queryset=DeviceRole.objects.all(),
  143. label='Role (ID)',
  144. )
  145. role = django_filters.ModelMultipleChoiceFilter(
  146. name='device_role',
  147. queryset=DeviceRole.objects.all(),
  148. to_field_name='slug',
  149. label='Role (slug)',
  150. )
  151. tenant_id = django_filters.ModelMultipleChoiceFilter(
  152. name='tenant',
  153. queryset=Tenant.objects.all(),
  154. label='Tenant (ID)',
  155. )
  156. tenant = django_filters.ModelMultipleChoiceFilter(
  157. name='tenant',
  158. queryset=Tenant.objects.all(),
  159. to_field_name='slug',
  160. label='Tenant (slug)',
  161. )
  162. device_type_id = django_filters.ModelMultipleChoiceFilter(
  163. name='device_type',
  164. queryset=DeviceType.objects.all(),
  165. label='Device type (ID)',
  166. )
  167. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  168. name='device_type__manufacturer',
  169. queryset=Manufacturer.objects.all(),
  170. label='Manufacturer (ID)',
  171. )
  172. manufacturer = django_filters.ModelMultipleChoiceFilter(
  173. name='device_type__manufacturer',
  174. queryset=Manufacturer.objects.all(),
  175. to_field_name='slug',
  176. label='Manufacturer (slug)',
  177. )
  178. model = django_filters.ModelMultipleChoiceFilter(
  179. name='device_type',
  180. queryset=DeviceType.objects.all(),
  181. to_field_name='slug',
  182. label='Device model (slug)',
  183. )
  184. platform_id = django_filters.ModelMultipleChoiceFilter(
  185. name='platform',
  186. queryset=Platform.objects.all(),
  187. label='Platform (ID)',
  188. )
  189. platform = django_filters.ModelMultipleChoiceFilter(
  190. name='platform',
  191. queryset=Platform.objects.all(),
  192. to_field_name='slug',
  193. label='Platform (slug)',
  194. )
  195. status = django_filters.BooleanFilter(
  196. name='status',
  197. label='Status',
  198. )
  199. is_console_server = django_filters.BooleanFilter(
  200. name='device_type__is_console_server',
  201. label='Is a console server',
  202. )
  203. is_pdu = django_filters.BooleanFilter(
  204. name='device_type__is_pdu',
  205. label='Is a PDU',
  206. )
  207. is_network_device = django_filters.BooleanFilter(
  208. name='device_type__is_network_device',
  209. label='Is a network device',
  210. )
  211. class Meta:
  212. model = Device
  213. fields = ['q', 'name', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', 'manufacturer_id',
  214. 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', 'is_pdu',
  215. 'is_network_device']
  216. def search(self, queryset, value):
  217. value = value.strip()
  218. return queryset.filter(
  219. Q(name__icontains=value) |
  220. Q(serial__icontains=value) |
  221. Q(modules__serial__icontains=value)
  222. ).distinct()
  223. class ConsolePortFilter(django_filters.FilterSet):
  224. device_id = django_filters.ModelMultipleChoiceFilter(
  225. name='device',
  226. queryset=Device.objects.all(),
  227. label='Device (ID)',
  228. )
  229. device = django_filters.ModelMultipleChoiceFilter(
  230. name='device',
  231. queryset=Device.objects.all(),
  232. to_field_name='name',
  233. label='Device (name)',
  234. )
  235. class Meta:
  236. model = ConsolePort
  237. fields = ['device_id', 'device', 'name']
  238. class ConsoleServerPortFilter(django_filters.FilterSet):
  239. device_id = django_filters.ModelMultipleChoiceFilter(
  240. name='device',
  241. queryset=Device.objects.all(),
  242. label='Device (ID)',
  243. )
  244. device = django_filters.ModelMultipleChoiceFilter(
  245. name='device',
  246. queryset=Device.objects.all(),
  247. to_field_name='name',
  248. label='Device (name)',
  249. )
  250. class Meta:
  251. model = ConsoleServerPort
  252. fields = ['device_id', 'device', 'name']
  253. class PowerPortFilter(django_filters.FilterSet):
  254. device_id = django_filters.ModelMultipleChoiceFilter(
  255. name='device',
  256. queryset=Device.objects.all(),
  257. label='Device (ID)',
  258. )
  259. device = django_filters.ModelMultipleChoiceFilter(
  260. name='device',
  261. queryset=Device.objects.all(),
  262. to_field_name='name',
  263. label='Device (name)',
  264. )
  265. class Meta:
  266. model = PowerPort
  267. fields = ['device_id', 'device', 'name']
  268. class PowerOutletFilter(django_filters.FilterSet):
  269. device_id = django_filters.ModelMultipleChoiceFilter(
  270. name='device',
  271. queryset=Device.objects.all(),
  272. label='Device (ID)',
  273. )
  274. device = django_filters.ModelMultipleChoiceFilter(
  275. name='device',
  276. queryset=Device.objects.all(),
  277. to_field_name='name',
  278. label='Device (name)',
  279. )
  280. class Meta:
  281. model = PowerOutlet
  282. fields = ['device_id', 'device', 'name']
  283. class InterfaceFilter(django_filters.FilterSet):
  284. device_id = django_filters.ModelMultipleChoiceFilter(
  285. name='device',
  286. queryset=Device.objects.all(),
  287. label='Device (ID)',
  288. )
  289. device = django_filters.ModelMultipleChoiceFilter(
  290. name='device',
  291. queryset=Device.objects.all(),
  292. to_field_name='name',
  293. label='Device (name)',
  294. )
  295. class Meta:
  296. model = Interface
  297. fields = ['device_id', 'device', 'name']
  298. class ConsoleConnectionFilter(django_filters.FilterSet):
  299. site = django_filters.MethodFilter(
  300. action='filter_site',
  301. label='Site (slug)',
  302. )
  303. class Meta:
  304. model = ConsoleServerPort
  305. def filter_site(self, queryset, value):
  306. value = value.strip()
  307. if not value:
  308. return queryset
  309. return queryset.filter(cs_port__device__rack__site__slug=value)
  310. class PowerConnectionFilter(django_filters.FilterSet):
  311. site = django_filters.MethodFilter(
  312. action='filter_site',
  313. label='Site (slug)',
  314. )
  315. class Meta:
  316. model = PowerOutlet
  317. def filter_site(self, queryset, value):
  318. value = value.strip()
  319. if not value:
  320. return queryset
  321. return queryset.filter(power_outlet__device__rack__site__slug=value)
  322. class InterfaceConnectionFilter(django_filters.FilterSet):
  323. site = django_filters.MethodFilter(
  324. action='filter_site',
  325. label='Site (slug)',
  326. )
  327. class Meta:
  328. model = InterfaceConnection
  329. def filter_site(self, queryset, value):
  330. value = value.strip()
  331. if not value:
  332. return queryset
  333. return queryset.filter(
  334. Q(interface_a__device__rack__site__slug=value) |
  335. Q(interface_b__device__rack__site__slug=value)
  336. )