nautobot 2.0.4__py3-none-any.whl → 2.1.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (812) hide show
  1. nautobot/circuits/navigation.py +0 -25
  2. nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -9
  3. nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
  4. nautobot/circuits/tests/test_api.py +79 -2
  5. nautobot/circuits/tests/test_filters.py +1 -0
  6. nautobot/core/api/serializers.py +15 -5
  7. nautobot/core/api/views.py +18 -19
  8. nautobot/core/choices.py +1 -1
  9. nautobot/core/filters.py +12 -4
  10. nautobot/core/jobs/__init__.py +125 -3
  11. nautobot/core/management/commands/generate_test_data.py +6 -1
  12. nautobot/core/middleware.py +12 -4
  13. nautobot/core/models/fields.py +12 -2
  14. nautobot/core/settings.py +9 -8
  15. nautobot/core/tables.py +26 -31
  16. nautobot/core/templates/base_django.html +2 -2
  17. nautobot/core/templates/buttons/export.html +57 -30
  18. nautobot/core/templates/generic/object_list.html +2 -2
  19. nautobot/core/templates/generic/object_retrieve.html +8 -1
  20. nautobot/core/templates/home.html +5 -5
  21. nautobot/core/templates/inc/created_updated.html +2 -2
  22. nautobot/core/templates/inc/footer.html +2 -2
  23. nautobot/core/templates/inc/javascript.html +0 -10
  24. nautobot/core/templates/inc/media.html +2 -0
  25. nautobot/core/templates/inc/nav_menu.html +66 -68
  26. nautobot/core/templates/inc/object_details_advanced_panel.html +19 -0
  27. nautobot/core/templates/nautobot_config.py.j2 +10 -4
  28. nautobot/core/templates/panel_table.html +1 -1
  29. nautobot/core/templates/template.css +89 -0
  30. nautobot/core/templates/utilities/templatetags/table_config_form.html +1 -0
  31. nautobot/core/templatetags/buttons.py +7 -2
  32. nautobot/core/templatetags/helpers.py +9 -9
  33. nautobot/core/testing/views.py +34 -4
  34. nautobot/core/tests/integration/test_home.py +1 -43
  35. nautobot/core/tests/integration/test_navbar.py +10 -64
  36. nautobot/core/tests/integration/test_plugin_home.py +4 -5
  37. nautobot/core/tests/integration/test_plugin_navbar.py +20 -16
  38. nautobot/core/tests/integration/test_theme.py +4 -0
  39. nautobot/core/tests/test_api.py +14 -66
  40. nautobot/core/tests/test_filters.py +127 -0
  41. nautobot/core/tests/test_forms.py +4 -4
  42. nautobot/core/tests/test_graphql.py +165 -2
  43. nautobot/core/tests/test_jobs.py +112 -0
  44. nautobot/core/tests/test_openapi.py +6 -0
  45. nautobot/core/tests/test_utils.py +23 -20
  46. nautobot/core/tests/test_views.py +11 -85
  47. nautobot/core/urls.py +6 -1
  48. nautobot/core/utils/data.py +5 -1
  49. nautobot/core/utils/filtering.py +6 -4
  50. nautobot/core/utils/lookup.py +28 -0
  51. nautobot/core/utils/requests.py +2 -3
  52. nautobot/core/views/__init__.py +3 -4
  53. nautobot/core/views/generic.py +15 -11
  54. nautobot/core/views/mixins.py +9 -8
  55. nautobot/core/views/renderers.py +5 -0
  56. nautobot/core/views/utils.py +23 -24
  57. nautobot/dcim/api/serializers.py +8 -4
  58. nautobot/dcim/models/device_components.py +1 -0
  59. nautobot/dcim/models/devices.py +7 -6
  60. nautobot/dcim/navigation.py +10 -165
  61. nautobot/dcim/templates/dcim/location.html +1 -1
  62. nautobot/dcim/tests/features/locations.feature +143 -0
  63. nautobot/dcim/tests/test_api.py +8 -1
  64. nautobot/dcim/tests/test_filters.py +11 -3
  65. nautobot/dcim/views.py +5 -6
  66. nautobot/extras/admin.py +1 -1
  67. nautobot/extras/api/serializers.py +33 -0
  68. nautobot/extras/api/urls.py +6 -0
  69. nautobot/extras/api/views.py +45 -6
  70. nautobot/extras/context_managers.py +34 -8
  71. nautobot/extras/factory.py +28 -2
  72. nautobot/extras/filters/__init__.py +52 -0
  73. nautobot/extras/filters/mixins.py +4 -29
  74. nautobot/extras/forms/forms.py +43 -0
  75. nautobot/extras/jobs.py +39 -17
  76. nautobot/extras/migrations/0100_fileproxy_job_result.py +32 -0
  77. nautobot/extras/migrations/0101_externalintegration.py +61 -0
  78. nautobot/extras/migrations/0102_set_null_objectchange_contenttype.py +32 -0
  79. nautobot/extras/models/__init__.py +2 -0
  80. nautobot/extras/models/change_logging.py +2 -2
  81. nautobot/extras/models/customfields.py +2 -2
  82. nautobot/extras/models/models.py +101 -18
  83. nautobot/extras/models/relationships.py +13 -8
  84. nautobot/extras/navigation.py +17 -29
  85. nautobot/extras/signals.py +80 -59
  86. nautobot/extras/tables.py +28 -2
  87. nautobot/extras/templates/extras/externalintegration_retrieve.html +37 -0
  88. nautobot/extras/templates/extras/inc/jobresult.html +24 -0
  89. nautobot/extras/templates/extras/jobresult.html +24 -0
  90. nautobot/extras/templatetags/computed_fields.py +6 -13
  91. nautobot/extras/templatetags/custom_links.py +19 -12
  92. nautobot/extras/templatetags/job_buttons.py +34 -19
  93. nautobot/extras/templatetags/plugins.py +1 -1
  94. nautobot/extras/test_jobs/file_output.py +16 -0
  95. nautobot/extras/tests/test_api.py +92 -0
  96. nautobot/extras/tests/test_context_managers.py +94 -4
  97. nautobot/extras/tests/test_customfields.py +1 -1
  98. nautobot/extras/tests/test_filters.py +64 -2
  99. nautobot/extras/tests/test_jobs.py +75 -22
  100. nautobot/extras/tests/test_models.py +34 -0
  101. nautobot/extras/tests/test_relationships.py +2 -2
  102. nautobot/extras/tests/test_views.py +204 -4
  103. nautobot/extras/tests/test_webhooks.py +61 -25
  104. nautobot/extras/urls.py +1 -0
  105. nautobot/extras/views.py +27 -13
  106. nautobot/extras/webhooks.py +16 -25
  107. nautobot/ipam/fields.py +5 -0
  108. nautobot/ipam/forms.py +16 -0
  109. nautobot/ipam/models.py +13 -2
  110. nautobot/ipam/navigation.py +2 -59
  111. nautobot/ipam/tables.py +1 -1
  112. nautobot/ipam/templates/ipam/ipaddress.html +0 -9
  113. nautobot/ipam/templates/ipam/prefix.html +0 -9
  114. nautobot/ipam/tests/features/prefixes.feature +134 -0
  115. nautobot/ipam/tests/test_filters.py +5 -10
  116. nautobot/ipam/tests/test_models.py +7 -0
  117. nautobot/ipam/tests/test_views.py +8 -1
  118. nautobot/ipam/views.py +99 -58
  119. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +191 -191
  120. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  121. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
  122. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  123. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +874 -881
  124. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  125. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  126. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  127. nautobot/project-static/css/base.css +138 -99
  128. nautobot/project-static/css/dark.css +65 -6
  129. nautobot/project-static/docs/404.html +45 -17
  130. nautobot/project-static/docs/apps/index.html +45 -17
  131. nautobot/project-static/docs/apps/nautobot-apps.html +45 -17
  132. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +45 -17
  133. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +45 -17
  134. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1598 -1458
  135. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +229 -152
  136. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +46 -18
  137. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +45 -17
  138. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +45 -17
  139. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +45 -17
  140. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +45 -17
  141. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +354 -433
  142. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +67 -39
  143. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +45 -17
  144. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2083 -2234
  145. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1389 -1247
  146. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +45 -17
  147. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +45 -17
  148. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +129 -111
  149. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3601 -3457
  150. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +45 -17
  151. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +45 -17
  152. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +320 -284
  153. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3863 -3801
  154. nautobot/project-static/docs/development/apps/api/configuration-view.html +45 -17
  155. nautobot/project-static/docs/development/apps/api/database-backend-config.html +45 -17
  156. nautobot/project-static/docs/development/apps/api/models/django-admin.html +45 -17
  157. nautobot/project-static/docs/development/apps/api/models/global-search.html +45 -17
  158. nautobot/project-static/docs/development/apps/api/models/graphql.html +45 -17
  159. nautobot/project-static/docs/development/apps/api/models/index.html +45 -17
  160. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +45 -17
  161. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +45 -17
  162. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +45 -17
  163. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +45 -17
  164. nautobot/project-static/docs/development/apps/api/platform-features/index.html +45 -17
  165. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +45 -17
  166. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +45 -17
  167. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +45 -17
  168. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +45 -17
  169. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +45 -17
  170. nautobot/project-static/docs/development/apps/api/prometheus.html +45 -17
  171. nautobot/project-static/docs/development/apps/api/setup.html +45 -17
  172. nautobot/project-static/docs/development/apps/api/testing.html +45 -17
  173. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +45 -17
  174. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +45 -17
  175. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +45 -17
  176. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +45 -17
  177. nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +45 -17
  178. nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +45 -17
  179. nautobot/project-static/docs/development/apps/api/views/base-template.html +45 -17
  180. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +45 -17
  181. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +45 -17
  182. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +45 -17
  183. nautobot/project-static/docs/development/apps/api/views/index.html +45 -17
  184. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +45 -17
  185. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +45 -17
  186. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +45 -17
  187. nautobot/project-static/docs/development/apps/api/views/notes.html +45 -17
  188. nautobot/project-static/docs/development/apps/api/views/rest-api.html +45 -17
  189. nautobot/project-static/docs/development/apps/api/views/urls.html +45 -17
  190. nautobot/project-static/docs/development/apps/api/views/view-overrides.html +45 -17
  191. nautobot/project-static/docs/development/apps/index.html +45 -17
  192. nautobot/project-static/docs/development/apps/migration/code-updates.html +45 -17
  193. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +45 -17
  194. nautobot/project-static/docs/development/apps/migration/from-v1.html +45 -17
  195. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +45 -17
  196. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +45 -17
  197. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +45 -17
  198. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +45 -17
  199. nautobot/project-static/docs/development/apps/porting-from-netbox.html +45 -17
  200. nautobot/project-static/docs/development/core/application-registry.html +45 -17
  201. nautobot/project-static/docs/development/core/best-practices.html +45 -17
  202. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +45 -17
  203. nautobot/project-static/docs/development/core/extending-models.html +45 -17
  204. nautobot/project-static/docs/development/core/generic-views.html +45 -17
  205. nautobot/project-static/docs/development/core/getting-started.html +45 -17
  206. nautobot/project-static/docs/development/core/homepage.html +45 -17
  207. nautobot/project-static/docs/development/core/index.html +45 -17
  208. nautobot/project-static/docs/development/core/model-features.html +45 -17
  209. nautobot/project-static/docs/development/core/natural-keys.html +45 -17
  210. nautobot/project-static/docs/development/core/navigation-menu.html +45 -22
  211. nautobot/project-static/docs/development/core/react-ui.html +45 -17
  212. nautobot/project-static/docs/development/core/release-checklist.html +46 -18
  213. nautobot/project-static/docs/development/core/role-internals.html +45 -17
  214. nautobot/project-static/docs/development/core/style-guide.html +45 -17
  215. nautobot/project-static/docs/development/core/templates.html +45 -17
  216. nautobot/project-static/docs/development/core/testing.html +45 -17
  217. nautobot/project-static/docs/development/core/user-preferences.html +45 -17
  218. nautobot/project-static/docs/development/index.html +45 -17
  219. nautobot/project-static/docs/development/jobs/index.html +281 -235
  220. nautobot/project-static/docs/development/jobs/migration/from-v1.html +45 -17
  221. nautobot/project-static/docs/index.html +45 -17
  222. nautobot/project-static/docs/media/nautobot_application_stack_low_level.png +0 -0
  223. nautobot/project-static/docs/media/nautobot_application_stack_low_level.txt +1 -0
  224. nautobot/project-static/docs/objects.inv +0 -0
  225. nautobot/project-static/docs/release-notes/index.html +48 -20
  226. nautobot/project-static/docs/release-notes/version-1.0.html +45 -17
  227. nautobot/project-static/docs/release-notes/version-1.1.html +45 -17
  228. nautobot/project-static/docs/release-notes/version-1.2.html +45 -17
  229. nautobot/project-static/docs/release-notes/version-1.3.html +45 -17
  230. nautobot/project-static/docs/release-notes/version-1.4.html +45 -17
  231. nautobot/project-static/docs/release-notes/version-1.5.html +45 -17
  232. nautobot/project-static/docs/release-notes/version-1.6.html +46 -18
  233. nautobot/project-static/docs/release-notes/version-2.0.html +372 -199
  234. nautobot/project-static/docs/release-notes/version-2.1.html +5724 -0
  235. nautobot/project-static/docs/requirements.txt +1 -1
  236. nautobot/project-static/docs/search/search_index.json +1 -1
  237. nautobot/project-static/docs/sitemap.xml +247 -237
  238. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  239. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +45 -17
  240. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +45 -17
  241. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +45 -17
  242. nautobot/project-static/docs/user-guide/administration/configuration/index.html +45 -17
  243. nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +45 -17
  244. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +110 -44
  245. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +45 -17
  246. nautobot/project-static/docs/user-guide/administration/guides/caching.html +48 -20
  247. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +45 -17
  248. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +45 -17
  249. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +45 -17
  250. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +45 -17
  251. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +45 -17
  252. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +49 -20
  253. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +45 -17
  254. nautobot/project-static/docs/user-guide/administration/installation/docker.html +45 -17
  255. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +45 -17
  256. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +45 -17
  257. nautobot/project-static/docs/user-guide/administration/installation/index.html +45 -17
  258. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +45 -17
  259. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +45 -17
  260. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +45 -17
  261. nautobot/project-static/docs/user-guide/administration/installation/services.html +45 -17
  262. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +45 -17
  263. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +45 -17
  264. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +45 -17
  265. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +45 -17
  266. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +45 -17
  267. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +45 -17
  268. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +45 -17
  269. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +45 -17
  270. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +45 -17
  271. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +45 -17
  272. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +45 -17
  273. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +45 -17
  274. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +45 -17
  275. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +45 -17
  276. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +45 -17
  277. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +45 -17
  278. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +45 -17
  279. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +45 -17
  280. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +45 -17
  281. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +45 -17
  282. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +45 -17
  283. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +45 -17
  284. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +45 -17
  285. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +45 -17
  286. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +45 -17
  287. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +45 -17
  288. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +45 -17
  289. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +45 -17
  290. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +45 -17
  291. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +45 -17
  292. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +45 -17
  293. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +45 -17
  294. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +45 -17
  295. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +45 -17
  296. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +45 -17
  297. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +45 -17
  298. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +45 -17
  299. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +45 -17
  300. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +45 -17
  301. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +45 -17
  302. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +45 -17
  303. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +45 -17
  304. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +45 -17
  305. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +45 -17
  306. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +45 -17
  307. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +45 -17
  308. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +45 -17
  309. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +45 -17
  310. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +45 -17
  311. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +45 -17
  312. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +45 -17
  313. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +45 -17
  314. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +45 -17
  315. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +45 -17
  316. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +45 -17
  317. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +45 -17
  318. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +45 -17
  319. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +45 -17
  320. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +45 -17
  321. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +45 -17
  322. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +45 -17
  323. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +45 -17
  324. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +45 -17
  325. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +45 -17
  326. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +45 -17
  327. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +45 -17
  328. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +45 -17
  329. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +45 -17
  330. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +45 -17
  331. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +45 -17
  332. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +45 -17
  333. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +45 -17
  334. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +45 -17
  335. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +45 -17
  336. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +45 -17
  337. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +45 -17
  338. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +45 -17
  339. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +45 -17
  340. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +45 -17
  341. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +45 -17
  342. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +45 -17
  343. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +45 -17
  344. nautobot/project-static/docs/user-guide/index.html +45 -17
  345. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +111 -17
  346. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +45 -17
  347. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +45 -17
  348. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +45 -17
  349. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +45 -17
  350. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +48 -20
  351. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +5359 -0
  352. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +48 -20
  353. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +45 -17
  354. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +45 -17
  355. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +45 -17
  356. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +45 -17
  357. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +45 -17
  358. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +45 -17
  359. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +45 -17
  360. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +45 -17
  361. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +45 -17
  362. nautobot/project-static/docs/user-guide/platform-functionality/note.html +45 -17
  363. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +45 -17
  364. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +45 -17
  365. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +114 -45
  366. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +45 -17
  367. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +45 -17
  368. nautobot/project-static/docs/user-guide/platform-functionality/role.html +45 -17
  369. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +45 -17
  370. nautobot/project-static/docs/user-guide/platform-functionality/status.html +45 -17
  371. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +45 -17
  372. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +45 -17
  373. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +45 -17
  374. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +45 -17
  375. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +45 -17
  376. nautobot/project-static/fonts/UFL.txt +96 -0
  377. nautobot/project-static/fonts/Ubuntu-Bold.woff2 +0 -0
  378. nautobot/project-static/fonts/Ubuntu-BoldItalic.woff2 +0 -0
  379. nautobot/project-static/fonts/Ubuntu-Italic.woff2 +0 -0
  380. nautobot/project-static/fonts/Ubuntu-Medium.woff2 +0 -0
  381. nautobot/project-static/fonts/Ubuntu-MediumItalic.woff2 +0 -0
  382. nautobot/project-static/fonts/Ubuntu-Regular.woff2 +0 -0
  383. nautobot/project-static/fonts/UbuntuMono-Bold.woff2 +0 -0
  384. nautobot/project-static/fonts/UbuntuMono-BoldItalic.woff2 +0 -0
  385. nautobot/project-static/fonts/UbuntuMono-Italic.woff2 +0 -0
  386. nautobot/project-static/fonts/UbuntuMono-Regular.woff2 +0 -0
  387. nautobot/project-static/img/dark-theme.png +0 -0
  388. nautobot/project-static/img/light-theme.png +0 -0
  389. nautobot/project-static/img/nautobot_chevron.svg +5 -0
  390. nautobot/project-static/img/nautobot_chevron_header.svg +5 -0
  391. nautobot/project-static/img/system-theme.png +0 -0
  392. nautobot/tenancy/navigation.py +0 -13
  393. nautobot/ui/package-lock.json +2 -2
  394. nautobot/ui/package.json +1 -1
  395. nautobot/users/admin.py +44 -0
  396. nautobot/users/migrations/0007_alter_objectpermission_object_types.py +33 -0
  397. nautobot/users/models.py +3 -2
  398. nautobot/virtualization/navigation.py +1 -33
  399. nautobot/virtualization/tests/test_api.py +1 -1
  400. nautobot/virtualization/tests/test_filters.py +1 -1
  401. {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/METADATA +2 -2
  402. {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/RECORD +405 -786
  403. CHANGELOG.md +0 -3
  404. CONTRIBUTING.md +0 -3
  405. NOTICE +0 -8
  406. nautobot/docs/apps/index.md +0 -22
  407. nautobot/docs/apps/nautobot-apps.md +0 -10
  408. nautobot/docs/assets/app-icons/icon-ChatOps.png +0 -0
  409. nautobot/docs/assets/app-icons/icon-DataValidationEngine.png +0 -0
  410. nautobot/docs/assets/app-icons/icon-DeviceLifecycle.png +0 -0
  411. nautobot/docs/assets/app-icons/icon-DeviceOnboarding.png +0 -0
  412. nautobot/docs/assets/app-icons/icon-FirewallModels.png +0 -0
  413. nautobot/docs/assets/app-icons/icon-GoldenConfiguration.png +0 -0
  414. nautobot/docs/assets/app-icons/icon-NautobotPluginNornir.png +0 -0
  415. nautobot/docs/assets/app-icons/icon-SSoT.png +0 -0
  416. nautobot/docs/assets/extra.css +0 -139
  417. nautobot/docs/assets/favicon.ico +0 -0
  418. nautobot/docs/assets/nautobot_logo.png +0 -0
  419. nautobot/docs/assets/nautobot_logo.svg +0 -131
  420. nautobot/docs/assets/networktocode_bw.png +0 -0
  421. nautobot/docs/assets/overrides/partials/copyright.html +0 -20
  422. nautobot/docs/development/apps/api/configuration-view.md +0 -35
  423. nautobot/docs/development/apps/api/database-backend-config.md +0 -26
  424. nautobot/docs/development/apps/api/models/django-admin.md +0 -20
  425. nautobot/docs/development/apps/api/models/global-search.md +0 -11
  426. nautobot/docs/development/apps/api/models/graphql.md +0 -97
  427. nautobot/docs/development/apps/api/models/index.md +0 -81
  428. nautobot/docs/development/apps/api/nautobot-app-config.md +0 -84
  429. nautobot/docs/development/apps/api/platform-features/custom-validators.md +0 -30
  430. nautobot/docs/development/apps/api/platform-features/filter-extensions.md +0 -49
  431. nautobot/docs/development/apps/api/platform-features/git-repository-content.md +0 -62
  432. nautobot/docs/development/apps/api/platform-features/index.md +0 -1
  433. nautobot/docs/development/apps/api/platform-features/jinja2-filters.md +0 -28
  434. nautobot/docs/development/apps/api/platform-features/jobs.md +0 -29
  435. nautobot/docs/development/apps/api/platform-features/populating-extensibility-features.md +0 -58
  436. nautobot/docs/development/apps/api/platform-features/secrets-providers.md +0 -64
  437. nautobot/docs/development/apps/api/platform-features/uniquely-identify-objects.md +0 -63
  438. nautobot/docs/development/apps/api/prometheus.md +0 -25
  439. nautobot/docs/development/apps/api/setup.md +0 -132
  440. nautobot/docs/development/apps/api/testing.md +0 -55
  441. nautobot/docs/development/apps/api/ui-extensions/banners.md +0 -26
  442. nautobot/docs/development/apps/api/ui-extensions/home-page.md +0 -9
  443. nautobot/docs/development/apps/api/ui-extensions/index.md +0 -1
  444. nautobot/docs/development/apps/api/ui-extensions/navigation.md +0 -15
  445. nautobot/docs/development/apps/api/ui-extensions/object-detail-views.md +0 -74
  446. nautobot/docs/development/apps/api/ui-extensions/tabs.md +0 -52
  447. nautobot/docs/development/apps/api/views/base-template.md +0 -38
  448. nautobot/docs/development/apps/api/views/core-view-overrides.md +0 -26
  449. nautobot/docs/development/apps/api/views/django-generic-views.md +0 -23
  450. nautobot/docs/development/apps/api/views/help-documentation.md +0 -16
  451. nautobot/docs/development/apps/api/views/index.md +0 -3
  452. nautobot/docs/development/apps/api/views/nautobot-generic-views.md +0 -35
  453. nautobot/docs/development/apps/api/views/nautobotuiviewset.md +0 -147
  454. nautobot/docs/development/apps/api/views/nautobotuiviewsetrouter.md +0 -41
  455. nautobot/docs/development/apps/api/views/notes.md +0 -25
  456. nautobot/docs/development/apps/api/views/rest-api.md +0 -64
  457. nautobot/docs/development/apps/api/views/urls.md +0 -26
  458. nautobot/docs/development/apps/api/views/view-overrides.md +0 -50
  459. nautobot/docs/development/apps/index.md +0 -75
  460. nautobot/docs/development/apps/migration/code-updates.md +0 -160
  461. nautobot/docs/development/apps/migration/dependency-updates.md +0 -13
  462. nautobot/docs/development/apps/migration/from-v1.md +0 -56
  463. nautobot/docs/development/apps/migration/model-updates/dcim.md +0 -285
  464. nautobot/docs/development/apps/migration/model-updates/extras.md +0 -30
  465. nautobot/docs/development/apps/migration/model-updates/global.md +0 -5
  466. nautobot/docs/development/apps/migration/model-updates/ipam.md +0 -22
  467. nautobot/docs/development/apps/porting-from-netbox.md +0 -23
  468. nautobot/docs/development/core/application-registry.md +0 -216
  469. nautobot/docs/development/core/best-practices.md +0 -469
  470. nautobot/docs/development/core/docker-compose-advanced-use-cases.md +0 -228
  471. nautobot/docs/development/core/extending-models.md +0 -93
  472. nautobot/docs/development/core/generic-views.md +0 -65
  473. nautobot/docs/development/core/getting-started.md +0 -859
  474. nautobot/docs/development/core/homepage.md +0 -63
  475. nautobot/docs/development/core/index.md +0 -334
  476. nautobot/docs/development/core/model-features.md +0 -44
  477. nautobot/docs/development/core/natural-keys.md +0 -121
  478. nautobot/docs/development/core/navigation-menu.md +0 -142
  479. nautobot/docs/development/core/react-ui.md +0 -137
  480. nautobot/docs/development/core/release-checklist.md +0 -312
  481. nautobot/docs/development/core/role-internals.md +0 -28
  482. nautobot/docs/development/core/style-guide.md +0 -200
  483. nautobot/docs/development/core/templates.md +0 -101
  484. nautobot/docs/development/core/testing.md +0 -238
  485. nautobot/docs/development/core/user-preferences.md +0 -11
  486. nautobot/docs/development/index.md +0 -1
  487. nautobot/docs/development/jobs/index.md +0 -835
  488. nautobot/docs/development/jobs/migration/from-v1.md +0 -160
  489. nautobot/docs/generate_code_reference_pages.py +0 -20
  490. nautobot/docs/img/edge_dev_circuit_relationship.png +0 -0
  491. nautobot/docs/img/leaf_dev_no_circuit_relationship.png +0 -0
  492. nautobot/docs/img/relationship_w_json_filter.png +0 -0
  493. nautobot/docs/index.md +0 -105
  494. nautobot/docs/media/admin_ui_run_permission.png +0 -0
  495. nautobot/docs/media/development/homepage_changelog_panel.png +0 -0
  496. nautobot/docs/media/development/homepage_dcim_panel.png +0 -0
  497. nautobot/docs/media/development/index_bug_wf.jpg +0 -0
  498. nautobot/docs/media/development/index_feature_request_wf.jpg +0 -0
  499. nautobot/docs/media/development/index_release_cadence.drawio +0 -90
  500. nautobot/docs/media/development/index_release_cadence.jpg +0 -0
  501. nautobot/docs/media/installation/nautobot_ui_admin.png +0 -0
  502. nautobot/docs/media/installation/nautobot_ui_guest.png +0 -0
  503. nautobot/docs/media/models/dcim_cable_trace.png +0 -0
  504. nautobot/docs/media/models/dcim_cable_trace_circuit.png +0 -0
  505. nautobot/docs/media/models/dynamicgroup_filtering_01.png +0 -0
  506. nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_01.png +0 -0
  507. nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_02.png +0 -0
  508. nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_03.png +0 -0
  509. nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_04.png +0 -0
  510. nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_05.png +0 -0
  511. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_01.png +0 -0
  512. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_02.png +0 -0
  513. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_03.png +0 -0
  514. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_04.png +0 -0
  515. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_05.png +0 -0
  516. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_06.png +0 -0
  517. nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_07.png +0 -0
  518. nautobot/docs/media/models/dynamicgroup_workflow_basic_01.png +0 -0
  519. nautobot/docs/media/models/dynamicgroup_workflow_basic_02.png +0 -0
  520. nautobot/docs/media/models/dynamicgroup_workflow_basic_03.png +0 -0
  521. nautobot/docs/media/models/jobbutton_form.png +0 -0
  522. nautobot/docs/media/models/site_jobbuttons.png +0 -0
  523. nautobot/docs/media/nautobot_application_stack_high_level.drawio +0 -1
  524. nautobot/docs/media/nautobot_application_stack_high_level.png +0 -0
  525. nautobot/docs/media/nautobot_application_stack_low_level.drawio +0 -1
  526. nautobot/docs/media/nautobot_application_stack_low_level.png +0 -0
  527. nautobot/docs/media/nautobot_chatops.gif +0 -0
  528. nautobot/docs/media/nautobot_config_context.gif +0 -0
  529. nautobot/docs/media/nautobot_golden_config.gif +0 -0
  530. nautobot/docs/media/nautobot_graphql.gif +0 -0
  531. nautobot/docs/media/nautobot_mainpage.gif +0 -0
  532. nautobot/docs/media/nautobot_prefix_hierarchy.gif +0 -0
  533. nautobot/docs/media/plugins/plugin_admin_config.png +0 -0
  534. nautobot/docs/media/plugins/plugin_admin_ui.png +0 -0
  535. nautobot/docs/media/plugins/plugin_rest_api_endpoint.png +0 -0
  536. nautobot/docs/media/power_distribution.png +0 -0
  537. nautobot/docs/media/ss_config_contexts.png +0 -0
  538. nautobot/docs/media/ss_graphiql.png +0 -0
  539. nautobot/docs/media/ss_main_page.png +0 -0
  540. nautobot/docs/media/ss_plugin_chatops.png +0 -0
  541. nautobot/docs/media/ss_plugin_golden_config.png +0 -0
  542. nautobot/docs/media/ss_prefix_hierarchy.png +0 -0
  543. nautobot/docs/media/user-guide/administration/guides/s3-django-storage/user-guide-s3-1.png +0 -0
  544. nautobot/docs/media/user-guide/administration/guides/s3-django-storage/user-guide-s3-2.png +0 -0
  545. nautobot/docs/media/user-guide/administration/upgrading/from-v1/ipam/tenant-affinity.png +0 -0
  546. nautobot/docs/nautobot_logo.png +0 -0
  547. nautobot/docs/nautobot_logo.svg +0 -131
  548. nautobot/docs/release-notes/index.md +0 -3
  549. nautobot/docs/release-notes/version-1.0.md +0 -530
  550. nautobot/docs/release-notes/version-1.1.md +0 -337
  551. nautobot/docs/release-notes/version-1.2.md +0 -509
  552. nautobot/docs/release-notes/version-1.3.md +0 -554
  553. nautobot/docs/release-notes/version-1.4.md +0 -677
  554. nautobot/docs/release-notes/version-1.5.md +0 -840
  555. nautobot/docs/release-notes/version-1.6.md +0 -290
  556. nautobot/docs/release-notes/version-2.0.md +0 -1359
  557. nautobot/docs/requirements.txt +0 -12
  558. nautobot/docs/user-guide/administration/configuration/authentication/ldap.md +0 -286
  559. nautobot/docs/user-guide/administration/configuration/authentication/remote.md +0 -46
  560. nautobot/docs/user-guide/administration/configuration/authentication/sso.md +0 -528
  561. nautobot/docs/user-guide/administration/configuration/index.md +0 -190
  562. nautobot/docs/user-guide/administration/configuration/node-configuration.md +0 -31
  563. nautobot/docs/user-guide/administration/configuration/optional-settings.md +0 -1302
  564. nautobot/docs/user-guide/administration/configuration/required-settings.md +0 -244
  565. nautobot/docs/user-guide/administration/guides/caching.md +0 -108
  566. nautobot/docs/user-guide/administration/guides/celery-queues.md +0 -42
  567. nautobot/docs/user-guide/administration/guides/healthcheck.md +0 -11
  568. nautobot/docs/user-guide/administration/guides/permissions.md +0 -98
  569. nautobot/docs/user-guide/administration/guides/prometheus-metrics.md +0 -55
  570. nautobot/docs/user-guide/administration/guides/replicating-nautobot.md +0 -70
  571. nautobot/docs/user-guide/administration/guides/s3-django-storage.md +0 -145
  572. nautobot/docs/user-guide/administration/installation/app-install.md +0 -94
  573. nautobot/docs/user-guide/administration/installation/docker.md +0 -286
  574. nautobot/docs/user-guide/administration/installation/external-authentication.md +0 -9
  575. nautobot/docs/user-guide/administration/installation/http-server.md +0 -279
  576. nautobot/docs/user-guide/administration/installation/index.md +0 -101
  577. nautobot/docs/user-guide/administration/installation/install_system.md +0 -493
  578. nautobot/docs/user-guide/administration/installation/nautobot.md +0 -367
  579. nautobot/docs/user-guide/administration/installation/selinux-troubleshooting.md +0 -194
  580. nautobot/docs/user-guide/administration/installation/services.md +0 -340
  581. nautobot/docs/user-guide/administration/migration/migrating-from-netbox.md +0 -336
  582. nautobot/docs/user-guide/administration/migration/migrating-from-postgresql.md +0 -122
  583. nautobot/docs/user-guide/administration/tools/nautobot-server.md +0 -858
  584. nautobot/docs/user-guide/administration/tools/nautobot-shell.md +0 -263
  585. nautobot/docs/user-guide/administration/upgrading/database-backup.md +0 -11
  586. nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.md +0 -55
  587. nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.md +0 -73
  588. nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.md +0 -211
  589. nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/index.md +0 -16
  590. nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.md +0 -157
  591. nautobot/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.md +0 -153
  592. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-behavior-changes.yaml +0 -82
  593. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-removed-fields.yaml +0 -175
  594. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-renamed-fields.yaml +0 -124
  595. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-location-changes.yaml +0 -241
  596. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-removals.yaml +0 -57
  597. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-renames.yaml +0 -5
  598. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-behavior-changes.yaml +0 -76
  599. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-removed-fields.yaml +0 -202
  600. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-renamed-fields.yaml +0 -343
  601. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-corrected-fields.yaml +0 -31
  602. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-enhanced-fields.yaml +0 -244
  603. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-removed-fields.yaml +0 -595
  604. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-renamed-fields.yaml +0 -253
  605. nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-logging-renamed-loggers.yaml +0 -23
  606. nautobot/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.md +0 -574
  607. nautobot/docs/user-guide/administration/upgrading/upgrading.md +0 -127
  608. nautobot/docs/user-guide/core-data-model/circuits/circuit.md +0 -19
  609. nautobot/docs/user-guide/core-data-model/circuits/circuittermination.md +0 -10
  610. nautobot/docs/user-guide/core-data-model/circuits/circuittype.md +0 -8
  611. nautobot/docs/user-guide/core-data-model/circuits/provider.md +0 -5
  612. nautobot/docs/user-guide/core-data-model/circuits/providernetwork.md +0 -7
  613. nautobot/docs/user-guide/core-data-model/dcim/cable.md +0 -43
  614. nautobot/docs/user-guide/core-data-model/dcim/consoleport.md +0 -8
  615. nautobot/docs/user-guide/core-data-model/dcim/consoleporttemplate.md +0 -6
  616. nautobot/docs/user-guide/core-data-model/dcim/consoleserverport.md +0 -8
  617. nautobot/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.md +0 -6
  618. nautobot/docs/user-guide/core-data-model/dcim/device.md +0 -29
  619. nautobot/docs/user-guide/core-data-model/dcim/devicebay.md +0 -11
  620. nautobot/docs/user-guide/core-data-model/dcim/devicebaytemplate.md +0 -6
  621. nautobot/docs/user-guide/core-data-model/dcim/deviceredundancygroup.md +0 -279
  622. nautobot/docs/user-guide/core-data-model/dcim/devicetype.md +0 -44
  623. nautobot/docs/user-guide/core-data-model/dcim/frontport.md +0 -6
  624. nautobot/docs/user-guide/core-data-model/dcim/frontporttemplate.md +0 -6
  625. nautobot/docs/user-guide/core-data-model/dcim/interface.md +0 -34
  626. nautobot/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.md +0 -24
  627. nautobot/docs/user-guide/core-data-model/dcim/interfacetemplate.md +0 -6
  628. nautobot/docs/user-guide/core-data-model/dcim/inventoryitem.md +0 -10
  629. nautobot/docs/user-guide/core-data-model/dcim/location.md +0 -15
  630. nautobot/docs/user-guide/core-data-model/dcim/locationtype.md +0 -43
  631. nautobot/docs/user-guide/core-data-model/dcim/manufacturer.md +0 -3
  632. nautobot/docs/user-guide/core-data-model/dcim/platform.md +0 -19
  633. nautobot/docs/user-guide/core-data-model/dcim/powerfeed.md +0 -25
  634. nautobot/docs/user-guide/core-data-model/dcim/poweroutlet.md +0 -14
  635. nautobot/docs/user-guide/core-data-model/dcim/poweroutlettemplate.md +0 -6
  636. nautobot/docs/user-guide/core-data-model/dcim/powerpanel.md +0 -12
  637. nautobot/docs/user-guide/core-data-model/dcim/powerport.md +0 -15
  638. nautobot/docs/user-guide/core-data-model/dcim/powerporttemplate.md +0 -6
  639. nautobot/docs/user-guide/core-data-model/dcim/rack.md +0 -41
  640. nautobot/docs/user-guide/core-data-model/dcim/rackgroup.md +0 -7
  641. nautobot/docs/user-guide/core-data-model/dcim/rackreservation.md +0 -3
  642. nautobot/docs/user-guide/core-data-model/dcim/rearport.md +0 -9
  643. nautobot/docs/user-guide/core-data-model/dcim/rearporttemplate.md +0 -6
  644. nautobot/docs/user-guide/core-data-model/dcim/virtualchassis.md +0 -8
  645. nautobot/docs/user-guide/core-data-model/extras/configcontext.md +0 -78
  646. nautobot/docs/user-guide/core-data-model/extras/configcontextschema.md +0 -73
  647. nautobot/docs/user-guide/core-data-model/ipam/ipaddress.md +0 -69
  648. nautobot/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio +0 -1
  649. nautobot/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.svg +0 -4
  650. nautobot/docs/user-guide/core-data-model/ipam/namespace.md +0 -18
  651. nautobot/docs/user-guide/core-data-model/ipam/prefix.md +0 -65
  652. nautobot/docs/user-guide/core-data-model/ipam/rir.md +0 -10
  653. nautobot/docs/user-guide/core-data-model/ipam/routetarget.md +0 -5
  654. nautobot/docs/user-guide/core-data-model/ipam/service.md +0 -8
  655. nautobot/docs/user-guide/core-data-model/ipam/vlan.md +0 -17
  656. nautobot/docs/user-guide/core-data-model/ipam/vlangroup.md +0 -5
  657. nautobot/docs/user-guide/core-data-model/ipam/vrf.md +0 -15
  658. nautobot/docs/user-guide/core-data-model/tenancy/tenant.md +0 -20
  659. nautobot/docs/user-guide/core-data-model/tenancy/tenantgroup.md +0 -5
  660. nautobot/docs/user-guide/core-data-model/virtualization/cluster.md +0 -5
  661. nautobot/docs/user-guide/core-data-model/virtualization/clustergroup.md +0 -3
  662. nautobot/docs/user-guide/core-data-model/virtualization/clustertype.md +0 -3
  663. nautobot/docs/user-guide/core-data-model/virtualization/virtualmachine.md +0 -17
  664. nautobot/docs/user-guide/core-data-model/virtualization/vminterface.md +0 -19
  665. nautobot/docs/user-guide/feature-guides/custom-fields.md +0 -350
  666. nautobot/docs/user-guide/feature-guides/getting-started/creating-devices.md +0 -130
  667. nautobot/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.md +0 -113
  668. nautobot/docs/user-guide/feature-guides/getting-started/index.md +0 -29
  669. nautobot/docs/user-guide/feature-guides/getting-started/interfaces.md +0 -100
  670. nautobot/docs/user-guide/feature-guides/getting-started/ipam.md +0 -104
  671. nautobot/docs/user-guide/feature-guides/getting-started/platforms.md +0 -78
  672. nautobot/docs/user-guide/feature-guides/getting-started/search-bar.md +0 -40
  673. nautobot/docs/user-guide/feature-guides/getting-started/tenants.md +0 -40
  674. nautobot/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.md +0 -87
  675. nautobot/docs/user-guide/feature-guides/git-data-source.md +0 -307
  676. nautobot/docs/user-guide/feature-guides/graphql.md +0 -342
  677. nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_choices.png +0 -0
  678. nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_grouped.png +0 -0
  679. nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_label.png +0 -0
  680. nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_edit.png +0 -0
  681. nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_select.png +0 -0
  682. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/1-create-location-type.png +0 -0
  683. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/10-add-platform.png +0 -0
  684. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/11-platforms-page.png +0 -0
  685. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/12-add-tenant.png +0 -0
  686. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/13-assign-tenant-to-device.png +0 -0
  687. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/14-assign-tenant-to-device-2.png +0 -0
  688. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/15-create-device-type.png +0 -0
  689. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/16-interface-templates.png +0 -0
  690. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/17-templated-interfaces.png +0 -0
  691. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/18-assign-device-type.png +0 -0
  692. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/19-edit-ints-for-lag.png +0 -0
  693. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/2-create-manufacturer.png +0 -0
  694. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/20-ints-int-lag.png +0 -0
  695. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/21-device-type.png +0 -0
  696. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/22-create-vlans.png +0 -0
  697. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/23-create-vlans-2.png +0 -0
  698. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/24-vlan-main-page.png +0 -0
  699. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/25-add-vlan-to-interface.png +0 -0
  700. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/26-add-vlan-to-interface-2.png +0 -0
  701. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/27-add-rir.png +0 -0
  702. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/3-create-role.png +0 -0
  703. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/30-add-prefix.png +0 -0
  704. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/32-add-ip-addr.png +0 -0
  705. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/33-assign-address.png +0 -0
  706. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/34-assign-address-2.png +0 -0
  707. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/35-assign-address-3.png +0 -0
  708. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/36-verify-address.png +0 -0
  709. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/37-verify-prefix.png +0 -0
  710. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/38-verify-prefix2.png +0 -0
  711. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/39-address-search.png +0 -0
  712. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/4-create-device-type.png +0 -0
  713. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/40-addr-main-page.png +0 -0
  714. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/41-device-search-results.png +0 -0
  715. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/42-address-search-v2.png +0 -0
  716. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/43-get-to-device-main-page.png +0 -0
  717. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/44-add-platform.png +0 -0
  718. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/5-create-device.png +0 -0
  719. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/6-create-location.png +0 -0
  720. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/7-location-type-page.png +0 -0
  721. nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/8-location-page.png +0 -0
  722. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/01-git-data-source.png +0 -0
  723. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/02-git-data-source.png +0 -0
  724. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/03-git-data-source.png +0 -0
  725. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/04-git-data-source.png +0 -0
  726. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/05-git-data-source.png +0 -0
  727. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/06-git-data-source.png +0 -0
  728. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/07-git-data-source.png +0 -0
  729. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/08-git-data-source.png +0 -0
  730. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/09-git-data-source.png +0 -0
  731. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/10-git-data-source.png +0 -0
  732. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/11-git-data-source.png +0 -0
  733. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/12-git-data-source.png +0 -0
  734. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/13-git-data-source.png +0 -0
  735. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/14-git-data-source.png +0 -0
  736. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/15-git-data-source.png +0 -0
  737. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/16-git-data-source.png +0 -0
  738. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/17-git-data-source.png +0 -0
  739. nautobot/docs/user-guide/feature-guides/images/git-as-data-source/18-git-data-source.png +0 -0
  740. nautobot/docs/user-guide/feature-guides/images/graphql/00-graphiql.png +0 -0
  741. nautobot/docs/user-guide/feature-guides/images/graphql/01-graphiql-explorer.png +0 -0
  742. nautobot/docs/user-guide/feature-guides/images/graphql/02-graphiql-explorer-device-query.png +0 -0
  743. nautobot/docs/user-guide/feature-guides/images/graphql/03-graphiql-explorer-device-attributes.png +0 -0
  744. nautobot/docs/user-guide/feature-guides/images/graphql/04-graphql-query-01.png +0 -0
  745. nautobot/docs/user-guide/feature-guides/images/graphql/05-graphiql-autocomplete.png +0 -0
  746. nautobot/docs/user-guide/feature-guides/images/graphql/06-graphql-query-02.png +0 -0
  747. nautobot/docs/user-guide/feature-guides/images/graphql/07-graphql-query-03.png +0 -0
  748. nautobot/docs/user-guide/feature-guides/images/graphql/08-graphql-query-04.png +0 -0
  749. nautobot/docs/user-guide/feature-guides/images/graphql/09-graphql-query-05.png +0 -0
  750. nautobot/docs/user-guide/feature-guides/images/graphql/10-graphql-swagger.png +0 -0
  751. nautobot/docs/user-guide/feature-guides/images/graphql/11-graphql-query-06.png +0 -0
  752. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/ip_merge_button.png +0 -0
  753. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_button.png +0 -0
  754. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_view.png +0 -0
  755. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/no_more_dup_ips.png +0 -0
  756. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/skip_button.png +0 -0
  757. nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/unselect_ips.png +0 -0
  758. nautobot/docs/user-guide/feature-guides/images/relationships/01-relationships.png +0 -0
  759. nautobot/docs/user-guide/feature-guides/images/relationships/02-relationships.png +0 -0
  760. nautobot/docs/user-guide/feature-guides/images/relationships/03-relationships.png +0 -0
  761. nautobot/docs/user-guide/feature-guides/images/relationships/04-relationships.png +0 -0
  762. nautobot/docs/user-guide/feature-guides/images/relationships/05-relationships.png +0 -0
  763. nautobot/docs/user-guide/feature-guides/images/relationships/06-relationships.png +0 -0
  764. nautobot/docs/user-guide/feature-guides/images/relationships/07-relationships.png +0 -0
  765. nautobot/docs/user-guide/feature-guides/images/relationships/08-relationships.png +0 -0
  766. nautobot/docs/user-guide/feature-guides/images/relationships/09-relationships.png +0 -0
  767. nautobot/docs/user-guide/feature-guides/images/relationships/10-relationships.png +0 -0
  768. nautobot/docs/user-guide/feature-guides/images/relationships/11-relationships.png +0 -0
  769. nautobot/docs/user-guide/feature-guides/ip-address-merge-tool.md +0 -63
  770. nautobot/docs/user-guide/feature-guides/relationships.md +0 -125
  771. nautobot/docs/user-guide/index.md +0 -1
  772. nautobot/docs/user-guide/platform-functionality/change-logging.md +0 -21
  773. nautobot/docs/user-guide/platform-functionality/computedfield.md +0 -89
  774. nautobot/docs/user-guide/platform-functionality/customfield.md +0 -123
  775. nautobot/docs/user-guide/platform-functionality/customlink.md +0 -59
  776. nautobot/docs/user-guide/platform-functionality/dynamicgroup.md +0 -660
  777. nautobot/docs/user-guide/platform-functionality/exporttemplate.md +0 -55
  778. nautobot/docs/user-guide/platform-functionality/gitrepository.md +0 -353
  779. nautobot/docs/user-guide/platform-functionality/graphql.md +0 -259
  780. nautobot/docs/user-guide/platform-functionality/graphqlquery.md +0 -28
  781. nautobot/docs/user-guide/platform-functionality/imageattachment.md +0 -10
  782. nautobot/docs/user-guide/platform-functionality/jobs/index.md +0 -193
  783. nautobot/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.md +0 -78
  784. nautobot/docs/user-guide/platform-functionality/jobs/jobbutton.md +0 -79
  785. nautobot/docs/user-guide/platform-functionality/jobs/jobhook.md +0 -15
  786. nautobot/docs/user-guide/platform-functionality/jobs/models.md +0 -65
  787. nautobot/docs/user-guide/platform-functionality/napalm.md +0 -85
  788. nautobot/docs/user-guide/platform-functionality/note.md +0 -7
  789. nautobot/docs/user-guide/platform-functionality/relationship.md +0 -158
  790. nautobot/docs/user-guide/platform-functionality/rest-api/authentication.md +0 -67
  791. nautobot/docs/user-guide/platform-functionality/rest-api/filtering.md +0 -142
  792. nautobot/docs/user-guide/platform-functionality/rest-api/overview.md +0 -1045
  793. nautobot/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.md +0 -9
  794. nautobot/docs/user-guide/platform-functionality/role.md +0 -17
  795. nautobot/docs/user-guide/platform-functionality/secret.md +0 -136
  796. nautobot/docs/user-guide/platform-functionality/status.md +0 -92
  797. nautobot/docs/user-guide/platform-functionality/tag.md +0 -62
  798. nautobot/docs/user-guide/platform-functionality/template-filters.md +0 -306
  799. nautobot/docs/user-guide/platform-functionality/users/objectpermission.md +0 -56
  800. nautobot/docs/user-guide/platform-functionality/users/token.md +0 -21
  801. nautobot/docs/user-guide/platform-functionality/webhook.md +0 -137
  802. nautobot/project-static/docs/media/nautobot_application_stack_low_level.drawio +0 -1
  803. nautobot/project-static/docs/media/nautobot_chatops.gif +0 -0
  804. nautobot/project-static/docs/media/nautobot_config_context.gif +0 -0
  805. nautobot/project-static/docs/media/nautobot_golden_config.gif +0 -0
  806. nautobot/project-static/docs/media/nautobot_graphql.gif +0 -0
  807. nautobot/project-static/docs/media/nautobot_mainpage.gif +0 -0
  808. nautobot/project-static/docs/media/nautobot_prefix_hierarchy.gif +0 -0
  809. nautobot-2.0.4.dist-info/LICENSE.txt +0 -177
  810. /LICENSE.txt → /nautobot-2.1.0b1.dist-info/LICENSE.txt +0 -0
  811. {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/WHEEL +0 -0
  812. {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/entry_points.txt +0 -0
@@ -17,7 +17,7 @@
17
17
  <link rel="next" href="forms.html">
18
18
 
19
19
  <link rel="icon" href="../../../assets/favicon.ico">
20
- <meta name="generator" content="mkdocs-1.4.3, mkdocs-material-9.1.20">
20
+ <meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.1.21">
21
21
 
22
22
 
23
23
 
@@ -2659,6 +2659,20 @@
2659
2659
 
2660
2660
 
2661
2661
 
2662
+ <li class="md-nav__item">
2663
+ <a href="../../../user-guide/platform-functionality/externalintegration.html" class="md-nav__link">
2664
+ External Integrations
2665
+ </a>
2666
+ </li>
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2662
2676
  <li class="md-nav__item">
2663
2677
  <a href="../../../user-guide/platform-functionality/gitrepository.html" class="md-nav__link">
2664
2678
  Git Repositories
@@ -2679,7 +2693,7 @@
2679
2693
 
2680
2694
 
2681
2695
 
2682
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_8" >
2696
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_9" >
2683
2697
 
2684
2698
 
2685
2699
 
@@ -2688,14 +2702,14 @@
2688
2702
  <div class="md-nav__link md-nav__link--index ">
2689
2703
  <a href="../../../user-guide/platform-functionality/graphql.html">GraphQL</a>
2690
2704
 
2691
- <label for="__nav_2_4_8">
2705
+ <label for="__nav_2_4_9">
2692
2706
  <span class="md-nav__icon md-icon"></span>
2693
2707
  </label>
2694
2708
 
2695
2709
  </div>
2696
2710
 
2697
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_8_label" aria-expanded="false">
2698
- <label class="md-nav__title" for="__nav_2_4_8">
2711
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_9_label" aria-expanded="false">
2712
+ <label class="md-nav__title" for="__nav_2_4_9">
2699
2713
  <span class="md-nav__icon md-icon"></span>
2700
2714
  GraphQL
2701
2715
  </label>
@@ -2747,7 +2761,7 @@
2747
2761
 
2748
2762
 
2749
2763
 
2750
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_10" >
2764
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_11" >
2751
2765
 
2752
2766
 
2753
2767
 
@@ -2756,14 +2770,14 @@
2756
2770
  <div class="md-nav__link md-nav__link--index ">
2757
2771
  <a href="../../../user-guide/platform-functionality/jobs/index.html">Jobs</a>
2758
2772
 
2759
- <label for="__nav_2_4_10">
2773
+ <label for="__nav_2_4_11">
2760
2774
  <span class="md-nav__icon md-icon"></span>
2761
2775
  </label>
2762
2776
 
2763
2777
  </div>
2764
2778
 
2765
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_10_label" aria-expanded="false">
2766
- <label class="md-nav__title" for="__nav_2_4_10">
2779
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_11_label" aria-expanded="false">
2780
+ <label class="md-nav__title" for="__nav_2_4_11">
2767
2781
  <span class="md-nav__icon md-icon"></span>
2768
2782
  Jobs
2769
2783
  </label>
@@ -2885,7 +2899,7 @@
2885
2899
 
2886
2900
 
2887
2901
 
2888
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_14" >
2902
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_15" >
2889
2903
 
2890
2904
 
2891
2905
 
@@ -2894,14 +2908,14 @@
2894
2908
  <div class="md-nav__link md-nav__link--index ">
2895
2909
  <a href="../../../user-guide/platform-functionality/rest-api/overview.html">REST API</a>
2896
2910
 
2897
- <label for="__nav_2_4_14">
2911
+ <label for="__nav_2_4_15">
2898
2912
  <span class="md-nav__icon md-icon"></span>
2899
2913
  </label>
2900
2914
 
2901
2915
  </div>
2902
2916
 
2903
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_14_label" aria-expanded="false">
2904
- <label class="md-nav__title" for="__nav_2_4_14">
2917
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_15_label" aria-expanded="false">
2918
+ <label class="md-nav__title" for="__nav_2_4_15">
2905
2919
  <span class="md-nav__icon md-icon"></span>
2906
2920
  REST API
2907
2921
  </label>
@@ -3037,17 +3051,17 @@
3037
3051
 
3038
3052
 
3039
3053
 
3040
- <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_20" >
3054
+ <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_4_21" >
3041
3055
 
3042
3056
 
3043
3057
 
3044
- <label class="md-nav__link" for="__nav_2_4_20" id="__nav_2_4_20_label" tabindex="0">
3058
+ <label class="md-nav__link" for="__nav_2_4_21" id="__nav_2_4_21_label" tabindex="0">
3045
3059
  Users
3046
3060
  <span class="md-nav__icon md-icon"></span>
3047
3061
  </label>
3048
3062
 
3049
- <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_20_label" aria-expanded="false">
3050
- <label class="md-nav__title" for="__nav_2_4_20">
3063
+ <nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_4_21_label" aria-expanded="false">
3064
+ <label class="md-nav__title" for="__nav_2_4_21">
3051
3065
  <span class="md-nav__icon md-icon"></span>
3052
3066
  Users
3053
3067
  </label>
@@ -4316,19 +4330,6 @@
4316
4330
  StatusFilter
4317
4331
  </a>
4318
4332
 
4319
- <nav class="md-nav" aria-label="StatusFilter">
4320
- <ul class="md-nav__list">
4321
-
4322
- <li class="md-nav__item">
4323
- <a href="#nautobot.extras.filters.mixins.StatusFilter.get_filter_predicate" class="md-nav__link">
4324
- get_filter_predicate()
4325
- </a>
4326
-
4327
- </li>
4328
-
4329
- </ul>
4330
- </nav>
4331
-
4332
4333
  </li>
4333
4334
 
4334
4335
  <li class="md-nav__item">
@@ -5121,6 +5122,20 @@
5121
5122
 
5122
5123
 
5123
5124
 
5125
+ <li class="md-nav__item">
5126
+ <a href="../../../release-notes/version-2.1.html" class="md-nav__link">
5127
+ Version 2.1
5128
+ </a>
5129
+ </li>
5130
+
5131
+
5132
+
5133
+
5134
+
5135
+
5136
+
5137
+
5138
+
5124
5139
  <li class="md-nav__item">
5125
5140
  <a href="../../../release-notes/version-2.0.html" class="md-nav__link">
5126
5141
  Version 2.0
@@ -5715,19 +5730,6 @@
5715
5730
  StatusFilter
5716
5731
  </a>
5717
5732
 
5718
- <nav class="md-nav" aria-label="StatusFilter">
5719
- <ul class="md-nav__list">
5720
-
5721
- <li class="md-nav__item">
5722
- <a href="#nautobot.extras.filters.mixins.StatusFilter.get_filter_predicate" class="md-nav__link">
5723
- get_filter_predicate()
5724
- </a>
5725
-
5726
- </li>
5727
-
5728
- </ul>
5729
- </nav>
5730
-
5731
5733
  </li>
5732
5734
 
5733
5735
  <li class="md-nav__item">
@@ -6080,7 +6082,15 @@
6080
6082
  <span class="normal"><a href="#__codelineno-0-756">756</a></span>
6081
6083
  <span class="normal"><a href="#__codelineno-0-757">757</a></span>
6082
6084
  <span class="normal"><a href="#__codelineno-0-758">758</a></span>
6083
- <span class="normal"><a href="#__codelineno-0-759">759</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-533" name="__codelineno-0-533"></a><span class="k">class</span> <span class="nc">BaseFilterSet</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
6085
+ <span class="normal"><a href="#__codelineno-0-759">759</a></span>
6086
+ <span class="normal"><a href="#__codelineno-0-760">760</a></span>
6087
+ <span class="normal"><a href="#__codelineno-0-761">761</a></span>
6088
+ <span class="normal"><a href="#__codelineno-0-762">762</a></span>
6089
+ <span class="normal"><a href="#__codelineno-0-763">763</a></span>
6090
+ <span class="normal"><a href="#__codelineno-0-764">764</a></span>
6091
+ <span class="normal"><a href="#__codelineno-0-765">765</a></span>
6092
+ <span class="normal"><a href="#__codelineno-0-766">766</a></span>
6093
+ <span class="normal"><a href="#__codelineno-0-767">767</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-533" name="__codelineno-0-533"></a><span class="k">class</span> <span class="nc">BaseFilterSet</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
6084
6094
  <a id="__codelineno-0-534" name="__codelineno-0-534"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6085
6095
  <a id="__codelineno-0-535" name="__codelineno-0-535"></a><span class="sd"> A base filterset which provides common functionality to all Nautobot filtersets.</span>
6086
6096
  <a id="__codelineno-0-536" name="__codelineno-0-536"></a><span class="sd"> &quot;&quot;&quot;</span>
@@ -6180,133 +6190,141 @@
6180
6190
  <a id="__codelineno-0-630" name="__codelineno-0-630"></a> <span class="k">if</span> <span class="n">field</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6181
6191
  <a id="__codelineno-0-631" name="__codelineno-0-631"></a> <span class="k">return</span> <span class="n">magic_filters</span>
6182
6192
  <a id="__codelineno-0-632" name="__codelineno-0-632"></a>
6183
- <a id="__codelineno-0-633" name="__codelineno-0-633"></a> <span class="c1"># Create new filters for each lookup expression in the map</span>
6184
- <a id="__codelineno-0-634" name="__codelineno-0-634"></a> <span class="k">for</span> <span class="n">lookup_name</span><span class="p">,</span> <span class="n">lookup_expr</span> <span class="ow">in</span> <span class="n">lookup_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6185
- <a id="__codelineno-0-635" name="__codelineno-0-635"></a> <span class="n">new_filter_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">filter_name</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">lookup_name</span><span class="si">}</span><span class="s2">&quot;</span>
6186
- <a id="__codelineno-0-636" name="__codelineno-0-636"></a>
6187
- <a id="__codelineno-0-637" name="__codelineno-0-637"></a> <span class="k">try</span><span class="p">:</span>
6188
- <a id="__codelineno-0-638" name="__codelineno-0-638"></a> <span class="k">if</span> <span class="n">filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">declared_filters</span><span class="p">:</span>
6189
- <a id="__codelineno-0-639" name="__codelineno-0-639"></a> <span class="c1"># The filter field has been explicity defined on the filterset class so we must manually</span>
6190
- <a id="__codelineno-0-640" name="__codelineno-0-640"></a> <span class="c1"># create the new filter with the same type because there is no guarantee the defined type</span>
6191
- <a id="__codelineno-0-641" name="__codelineno-0-641"></a> <span class="c1"># is the same as the default type for the field</span>
6192
- <a id="__codelineno-0-642" name="__codelineno-0-642"></a> <span class="n">resolve_field</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_expr</span><span class="p">)</span> <span class="c1"># Will raise FieldLookupError if the lookup is invalid</span>
6193
- <a id="__codelineno-0-643" name="__codelineno-0-643"></a> <span class="n">new_filter</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">filter_field</span><span class="p">)(</span>
6194
- <a id="__codelineno-0-644" name="__codelineno-0-644"></a> <span class="n">field_name</span><span class="o">=</span><span class="n">field_name</span><span class="p">,</span>
6195
- <a id="__codelineno-0-645" name="__codelineno-0-645"></a> <span class="n">lookup_expr</span><span class="o">=</span><span class="n">lookup_expr</span><span class="p">,</span>
6196
- <a id="__codelineno-0-646" name="__codelineno-0-646"></a> <span class="n">label</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
6197
- <a id="__codelineno-0-647" name="__codelineno-0-647"></a> <span class="n">exclude</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">exclude</span><span class="p">,</span>
6198
- <a id="__codelineno-0-648" name="__codelineno-0-648"></a> <span class="n">distinct</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">distinct</span><span class="p">,</span>
6199
- <a id="__codelineno-0-649" name="__codelineno-0-649"></a> <span class="o">**</span><span class="n">filter_field</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span>
6200
- <a id="__codelineno-0-650" name="__codelineno-0-650"></a> <span class="p">)</span>
6201
- <a id="__codelineno-0-651" name="__codelineno-0-651"></a> <span class="k">else</span><span class="p">:</span>
6202
- <a id="__codelineno-0-652" name="__codelineno-0-652"></a> <span class="c1"># The filter field is listed in Meta.fields so we can safely rely on default behaviour</span>
6203
- <a id="__codelineno-0-653" name="__codelineno-0-653"></a> <span class="c1"># Will raise FieldLookupError if the lookup is invalid</span>
6204
- <a id="__codelineno-0-654" name="__codelineno-0-654"></a> <span class="n">new_filter</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">filter_for_field</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">lookup_expr</span><span class="p">)</span>
6205
- <a id="__codelineno-0-655" name="__codelineno-0-655"></a> <span class="k">except</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">FieldLookupError</span><span class="p">:</span>
6206
- <a id="__codelineno-0-656" name="__codelineno-0-656"></a> <span class="c1"># The filter could not be created because the lookup expression is not supported on the field</span>
6207
- <a id="__codelineno-0-657" name="__codelineno-0-657"></a> <span class="k">continue</span>
6208
- <a id="__codelineno-0-658" name="__codelineno-0-658"></a>
6209
- <a id="__codelineno-0-659" name="__codelineno-0-659"></a> <span class="k">if</span> <span class="n">lookup_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;n&quot;</span><span class="p">):</span>
6210
- <a id="__codelineno-0-660" name="__codelineno-0-660"></a> <span class="c1"># This is a negation filter which requires a queryset.exclude() clause</span>
6211
- <a id="__codelineno-0-661" name="__codelineno-0-661"></a> <span class="c1"># Of course setting the negation of the existing filter&#39;s exclude attribute handles both cases</span>
6212
- <a id="__codelineno-0-662" name="__codelineno-0-662"></a> <span class="n">new_filter</span><span class="o">.</span><span class="n">exclude</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">filter_field</span><span class="o">.</span><span class="n">exclude</span>
6213
- <a id="__codelineno-0-663" name="__codelineno-0-663"></a>
6214
- <a id="__codelineno-0-664" name="__codelineno-0-664"></a> <span class="n">magic_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter</span>
6215
- <a id="__codelineno-0-665" name="__codelineno-0-665"></a>
6216
- <a id="__codelineno-0-666" name="__codelineno-0-666"></a> <span class="k">return</span> <span class="n">magic_filters</span>
6217
- <a id="__codelineno-0-667" name="__codelineno-0-667"></a>
6218
- <a id="__codelineno-0-668" name="__codelineno-0-668"></a> <span class="nd">@classmethod</span>
6219
- <a id="__codelineno-0-669" name="__codelineno-0-669"></a> <span class="k">def</span> <span class="nf">add_filter</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">new_filter_name</span><span class="p">,</span> <span class="n">new_filter_field</span><span class="p">):</span>
6220
- <a id="__codelineno-0-670" name="__codelineno-0-670"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6221
- <a id="__codelineno-0-671" name="__codelineno-0-671"></a><span class="sd"> Allow filters to be added post-generation on import.</span>
6222
- <a id="__codelineno-0-672" name="__codelineno-0-672"></a>
6223
- <a id="__codelineno-0-673" name="__codelineno-0-673"></a><span class="sd"> Will provide `&lt;field_name&gt;__&lt;lookup_expr&gt;` generation automagically.</span>
6224
- <a id="__codelineno-0-674" name="__codelineno-0-674"></a><span class="sd"> &quot;&quot;&quot;</span>
6225
- <a id="__codelineno-0-675" name="__codelineno-0-675"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">new_filter_field</span><span class="p">,</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
6226
- <a id="__codelineno-0-676" name="__codelineno-0-676"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tried to add filter (</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">) which is not an instance of Django Filter&quot;</span><span class="p">)</span>
6227
- <a id="__codelineno-0-677" name="__codelineno-0-677"></a>
6228
- <a id="__codelineno-0-678" name="__codelineno-0-678"></a> <span class="k">if</span> <span class="n">new_filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">:</span>
6229
- <a id="__codelineno-0-679" name="__codelineno-0-679"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
6230
- <a id="__codelineno-0-680" name="__codelineno-0-680"></a> <span class="sa">f</span><span class="s2">&quot;There was a conflict with filter `</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">`, the custom filter was ignored.&quot;</span>
6231
- <a id="__codelineno-0-681" name="__codelineno-0-681"></a> <span class="p">)</span>
6232
- <a id="__codelineno-0-682" name="__codelineno-0-682"></a>
6233
- <a id="__codelineno-0-683" name="__codelineno-0-683"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter_field</span>
6234
- <a id="__codelineno-0-684" name="__codelineno-0-684"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6235
- <a id="__codelineno-0-685" name="__codelineno-0-685"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6236
- <a id="__codelineno-0-686" name="__codelineno-0-686"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6237
- <a id="__codelineno-0-687" name="__codelineno-0-687"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span><span class="n">filter_name</span><span class="o">=</span><span class="n">new_filter_name</span><span class="p">,</span> <span class="n">filter_field</span><span class="o">=</span><span class="n">new_filter_field</span><span class="p">)</span>
6238
- <a id="__codelineno-0-688" name="__codelineno-0-688"></a> <span class="p">)</span>
6239
- <a id="__codelineno-0-689" name="__codelineno-0-689"></a>
6240
- <a id="__codelineno-0-690" name="__codelineno-0-690"></a> <span class="nd">@classmethod</span>
6241
- <a id="__codelineno-0-691" name="__codelineno-0-691"></a> <span class="k">def</span> <span class="nf">get_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6242
- <a id="__codelineno-0-692" name="__codelineno-0-692"></a> <span class="n">fields</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_fields</span><span class="p">()</span>
6243
- <a id="__codelineno-0-693" name="__codelineno-0-693"></a> <span class="k">if</span> <span class="s2">&quot;id&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">fields</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="s2">&quot;id&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">exclude</span><span class="p">):</span>
6244
- <a id="__codelineno-0-694" name="__codelineno-0-694"></a> <span class="c1"># Add &quot;id&quot; as the first key in the `fields` OrderedDict</span>
6245
- <a id="__codelineno-0-695" name="__codelineno-0-695"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="p">[</span><span class="n">django_filters</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_LOOKUP_EXPR</span><span class="p">],</span> <span class="o">**</span><span class="n">fields</span><span class="p">)</span>
6246
- <a id="__codelineno-0-696" name="__codelineno-0-696"></a> <span class="k">return</span> <span class="n">fields</span>
6193
+ <a id="__codelineno-0-633" name="__codelineno-0-633"></a> <span class="c1"># If the field allows null values, add an `isnull`` check</span>
6194
+ <a id="__codelineno-0-634" name="__codelineno-0-634"></a> <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;null&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
6195
+ <a id="__codelineno-0-635" name="__codelineno-0-635"></a> <span class="c1"># Use this method vs extend as the `lookup_map` variable is generally one of</span>
6196
+ <a id="__codelineno-0-636" name="__codelineno-0-636"></a> <span class="c1"># the constants which we do not want to update</span>
6197
+ <a id="__codelineno-0-637" name="__codelineno-0-637"></a> <span class="n">lookup_map</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">lookup_map</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s2">&quot;isnull&quot;</span><span class="p">:</span> <span class="s2">&quot;isnull&quot;</span><span class="p">})</span>
6198
+ <a id="__codelineno-0-638" name="__codelineno-0-638"></a>
6199
+ <a id="__codelineno-0-639" name="__codelineno-0-639"></a> <span class="c1"># Create new filters for each lookup expression in the map</span>
6200
+ <a id="__codelineno-0-640" name="__codelineno-0-640"></a> <span class="k">for</span> <span class="n">lookup_name</span><span class="p">,</span> <span class="n">lookup_expr</span> <span class="ow">in</span> <span class="n">lookup_map</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6201
+ <a id="__codelineno-0-641" name="__codelineno-0-641"></a> <span class="n">new_filter_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">filter_name</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">lookup_name</span><span class="si">}</span><span class="s2">&quot;</span>
6202
+ <a id="__codelineno-0-642" name="__codelineno-0-642"></a>
6203
+ <a id="__codelineno-0-643" name="__codelineno-0-643"></a> <span class="k">try</span><span class="p">:</span>
6204
+ <a id="__codelineno-0-644" name="__codelineno-0-644"></a> <span class="k">if</span> <span class="n">filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">declared_filters</span> <span class="ow">and</span> <span class="n">lookup_expr</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">{</span><span class="s2">&quot;isnull&quot;</span><span class="p">}:</span>
6205
+ <a id="__codelineno-0-645" name="__codelineno-0-645"></a> <span class="c1"># The filter field has been explicitly defined on the filterset class so we must manually</span>
6206
+ <a id="__codelineno-0-646" name="__codelineno-0-646"></a> <span class="c1"># create the new filter with the same type because there is no guarantee the defined type</span>
6207
+ <a id="__codelineno-0-647" name="__codelineno-0-647"></a> <span class="c1"># is the same as the default type for the field. This does not apply if the filter</span>
6208
+ <a id="__codelineno-0-648" name="__codelineno-0-648"></a> <span class="c1"># should retain the original lookup_expr type, such as `isnull` using a boolean field on a</span>
6209
+ <a id="__codelineno-0-649" name="__codelineno-0-649"></a> <span class="c1"># char or date object.</span>
6210
+ <a id="__codelineno-0-650" name="__codelineno-0-650"></a> <span class="n">resolve_field</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_expr</span><span class="p">)</span> <span class="c1"># Will raise FieldLookupError if the lookup is invalid</span>
6211
+ <a id="__codelineno-0-651" name="__codelineno-0-651"></a> <span class="n">new_filter</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">filter_field</span><span class="p">)(</span>
6212
+ <a id="__codelineno-0-652" name="__codelineno-0-652"></a> <span class="n">field_name</span><span class="o">=</span><span class="n">field_name</span><span class="p">,</span>
6213
+ <a id="__codelineno-0-653" name="__codelineno-0-653"></a> <span class="n">lookup_expr</span><span class="o">=</span><span class="n">lookup_expr</span><span class="p">,</span>
6214
+ <a id="__codelineno-0-654" name="__codelineno-0-654"></a> <span class="n">label</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">label</span><span class="p">,</span>
6215
+ <a id="__codelineno-0-655" name="__codelineno-0-655"></a> <span class="n">exclude</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">exclude</span><span class="p">,</span>
6216
+ <a id="__codelineno-0-656" name="__codelineno-0-656"></a> <span class="n">distinct</span><span class="o">=</span><span class="n">filter_field</span><span class="o">.</span><span class="n">distinct</span><span class="p">,</span>
6217
+ <a id="__codelineno-0-657" name="__codelineno-0-657"></a> <span class="o">**</span><span class="n">filter_field</span><span class="o">.</span><span class="n">extra</span><span class="p">,</span>
6218
+ <a id="__codelineno-0-658" name="__codelineno-0-658"></a> <span class="p">)</span>
6219
+ <a id="__codelineno-0-659" name="__codelineno-0-659"></a> <span class="k">else</span><span class="p">:</span>
6220
+ <a id="__codelineno-0-660" name="__codelineno-0-660"></a> <span class="c1"># The filter field is listed in Meta.fields so we can safely rely on default behavior</span>
6221
+ <a id="__codelineno-0-661" name="__codelineno-0-661"></a> <span class="c1"># Will raise FieldLookupError if the lookup is invalid</span>
6222
+ <a id="__codelineno-0-662" name="__codelineno-0-662"></a> <span class="n">new_filter</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">filter_for_field</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">field_name</span><span class="p">,</span> <span class="n">lookup_expr</span><span class="p">)</span>
6223
+ <a id="__codelineno-0-663" name="__codelineno-0-663"></a> <span class="k">except</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">exceptions</span><span class="o">.</span><span class="n">FieldLookupError</span><span class="p">:</span>
6224
+ <a id="__codelineno-0-664" name="__codelineno-0-664"></a> <span class="c1"># The filter could not be created because the lookup expression is not supported on the field</span>
6225
+ <a id="__codelineno-0-665" name="__codelineno-0-665"></a> <span class="k">continue</span>
6226
+ <a id="__codelineno-0-666" name="__codelineno-0-666"></a>
6227
+ <a id="__codelineno-0-667" name="__codelineno-0-667"></a> <span class="k">if</span> <span class="n">lookup_name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;n&quot;</span><span class="p">):</span>
6228
+ <a id="__codelineno-0-668" name="__codelineno-0-668"></a> <span class="c1"># This is a negation filter which requires a queryset.exclude() clause</span>
6229
+ <a id="__codelineno-0-669" name="__codelineno-0-669"></a> <span class="c1"># Of course setting the negation of the existing filter&#39;s exclude attribute handles both cases</span>
6230
+ <a id="__codelineno-0-670" name="__codelineno-0-670"></a> <span class="n">new_filter</span><span class="o">.</span><span class="n">exclude</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">filter_field</span><span class="o">.</span><span class="n">exclude</span>
6231
+ <a id="__codelineno-0-671" name="__codelineno-0-671"></a>
6232
+ <a id="__codelineno-0-672" name="__codelineno-0-672"></a> <span class="n">magic_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter</span>
6233
+ <a id="__codelineno-0-673" name="__codelineno-0-673"></a>
6234
+ <a id="__codelineno-0-674" name="__codelineno-0-674"></a> <span class="k">return</span> <span class="n">magic_filters</span>
6235
+ <a id="__codelineno-0-675" name="__codelineno-0-675"></a>
6236
+ <a id="__codelineno-0-676" name="__codelineno-0-676"></a> <span class="nd">@classmethod</span>
6237
+ <a id="__codelineno-0-677" name="__codelineno-0-677"></a> <span class="k">def</span> <span class="nf">add_filter</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">new_filter_name</span><span class="p">,</span> <span class="n">new_filter_field</span><span class="p">):</span>
6238
+ <a id="__codelineno-0-678" name="__codelineno-0-678"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6239
+ <a id="__codelineno-0-679" name="__codelineno-0-679"></a><span class="sd"> Allow filters to be added post-generation on import.</span>
6240
+ <a id="__codelineno-0-680" name="__codelineno-0-680"></a>
6241
+ <a id="__codelineno-0-681" name="__codelineno-0-681"></a><span class="sd"> Will provide `&lt;field_name&gt;__&lt;lookup_expr&gt;` generation automagically.</span>
6242
+ <a id="__codelineno-0-682" name="__codelineno-0-682"></a><span class="sd"> &quot;&quot;&quot;</span>
6243
+ <a id="__codelineno-0-683" name="__codelineno-0-683"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">new_filter_field</span><span class="p">,</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
6244
+ <a id="__codelineno-0-684" name="__codelineno-0-684"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tried to add filter (</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">) which is not an instance of Django Filter&quot;</span><span class="p">)</span>
6245
+ <a id="__codelineno-0-685" name="__codelineno-0-685"></a>
6246
+ <a id="__codelineno-0-686" name="__codelineno-0-686"></a> <span class="k">if</span> <span class="n">new_filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">:</span>
6247
+ <a id="__codelineno-0-687" name="__codelineno-0-687"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
6248
+ <a id="__codelineno-0-688" name="__codelineno-0-688"></a> <span class="sa">f</span><span class="s2">&quot;There was a conflict with filter `</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">`, the custom filter was ignored.&quot;</span>
6249
+ <a id="__codelineno-0-689" name="__codelineno-0-689"></a> <span class="p">)</span>
6250
+ <a id="__codelineno-0-690" name="__codelineno-0-690"></a>
6251
+ <a id="__codelineno-0-691" name="__codelineno-0-691"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter_field</span>
6252
+ <a id="__codelineno-0-692" name="__codelineno-0-692"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6253
+ <a id="__codelineno-0-693" name="__codelineno-0-693"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6254
+ <a id="__codelineno-0-694" name="__codelineno-0-694"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6255
+ <a id="__codelineno-0-695" name="__codelineno-0-695"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span><span class="n">filter_name</span><span class="o">=</span><span class="n">new_filter_name</span><span class="p">,</span> <span class="n">filter_field</span><span class="o">=</span><span class="n">new_filter_field</span><span class="p">)</span>
6256
+ <a id="__codelineno-0-696" name="__codelineno-0-696"></a> <span class="p">)</span>
6247
6257
  <a id="__codelineno-0-697" name="__codelineno-0-697"></a>
