filtersets.py 7.6 KB

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