nautobot 2.4.0__py3-none-any.whl → 2.4.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 (592) hide show
  1. nautobot/apps/__init__.py +1 -1
  2. nautobot/apps/api.py +8 -8
  3. nautobot/apps/change_logging.py +2 -2
  4. nautobot/apps/choices.py +4 -4
  5. nautobot/apps/events.py +3 -3
  6. nautobot/apps/factory.py +2 -2
  7. nautobot/apps/filters.py +1 -1
  8. nautobot/apps/forms.py +20 -20
  9. nautobot/apps/graphql.py +2 -2
  10. nautobot/apps/jobs.py +8 -8
  11. nautobot/apps/models.py +19 -19
  12. nautobot/apps/tables.py +1 -1
  13. nautobot/apps/testing.py +10 -10
  14. nautobot/apps/ui.py +2 -2
  15. nautobot/apps/utils.py +7 -7
  16. nautobot/apps/views.py +7 -7
  17. nautobot/circuits/api/serializers.py +0 -1
  18. nautobot/circuits/api/views.py +8 -4
  19. nautobot/circuits/tables.py +1 -2
  20. nautobot/circuits/templates/circuits/circuit_create.html +7 -1
  21. nautobot/circuits/views.py +3 -3
  22. nautobot/cloud/api/views.py +10 -6
  23. nautobot/cloud/models.py +1 -1
  24. nautobot/cloud/views.py +16 -0
  25. nautobot/core/api/fields.py +5 -5
  26. nautobot/core/api/filter_backends.py +9 -3
  27. nautobot/core/api/schema.py +2 -13
  28. nautobot/core/api/serializers.py +34 -40
  29. nautobot/core/api/views.py +4 -56
  30. nautobot/core/celery/log.py +4 -4
  31. nautobot/core/celery/schedulers.py +1 -1
  32. nautobot/core/choices.py +2 -2
  33. nautobot/core/events/__init__.py +3 -3
  34. nautobot/core/filters.py +16 -21
  35. nautobot/core/fixtures/user-data.json +59 -0
  36. nautobot/core/forms/__init__.py +19 -19
  37. nautobot/core/forms/fields.py +11 -14
  38. nautobot/core/forms/forms.py +2 -33
  39. nautobot/core/graphql/types.py +1 -1
  40. nautobot/core/jobs/__init__.py +7 -28
  41. nautobot/core/jobs/cleanup.py +12 -48
  42. nautobot/core/jobs/groups.py +1 -1
  43. nautobot/core/management/commands/validate_models.py +1 -1
  44. nautobot/core/models/__init__.py +1 -1
  45. nautobot/core/models/query_functions.py +2 -2
  46. nautobot/core/models/tree_queries.py +3 -6
  47. nautobot/core/settings.py +2 -29
  48. nautobot/core/settings.yaml +0 -21
  49. nautobot/core/tables.py +60 -74
  50. nautobot/core/templates/inc/media.html +0 -3
  51. nautobot/core/templates/inc/nav_menu.html +0 -1
  52. nautobot/core/templates/nautobot_config.py.j2 +0 -13
  53. nautobot/core/templates/search.html +0 -7
  54. nautobot/core/templates/utilities/render_jinja2.html +1 -1
  55. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  56. nautobot/core/templates/utilities/theme_preview.html +0 -7
  57. nautobot/core/templatetags/helpers.py +2 -11
  58. nautobot/core/testing/__init__.py +8 -8
  59. nautobot/core/testing/api.py +15 -170
  60. nautobot/core/testing/filters.py +2 -25
  61. nautobot/core/testing/forms.py +0 -2
  62. nautobot/core/testing/mixins.py +2 -7
  63. nautobot/core/testing/views.py +29 -44
  64. nautobot/core/tests/integration/test_app_home.py +1 -0
  65. nautobot/core/tests/integration/test_app_navbar.py +1 -0
  66. nautobot/core/tests/integration/test_filters.py +2 -0
  67. nautobot/core/tests/integration/test_home.py +1 -0
  68. nautobot/core/tests/integration/test_navbar.py +1 -0
  69. nautobot/core/tests/integration/test_view_authentication.py +0 -1
  70. nautobot/core/tests/runner.py +1 -1
  71. nautobot/core/tests/test_api.py +1 -98
  72. nautobot/core/tests/test_csv.py +3 -25
  73. nautobot/core/tests/test_forms.py +0 -1
  74. nautobot/core/tests/test_jobs.py +1 -303
  75. nautobot/core/tests/test_settings_schema.py +0 -7
  76. nautobot/core/tests/test_tables.py +0 -100
  77. nautobot/core/tests/test_utils.py +1 -63
  78. nautobot/core/tests/test_views.py +3 -30
  79. nautobot/core/ui/nav.py +0 -1
  80. nautobot/core/ui/object_detail.py +1 -15
  81. nautobot/core/urls.py +0 -11
  82. nautobot/core/utils/lookup.py +8 -11
  83. nautobot/core/utils/requests.py +9 -24
  84. nautobot/core/views/__init__.py +0 -42
  85. nautobot/core/views/generic.py +176 -78
  86. nautobot/core/views/mixins.py +34 -94
  87. nautobot/core/views/renderers.py +6 -6
  88. nautobot/dcim/api/serializers.py +62 -54
  89. nautobot/dcim/api/views.py +113 -47
  90. nautobot/dcim/filters/__init__.py +2 -31
  91. nautobot/dcim/forms.py +17 -36
  92. nautobot/dcim/graphql/types.py +2 -2
  93. nautobot/dcim/models/__init__.py +1 -1
  94. nautobot/dcim/models/device_component_templates.py +2 -2
  95. nautobot/dcim/models/device_components.py +20 -22
  96. nautobot/dcim/models/devices.py +1 -10
  97. nautobot/dcim/models/locations.py +3 -3
  98. nautobot/dcim/models/power.py +5 -6
  99. nautobot/dcim/models/racks.py +4 -4
  100. nautobot/dcim/tables/__init__.py +3 -3
  101. nautobot/dcim/tables/devices.py +5 -7
  102. nautobot/dcim/tables/devicetypes.py +2 -2
  103. nautobot/dcim/tables/racks.py +1 -1
  104. nautobot/dcim/templates/dcim/controller_create.html +7 -1
  105. nautobot/dcim/templates/dcim/controller_retrieve.html +9 -1
  106. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -2
  107. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -5
  108. nautobot/dcim/templates/dcim/device.html +9 -1
  109. nautobot/dcim/templates/dcim/device_edit.html +37 -36
  110. nautobot/dcim/templates/dcim/location.html +9 -1
  111. nautobot/dcim/templates/dcim/location_edit.html +7 -1
  112. nautobot/dcim/templates/dcim/rack.html +9 -1
  113. nautobot/dcim/templates/dcim/rack_edit.html +7 -1
  114. nautobot/dcim/templates/dcim/rackreservation.html +9 -1
  115. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +9 -1
  116. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +7 -1
  117. nautobot/dcim/tests/test_api.py +3 -16
  118. nautobot/dcim/tests/test_filters.py +0 -33
  119. nautobot/dcim/tests/test_forms.py +2 -51
  120. nautobot/dcim/tests/test_graphql.py +0 -52
  121. nautobot/dcim/tests/test_models.py +5 -34
  122. nautobot/dcim/tests/test_views.py +83 -21
  123. nautobot/dcim/views.py +13 -1
  124. nautobot/extras/api/customfields.py +2 -2
  125. nautobot/extras/api/serializers.py +85 -90
  126. nautobot/extras/api/views.py +27 -22
  127. nautobot/extras/constants.py +0 -2
  128. nautobot/extras/filters/__init__.py +6 -8
  129. nautobot/extras/forms/base.py +2 -2
  130. nautobot/extras/forms/forms.py +31 -139
  131. nautobot/extras/forms/mixins.py +5 -13
  132. nautobot/extras/group_sync.py +3 -3
  133. nautobot/extras/health_checks.py +2 -1
  134. nautobot/extras/jobs.py +12 -70
  135. nautobot/extras/managers.py +1 -3
  136. nautobot/extras/migrations/0018_joblog_data_migration.py +9 -7
  137. nautobot/extras/models/__init__.py +1 -1
  138. nautobot/extras/models/contacts.py +1 -1
  139. nautobot/extras/models/customfields.py +11 -12
  140. nautobot/extras/models/groups.py +9 -11
  141. nautobot/extras/models/jobs.py +4 -23
  142. nautobot/extras/models/models.py +2 -2
  143. nautobot/extras/plugins/__init__.py +2 -13
  144. nautobot/extras/plugins/marketplace_manifest.yml +79 -84
  145. nautobot/extras/plugins/tables.py +14 -16
  146. nautobot/extras/plugins/views.py +69 -65
  147. nautobot/extras/registry.py +1 -1
  148. nautobot/extras/secrets/__init__.py +2 -2
  149. nautobot/extras/tables.py +5 -7
  150. nautobot/extras/templates/extras/dynamicgroup.html +9 -1
  151. nautobot/extras/templates/extras/job_detail.html +0 -16
  152. nautobot/extras/templates/extras/job_edit.html +0 -1
  153. nautobot/extras/templates/extras/jobqueue_retrieve.html +9 -1
  154. nautobot/extras/templates/extras/marketplace.html +11 -29
  155. nautobot/extras/templates/extras/plugin_detail.html +15 -32
  156. nautobot/extras/templates/extras/plugins_tiles.html +10 -21
  157. nautobot/extras/test_jobs/api_test_job.py +1 -1
  158. nautobot/extras/test_jobs/atomic_transaction.py +2 -2
  159. nautobot/extras/test_jobs/dry_run.py +1 -1
  160. nautobot/extras/test_jobs/fail.py +5 -5
  161. nautobot/extras/test_jobs/file_output.py +1 -1
  162. nautobot/extras/test_jobs/file_upload_fail.py +1 -1
  163. nautobot/extras/test_jobs/file_upload_pass.py +1 -1
  164. nautobot/extras/test_jobs/ipaddress_vars.py +1 -3
  165. nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
  166. nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
  167. nautobot/extras/test_jobs/log_redaction.py +1 -1
  168. nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
  169. nautobot/extras/test_jobs/modify_db.py +1 -1
  170. nautobot/extras/test_jobs/object_var_optional.py +1 -1
  171. nautobot/extras/test_jobs/object_var_required.py +1 -1
  172. nautobot/extras/test_jobs/object_vars.py +1 -1
  173. nautobot/extras/test_jobs/pass.py +3 -3
  174. nautobot/extras/test_jobs/profiling.py +1 -1
  175. nautobot/extras/test_jobs/relative_import.py +3 -3
  176. nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
  177. nautobot/extras/test_jobs/task_queues.py +1 -1
  178. nautobot/extras/tests/integration/test_plugin_banner.py +2 -0
  179. nautobot/extras/tests/test_api.py +13 -13
  180. nautobot/extras/tests/test_customfields.py +1 -1
  181. nautobot/extras/tests/test_datasources.py +1 -2
  182. nautobot/extras/tests/test_dynamicgroups.py +1 -1
  183. nautobot/extras/tests/test_filters.py +6 -6
  184. nautobot/extras/tests/test_forms.py +1 -20
  185. nautobot/extras/tests/test_jobs.py +19 -160
  186. nautobot/extras/tests/test_models.py +10 -10
  187. nautobot/extras/tests/test_plugins.py +9 -62
  188. nautobot/extras/tests/test_relationships.py +9 -120
  189. nautobot/extras/tests/test_views.py +191 -52
  190. nautobot/extras/utils.py +2 -3
  191. nautobot/extras/views.py +98 -30
  192. nautobot/ipam/api/fields.py +3 -3
  193. nautobot/ipam/api/serializers.py +33 -41
  194. nautobot/ipam/api/views.py +117 -68
  195. nautobot/ipam/factory.py +1 -1
  196. nautobot/ipam/filters.py +2 -3
  197. nautobot/ipam/lookups.py +62 -101
  198. nautobot/ipam/models.py +16 -66
  199. nautobot/ipam/querysets.py +2 -2
  200. nautobot/ipam/tables.py +7 -23
  201. nautobot/ipam/templates/ipam/ipaddress.html +9 -1
  202. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +7 -1
  203. nautobot/ipam/templates/ipam/ipaddress_edit.html +7 -1
  204. nautobot/ipam/templates/ipam/prefix.html +9 -1
  205. nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
  206. nautobot/ipam/templates/ipam/vlan.html +9 -1
  207. nautobot/ipam/templates/ipam/vlan_edit.html +7 -1
  208. nautobot/ipam/templates/ipam/vrf_edit.html +7 -1
  209. nautobot/ipam/tests/test_api.py +3 -416
  210. nautobot/ipam/tests/test_forms.py +47 -49
  211. nautobot/ipam/tests/test_migrations.py +30 -30
  212. nautobot/ipam/tests/test_models.py +34 -95
  213. nautobot/ipam/tests/test_querysets.py +1 -63
  214. nautobot/ipam/tests/test_views.py +0 -3
  215. nautobot/ipam/utils/__init__.py +6 -36
  216. nautobot/ipam/views.py +87 -61
  217. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
  218. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
  219. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +2 -40
  220. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
  221. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
  222. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
  223. nautobot/project-static/docs/404.html +4 -46
  224. nautobot/project-static/docs/apps/index.html +4 -46
  225. nautobot/project-static/docs/apps/nautobot-apps.html +6 -47
  226. nautobot/project-static/docs/assets/_mkdocstrings.css +1 -25
  227. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js → bundle.83f73b43.min.js} +2 -2
  228. nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js.map → bundle.83f73b43.min.js.map} +2 -2
  229. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -62
  230. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +7 -59
  231. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +122 -374
  232. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +18 -90
  233. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +21 -95
  234. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +6 -53
  235. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +5 -52
  236. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +17 -79
  237. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +28 -102
  238. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +21 -108
  239. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +38 -131
  240. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +65 -239
  241. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +165 -581
  242. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +36 -109
  243. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +167 -453
  244. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +211 -493
  245. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +8 -60
  246. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +15 -71
  247. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +55 -407
  248. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +205 -585
  249. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +412 -858
  250. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +7 -59
  251. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +186 -448
  252. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +147 -365
  253. nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -46
  254. nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -46
  255. nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -46
  256. nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -46
  257. nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -46
  258. nautobot/project-static/docs/development/apps/api/models/index.html +4 -46
  259. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -46
  260. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -46
  261. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -46
  262. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -46
  263. nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -46
  264. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -46
  265. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -46
  266. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -46
  267. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -46
  268. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +7 -68
  269. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -46
  270. nautobot/project-static/docs/development/apps/api/prometheus.html +4 -46
  271. nautobot/project-static/docs/development/apps/api/setup.html +4 -46
  272. nautobot/project-static/docs/development/apps/api/testing.html +4 -46
  273. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -46
  274. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -46
  275. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -46
  276. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -46
  277. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -46
  278. nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -46
  279. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -46
  280. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -46
  281. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -46
  282. nautobot/project-static/docs/development/apps/api/views/index.html +4 -46
  283. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -46
  284. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -46
  285. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -46
  286. nautobot/project-static/docs/development/apps/api/views/notes.html +4 -46
  287. nautobot/project-static/docs/development/apps/api/views/rest-api.html +6 -52
  288. nautobot/project-static/docs/development/apps/api/views/urls.html +4 -46
  289. nautobot/project-static/docs/development/apps/index.html +4 -46
  290. nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -46
  291. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -46
  292. nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -46
  293. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -46
  294. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -46
  295. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -46
  296. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -46
  297. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +8 -50
  298. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -46
  299. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +14 -211
  300. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -46
  301. nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -46
  302. nautobot/project-static/docs/development/core/application-registry.html +4 -46
  303. nautobot/project-static/docs/development/core/best-practices.html +4 -46
  304. nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -46
  305. nautobot/project-static/docs/development/core/caching.html +4 -46
  306. nautobot/project-static/docs/development/core/controllers.html +4 -46
  307. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +74 -73
  308. nautobot/project-static/docs/development/core/generic-views.html +4 -46
  309. nautobot/project-static/docs/development/core/getting-started.html +224 -249
  310. nautobot/project-static/docs/development/core/homepage.html +7 -49
  311. nautobot/project-static/docs/development/core/index.html +4 -46
  312. nautobot/project-static/docs/development/core/{minikube-dev-environment-for-k8s-jobs.html → local-k8s.html} +168 -469
  313. nautobot/project-static/docs/development/core/model-checklist.html +12 -56
  314. nautobot/project-static/docs/development/core/model-features.html +4 -46
  315. nautobot/project-static/docs/development/core/natural-keys.html +4 -46
  316. nautobot/project-static/docs/development/core/navigation-menu.html +4 -46
  317. nautobot/project-static/docs/development/core/release-checklist.html +7 -49
  318. nautobot/project-static/docs/development/core/role-internals.html +4 -46
  319. nautobot/project-static/docs/development/core/settings.html +4 -46
  320. nautobot/project-static/docs/development/core/style-guide.html +7 -49
  321. nautobot/project-static/docs/development/core/templates.html +4 -46
  322. nautobot/project-static/docs/development/core/testing.html +4 -46
  323. nautobot/project-static/docs/development/core/ui-component-framework.html +273 -369
  324. nautobot/project-static/docs/development/core/user-preferences.html +4 -46
  325. nautobot/project-static/docs/development/index.html +4 -46
  326. nautobot/project-static/docs/development/jobs/index.html +122 -216
  327. nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -46
  328. nautobot/project-static/docs/index.html +23 -54
  329. nautobot/project-static/docs/objects.inv +0 -0
  330. nautobot/project-static/docs/overview/application_stack.html +7 -47
  331. nautobot/project-static/docs/overview/design_philosophy.html +4 -46
  332. nautobot/project-static/docs/release-notes/index.html +12 -52
  333. nautobot/project-static/docs/release-notes/version-1.0.html +193 -234
  334. nautobot/project-static/docs/release-notes/version-1.1.html +190 -231
  335. nautobot/project-static/docs/release-notes/version-1.2.html +265 -306
  336. nautobot/project-static/docs/release-notes/version-1.3.html +291 -332
  337. nautobot/project-static/docs/release-notes/version-1.4.html +377 -417
  338. nautobot/project-static/docs/release-notes/version-1.5.html +566 -605
  339. nautobot/project-static/docs/release-notes/version-1.6.html +447 -904
  340. nautobot/project-static/docs/release-notes/version-2.0.html +489 -528
  341. nautobot/project-static/docs/release-notes/version-2.1.html +324 -363
  342. nautobot/project-static/docs/release-notes/version-2.2.html +317 -356
  343. nautobot/project-static/docs/release-notes/version-2.3.html +352 -997
  344. nautobot/project-static/docs/release-notes/version-2.4.html +101 -417
  345. nautobot/project-static/docs/requirements.txt +2 -2
  346. nautobot/project-static/docs/search/search_index.json +1 -1
  347. nautobot/project-static/docs/sitemap.xml +287 -295
  348. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  349. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -46
  350. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
  351. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +6 -48
  352. nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -46
  353. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -46
  354. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +8 -110
  355. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -46
  356. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -46
  357. nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -46
  358. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -46
  359. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -46
  360. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -46
  361. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -46
  362. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -46
  363. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +6 -48
  364. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -46
  365. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -46
  366. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -46
  367. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +8 -66
  368. nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -46
  369. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +5 -47
  370. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -46
  371. nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -46
  372. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -46
  373. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -46
  374. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -46
  375. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -46
  376. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -46
  377. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -46
  378. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -46
  379. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -46
  380. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -46
  381. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +8 -49
  382. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -46
  383. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -46
  384. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -46
  385. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -46
  386. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -46
  387. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -46
  388. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -46
  389. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -46
  390. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -46
  391. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -46
  392. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -46
  393. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -46
  394. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -46
  395. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -46
  396. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -46
  397. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -46
  398. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -46
  399. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -46
  400. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -46
  401. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -46
  402. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -46
  403. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -46
  404. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -46
  405. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -46
  406. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -46
  407. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -46
  408. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -46
  409. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -46
  410. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -46
  411. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -46
  412. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -46
  413. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -46
  414. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -46
  415. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -46
  416. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -46
  417. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -46
  418. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -46
  419. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -46
  420. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -46
  421. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -46
  422. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -46
  423. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -46
  424. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -46
  425. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -46
  426. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -46
  427. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -46
  428. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -46
  429. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -46
  430. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -46
  431. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -46
  432. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -46
  433. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -46
  434. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -46
  435. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -46
  436. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -46
  437. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -46
  438. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -46
  439. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +12 -50
  440. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -46
  441. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -46
  442. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -46
  443. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -46
  444. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -46
  445. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -46
  446. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -46
  447. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -46
  448. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -46
  449. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -46
  450. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -46
  451. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -46
  452. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +7 -49
  453. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -46
  454. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -46
  455. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -46
  456. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -46
  457. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -46
  458. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -46
  459. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -46
  460. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -46
  461. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -46
  462. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -46
  463. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -46
  464. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -46
  465. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -46
  466. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -46
  467. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -46
  468. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -46
  469. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -46
  470. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -46
  471. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -46
  472. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -46
  473. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -46
  474. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -46
  475. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +7 -51
  476. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -46
  477. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -46
  478. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -46
  479. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +7 -49
  480. nautobot/project-static/docs/user-guide/index.html +4 -46
  481. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -46
  482. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +8 -50
  483. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -46
  484. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -46
  485. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -46
  486. nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -46
  487. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -46
  488. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -46
  489. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -46
  490. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -46
  491. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -46
  492. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -46
  493. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +7 -50
  494. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -46
  495. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +7 -49
  496. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -46
  497. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -46
  498. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -46
  499. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -46
  500. nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -46
  501. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -46
  502. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +5 -47
  503. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -46
  504. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -46
  505. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +25 -94
  506. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +5 -74
  507. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -46
  508. nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -46
  509. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -46
  510. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -46
  511. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -46
  512. nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -46
  513. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -46
  514. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -46
  515. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -46
  516. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -46
  517. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -46
  518. nautobot/project-static/js/forms.js +1 -1
  519. nautobot/tenancy/api/views.py +13 -9
  520. nautobot/tenancy/views.py +2 -4
  521. nautobot/users/admin.py +1 -1
  522. nautobot/users/api/serializers.py +4 -5
  523. nautobot/users/api/views.py +3 -3
  524. nautobot/virtualization/api/serializers.py +4 -4
  525. nautobot/virtualization/api/views.py +24 -5
  526. nautobot/virtualization/filters.py +3 -20
  527. nautobot/virtualization/models.py +1 -1
  528. nautobot/virtualization/tables.py +2 -2
  529. nautobot/virtualization/templates/virtualization/cluster_edit.html +7 -1
  530. nautobot/virtualization/templates/virtualization/virtualmachine.html +9 -1
  531. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +8 -2
  532. nautobot/virtualization/tests/test_filters.py +0 -17
  533. nautobot/wireless/filters.py +2 -2
  534. nautobot/wireless/forms.py +1 -1
  535. nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +9 -1
  536. nautobot/wireless/tests/test_filters.py +1 -29
  537. nautobot/wireless/views.py +10 -0
  538. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/METADATA +6 -6
  539. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/RECORD +543 -591
  540. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/WHEEL +1 -1
  541. nautobot/core/api/constants.py +0 -11
  542. nautobot/core/jobs/bulk_actions.py +0 -248
  543. nautobot/core/templates/about.html +0 -67
  544. nautobot/core/templates/inc/tenancy_form_panel.html +0 -9
  545. nautobot/core/templates/inc/tenant_table_row.html +0 -11
  546. nautobot/core/utils/querysets.py +0 -64
  547. nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +0 -25
  548. nautobot/dcim/tests/integration/test_controller.py +0 -62
  549. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +0 -71
  550. nautobot/dcim/tests/test_jobs.py +0 -118
  551. nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +0 -22
  552. nautobot/extras/migrations/0121_alter_team_contacts.py +0 -17
  553. nautobot/extras/test_jobs/singleton.py +0 -16
  554. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
  555. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
  556. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
  557. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
  558. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
  559. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
  560. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
  561. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
  562. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
  563. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
  564. nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
  565. nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
  566. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
  567. nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
  568. nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
  569. nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
  570. nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
  571. nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
  572. nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
  573. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
  574. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
  575. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
  576. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
  577. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
  578. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
  579. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
  580. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
  581. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
  582. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
  583. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
  584. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
  585. nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
  586. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -9444
  587. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -9722
  588. nautobot/wireless/tests/integration/__init__.py +0 -0
  589. nautobot/wireless/tests/integration/test_radio_profile.py +0 -42
  590. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/LICENSE.txt +0 -0
  591. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/NOTICE +0 -0
  592. {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/entry_points.txt +0 -0
nautobot/ipam/lookups.py CHANGED
@@ -3,9 +3,7 @@ from django.db.models import Lookup, lookups
3
3
  import netaddr
4
4
 
5
5
 
6
- def _mysql_varbin_to_broadcast(alias=None):
7
- if alias:
8
- return f"HEX({alias}.broadcast)"
6
+ def _mysql_varbin_to_broadcast():
9
7
  return "HEX(broadcast)"
10
8
 
11
9
 
@@ -15,15 +13,11 @@ def _mysql_varbin_to_hex(lhs, alias=None):
15
13
  return f"HEX({lhs})"
16
14
 
17
15
 
18
- def _mysql_varbin_to_network(alias=None):
19
- if alias:
20
- return f"HEX({alias}.network)"
16
+ def _mysql_varbin_to_network():
21
17
  return "HEX(network)"
22
18
 
23
19
 
24
- def _postgresql_varbin_to_broadcast(length, alias=None):
25
- if alias:
26
- return f"right({alias}.broadcast::text, -1)::varbit::bit({length})"
20
+ def _postgresql_varbin_to_broadcast(length):
27
21
  return f"right(broadcast::text, -1)::varbit::bit({length})"
28
22
 
29
23
 
@@ -33,10 +27,8 @@ def _postgresql_varbin_to_integer(lhs, length, alias=None):
33
27
  return f"right({lhs}::text, -1)::varbit::bit({length})"
34
28
 
35
29
 
36
- def _postgresql_varbin_to_network(lhs, length, alias=None):
30
+ def _postgresql_varbin_to_network(lhs, length):
37
31
  # convert to bitstring, 0 out everything larger than prefix_length
38
- if alias:
39
- return f"lpad(right({alias}.{lhs}::text, -1)::varbit::text, {alias}.prefix_length, '0')::bit({length})"
40
32
  return f"lpad(right({lhs}::text, -1)::varbit::text, prefix_length, '0')::bit({length})"
41
33
 
42
34
 
@@ -60,8 +52,8 @@ def get_ip_info(field_name, ip_str, alias=None):
60
52
  ip_details.rhs = py_to_hex(ip.ip, ip_details.length)
61
53
  ip_details.net_addr = f"'{py_to_hex(ip.network, ip_details.length)}'"
62
54
  ip_details.bcast_addr = f"'{py_to_hex(ip[-1], ip_details.length)}'"
63
- ip_details.q_net = _mysql_varbin_to_network(alias=alias)
64
- ip_details.q_bcast = _mysql_varbin_to_broadcast(alias=alias)
55
+ ip_details.q_net = _mysql_varbin_to_network()
56
+ ip_details.q_bcast = _mysql_varbin_to_broadcast()
65
57
  ip_details.q_ip = _mysql_varbin_to_hex(field_name, alias=alias)
66
58
 
67
59
  elif _connection.vendor == "postgresql":
@@ -69,8 +61,8 @@ def get_ip_info(field_name, ip_str, alias=None):
69
61
  ip_details.addr_str = f"B'{bin(int(ip_details.addr))[2:].zfill(ip_details.length)}'"
70
62
  ip_details.net_addr = f"B'{bin(int(ip.network))[2:].zfill(ip_details.length)}'"
71
63
  ip_details.bcast_addr = f"B'{bin(int(ip[-1]))[2:].zfill(ip_details.length)}'"
72
- ip_details.q_net = _postgresql_varbin_to_network(field_name, ip_details.length, alias=alias)
73
- ip_details.q_bcast = _postgresql_varbin_to_broadcast(ip_details.length, alias=alias)
64
+ ip_details.q_net = _postgresql_varbin_to_network(field_name, ip_details.length)
65
+ ip_details.q_bcast = _postgresql_varbin_to_broadcast(ip_details.length)
74
66
  ip_details.q_ip = _postgresql_varbin_to_integer(field_name, ip_details.length, alias=alias)
75
67
 
76
68
  return ip_details
@@ -79,38 +71,25 @@ def get_ip_info(field_name, ip_str, alias=None):
79
71
  class IPDetails:
80
72
  """Class for setting up all details about an IP they may be needed"""
81
73
 
82
- addr = None # 10.0.0.0
83
- ip = None # 10.0.0.0/8
84
- prefix = None # 8
85
- length = None # 32
86
- addr_str = None # B'00001010000000000000000000000000'
87
- rhs = None # 00001010000000000000000000000000
88
- net_addr = None # B'00001010000000000000000000000000'
89
- bcast_addr = None # B'00001010111111111111111111111111'
90
- q_net = None # mysql or postgres specific
91
- q_bcast = None # mysql or postgres specific
92
- q_ip = None # mysql or postgres specific
74
+ net = None
75
+ addr = None
76
+ ip = None
77
+ prefix = None
78
+ length = None
79
+ addr_str = None
80
+ rhs = None
81
+ net_addr = None
82
+ bcast_addr = None
83
+ q_net = None
84
+ q_bcast = None
85
+ q_ip = None
93
86
  to_len = {4: 32, 6: 128}
94
87
 
95
- def __str__(self):
96
- return f"""\
97
- addr: {self.addr}
98
- ip: {self.ip}
99
- prefix: {self.prefix}
100
- length: {self.length}
101
- addr_str: {self.addr_str}
102
- rhs: {self.rhs}
103
- net_addr: {self.net_addr}
104
- bcast_addr: {self.bcast_addr}
105
- q_net: {self.q_net}
106
- q_bcast: {self.q_bcast}
107
- q_ip: {self.q_ip}"""
108
-
109
88
 
110
89
  class StringMatchMixin:
111
- def process_lhs(self, compiler, connection, lhs=None):
90
+ def process_lhs(self, qn, connection, lhs=None):
112
91
  lhs = lhs or self.lhs
113
- lhs_string, lhs_params = compiler.compile(lhs)
92
+ lhs_string, lhs_params = qn.compile(lhs)
114
93
  if connection.vendor == "postgresql":
115
94
  raise NotSupportedError("Lookup not supported on postgresql.")
116
95
  return f"INET6_NTOA({lhs_string})", lhs_params
@@ -150,7 +129,6 @@ class IRegex(StringMatchMixin, lookups.IRegex):
150
129
 
151
130
  class NetworkFieldMixin:
152
131
  def get_prep_lookup(self):
153
- self.alias = self.lhs.alias
154
132
  field_name = self.lhs.field.name
155
133
  if field_name not in ["host", "network"]:
156
134
  raise NotSupportedError(f"Lookup only provided on the host and network fields, not {field_name}.")
@@ -161,8 +139,8 @@ class NetworkFieldMixin:
161
139
  self.ip = get_ip_info(field_name, self.rhs, alias=self.lhs.alias)
162
140
  return str(self.ip.ip)
163
141
 
164
- def process_rhs(self, compiler, connection):
165
- sql, params = super().process_rhs(compiler, connection)
142
+ def process_rhs(self, qn, connection):
143
+ sql, params = super().process_rhs(qn, connection)
166
144
  params[0] = self.ip.rhs
167
145
  return sql, params
168
146
 
@@ -170,67 +148,50 @@ class NetworkFieldMixin:
170
148
  class NetEquals(NetworkFieldMixin, Lookup):
171
149
  lookup_name = "net_equals"
172
150
 
173
- def as_sql(self, compiler, connection):
174
- _, lhs_params = self.process_lhs(compiler, connection)
175
- rhs, rhs_params = self.process_rhs(compiler, connection)
176
- if self.alias:
177
- query = f"{self.alias}.prefix_length = {self.ip.prefix} AND {rhs} = {self.ip.q_ip}"
178
- else:
179
- query = f"prefix_length = {self.ip.prefix} AND {rhs} = {self.ip.q_ip}"
151
+ def as_sql(self, qn, connection):
152
+ _, lhs_params = self.process_lhs(qn, connection)
153
+ rhs, rhs_params = self.process_rhs(qn, connection)
154
+ query = f"prefix_length = {self.ip.prefix} AND {rhs} = {self.ip.q_ip}"
180
155
  return query, lhs_params + rhs_params
181
156
 
182
157
 
183
158
  class NetContainsOrEquals(NetworkFieldMixin, Lookup):
184
159
  lookup_name = "net_contains_or_equals"
185
160
 
186
- def as_sql(self, compiler, connection):
187
- _, lhs_params = self.process_lhs(compiler, connection)
188
- rhs, rhs_params = self.process_rhs(compiler, connection)
189
- if self.alias:
190
- query = f"{self.alias}.prefix_length <= {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
191
- else:
192
- query = f"prefix_length <= {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
161
+ def as_sql(self, qn, connection):
162
+ _, lhs_params = self.process_lhs(qn, connection)
163
+ rhs, rhs_params = self.process_rhs(qn, connection)
164
+ query = f"prefix_length <= {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
193
165
  return query, lhs_params + rhs_params
194
166
 
195
167
 
196
168
  class NetContains(NetworkFieldMixin, Lookup):
197
169
  lookup_name = "net_contains"
198
170
 
199
- def as_sql(self, compiler, connection):
200
- _, lhs_params = self.process_lhs(compiler, connection)
201
- rhs, rhs_params = self.process_rhs(compiler, connection)
202
- if self.alias:
203
- query = (
204
- f"{self.alias}.prefix_length < {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
205
- )
206
- else:
207
- query = f"prefix_length < {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
171
+ def as_sql(self, qn, connection):
172
+ _, lhs_params = self.process_lhs(qn, connection)
173
+ rhs, rhs_params = self.process_rhs(qn, connection)
174
+ query = f"prefix_length < {self.ip.prefix} AND {rhs} BETWEEN {self.ip.q_net} AND {self.ip.q_bcast}"
208
175
  return query, lhs_params + rhs_params
209
176
 
210
177
 
211
178
  class NetContainedOrEqual(NetworkFieldMixin, Lookup):
212
179
  lookup_name = "net_contained_or_equal"
213
180
 
214
- def as_sql(self, compiler, connection):
215
- _, lhs_params = self.process_lhs(compiler, connection)
216
- rhs, rhs_params = self.process_rhs(compiler, connection)
217
- if self.alias:
218
- query = f"{self.alias}.prefix_length >= {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
219
- else:
220
- query = f"prefix_length >= {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
181
+ def as_sql(self, qn, connection):
182
+ _, lhs_params = self.process_lhs(qn, connection)
183
+ rhs, rhs_params = self.process_rhs(qn, connection)
184
+ query = f"prefix_length >= {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
221
185
  return query, lhs_params + rhs_params
222
186
 
223
187
 
224
188
  class NetContained(NetworkFieldMixin, Lookup):
225
189
  lookup_name = "net_contained"
226
190
 
227
- def as_sql(self, compiler, connection):
228
- _, lhs_params = self.process_lhs(compiler, connection)
229
- rhs, rhs_params = self.process_rhs(compiler, connection)
230
- if self.alias:
231
- query = f"{self.alias}.prefix_length > {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
232
- else:
233
- query = f"prefix_length > {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
191
+ def as_sql(self, qn, connection):
192
+ _, lhs_params = self.process_lhs(qn, connection)
193
+ rhs, rhs_params = self.process_rhs(qn, connection)
194
+ query = f"prefix_length > {self.ip.prefix} AND {self.ip.q_net} BETWEEN {rhs} AND {self.ip.bcast_addr}"
234
195
  return query, lhs_params + rhs_params
235
196
 
236
197
 
@@ -244,19 +205,19 @@ class NetHost(Lookup):
244
205
  self.ip = get_ip_info(field_name, self.rhs, alias=self.lhs.alias)
245
206
  return str(self.ip.ip)
246
207
 
247
- def process_rhs(self, compiler, connection):
248
- sql, params = super().process_rhs(compiler, connection)
208
+ def process_rhs(self, qn, connection):
209
+ sql, params = super().process_rhs(qn, connection)
249
210
  params[0] = self.ip.rhs
250
211
  return sql, params
251
212
 
252
- def process_lhs(self, compiler, connection, lhs=None):
213
+ def process_lhs(self, qn, connection, lhs=None):
253
214
  lhs = lhs or self.lhs
254
- _, lhs_params = compiler.compile(lhs)
215
+ _, lhs_params = qn.compile(lhs)
255
216
  return self.ip.q_ip, lhs_params
256
217
 
257
- def as_sql(self, compiler, connection):
258
- lhs, lhs_params = self.process_lhs(compiler, connection)
259
- rhs, rhs_params = self.process_rhs(compiler, connection)
218
+ def as_sql(self, qn, connection):
219
+ lhs, lhs_params = self.process_lhs(qn, connection)
220
+ rhs, rhs_params = self.process_rhs(qn, connection)
260
221
  return f"{lhs} = {rhs}", lhs_params + rhs_params
261
222
 
262
223
 
@@ -281,9 +242,9 @@ class NetIn(Lookup):
281
242
  self.query_starter = "'1' != ANY(%s) AND "
282
243
  return self.rhs
283
244
 
284
- def as_sql(self, compiler, connection):
285
- _, lhs_params = self.process_lhs(compiler, connection)
286
- _, rhs_params = self.process_rhs(compiler, connection)
245
+ def as_sql(self, qn, connection):
246
+ _, lhs_params = self.process_lhs(qn, connection)
247
+ _, rhs_params = self.process_rhs(qn, connection)
287
248
  query = self.query_starter
288
249
  query += "OR ".join(f"{ip.q_ip} BETWEEN {ip.net_addr} AND {ip.bcast_addr} " for ip in self.ips)
289
250
  return query, lhs_params + rhs_params
@@ -292,9 +253,9 @@ class NetIn(Lookup):
292
253
  class NetHostContained(NetworkFieldMixin, Lookup):
293
254
  lookup_name = "net_host_contained"
294
255
 
295
- def as_sql(self, compiler, connection):
296
- _, lhs_params = self.process_lhs(compiler, connection)
297
- rhs, rhs_params = self.process_rhs(compiler, connection)
256
+ def as_sql(self, qn, connection):
257
+ _, lhs_params = self.process_lhs(qn, connection)
258
+ rhs, rhs_params = self.process_rhs(qn, connection)
298
259
  query = f"{self.ip.q_ip} BETWEEN {rhs} AND {self.ip.bcast_addr}"
299
260
  return query, lhs_params + rhs_params
300
261
 
@@ -309,12 +270,12 @@ class NetFamily(Lookup):
309
270
  self.rhs = 16
310
271
  return self.rhs
311
272
 
312
- def process_lhs(self, compiler, connection, lhs=None):
273
+ def process_lhs(self, qn, connection, lhs=None):
313
274
  lhs = lhs or self.lhs
314
- lhs_string, lhs_params = compiler.compile(lhs)
275
+ lhs_string, lhs_params = qn.compile(lhs)
315
276
  return f"LENGTH({lhs_string})", lhs_params
316
277
 
317
- def as_sql(self, compiler, connection):
318
- lhs, lhs_params = self.process_lhs(compiler, connection)
319
- rhs, rhs_params = self.process_rhs(compiler, connection)
278
+ def as_sql(self, qn, connection):
279
+ lhs, lhs_params = self.process_lhs(qn, connection)
280
+ rhs, rhs_params = self.process_rhs(qn, connection)
320
281
  return f"{lhs} = {rhs}", lhs_params + rhs_params
nautobot/ipam/models.py CHANGED
@@ -27,18 +27,18 @@ from .querysets import IPAddressQuerySet, PrefixQuerySet, RIRQuerySet, VLANQuery
27
27
  from .validators import DNSValidator
28
28
 
29
29
  __all__ = (
30
- "RIR",
31
- "VLAN",
32
- "VRF",
33
30
  "IPAddress",
34
31
  "IPAddressToInterface",
35
32
  "Namespace",
36
33
  "Prefix",
37
34
  "PrefixLocationAssignment",
35
+ "RIR",
38
36
  "RouteTarget",
39
37
  "Service",
38
+ "VLAN",
40
39
  "VLANGroup",
41
40
  "VLANLocationAssignment",
41
+ "VRF",
42
42
  "VRFDeviceAssignment",
43
43
  "VRFPrefixAssignment",
44
44
  )
@@ -531,32 +531,8 @@ class Prefix(PrimaryModel):
531
531
  prefix = kwargs.pop("prefix", None)
532
532
  self._location = kwargs.pop("location", None)
533
533
  super().__init__(*args, **kwargs)
534
-
535
- # Initialize cached fields
536
- self._parent = None
537
- self._network = None
538
- self._prefix_length = None
539
- self._namespace_id = None
540
-
541
534
  self._deconstruct_prefix(prefix)
542
535
 
543
- @staticmethod
544
- def _extract_field_value(field_name, field_names, values):
545
- for current_field, field_value in zip(field_names, values):
546
- if field_name == current_field:
547
- return field_value
548
- return None
549
-
550
- @classmethod
551
- def from_db(cls, db, field_names, values):
552
- instance = super().from_db(db, field_names, values)
553
- # These cached values are used to detect changes during save,
554
- # avoiding unnecessary re-parenting of subnets and IPs if these fields have not been updated.
555
- instance._network = cls._extract_field_value("network", field_names, values)
556
- instance._prefix_length = cls._extract_field_value("prefix_length", field_names, values)
557
- instance._namespace_id = cls._extract_field_value("namespace_id", field_names, values)
558
- return instance
559
-
560
536
  def __str__(self):
561
537
  return str(self.prefix)
562
538
 
@@ -636,30 +612,18 @@ class Prefix(PrimaryModel):
636
612
  protected_objects.update(parent=self.parent)
637
613
  return super().delete(*args, **kwargs)
638
614
 
639
- def get_parent(self):
640
- # Determine if a parent exists and set it to the closest ancestor by `prefix_length`.
641
- if self._parent is not None:
642
- return self._parent
643
-
644
- if supernets := self.supernets():
645
- parent = max(supernets, key=operator.attrgetter("prefix_length"))
646
- self._parent = parent
647
- return parent
648
- return None
649
-
650
- def clean(self):
651
- if self.prefix is not None: # missing network/prefix_length will be caught by super().clean()
615
+ def save(self, *args, **kwargs):
616
+ if isinstance(self.prefix, netaddr.IPNetwork):
652
617
  # Clear host bits from prefix
653
618
  # This also has the subtle side effect of calling self._deconstruct_prefix(),
654
619
  # which will (re)set the broadcast and ip_version values of this instance to their correct values.
655
620
  self.prefix = self.prefix.cidr
656
621
 
657
- self.parent = self.get_parent()
658
-
659
- super().clean()
660
-
661
- def save(self, *args, **kwargs):
662
- self.clean()
622
+ # Determine if a parent exists and set it to the closest ancestor by `prefix_length`.
623
+ supernets = self.supernets()
624
+ if supernets:
625
+ parent = max(supernets, key=operator.attrgetter("prefix_length"))
626
+ self.parent = parent
663
627
 
664
628
  # Validate that creation of this prefix does not create an invalid parent/child relationship
665
629
  # 3.0 TODO: uncomment this to enforce this constraint
@@ -691,26 +655,15 @@ class Prefix(PrimaryModel):
691
655
  # )
692
656
  # raise ValidationError({"__all__": err_msg})
693
657
 
694
- # cache the value of present_in_database; because after `super().save()`
695
- # `self.present_in_database` would always return True`
696
- present_in_database = self.present_in_database
697
-
698
658
  with transaction.atomic():
699
659
  super().save(*args, **kwargs)
700
660
  if self._location is not None:
701
661
  self.location = self._location
702
662
 
703
- # Only reparent subnets and ips if any of these fields has been updated.
704
- if (
705
- not present_in_database
706
- or self._network != self.network
707
- or self._namespace_id != self.namespace_id
708
- or self._prefix_length != self.prefix_length
709
- ):
710
- # Determine the subnets and reparent them to this prefix.
711
- self.reparent_subnets()
712
- # Determine the child IPs and reparent them to this prefix.
713
- self.reparent_ips()
663
+ # Determine the subnets and reparent them to this prefix.
664
+ self.reparent_subnets()
665
+ # Determine the child IPs and reparent them to this prefix.
666
+ self.reparent_ips()
714
667
 
715
668
  @property
716
669
  def cidr_str(self):
@@ -786,7 +739,6 @@ class Prefix(PrimaryModel):
786
739
  Returns:
787
740
  QuerySet
788
741
  """
789
-
790
742
  query = Prefix.objects.all()
791
743
 
792
744
  if for_update:
@@ -798,7 +750,7 @@ class Prefix(PrimaryModel):
798
750
  if not include_self:
799
751
  query = query.exclude(id=self.id)
800
752
 
801
- supernets = query.filter(
753
+ return query.filter(
802
754
  ip_version=self.ip_version,
803
755
  prefix_length__lte=self.prefix_length,
804
756
  network__lte=self.network,
@@ -806,8 +758,6 @@ class Prefix(PrimaryModel):
806
758
  namespace=self.namespace,
807
759
  )
808
760
 
809
- return supernets
810
-
811
761
  def subnets(self, direct=False, include_self=False, for_update=False):
812
762
  """
813
763
  Return subnets of this Prefix.
@@ -917,7 +867,7 @@ class Prefix(PrimaryModel):
917
867
  Return all available IPs within this prefix as an IPSet.
918
868
  """
919
869
  prefix = netaddr.IPSet(self.prefix)
920
- child_ips = netaddr.IPSet([ip.address.ip for ip in self.get_all_ips()])
870
+ child_ips = netaddr.IPSet([ip.address.ip for ip in self.ip_addresses.all()])
921
871
  available_ips = prefix - child_ips
922
872
 
923
873
  # IPv6, pool, or IPv4 /31-32 sets are fully usable
@@ -398,7 +398,7 @@ class IPAddressQuerySet(BaseNetworkQuerySet):
398
398
  """
399
399
  return super().order_by("host")
400
400
 
401
- def get_or_create(self, defaults=None, **kwargs):
401
+ def get_or_create(self, **kwargs):
402
402
  from nautobot.ipam.models import get_default_namespace, Prefix
403
403
 
404
404
  parent = kwargs.get("parent")
@@ -421,7 +421,7 @@ class IPAddressQuerySet(BaseNetworkQuerySet):
421
421
  raise ValidationError(f"{cidr} does not appear to be an IPv4 or IPv6 network.") from err
422
422
  parent = Prefix.objects.filter(namespace=namespace).get_closest_parent(cidr=cidr, include_self=True)
423
423
  kwargs["parent"] = parent
424
- return super().get_or_create(defaults=defaults, **kwargs)
424
+ return super().get_or_create(**kwargs)
425
425
 
426
426
  def string_search(self, search):
427
427
  """
nautobot/ipam/tables.py CHANGED
@@ -43,11 +43,9 @@ UTILIZATION_GRAPH = """
43
43
  """
44
44
 
45
45
 
46
- # record: the Prefix being rendered in this row
47
- # object: the base ancestor Prefix, in the case of PrefixDetailTable, else None
48
46
  PREFIX_COPY_LINK = """
49
47
  {% load helpers %}
50
- {% tree_hierarchy_ui_representation record.ancestors.count|as_range table.hide_hierarchy_ui base_tree_depth|default:0 %}
48
+ {% tree_hierarchy_ui_representation record.ancestors.count|as_range table.hide_hierarchy_ui%}
51
49
  <span class="hover_copy">
52
50
  <a href="\
53
51
  {% if record.present_in_database %}\
@@ -406,7 +404,7 @@ class PrefixDetailTable(PrefixTable):
406
404
  "type",
407
405
  "status",
408
406
  "children",
409
- "vrf_count",
407
+ # "vrf",
410
408
  "utilization",
411
409
  "tenant",
412
410
  "location_count",
@@ -422,7 +420,7 @@ class PrefixDetailTable(PrefixTable):
422
420
  "type",
423
421
  "status",
424
422
  "children",
425
- "vrf_count",
423
+ # "vrf",
426
424
  "utilization",
427
425
  "tenant",
428
426
  "location_count",
@@ -444,27 +442,13 @@ class IPAddressTable(StatusTableMixin, RoleTableMixin, BaseTable):
444
442
  )
