filtersets.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  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, 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 = ['id', 'content_types', 'name', 'required', 'filter_logic', 'weight']
  56. def search(self, queryset, name, value):
  57. if not value.strip():
  58. return queryset
  59. return queryset.filter(
  60. Q(name__icontains=value) |
  61. Q(label__icontains=value) |
  62. Q(description__icontains=value)
  63. )
  64. class CustomLinkFilterSet(BaseFilterSet):
  65. q = django_filters.CharFilter(
  66. method='search',
  67. label='Search',
  68. )
  69. class Meta:
  70. model = CustomLink
  71. fields = [
  72. 'id', 'content_type', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window',
  73. ]
  74. def search(self, queryset, name, value):
  75. if not value.strip():
  76. return queryset
  77. return queryset.filter(
  78. Q(name__icontains=value) |
  79. Q(link_text__icontains=value) |
  80. Q(link_url__icontains=value) |
  81. Q(group_name__icontains=value)
  82. )
  83. class ExportTemplateFilterSet(BaseFilterSet):
  84. q = django_filters.CharFilter(
  85. method='search',
  86. label='Search',
  87. )
  88. class Meta:
  89. model = ExportTemplate
  90. fields = ['id', 'content_type', 'name']
  91. def search(self, queryset, name, value):
  92. if not value.strip():
  93. return queryset
  94. return queryset.filter(
  95. Q(name__icontains=value) |
  96. Q(description__icontains=value)
  97. )
  98. class ImageAttachmentFilterSet(BaseFilterSet):
  99. q = django_filters.CharFilter(
  100. method='search',
  101. label='Search',
  102. )
  103. created = django_filters.DateTimeFilter()
  104. content_type = ContentTypeFilter()
  105. class Meta:
  106. model = ImageAttachment
  107. fields = ['id', 'content_type_id', 'object_id', 'name']
  108. def search(self, queryset, name, value):
  109. if not value.strip():
  110. return queryset
  111. return queryset.filter(name__icontains=value)
  112. class JournalEntryFilterSet(ChangeLoggedModelFilterSet):
  113. q = django_filters.CharFilter(
  114. method='search',
  115. label='Search',
  116. )
  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']
  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. )
  160. def _content_type(self, queryset, name, values):
  161. ct_filter = Q()
  162. # Compile list of app_label & model pairings
  163. for value in values:
  164. try:
  165. app_label, model = value.lower().split('.')
  166. ct_filter |= Q(
  167. app_label=app_label,
  168. model=model
  169. )
  170. except ValueError:
  171. pass
  172. # Get ContentType instances
  173. content_types = ContentType.objects.filter(ct_filter)
  174. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  175. def _content_type_id(self, queryset, name, values):
  176. # Get ContentType instances
  177. content_types = ContentType.objects.filter(pk__in=values)
  178. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  179. class ConfigContextFilterSet(ChangeLoggedModelFilterSet):
  180. q = django_filters.CharFilter(
  181. method='search',
  182. label='Search',
  183. )
  184. region_id = django_filters.ModelMultipleChoiceFilter(
  185. field_name='regions',
  186. queryset=Region.objects.all(),
  187. label='Region',
  188. )
  189. region = django_filters.ModelMultipleChoiceFilter(
  190. field_name='regions__slug',
  191. queryset=Region.objects.all(),
  192. to_field_name='slug',
  193. label='Region (slug)',
  194. )
  195. site_group = django_filters.ModelMultipleChoiceFilter(
  196. field_name='site_groups__slug',
  197. queryset=SiteGroup.objects.all(),
  198. to_field_name='slug',
  199. label='Site group (slug)',
  200. )
  201. site_group_id = django_filters.ModelMultipleChoiceFilter(
  202. field_name='site_groups',
  203. queryset=SiteGroup.objects.all(),
  204. label='Site group',
  205. )
  206. site_id = django_filters.ModelMultipleChoiceFilter(
  207. field_name='sites',
  208. queryset=Site.objects.all(),
  209. label='Site',
  210. )
  211. site = django_filters.ModelMultipleChoiceFilter(
  212. field_name='sites__slug',
  213. queryset=Site.objects.all(),
  214. to_field_name='slug',
  215. label='Site (slug)',
  216. )
  217. device_type_id = django_filters.ModelMultipleChoiceFilter(
  218. field_name='device_types',
  219. queryset=DeviceType.objects.all(),
  220. label='Device type',
  221. )
  222. role_id = django_filters.ModelMultipleChoiceFilter(
  223. field_name='roles',
  224. queryset=DeviceRole.objects.all(),
  225. label='Role',
  226. )
  227. role = django_filters.ModelMultipleChoiceFilter(
  228. field_name='roles__slug',
  229. queryset=DeviceRole.objects.all(),
  230. to_field_name='slug',
  231. label='Role (slug)',
  232. )
  233. platform_id = django_filters.ModelMultipleChoiceFilter(
  234. field_name='platforms',
  235. queryset=Platform.objects.all(),
  236. label='Platform',
  237. )
  238. platform = django_filters.ModelMultipleChoiceFilter(
  239. field_name='platforms__slug',
  240. queryset=Platform.objects.all(),
  241. to_field_name='slug',
  242. label='Platform (slug)',
  243. )
  244. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  245. field_name='cluster_types',
  246. queryset=ClusterType.objects.all(),
  247. label='Cluster type',
  248. )
  249. cluster_type = django_filters.ModelMultipleChoiceFilter(
  250. field_name='cluster_types__slug',
  251. queryset=ClusterType.objects.all(),
  252. to_field_name='slug',
  253. label='Cluster type (slug)',
  254. )
  255. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  256. field_name='cluster_groups',
  257. queryset=ClusterGroup.objects.all(),
  258. label='Cluster group',
  259. )
  260. cluster_group = django_filters.ModelMultipleChoiceFilter(
  261. field_name='cluster_groups__slug',
  262. queryset=ClusterGroup.objects.all(),
  263. to_field_name='slug',
  264. label='Cluster group (slug)',
  265. )
  266. cluster_id = django_filters.ModelMultipleChoiceFilter(
  267. field_name='clusters',
  268. queryset=Cluster.objects.all(),
  269. label='Cluster',
  270. )
  271. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  272. field_name='tenant_groups',
  273. queryset=TenantGroup.objects.all(),
  274. label='Tenant group',
  275. )
  276. tenant_group = django_filters.ModelMultipleChoiceFilter(
  277. field_name='tenant_groups__slug',
  278. queryset=TenantGroup.objects.all(),
  279. to_field_name='slug',
  280. label='Tenant group (slug)',
  281. )
  282. tenant_id = django_filters.ModelMultipleChoiceFilter(
  283. field_name='tenants',
  284. queryset=Tenant.objects.all(),
  285. label='Tenant',
  286. )
  287. tenant = django_filters.ModelMultipleChoiceFilter(
  288. field_name='tenants__slug',
  289. queryset=Tenant.objects.all(),
  290. to_field_name='slug',
  291. label='Tenant (slug)',
  292. )
  293. tag_id = django_filters.ModelMultipleChoiceFilter(
  294. field_name='tags',
  295. queryset=Tag.objects.all(),
  296. label='Tag',
  297. )
  298. tag = django_filters.ModelMultipleChoiceFilter(
  299. field_name='tags__slug',
  300. queryset=Tag.objects.all(),
  301. to_field_name='slug',
  302. label='Tag (slug)',
  303. )
  304. class Meta:
  305. model = ConfigContext
  306. fields = ['id', 'name', 'is_active']
  307. def search(self, queryset, name, value):
  308. if not value.strip():
  309. return queryset
  310. return queryset.filter(
  311. Q(name__icontains=value) |
  312. Q(description__icontains=value) |
  313. Q(data__icontains=value)
  314. )
  315. #
  316. # Filter for Local Config Context Data
  317. #
  318. class LocalConfigContextFilterSet(django_filters.FilterSet):
  319. local_context_data = django_filters.BooleanFilter(
  320. method='_local_context_data',
  321. label='Has local config context data',
  322. )
  323. def _local_context_data(self, queryset, name, value):
  324. return queryset.exclude(local_context_data__isnull=value)
  325. class ObjectChangeFilterSet(BaseFilterSet):
  326. q = django_filters.CharFilter(
  327. method='search',
  328. label='Search',
  329. )
  330. time = django_filters.DateTimeFromToRangeFilter()
  331. changed_object_type = ContentTypeFilter()
  332. user_id = django_filters.ModelMultipleChoiceFilter(
  333. queryset=User.objects.all(),
  334. label='User (ID)',
  335. )
  336. user = django_filters.ModelMultipleChoiceFilter(
  337. field_name='user__username',
  338. queryset=User.objects.all(),
  339. to_field_name='username',
  340. label='User name',
  341. )
  342. class Meta:
  343. model = ObjectChange
  344. fields = [
  345. 'id', 'user', 'user_name', 'request_id', 'action', 'changed_object_type_id', 'changed_object_id',
  346. 'object_repr',
  347. ]
  348. def search(self, queryset, name, value):
  349. if not value.strip():
  350. return queryset
  351. return queryset.filter(
  352. Q(user_name__icontains=value) |
  353. Q(object_repr__icontains=value)
  354. )
  355. #
  356. # Job Results
  357. #
  358. class JobResultFilterSet(BaseFilterSet):
  359. q = django_filters.CharFilter(
  360. method='search',
  361. label='Search',
  362. )
  363. created = django_filters.DateTimeFilter()
  364. completed = django_filters.DateTimeFilter()
  365. status = django_filters.MultipleChoiceFilter(
  366. choices=JobResultStatusChoices,
  367. null_value=None
  368. )
  369. class Meta:
  370. model = JobResult
  371. fields = [
  372. 'id', 'created', 'completed', 'status', 'user', 'obj_type', 'name'
  373. ]
  374. def search(self, queryset, name, value):
  375. if not value.strip():
  376. return queryset
  377. return queryset.filter(
  378. Q(user__username__icontains=value)
  379. )
  380. #
  381. # ContentTypes
  382. #
  383. class ContentTypeFilterSet(django_filters.FilterSet):
  384. q = django_filters.CharFilter(
  385. method='search',
  386. label='Search',
  387. )
  388. class Meta:
  389. model = ContentType
  390. fields = ['id', 'app_label', 'model']
  391. def search(self, queryset, name, value):
  392. if not value.strip():
  393. return queryset
  394. return queryset.filter(
  395. Q(app_label__icontains=value) |
  396. Q(model__icontains=value)
  397. )