filters.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import django_filters
  2. from django.db.models import Q
  3. from extras.filters import CustomFieldFilterSet, CreatedUpdatedFilterSet
  4. from utilities.filters import BaseFilterSet, NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter
  5. from .models import Tenant, TenantGroup
  6. __all__ = (
  7. 'TenancyFilterSet',
  8. 'TenantFilterSet',
  9. 'TenantGroupFilterSet',
  10. )
  11. class TenantGroupFilterSet(BaseFilterSet, NameSlugSearchFilterSet):
  12. parent_id = django_filters.ModelMultipleChoiceFilter(
  13. queryset=TenantGroup.objects.unrestricted(),
  14. label='Tenant group (ID)',
  15. )
  16. parent = django_filters.ModelMultipleChoiceFilter(
  17. field_name='parent__slug',
  18. queryset=TenantGroup.objects.unrestricted(),
  19. to_field_name='slug',
  20. label='Tenant group group (slug)',
  21. )
  22. class Meta:
  23. model = TenantGroup
  24. fields = ['id', 'name', 'slug', 'description']
  25. class TenantFilterSet(BaseFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet):
  26. q = django_filters.CharFilter(
  27. method='search',
  28. label='Search',
  29. )
  30. group_id = TreeNodeMultipleChoiceFilter(
  31. queryset=TenantGroup.objects.unrestricted(),
  32. field_name='group',
  33. lookup_expr='in',
  34. label='Tenant group (ID)',
  35. )
  36. group = TreeNodeMultipleChoiceFilter(
  37. queryset=TenantGroup.objects.unrestricted(),
  38. field_name='group',
  39. lookup_expr='in',
  40. to_field_name='slug',
  41. label='Tenant group (slug)',
  42. )
  43. tag = TagFilter()
  44. class Meta:
  45. model = Tenant
  46. fields = ['id', 'name', 'slug']
  47. def search(self, queryset, name, value):
  48. if not value.strip():
  49. return queryset
  50. return queryset.filter(
  51. Q(name__icontains=value) |
  52. Q(slug__icontains=value) |
  53. Q(description__icontains=value) |
  54. Q(comments__icontains=value)
  55. )
  56. class TenancyFilterSet(django_filters.FilterSet):
  57. """
  58. An inheritable FilterSet for models which support Tenant assignment.
  59. """
  60. tenant_group_id = TreeNodeMultipleChoiceFilter(
  61. queryset=TenantGroup.objects.unrestricted(),
  62. field_name='tenant__group',
  63. lookup_expr='in',
  64. label='Tenant Group (ID)',
  65. )
  66. tenant_group = TreeNodeMultipleChoiceFilter(
  67. queryset=TenantGroup.objects.unrestricted(),
  68. field_name='tenant__group',
  69. to_field_name='slug',
  70. lookup_expr='in',
  71. label='Tenant Group (slug)',
  72. )
  73. tenant_id = django_filters.ModelMultipleChoiceFilter(
  74. queryset=Tenant.objects.unrestricted(),
  75. label='Tenant (ID)',
  76. )
  77. tenant = django_filters.ModelMultipleChoiceFilter(
  78. queryset=Tenant.objects.unrestricted(),
  79. field_name='tenant__slug',
  80. to_field_name='slug',
  81. label='Tenant (slug)',
  82. )