filtersets.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. import django_filters
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.db.models import Q
  4. from django.utils.translation import gettext as _
  5. from core.models import DataSource, ObjectType
  6. from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup
  7. from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet, PrimaryModelFilterSet
  8. from tenancy.models import Tenant, TenantGroup
  9. from users.filterset_mixins import OwnerFilterMixin
  10. from users.models import Group, User
  11. from utilities.filters import (
  12. MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueNumberFilter
  13. )
  14. from utilities.filtersets import register_filterset
  15. from virtualization.models import Cluster, ClusterGroup, ClusterType
  16. from .choices import *
  17. from .filters import TagFilter, TagIDFilter
  18. from .models import *
  19. __all__ = (
  20. 'BookmarkFilterSet',
  21. 'ConfigContextFilterSet',
  22. 'ConfigContextProfileFilterSet',
  23. 'ConfigTemplateFilterSet',
  24. 'CustomFieldChoiceSetFilterSet',
  25. 'CustomFieldFilterSet',
  26. 'CustomLinkFilterSet',
  27. 'EventRuleFilterSet',
  28. 'ExportTemplateFilterSet',
  29. 'ImageAttachmentFilterSet',
  30. 'JournalEntryFilterSet',
  31. 'LocalConfigContextFilterSet',
  32. 'NotificationGroupFilterSet',
  33. 'SavedFilterFilterSet',
  34. 'ScriptFilterSet',
  35. 'TableConfigFilterSet',
  36. 'TagFilterSet',
  37. 'TaggedItemFilterSet',
  38. 'WebhookFilterSet',
  39. )
  40. @register_filterset
  41. class ScriptFilterSet(BaseFilterSet):
  42. q = django_filters.CharFilter(
  43. method='search',
  44. label=_('Search'),
  45. )
  46. module_id = django_filters.ModelMultipleChoiceFilter(
  47. queryset=ScriptModule.objects.all(),
  48. distinct=False,
  49. label=_('Script module (ID)'),
  50. )
  51. class Meta:
  52. model = Script
  53. fields = ('id', 'name', 'is_executable')
  54. def search(self, queryset, name, value):
  55. if not value.strip():
  56. return queryset
  57. return queryset.filter(
  58. Q(name__icontains=value)
  59. )
  60. @register_filterset
  61. class WebhookFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
  62. q = django_filters.CharFilter(
  63. method='search',
  64. label=_('Search'),
  65. )
  66. http_method = django_filters.MultipleChoiceFilter(
  67. choices=WebhookHttpMethodChoices,
  68. distinct=False,
  69. )
  70. payload_url = MultiValueCharFilter(
  71. lookup_expr='icontains'
  72. )
  73. class Meta:
  74. model = Webhook
  75. fields = (
  76. 'id', 'name', 'payload_url', 'http_method', 'http_content_type', 'secret', 'ssl_verification',
  77. 'ca_file_path', 'description',
  78. )
  79. def search(self, queryset, name, value):
  80. if not value.strip():
  81. return queryset
  82. return queryset.filter(
  83. Q(name__icontains=value) |
  84. Q(description__icontains=value) |
  85. Q(payload_url__icontains=value)
  86. )
  87. @register_filterset
  88. class EventRuleFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
  89. q = django_filters.CharFilter(
  90. method='search',
  91. label=_('Search'),
  92. )
  93. object_type_id = django_filters.ModelMultipleChoiceFilter(
  94. queryset=ObjectType.objects.all(),
  95. field_name='object_types'
  96. )
  97. object_type = MultiValueContentTypeFilter(
  98. field_name='object_types'
  99. )
  100. event_type = MultiValueCharFilter(
  101. method='filter_event_type'
  102. )
  103. action_type = django_filters.MultipleChoiceFilter(
  104. choices=EventRuleActionChoices,
  105. distinct=False,
  106. )
  107. action_object_type = MultiValueContentTypeFilter()
  108. action_object_id = MultiValueNumberFilter()
  109. class Meta:
  110. model = EventRule
  111. fields = (
  112. 'id', 'name', 'enabled', 'action_type', 'description',
  113. )
  114. def search(self, queryset, name, value):
  115. if not value.strip():
  116. return queryset
  117. return queryset.filter(
  118. Q(name__icontains=value) |
  119. Q(description__icontains=value) |
  120. Q(comments__icontains=value)
  121. )
  122. def filter_event_type(self, queryset, name, value):
  123. return queryset.filter(event_types__overlap=value)
  124. @register_filterset
  125. class CustomFieldFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  126. q = django_filters.CharFilter(
  127. method='search',
  128. label=_('Search'),
  129. )
  130. type = django_filters.MultipleChoiceFilter(
  131. choices=CustomFieldTypeChoices,
  132. distinct=False,
  133. )
  134. object_type_id = django_filters.ModelMultipleChoiceFilter(
  135. queryset=ObjectType.objects.all(),
  136. field_name='object_types'
  137. )
  138. object_type = MultiValueContentTypeFilter(
  139. field_name='object_types'
  140. )
  141. related_object_type_id = django_filters.ModelMultipleChoiceFilter(
  142. queryset=ObjectType.objects.all(),
  143. distinct=False,
  144. field_name='related_object_type'
  145. )
  146. related_object_type = MultiValueContentTypeFilter()
  147. choice_set_id = django_filters.ModelMultipleChoiceFilter(
  148. queryset=CustomFieldChoiceSet.objects.all(),
  149. distinct=False,
  150. )
  151. choice_set = django_filters.ModelMultipleChoiceFilter(
  152. field_name='choice_set__name',
  153. queryset=CustomFieldChoiceSet.objects.all(),
  154. distinct=False,
  155. to_field_name='name'
  156. )
  157. class Meta:
  158. model = CustomField
  159. fields = (
  160. 'id', 'name', 'label', 'group_name', 'required', 'unique', 'search_weight', 'filter_logic', 'ui_visible',
  161. 'ui_editable', 'weight', 'is_cloneable', 'description', 'validation_minimum', 'validation_maximum',
  162. 'validation_regex',
  163. )
  164. def search(self, queryset, name, value):
  165. if not value.strip():
  166. return queryset
  167. return queryset.filter(
  168. Q(name__icontains=value) |
  169. Q(label__icontains=value) |
  170. Q(group_name__icontains=value) |
  171. Q(description__icontains=value) |
  172. Q(comments__icontains=value)
  173. )
  174. @register_filterset
  175. class CustomFieldChoiceSetFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  176. q = django_filters.CharFilter(
  177. method='search',
  178. label=_('Search'),
  179. )
  180. choice = MultiValueCharFilter(
  181. method='filter_by_choice'
  182. )
  183. class Meta:
  184. model = CustomFieldChoiceSet
  185. fields = (
  186. 'id', 'name', 'description', 'base_choices', 'order_alphabetically',
  187. )
  188. def search(self, queryset, name, value):
  189. if not value.strip():
  190. return queryset
  191. return queryset.filter(
  192. Q(name__icontains=value) |
  193. Q(description__icontains=value)
  194. )
  195. def filter_by_choice(self, queryset, name, value):
  196. # TODO: Support case-insensitive matching
  197. return queryset.filter(extra_choices__overlap=value)
  198. @register_filterset
  199. class CustomLinkFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  200. q = django_filters.CharFilter(
  201. method='search',
  202. label=_('Search'),
  203. )
  204. object_type_id = django_filters.ModelMultipleChoiceFilter(
  205. queryset=ObjectType.objects.all(),
  206. field_name='object_types'
  207. )
  208. object_type = MultiValueContentTypeFilter(
  209. field_name='object_types'
  210. )
  211. class Meta:
  212. model = CustomLink
  213. fields = (
  214. 'id', 'name', 'enabled', 'link_text', 'link_url', 'weight', 'group_name', 'new_window', 'button_class',
  215. )
  216. def search(self, queryset, name, value):
  217. if not value.strip():
  218. return queryset
  219. return queryset.filter(
  220. Q(name__icontains=value) |
  221. Q(link_text__icontains=value) |
  222. Q(link_url__icontains=value) |
  223. Q(group_name__icontains=value)
  224. )
  225. @register_filterset
  226. class ExportTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  227. q = django_filters.CharFilter(
  228. method='search',
  229. label=_('Search'),
  230. )
  231. object_type_id = django_filters.ModelMultipleChoiceFilter(
  232. queryset=ObjectType.objects.all(),
  233. field_name='object_types'
  234. )
  235. object_type = MultiValueContentTypeFilter(
  236. field_name='object_types'
  237. )
  238. data_source_id = django_filters.ModelMultipleChoiceFilter(
  239. queryset=DataSource.objects.all(),
  240. distinct=False,
  241. label=_('Data source (ID)'),
  242. )
  243. data_file_id = django_filters.ModelMultipleChoiceFilter(
  244. queryset=DataSource.objects.all(),
  245. distinct=False,
  246. label=_('Data file (ID)'),
  247. )
  248. class Meta:
  249. model = ExportTemplate
  250. fields = (
  251. 'id', 'name', 'description', 'mime_type', 'file_name', 'file_extension', 'as_attachment',
  252. 'auto_sync_enabled', 'data_synced',
  253. )
  254. def search(self, queryset, name, value):
  255. if not value.strip():
  256. return queryset
  257. return queryset.filter(
  258. Q(name__icontains=value) |
  259. Q(description__icontains=value) |
  260. Q(file_name__icontains=value)
  261. )
  262. @register_filterset
  263. class SavedFilterFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  264. q = django_filters.CharFilter(
  265. method='search',
  266. label=_('Search'),
  267. )
  268. object_type_id = django_filters.ModelMultipleChoiceFilter(
  269. queryset=ObjectType.objects.all(),
  270. field_name='object_types'
  271. )
  272. object_type = MultiValueContentTypeFilter(
  273. field_name='object_types'
  274. )
  275. user_id = django_filters.ModelMultipleChoiceFilter(
  276. queryset=User.objects.all(),
  277. distinct=False,
  278. label=_('User (ID)'),
  279. )
  280. user = django_filters.ModelMultipleChoiceFilter(
  281. field_name='user__username',
  282. queryset=User.objects.all(),
  283. distinct=False,
  284. to_field_name='username',
  285. label=_('User (name)'),
  286. )
  287. usable = django_filters.BooleanFilter(
  288. method='_usable'
  289. )
  290. class Meta:
  291. model = SavedFilter
  292. fields = ('id', 'name', 'slug', 'description', 'enabled', 'shared', 'weight')
  293. def search(self, queryset, name, value):
  294. if not value.strip():
  295. return queryset
  296. return queryset.filter(
  297. Q(name__icontains=value) |
  298. Q(description__icontains=value)
  299. )
  300. def _usable(self, queryset, name, value):
  301. """
  302. Return only SavedFilters that are both enabled and are shared (or belong to the current user).
  303. """
  304. user = self.request.user if self.request else None
  305. if not user or user.is_anonymous:
  306. if value:
  307. return queryset.filter(enabled=True, shared=True)
  308. return queryset.filter(Q(enabled=False) | Q(shared=False))
  309. if value:
  310. return queryset.filter(enabled=True).filter(Q(shared=True) | Q(user=user))
  311. return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user)))
  312. @register_filterset
  313. class TableConfigFilterSet(ChangeLoggedModelFilterSet):
  314. q = django_filters.CharFilter(
  315. method='search',
  316. label=_('Search'),
  317. )
  318. object_type_id = django_filters.ModelMultipleChoiceFilter(
  319. queryset=ObjectType.objects.all(),
  320. distinct=False,
  321. field_name='object_type'
  322. )
  323. object_type = MultiValueContentTypeFilter(
  324. field_name='object_type'
  325. )
  326. user_id = django_filters.ModelMultipleChoiceFilter(
  327. queryset=User.objects.all(),
  328. distinct=False,
  329. label=_('User (ID)'),
  330. )
  331. user = django_filters.ModelMultipleChoiceFilter(
  332. field_name='user__username',
  333. queryset=User.objects.all(),
  334. distinct=False,
  335. to_field_name='username',
  336. label=_('User (name)'),
  337. )
  338. usable = django_filters.BooleanFilter(
  339. method='_usable'
  340. )
  341. class Meta:
  342. model = TableConfig
  343. fields = ('id', 'name', 'description', 'table', 'enabled', 'shared', 'weight')
  344. def search(self, queryset, name, value):
  345. if not value.strip():
  346. return queryset
  347. return queryset.filter(
  348. Q(name__icontains=value) |
  349. Q(description__icontains=value) |
  350. Q(table__icontains=value)
  351. )
  352. def _usable(self, queryset, name, value):
  353. """
  354. Return only TableConfigs that are both enabled and are shared (or belong to the current user).
  355. """
  356. user = self.request.user if self.request else None
  357. if not user or user.is_anonymous:
  358. if value:
  359. return queryset.filter(enabled=True, shared=True)
  360. return queryset.filter(Q(enabled=False) | Q(shared=False))
  361. if value:
  362. return queryset.filter(enabled=True).filter(Q(shared=True) | Q(user=user))
  363. return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user)))
  364. @register_filterset
  365. class BookmarkFilterSet(BaseFilterSet):
  366. created = django_filters.DateTimeFilter()
  367. object_type_id = MultiValueNumberFilter()
  368. object_type = MultiValueContentTypeFilter()
  369. user_id = django_filters.ModelMultipleChoiceFilter(
  370. queryset=User.objects.all(),
  371. distinct=False,
  372. label=_('User (ID)'),
  373. )
  374. user = django_filters.ModelMultipleChoiceFilter(
  375. field_name='user__username',
  376. queryset=User.objects.all(),
  377. distinct=False,
  378. to_field_name='username',
  379. label=_('User (name)'),
  380. )
  381. class Meta:
  382. model = Bookmark
  383. fields = ('id', 'object_id')
  384. @register_filterset
  385. class NotificationGroupFilterSet(ChangeLoggedModelFilterSet):
  386. q = django_filters.CharFilter(
  387. method='search',
  388. label=_('Search'),
  389. )
  390. user_id = django_filters.ModelMultipleChoiceFilter(
  391. field_name='users',
  392. queryset=User.objects.all(),
  393. label=_('User (ID)'),
  394. )
  395. user = django_filters.ModelMultipleChoiceFilter(
  396. field_name='users__username',
  397. queryset=User.objects.all(),
  398. to_field_name='username',
  399. label=_('User (name)'),
  400. )
  401. group_id = django_filters.ModelMultipleChoiceFilter(
  402. field_name='groups',
  403. queryset=Group.objects.all(),
  404. label=_('Group (ID)'),
  405. )
  406. group = django_filters.ModelMultipleChoiceFilter(
  407. field_name='groups__name',
  408. queryset=Group.objects.all(),
  409. to_field_name='name',
  410. label=_('Group (name)'),
  411. )
  412. class Meta:
  413. model = NotificationGroup
  414. fields = (
  415. 'id', 'name', 'description',
  416. )
  417. def search(self, queryset, name, value):
  418. if not value.strip():
  419. return queryset
  420. return queryset.filter(
  421. Q(name__icontains=value) |
  422. Q(description__icontains=value)
  423. )
  424. @register_filterset
  425. class ImageAttachmentFilterSet(ChangeLoggedModelFilterSet):
  426. q = django_filters.CharFilter(
  427. method='search',
  428. label=_('Search'),
  429. )
  430. object_type = MultiValueContentTypeFilter()
  431. class Meta:
  432. model = ImageAttachment
  433. fields = ('id', 'object_type_id', 'object_id', 'name', 'description', 'image_width', 'image_height')
  434. def search(self, queryset, name, value):
  435. if not value.strip():
  436. return queryset
  437. return queryset.filter(
  438. Q(name__icontains=value) |
  439. Q(image__icontains=value) |
  440. Q(description__icontains=value)
  441. )
  442. @register_filterset
  443. class JournalEntryFilterSet(NetBoxModelFilterSet):
  444. created = django_filters.DateTimeFromToRangeFilter()
  445. assigned_object_type = MultiValueContentTypeFilter()
  446. assigned_object_type_id = django_filters.ModelMultipleChoiceFilter(
  447. queryset=ContentType.objects.all(),
  448. distinct=False,
  449. )
  450. created_by_id = django_filters.ModelMultipleChoiceFilter(
  451. queryset=User.objects.all(),
  452. distinct=False,
  453. label=_('User (ID)'),
  454. )
  455. created_by = django_filters.ModelMultipleChoiceFilter(
  456. field_name='created_by__username',
  457. queryset=User.objects.all(),
  458. distinct=False,
  459. to_field_name='username',
  460. label=_('User (name)'),
  461. )
  462. kind = django_filters.MultipleChoiceFilter(
  463. choices=JournalEntryKindChoices,
  464. distinct=False,
  465. )
  466. class Meta:
  467. model = JournalEntry
  468. fields = ('id', 'assigned_object_type_id', 'assigned_object_id', 'created', 'kind')
  469. def search(self, queryset, name, value):
  470. if not value.strip():
  471. return queryset
  472. return queryset.filter(comments__icontains=value)
  473. @register_filterset
  474. class TagFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  475. q = django_filters.CharFilter(
  476. method='search',
  477. label=_('Search'),
  478. )
  479. content_type = MultiValueCharFilter(
  480. method='_content_type'
  481. )
  482. content_type_id = MultiValueNumberFilter(
  483. method='_content_type_id'
  484. )
  485. for_object_type_id = MultiValueNumberFilter(
  486. method='_for_object_type'
  487. )
  488. class Meta:
  489. model = Tag
  490. fields = ('id', 'name', 'slug', 'color', 'weight', 'description', 'object_types')
  491. def search(self, queryset, name, value):
  492. if not value.strip():
  493. return queryset
  494. return queryset.filter(
  495. Q(name__icontains=value) |
  496. Q(slug__icontains=value) |
  497. Q(description__icontains=value)
  498. )
  499. def _content_type(self, queryset, name, values):
  500. ct_filter = Q()
  501. # Compile list of app_label & model pairings
  502. for value in values:
  503. try:
  504. app_label, model = value.lower().split('.')
  505. ct_filter |= Q(
  506. app_label=app_label,
  507. model=model
  508. )
  509. except ValueError:
  510. pass
  511. # Get ContentType instances
  512. content_types = ContentType.objects.filter(ct_filter)
  513. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  514. def _content_type_id(self, queryset, name, values):
  515. # Get ContentType instances
  516. content_types = ContentType.objects.filter(pk__in=values)
  517. return queryset.filter(extras_taggeditem_items__content_type__in=content_types).distinct()
  518. def _for_object_type(self, queryset, name, values):
  519. return queryset.filter(
  520. Q(object_types__id__in=values) | Q(object_types__isnull=True)
  521. )
  522. @register_filterset
  523. class TaggedItemFilterSet(BaseFilterSet):
  524. q = django_filters.CharFilter(
  525. method='search',
  526. label=_('Search'),
  527. )
  528. object_type = MultiValueContentTypeFilter(
  529. field_name='content_type'
  530. )
  531. object_type_id = django_filters.ModelMultipleChoiceFilter(
  532. queryset=ContentType.objects.all(),
  533. distinct=False,
  534. field_name='content_type_id'
  535. )
  536. tag_id = django_filters.ModelMultipleChoiceFilter(
  537. queryset=Tag.objects.all(),
  538. distinct=False,
  539. )
  540. tag = django_filters.ModelMultipleChoiceFilter(
  541. field_name='tag__slug',
  542. queryset=Tag.objects.all(),
  543. distinct=False,
  544. to_field_name='slug',
  545. )
  546. class Meta:
  547. model = TaggedItem
  548. fields = ('id', 'object_id')
  549. def search(self, queryset, name, value):
  550. if not value.strip():
  551. return queryset
  552. return queryset.filter(
  553. Q(tag__name__icontains=value) |
  554. Q(tag__slug__icontains=value) |
  555. Q(tag__description__icontains=value)
  556. )
  557. @register_filterset
  558. class ConfigContextProfileFilterSet(PrimaryModelFilterSet):
  559. q = django_filters.CharFilter(
  560. method='search',
  561. label=_('Search'),
  562. )
  563. data_source_id = django_filters.ModelMultipleChoiceFilter(
  564. queryset=DataSource.objects.all(),
  565. distinct=False,
  566. label=_('Data source (ID)'),
  567. )
  568. data_file_id = django_filters.ModelMultipleChoiceFilter(
  569. queryset=DataSource.objects.all(),
  570. distinct=False,
  571. label=_('Data file (ID)'),
  572. )
  573. class Meta:
  574. model = ConfigContextProfile
  575. fields = (
  576. 'id', 'name', 'description', 'auto_sync_enabled', 'data_synced',
  577. )
  578. def search(self, queryset, name, value):
  579. if not value.strip():
  580. return queryset
  581. return queryset.filter(
  582. Q(name__icontains=value) |
  583. Q(description__icontains=value) |
  584. Q(comments__icontains=value)
  585. )
  586. @register_filterset
  587. class ConfigContextFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  588. q = django_filters.CharFilter(
  589. method='search',
  590. label=_('Search'),
  591. )
  592. profile_id = django_filters.ModelMultipleChoiceFilter(
  593. queryset=ConfigContextProfile.objects.all(),
  594. distinct=False,
  595. label=_('Profile (ID)'),
  596. )
  597. profile = django_filters.ModelMultipleChoiceFilter(
  598. field_name='profile__name',
  599. queryset=ConfigContextProfile.objects.all(),
  600. distinct=False,
  601. to_field_name='name',
  602. label=_('Profile (name)'),
  603. )
  604. region_id = django_filters.ModelMultipleChoiceFilter(
  605. field_name='regions',
  606. queryset=Region.objects.all(),
  607. label=_('Region'),
  608. )
  609. region = django_filters.ModelMultipleChoiceFilter(
  610. field_name='regions__slug',
  611. queryset=Region.objects.all(),
  612. to_field_name='slug',
  613. label=_('Region (slug)'),
  614. )
  615. site_group = django_filters.ModelMultipleChoiceFilter(
  616. field_name='site_groups__slug',
  617. queryset=SiteGroup.objects.all(),
  618. to_field_name='slug',
  619. label=_('Site group (slug)'),
  620. )
  621. site_group_id = django_filters.ModelMultipleChoiceFilter(
  622. field_name='site_groups',
  623. queryset=SiteGroup.objects.all(),
  624. label=_('Site group'),
  625. )
  626. site_id = django_filters.ModelMultipleChoiceFilter(
  627. field_name='sites',
  628. queryset=Site.objects.all(),
  629. label=_('Site'),
  630. )
  631. site = django_filters.ModelMultipleChoiceFilter(
  632. field_name='sites__slug',
  633. queryset=Site.objects.all(),
  634. to_field_name='slug',
  635. label=_('Site (slug)'),
  636. )
  637. location_id = django_filters.ModelMultipleChoiceFilter(
  638. field_name='locations',
  639. queryset=Location.objects.all(),
  640. label=_('Location'),
  641. )
  642. location = django_filters.ModelMultipleChoiceFilter(
  643. field_name='locations__slug',
  644. queryset=Location.objects.all(),
  645. to_field_name='slug',
  646. label=_('Location (slug)'),
  647. )
  648. device_type_id = django_filters.ModelMultipleChoiceFilter(
  649. field_name='device_types',
  650. queryset=DeviceType.objects.all(),
  651. label=_('Device type'),
  652. )
  653. device_role_id = django_filters.ModelMultipleChoiceFilter(
  654. field_name='roles',
  655. queryset=DeviceRole.objects.all(),
  656. label=_('Role'),
  657. )
  658. device_role = django_filters.ModelMultipleChoiceFilter(
  659. field_name='roles__slug',
  660. queryset=DeviceRole.objects.all(),
  661. to_field_name='slug',
  662. label=_('Role (slug)'),
  663. )
  664. platform_id = django_filters.ModelMultipleChoiceFilter(
  665. field_name='platforms',
  666. queryset=Platform.objects.all(),
  667. label=_('Platform'),
  668. )
  669. platform = django_filters.ModelMultipleChoiceFilter(
  670. field_name='platforms__slug',
  671. queryset=Platform.objects.all(),
  672. to_field_name='slug',
  673. label=_('Platform (slug)'),
  674. )
  675. cluster_type_id = django_filters.ModelMultipleChoiceFilter(
  676. field_name='cluster_types',
  677. queryset=ClusterType.objects.all(),
  678. label=_('Cluster type'),
  679. )
  680. cluster_type = django_filters.ModelMultipleChoiceFilter(
  681. field_name='cluster_types__slug',
  682. queryset=ClusterType.objects.all(),
  683. to_field_name='slug',
  684. label=_('Cluster type (slug)'),
  685. )
  686. cluster_group_id = django_filters.ModelMultipleChoiceFilter(
  687. field_name='cluster_groups',
  688. queryset=ClusterGroup.objects.all(),
  689. label=_('Cluster group'),
  690. )
  691. cluster_group = django_filters.ModelMultipleChoiceFilter(
  692. field_name='cluster_groups__slug',
  693. queryset=ClusterGroup.objects.all(),
  694. to_field_name='slug',
  695. label=_('Cluster group (slug)'),
  696. )
  697. cluster_id = django_filters.ModelMultipleChoiceFilter(
  698. field_name='clusters',
  699. queryset=Cluster.objects.all(),
  700. label=_('Cluster'),
  701. )
  702. tenant_group_id = django_filters.ModelMultipleChoiceFilter(
  703. field_name='tenant_groups',
  704. queryset=TenantGroup.objects.all(),
  705. label=_('Tenant group'),
  706. )
  707. tenant_group = django_filters.ModelMultipleChoiceFilter(
  708. field_name='tenant_groups__slug',
  709. queryset=TenantGroup.objects.all(),
  710. to_field_name='slug',
  711. label=_('Tenant group (slug)'),
  712. )
  713. tenant_id = django_filters.ModelMultipleChoiceFilter(
  714. field_name='tenants',
  715. queryset=Tenant.objects.all(),
  716. label=_('Tenant'),
  717. )
  718. tenant = django_filters.ModelMultipleChoiceFilter(
  719. field_name='tenants__slug',
  720. queryset=Tenant.objects.all(),
  721. to_field_name='slug',
  722. label=_('Tenant (slug)'),
  723. )
  724. tag_id = django_filters.ModelMultipleChoiceFilter(
  725. field_name='tags',
  726. queryset=Tag.objects.all(),
  727. label=_('Tag'),
  728. )
  729. tag = django_filters.ModelMultipleChoiceFilter(
  730. field_name='tags__slug',
  731. queryset=Tag.objects.all(),
  732. to_field_name='slug',
  733. label=_('Tag (slug)'),
  734. )
  735. data_source_id = django_filters.ModelMultipleChoiceFilter(
  736. queryset=DataSource.objects.all(),
  737. distinct=False,
  738. label=_('Data source (ID)'),
  739. )
  740. data_file_id = django_filters.ModelMultipleChoiceFilter(
  741. queryset=DataSource.objects.all(),
  742. distinct=False,
  743. label=_('Data file (ID)'),
  744. )
  745. class Meta:
  746. model = ConfigContext
  747. fields = ('id', 'name', 'is_active', 'description', 'weight', 'auto_sync_enabled', 'data_synced')
  748. def search(self, queryset, name, value):
  749. if not value.strip():
  750. return queryset
  751. return queryset.filter(
  752. Q(name__icontains=value) |
  753. Q(description__icontains=value) |
  754. Q(data__icontains=value)
  755. )
  756. @register_filterset
  757. class ConfigTemplateFilterSet(OwnerFilterMixin, ChangeLoggedModelFilterSet):
  758. q = django_filters.CharFilter(
  759. method='search',
  760. label=_('Search'),
  761. )
  762. data_source_id = django_filters.ModelMultipleChoiceFilter(
  763. queryset=DataSource.objects.all(),
  764. distinct=False,
  765. label=_('Data source (ID)'),
  766. )
  767. data_file_id = django_filters.ModelMultipleChoiceFilter(
  768. queryset=DataSource.objects.all(),
  769. distinct=False,
  770. label=_('Data file (ID)'),
  771. )
  772. tag = TagFilter()
  773. tag_id = TagIDFilter()
  774. class Meta:
  775. model = ConfigTemplate
  776. fields = (
  777. 'id', 'name', 'description', 'mime_type', 'file_name', 'file_extension', 'as_attachment',
  778. 'auto_sync_enabled', 'data_synced'
  779. )
  780. def search(self, queryset, name, value):
  781. if not value.strip():
  782. return queryset
  783. return queryset.filter(
  784. Q(name__icontains=value) |
  785. Q(description__icontains=value)
  786. )
  787. #
  788. # Filter for Local Config Context Data
  789. #
  790. class LocalConfigContextFilterSet(django_filters.FilterSet):
  791. local_context_data = django_filters.BooleanFilter(
  792. method='_local_context_data',
  793. label=_('Has local config context data'),
  794. )
  795. def _local_context_data(self, queryset, name, value):
  796. return queryset.exclude(local_context_data__isnull=value)