filters.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import Device
  4. from extras.filters import CustomFieldFilterSet
  5. from utilities.filters import NumericInFilter, TagFilter
  6. from .models import Secret, SecretRole
  7. class SecretRoleFilter(django_filters.FilterSet):
  8. class Meta:
  9. model = SecretRole
  10. fields = ['name', 'slug']
  11. class SecretFilter(CustomFieldFilterSet, django_filters.FilterSet):
  12. id__in = NumericInFilter(
  13. field_name='id',
  14. lookup_expr='in'
  15. )
  16. q = django_filters.CharFilter(
  17. method='search',
  18. label='Search',
  19. )
  20. role_id = django_filters.ModelMultipleChoiceFilter(
  21. queryset=SecretRole.objects.all(),
  22. label='Role (ID)',
  23. )
  24. role = django_filters.ModelMultipleChoiceFilter(
  25. field_name='role__slug',
  26. queryset=SecretRole.objects.all(),
  27. to_field_name='slug',
  28. label='Role (slug)',
  29. )
  30. device_id = django_filters.ModelMultipleChoiceFilter(
  31. queryset=Device.objects.all(),
  32. label='Device (ID)',
  33. )
  34. device = django_filters.ModelMultipleChoiceFilter(
  35. field_name='device__name',
  36. queryset=Device.objects.all(),
  37. to_field_name='name',
  38. label='Device (name)',
  39. )
  40. tag = TagFilter()
  41. class Meta:
  42. model = Secret
  43. fields = ['name']
  44. def search(self, queryset, name, value):
  45. if not value.strip():
  46. return queryset
  47. return queryset.filter(
  48. Q(name__icontains=value) |
  49. Q(device__name__icontains=value)
  50. )