445
443
  tenant = TenantColumn()
446
444
  parent__namespace = tables.Column(linkify=True)
447
- interface_count = LinkedCountColumn(
448
- viewname="dcim:interface_list", url_params={"ip_addresses": "pk"}, verbose_name="Interfaces"
449
- )
450
- # TODO: what about interfaces assigned to modules?
451
- interface_parent_count = LinkedCountColumn(
452
- viewname="dcim:device_list",
453
- url_params={"ip_addresses": "pk"},
454
- reverse_lookup="interfaces__ip_addresses",
455
- distinct=True,
456
- verbose_name="Devices",
457
- )
445
+ # Interface, Device, and VirtualMachine tables aren't currently filterable by IP address (?) so no LinkedCountColumn
446
+ interface_count = tables.Column(verbose_name="Interfaces")
447
+ interface_parent_count = tables.Column(verbose_name="Devices")
458
448
  vm_interface_count = LinkedCountColumn(
459
449
  viewname="virtualization:vminterface_list", url_params={"ip_addresses": "pk"}, verbose_name="VM Interfaces"
460
450
  )
461
- vm_interface_parent_count = LinkedCountColumn(
462
- viewname="virtualization:virtualmachine_list",
463
- url_params={"ip_addresses": "pk"},
464
- reverse_lookup="interfaces__ip_addresses",
465
- distinct=True,
466
- verbose_name="Virtual Machines",
467
- )
451
+ vm_interface_parent_count = tables.Column(verbose_name="Virtual Machines")
468
452
 
