filters.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.filters import CableTerminationFilterSet
  4. from dcim.models import Region, Site, SiteGroup
  5. from extras.filters import CustomFieldModelFilterSet, CreatedUpdatedFilterSet
  6. from tenancy.filters import TenancyFilterSet
  7. from utilities.filters import (
  8. BaseFilterSet, NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter
  9. )
  10. from .choices import *
  11. from .models import *
  12. __all__ = (
  13. 'CircuitFilterSet',
  14. 'CircuitTerminationFilterSet',
  15. 'CircuitTypeFilterSet',
  16. 'ProviderNetworkFilterSet',
  17. 'ProviderFilterSet',
  18. )
  19. class ProviderFilterSet(BaseFilterSet, CustomFieldModelFilterSet, CreatedUpdatedFilterSet):
  20. q = django_filters.CharFilter(
  21. method='search',
  22. label='Search',
  23. )
  24. region_id = TreeNodeMultipleChoiceFilter(
  25. queryset=Region.objects.all(),
  26. field_name='circuits__terminations__site__region',
  27. lookup_expr='in',
  28. label='Region (ID)',
  29. )
  30. region = TreeNodeMultipleChoiceFilter(
  31. queryset=Region.objects.all(),
  32. field_name='circuits__terminations__site__region',
  33. lookup_expr='in',
  34. to_field_name='slug',
  35. label='Region (slug)',
  36. )
  37. site_group_id = TreeNodeMultipleChoiceFilter(
  38. queryset=SiteGroup.objects.all(),
  39. field_name='circuits__terminations__site__group',
  40. lookup_expr='in',
  41. label='Site group (ID)',
  42. )
  43. site_group = TreeNodeMultipleChoiceFilter(
  44. queryset=SiteGroup.objects.all(),
  45. field_name='circuits__terminations__site__group',
  46. lookup_expr='in',
  47. to_field_name='slug',
  48. label='Site group (slug)',
  49. )
  50. site_id = django_filters.ModelMultipleChoiceFilter(
  51. field_name='circuits__terminations__site',
  52. queryset=Site.objects.all(),
  53. label='Site',
  54. )
  55. site = django_filters.ModelMultipleChoiceFilter(
  56. field_name='circuits__terminations__site__slug',
  57. queryset=Site.objects.all(),
  58. to_field_name='slug',
  59. label='Site (slug)',
  60. )
  61. tag = TagFilter()
  62. class Meta:
  63. model = Provider
  64. fields = ['id', 'name', 'slug', 'asn', 'account']
  65. def search(self, queryset, name, value):
  66. if not value.strip():
  67. return queryset
  68. return queryset.filter(
  69. Q(name__icontains=value) |
  70. Q(account__icontains=value) |
  71. Q(noc_contact__icontains=value) |
  72. Q(admin_contact__icontains=value) |
  73. Q(comments__icontains=value)
  74. )
  75. class ProviderNetworkFilterSet(BaseFilterSet, CustomFieldModelFilterSet, CreatedUpdatedFilterSet):
  76. q = django_filters.CharFilter(
  77. method='search',
  78. label='Search',
  79. )
  80. provider_id = django_filters.ModelMultipleChoiceFilter(
  81. queryset=Provider.objects.all(),
  82. label='Provider (ID)',
  83. )
  84. provider = django_filters.ModelMultipleChoiceFilter(
  85. field_name='provider__slug',
  86. queryset=Provider.objects.all(),
  87. to_field_name='slug',
  88. label='Provider (slug)',
  89. )
  90. tag = TagFilter()
  91. class Meta:
  92. model = ProviderNetwork
  93. fields = ['id', 'name']
  94. def search(self, queryset, name, value):
  95. if not value.strip():
  96. return queryset
  97. return queryset.filter(
  98. Q(description__icontains=value) |
  99. Q(comments__icontains=value)
  100. ).distinct()
  101. class CircuitTypeFilterSet(BaseFilterSet, NameSlugSearchFilterSet, CreatedUpdatedFilterSet):
  102. class Meta:
  103. model = CircuitType
  104. fields = ['id', 'name', 'slug']
  105. class CircuitFilterSet(BaseFilterSet, CustomFieldModelFilterSet, TenancyFilterSet, CreatedUpdatedFilterSet):
  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(BaseFilterSet, CreatedUpdatedFilterSet, 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 = ['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()