filtersets.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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', 'description']
  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. tag = TagFilter()
  103. class Meta:
  104. model = CircuitType
  105. fields = ['id', 'name', 'slug', 'description']
  106. class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
  107. q = django_filters.CharFilter(
  108. method='search',
  109. label='Search',
  110. )
  111. provider_id = django_filters.ModelMultipleChoiceFilter(
  112. queryset=Provider.objects.all(),
  113. label='Provider (ID)',
  114. )
  115. provider = django_filters.ModelMultipleChoiceFilter(
  116. field_name='provider__slug',
  117. queryset=Provider.objects.all(),
  118. to_field_name='slug',
  119. label='Provider (slug)',
  120. )
  121. provider_network_id = django_filters.ModelMultipleChoiceFilter(
  122. field_name='terminations__provider_network',
  123. queryset=ProviderNetwork.objects.all(),
  124. label='ProviderNetwork (ID)',
  125. )
  126. type_id = django_filters.ModelMultipleChoiceFilter(
  127. queryset=CircuitType.objects.all(),
  128. label='Circuit type (ID)',
  129. )
  130. type = django_filters.ModelMultipleChoiceFilter(
  131. field_name='type__slug',
  132. queryset=CircuitType.objects.all(),
  133. to_field_name='slug',
  134. label='Circuit type (slug)',
  135. )
  136. status = django_filters.MultipleChoiceFilter(
  137. choices=CircuitStatusChoices,
  138. null_value=None
  139. )
  140. region_id = TreeNodeMultipleChoiceFilter(
  141. queryset=Region.objects.all(),
  142. field_name='terminations__site__region',
  143. lookup_expr='in',
  144. label='Region (ID)',
  145. )
  146. region = TreeNodeMultipleChoiceFilter(
  147. queryset=Region.objects.all(),
  148. field_name='terminations__site__region',
  149. lookup_expr='in',
  150. to_field_name='slug',
  151. label='Region (slug)',
  152. )
  153. site_group_id = TreeNodeMultipleChoiceFilter(
  154. queryset=SiteGroup.objects.all(),
  155. field_name='terminations__site__group',
  156. lookup_expr='in',
  157. label='Site group (ID)',
  158. )
  159. site_group = TreeNodeMultipleChoiceFilter(
  160. queryset=SiteGroup.objects.all(),
  161. field_name='terminations__site__group',
  162. lookup_expr='in',
  163. to_field_name='slug',
  164. label='Site group (slug)',
  165. )
  166. site_id = django_filters.ModelMultipleChoiceFilter(
  167. field_name='terminations__site',
  168. queryset=Site.objects.all(),
  169. label='Site (ID)',
  170. )
  171. site = django_filters.ModelMultipleChoiceFilter(
  172. field_name='terminations__site__slug',
  173. queryset=Site.objects.all(),
  174. to_field_name='slug',
  175. label='Site (slug)',
  176. )
  177. tag = TagFilter()
  178. class Meta:
  179. model = Circuit
  180. fields = ['id', 'cid', 'description', 'install_date', 'commit_rate']
  181. def search(self, queryset, name, value):
  182. if not value.strip():
  183. return queryset
  184. return queryset.filter(
  185. Q(cid__icontains=value) |
  186. Q(terminations__xconnect_id__icontains=value) |
  187. Q(terminations__pp_info__icontains=value) |
  188. Q(terminations__description__icontains=value) |
  189. Q(description__icontains=value) |
  190. Q(comments__icontains=value)
  191. ).distinct()
  192. class CircuitTerminationFilterSet(ChangeLoggedModelFilterSet, CableTerminationFilterSet):
  193. q = django_filters.CharFilter(
  194. method='search',
  195. label='Search',
  196. )
  197. circuit_id = django_filters.ModelMultipleChoiceFilter(
  198. queryset=Circuit.objects.all(),
  199. label='Circuit',
  200. )
  201. site_id = django_filters.ModelMultipleChoiceFilter(
  202. queryset=Site.objects.all(),
  203. label='Site (ID)',
  204. )
  205. site = django_filters.ModelMultipleChoiceFilter(
  206. field_name='site__slug',
  207. queryset=Site.objects.all(),
  208. to_field_name='slug',
  209. label='Site (slug)',
  210. )
  211. provider_network_id = django_filters.ModelMultipleChoiceFilter(
  212. queryset=ProviderNetwork.objects.all(),
  213. label='ProviderNetwork (ID)',
  214. )
  215. class Meta:
  216. model = CircuitTermination
  217. fields = ['id', 'term_side', 'port_speed', 'upstream_speed', 'xconnect_id', 'description']
  218. def search(self, queryset, name, value):
  219. if not value.strip():
  220. return queryset
  221. return queryset.filter(
  222. Q(circuit__cid__icontains=value) |
  223. Q(xconnect_id__icontains=value) |
  224. Q(pp_info__icontains=value) |
  225. Q(description__icontains=value)
  226. ).distinct()