469
453
  class Meta(BaseTable.Meta):
470
454
  model = IPAddress
@@ -83,7 +83,15 @@
83
83
  <strong>Operational Details</strong>
84
84
  </div>
85
85
  <table class="table table-hover panel-body attr-table">
86
- {% include 'inc/tenant_table_row.html' %}
86
+ <tr>
87
+ <td>Tenant</td>
88
+ <td>
89
+ {% if object.tenant and object.tenant.tenant_group %}
90
+ {{ object.tenant.tenant_group|hyperlinked_object }} /
91
+ {% endif %}
92
+ {{ object.tenant|hyperlinked_object }}
93
+ </td>
94
+ </tr>
87
95
  <tr>
88
96
  <td>Assignment</td>
89
97
  <td>
@@ -21,6 +21,12 @@
21
21
  {% render_field model_form.description %}
22
22
  </div>
23
23
  </div>
24
- {% include 'inc/tenancy_form_panel.html' %}
24
+ <div class="panel panel-default">
25
+ <div class="panel-heading"><strong>Tenancy</strong></div>
26
+ <div class="panel-body">
27
+ {% render_field model_form.tenant_group %}
28
+ {% render_field model_form.tenant %}
29
+ </div>
30
+ </div>
25
31
  {% include 'inc/extras_features_edit_form_fields.html' with form=model_form %}
