filtersets.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. import django_filters
  2. from django.contrib.auth.models import User
  3. from django.contrib.contenttypes.models import ContentType
  4. from django.db.models import Q
  5. from dcim.models import DeviceRole, DeviceType, Platform, Region, Site, SiteGroup
  6. from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet
  7. from tenancy.models import Tenant, TenantGroup
  8. from utilities.filters import ContentTypeFilter
  9. from virtualization.models import Cluster, ClusterGroup
  10. from .choices import *
  11. from .models import *
  12. __all__ = (
  13. 'ConfigContextFilterSet',
  14. 'ContentTypeFilterSet',
  15. 'CustomLinkFilterSet',
  16. 'ExportTemplateFilterSet',
  17. 'ImageAttachmentFilterSet',
  18. 'JournalEntryFilterSet',
  19. 'LocalConfigContextFilterSet',
  20. 'ObjectChangeFilterSet',
  21. 'TagFilterSet',
  22. 'WebhookFilterSet',
  23. )
  24. EXACT_FILTER_TYPES = (
  25. CustomFieldTypeChoices.TYPE_BOOLEAN,
  26. CustomFieldTypeChoices.TYPE_DATE,
  27. CustomFieldTypeChoices.TYPE_INTEGER,
  28. CustomFieldTypeChoices.TYPE_SELECT,
  29. )
  30. class WebhookFilterSet(BaseFilterSet):
  31. content_types = ContentTypeFilter()
  32. http_method = django_filters.MultipleChoiceFilter(
  33. choices=WebhookHttpMethodChoices
  34. )
  35. class Meta:
  36. model = Webhook
  37. fields = [
  38. 'id', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', 'payload_url', 'enabled',
  39. 'http_method', 'http_content_type', 'secret', 'ssl_verification', 'ca_file_path',
  40. ]
  41. class CustomFieldFilterSet(django_filters.FilterSet):
  42. content_types = ContentTypeFilter()
  43. class Meta:
  44. model = CustomField
  45. fields = ['id', 'content_types', 'name', 'required', 'filter_logic', 'weight']
  46. class CustomLinkFilterSet(BaseFilterSet):
  47. class Meta:
  48. model = CustomLink
  49. fields = ['id', 'content_type', 'name', 'link_text', 'link_url', 'weight', 'group_name', 'new_window']
  50. class ExportTemplateFilterSet(BaseFilterSet):
  51. class Meta:
  52. model = ExportTemplate
  53. fields = ['id', 'content_type', 'name']
  54. class ImageAttachmentFilterSet(BaseFilterSet):
  55. content_type = ContentTypeFilter()
  56. class Meta:
  57. model = ImageAttachment
  58. fields = ['id', 'content_type_id', 'object_id', 'name']
  59. class JournalEntryFilterSet(ChangeLoggedModelFilterSet):
  60. q = django_filters.CharFilter(
  61. method='search',
  62. label='Search',
  63. )
  64. created = django_filters.DateTimeFromToRangeFilter()
  65. assigned_object_type = ContentTypeFilter()
  66. created_by_id = django_filters.ModelMultipleChoiceFilter(
  67. queryset=User.objects.all(),
  68. label='User (ID)',
  69. )
  70. created_by = django_filters.ModelMultipleChoiceFilter(
  71. field_name='created_by__username',
  72. queryset=User.objects.all(),
  73. to_field_name='username',
  74. label='User (name)',
  75. )
  76. kind = django_filters.MultipleChoiceFilter(
  77. choices=JournalEntryKindChoices
  78. )
  79. class Meta:
  80. model = JournalEntry
  81. fields = ['id', 'assigned_object_type_id', 'assigned_object_id', 'created', 'kind']
  82. def search(self, queryset, name, value):
  83. if not value.strip():
  84. return queryset
  85. return queryset.filter(comments__icontains=value)
  86. class TagFilterSet(ChangeLoggedModelFilterSet):
  87. q = django_filters.CharFilter(
  88. method='search',
  89. label='Search',
  90. )
  91. class Meta:
  92. model = Tag
  93. fields = ['id', 'name', 'slug', 'color']
  94. def search(self, queryset, name, value):
  95. if not value.strip():
  96. return queryset
  97. return queryset.filter(
  98. Q(name__icontains=value) |
  99. Q(slug__icontains=value)
  100. )
  101. class ConfigContextFilterSet(ChangeLoggedModelFilterSet):
  102. q = django_filters.CharFilter(
  103. method='search',
  104. label='Search',
  105. )
  106. region_id = django_filters.ModelMultipleChoiceFilter(
  107. field_name='regions',
  108. queryset=Region.objects.all(),
  109. label='Region',
  110. )
  111. region = django_filters.ModelMultipleChoiceFilter(
  112. field_name='regions__slug',
  113. queryset=Region.objects.all(),
  114. to_field_name='slug',
  115. label='Region (slug)',
  116. )
  117. site_group = django_filters.ModelMultipleChoiceFilter(
  118. field_name='site_groups__slug',
  119. queryset=SiteGroup.objects.all(),
  120. to_field_name='slug',
  121. label='Site group (slug)',
  122. )
  123. site_group_id = django_filters.ModelMultipleChoiceFilter(
  124. field_name='site_groups',
  125. queryset=SiteGroup.objects.all(),
  126. label='Site group',
  127. )
  128. site_id = django_filters.ModelMultipleChoiceFilter(
  129. field_name='sites',
  130. queryset=Site.objects.all(),
  131. label='Site',
  132. )
  133. site = django_filters.ModelMultipleChoiceFilter(
  134. field_name='sites__slug',
  135. queryset=Site.objects.all(),
  136. to_field_name='slug',
  137. label='Site (slug)',
  138. )
  139. device_type_id = django_filters.ModelMultipleChoiceFilter(
  140. field_name='device_types',
  141. queryset=DeviceType.objects.all(),
  142. label='Device type',
  143. )
  144. role_id = django_filters.ModelMultipleChoiceFilter(
  145. field_name='roles',
  146. queryset=DeviceRole.objects.all(),
  147. label='Role',
  148. )
  149. role = django_filters.ModelMultipleChoiceFilter(
  150. field_name='roles__slug',
  151. queryset=DeviceRole.objects.all(),
  152. to_field_name='slug',
  153. label='Role (slug)',
  154. )
  155. platform_id = django_filters.ModelMultipleChoiceFilter(
  156. field_name='platforms',
  157. queryset=Platform.objects.all(),
  158. label='Platform',
  159. )
  160. platform = django_filters.ModelMultipleChoiceFilter(
  161. field_name='platforms__slug',
  162. queryset=Platform.objects.all(),
  163. to_field_name='slug',
  164. label='Platform (slug)',
  165. )
  166. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  167. field_name='cluster_groups',
  168. queryset=ClusterGroup.objects.all(),
  169. label='Cluster group',
  170. )
  171. cluster_group = django_filters.ModelMultipleChoiceFilter(
  172. field_name='cluster_groups__slug',
  173. queryset=ClusterGroup.objects.all(),
  174. to_field_name='slug',
  175. label='Cluster group (slug)',
  176. )
  177. cluster_id = django_filters.ModelMultipleChoiceFilter(
  178. field_name='clusters',
  179. queryset=Cluster.objects.all(),
  180. label='Cluster',
  181. )
  182. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  183. field_name='tenant_groups',
  184. queryset=TenantGroup.objects.all(),
  185. label='Tenant group',
  186. )
  187. tenant_group = django_filters.ModelMultipleChoiceFilter(
  188. field_name='tenant_groups__slug',
  189. queryset=TenantGroup.objects.all(),
  190. to_field_name='slug',
  191. label='Tenant group (slug)',
  192. )
  193. tenant_id = django_filters.ModelMultipleChoiceFilter(
  194. field_name='tenants',
  195. queryset=Tenant.objects.all(),
  196. label='Tenant',
  197. )
  198. tenant = django_filters.ModelMultipleChoiceFilter(
  199. field_name='tenants__slug',
  200. queryset=Tenant.objects.all(),
  201. to_field_name='slug',
  202. label='Tenant (slug)',
  203. )
  204. tag = django_filters.ModelMultipleChoiceFilter(
  205. field_name='tags__slug',
  206. queryset=Tag.objects.all(),
  207. to_field_name='slug',
  208. label='Tag (slug)',
  209. )
  210. class Meta:
  211. model = ConfigContext
  212. fields = ['id', 'name', 'is_active']
  213. def search(self, queryset, name, value):
  214. if not value.strip():
  215. return queryset
  216. return queryset.filter(
  217. Q(name__icontains=value) |
  218. Q(description__icontains=value) |
  219. Q(data__icontains=value)
  220. )
  221. #
  222. # Filter for Local Config Context Data
  223. #
  224. class LocalConfigContextFilterSet(django_filters.FilterSet):
  225. local_context_data = django_filters.BooleanFilter(
  226. method='_local_context_data',
  227. label='Has local config context data',
  228. )
  229. def _local_context_data(self, queryset, name, value):
  230. return queryset.exclude(local_context_data__isnull=value)
  231. class ObjectChangeFilterSet(BaseFilterSet):
  232. q = django_filters.CharFilter(
  233. method='search',
  234. label='Search',
  235. )
  236. time = django_filters.DateTimeFromToRangeFilter()
  237. changed_object_type = ContentTypeFilter()
  238. user_id = django_filters.ModelMultipleChoiceFilter(
  239. queryset=User.objects.all(),
  240. label='User (ID)',
  241. )
  242. user = django_filters.ModelMultipleChoiceFilter(
  243. field_name='user__username',
  244. queryset=User.objects.all(),
  245. to_field_name='username',
  246. label='User name',
  247. )
  248. class Meta:
  249. model = ObjectChange
  250. fields = [
  251. 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id',
  252. 'object_repr',
  253. ]
  254. def search(self, queryset, name, value):
  255. if not value.strip():
  256. return queryset
  257. return queryset.filter(
  258. Q(user_name__icontains=value) |
  259. Q(object_repr__icontains=value)
  260. )
  261. #
  262. # Job Results
  263. #
  264. class JobResultFilterSet(BaseFilterSet):
  265. q = django_filters.CharFilter(
  266. method='search',
  267. label='Search',
  268. )
  269. created = django_filters.DateTimeFilter()
  270. completed = django_filters.DateTimeFilter()
  271. status = django_filters.MultipleChoiceFilter(
  272. choices=JobResultStatusChoices,
  273. null_value=None
  274. )
  275. class Meta:
  276. model = JobResult
  277. fields = [
  278. 'id', 'created', 'completed', 'status', 'user', 'obj_type', 'name'
  279. ]
  280. def search(self, queryset, name, value):
  281. if not value.strip():
  282. return queryset
  283. return queryset.filter(
  284. Q(user__username__icontains=value)
  285. )
  286. #
  287. # ContentTypes
  288. #
  289. class ContentTypeFilterSet(django_filters.FilterSet):
  290. class Meta:
  291. model = ContentType
  292. fields = ['id', 'app_label', 'model']