filtersets.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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, NetBoxModelFilterSet
  7. from tenancy.models import Tenant, TenantGroup
  8. from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter
  9. from virtualization.models import Cluster, ClusterGroup, ClusterType
  10. from .choices import *
  11. from .models import *
  12. __all__ = (
  13. 'ConfigContextFilterSet',
  14. 'ContentTypeFilterSet',
  15. 'CustomFieldFilterSet',
  16. 'CustomLinkFilterSet',
  17. 'ExportTemplateFilterSet',
  18. 'ImageAttachmentFilterSet',
  19. 'JournalEntryFilterSet',
  20. 'LocalConfigContextFilterSet',
  21. 'ObjectChangeFilterSet',
  22. 'TagFilterSet',
  23. 'WebhookFilterSet',
  24. )
  25. class WebhookFilterSet(BaseFilterSet):
  26. q = django_filters.CharFilter(
  27. method='search',
  28. label='Search',
  29. )
  30. content_types = ContentTypeFilter()
  31. http_method = django_filters.MultipleChoiceFilter(
  32. choices=WebhookHttpMethodChoices
  33. )
  34. class Meta:
  35. model = Webhook
  36. fields = [
  37. 'id', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', 'payload_url', 'enabled',
  38. 'http_method', 'http_content_type', 'secret', 'ssl_verification', 'ca_file_path',
  39. ]
  40. def search(self, queryset, name, value):
  41. if not value.strip():
  42. return queryset
  43. return queryset.filter(
  44. Q(name__icontains=value) |
  45. Q(payload_url__icontains=value)
  46. )
  47. class CustomFieldFilterSet(BaseFilterSet):
  48. q = django_filters.CharFilter(
  49. method='search',
  50. label='Search',
  51. )
  52. content_types = ContentTypeFilter()
  53. class Meta:
  54. model = CustomField
  55. fields = [
  56. 'id', 'content_types', 'name', 'group_name', 'required', 'filter_logic', 'ui_visibility', 'weight',
  57. 'description',
  58. ]
  59. def search(self, queryset, name, value):
  60. if not value.strip():
  61. return queryset
  62. return queryset.filter(
  63. Q(name__icontains=value) |
  64. Q(label__icontains=value) |
  65. Q(group_name__icontains=value) |
  66. Q(description__icontains=value)
  67. )
  68. class CustomLinkFilterSet(BaseFilterSet):
  69. q = django_filters.CharFilter(
  70. method='search',
  71. label='Search',
  72. )
  73. class Meta:
  74. model = CustomLink
  75. fields = [
  76. 'id', 'content_type', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window',
  77. ]
  78. def search(self, queryset, name, value):
  79. if not value.strip():
  80. return queryset
  81. return queryset.filter(
  82. Q(name__icontains=value) |
  83. Q(link_text__icontains=value) |
  84. Q(link_url__icontains=value) |
  85. Q(group_name__icontains=value)
  86. )
  87. class ExportTemplateFilterSet(BaseFilterSet):
  88. q = django_filters.CharFilter(
  89. method='search',
  90. label='Search',
  91. )
  92. class Meta:
  93. model = ExportTemplate
  94. fields = ['id', 'content_type', 'name', 'description']
  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(description__icontains=value)
  101. )
  102. class ImageAttachmentFilterSet(BaseFilterSet):
  103. q = django_filters.CharFilter(
  104. method='search',
  105. label='Search',
  106. )
  107. created = django_filters.DateTimeFilter()
  108. content_type = ContentTypeFilter()
  109. class Meta:
  110. model = ImageAttachment
  111. fields = ['id', 'content_type_id', 'object_id', 'name']
  112. def search(self, queryset, name, value):
  113. if not value.strip():
  114. return queryset
  115. return queryset.filter(name__icontains=value)
  116. class JournalEntryFilterSet(NetBoxModelFilterSet):
  117. created = django_filters.DateTimeFromToRangeFilter()
  118. assigned_object_type = ContentTypeFilter()
  119. created_by_id = django_filters.ModelMultipleChoiceFilter(
  120. queryset=User.objects.all(),
  121. label='User (ID)',
  122. )
  123. created_by = django_filters.ModelMultipleChoiceFilter(
  124. field_name='created_by__username',
  125. queryset=User.objects.all(),
  126. to_field_name='username',
  127. label='User (name)',
  128. )
  129. kind = django_filters.MultipleChoiceFilter(
  130. choices=JournalEntryKindChoices
  131. )
  132. class Meta:
  133. model = JournalEntry
  134. fields = ['id', 'assigned_object_type_id', 'assigned_object_id', 'created', 'kind']
  135. def search(self, queryset, name, value):
  136. if not value.strip():
  137. return queryset
  138. return queryset.filter(comments__icontains=value)
  139. class TagFilterSet(ChangeLoggedModelFilterSet):
  140. q = django_filters.CharFilter(
  141. method='search',
  142. label='Search',
  143. )
  144. content_type = MultiValueCharFilter(
  145. method='_content_type'
  146. )
  147. content_type_id = MultiValueNumberFilter(
  148. method='_content_type_id'
  149. )
  150. class Meta:
  151. model = Tag
  152. fields = ['id', 'name', 'slug', 'color', 'description']
  153. def search(self, queryset, name, value):
  154. if not value.strip():
  155. return queryset
  156. return queryset.filter(
  157. Q(name__icontains=value) |
  158. Q(slug__icontains=value) |
  159. Q(description__icontains=value)
  160. )
  161. def _content_type(self, queryset, name, values):
  162. ct_filter = Q()
  163. # Compile list of app_label & model pairings
  164. for value in values:
  165. try:
  166. app_label, model = value.lower().split('.')
  167. ct_filter |= Q(
  168. app_label=app_label,
  169. model=model
  170. )
  171. except ValueError:
  172. pass
  173. # Get ContentType instances
  174. content_types = ContentType.objects.filter(ct_filter)
  175. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  176. def _content_type_id(self, queryset, name, values):
  177. # Get ContentType instances
  178. content_types = ContentType.objects.filter(pk__in=values)
  179. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  180. class ConfigContextFilterSet(ChangeLoggedModelFilterSet):
  181. q = django_filters.CharFilter(
  182. method='search',
  183. label='Search',
  184. )
  185. region_id = django_filters.ModelMultipleChoiceFilter(
  186. field_name='regions',
  187. queryset=Region.objects.all(),
  188. label='Region',
  189. )
  190. region = django_filters.ModelMultipleChoiceFilter(
  191. field_name='regions__slug',
  192. queryset=Region.objects.all(),
  193. to_field_name='slug',
  194. label='Region (slug)',
  195. )
  196. site_group = django_filters.ModelMultipleChoiceFilter(
  197. field_name='site_groups__slug',
  198. queryset=SiteGroup.objects.all(),
  199. to_field_name='slug',
  200. label='Site group (slug)',
  201. )
  202. site_group_id = django_filters.ModelMultipleChoiceFilter(
  203. field_name='site_groups',
  204. queryset=SiteGroup.objects.all(),
  205. label='Site group',
  206. )
  207. site_id = django_filters.ModelMultipleChoiceFilter(
  208. field_name='sites',
  209. queryset=Site.objects.all(),
  210. label='Site',
  211. )
  212. site = django_filters.ModelMultipleChoiceFilter(
  213. field_name='sites__slug',
  214. queryset=Site.objects.all(),
  215. to_field_name='slug',
  216. label='Site (slug)',
  217. )
  218. device_type_id = django_filters.ModelMultipleChoiceFilter(
  219. field_name='device_types',
  220. queryset=DeviceType.objects.all(),
  221. label='Device type',
  222. )
  223. role_id = django_filters.ModelMultipleChoiceFilter(
  224. field_name='roles',
  225. queryset=DeviceRole.objects.all(),
  226. label='Role',
  227. )
  228. role = django_filters.ModelMultipleChoiceFilter(
  229. field_name='roles__slug',
  230. queryset=DeviceRole.objects.all(),
  231. to_field_name='slug',
  232. label='Role (slug)',
  233. )
  234. platform_id = django_filters.ModelMultipleChoiceFilter(
  235. field_name='platforms',
  236. queryset=Platform.objects.all(),
  237. label='Platform',
  238. )
  239. platform = django_filters.ModelMultipleChoiceFilter(
  240. field_name='platforms__slug',
  241. queryset=Platform.objects.all(),
  242. to_field_name='slug',
  243. label='Platform (slug)',
  244. )
  245. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  246. field_name='cluster_types',
  247. queryset=ClusterType.objects.all(),
  248. label='Cluster type',
  249. )
  250. cluster_type = django_filters.ModelMultipleChoiceFilter(
  251. field_name='cluster_types__slug',
  252. queryset=ClusterType.objects.all(),
  253. to_field_name='slug',
  254. label='Cluster type (slug)',
  255. )
  256. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  257. field_name='cluster_groups',
  258. queryset=ClusterGroup.objects.all(),
  259. label='Cluster group',
  260. )
  261. cluster_group = django_filters.ModelMultipleChoiceFilter(
  262. field_name='cluster_groups__slug',
  263. queryset=ClusterGroup.objects.all(),
  264. to_field_name='slug',
  265. label='Cluster group (slug)',
  266. )
  267. cluster_id = django_filters.ModelMultipleChoiceFilter(
  268. field_name='clusters',
  269. queryset=Cluster.objects.all(),
  270. label='Cluster',
  271. )
  272. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  273. field_name='tenant_groups',
  274. queryset=TenantGroup.objects.all(),
  275. label='Tenant group',
  276. )
  277. tenant_group = django_filters.ModelMultipleChoiceFilter(
  278. field_name='tenant_groups__slug',
  279. queryset=TenantGroup.objects.all(),
  280. to_field_name='slug',
  281. label='Tenant group (slug)',
  282. )
  283. tenant_id = django_filters.ModelMultipleChoiceFilter(
  284. field_name='tenants',
  285. queryset=Tenant.objects.all(),
  286. label='Tenant',
  287. )
  288. tenant = django_filters.ModelMultipleChoiceFilter(
  289. field_name='tenants__slug',
  290. queryset=Tenant.objects.all(),
  291. to_field_name='slug',
  292. label='Tenant (slug)',
  293. )
  294. tag_id = django_filters.ModelMultipleChoiceFilter(
  295. field_name='tags',
  296. queryset=Tag.objects.all(),
  297. label='Tag',
  298. )
  299. tag = django_filters.ModelMultipleChoiceFilter(
  300. field_name='tags__slug',
  301. queryset=Tag.objects.all(),
  302. to_field_name='slug',
  303. label='Tag (slug)',
  304. )
  305. class Meta:
  306. model = ConfigContext
  307. fields = ['id', 'name', 'is_active']
  308. def search(self, queryset, name, value):
  309. if not value.strip():
  310. return queryset
  311. return queryset.filter(
  312. Q(name__icontains=value) |
  313. Q(description__icontains=value) |
  314. Q(data__icontains=value)
  315. )
  316. #
  317. # Filter for Local Config Context Data
  318. #
  319. class LocalConfigContextFilterSet(django_filters.FilterSet):
  320. local_context_data = django_filters.BooleanFilter(
  321. method='_local_context_data',
  322. label='Has local config context data',
  323. )
  324. def _local_context_data(self, queryset, name, value):
  325. return queryset.exclude(local_context_data__isnull=value)
  326. class ObjectChangeFilterSet(BaseFilterSet):
  327. q = django_filters.CharFilter(
  328. method='search',
  329. label='Search',
  330. )
  331. time = django_filters.DateTimeFromToRangeFilter()
  332. changed_object_type = ContentTypeFilter()
  333. user_id = django_filters.ModelMultipleChoiceFilter(
  334. queryset=User.objects.all(),
  335. label='User (ID)',
  336. )
  337. user = django_filters.ModelMultipleChoiceFilter(
  338. field_name='user__username',
  339. queryset=User.objects.all(),
  340. to_field_name='username',
  341. label='User name',
  342. )
  343. class Meta:
  344. model = ObjectChange
  345. fields = [
  346. 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id',
  347. 'object_repr',
  348. ]
  349. def search(self, queryset, name, value):
  350. if not value.strip():
  351. return queryset
  352. return queryset.filter(
  353. Q(user_name__icontains=value) |
  354. Q(object_repr__icontains=value)
  355. )
  356. #
  357. # Job Results
  358. #
  359. class JobResultFilterSet(BaseFilterSet):
  360. q = django_filters.CharFilter(
  361. method='search',
  362. label='Search',
  363. )
  364. created = django_filters.DateTimeFilter()
  365. completed = django_filters.DateTimeFilter()
  366. status = django_filters.MultipleChoiceFilter(
  367. choices=JobResultStatusChoices,
  368. null_value=None
  369. )
  370. class Meta:
  371. model = JobResult
  372. fields = [
  373. 'id', 'created', 'completed', 'status', 'user', 'obj_type', 'name'
  374. ]
  375. def search(self, queryset, name, value):
  376. if not value.strip():
  377. return queryset
  378. return queryset.filter(
  379. Q(user__username__icontains=value)
  380. )
  381. #
  382. # ContentTypes
  383. #
  384. class ContentTypeFilterSet(django_filters.FilterSet):
  385. q = django_filters.CharFilter(
  386. method='search',
  387. label='Search',
  388. )
  389. class Meta:
  390. model = ContentType
  391. fields = ['id', 'app_label', 'model']
  392. def search(self, queryset, name, value):
  393. if not value.strip():
  394. return queryset
  395. return queryset.filter(
  396. Q(app_label__icontains=value) |
  397. Q(model__icontains=value)
  398. )