26
32
  {% endblock %}
@@ -22,7 +22,13 @@
22
22
  {% render_field form.description %}
23
23
  </div>
24
24
  </div>
25
- {% include 'inc/tenancy_form_panel.html' %}
25
+ <div class="panel panel-default">
26
+ <div class="panel-heading"><strong>Tenancy</strong></div>
27
+ <div class="panel-body">
28
+ {% render_field form.tenant_group %}
29
+ {% render_field form.tenant %}
30
+ </div>
31
+ </div>
26
32
  <div class="panel panel-default">
27
33
  <div class="panel-heading"><strong>NAT IP (Inside)</strong></div>
28
34
  <div class="panel-body">
@@ -68,7 +68,15 @@
68
68
  {{ object.get_type_display }}
69
69
  </td>
70
70
  </tr>
71
- {% include 'inc/tenant_table_row.html' %}
71
+ <tr>
72
+ <td>Tenant</td>
73
+ <td>
74
+ {% if object.tenant and object.tenant.tenant_group %}
75
+ {{ object.tenant.tenant_group|hyperlinked_object }} /
76
+ {% endif %}
77
+ {{ object.tenant|hyperlinked_object }}
78
+ </td>
79
+ </tr>
72
80
  <tr>
73
81
  <td>Locations</td>
