filtersets.py 13 KB

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