filters.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from __future__ import unicode_literals
  2. import django_filters
  3. from django.db.models import Q
  4. from dcim.models import Site
  5. from extras.filters import CustomFieldFilterSet
  6. from tenancy.models import Tenant
  7. from utilities.filters import NumericInFilter
  8. from .constants import CIRCUIT_STATUS_CHOICES
  9. from .models import Provider, Circuit, CircuitTermination, CircuitType
  10. class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet):
  11. id__in = NumericInFilter(name='id', lookup_expr='in')
  12. q = django_filters.CharFilter(
  13. method='search',
  14. label='Search',
  15. )
  16. site_id = django_filters.ModelMultipleChoiceFilter(
  17. name='circuits__terminations__site',
  18. queryset=Site.objects.all(),
  19. label='Site',
  20. )
  21. site = django_filters.ModelMultipleChoiceFilter(
  22. name='circuits__terminations__site__slug',
  23. queryset=Site.objects.all(),
  24. to_field_name='slug',
  25. label='Site (slug)',
  26. )
  27. class Meta:
  28. model = Provider
  29. fields = ['name', 'slug', 'asn', 'account']
  30. def search(self, queryset, name, value):
  31. if not value.strip():
  32. return queryset
  33. return queryset.filter(
  34. Q(name__icontains=value) |
  35. Q(account__icontains=value) |
  36. Q(noc_contact__icontains=value) |
  37. Q(admin_contact__icontains=value) |
  38. Q(comments__icontains=value)
  39. )
  40. class CircuitTypeFilter(django_filters.FilterSet):
  41. class Meta:
  42. model = CircuitType
  43. fields = ['name', 'slug']
  44. class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet):
  45. id__in = NumericInFilter(name='id', lookup_expr='in')
  46. q = django_filters.CharFilter(
  47. method='search',
  48. label='Search',
  49. )
  50. provider_id = django_filters.ModelMultipleChoiceFilter(
  51. queryset=Provider.objects.all(),
  52. label='Provider (ID)',
  53. )
  54. provider = django_filters.ModelMultipleChoiceFilter(
  55. name='provider__slug',
  56. queryset=Provider.objects.all(),
  57. to_field_name='slug',
  58. label='Provider (slug)',
  59. )
  60. type_id = django_filters.ModelMultipleChoiceFilter(
  61. queryset=CircuitType.objects.all(),
  62. label='Circuit type (ID)',
  63. )
  64. type = django_filters.ModelMultipleChoiceFilter(
  65. name='type__slug',
  66. queryset=CircuitType.objects.all(),
  67. to_field_name='slug',
  68. label='Circuit type (slug)',
  69. )
  70. status = django_filters.MultipleChoiceFilter(
  71. choices=CIRCUIT_STATUS_CHOICES,
  72. null_value=None
  73. )
  74. tenant_id = django_filters.ModelMultipleChoiceFilter(
  75. queryset=Tenant.objects.all(),
  76. label='Tenant (ID)',
  77. )
  78. tenant = django_filters.ModelMultipleChoiceFilter(
  79. name='tenant__slug',
  80. queryset=Tenant.objects.all(),
  81. to_field_name='slug',
  82. label='Tenant (slug)',
  83. )
  84. site_id = django_filters.ModelMultipleChoiceFilter(
  85. name='terminations__site',
  86. queryset=Site.objects.all(),
  87. label='Site (ID)',
  88. )
  89. site = django_filters.ModelMultipleChoiceFilter(
  90. name='terminations__site__slug',
  91. queryset=Site.objects.all(),
  92. to_field_name='slug',
  93. label='Site (slug)',
  94. )
  95. class Meta:
  96. model = Circuit
  97. fields = ['cid', 'install_date', 'commit_rate']
  98. def search(self, queryset, name, value):
  99. if not value.strip():
  100. return queryset
  101. return queryset.filter(
  102. Q(cid__icontains=value) |
  103. Q(terminations__xconnect_id__icontains=value) |
  104. Q(terminations__pp_info__icontains=value) |
  105. Q(description__icontains=value) |
  106. Q(comments__icontains=value)
  107. ).distinct()
  108. class CircuitTerminationFilter(django_filters.FilterSet):
  109. q = django_filters.CharFilter(
  110. method='search',
  111. label='Search',
  112. )
  113. circuit_id = django_filters.ModelMultipleChoiceFilter(
  114. queryset=Circuit.objects.all(),
  115. label='Circuit',
  116. )
  117. site_id = django_filters.ModelMultipleChoiceFilter(
  118. queryset=Site.objects.all(),
  119. label='Site (ID)',
  120. )
  121. site = django_filters.ModelMultipleChoiceFilter(
  122. name='site__slug',
  123. queryset=Site.objects.all(),
  124. to_field_name='slug',
  125. label='Site (slug)',
  126. )
  127. class Meta:
  128. model = CircuitTermination
  129. fields = ['term_side', 'port_speed', 'upstream_speed', 'xconnect_id']
  130. def search(self, queryset, name, value):
  131. if not value.strip():
  132. return queryset
  133. return queryset.filter(
  134. Q(circuit__cid__icontains=value) |
  135. Q(xconnect_id__icontains=value) |
  136. Q(pp_info__icontains=value)
  137. ).distinct()