6248
6258
  <a id="__codelineno-0-698" name="__codelineno-0-698"></a> <span class="nd">@classmethod</span>
6249
- <a id="__codelineno-0-699" name="__codelineno-0-699"></a> <span class="k">def</span> <span class="nf">get_filters</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6250
- <a id="__codelineno-0-700" name="__codelineno-0-700"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6251
- <a id="__codelineno-0-701" name="__codelineno-0-701"></a><span class="sd"> Override filter generation to support dynamic lookup expressions for certain filter types.</span>
6252
- <a id="__codelineno-0-702" name="__codelineno-0-702"></a><span class="sd"> &quot;&quot;&quot;</span>
6253
- <a id="__codelineno-0-703" name="__codelineno-0-703"></a> <span class="n">filters</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_filters</span><span class="p">()</span>
6254
- <a id="__codelineno-0-704" name="__codelineno-0-704"></a>
6255
- <a id="__codelineno-0-705" name="__codelineno-0-705"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6256
- <a id="__codelineno-0-706" name="__codelineno-0-706"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6257
- <a id="__codelineno-0-707" name="__codelineno-0-707"></a> <span class="n">new_filters</span> <span class="o">=</span> <span class="p">{}</span>
6258
- <a id="__codelineno-0-708" name="__codelineno-0-708"></a> <span class="k">for</span> <span class="n">existing_filter_name</span><span class="p">,</span> <span class="n">existing_filter</span> <span class="ow">in</span> <span class="n">filters</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6259
- <a id="__codelineno-0-709" name="__codelineno-0-709"></a> <span class="n">new_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6260
- <a id="__codelineno-0-710" name="__codelineno-0-710"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span>
6261
- <a id="__codelineno-0-711" name="__codelineno-0-711"></a> <span class="n">filter_name</span><span class="o">=</span><span class="n">existing_filter_name</span><span class="p">,</span>
6262
- <a id="__codelineno-0-712" name="__codelineno-0-712"></a> <span class="n">filter_field</span><span class="o">=</span><span class="n">existing_filter</span><span class="p">,</span>
6263
- <a id="__codelineno-0-713" name="__codelineno-0-713"></a> <span class="p">)</span>
6264
- <a id="__codelineno-0-714" name="__codelineno-0-714"></a> <span class="p">)</span>
6265
- <a id="__codelineno-0-715" name="__codelineno-0-715"></a>
6266
- <a id="__codelineno-0-716" name="__codelineno-0-716"></a> <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_filters</span><span class="p">)</span>
6267
- <a id="__codelineno-0-717" name="__codelineno-0-717"></a>
6268
- <a id="__codelineno-0-718" name="__codelineno-0-718"></a> <span class="k">return</span> <span class="n">filters</span>
6269
- <a id="__codelineno-0-719" name="__codelineno-0-719"></a>
6270
- <a id="__codelineno-0-720" name="__codelineno-0-720"></a> <span class="nd">@classmethod</span>
6271
- <a id="__codelineno-0-721" name="__codelineno-0-721"></a> <span class="k">def</span> <span class="nf">filter_for_lookup</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">):</span>
6272
- <a id="__codelineno-0-722" name="__codelineno-0-722"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override filter_for_lookup method to set ChoiceField Filter to MultipleChoiceFilter.</span>
6259
+ <a id="__codelineno-0-699" name="__codelineno-0-699"></a> <span class="k">def</span> <span class="nf">get_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6260
+ <a id="__codelineno-0-700" name="__codelineno-0-700"></a> <span class="n">fields</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_fields</span><span class="p">()</span>
6261
+ <a id="__codelineno-0-701" name="__codelineno-0-701"></a> <span class="k">if</span> <span class="s2">&quot;id&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">fields</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">exclude</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="s2">&quot;id&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">exclude</span><span class="p">):</span>
6262
+ <a id="__codelineno-0-702" name="__codelineno-0-702"></a> <span class="c1"># Add &quot;id&quot; as the first key in the `fields` OrderedDict</span>
6263
+ <a id="__codelineno-0-703" name="__codelineno-0-703"></a> <span class="n">fields</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="p">[</span><span class="n">django_filters</span><span class="o">.</span><span class="n">conf</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">DEFAULT_LOOKUP_EXPR</span><span class="p">],</span> <span class="o">**</span><span class="n">fields</span><span class="p">)</span>
6264
+ <a id="__codelineno-0-704" name="__codelineno-0-704"></a> <span class="k">return</span> <span class="n">fields</span>
6265
+ <a id="__codelineno-0-705" name="__codelineno-0-705"></a>
6266
+ <a id="__codelineno-0-706" name="__codelineno-0-706"></a> <span class="nd">@classmethod</span>
6267
+ <a id="__codelineno-0-707" name="__codelineno-0-707"></a> <span class="k">def</span> <span class="nf">get_filters</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6268
+ <a id="__codelineno-0-708" name="__codelineno-0-708"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6269
+ <a id="__codelineno-0-709" name="__codelineno-0-709"></a><span class="sd"> Override filter generation to support dynamic lookup expressions for certain filter types.</span>
6270
+ <a id="__codelineno-0-710" name="__codelineno-0-710"></a><span class="sd"> &quot;&quot;&quot;</span>
6271
+ <a id="__codelineno-0-711" name="__codelineno-0-711"></a> <span class="n">filters</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_filters</span><span class="p">()</span>
6272
+ <a id="__codelineno-0-712" name="__codelineno-0-712"></a>
6273
+ <a id="__codelineno-0-713" name="__codelineno-0-713"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6274
+ <a id="__codelineno-0-714" name="__codelineno-0-714"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6275
+ <a id="__codelineno-0-715" name="__codelineno-0-715"></a> <span class="n">new_filters</span> <span class="o">=</span> <span class="p">{}</span>
6276
+ <a id="__codelineno-0-716" name="__codelineno-0-716"></a> <span class="k">for</span> <span class="n">existing_filter_name</span><span class="p">,</span> <span class="n">existing_filter</span> <span class="ow">in</span> <span class="n">filters</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6277
+ <a id="__codelineno-0-717" name="__codelineno-0-717"></a> <span class="n">new_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6278
+ <a id="__codelineno-0-718" name="__codelineno-0-718"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span>
6279
+ <a id="__codelineno-0-719" name="__codelineno-0-719"></a> <span class="n">filter_name</span><span class="o">=</span><span class="n">existing_filter_name</span><span class="p">,</span>
6280
+ <a id="__codelineno-0-720" name="__codelineno-0-720"></a> <span class="n">filter_field</span><span class="o">=</span><span class="n">existing_filter</span><span class="p">,</span>
6281
+ <a id="__codelineno-0-721" name="__codelineno-0-721"></a> <span class="p">)</span>
6282
+ <a id="__codelineno-0-722" name="__codelineno-0-722"></a> <span class="p">)</span>
6273
6283
  <a id="__codelineno-0-723" name="__codelineno-0-723"></a>
