filters.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import django_filters
  2. from django.db.models import Q
  3. from dcim.models import Device
  4. from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
  5. from utilities.filters import BaseFilterSet, NameSlugSearchFilterSet, NumericInFilter, TagFilter
  6. from .models import Secret, SecretRole
  7. __all__ = (
  8. 'SecretFilterSet',
  9. 'SecretRoleFilterSet',
  10. )
  11. class SecretRoleFilterSet(BaseFilterSet, NameSlugSearchFilterSet):
  12. class Meta:
  13. model = SecretRole
  14. fields = ['id', 'name', 'slug']
  15. class SecretFilterSet(BaseFilterSet, 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. role_id = django_filters.ModelMultipleChoiceFilter(
  25. queryset=SecretRole.objects.all(),
  26. label='Role (ID)',
  27. )
  28. role = django_filters.ModelMultipleChoiceFilter(
  29. field_name='role__slug',
  30. queryset=SecretRole.objects.all(),
  31. to_field_name='slug',
  32. label='Role (slug)',
  33. )
  34. device_id = django_filters.ModelMultipleChoiceFilter(
  35. queryset=Device.objects.all(),
  36. label='Device (ID)',
  37. )
  38. device = django_filters.ModelMultipleChoiceFilter(
  39. field_name='device__name',
  40. queryset=Device.objects.all(),
  41. to_field_name='name',
  42. label='Device (name)',
  43. )
  44. tag = TagFilter()
  45. class Meta:
  46. model = Secret
  47. fields = ['name']
  48. def search(self, queryset, name, value):
  49. if not value.strip():
  50. return queryset
  51. return queryset.filter(
  52. Q(name__icontains=value) |
  53. Q(device__name__icontains=value)
  54. )