filtersets.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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. created = django_filters.DateTimeFilter()
  56. content_type = ContentTypeFilter()
  57. class Meta:
  58. model = ImageAttachment
  59. fields = ['id', 'content_type_id', 'object_id', 'name']
  60. class JournalEntryFilterSet(ChangeLoggedModelFilterSet):
  61. q = django_filters.CharFilter(
  62. method='search',
  63. label='Search',
  64. )
  65. created = django_filters.DateTimeFromToRangeFilter()
  66. assigned_object_type = ContentTypeFilter()
  67. created_by_id = django_filters.ModelMultipleChoiceFilter(
  68. queryset=User.objects.all(),
  69. label='User (ID)',
  70. )
  71. created_by = django_filters.ModelMultipleChoiceFilter(
  72. field_name='created_by__username',
  73. queryset=User.objects.all(),
  74. to_field_name='username',
  75. label='User (name)',
  76. )
  77. kind = django_filters.MultipleChoiceFilter(
  78. choices=JournalEntryKindChoices
  79. )
  80. class Meta:
  81. model = JournalEntry
  82. fields = ['id', 'assigned_object_type_id', 'assigned_object_id', 'created', 'kind']
  83. def search(self, queryset, name, value):
  84. if not value.strip():
  85. return queryset
  86. return queryset.filter(comments__icontains=value)
  87. class TagFilterSet(ChangeLoggedModelFilterSet):
  88. q = django_filters.CharFilter(
  89. method='search',
  90. label='Search',
  91. )
  92. class Meta:
  93. model = Tag
  94. fields = ['id', 'name', 'slug', 'color']
  95. def search(self, queryset, name, value):
  96. if not value.strip():
  97. return queryset
  98. return queryset.filter(
  99. Q(name__icontains=value) |
  100. Q(slug__icontains=value)
  101. )
  102. class ConfigContextFilterSet(ChangeLoggedModelFilterSet):
  103. q = django_filters.CharFilter(
  104. method='search',
  105. label='Search',
  106. )
  107. region_id = django_filters.ModelMultipleChoiceFilter(
  108. field_name='regions',
  109. queryset=Region.objects.all(),
  110. label='Region',
  111. )
  112. region = django_filters.ModelMultipleChoiceFilter(
  113. field_name='regions__slug',
  114. queryset=Region.objects.all(),
  115. to_field_name='slug',
  116. label='Region (slug)',
  117. )
  118. site_group = django_filters.ModelMultipleChoiceFilter(
  119. field_name='site_groups__slug',
  120. queryset=SiteGroup.objects.all(),
  121. to_field_name='slug',
  122. label='Site group (slug)',
  123. )
  124. site_group_id = django_filters.ModelMultipleChoiceFilter(
  125. field_name='site_groups',
  126. queryset=SiteGroup.objects.all(),
  127. label='Site group',
  128. )
  129. site_id = django_filters.ModelMultipleChoiceFilter(
  130. field_name='sites',
  131. queryset=Site.objects.all(),
  132. label='Site',
  133. )
  134. site = django_filters.ModelMultipleChoiceFilter(
  135. field_name='sites__slug',
  136. queryset=Site.objects.all(),
  137. to_field_name='slug',
  138. label='Site (slug)',
  139. )
  140. device_type_id = django_filters.ModelMultipleChoiceFilter(
  141. field_name='device_types',
  142. queryset=DeviceType.objects.all(),
  143. label='Device type',
  144. )
  145. role_id = django_filters.ModelMultipleChoiceFilter(
  146. field_name='roles',
  147. queryset=DeviceRole.objects.all(),
  148. label='Role',
  149. )
  150. role = django_filters.ModelMultipleChoiceFilter(
  151. field_name='roles__slug',
  152. queryset=DeviceRole.objects.all(),
  153. to_field_name='slug',
  154. label='Role (slug)',
  155. )
  156. platform_id = django_filters.ModelMultipleChoiceFilter(
  157. field_name='platforms',
  158. queryset=Platform.objects.all(),
  159. label='Platform',
  160. )
  161. platform = django_filters.ModelMultipleChoiceFilter(
  162. field_name='platforms__slug',
  163. queryset=Platform.objects.all(),
  164. to_field_name='slug',
  165. label='Platform (slug)',
  166. )
  167. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  168. field_name='cluster_groups',
  169. queryset=ClusterGroup.objects.all(),
  170. label='Cluster group',
  171. )
  172. cluster_group = django_filters.ModelMultipleChoiceFilter(
  173. field_name='cluster_groups__slug',
  174. queryset=ClusterGroup.objects.all(),
  175. to_field_name='slug',
  176. label='Cluster group (slug)',
  177. )
  178. cluster_id = django_filters.ModelMultipleChoiceFilter(
  179. field_name='clusters',
  180. queryset=Cluster.objects.all(),
  181. label='Cluster',
  182. )
  183. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  184. field_name='tenant_groups',
  185. queryset=TenantGroup.objects.all(),
  186. label='Tenant group',
  187. )
  188. tenant_group = django_filters.ModelMultipleChoiceFilter(
  189. field_name='tenant_groups__slug',
  190. queryset=TenantGroup.objects.all(),
  191. to_field_name='slug',
  192. label='Tenant group (slug)',
  193. )
  194. tenant_id = django_filters.ModelMultipleChoiceFilter(
  195. field_name='tenants',
  196. queryset=Tenant.objects.all(),
  197. label='Tenant',
  198. )
  199. tenant = django_filters.ModelMultipleChoiceFilter(
  200. field_name='tenants__slug',
  201. queryset=Tenant.objects.all(),
  202. to_field_name='slug',
  203. label='Tenant (slug)',
  204. )
  205. tag = django_filters.ModelMultipleChoiceFilter(
  206. field_name='tags__slug',
  207. queryset=Tag.objects.all(),
  208. to_field_name='slug',
  209. label='Tag (slug)',
  210. )
  211. class Meta:
  212. model = ConfigContext
  213. fields = ['id', 'name', 'is_active']
  214. def search(self, queryset, name, value):
  215. if not value.strip():
  216. return queryset
  217. return queryset.filter(
  218. Q(name__icontains=value) |
  219. Q(description__icontains=value) |
  220. Q(data__icontains=value)
  221. )
  222. #
  223. # Filter for Local Config Context Data
  224. #
  225. class LocalConfigContextFilterSet(django_filters.FilterSet):
  226. local_context_data = django_filters.BooleanFilter(
  227. method='_local_context_data',
  228. label='Has local config context data',
  229. )
  230. def _local_context_data(self, queryset, name, value):
  231. return queryset.exclude(local_context_data__isnull=value)
  232. class ObjectChangeFilterSet(BaseFilterSet):
  233. q = django_filters.CharFilter(
  234. method='search',
  235. label='Search',
  236. )
  237. time = django_filters.DateTimeFromToRangeFilter()
  238. changed_object_type = ContentTypeFilter()
  239. user_id = django_filters.ModelMultipleChoiceFilter(
  240. queryset=User.objects.all(),
  241. label='User (ID)',
  242. )
  243. user = django_filters.ModelMultipleChoiceFilter(
  244. field_name='user__username',
  245. queryset=User.objects.all(),
  246. to_field_name='username',
  247. label='User name',
  248. )
  249. class Meta:
  250. model = ObjectChange
  251. fields = [
  252. 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id',
  253. 'object_repr',
  254. ]
  255. def search(self, queryset, name, value):
  256. if not value.strip():
  257. return queryset
  258. return queryset.filter(
  259. Q(user_name__icontains=value) |
  260. Q(object_repr__icontains=value)
  261. )
  262. #
  263. # Job Results
  264. #
  265. class JobResultFilterSet(BaseFilterSet):
  266. q = django_filters.CharFilter(
  267. method='search',
  268. label='Search',
  269. )
  270. created = django_filters.DateTimeFilter()
  271. completed = django_filters.DateTimeFilter()
  272. status = django_filters.MultipleChoiceFilter(
  273. choices=JobResultStatusChoices,
  274. null_value=None
  275. )
  276. class Meta:
  277. model = JobResult
  278. fields = [
  279. 'id', 'created', 'completed', 'status', 'user', 'obj_type', 'name'
  280. ]
  281. def search(self, queryset, name, value):
  282. if not value.strip():
  283. return queryset
  284. return queryset.filter(
  285. Q(user__username__icontains=value)
  286. )
  287. #
  288. # ContentTypes
  289. #
  290. class ContentTypeFilterSet(django_filters.FilterSet):
  291. class Meta:
  292. model = ContentType
  293. fields = ['id', 'app_label', 'model']