6274
- <a id="__codelineno-0-724" name="__codelineno-0-724"></a><span class="sd"> Note: Any CharField or IntegerField with choices set is a ChoiceField.</span>
6275
- <a id="__codelineno-0-725" name="__codelineno-0-725"></a><span class="sd"> &quot;&quot;&quot;</span>
6276
- <a id="__codelineno-0-726" name="__codelineno-0-726"></a> <span class="k">if</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s2">&quot;exact&quot;</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;choices&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
6277
- <a id="__codelineno-0-727" name="__codelineno-0-727"></a> <span class="k">return</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">MultipleChoiceFilter</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">choices</span><span class="p">}</span>
6278
- <a id="__codelineno-0-728" name="__codelineno-0-728"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">filter_for_lookup</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">)</span>
6279
- <a id="__codelineno-0-729" name="__codelineno-0-729"></a>
6280
- <a id="__codelineno-0-730" name="__codelineno-0-730"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
6281
- <a id="__codelineno-0-731" name="__codelineno-0-731"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="n">prefix</span><span class="p">)</span>
6282
- <a id="__codelineno-0-732" name="__codelineno-0-732"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="kc">None</span>
6283
- <a id="__codelineno-0-733" name="__codelineno-0-733"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="kc">None</span>
6284
- <a id="__codelineno-0-734" name="__codelineno-0-734"></a>
6285
- <a id="__codelineno-0-735" name="__codelineno-0-735"></a> <span class="k">def</span> <span class="nf">is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6286
- <a id="__codelineno-0-736" name="__codelineno-0-736"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.is_valid() to potentially enforce settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6287
- <a id="__codelineno-0-737" name="__codelineno-0-737"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6288
- <a id="__codelineno-0-738" name="__codelineno-0-738"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">is_valid</span><span class="p">()</span>
6289
- <a id="__codelineno-0-739" name="__codelineno-0-739"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6290
- <a id="__codelineno-0-740" name="__codelineno-0-740"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">and</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
6291
- <a id="__codelineno-0-741" name="__codelineno-0-741"></a> <span class="k">else</span><span class="p">:</span>
6292
- <a id="__codelineno-0-742" name="__codelineno-0-742"></a> <span class="c1"># Trigger warning logs associated with generating self.errors</span>
6293
- <a id="__codelineno-0-743" name="__codelineno-0-743"></a> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span>
6294
- <a id="__codelineno-0-744" name="__codelineno-0-744"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span>
6295
- <a id="__codelineno-0-745" name="__codelineno-0-745"></a>
6296
- <a id="__codelineno-0-746" name="__codelineno-0-746"></a> <span class="nd">@property</span>
6297
- <a id="__codelineno-0-747" name="__codelineno-0-747"></a> <span class="k">def</span> <span class="nf">errors</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6298
- <a id="__codelineno-0-748" name="__codelineno-0-748"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.errors to potentially include additional errors from settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6299
- <a id="__codelineno-0-749" name="__codelineno-0-749"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6300
- <a id="__codelineno-0-750" name="__codelineno-0-750"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="n">ErrorDict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">errors</span><span class="p">)</span>
6301
- <a id="__codelineno-0-751" name="__codelineno-0-751"></a> <span class="k">for</span> <span class="n">extra_key</span> <span class="ow">in</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
6302
- <a id="__codelineno-0-752" name="__codelineno-0-752"></a> <span class="c1"># If a given field was invalid, it will be omitted from cleaned_data; don&#39;t report extra errors</span>
6303
- <a id="__codelineno-0-753" name="__codelineno-0-753"></a> <span class="k">if</span> <span class="n">extra_key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">:</span>
6304
- <a id="__codelineno-0-754" name="__codelineno-0-754"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6305
- <a id="__codelineno-0-755" name="__codelineno-0-755"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">extra_key</span><span class="p">,</span> <span class="n">ErrorList</span><span class="p">())</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;Unknown filter field&quot;</span><span class="p">)</span>
6306
- <a id="__codelineno-0-756" name="__codelineno-0-756"></a> <span class="k">else</span><span class="p">:</span>
6307
- <a id="__codelineno-0-757" name="__codelineno-0-757"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">: Unknown filter field &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">extra_key</span><span class="p">)</span>
6308
- <a id="__codelineno-0-758" name="__codelineno-0-758"></a>
6309
- <a id="__codelineno-0-759" name="__codelineno-0-759"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span>
6284
+ <a id="__codelineno-0-724" name="__codelineno-0-724"></a> <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_filters</span><span class="p">)</span>
6285
+ <a id="__codelineno-0-725" name="__codelineno-0-725"></a>
6286
+ <a id="__codelineno-0-726" name="__codelineno-0-726"></a> <span class="k">return</span> <span class="n">filters</span>
6287
+ <a id="__codelineno-0-727" name="__codelineno-0-727"></a>
6288
+ <a id="__codelineno-0-728" name="__codelineno-0-728"></a> <span class="nd">@classmethod</span>
6289
+ <a id="__codelineno-0-729" name="__codelineno-0-729"></a> <span class="k">def</span> <span class="nf">filter_for_lookup</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">):</span>
6290
+ <a id="__codelineno-0-730" name="__codelineno-0-730"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override filter_for_lookup method to set ChoiceField Filter to MultipleChoiceFilter.</span>
6291
+ <a id="__codelineno-0-731" name="__codelineno-0-731"></a>
6292
+ <a id="__codelineno-0-732" name="__codelineno-0-732"></a><span class="sd"> Note: Any CharField or IntegerField with choices set is a ChoiceField.</span>
6293
+ <a id="__codelineno-0-733" name="__codelineno-0-733"></a><span class="sd"> &quot;&quot;&quot;</span>
6294
+ <a id="__codelineno-0-734" name="__codelineno-0-734"></a> <span class="k">if</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s2">&quot;exact&quot;</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;choices&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
6295
+ <a id="__codelineno-0-735" name="__codelineno-0-735"></a> <span class="k">return</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">MultipleChoiceFilter</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">choices</span><span class="p">}</span>
6296
+ <a id="__codelineno-0-736" name="__codelineno-0-736"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">filter_for_lookup</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">)</span>
6297
+ <a id="__codelineno-0-737" name="__codelineno-0-737"></a>
6298
+ <a id="__codelineno-0-738" name="__codelineno-0-738"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">queryset</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
6299
+ <a id="__codelineno-0-739" name="__codelineno-0-739"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">queryset</span><span class="p">,</span> <span class="n">request</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="n">prefix</span><span class="p">)</span>
6300
+ <a id="__codelineno-0-740" name="__codelineno-0-740"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="kc">None</span>
6301
+ <a id="__codelineno-0-741" name="__codelineno-0-741"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="kc">None</span>
6302
+ <a id="__codelineno-0-742" name="__codelineno-0-742"></a>
6303
+ <a id="__codelineno-0-743" name="__codelineno-0-743"></a> <span class="k">def</span> <span class="nf">is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6304
+ <a id="__codelineno-0-744" name="__codelineno-0-744"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.is_valid() to potentially enforce settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6305
+ <a id="__codelineno-0-745" name="__codelineno-0-745"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6306
+ <a id="__codelineno-0-746" name="__codelineno-0-746"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">is_valid</span><span class="p">()</span>
6307
+ <a id="__codelineno-0-747" name="__codelineno-0-747"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6308
+ <a id="__codelineno-0-748" name="__codelineno-0-748"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">and</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
6309
+ <a id="__codelineno-0-749" name="__codelineno-0-749"></a> <span class="k">else</span><span class="p">:</span>
6310
+ <a id="__codelineno-0-750" name="__codelineno-0-750"></a> <span class="c1"># Trigger warning logs associated with generating self.errors</span>
6311
+ <a id="__codelineno-0-751" name="__codelineno-0-751"></a> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span>
6312
+ <a id="__codelineno-0-752" name="__codelineno-0-752"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span>
6313
+ <a id="__codelineno-0-753" name="__codelineno-0-753"></a>
6314
+ <a id="__codelineno-0-754" name="__codelineno-0-754"></a> <span class="nd">@property</span>
6315
+ <a id="__codelineno-0-755" name="__codelineno-0-755"></a> <span class="k">def</span> <span class="nf">errors</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6316
+ <a id="__codelineno-0-756" name="__codelineno-0-756"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.errors to potentially include additional errors from settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6317
+ <a id="__codelineno-0-757" name="__codelineno-0-757"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6318
+ <a id="__codelineno-0-758" name="__codelineno-0-758"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="n">ErrorDict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">errors</span><span class="p">)</span>
6319
+ <a id="__codelineno-0-759" name="__codelineno-0-759"></a> <span class="k">for</span> <span class="n">extra_key</span> <span class="ow">in</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">difference</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
6320
+ <a id="__codelineno-0-760" name="__codelineno-0-760"></a> <span class="c1"># If a given field was invalid, it will be omitted from cleaned_data; don&#39;t report extra errors</span>
6321
+ <a id="__codelineno-0-761" name="__codelineno-0-761"></a> <span class="k">if</span> <span class="n">extra_key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">:</span>
6322
+ <a id="__codelineno-0-762" name="__codelineno-0-762"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6323
+ <a id="__codelineno-0-763" name="__codelineno-0-763"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">extra_key</span><span class="p">,</span> <span class="n">ErrorList</span><span class="p">())</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;Unknown filter field&quot;</span><span class="p">)</span>
6324
+ <a id="__codelineno-0-764" name="__codelineno-0-764"></a> <span class="k">else</span><span class="p">:</span>
6325
+ <a id="__codelineno-0-765" name="__codelineno-0-765"></a> <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">: Unknown filter field &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">extra_key</span><span class="p">)</span>
6326
+ <a id="__codelineno-0-766" name="__codelineno-0-766"></a>
6327
+ <a id="__codelineno-0-767" name="__codelineno-0-767"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span>
6310
6328
  </code></pre></div></td></tr></table></div>
