filtersets.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import django_filters
  2. from django.contrib.auth import get_user_model
  3. from django.db.models import Q
  4. from django.utils.translation import gettext as _
  5. from netbox.filtersets import BaseFilterSet
  6. from users.models import Group, ObjectPermission, Token
  7. __all__ = (
  8. 'GroupFilterSet',
  9. 'ObjectPermissionFilterSet',
  10. 'TokenFilterSet',
  11. 'UserFilterSet',
  12. )
  13. class GroupFilterSet(BaseFilterSet):
  14. q = django_filters.CharFilter(
  15. method='search',
  16. label=_('Search'),
  17. )
  18. class Meta:
  19. model = Group
  20. fields = ['id', 'name']
  21. def search(self, queryset, name, value):
  22. if not value.strip():
  23. return queryset
  24. return queryset.filter(name__icontains=value)
  25. class UserFilterSet(BaseFilterSet):
  26. q = django_filters.CharFilter(
  27. method='search',
  28. label=_('Search'),
  29. )
  30. group_id = django_filters.ModelMultipleChoiceFilter(
  31. field_name='groups',
  32. queryset=Group.objects.all(),
  33. label=_('Group'),
  34. )
  35. group = django_filters.ModelMultipleChoiceFilter(
  36. field_name='groups__name',
  37. queryset=Group.objects.all(),
  38. to_field_name='name',
  39. label=_('Group (name)'),
  40. )
  41. class Meta:
  42. model = get_user_model()
  43. fields = ['id', 'username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'is_superuser']
  44. def search(self, queryset, name, value):
  45. if not value.strip():
  46. return queryset
  47. return queryset.filter(
  48. Q(username__icontains=value) |
  49. Q(first_name__icontains=value) |
  50. Q(last_name__icontains=value) |
  51. Q(email__icontains=value)
  52. )
  53. class TokenFilterSet(BaseFilterSet):
  54. q = django_filters.CharFilter(
  55. method='search',
  56. label=_('Search'),
  57. )
  58. user_id = django_filters.ModelMultipleChoiceFilter(
  59. field_name='user',
  60. queryset=get_user_model().objects.all(),
  61. label=_('User'),
  62. )
  63. user = django_filters.ModelMultipleChoiceFilter(
  64. field_name='user__username',
  65. queryset=get_user_model().objects.all(),
  66. to_field_name='username',
  67. label=_('User (name)'),
  68. )
  69. created = django_filters.DateTimeFilter()
  70. created__gte = django_filters.DateTimeFilter(
  71. field_name='created',
  72. lookup_expr='gte'
  73. )
  74. created__lte = django_filters.DateTimeFilter(
  75. field_name='created',
  76. lookup_expr='lte'
  77. )
  78. expires = django_filters.DateTimeFilter()
  79. expires__gte = django_filters.DateTimeFilter(
  80. field_name='expires',
  81. lookup_expr='gte'
  82. )
  83. expires__lte = django_filters.DateTimeFilter(
  84. field_name='expires',
  85. lookup_expr='lte'
  86. )
  87. class Meta:
  88. model = Token
  89. fields = ['id', 'key', 'write_enabled', 'description']
  90. def search(self, queryset, name, value):
  91. if not value.strip():
  92. return queryset
  93. return queryset.filter(
  94. Q(user__username__icontains=value) |
  95. Q(description__icontains=value)
  96. )
  97. class ObjectPermissionFilterSet(BaseFilterSet):
  98. q = django_filters.CharFilter(
  99. method='search',
  100. label=_('Search'),
  101. )
  102. can_view = django_filters.BooleanFilter(
  103. method='_check_action'
  104. )
  105. can_add = django_filters.BooleanFilter(
  106. method='_check_action'
  107. )
  108. can_change = django_filters.BooleanFilter(
  109. method='_check_action'
  110. )
  111. can_delete = django_filters.BooleanFilter(
  112. method='_check_action'
  113. )
  114. user_id = django_filters.ModelMultipleChoiceFilter(
  115. field_name='users',
  116. queryset=get_user_model().objects.all(),
  117. label=_('User'),
  118. )
  119. user = django_filters.ModelMultipleChoiceFilter(
  120. field_name='users__username',
  121. queryset=get_user_model().objects.all(),
  122. to_field_name='username',
  123. label=_('User (name)'),
  124. )
  125. group_id = django_filters.ModelMultipleChoiceFilter(
  126. field_name='groups',
  127. queryset=Group.objects.all(),
  128. label=_('Group'),
  129. )
  130. group = django_filters.ModelMultipleChoiceFilter(
  131. field_name='groups__name',
  132. queryset=Group.objects.all(),
  133. to_field_name='name',
  134. label=_('Group (name)'),
  135. )
  136. class Meta:
  137. model = ObjectPermission
  138. fields = ['id', 'name', 'enabled', 'object_types', 'description']
  139. def search(self, queryset, name, value):
  140. if not value.strip():
  141. return queryset
  142. return queryset.filter(
  143. Q(name__icontains=value) |
  144. Q(description__icontains=value)
  145. )
  146. def _check_action(self, queryset, name, value):
  147. action = name.split('_')[1]
  148. if value:
  149. return queryset.filter(actions__contains=[action])
  150. else:
  151. return queryset.exclude(actions__contains=[action])