filters.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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', '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_id = django_filters.ModelMultipleChoiceFilter(
  108. name='rack',
  109. queryset=Rack.objects.all(),
  110. label='Rack (ID)',
  111. )
  112. role_id = django_filters.ModelMultipleChoiceFilter(
  113. name='device_role',
  114. queryset=DeviceRole.objects.all(),
  115. label='Role (ID)',
  116. )
  117. role = django_filters.ModelMultipleChoiceFilter(
  118. name='device_role',
  119. queryset=DeviceRole.objects.all(),
  120. to_field_name='slug',
  121. label='Role (slug)',
  122. )
  123. device_type_id = django_filters.ModelMultipleChoiceFilter(
  124. name='device_type',
  125. queryset=DeviceType.objects.all(),
  126. label='Device type (ID)',
  127. )
  128. manufacturer_id = django_filters.ModelMultipleChoiceFilter(
  129. name='device_type__manufacturer',
  130. queryset=Manufacturer.objects.all(),
  131. label='Manufacturer (ID)',
  132. )
  133. manufacturer = django_filters.ModelMultipleChoiceFilter(
  134. name='device_type__manufacturer',
  135. queryset=Manufacturer.objects.all(),
  136. to_field_name='slug',
  137. label='Manufacturer (slug)',
  138. )
  139. model = django_filters.ModelMultipleChoiceFilter(
  140. name='device_type',
  141. queryset=DeviceType.objects.all(),
  142. to_field_name='slug',
  143. label='Device model (slug)',
  144. )
  145. platform_id = django_filters.ModelMultipleChoiceFilter(
  146. name='platform',
  147. queryset=Platform.objects.all(),
  148. label='Platform (ID)',
  149. )
  150. platform = django_filters.ModelMultipleChoiceFilter(
  151. name='platform',
  152. queryset=Platform.objects.all(),
  153. to_field_name='slug',
  154. label='Platform (slug)',
  155. )
  156. status = django_filters.BooleanFilter(
  157. name='status',
  158. label='Status',
  159. )
  160. is_console_server = django_filters.BooleanFilter(
  161. name='device_type__is_console_server',
  162. label='Is a console server',
  163. )
  164. is_pdu = django_filters.BooleanFilter(
  165. name='device_type__is_pdu',
  166. label='Is a PDU',
  167. )
  168. is_network_device = django_filters.BooleanFilter(
  169. name='device_type__is_network_device',
  170. label='Is a network device',
  171. )
  172. class Meta:
  173. model = Device
  174. fields = ['q', 'name', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', 'manufacturer_id',
  175. 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', 'is_pdu',
  176. 'is_network_device']
  177. def search(self, queryset, value):
  178. value = value.strip()
  179. return queryset.filter(
  180. Q(name__icontains=value) |
  181. Q(serial__icontains=value) |
  182. Q(modules__serial__icontains=value)
  183. ).distinct()
  184. class ConsolePortFilter(django_filters.FilterSet):
  185. device_id = django_filters.ModelMultipleChoiceFilter(
  186. name='device',
  187. queryset=Device.objects.all(),
  188. label='Device (ID)',
  189. )
  190. device = django_filters.ModelMultipleChoiceFilter(
  191. name='device',
  192. queryset=Device.objects.all(),
  193. to_field_name='name',
  194. label='Device (name)',
  195. )
  196. class Meta:
  197. model = ConsolePort
  198. fields = ['device_id', 'device', 'name']
  199. class ConsoleServerPortFilter(django_filters.FilterSet):
  200. device_id = django_filters.ModelMultipleChoiceFilter(
  201. name='device',
  202. queryset=Device.objects.all(),
  203. label='Device (ID)',
  204. )
  205. device = django_filters.ModelMultipleChoiceFilter(
  206. name='device',
  207. queryset=Device.objects.all(),
  208. to_field_name='name',
  209. label='Device (name)',
  210. )
  211. class Meta:
  212. model = ConsoleServerPort
  213. fields = ['device_id', 'device', 'name']
  214. class PowerPortFilter(django_filters.FilterSet):
  215. device_id = django_filters.ModelMultipleChoiceFilter(
  216. name='device',
  217. queryset=Device.objects.all(),
  218. label='Device (ID)',
  219. )
  220. device = django_filters.ModelMultipleChoiceFilter(
  221. name='device',
  222. queryset=Device.objects.all(),
  223. to_field_name='name',
  224. label='Device (name)',
  225. )
  226. class Meta:
  227. model = PowerPort
  228. fields = ['device_id', 'device', 'name']
  229. class PowerOutletFilter(django_filters.FilterSet):
  230. device_id = django_filters.ModelMultipleChoiceFilter(
  231. name='device',
  232. queryset=Device.objects.all(),
  233. label='Device (ID)',
  234. )
  235. device = django_filters.ModelMultipleChoiceFilter(
  236. name='device',
  237. queryset=Device.objects.all(),
  238. to_field_name='name',
  239. label='Device (name)',
  240. )
  241. class Meta:
  242. model = PowerOutlet
  243. fields = ['device_id', 'device', 'name']
  244. class InterfaceFilter(django_filters.FilterSet):
  245. device_id = django_filters.ModelMultipleChoiceFilter(
  246. name='device',
  247. queryset=Device.objects.all(),
  248. label='Device (ID)',
  249. )
  250. device = django_filters.ModelMultipleChoiceFilter(
  251. name='device',
  252. queryset=Device.objects.all(),
  253. to_field_name='name',
  254. label='Device (name)',
  255. )
  256. class Meta:
  257. model = Interface
  258. fields = ['device_id', 'device', 'name']
  259. class ConsoleConnectionFilter(django_filters.FilterSet):
  260. site = django_filters.MethodFilter(
  261. action='filter_site',
  262. label='Site (slug)',
  263. )
  264. class Meta:
  265. model = ConsoleServerPort
  266. def filter_site(self, queryset, value):
  267. value = value.strip()
  268. if not value:
  269. return queryset
  270. return queryset.filter(cs_port__device__rack__site__slug=value)
  271. class PowerConnectionFilter(django_filters.FilterSet):
  272. site = django_filters.MethodFilter(
  273. action='filter_site',
  274. label='Site (slug)',
  275. )
  276. class Meta:
  277. model = PowerOutlet
  278. def filter_site(self, queryset, value):
  279. value = value.strip()
  280. if not value:
  281. return queryset
  282. return queryset.filter(power_outlet__device__rack__site__slug=value)
  283. class InterfaceConnectionFilter(django_filters.FilterSet):
  284. site = django_filters.MethodFilter(
  285. action='filter_site',
  286. label='Site (slug)',
  287. )
  288. class Meta:
  289. model = InterfaceConnection
  290. def filter_site(self, queryset, value):
  291. value = value.strip()
  292. if not value:
  293. return queryset
  294. return queryset.filter(
  295. Q(interface_a__device__rack__site__slug=value) |
  296. Q(interface_b__device__rack__site__slug=value)
  297. )