6311
6329
  </details>
6312
6330
 
@@ -6365,15 +6383,7 @@
6365
6383
 
6366
6384
  <details class="quote">
6367
6385
  <summary>Source code in <code>nautobot/core/filters.py</code></summary>
6368
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-668">668</a></span>
6369
- <span class="normal"><a href="#__codelineno-0-669">669</a></span>
6370
- <span class="normal"><a href="#__codelineno-0-670">670</a></span>
6371
- <span class="normal"><a href="#__codelineno-0-671">671</a></span>
6372
- <span class="normal"><a href="#__codelineno-0-672">672</a></span>
6373
- <span class="normal"><a href="#__codelineno-0-673">673</a></span>
6374
- <span class="normal"><a href="#__codelineno-0-674">674</a></span>
6375
- <span class="normal"><a href="#__codelineno-0-675">675</a></span>
6376
- <span class="normal"><a href="#__codelineno-0-676">676</a></span>
6386
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-676">676</a></span>
6377
6387
  <span class="normal"><a href="#__codelineno-0-677">677</a></span>
6378
6388
  <span class="normal"><a href="#__codelineno-0-678">678</a></span>
6379
6389
  <span class="normal"><a href="#__codelineno-0-679">679</a></span>
@@ -6385,27 +6395,35 @@
6385
6395
  <span class="normal"><a href="#__codelineno-0-685">685</a></span>
