filters.py 9.9 KB

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