74
82
  <td>
@@ -29,6 +29,12 @@
29
29
  {% render_field form.vlan %}
30
30
  </div>
31
31
  </div>
32
- {% include 'inc/tenancy_form_panel.html' %}
32
+ <div class="panel panel-default">
33
+ <div class="panel-heading"><strong>Tenancy</strong></div>
34
+ <div class="panel-body">
35
+ {% render_field form.tenant_group %}
36
+ {% render_field form.tenant %}
37
+ </div>
38
+ </div>
33
39
  {% include 'inc/extras_features_edit_form_fields.html' %}
34
40
  {% endblock %}
@@ -44,7 +44,15 @@
44
44
  <td>Name</td>
45
45
  <td>{{ object.name }}</td>
46
46
  </tr>
47
- {% include 'inc/tenant_table_row.html' %}
47
+ <tr>
48
+ <td>Tenant</td>
49
+ <td>
50
+ {% if object.tenant and object.tenant.tenant_group %}
51
+ {{ object.tenant.tenant_group|hyperlinked_object }} /
52
+ {% endif %}
53
+ {{ object.tenant|hyperlinked_object }}
54
+ </td>
55
+ </tr>
48
56
  <tr>
49
57
  <td>Status</td>
50
58
  <td>
@@ -19,6 +19,12 @@
19
19
  {% render_field form.vlan_group %}
20
20
  </div>
21
21
  </div>
22
- {% include 'inc/tenancy_form_panel.html' %}
22
+ <div class="panel panel-default">
23
+ <div class="panel-heading"><strong>Tenancy</strong></div>
24
+ <div class="panel-body">
25
+ {% render_field form.tenant_group %}
26
+ {% render_field form.tenant %}
27
+ </div>
28
+ </div>
23
29
  {% include 'inc/extras_features_edit_form_fields.html' %}
24
30
  {% endblock %}
@@ -37,6 +37,12 @@
37
37
  {% render_field form.export_targets %}
38
38
  </div>
39
39
  </div>
40
- {% include 'inc/tenancy_form_panel.html' %}
40
+ <div class="panel panel-default">
41
+ <div class="panel-heading"><strong>Tenancy</strong></div>
42
+ <div class="panel-body">
43
+ {% render_field form.tenant_group %}
44
+ {% render_field form.tenant %}
45
+ </div>
46
+ </div>
41
47
  {% include 'inc/extras_features_edit_form_fields.html' %}
42
48
  {% endblock %}