6386
6396
  <span class="normal"><a href="#__codelineno-0-686">686</a></span>
6387
6397
  <span class="normal"><a href="#__codelineno-0-687">687</a></span>
6388
- <span class="normal"><a href="#__codelineno-0-688">688</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-668" name="__codelineno-0-668"></a><span class="nd">@classmethod</span>
6389
- <a id="__codelineno-0-669" name="__codelineno-0-669"></a><span class="k">def</span> <span class="nf">add_filter</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">new_filter_name</span><span class="p">,</span> <span class="n">new_filter_field</span><span class="p">):</span>
6390
- <a id="__codelineno-0-670" name="__codelineno-0-670"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6391
- <a id="__codelineno-0-671" name="__codelineno-0-671"></a><span class="sd"> Allow filters to be added post-generation on import.</span>
6392
- <a id="__codelineno-0-672" name="__codelineno-0-672"></a>
6393
- <a id="__codelineno-0-673" name="__codelineno-0-673"></a><span class="sd"> Will provide `&lt;field_name&gt;__&lt;lookup_expr&gt;` generation automagically.</span>
6394
- <a id="__codelineno-0-674" name="__codelineno-0-674"></a><span class="sd"> &quot;&quot;&quot;</span>
6395
- <a id="__codelineno-0-675" name="__codelineno-0-675"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">new_filter_field</span><span class="p">,</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
6396
- <a id="__codelineno-0-676" name="__codelineno-0-676"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tried to add filter (</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">) which is not an instance of Django Filter&quot;</span><span class="p">)</span>
6397
- <a id="__codelineno-0-677" name="__codelineno-0-677"></a>
6398
- <a id="__codelineno-0-678" name="__codelineno-0-678"></a> <span class="k">if</span> <span class="n">new_filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">:</span>
6399
- <a id="__codelineno-0-679" name="__codelineno-0-679"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
6400
- <a id="__codelineno-0-680" name="__codelineno-0-680"></a> <span class="sa">f</span><span class="s2">&quot;There was a conflict with filter `</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">`, the custom filter was ignored.&quot;</span>
6401
- <a id="__codelineno-0-681" name="__codelineno-0-681"></a> <span class="p">)</span>
6402
- <a id="__codelineno-0-682" name="__codelineno-0-682"></a>
6403
- <a id="__codelineno-0-683" name="__codelineno-0-683"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter_field</span>
6404
- <a id="__codelineno-0-684" name="__codelineno-0-684"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6405
- <a id="__codelineno-0-685" name="__codelineno-0-685"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6406
- <a id="__codelineno-0-686" name="__codelineno-0-686"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6407
- <a id="__codelineno-0-687" name="__codelineno-0-687"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span><span class="n">filter_name</span><span class="o">=</span><span class="n">new_filter_name</span><span class="p">,</span> <span class="n">filter_field</span><span class="o">=</span><span class="n">new_filter_field</span><span class="p">)</span>
6408
- <a id="__codelineno-0-688" name="__codelineno-0-688"></a> <span class="p">)</span>
6398
+ <span class="normal"><a href="#__codelineno-0-688">688</a></span>
6399
+ <span class="normal"><a href="#__codelineno-0-689">689</a></span>
6400
+ <span class="normal"><a href="#__codelineno-0-690">690</a></span>
6401
+ <span class="normal"><a href="#__codelineno-0-691">691</a></span>
6402
+ <span class="normal"><a href="#__codelineno-0-692">692</a></span>
6403
+ <span class="normal"><a href="#__codelineno-0-693">693</a></span>
6404
+ <span class="normal"><a href="#__codelineno-0-694">694</a></span>
6405
+ <span class="normal"><a href="#__codelineno-0-695">695</a></span>
6406
+ <span class="normal"><a href="#__codelineno-0-696">696</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-676" name="__codelineno-0-676"></a><span class="nd">@classmethod</span>
6407
+ <a id="__codelineno-0-677" name="__codelineno-0-677"></a><span class="k">def</span> <span class="nf">add_filter</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">new_filter_name</span><span class="p">,</span> <span class="n">new_filter_field</span><span class="p">):</span>
6408
+ <a id="__codelineno-0-678" name="__codelineno-0-678"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6409
+ <a id="__codelineno-0-679" name="__codelineno-0-679"></a><span class="sd"> Allow filters to be added post-generation on import.</span>
6410
+ <a id="__codelineno-0-680" name="__codelineno-0-680"></a>
6411
+ <a id="__codelineno-0-681" name="__codelineno-0-681"></a><span class="sd"> Will provide `&lt;field_name&gt;__&lt;lookup_expr&gt;` generation automagically.</span>
6412
+ <a id="__codelineno-0-682" name="__codelineno-0-682"></a><span class="sd"> &quot;&quot;&quot;</span>
6413
+ <a id="__codelineno-0-683" name="__codelineno-0-683"></a> <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">new_filter_field</span><span class="p">,</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">Filter</span><span class="p">):</span>
6414
+ <a id="__codelineno-0-684" name="__codelineno-0-684"></a> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tried to add filter (</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">) which is not an instance of Django Filter&quot;</span><span class="p">)</span>
6415
+ <a id="__codelineno-0-685" name="__codelineno-0-685"></a>
6416
+ <a id="__codelineno-0-686" name="__codelineno-0-686"></a> <span class="k">if</span> <span class="n">new_filter_name</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">:</span>
6417
+ <a id="__codelineno-0-687" name="__codelineno-0-687"></a> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span>
6418
+ <a id="__codelineno-0-688" name="__codelineno-0-688"></a> <span class="sa">f</span><span class="s2">&quot;There was a conflict with filter `</span><span class="si">{</span><span class="n">new_filter_name</span><span class="si">}</span><span class="s2">`, the custom filter was ignored.&quot;</span>
6419
+ <a id="__codelineno-0-689" name="__codelineno-0-689"></a> <span class="p">)</span>
6420
+ <a id="__codelineno-0-690" name="__codelineno-0-690"></a>
6421
+ <a id="__codelineno-0-691" name="__codelineno-0-691"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="p">[</span><span class="n">new_filter_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">new_filter_field</span>
6422
+ <a id="__codelineno-0-692" name="__codelineno-0-692"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6423
+ <a id="__codelineno-0-693" name="__codelineno-0-693"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6424
+ <a id="__codelineno-0-694" name="__codelineno-0-694"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">base_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6425
+ <a id="__codelineno-0-695" name="__codelineno-0-695"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span><span class="n">filter_name</span><span class="o">=</span><span class="n">new_filter_name</span><span class="p">,</span> <span class="n">filter_field</span><span class="o">=</span><span class="n">new_filter_field</span><span class="p">)</span>
6426
+ <a id="__codelineno-0-696" name="__codelineno-0-696"></a> <span class="p">)</span>
6409
6427
  </code></pre></div></td></tr></table></div>
