filtersets.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.filtersets import CableTerminationFilterSet
  4. from dcim.models import Region, Site, SiteGroup
  5. from extras.filters import TagFilter
  6. from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet
  7. from tenancy.filtersets import TenancyFilterSet
  8. from utilities.filters import TreeNodeMultipleChoiceFilter
  9. from .choices import *
  10. from .models import *
  11. __all__ = (
  12. 'CircuitFilterSet',
  13. 'CircuitTerminationFilterSet',
  14. 'CircuitTypeFilterSet',
  15. 'ProviderNetworkFilterSet',
  16. 'ProviderFilterSet',
  17. )
  18. class ProviderFilterSet(PrimaryModelFilterSet):
  19. q = django_filters.CharFilter(
  20. method='search',
  21. label='Search',
  22. )
  23. region_id = TreeNodeMultipleChoiceFilter(
  24. queryset=Region.objects.all(),
  25. field_name='circuits__terminations__site__region',
  26. lookup_expr='in',
  27. label='Region (ID)',
  28. )
  29. region = TreeNodeMultipleChoiceFilter(
  30. queryset=Region.objects.all(),
  31. field_name='circuits__terminations__site__region',
  32. lookup_expr='in',
  33. to_field_name='slug',
  34. label='Region (slug)',
  35. )
  36. site_group_id = TreeNodeMultipleChoiceFilter(
  37. queryset=SiteGroup.objects.all(),
  38. field_name='circuits__terminations__site__group',
  39. lookup_expr='in',
  40. label='Site group (ID)',
  41. )
  42. site_group = TreeNodeMultipleChoiceFilter(
  43. queryset=SiteGroup.objects.all(),
  44. field_name='circuits__terminations__site__group',
  45. lookup_expr='in',
  46. to_field_name='slug',
  47. label='Site group (slug)',
  48. )
  49. site_id = django_filters.ModelMultipleChoiceFilter(
  50. field_name='circuits__terminations__site',
  51. queryset=Site.objects.all(),
  52. label='Site',
  53. )
  54. site = django_filters.ModelMultipleChoiceFilter(
  55. field_name='circuits__terminations__site__slug',
  56. queryset=Site.objects.all(),
  57. to_field_name='slug',
  58. label='Site (slug)',
  59. )
  60. tag = TagFilter()
  61. class Meta:
  62. model = Provider
  63. fields = ['id', 'name', 'slug', 'asn', 'account']
  64. def search(self, queryset, name, value):
  65. if not value.strip():
  66. return queryset
  67. return queryset.filter(
  68. Q(name__icontains=value) |
  69. Q(account__icontains=value) |
  70. Q(noc_contact__icontains=value) |
  71. Q(admin_contact__icontains=value) |
  72. Q(comments__icontains=value)
  73. )
  74. class ProviderNetworkFilterSet(PrimaryModelFilterSet):
  75. q = django_filters.CharFilter(
  76. method='search',
  77. label='Search',
  78. )
  79. provider_id = django_filters.ModelMultipleChoiceFilter(
  80. queryset=Provider.objects.all(),
  81. label='Provider (ID)',
  82. )
  83. provider = django_filters.ModelMultipleChoiceFilter(
  84. field_name='provider__slug',
  85. queryset=Provider.objects.all(),
  86. to_field_name='slug',
  87. label='Provider (slug)',
  88. )
  89. tag = TagFilter()
  90. class Meta:
  91. model = ProviderNetwork
  92. fields = ['id', 'name']
  93. def search(self, queryset, name, value):
  94. if not value.strip():
  95. return queryset
  96. return queryset.filter(
  97. Q(name__icontains=value) |
  98. Q(description__icontains=value) |
  99. Q(comments__icontains=value)
  100. ).distinct()
  101. class CircuitTypeFilterSet(OrganizationalModelFilterSet):
  102. class Meta:
  103. model = CircuitType
  104. fields = ['id', 'name', 'slug']
  105. class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
  106. q = django_filters.CharFilter(
  107. method='search',
  108. label='Search',
  109. )
  110. provider_id = django_filters.ModelMultipleChoiceFilter(
  111. queryset=Provider.objects.all(),
  112. label='Provider (ID)',
  113. )
  114. provider = django_filters.ModelMultipleChoiceFilter(
  115. field_name='provider__slug',
  116. queryset=Provider.objects.all(),
  117. to_field_name='slug',
  118. label='Provider (slug)',
  119. )
  120. provider_network_id = django_filters.ModelMultipleChoiceFilter(
  121. field_name='terminations__provider_network',
  122. queryset=ProviderNetwork.objects.all(),
  123. label='ProviderNetwork (ID)',
  124. )
  125. type_id = django_filters.ModelMultipleChoiceFilter(
  126. queryset=CircuitType.objects.all(),
  127. label='Circuit type (ID)',
  128. )
  129. type = django_filters.ModelMultipleChoiceFilter(
  130. field_name='type__slug',
  131. queryset=CircuitType.objects.all(),
  132. to_field_name='slug',
  133. label='Circuit type (slug)',
  134. )
  135. status = django_filters.MultipleChoiceFilter(
  136. choices=CircuitStatusChoices,
  137. null_value=None
  138. )
  139. region_id = TreeNodeMultipleChoiceFilter(
  140. queryset=Region.objects.all(),
  141. field_name='terminations__site__region',
  142. lookup_expr='in',
  143. label='Region (ID)',
  144. )
  145. region = TreeNodeMultipleChoiceFilter(
  146. queryset=Region.objects.all(),
  147. field_name='terminations__site__region',
  148. lookup_expr='in',
  149. to_field_name='slug',
  150. label='Region (slug)',
  151. )
  152. site_group_id = TreeNodeMultipleChoiceFilter(
  153. queryset=SiteGroup.objects.all(),
  154. field_name='terminations__site__group',
  155. lookup_expr='in',
  156. label='Site group (ID)',
  157. )
  158. site_group = TreeNodeMultipleChoiceFilter(
  159. queryset=SiteGroup.objects.all(),
  160. field_name='terminations__site__group',
  161. lookup_expr='in',
  162. to_field_name='slug',
  163. label='Site group (slug)',
  164. )
  165. site_id = django_filters.ModelMultipleChoiceFilter(
  166. field_name='terminations__site',
  167. queryset=Site.objects.all(),
  168. label='Site (ID)',
  169. )
  170. site = django_filters.ModelMultipleChoiceFilter(
  171. field_name='terminations__site__slug',
  172. queryset=Site.objects.all(),
  173. to_field_name='slug',
  174. label='Site (slug)',
  175. )
  176. tag = TagFilter()
  177. class Meta:
  178. model = Circuit
  179. fields = ['id', 'cid', 'install_date', 'commit_rate']
  180. def search(self, queryset, name, value):
  181. if not value.strip():
  182. return queryset
  183. return queryset.filter(
  184. Q(cid__icontains=value) |
  185. Q(terminations__xconnect_id__icontains=value) |
  186. Q(terminations__pp_info__icontains=value) |
  187. Q(terminations__description__icontains=value) |
  188. Q(description__icontains=value) |
  189. Q(comments__icontains=value)
  190. ).distinct()
  191. class CircuitTerminationFilterSet(ChangeLoggedModelFilterSet, CableTerminationFilterSet):
  192. q = django_filters.CharFilter(
  193. method='search',
  194. label='Search',
  195. )
  196. circuit_id = django_filters.ModelMultipleChoiceFilter(
  197. queryset=Circuit.objects.all(),
  198. label='Circuit',
  199. )
  200. site_id = django_filters.ModelMultipleChoiceFilter(
  201. queryset=Site.objects.all(),
  202. label='Site (ID)',
  203. )
  204. site = django_filters.ModelMultipleChoiceFilter(
  205. field_name='site__slug',
  206. queryset=Site.objects.all(),
  207. to_field_name='slug',
  208. label='Site (slug)',
  209. )
  210. provider_network_id = django_filters.ModelMultipleChoiceFilter(
  211. queryset=ProviderNetwork.objects.all(),
  212. label='ProviderNetwork (ID)',
  213. )
  214. class Meta:
  215. model = CircuitTermination
  216. fields = ['id', 'term_side', 'port_speed', 'upstream_speed', 'xconnect_id']
  217. def search(self, queryset, name, value):
  218. if not value.strip():
  219. return queryset
  220. return queryset.filter(
  221. Q(circuit__cid__icontains=value) |
  222. Q(xconnect_id__icontains=value) |
  223. Q(pp_info__icontains=value) |
  224. Q(description__icontains=value)
  225. ).distinct()