filtersets.py 6.1 KB

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