6410
6428
  </details>
6411
6429
  </div>
@@ -6434,23 +6452,23 @@
6434
6452
 
6435
6453
  <details class="quote">
6436
6454
  <summary>Source code in <code>nautobot/core/filters.py</code></summary>
6437
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-720">720</a></span>
6438
- <span class="normal"><a href="#__codelineno-0-721">721</a></span>
6439
- <span class="normal"><a href="#__codelineno-0-722">722</a></span>
6440
- <span class="normal"><a href="#__codelineno-0-723">723</a></span>
6441
- <span class="normal"><a href="#__codelineno-0-724">724</a></span>
6442
- <span class="normal"><a href="#__codelineno-0-725">725</a></span>
6443
- <span class="normal"><a href="#__codelineno-0-726">726</a></span>
6444
- <span class="normal"><a href="#__codelineno-0-727">727</a></span>
6445
- <span class="normal"><a href="#__codelineno-0-728">728</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-720" name="__codelineno-0-720"></a><span class="nd">@classmethod</span>
6446
- <a id="__codelineno-0-721" name="__codelineno-0-721"></a><span class="k">def</span> <span class="nf">filter_for_lookup</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">):</span>
6447
- <a id="__codelineno-0-722" name="__codelineno-0-722"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override filter_for_lookup method to set ChoiceField Filter to MultipleChoiceFilter.</span>
6448
- <a id="__codelineno-0-723" name="__codelineno-0-723"></a>
6449
- <a id="__codelineno-0-724" name="__codelineno-0-724"></a><span class="sd"> Note: Any CharField or IntegerField with choices set is a ChoiceField.</span>
6450
- <a id="__codelineno-0-725" name="__codelineno-0-725"></a><span class="sd"> &quot;&quot;&quot;</span>
6451
- <a id="__codelineno-0-726" name="__codelineno-0-726"></a> <span class="k">if</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s2">&quot;exact&quot;</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;choices&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
6452
- <a id="__codelineno-0-727" name="__codelineno-0-727"></a> <span class="k">return</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">MultipleChoiceFilter</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">choices</span><span class="p">}</span>
6453
- <a id="__codelineno-0-728" name="__codelineno-0-728"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">filter_for_lookup</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">)</span>
6455
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-728">728</a></span>
6456
+ <span class="normal"><a href="#__codelineno-0-729">729</a></span>
6457
+ <span class="normal"><a href="#__codelineno-0-730">730</a></span>
6458
+ <span class="normal"><a href="#__codelineno-0-731">731</a></span>
6459
+ <span class="normal"><a href="#__codelineno-0-732">732</a></span>
6460
+ <span class="normal"><a href="#__codelineno-0-733">733</a></span>
6461
+ <span class="normal"><a href="#__codelineno-0-734">734</a></span>
6462
+ <span class="normal"><a href="#__codelineno-0-735">735</a></span>
6463
+ <span class="normal"><a href="#__codelineno-0-736">736</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-728" name="__codelineno-0-728"></a><span class="nd">@classmethod</span>
6464
+ <a id="__codelineno-0-729" name="__codelineno-0-729"></a><span class="k">def</span> <span class="nf">filter_for_lookup</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">):</span>
6465
+ <a id="__codelineno-0-730" name="__codelineno-0-730"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Override filter_for_lookup method to set ChoiceField Filter to MultipleChoiceFilter.</span>
6466
+ <a id="__codelineno-0-731" name="__codelineno-0-731"></a>
6467
+ <a id="__codelineno-0-732" name="__codelineno-0-732"></a><span class="sd"> Note: Any CharField or IntegerField with choices set is a ChoiceField.</span>
6468
+ <a id="__codelineno-0-733" name="__codelineno-0-733"></a><span class="sd"> &quot;&quot;&quot;</span>
6469
+ <a id="__codelineno-0-734" name="__codelineno-0-734"></a> <span class="k">if</span> <span class="n">lookup_type</span> <span class="o">==</span> <span class="s2">&quot;exact&quot;</span> <span class="ow">and</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="s2">&quot;choices&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">):</span>
6470
+ <a id="__codelineno-0-735" name="__codelineno-0-735"></a> <span class="k">return</span> <span class="n">django_filters</span><span class="o">.</span><span class="n">MultipleChoiceFilter</span><span class="p">,</span> <span class="p">{</span><span class="s2">&quot;choices&quot;</span><span class="p">:</span> <span class="n">field</span><span class="o">.</span><span class="n">choices</span><span class="p">}</span>
6471
+ <a id="__codelineno-0-736" name="__codelineno-0-736"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">filter_for_lookup</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">lookup_type</span><span class="p">)</span>
6454
6472
  </code></pre></div></td></tr></table></div>
6455
6473
  </details>
6456
6474
  </div>
@@ -6478,15 +6496,7 @@
6478
6496
 
6479
6497
  <details class="quote">
6480
6498
  <summary>Source code in <code>nautobot/core/filters.py</code></summary>
6481
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-698">698</a></span>
6482
- <span class="normal"><a href="#__codelineno-0-699">699</a></span>
6483
- <span class="normal"><a href="#__codelineno-0-700">700</a></span>
6484
- <span class="normal"><a href="#__codelineno-0-701">701</a></span>
6485
- <span class="normal"><a href="#__codelineno-0-702">702</a></span>
6486
- <span class="normal"><a href="#__codelineno-0-703">703</a></span>
6487
- <span class="normal"><a href="#__codelineno-0-704">704</a></span>
6488
- <span class="normal"><a href="#__codelineno-0-705">705</a></span>
6489
- <span class="normal"><a href="#__codelineno-0-706">706</a></span>
6499
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-706">706</a></span>
6490
6500
  <span class="normal"><a href="#__codelineno-0-707">707</a></span>
6491
6501
  <span class="normal"><a href="#__codelineno-0-708">708</a></span>
6492
6502
  <span class="normal"><a href="#__codelineno-0-709">709</a></span>
@@ -6498,27 +6508,35 @@
6498
6508
  <span class="normal"><a href="#__codelineno-0-715">715</a></span>
6499
6509
  <span class="normal"><a href="#__codelineno-0-716">716</a></span>
6500
6510
  <span class="normal"><a href="#__codelineno-0-717">717</a></span>
6501
- <span class="normal"><a href="#__codelineno-0-718">718</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-698" name="__codelineno-0-698"></a><span class="nd">@classmethod</span>
6502
- <a id="__codelineno-0-699" name="__codelineno-0-699"></a><span class="k">def</span> <span class="nf">get_filters</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6503
- <a id="__codelineno-0-700" name="__codelineno-0-700"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6504
- <a id="__codelineno-0-701" name="__codelineno-0-701"></a><span class="sd"> Override filter generation to support dynamic lookup expressions for certain filter types.</span>
6505
- <a id="__codelineno-0-702" name="__codelineno-0-702"></a><span class="sd"> &quot;&quot;&quot;</span>
6506
- <a id="__codelineno-0-703" name="__codelineno-0-703"></a> <span class="n">filters</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_filters</span><span class="p">()</span>
6507
- <a id="__codelineno-0-704" name="__codelineno-0-704"></a>
6508
- <a id="__codelineno-0-705" name="__codelineno-0-705"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6509
- <a id="__codelineno-0-706" name="__codelineno-0-706"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6510
- <a id="__codelineno-0-707" name="__codelineno-0-707"></a> <span class="n">new_filters</span> <span class="o">=</span> <span class="p">{}</span>
6511
- <a id="__codelineno-0-708" name="__codelineno-0-708"></a> <span class="k">for</span> <span class="n">existing_filter_name</span><span class="p">,</span> <span class="n">existing_filter</span> <span class="ow">in</span> <span class="n">filters</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6512
- <a id="__codelineno-0-709" name="__codelineno-0-709"></a> <span class="n">new_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6513
- <a id="__codelineno-0-710" name="__codelineno-0-710"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span>
6514
- <a id="__codelineno-0-711" name="__codelineno-0-711"></a> <span class="n">filter_name</span><span class="o">=</span><span class="n">existing_filter_name</span><span class="p">,</span>
6515
- <a id="__codelineno-0-712" name="__codelineno-0-712"></a> <span class="n">filter_field</span><span class="o">=</span><span class="n">existing_filter</span><span class="p">,</span>
6516
- <a id="__codelineno-0-713" name="__codelineno-0-713"></a> <span class="p">)</span>
6517
- <a id="__codelineno-0-714" name="__codelineno-0-714"></a> <span class="p">)</span>
6518
- <a id="__codelineno-0-715" name="__codelineno-0-715"></a>
6519
- <a id="__codelineno-0-716" name="__codelineno-0-716"></a> <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_filters</span><span class="p">)</span>
6520
- <a id="__codelineno-0-717" name="__codelineno-0-717"></a>
6521
- <a id="__codelineno-0-718" name="__codelineno-0-718"></a> <span class="k">return</span> <span class="n">filters</span>
6511
+ <span class="normal"><a href="#__codelineno-0-718">718</a></span>
6512
+ <span class="normal"><a href="#__codelineno-0-719">719</a></span>
6513
+ <span class="normal"><a href="#__codelineno-0-720">720</a></span>
6514
+ <span class="normal"><a href="#__codelineno-0-721">721</a></span>
6515
+ <span class="normal"><a href="#__codelineno-0-722">722</a></span>
6516
+ <span class="normal"><a href="#__codelineno-0-723">723</a></span>
6517
+ <span class="normal"><a href="#__codelineno-0-724">724</a></span>
6518
+ <span class="normal"><a href="#__codelineno-0-725">725</a></span>
6519
+ <span class="normal"><a href="#__codelineno-0-726">726</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-706" name="__codelineno-0-706"></a><span class="nd">@classmethod</span>
6520
+ <a id="__codelineno-0-707" name="__codelineno-0-707"></a><span class="k">def</span> <span class="nf">get_filters</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
6521
+ <a id="__codelineno-0-708" name="__codelineno-0-708"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
6522
+ <a id="__codelineno-0-709" name="__codelineno-0-709"></a><span class="sd"> Override filter generation to support dynamic lookup expressions for certain filter types.</span>
6523
+ <a id="__codelineno-0-710" name="__codelineno-0-710"></a><span class="sd"> &quot;&quot;&quot;</span>
6524
+ <a id="__codelineno-0-711" name="__codelineno-0-711"></a> <span class="n">filters</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_filters</span><span class="p">()</span>
6525
+ <a id="__codelineno-0-712" name="__codelineno-0-712"></a>
6526
+ <a id="__codelineno-0-713" name="__codelineno-0-713"></a> <span class="c1"># django-filters has no concept of &quot;abstract&quot; filtersets, so we have to fake it</span>
6527
+ <a id="__codelineno-0-714" name="__codelineno-0-714"></a> <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
6528
+ <a id="__codelineno-0-715" name="__codelineno-0-715"></a> <span class="n">new_filters</span> <span class="o">=</span> <span class="p">{}</span>
6529
+ <a id="__codelineno-0-716" name="__codelineno-0-716"></a> <span class="k">for</span> <span class="n">existing_filter_name</span><span class="p">,</span> <span class="n">existing_filter</span> <span class="ow">in</span> <span class="n">filters</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
6530
+ <a id="__codelineno-0-717" name="__codelineno-0-717"></a> <span class="n">new_filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
6531
+ <a id="__codelineno-0-718" name="__codelineno-0-718"></a> <span class="bp">cls</span><span class="o">.</span><span class="n">_generate_lookup_expression_filters</span><span class="p">(</span>
6532
+ <a id="__codelineno-0-719" name="__codelineno-0-719"></a> <span class="n">filter_name</span><span class="o">=</span><span class="n">existing_filter_name</span><span class="p">,</span>
6533
+ <a id="__codelineno-0-720" name="__codelineno-0-720"></a> <span class="n">filter_field</span><span class="o">=</span><span class="n">existing_filter</span><span class="p">,</span>
6534
+ <a id="__codelineno-0-721" name="__codelineno-0-721"></a> <span class="p">)</span>
6535
+ <a id="__codelineno-0-722" name="__codelineno-0-722"></a> <span class="p">)</span>
6536
+ <a id="__codelineno-0-723" name="__codelineno-0-723"></a>
6537
+ <a id="__codelineno-0-724" name="__codelineno-0-724"></a> <span class="n">filters</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_filters</span><span class="p">)</span>
6538
+ <a id="__codelineno-0-725" name="__codelineno-0-725"></a>
6539
+ <a id="__codelineno-0-726" name="__codelineno-0-726"></a> <span class="k">return</span> <span class="n">filters</span>
6522
6540
  </code></pre></div></td></tr></table></div>
