filters.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import Region, Site
  4. from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
  5. from tenancy.filters import TenancyFilterSet
  6. from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter
  7. from .choices import *
  8. from .models import Circuit, CircuitTermination, CircuitType, Provider
  9. __all__ = (
  10. 'CircuitFilterSet',
  11. 'CircuitTerminationFilterSet',
  12. 'CircuitTypeFilterSet',
  13. 'ProviderFilterSet',
  14. )
  15. class ProviderFilterSet(CustomFieldFilterSet, CreatedUpdatedFilterSet):
  16. id__in = NumericInFilter(
  17. field_name='id',
  18. lookup_expr='in'
  19. )
  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__in',
  27. label='Region (ID)',
  28. )
  29. region = TreeNodeMultipleChoiceFilter(
  30. queryset=Region.objects.all(),
  31. field_name='circuits__terminations__site__region__in',
  32. to_field_name='slug',
  33. label='Region (slug)',
  34. )
  35. site_id = django_filters.ModelMultipleChoiceFilter(
  36. field_name='circuits__terminations__site',
  37. queryset=Site.objects.all(),
  38. label='Site',
  39. )
  40. site = django_filters.ModelMultipleChoiceFilter(
  41. field_name='circuits__terminations__site__slug',
  42. queryset=Site.objects.all(),
  43. to_field_name='slug',
  44. label='Site (slug)',
  45. )
  46. tag = TagFilter()
  47. class Meta:
  48. model = Provider
  49. fields = ['name', 'slug', 'asn', 'account']
  50. def search(self, queryset, name, value):
  51. if not value.strip():
  52. return queryset
  53. return queryset.filter(
  54. Q(name__icontains=value) |
  55. Q(account__icontains=value) |
  56. Q(noc_contact__icontains=value) |
  57. Q(admin_contact__icontains=value) |
  58. Q(comments__icontains=value)
  59. )
  60. class CircuitTypeFilterSet(NameSlugSearchFilterSet):
  61. class Meta:
  62. model = CircuitType
  63. fields = ['id', 'name', 'slug']
  64. class CircuitFilterSet(CustomFieldFilterSet, TenancyFilterSet, CreatedUpdatedFilterSet):
  65. id__in = NumericInFilter(
  66. field_name='id',
  67. lookup_expr='in'
  68. )
  69. q = django_filters.CharFilter(
  70. method='search',
  71. label='Search',
  72. )
  73. provider_id = django_filters.ModelMultipleChoiceFilter(
  74. queryset=Provider.objects.all(),
  75. label='Provider (ID)',
  76. )
  77. provider = django_filters.ModelMultipleChoiceFilter(
  78. field_name='provider__slug',
  79. queryset=Provider.objects.all(),
  80. to_field_name='slug',
  81. label='Provider (slug)',
  82. )
  83. type_id = django_filters.ModelMultipleChoiceFilter(
  84. queryset=CircuitType.objects.all(),
  85. label='Circuit type (ID)',
  86. )
  87. type = django_filters.ModelMultipleChoiceFilter(
  88. field_name='type__slug',
  89. queryset=CircuitType.objects.all(),
  90. to_field_name='slug',
  91. label='Circuit type (slug)',
  92. )
  93. status = django_filters.MultipleChoiceFilter(
  94. choices=CircuitStatusChoices,
  95. null_value=None
  96. )
  97. site_id = django_filters.ModelMultipleChoiceFilter(
  98. field_name='terminations__site',
  99. queryset=Site.objects.all(),
  100. label='Site (ID)',
  101. )
  102. site = django_filters.ModelMultipleChoiceFilter(
  103. field_name='terminations__site__slug',
  104. queryset=Site.objects.all(),
  105. to_field_name='slug',
  106. label='Site (slug)',
  107. )
  108. region_id = TreeNodeMultipleChoiceFilter(
  109. queryset=Region.objects.all(),
  110. field_name='terminations__site__region__in',
  111. label='Region (ID)',
  112. )
  113. region = TreeNodeMultipleChoiceFilter(
  114. queryset=Region.objects.all(),
  115. field_name='terminations__site__region__in',
  116. to_field_name='slug',
  117. label='Region (slug)',
  118. )
  119. tag = TagFilter()
  120. class Meta:
  121. model = Circuit
  122. fields = ['cid', 'install_date', 'commit_rate']
  123. def search(self, queryset, name, value):
  124. if not value.strip():
  125. return queryset
  126. return queryset.filter(
  127. Q(cid__icontains=value) |
  128. Q(terminations__xconnect_id__icontains=value) |
  129. Q(terminations__pp_info__icontains=value) |
  130. Q(terminations__description__icontains=value) |
  131. Q(description__icontains=value) |
  132. Q(comments__icontains=value)
  133. ).distinct()
  134. class CircuitTerminationFilterSet(django_filters.FilterSet):
  135. q = django_filters.CharFilter(
  136. method='search',
  137. label='Search',
  138. )
  139. circuit_id = django_filters.ModelMultipleChoiceFilter(
  140. queryset=Circuit.objects.all(),
  141. label='Circuit',
  142. )
  143. site_id = django_filters.ModelMultipleChoiceFilter(
  144. queryset=Site.objects.all(),
  145. label='Site (ID)',
  146. )
  147. site = django_filters.ModelMultipleChoiceFilter(
  148. field_name='site__slug',
  149. queryset=Site.objects.all(),
  150. to_field_name='slug',
  151. label='Site (slug)',
  152. )
  153. class Meta:
  154. model = CircuitTermination
  155. fields = ['term_side', 'port_speed', 'upstream_speed', 'xconnect_id']
  156. def search(self, queryset, name, value):
  157. if not value.strip():
  158. return queryset
  159. return queryset.filter(
  160. Q(circuit__cid__icontains=value) |
  161. Q(xconnect_id__icontains=value) |
  162. Q(pp_info__icontains=value) |
  163. Q(description__icontains=value)
  164. ).distinct()