6523
6541
  </details>
6524
6542
  </div>
@@ -6542,25 +6560,25 @@
6542
6560
 
6543
6561
  <details class="quote">
6544
6562
  <summary>Source code in <code>nautobot/core/filters.py</code></summary>
6545
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-735">735</a></span>
6546
- <span class="normal"><a href="#__codelineno-0-736">736</a></span>
6547
- <span class="normal"><a href="#__codelineno-0-737">737</a></span>
6548
- <span class="normal"><a href="#__codelineno-0-738">738</a></span>
6549
- <span class="normal"><a href="#__codelineno-0-739">739</a></span>
6550
- <span class="normal"><a href="#__codelineno-0-740">740</a></span>
6551
- <span class="normal"><a href="#__codelineno-0-741">741</a></span>
6552
- <span class="normal"><a href="#__codelineno-0-742">742</a></span>
6553
- <span class="normal"><a href="#__codelineno-0-743">743</a></span>
6554
- <span class="normal"><a href="#__codelineno-0-744">744</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-735" name="__codelineno-0-735"></a><span class="k">def</span> <span class="nf">is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6555
- <a id="__codelineno-0-736" name="__codelineno-0-736"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.is_valid() to potentially enforce settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6556
- <a id="__codelineno-0-737" name="__codelineno-0-737"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6557
- <a id="__codelineno-0-738" name="__codelineno-0-738"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">is_valid</span><span class="p">()</span>
6558
- <a id="__codelineno-0-739" name="__codelineno-0-739"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6559
- <a id="__codelineno-0-740" name="__codelineno-0-740"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">and</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
6560
- <a id="__codelineno-0-741" name="__codelineno-0-741"></a> <span class="k">else</span><span class="p">:</span>
6561
- <a id="__codelineno-0-742" name="__codelineno-0-742"></a> <span class="c1"># Trigger warning logs associated with generating self.errors</span>
6562
- <a id="__codelineno-0-743" name="__codelineno-0-743"></a> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span>
6563
- <a id="__codelineno-0-744" name="__codelineno-0-744"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span>
6563
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-743">743</a></span>
6564
+ <span class="normal"><a href="#__codelineno-0-744">744</a></span>
6565
+ <span class="normal"><a href="#__codelineno-0-745">745</a></span>
6566
+ <span class="normal"><a href="#__codelineno-0-746">746</a></span>
6567
+ <span class="normal"><a href="#__codelineno-0-747">747</a></span>
6568
+ <span class="normal"><a href="#__codelineno-0-748">748</a></span>
6569
+ <span class="normal"><a href="#__codelineno-0-749">749</a></span>
6570
+ <span class="normal"><a href="#__codelineno-0-750">750</a></span>
6571
+ <span class="normal"><a href="#__codelineno-0-751">751</a></span>
6572
+ <span class="normal"><a href="#__codelineno-0-752">752</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-743" name="__codelineno-0-743"></a><span class="k">def</span> <span class="nf">is_valid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
6573
+ <a id="__codelineno-0-744" name="__codelineno-0-744"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Extend FilterSet.is_valid() to potentially enforce settings.STRICT_FILTERING.&quot;&quot;&quot;</span>
6574
+ <a id="__codelineno-0-745" name="__codelineno-0-745"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
6575
+ <a id="__codelineno-0-746" name="__codelineno-0-746"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">is_valid</span><span class="p">()</span>
6576
+ <a id="__codelineno-0-747" name="__codelineno-0-747"></a> <span class="k">if</span> <span class="n">settings</span><span class="o">.</span><span class="n">STRICT_FILTERING</span><span class="p">:</span>
6577
+ <a id="__codelineno-0-748" name="__codelineno-0-748"></a> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span> <span class="ow">and</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span><span class="o">.</span><span class="n">issubset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">form</span><span class="o">.</span><span class="n">cleaned_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
6578
+ <a id="__codelineno-0-749" name="__codelineno-0-749"></a> <span class="k">else</span><span class="p">:</span>
6579
+ <a id="__codelineno-0-750" name="__codelineno-0-750"></a> <span class="c1"># Trigger warning logs associated with generating self.errors</span>
6580
+ <a id="__codelineno-0-751" name="__codelineno-0-751"></a> <span class="bp">self</span><span class="o">.</span><span class="n">errors</span>
6581
+ <a id="__codelineno-0-752" name="__codelineno-0-752"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_valid</span>
6564
6582
  </code></pre></div></td></tr></table></div>
6565
6583
  </details>
6566
6584
  </div>
@@ -7783,17 +7801,17 @@ read from the instance filter. Any <code>kwargs</code> are ignored.</p>
7783
7801
 
7784
7802
  <details class="quote">
7785
7803
  <summary>Source code in <code>nautobot/core/filters.py</code></summary>
7786
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-762">762</a></span>
7787
- <span class="normal"><a href="#__codelineno-0-763">763</a></span>
7788
- <span class="normal"><a href="#__codelineno-0-764">764</a></span>
7789
- <span class="normal"><a href="#__codelineno-0-765">765</a></span>
7790
- <span class="normal"><a href="#__codelineno-0-766">766</a></span>
7791
- <span class="normal"><a href="#__codelineno-0-767">767</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-762" name="__codelineno-0-762"></a><span class="k">class</span> <span class="nc">NameSearchFilterSet</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
7792
- <a id="__codelineno-0-763" name="__codelineno-0-763"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7793
- <a id="__codelineno-0-764" name="__codelineno-0-764"></a><span class="sd"> A base class for adding the search method to models which only expose the `name` field in searches.</span>
7794
- <a id="__codelineno-0-765" name="__codelineno-0-765"></a><span class="sd"> &quot;&quot;&quot;</span>
7795
- <a id="__codelineno-0-766" name="__codelineno-0-766"></a>
7796
- <a id="__codelineno-0-767" name="__codelineno-0-767"></a> <span class="n">q</span> <span class="o">=</span> <span class="n">SearchFilter</span><span class="p">(</span><span class="n">filter_predicates</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;icontains&quot;</span><span class="p">})</span>
7804
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-770">770</a></span>
7805
+ <span class="normal"><a href="#__codelineno-0-771">771</a></span>
7806
+ <span class="normal"><a href="#__codelineno-0-772">772</a></span>
7807
+ <span class="normal"><a href="#__codelineno-0-773">773</a></span>
7808
+ <span class="normal"><a href="#__codelineno-0-774">774</a></span>
7809
+ <span class="normal"><a href="#__codelineno-0-775">775</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-770" name="__codelineno-0-770"></a><span class="k">class</span> <span class="nc">NameSearchFilterSet</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
7810
+ <a id="__codelineno-0-771" name="__codelineno-0-771"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
7811
+ <a id="__codelineno-0-772" name="__codelineno-0-772"></a><span class="sd"> A base class for adding the search method to models which only expose the `name` field in searches.</span>
7812
+ <a id="__codelineno-0-773" name="__codelineno-0-773"></a><span class="sd"> &quot;&quot;&quot;</span>
7813
+ <a id="__codelineno-0-774" name="__codelineno-0-774"></a>
7814
+ <a id="__codelineno-0-775" name="__codelineno-0-775"></a> <span class="n">q</span> <span class="o">=</span> <span class="n">SearchFilter</span><span class="p">(</span><span class="n">filter_predicates</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;icontains&quot;</span><span class="p">})</span>
7797
7815
  </code></pre></div></td></tr></table></div>
7798
7816
  </details>
7799
7817
 
@@ -8082,27 +8100,27 @@ are needed.</p>
8082
8100
 
8083
8101
  <details class="quote">
8084
8102
  <summary>Source code in <code>nautobot/extras/filters/__init__.py</code></summary>
8085
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-375">375</a></span>
8086
- <span class="normal"><a href="#__codelineno-0-376">376</a></span>
8087
- <span class="normal"><a href="#__codelineno-0-377">377</a></span>
8088
- <span class="normal"><a href="#__codelineno-0-378">378</a></span>
8089
- <span class="normal"><a href="#__codelineno-0-379">379</a></span>
8103
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-379">379</a></span>
8090
8104
  <span class="normal"><a href="#__codelineno-0-380">380</a></span>
8091
8105
  <span class="normal"><a href="#__codelineno-0-381">381</a></span>
8092
8106
  <span class="normal"><a href="#__codelineno-0-382">382</a></span>
8093
8107
  <span class="normal"><a href="#__codelineno-0-383">383</a></span>
8094
8108
  <span class="normal"><a href="#__codelineno-0-384">384</a></span>
8095
- <span class="normal"><a href="#__codelineno-0-385">385</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-375" name="__codelineno-0-375"></a><span class="k">class</span> <span class="nc">NautobotFilterSet</span><span class="p">(</span>
8096
- <a id="__codelineno-0-376" name="__codelineno-0-376"></a> <span class="n">BaseFilterSet</span><span class="p">,</span>
8097
- <a id="__codelineno-0-377" name="__codelineno-0-377"></a> <span class="n">CreatedUpdatedModelFilterSetMixin</span><span class="p">,</span>
8098
- <a id="__codelineno-0-378" name="__codelineno-0-378"></a> <span class="n">RelationshipModelFilterSetMixin</span><span class="p">,</span>
8099
- <a id="__codelineno-0-379" name="__codelineno-0-379"></a> <span class="n">CustomFieldModelFilterSetMixin</span><span class="p">,</span>
8100
- <a id="__codelineno-0-380" name="__codelineno-0-380"></a><span class="p">):</span>
8101
- <a id="__codelineno-0-381" name="__codelineno-0-381"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8102
- <a id="__codelineno-0-382" name="__codelineno-0-382"></a><span class="sd"> This class exists to combine common functionality and is used as a base class throughout the codebase where all of</span>
8103
- <a id="__codelineno-0-383" name="__codelineno-0-383"></a><span class="sd"> BaseFilterSet, CreatedUpdatedModelFilterSetMixin, RelationshipModelFilterSetMixin and CustomFieldModelFilterSetMixin</span>
8104
- <a id="__codelineno-0-384" name="__codelineno-0-384"></a><span class="sd"> are needed.</span>
8105
- <a id="__codelineno-0-385" name="__codelineno-0-385"></a><span class="sd"> &quot;&quot;&quot;</span>
8109
+ <span class="normal"><a href="#__codelineno-0-385">385</a></span>
8110
+ <span class="normal"><a href="#__codelineno-0-386">386</a></span>
8111
+ <span class="normal"><a href="#__codelineno-0-387">387</a></span>
8112
+ <span class="normal"><a href="#__codelineno-0-388">388</a></span>
8113
+ <span class="normal"><a href="#__codelineno-0-389">389</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-379" name="__codelineno-0-379"></a><span class="k">class</span> <span class="nc">NautobotFilterSet</span><span class="p">(</span>
8114
+ <a id="__codelineno-0-380" name="__codelineno-0-380"></a> <span class="n">BaseFilterSet</span><span class="p">,</span>
8115
+ <a id="__codelineno-0-381" name="__codelineno-0-381"></a> <span class="n">CreatedUpdatedModelFilterSetMixin</span><span class="p">,</span>
8116
+ <a id="__codelineno-0-382" name="__codelineno-0-382"></a> <span class="n">RelationshipModelFilterSetMixin</span><span class="p">,</span>
8117
+ <a id="__codelineno-0-383" name="__codelineno-0-383"></a> <span class="n">CustomFieldModelFilterSetMixin</span><span class="p">,</span>
8118
+ <a id="__codelineno-0-384" name="__codelineno-0-384"></a><span class="p">):</span>
8119
+ <a id="__codelineno-0-385" name="__codelineno-0-385"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8120
+ <a id="__codelineno-0-386" name="__codelineno-0-386"></a><span class="sd"> This class exists to combine common functionality and is used as a base class throughout the codebase where all of</span>
8121
+ <a id="__codelineno-0-387" name="__codelineno-0-387"></a><span class="sd"> BaseFilterSet, CreatedUpdatedModelFilterSetMixin, RelationshipModelFilterSetMixin and CustomFieldModelFilterSetMixin</span>
8122
+ <a id="__codelineno-0-388" name="__codelineno-0-388"></a><span class="sd"> are needed.</span>
8123
+ <a id="__codelineno-0-389" name="__codelineno-0-389"></a><span class="sd"> &quot;&quot;&quot;</span>
8106
8124
  </code></pre></div></td></tr></table></div>
8107
8125
  </details>
8108
8126
 
@@ -8623,7 +8641,7 @@ argument to test for the existence of related objects.</p>
8623
8641
  Bases: <code><a class="autorefs autorefs-internal" title="nautobot.core.filters.NaturalKeyOrPKMultipleChoiceFilter" href="#nautobot.apps.filters.NaturalKeyOrPKMultipleChoiceFilter">NaturalKeyOrPKMultipleChoiceFilter</a></code></p>
8624
8642
 
8625
8643
 
8626
- <p>Limit role choices to the available role choices for self.model</p>
8644
+ <p>Filter field used for filtering Role fields.</p>
8627
8645
 
8628
8646
  <details class="quote">
8629
8647
  <summary>Source code in <code>nautobot/extras/filters/mixins.py</code></summary>
@@ -8633,25 +8651,13 @@ argument to test for the existence of related objects.</p>
8633
8651
  <span class="normal"><a href="#__codelineno-0-296">296</a></span>
8634
8652
  <span class="normal"><a href="#__codelineno-0-297">297</a></span>
8635
8653
  <span class="normal"><a href="#__codelineno-0-298">298</a></span>
8636
- <span class="normal"><a href="#__codelineno-0-299">299</a></span>
8637
- <span class="normal"><a href="#__codelineno-0-300">300</a></span>
8638
- <span class="normal"><a href="#__codelineno-0-301">301</a></span>
8639
- <span class="normal"><a href="#__codelineno-0-302">302</a></span>
8640
- <span class="normal"><a href="#__codelineno-0-303">303</a></span>
8641
- <span class="normal"><a href="#__codelineno-0-304">304</a></span>
8642
- <span class="normal"><a href="#__codelineno-0-305">305</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-293" name="__codelineno-0-293"></a><span class="k">class</span> <span class="nc">RoleFilter</span><span class="p">(</span><span class="n">NaturalKeyOrPKMultipleChoiceFilter</span><span class="p">):</span>
8643
- <a id="__codelineno-0-294" name="__codelineno-0-294"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Limit role choices to the available role choices for self.model&quot;&quot;&quot;</span>
8654
+ <span class="normal"><a href="#__codelineno-0-299">299</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-293" name="__codelineno-0-293"></a><span class="k">class</span> <span class="nc">RoleFilter</span><span class="p">(</span><span class="n">NaturalKeyOrPKMultipleChoiceFilter</span><span class="p">):</span>
8655
+ <a id="__codelineno-0-294" name="__codelineno-0-294"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Filter field used for filtering Role fields.&quot;&quot;&quot;</span>
8644
8656
  <a id="__codelineno-0-295" name="__codelineno-0-295"></a>
8645
8657
  <a id="__codelineno-0-296" name="__codelineno-0-296"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
8646
- <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;field_name&quot;</span><span class="p">,</span> <span class="s2">&quot;role&quot;</span><span class="p">)</span>
8647
- <a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;queryset&quot;</span><span class="p">,</span> <span class="n">Role</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
8648
- <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;to_field_name&quot;</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span>
8649
- <a id="__codelineno-0-300" name="__codelineno-0-300"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;label&quot;</span><span class="p">,</span> <span class="s2">&quot;Role (name or ID)&quot;</span><span class="p">)</span>
8650
- <a id="__codelineno-0-301" name="__codelineno-0-301"></a>
8651
- <a id="__codelineno-0-302" name="__codelineno-0-302"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
8652
- <a id="__codelineno-0-303" name="__codelineno-0-303"></a>
8653
- <a id="__codelineno-0-304" name="__codelineno-0-304"></a> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
8654
- <a id="__codelineno-0-305" name="__codelineno-0-305"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span><span class="o">.</span><span class="n">get_for_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
8658
+ <a id="__codelineno-0-297" name="__codelineno-0-297"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;queryset&quot;</span><span class="p">,</span> <span class="n">Role</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
8659
+ <a id="__codelineno-0-298" name="__codelineno-0-298"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;label&quot;</span><span class="p">,</span> <span class="s2">&quot;Role (name or ID)&quot;</span><span class="p">)</span>
8660
+ <a id="__codelineno-0-299" name="__codelineno-0-299"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
8655
8661
  </code></pre></div></td></tr></table></div>
8656
8662
  </details>
8657
8663
 
@@ -8695,17 +8701,17 @@ argument to test for the existence of related objects.</p>
8695
8701
 
8696
8702
  <details class="quote">
8697
8703
  <summary>Source code in <code>nautobot/extras/filters/mixins.py</code></summary>
8698
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-308">308</a></span>
8699
- <span class="normal"><a href="#__codelineno-0-309">309</a></span>
8700
- <span class="normal"><a href="#__codelineno-0-310">310</a></span>
8701
- <span class="normal"><a href="#__codelineno-0-311">311</a></span>
8702
- <span class="normal"><a href="#__codelineno-0-312">312</a></span>
8703
- <span class="normal"><a href="#__codelineno-0-313">313</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-308" name="__codelineno-0-308"></a><span class="k">class</span> <span class="nc">RoleModelFilterSetMixin</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
8704
- <a id="__codelineno-0-309" name="__codelineno-0-309"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8705
- <a id="__codelineno-0-310" name="__codelineno-0-310"></a><span class="sd"> Mixin to add a `role` filter field to a FilterSet.</span>
8706
- <a id="__codelineno-0-311" name="__codelineno-0-311"></a><span class="sd"> &quot;&quot;&quot;</span>
8707
- <a id="__codelineno-0-312" name="__codelineno-0-312"></a>
8708
- <a id="__codelineno-0-313" name="__codelineno-0-313"></a> <span class="n">role</span> <span class="o">=</span> <span class="n">RoleFilter</span><span class="p">()</span>
8704
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-302">302</a></span>
8705
+ <span class="normal"><a href="#__codelineno-0-303">303</a></span>
8706
+ <span class="normal"><a href="#__codelineno-0-304">304</a></span>
8707
+ <span class="normal"><a href="#__codelineno-0-305">305</a></span>
8708
+ <span class="normal"><a href="#__codelineno-0-306">306</a></span>
8709
+ <span class="normal"><a href="#__codelineno-0-307">307</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-302" name="__codelineno-0-302"></a><span class="k">class</span> <span class="nc">RoleModelFilterSetMixin</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
8710
+ <a id="__codelineno-0-303" name="__codelineno-0-303"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8711
+ <a id="__codelineno-0-304" name="__codelineno-0-304"></a><span class="sd"> Mixin to add a `role` filter field to a FilterSet.</span>
8712
+ <a id="__codelineno-0-305" name="__codelineno-0-305"></a><span class="sd"> &quot;&quot;&quot;</span>
8713
+ <a id="__codelineno-0-306" name="__codelineno-0-306"></a>
8714
+ <a id="__codelineno-0-307" name="__codelineno-0-307"></a> <span class="n">role</span> <span class="o">=</span> <span class="n">RoleFilter</span><span class="p">()</span>
8709
8715
  </code></pre></div></td></tr></table></div>
8710
8716
  </details>
8711
8717
 
@@ -8801,71 +8807,30 @@ argument to test for the existence of related objects.</p>
8801
8807
 
8802
8808
  <div class="doc doc-contents ">
8803
8809
  <p class="doc doc-class-bases">
8804
- Bases: <code>django_filters.<span title="django_filters.ModelMultipleChoiceFilter">ModelMultipleChoiceFilter</span></code></p>
8810
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.core.filters.NaturalKeyOrPKMultipleChoiceFilter" href="#nautobot.apps.filters.NaturalKeyOrPKMultipleChoiceFilter">NaturalKeyOrPKMultipleChoiceFilter</a></code></p>
8805
8811
 
8806
8812
 
8807
8813
  <p>Filter field used for filtering Status fields.</p>
8808
- <p>Explicitly sets <code>to_field_name='value'</code> and dynamically sets queryset to
8809
- retrieve choices for the corresponding model &amp; field name bound to the
8810
- filterset.</p>
8811
8814
 
8812
8815
  <details class="quote">
8813
8816
  <summary>Source code in <code>nautobot/extras/filters/mixins.py</code></summary>
8814
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-316">316</a></span>
8817
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-310">310</a></span>
8818
+ <span class="normal"><a href="#__codelineno-0-311">311</a></span>
8819
+ <span class="normal"><a href="#__codelineno-0-312">312</a></span>
8820
+ <span class="normal"><a href="#__codelineno-0-313">313</a></span>
8821
+ <span class="normal"><a href="#__codelineno-0-314">314</a></span>
8822
+ <span class="normal"><a href="#__codelineno-0-315">315</a></span>
8823
+ <span class="normal"><a href="#__codelineno-0-316">316</a></span>
8815
8824
  <span class="normal"><a href="#__codelineno-0-317">317</a></span>
8816
- <span class="normal"><a href="#__codelineno-0-318">318</a></span>
8817
- <span class="normal"><a href="#__codelineno-0-319">319</a></span>
8818
- <span class="normal"><a href="#__codelineno-0-320">320</a></span>
8819
- <span class="normal"><a href="#__codelineno-0-321">321</a></span>
8820
- <span class="normal"><a href="#__codelineno-0-322">322</a></span>
8821
- <span class="normal"><a href="#__codelineno-0-323">323</a></span>
8822
- <span class="normal"><a href="#__codelineno-0-324">324</a></span>
8823
- <span class="normal"><a href="#__codelineno-0-325">325</a></span>
8824
- <span class="normal"><a href="#__codelineno-0-326">326</a></span>
8825
- <span class="normal"><a href="#__codelineno-0-327">327</a></span>
8826
- <span class="normal"><a href="#__codelineno-0-328">328</a></span>
8827
- <span class="normal"><a href="#__codelineno-0-329">329</a></span>
8828
- <span class="normal"><a href="#__codelineno-0-330">330</a></span>
8829
- <span class="normal"><a href="#__codelineno-0-331">331</a></span>
8830
- <span class="normal"><a href="#__codelineno-0-332">332</a></span>
8831
- <span class="normal"><a href="#__codelineno-0-333">333</a></span>
8832
- <span class="normal"><a href="#__codelineno-0-334">334</a></span>
8833
- <span class="normal"><a href="#__codelineno-0-335">335</a></span>
8834
- <span class="normal"><a href="#__codelineno-0-336">336</a></span>
8835
- <span class="normal"><a href="#__codelineno-0-337">337</a></span>
8836
- <span class="normal"><a href="#__codelineno-0-338">338</a></span>
8837
- <span class="normal"><a href="#__codelineno-0-339">339</a></span>
8838
- <span class="normal"><a href="#__codelineno-0-340">340</a></span>
8839
- <span class="normal"><a href="#__codelineno-0-341">341</a></span>
8840
- <span class="normal"><a href="#__codelineno-0-342">342</a></span>
8841
- <span class="normal"><a href="#__codelineno-0-343">343</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-316" name="__codelineno-0-316"></a><span class="k">class</span> <span class="nc">StatusFilter</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">ModelMultipleChoiceFilter</span><span class="p">):</span>
8842
- <a id="__codelineno-0-317" name="__codelineno-0-317"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8843
- <a id="__codelineno-0-318" name="__codelineno-0-318"></a><span class="sd"> Filter field used for filtering Status fields.</span>
8844
- <a id="__codelineno-0-319" name="__codelineno-0-319"></a>
8845
- <a id="__codelineno-0-320" name="__codelineno-0-320"></a><span class="sd"> Explicitly sets `to_field_name=&#39;value&#39;` and dynamically sets queryset to</span>
8846
- <a id="__codelineno-0-321" name="__codelineno-0-321"></a><span class="sd"> retrieve choices for the corresponding model &amp; field name bound to the</span>
8847
- <a id="__codelineno-0-322" name="__codelineno-0-322"></a><span class="sd"> filterset.</span>
8848
- <a id="__codelineno-0-323" name="__codelineno-0-323"></a><span class="sd"> &quot;&quot;&quot;</span>
8849
- <a id="__codelineno-0-324" name="__codelineno-0-324"></a>
8850
- <a id="__codelineno-0-325" name="__codelineno-0-325"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
8851
- <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">kwargs</span><span class="p">[</span><span class="s2">&quot;to_field_name&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span>
8852
- <a id="__codelineno-0-327" name="__codelineno-0-327"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
8853
- <a id="__codelineno-0-328" name="__codelineno-0-328"></a>
8854
- <a id="__codelineno-0-329" name="__codelineno-0-329"></a> <span class="k">def</span> <span class="nf">get_queryset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
8855
- <a id="__codelineno-0-330" name="__codelineno-0-330"></a> <span class="bp">self</span><span class="o">.</span><span class="n">queryset</span> <span class="o">=</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
8856
- <a id="__codelineno-0-331" name="__codelineno-0-331"></a> <span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">get_queryset</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
8857
- <a id="__codelineno-0-332" name="__codelineno-0-332"></a>
8858
- <a id="__codelineno-0-333" name="__codelineno-0-333"></a> <span class="k">def</span> <span class="nf">get_filter_predicate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
8859
- <a id="__codelineno-0-334" name="__codelineno-0-334"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Always use the field&#39;s name and the `to_field_name` attribute as predicate.&quot;&quot;&quot;</span>
8860
- <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="c1"># e.g. `status__name`</span>
8861
- <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">to_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">to_field_name</span>
8862
- <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">field_name</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">to_field_name</span><span class="si">}</span><span class="s2">&quot;</span>
8863
- <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="c1"># Sometimes the incoming value is an instance. This block of logic comes from the base</span>
8864
- <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="c1"># `get_filter_predicate()` and was added here to support this.</span>
8865
- <a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">try</span><span class="p">:</span>
8866
- <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="k">return</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">to_field_name</span><span class="p">)}</span>
8867
- <a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
8868
- <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="k">return</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">value</span><span class="p">}</span>
8825
+ <span class="normal"><a href="#__codelineno-0-318">318</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-310" name="__codelineno-0-310"></a><span class="k">class</span> <span class="nc">StatusFilter</span><span class="p">(</span><span class="n">NaturalKeyOrPKMultipleChoiceFilter</span><span class="p">):</span>
8826
+ <a id="__codelineno-0-311" name="__codelineno-0-311"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8827
+ <a id="__codelineno-0-312" name="__codelineno-0-312"></a><span class="sd"> Filter field used for filtering Status fields.</span>
8828
+ <a id="__codelineno-0-313" name="__codelineno-0-313"></a><span class="sd"> &quot;&quot;&quot;</span>
8829
+ <a id="__codelineno-0-314" name="__codelineno-0-314"></a>
8830
+ <a id="__codelineno-0-315" name="__codelineno-0-315"></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
8831
+ <a id="__codelineno-0-316" name="__codelineno-0-316"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;queryset&quot;</span><span class="p">,</span> <span class="n">Status</span><span class="o">.</span><span class="n">objects</span><span class="o">.</span><span class="n">all</span><span class="p">())</span>
8832
+ <a id="__codelineno-0-317" name="__codelineno-0-317"></a> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s2">&quot;label&quot;</span><span class="p">,</span> <span class="s2">&quot;Status (name or ID)&quot;</span><span class="p">)</span>
8833
+ <a id="__codelineno-0-318" name="__codelineno-0-318"></a> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
8869
8834
  </code></pre></div></td></tr></table></div>
8870
8835
  </details>
8871
8836
 
@@ -8882,50 +8847,6 @@ filterset.</p>
8882
8847
 
8883
8848
 
8884
8849
 
8885
- <div class="doc doc-object doc-function">
8886
-
8887
-
8888
-
8889
- <h3 id="nautobot.extras.filters.mixins.StatusFilter.get_filter_predicate" class="doc doc-heading">
8890
- <code class="highlight language-python"><span class="n">get_filter_predicate</span><span class="p">(</span><span class="n">value</span><span class="p">)</span></code>
8891
-
8892
- <a href="#nautobot.extras.filters.mixins.StatusFilter.get_filter_predicate" class="headerlink" title="Permanent link">&para;</a></h3>
8893
-
8894
-
8895
- <div class="doc doc-contents ">
8896
-
8897
- <p>Always use the field's name and the <code>to_field_name</code> attribute as predicate.</p>
8898
-
8899
- <details class="quote">
8900
- <summary>Source code in <code>nautobot/extras/filters/mixins.py</code></summary>
8901
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-333">333</a></span>
8902
- <span class="normal"><a href="#__codelineno-0-334">334</a></span>
8903
- <span class="normal"><a href="#__codelineno-0-335">335</a></span>
8904
- <span class="normal"><a href="#__codelineno-0-336">336</a></span>
8905
- <span class="normal"><a href="#__codelineno-0-337">337</a></span>
8906
- <span class="normal"><a href="#__codelineno-0-338">338</a></span>
8907
- <span class="normal"><a href="#__codelineno-0-339">339</a></span>
8908
- <span class="normal"><a href="#__codelineno-0-340">340</a></span>
8909
- <span class="normal"><a href="#__codelineno-0-341">341</a></span>
8910
- <span class="normal"><a href="#__codelineno-0-342">342</a></span>
8911
- <span class="normal"><a href="#__codelineno-0-343">343</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-333" name="__codelineno-0-333"></a><span class="k">def</span> <span class="nf">get_filter_predicate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
8912
- <a id="__codelineno-0-334" name="__codelineno-0-334"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Always use the field&#39;s name and the `to_field_name` attribute as predicate.&quot;&quot;&quot;</span>
8913
- <a id="__codelineno-0-335" name="__codelineno-0-335"></a> <span class="c1"># e.g. `status__name`</span>
8914
- <a id="__codelineno-0-336" name="__codelineno-0-336"></a> <span class="n">to_field_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">field</span><span class="o">.</span><span class="n">to_field_name</span>
8915
- <a id="__codelineno-0-337" name="__codelineno-0-337"></a> <span class="n">name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">field_name</span><span class="si">}</span><span class="s2">__</span><span class="si">{</span><span class="n">to_field_name</span><span class="si">}</span><span class="s2">&quot;</span>
8916
- <a id="__codelineno-0-338" name="__codelineno-0-338"></a> <span class="c1"># Sometimes the incoming value is an instance. This block of logic comes from the base</span>
8917
- <a id="__codelineno-0-339" name="__codelineno-0-339"></a> <span class="c1"># `get_filter_predicate()` and was added here to support this.</span>
8918
- <a id="__codelineno-0-340" name="__codelineno-0-340"></a> <span class="k">try</span><span class="p">:</span>
8919
- <a id="__codelineno-0-341" name="__codelineno-0-341"></a> <span class="k">return</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">to_field_name</span><span class="p">)}</span>
8920
- <a id="__codelineno-0-342" name="__codelineno-0-342"></a> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span>
8921
- <a id="__codelineno-0-343" name="__codelineno-0-343"></a> <span class="k">return</span> <span class="p">{</span><span class="n">name</span><span class="p">:</span> <span class="n">value</span><span class="p">}</span>
8922
- </code></pre></div></td></tr></table></div>
8923
- </details>
8924
- </div>
8925
-
8926
- </div>
8927
-
8928
-
8929
8850
 
8930
8851
  </div>
8931
8852
 
@@ -8953,17 +8874,17 @@ filterset.</p>
8953
8874
 
8954
8875
  <details class="quote">
8955
8876
  <summary>Source code in <code>nautobot/extras/filters/mixins.py</code></summary>
8956
- <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-346">346</a></span>
8957
- <span class="normal"><a href="#__codelineno-0-347">347</a></span>
8958
- <span class="normal"><a href="#__codelineno-0-348">348</a></span>
8959
- <span class="normal"><a href="#__codelineno-0-349">349</a></span>
8960
- <span class="normal"><a href="#__codelineno-0-350">350</a></span>
8961
- <span class="normal"><a href="#__codelineno-0-351">351</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-346" name="__codelineno-0-346"></a><span class="k">class</span> <span class="nc">StatusModelFilterSetMixin</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
8962
- <a id="__codelineno-0-347" name="__codelineno-0-347"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8963
- <a id="__codelineno-0-348" name="__codelineno-0-348"></a><span class="sd"> Mixin to add a `status` filter field to a FilterSet.</span>
8964
- <a id="__codelineno-0-349" name="__codelineno-0-349"></a><span class="sd"> &quot;&quot;&quot;</span>
8965
- <a id="__codelineno-0-350" name="__codelineno-0-350"></a>
8966
- <a id="__codelineno-0-351" name="__codelineno-0-351"></a> <span class="n">status</span> <span class="o">=</span> <span class="n">StatusFilter</span><span class="p">()</span>
8877
+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-321">321</a></span>
8878
+ <span class="normal"><a href="#__codelineno-0-322">322</a></span>
8879
+ <span class="normal"><a href="#__codelineno-0-323">323</a></span>
8880
+ <span class="normal"><a href="#__codelineno-0-324">324</a></span>
8881
+ <span class="normal"><a href="#__codelineno-0-325">325</a></span>
8882
+ <span class="normal"><a href="#__codelineno-0-326">326</a></span></pre></div></td><td class="code"><div><pre><span></span><code><a id="__codelineno-0-321" name="__codelineno-0-321"></a><span class="k">class</span> <span class="nc">StatusModelFilterSetMixin</span><span class="p">(</span><span class="n">django_filters</span><span class="o">.</span><span class="n">FilterSet</span><span class="p">):</span>
8883
+ <a id="__codelineno-0-322" name="__codelineno-0-322"></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
8884
+ <a id="__codelineno-0-323" name="__codelineno-0-323"></a><span class="sd"> Mixin to add a `status` filter field to a FilterSet.</span>
8885
+ <a id="__codelineno-0-324" name="__codelineno-0-324"></a><span class="sd"> &quot;&quot;&quot;</span>
8886
+ <a id="__codelineno-0-325" name="__codelineno-0-325"></a>
8887
+ <a id="__codelineno-0-326" name="__codelineno-0-326"></a> <span class="n">status</span> <span class="o">=</span> <span class="n">StatusFilter</span><span class="p">()</span>
8967
8888
  </code></pre></div></td></tr></table></div>
8968
8889
  </details>
8969
8890