nautobot 2.4.13__py3-none-any.whl → 2.4.15__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 (463) hide show
  1. nautobot/apps/choices.py +8 -0
  2. nautobot/apps/ui.py +14 -0
  3. nautobot/core/api/views.py +2 -0
  4. nautobot/core/choices.py +4 -0
  5. nautobot/core/filters.py +21 -41
  6. nautobot/core/graphql/generators.py +8 -0
  7. nautobot/core/graphql/schema.py +30 -30
  8. nautobot/core/management/commands/check_job_approval_status.py +47 -0
  9. nautobot/core/management/commands/generate_test_data.py +1 -1
  10. nautobot/core/management/commands/migrate.py +90 -1
  11. nautobot/core/models/tree_queries.py +17 -0
  12. nautobot/core/settings.py +2 -2
  13. nautobot/core/settings.yaml +3 -3
  14. nautobot/core/tables.py +29 -6
  15. nautobot/core/templates/base_django.html +1 -1
  16. nautobot/core/templates/components/panel/header_extra_content_table.html +1 -1
  17. nautobot/core/templates/generic/object_list.html +17 -20
  18. nautobot/core/templates/inc/breadcrumbs.html +14 -0
  19. nautobot/core/templatetags/buttons.py +2 -4
  20. nautobot/core/templatetags/helpers.py +29 -6
  21. nautobot/core/templatetags/ui_framework.py +21 -0
  22. nautobot/core/testing/api.py +7 -0
  23. nautobot/core/testing/filters.py +20 -3
  24. nautobot/core/testing/forms.py +1 -1
  25. nautobot/core/tests/integration/test_filters.py +2 -2
  26. nautobot/core/tests/test_breadcrumbs.py +366 -0
  27. nautobot/core/tests/test_commands.py +40 -0
  28. nautobot/core/tests/test_filters.py +51 -1
  29. nautobot/core/tests/test_forms.py +1 -1
  30. nautobot/core/tests/test_graphql.py +4 -4
  31. nautobot/core/tests/test_titles.py +183 -0
  32. nautobot/core/tests/test_tree_queries.py +30 -0
  33. nautobot/core/tests/test_views.py +2 -2
  34. nautobot/core/tests/test_views_utils.py +1 -1
  35. nautobot/core/ui/breadcrumbs.py +538 -0
  36. nautobot/core/ui/bulk_buttons.py +53 -0
  37. nautobot/core/ui/object_detail.py +31 -8
  38. nautobot/core/ui/titles.py +127 -0
  39. nautobot/core/ui/utils.py +25 -0
  40. nautobot/core/utils/migrations.py +1 -1
  41. nautobot/core/views/__init__.py +1 -1
  42. nautobot/core/views/mixins.py +26 -1
  43. nautobot/core/views/renderers.py +20 -2
  44. nautobot/core/views/utils.py +14 -13
  45. nautobot/dcim/api/serializers.py +9 -0
  46. nautobot/dcim/choices.py +55 -0
  47. nautobot/dcim/constants.py +0 -16
  48. nautobot/dcim/factory.py +1 -1
  49. nautobot/dcim/filters/__init__.py +15 -3
  50. nautobot/dcim/forms.py +120 -7
  51. nautobot/dcim/management/commands/trace_paths.py +1 -1
  52. nautobot/dcim/migrations/0072_alter_powerfeed_options_and_more.py +97 -0
  53. nautobot/dcim/models/device_component_templates.py +8 -0
  54. nautobot/dcim/models/device_components.py +31 -12
  55. nautobot/dcim/models/devices.py +1 -1
  56. nautobot/dcim/models/power.py +171 -10
  57. nautobot/dcim/models/racks.py +7 -4
  58. nautobot/dcim/tables/devices.py +2 -0
  59. nautobot/dcim/tables/devicetypes.py +1 -0
  60. nautobot/dcim/tables/power.py +30 -2
  61. nautobot/dcim/templates/dcim/device.html +2 -2
  62. nautobot/dcim/templates/dcim/devicetype_retrieve.html +1 -214
  63. nautobot/dcim/templates/dcim/location_retrieve.html +2 -2
  64. nautobot/dcim/templates/dcim/powerfeed_edit.html +8 -0
  65. nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -1
  66. nautobot/dcim/templates/dcim/rack.html +2 -318
  67. nautobot/dcim/templates/dcim/rack_edit.html +2 -47
  68. nautobot/dcim/templates/dcim/rack_retrieve.html +318 -0
  69. nautobot/dcim/templates/dcim/rack_update.html +47 -0
  70. nautobot/dcim/tests/integration/test_device_bulk_operations.py +61 -0
  71. nautobot/dcim/tests/test_api.py +24 -4
  72. nautobot/dcim/tests/test_filters.py +91 -13
  73. nautobot/dcim/tests/test_models.py +262 -0
  74. nautobot/dcim/tests/test_views.py +20 -12
  75. nautobot/dcim/urls.py +2 -27
  76. nautobot/dcim/utils.py +13 -30
  77. nautobot/dcim/views.py +428 -146
  78. nautobot/extras/choices.py +12 -4
  79. nautobot/extras/factory.py +19 -20
  80. nautobot/extras/filters/__init__.py +3 -2
  81. nautobot/extras/filters/mixins.py +23 -7
  82. nautobot/extras/forms/__init__.py +2 -1
  83. nautobot/extras/forms/forms.py +71 -0
  84. nautobot/extras/forms/mixins.py +4 -2
  85. nautobot/extras/managers.py +4 -1
  86. nautobot/extras/migrations/0062_collect_roles_from_related_apps_roles.py +30 -7
  87. nautobot/extras/migrations/0124_add_joblogentry_index.py +16 -0
  88. nautobot/extras/migrations/0125_jobresult_date_started.py +18 -0
  89. nautobot/extras/models/customfields.py +53 -5
  90. nautobot/extras/models/datasources.py +1 -2
  91. nautobot/extras/models/jobs.py +13 -3
  92. nautobot/extras/models/relationships.py +55 -6
  93. nautobot/extras/plugins/views.py +24 -1
  94. nautobot/extras/secrets/__init__.py +1 -1
  95. nautobot/extras/tables.py +9 -0
  96. nautobot/extras/templates/extras/customfield.html +2 -129
  97. nautobot/extras/templates/extras/customfield_edit.html +2 -108
  98. nautobot/extras/templates/extras/customfield_retrieve.html +129 -0
  99. nautobot/extras/templates/extras/customfield_update.html +108 -0
  100. nautobot/extras/templates/extras/graphqlquery.html +2 -97
  101. nautobot/extras/templates/extras/graphqlquery_list.html +1 -0
  102. nautobot/extras/templates/extras/graphqlquery_retrieve.html +97 -0
  103. nautobot/extras/templates/extras/inc/jobresult.html +7 -3
  104. nautobot/extras/templates/extras/jobresult.html +2 -155
  105. nautobot/extras/templates/extras/jobresult_retrieve.html +155 -0
  106. nautobot/extras/templates/extras/marketplace.html +5 -6
  107. nautobot/extras/templates/extras/note.html +2 -53
  108. nautobot/extras/templates/extras/note_retrieve.html +53 -0
  109. nautobot/extras/templates/extras/plugins_list.html +5 -6
  110. nautobot/extras/templates/extras/secretsgroup.html +2 -29
  111. nautobot/extras/templates/extras/secretsgroup_edit.html +2 -82
  112. nautobot/extras/templates/extras/secretsgroup_retrieve.html +29 -0
  113. nautobot/extras/templates/extras/secretsgroup_update.html +82 -0
  114. nautobot/extras/templatetags/custom_links.py +2 -2
  115. nautobot/extras/templatetags/job_buttons.py +1 -1
  116. nautobot/extras/templatetags/plugins.py +1 -1
  117. nautobot/extras/tests/integration/test_computedfields.py +2 -2
  118. nautobot/extras/tests/integration/test_customfields.py +14 -11
  119. nautobot/extras/tests/integration/test_dynamicgroups.py +1 -1
  120. nautobot/extras/tests/integration/test_notes.py +1 -1
  121. nautobot/extras/tests/integration/test_plugins.py +6 -6
  122. nautobot/extras/tests/integration/test_relationships.py +2 -2
  123. nautobot/extras/tests/test_customfields.py +115 -7
  124. nautobot/extras/tests/test_filters.py +9 -0
  125. nautobot/extras/tests/test_forms.py +2 -2
  126. nautobot/extras/tests/test_plugins.py +2 -3
  127. nautobot/extras/tests/test_relationships.py +14 -8
  128. nautobot/extras/tests/test_views.py +285 -2
  129. nautobot/extras/urls.py +5 -110
  130. nautobot/extras/utils.py +5 -2
  131. nautobot/extras/views.py +116 -311
  132. nautobot/ipam/api/views.py +69 -6
  133. nautobot/ipam/tables.py +8 -15
  134. nautobot/ipam/tests/migration/test_migrations.py +8 -8
  135. nautobot/ipam/tests/test_api.py +352 -2
  136. nautobot/ipam/tests/test_models.py +1 -1
  137. nautobot/project-static/docs/404.html +34 -34
  138. nautobot/project-static/docs/apps/index.html +34 -34
  139. nautobot/project-static/docs/apps/nautobot-apps.html +34 -34
  140. nautobot/project-static/docs/assets/_mkdocstrings.css +44 -6
  141. nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js → bundle.50899def.min.js} +2 -2
  142. nautobot/project-static/docs/assets/javascripts/{bundle.56ea9cef.min.js.map → bundle.50899def.min.js.map} +2 -2
  143. nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css → main.7e37652d.min.css} +1 -1
  144. nautobot/project-static/docs/assets/stylesheets/{main.342714a4.min.css.map → main.7e37652d.min.css.map} +1 -1
  145. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +39 -34
  146. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +36 -34
  147. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +139 -54
  148. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +48 -38
  149. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +50 -40
  150. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +36 -34
  151. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +35 -34
  152. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +43 -39
  153. nautobot/project-static/docs/code-reference/nautobot/apps/events.html +52 -42
  154. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +50 -41
  155. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +54 -44
  156. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +85 -93
  157. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +154 -62
  158. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +54 -46
  159. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +146 -87
  160. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +240 -70
  161. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +38 -35
  162. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +41 -35
  163. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +173 -52
  164. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +269 -85
  165. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +5987 -2643
  166. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +36 -34
  167. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +165 -89
  168. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +161 -69
  169. nautobot/project-static/docs/development/apps/api/configuration-view.html +34 -34
  170. nautobot/project-static/docs/development/apps/api/database-backend-config.html +34 -34
  171. nautobot/project-static/docs/development/apps/api/models/django-admin.html +34 -34
  172. nautobot/project-static/docs/development/apps/api/models/global-search.html +34 -34
  173. nautobot/project-static/docs/development/apps/api/models/graphql.html +34 -34
  174. nautobot/project-static/docs/development/apps/api/models/index.html +34 -34
  175. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +34 -34
  176. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +34 -34
  177. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +34 -34
  178. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +34 -34
  179. nautobot/project-static/docs/development/apps/api/platform-features/index.html +34 -34
  180. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +34 -34
  181. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +34 -34
  182. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +34 -34
  183. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +34 -34
  184. nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +34 -34
  185. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +34 -34
  186. nautobot/project-static/docs/development/apps/api/prometheus.html +34 -34
  187. nautobot/project-static/docs/development/apps/api/setup.html +34 -34
  188. nautobot/project-static/docs/development/apps/api/testing.html +34 -34
  189. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +34 -34
  190. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +34 -34
  191. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +34 -34
  192. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +34 -34
  193. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +34 -34
  194. nautobot/project-static/docs/development/apps/api/views/base-template.html +34 -34
  195. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +34 -34
  196. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +34 -34
  197. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +34 -34
  198. nautobot/project-static/docs/development/apps/api/views/index.html +34 -34
  199. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +34 -34
  200. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +42 -36
  201. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +34 -34
  202. nautobot/project-static/docs/development/apps/api/views/notes.html +34 -34
  203. nautobot/project-static/docs/development/apps/api/views/rest-api.html +34 -34
  204. nautobot/project-static/docs/development/apps/api/views/urls.html +34 -34
  205. nautobot/project-static/docs/development/apps/index.html +34 -34
  206. nautobot/project-static/docs/development/apps/migration/code-updates.html +34 -34
  207. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +34 -34
  208. nautobot/project-static/docs/development/apps/migration/from-v1.html +34 -34
  209. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +34 -34
  210. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +34 -34
  211. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +34 -34
  212. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +34 -34
  213. nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +37 -37
  214. nautobot/project-static/docs/development/apps/migration/ui-component-framework/breadcrumbs-titles.html +10544 -0
  215. nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +34 -34
  216. nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +34 -34
  217. nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +34 -34
  218. nautobot/project-static/docs/development/apps/porting-from-netbox.html +37 -37
  219. nautobot/project-static/docs/development/core/application-registry.html +162 -133
  220. nautobot/project-static/docs/development/core/best-practices.html +34 -34
  221. nautobot/project-static/docs/development/core/bootstrap-ui.html +34 -34
  222. nautobot/project-static/docs/development/core/caching.html +34 -34
  223. nautobot/project-static/docs/development/core/controllers.html +34 -34
  224. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +34 -34
  225. nautobot/project-static/docs/development/core/generic-views.html +34 -34
  226. nautobot/project-static/docs/development/core/getting-started.html +34 -34
  227. nautobot/project-static/docs/development/core/homepage.html +34 -34
  228. nautobot/project-static/docs/development/core/index.html +34 -34
  229. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +34 -34
  230. nautobot/project-static/docs/development/core/model-checklist.html +34 -34
  231. nautobot/project-static/docs/development/core/model-features.html +34 -34
  232. nautobot/project-static/docs/development/core/natural-keys.html +34 -34
  233. nautobot/project-static/docs/development/core/navigation-menu.html +34 -34
  234. nautobot/project-static/docs/development/core/release-checklist.html +34 -34
  235. nautobot/project-static/docs/development/core/role-internals.html +34 -34
  236. nautobot/project-static/docs/development/core/settings.html +34 -34
  237. nautobot/project-static/docs/development/core/style-guide.html +34 -34
  238. nautobot/project-static/docs/development/core/templates.html +34 -34
  239. nautobot/project-static/docs/development/core/testing.html +34 -34
  240. nautobot/project-static/docs/development/core/ui-component-framework.html +724 -289
  241. nautobot/project-static/docs/development/core/user-preferences.html +34 -34
  242. nautobot/project-static/docs/development/index.html +34 -34
  243. nautobot/project-static/docs/development/jobs/getting-started.html +34 -34
  244. nautobot/project-static/docs/development/jobs/index.html +34 -34
  245. nautobot/project-static/docs/development/jobs/installation.html +34 -34
  246. nautobot/project-static/docs/development/jobs/job-extensions.html +34 -34
  247. nautobot/project-static/docs/development/jobs/job-logging.html +34 -34
  248. nautobot/project-static/docs/development/jobs/job-patterns.html +34 -34
  249. nautobot/project-static/docs/development/jobs/job-structure.html +34 -34
  250. nautobot/project-static/docs/development/jobs/migration/from-v1.html +34 -34
  251. nautobot/project-static/docs/development/jobs/testing.html +34 -34
  252. nautobot/project-static/docs/index.html +34 -34
  253. nautobot/project-static/docs/media/development/core/ui-component-framework/breadcrumbs-titles-data-flow.png +0 -0
  254. nautobot/project-static/docs/media/power_distribution.png +0 -0
  255. nautobot/project-static/docs/objects.inv +0 -0
  256. nautobot/project-static/docs/overview/application_stack.html +34 -34
  257. nautobot/project-static/docs/overview/design_philosophy.html +34 -34
  258. nautobot/project-static/docs/release-notes/index.html +34 -34
  259. nautobot/project-static/docs/release-notes/version-1.0.html +34 -34
  260. nautobot/project-static/docs/release-notes/version-1.1.html +34 -34
  261. nautobot/project-static/docs/release-notes/version-1.2.html +34 -34
  262. nautobot/project-static/docs/release-notes/version-1.3.html +34 -34
  263. nautobot/project-static/docs/release-notes/version-1.4.html +34 -34
  264. nautobot/project-static/docs/release-notes/version-1.5.html +34 -34
  265. nautobot/project-static/docs/release-notes/version-1.6.html +34 -34
  266. nautobot/project-static/docs/release-notes/version-2.0.html +34 -34
  267. nautobot/project-static/docs/release-notes/version-2.1.html +34 -34
  268. nautobot/project-static/docs/release-notes/version-2.2.html +34 -34
  269. nautobot/project-static/docs/release-notes/version-2.3.html +34 -34
  270. nautobot/project-static/docs/release-notes/version-2.4.html +402 -34
  271. nautobot/project-static/docs/requirements.txt +3 -3
  272. nautobot/project-static/docs/search/search_index.json +1 -1
  273. nautobot/project-static/docs/sitemap.xml +303 -299
  274. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  275. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +34 -34
  276. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +34 -34
  277. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +34 -34
  278. nautobot/project-static/docs/user-guide/administration/configuration/index.html +34 -34
  279. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +34 -34
  280. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +37 -37
  281. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +34 -34
  282. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +34 -34
  283. nautobot/project-static/docs/user-guide/administration/guides/docker.html +34 -34
  284. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +34 -34
  285. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +34 -34
  286. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +34 -34
  287. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +34 -34
  288. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +34 -34
  289. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +34 -34
  290. nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +34 -34
  291. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +34 -34
  292. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +34 -34
  293. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +34 -34
  294. nautobot/project-static/docs/user-guide/administration/installation/index.html +34 -34
  295. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +34 -34
  296. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +34 -34
  297. nautobot/project-static/docs/user-guide/administration/installation/services.html +34 -34
  298. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +34 -34
  299. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +34 -34
  300. nautobot/project-static/docs/user-guide/administration/security/index.html +34 -34
  301. nautobot/project-static/docs/user-guide/administration/security/notices.html +34 -34
  302. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +296 -251
  303. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +34 -34
  304. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +34 -34
  305. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +34 -34
  306. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +34 -34
  307. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +34 -34
  308. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +34 -34
  309. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +34 -34
  310. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +34 -34
  311. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +34 -34
  312. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +34 -34
  313. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +34 -34
  314. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +34 -34
  315. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +34 -34
  316. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +34 -34
  317. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +34 -34
  318. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +34 -34
  319. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +34 -34
  320. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +34 -34
  321. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +34 -34
  322. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +34 -34
  323. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +34 -34
  324. nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +34 -34
  325. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +34 -34
  326. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +34 -34
  327. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +34 -34
  328. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +34 -34
  329. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +34 -34
  330. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +34 -34
  331. nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +34 -34
  332. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +34 -34
  333. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +34 -34
  334. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +34 -34
  335. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +34 -34
  336. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +34 -34
  337. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +34 -34
  338. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +34 -34
  339. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +34 -34
  340. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +37 -37
  341. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +34 -34
  342. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +34 -34
  343. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +42 -52
  344. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +34 -34
  345. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +34 -34
  346. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +34 -34
  347. nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +34 -34
  348. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +37 -37
  349. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +34 -34
  350. nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +34 -34
  351. nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +34 -34
  352. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +34 -34
  353. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +316 -39
  354. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +35 -35
  355. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +34 -34
  356. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +147 -37
  357. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +52 -35
  358. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +51 -34
  359. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +34 -34
  360. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +34 -34
  361. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +34 -34
  362. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +34 -34
  363. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +34 -34
  364. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +34 -34
  365. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +34 -34
  366. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +34 -34
  367. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +34 -34
  368. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +34 -34
  369. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +34 -34
  370. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +34 -34
  371. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +34 -34
  372. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +34 -34
  373. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +34 -34
  374. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +34 -34
  375. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +34 -34
  376. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +34 -34
  377. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +34 -34
  378. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +34 -34
  379. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +34 -34
  380. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +34 -34
  381. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +34 -34
  382. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +34 -34
  383. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +34 -34
  384. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +34 -34
  385. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +34 -34
  386. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +34 -34
  387. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +34 -34
  388. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +34 -34
  389. nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +34 -34
  390. nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +34 -34
  391. nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +34 -34
  392. nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +34 -34
  393. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +34 -34
  394. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +34 -34
  395. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +34 -34
  396. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +34 -34
  397. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +34 -34
  398. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +34 -34
  399. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +34 -34
  400. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +34 -34
  401. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +34 -34
  402. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +34 -34
  403. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +34 -34
  404. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +34 -34
  405. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +34 -34
  406. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +34 -34
  407. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +34 -34
  408. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +34 -34
  409. nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +34 -34
  410. nautobot/project-static/docs/user-guide/index.html +34 -34
  411. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +34 -34
  412. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +34 -34
  413. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +34 -34
  414. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +34 -34
  415. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +34 -34
  416. nautobot/project-static/docs/user-guide/platform-functionality/events.html +34 -34
  417. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +34 -34
  418. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +34 -34
  419. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +34 -34
  420. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +34 -34
  421. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +34 -34
  422. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +34 -34
  423. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +34 -34
  424. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +35 -35
  425. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +34 -34
  426. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +34 -34
  427. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +34 -34
  428. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +34 -34
  429. nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +34 -34
  430. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +34 -34
  431. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +34 -34
  432. nautobot/project-static/docs/user-guide/platform-functionality/note.html +34 -34
  433. nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +34 -34
  434. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +34 -34
  435. nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +34 -34
  436. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +34 -34
  437. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +34 -34
  438. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +34 -34
  439. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +34 -34
  440. nautobot/project-static/docs/user-guide/platform-functionality/role.html +34 -34
  441. nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +34 -34
  442. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +34 -34
  443. nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +34 -34
  444. nautobot/project-static/docs/user-guide/platform-functionality/status.html +34 -34
  445. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +34 -34
  446. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +34 -34
  447. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +34 -34
  448. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +34 -34
  449. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +34 -34
  450. nautobot/tenancy/api/views.py +2 -1
  451. nautobot/users/tests/test_api.py +2 -2
  452. nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -252
  453. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -75
  454. nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +252 -0
  455. nautobot/virtualization/templates/virtualization/virtualmachine_update.html +75 -0
  456. nautobot/virtualization/urls.py +3 -61
  457. nautobot/virtualization/views.py +48 -72
  458. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/METADATA +27 -27
  459. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/RECORD +463 -439
  460. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/LICENSE.txt +0 -0
  461. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/NOTICE +0 -0
  462. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/WHEEL +0 -0
  463. {nautobot-2.4.13.dist-info → nautobot-2.4.15.dist-info}/entry_points.txt +0 -0
@@ -1,6 +1,7 @@
1
1
  {% extends "base.html" %}
2
2
  {% load helpers %}
3
3
  {% load static %}
4
+ {% load ui_framework %}
4
5
 
5
6
  {% block extra_styles %}
6
7
  <style>
@@ -56,14 +57,12 @@
56
57
  </style>
57
58
  {% endblock %}
58
59
 
60
+ {% block document_title %}{% render_title "plain" %}{% endblock %}
61
+
59
62
  {% block content %}
60
63
  <div class="row noprint">
61
64
  <div class="col-md-12">
62
- <ol class="breadcrumb">
63
- {% block breadcrumbs %}
64
- <li><a href="{% url 'apps:apps_marketplace' %}">Apps Marketplace</a></li>
65
- {% endblock breadcrumbs %}
66
- </ol>
65
+ {% render_breadcrumbs %}
67
66
  </div>
68
67
  </div>
69
68
 
@@ -71,7 +70,7 @@
71
70
  <a class="btn btn-primary" href="{% url 'apps:apps_list' %}">See Installed Apps</a>
72
71
  </div>
73
72
 
74
- <h1>{% block title %}Apps Marketplace{% endblock %}</h1>
73
+ <h1>{% block page_heading %}{% render_title %}{% block page_heading %}</h1>
75
74
 
76
75
  <div class="row">
77
76
  <div class="col-md-12">
@@ -1,53 +1,2 @@
1
- {% extends 'generic/object_retrieve.html' %}
2
- {% load buttons %}
3
- {% load plugins %}
4
- {% load perms %}
5
- {% load helpers %}
6
-
7
- {% block breadcrumbs %}
8
- <li><a href="{% url 'extras:note_list' %}">Notes</a></li>
9
- {% if object.assigned_object.get_absolute_url %}
10
- <li><a href="{{ object.assigned_object.get_absolute_url }}notes/">{{ object.assigned_object }}</a></li>
11
- {% endif %}
12
- <li>{{ object }}</li>
13
- {% endblock breadcrumbs %}
14
-
15
- {% block content %}
16
- <div class="row">
17
- <div class="col-md-5">
18
- <div class="panel panel-default">
19
- <div class="panel-heading">
20
- <strong>Note</strong>
21
- </div>
22
- <table class="table table-hover panel-body attr-table">
23
- <tr>
24
- <td>User</td>
25
- <td>
26
- {{ object.user|default:object.user_name }}
27
- </td>
28
- </tr>
29
- <tr>
30
- <td>Object Type</td>
31
- <td>
32
- {{ object.assigned_object_type }}
33
- </td>
34
- </tr>
35
- <tr>
36
- <td>Object</td>
37
- <td>
38
- {{ object.assigned_object | hyperlinked_object }}
39
- </td>
40
- </tr>
41
- </table>
42
- </div>
43
- <div class="panel panel-default">
44
- <div class="panel-heading">
45
- <strong>Text</strong>
46
- </div>
47
- <div class="panel-body rendered-markdown">
48
- {{ object.note|render_markdown }}
49
- </div>
50
- </div>
51
- </div>
52
- </div>
53
- {% endblock %}
1
+ {% extends 'extras/note_retrieve.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,53 @@
1
+ {% extends 'generic/object_retrieve.html' %}
2
+ {% load buttons %}
3
+ {% load plugins %}
4
+ {% load perms %}
5
+ {% load helpers %}
6
+
7
+ {% block breadcrumbs %}
8
+ <li><a href="{% url 'extras:note_list' %}">Notes</a></li>
9
+ {% if object.assigned_object.get_absolute_url %}
10
+ <li><a href="{{ object.assigned_object.get_absolute_url }}notes/">{{ object.assigned_object }}</a></li>
11
+ {% endif %}
12
+ <li>{{ object }}</li>
13
+ {% endblock breadcrumbs %}
14
+
15
+ {% block content %}
16
+ <div class="row">
17
+ <div class="col-md-5">
18
+ <div class="panel panel-default">
19
+ <div class="panel-heading">
20
+ <strong>Note</strong>
21
+ </div>
22
+ <table class="table table-hover panel-body attr-table">
23
+ <tr>
24
+ <td>User</td>
25
+ <td>
26
+ {{ object.user|default:object.user_name }}
27
+ </td>
28
+ </tr>
29
+ <tr>
30
+ <td>Object Type</td>
31
+ <td>
32
+ {{ object.assigned_object_type }}
33
+ </td>
34
+ </tr>
35
+ <tr>
36
+ <td>Object</td>
37
+ <td>
38
+ {{ object.assigned_object | hyperlinked_object }}
39
+ </td>
40
+ </tr>
41
+ </table>
42
+ </div>
43
+ <div class="panel panel-default">
44
+ <div class="panel-heading">
45
+ <strong>Text</strong>
46
+ </div>
47
+ <div class="panel-body rendered-markdown">
48
+ {{ object.note|render_markdown }}
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ {% endblock %}
@@ -1,15 +1,14 @@
1
1
  {% extends "base.html" %}
2
2
  {% load helpers %}
3
3
  {% load static %}
4
+ {% load ui_framework %}
5
+
6
+ {% block document_title %}{% render_title "plain" %}{% endblock %}
4
7
 
5
8
  {% block content %}
6
9
  <div class="row noprint">
7
10
  <div class="col-md-12">
8
- <ol class="breadcrumb">
9
- {% block breadcrumbs %}
10
- <li><a href="{% url 'apps:apps_list' %}">Installed Apps</a></li>
11
- {% endblock breadcrumbs %}
12
- </ol>
11
+ {% render_breadcrumbs %}
13
12
  </div>
14
13
  </div>
15
14
 
@@ -34,7 +33,7 @@
34
33
  <a class="btn btn-primary" href="{% url 'apps:apps_marketplace' %}">Visit Apps Marketplace</a>
35
34
  </div>
36
35
 
37
- <h1>{% block title %}Installed Apps{% endblock %}</h1>
36
+ <h1>{% block page_heading %}{% render_title %}{% endblock %}</h1>
38
37
 
39
38
  <div class="row">
40
39
  <div class="col-md-12">
@@ -1,29 +1,2 @@
1
- {% extends "generic/object_retrieve.html" %}
2
- {% load helpers %}
3
-
4
- {% block content_left_page %}
5
- <div class="panel panel-default">
6
- <div class="panel-heading">
7
- <strong>Secrets Group</strong>
8
- </div>
9
- <table class="table table-hover panel-body attr-table">
10
- <tr>
11
- <td>Description</td>
12
- <td colspan="3">{{ object.description | placeholder }}</td>
13
- </tr>
14
- <tr>
15
- <td rowspan="{{ secrets_group_associations | length | add:'1'}}">Secrets</td>
16
- <th>Access Type</th>
17
- <th>Secret Type</th>
18
- <th>Secret</th>
19
- </tr>
20
- {% for secret_association in secrets_group_associations %}
21
- <tr>
22
- <td>{{ secret_association.access_type }}</td>
23
- <td>{{ secret_association.secret_type | bettertitle }}</td>
24
- <td>{{ secret_association.secret|hyperlinked_object }}</td>
25
- </tr>
26
- {% endfor %}
27
- </table>
28
- </div>
29
- {% endblock content_left_page %}
1
+ {% extends "extras/secretsgroup_retrieve.html" %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -1,82 +1,2 @@
1
- {% extends 'generic/object_create.html' %}
2
- {% load static %}
3
- {% load form_helpers %}
4
-
5
- {% block form %}
6
- <div class="panel panel-default">
7
- <div class="panel-heading"><strong>Secrets Group</strong></div>
8
- <div class="panel-body">
9
- {% render_field form.name %}
10
- {% render_field form.description %}
11
- </div>
12
- </div>
13
- <div class="panel panel-default">
14
- <div class="panel-heading"><strong>Secret Assignment</strong></div>
15
- <div class="panel-body">
16
- {% if secrets.errors %}
17
- <div class="text-danger">
18
- Please correct the error(s) below:
19
-
20
- {% for secret in secrets.forms %}
21
- {% if secret.errors %}
22
- {% for error in secret.errors.values %}{{ error }}{% endfor %}
23
- {% endif %}
24
- {% endfor %}
25
- </div>
26
- {% endif %}
27
- {{ secrets.non_field_errors }}
28
- <table class="table" id="secrets">
29
- {{ secrets.management_form }}
30
- {% for secret_form in secrets.forms %}
31
- {% if forloop.first %}
32
- <thead>
33
- <tr>
34
- {% for field in secret_form.visible_fields %}
35
- <th>{{ field.label|capfirst }}</th>
36
- {% endfor %}
37
- </tr>
38
- </thead>
39
- {% endif %}
40
- <tr class="formset_row-{{ secrets.prefix }}">
41
- {% for field in secret_form.visible_fields %}
42
- <td>
43
- {% if forloop.first %}
44
- {% for hidden in secret_form.hidden_fields %}
45
- {{ hidden }}
46
- {% endfor %}
47
- {% endif %}
48
- {{ field }}
49
- {% if field.errors %}
50
- <ul>
51
- {% for error in field.errors %}
52
- {# Embed an HTML comment indicating the error for extraction by tests #}
53
- <!-- FORM-ERROR {{ field.name }}: {{ error }} -->
54
- <li class="text-danger">{{ error }}</li>
55
- {% endfor %}
56
- </ul>
57
- {% endif %}
58
- </td>
59
- {% endfor %}
60
- </tr>
61
- {% endfor %}
62
- </table>
63
- </div>
64
- </div>
65
- {% include "inc/extras_features_edit_form_fields.html" %}
66
- {% endblock form %}
67
-
68
- {% block javascript %}
69
- {{ block.super }}
70
- <script src="{% static 'jquery/jquery.formset.js' %}"></script>
71
- <script type="text/javascript">
72
- $('.formset_row-{{ secrets.prefix }}').formset({
73
- addText: '<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add another Secret',
74
- addCssClass: 'btn btn-primary add-row',
75
- deleteText: '<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>',
76
- deleteCssClass: 'btn btn-danger delete-row',
77
- prefix: '{{ secrets.prefix }}',
78
- formCssClass: 'dynamic-formset-{{ secrets.prefix }}',
79
- added: jsify_form
80
- });
81
- </script>
82
- {% endblock javascript %}
1
+ {% extends 'extras/secretsgroup_update.html' %}
2
+ {% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
@@ -0,0 +1,29 @@
1
+ {% extends "generic/object_retrieve.html" %}
2
+ {% load helpers %}
3
+
4
+ {% block content_left_page %}
5
+ <div class="panel panel-default">
6
+ <div class="panel-heading">
7
+ <strong>Secrets Group</strong>
8
+ </div>
9
+ <table class="table table-hover panel-body attr-table">
10
+ <tr>
11
+ <td>Description</td>
12
+ <td colspan="3">{{ object.description | placeholder }}</td>
13
+ </tr>
14
+ <tr>
15
+ <td rowspan="{{ secrets_group_associations | length | add:'1'}}">Secrets</td>
16
+ <th>Access Type</th>
17
+ <th>Secret Type</th>
18
+ <th>Secret</th>
19
+ </tr>
20
+ {% for secret_association in secrets_group_associations %}
21
+ <tr>
22
+ <td>{{ secret_association.access_type }}</td>
23
+ <td>{{ secret_association.secret_type | bettertitle }}</td>
24
+ <td>{{ secret_association.secret|hyperlinked_object }}</td>
25
+ </tr>
26
+ {% endfor %}
27
+ </table>
28
+ </div>
29
+ {% endblock content_left_page %}
@@ -0,0 +1,82 @@
1
+ {% extends 'generic/object_create.html' %}
2
+ {% load static %}
3
+ {% load form_helpers %}
4
+
5
+ {% block form %}
6
+ <div class="panel panel-default">
7
+ <div class="panel-heading"><strong>Secrets Group</strong></div>
8
+ <div class="panel-body">
9
+ {% render_field form.name %}
10
+ {% render_field form.description %}
11
+ </div>
12
+ </div>
13
+ <div class="panel panel-default">
14
+ <div class="panel-heading"><strong>Secret Assignment</strong></div>
15
+ <div class="panel-body">
16
+ {% if secrets.errors %}
17
+ <div class="text-danger">
18
+ Please correct the error(s) below:
19
+
20
+ {% for secret in secrets.forms %}
21
+ {% if secret.errors %}
22
+ {% for error in secret.errors.values %}{{ error }}{% endfor %}
23
+ {% endif %}
24
+ {% endfor %}
25
+ </div>
26
+ {% endif %}
27
+ {{ secrets.non_field_errors }}
28
+ <table class="table" id="secrets">
29
+ {{ secrets.management_form }}
30
+ {% for secret_form in secrets.forms %}
31
+ {% if forloop.first %}
32
+ <thead>
33
+ <tr>
34
+ {% for field in secret_form.visible_fields %}
35
+ <th>{{ field.label|capfirst }}</th>
36
+ {% endfor %}
37
+ </tr>
38
+ </thead>
39
+ {% endif %}
40
+ <tr class="formset_row-{{ secrets.prefix }}">
41
+ {% for field in secret_form.visible_fields %}
42
+ <td>
43
+ {% if forloop.first %}
44
+ {% for hidden in secret_form.hidden_fields %}
45
+ {{ hidden }}
46
+ {% endfor %}
47
+ {% endif %}
48
+ {{ field }}
49
+ {% if field.errors %}
50
+ <ul>
51
+ {% for error in field.errors %}
52
+ {# Embed an HTML comment indicating the error for extraction by tests #}
53
+ <!-- FORM-ERROR {{ field.name }}: {{ error }} -->
54
+ <li class="text-danger">{{ error }}</li>
55
+ {% endfor %}
56
+ </ul>
57
+ {% endif %}
58
+ </td>
59
+ {% endfor %}
60
+ </tr>
61
+ {% endfor %}
62
+ </table>
63
+ </div>
64
+ </div>
65
+ {% include "inc/extras_features_edit_form_fields.html" %}
66
+ {% endblock form %}
67
+
68
+ {% block javascript %}
69
+ {{ block.super }}
70
+ <script src="{% static 'jquery/jquery.formset.js' %}"></script>
71
+ <script type="text/javascript">
72
+ $('.formset_row-{{ secrets.prefix }}').formset({
73
+ addText: '<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add another Secret',
74
+ addCssClass: 'btn btn-primary add-row',
75
+ deleteText: '<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span>',
76
+ deleteCssClass: 'btn btn-danger delete-row',
77
+ prefix: '{{ secrets.prefix }}',
78
+ formCssClass: 'dynamic-formset-{{ secrets.prefix }}',
79
+ added: jsify_form
80
+ });
81
+ </script>
82
+ {% endblock javascript %}
@@ -40,7 +40,7 @@ def custom_links(context, obj):
40
40
  "user": context["user"], # django.contrib.auth.context_processors.auth
41
41
  "perms": context["perms"], # django.contrib.auth.context_processors.auth
42
42
  }
43
- template_code = mark_safe("") # noqa: S308 # suspicious-mark-safe-usage -- this one is safe
43
+ template_code = mark_safe("")
44
44
  group_names = OrderedDict()
45
45
 
46
46
  for cl in links:
@@ -70,7 +70,7 @@ def custom_links(context, obj):
70
70
 
71
71
  # Add grouped links to template
72
72
  for group, links in group_names.items():
73
- links_rendered = mark_safe("") # noqa: S308 # suspicious-mark-safe-usage -- this one is safe
73
+ links_rendered = mark_safe("")
74
74
 
75
75
  for cl in links:
76
76
  try:
@@ -71,7 +71,7 @@ CONFIRM_MODAL = """
71
71
  </div>
72
72
  """
73
73
 
74
- SAFE_EMPTY_STR = mark_safe("") # noqa: S308 # suspicious-mark-safe-usage -- this one is safe
74
+ SAFE_EMPTY_STR = mark_safe("")
75
75
 
76
76
 
77
77
  def _render_job_button_for_obj(job_button, obj, context, content_type):
@@ -50,7 +50,7 @@ def _get_registered_content(obj, method, template_context, return_html=True):
50
50
  content = getattr(instance, method)()
51
51
  if not return_html:
52
52
  for i, content in enumerate(content):
53
- objects.append({f"{plugin_name}:{i+1}": content})
53
+ objects.append({f"{plugin_name}:{i + 1}": content})
54
54
  else:
55
55
  html += content
56
56
 
@@ -40,7 +40,7 @@ class ComputedFieldsTestCase(SeleniumTestCase):
40
40
  and checks it appears ONLY there!.
41
41
  """
42
42
  # Visit the device detail page
43
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": self.device.pk})}')
43
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': self.device.pk})}")
44
44
  # Check the computed field appears in the primary information tab
45
45
  self.assertTrue(self.browser.is_text_present("Device Computed Field"))
46
46
  self.assertTrue(self.browser.is_text_present(f"{self.device.name} is awesome!"))
@@ -52,7 +52,7 @@ class ComputedFieldsTestCase(SeleniumTestCase):
52
52
  self.computed_field.advanced_ui = True
53
53
  self.computed_field.save()
54
54
  # Visit the device detail page
55
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": self.device.pk})}')
55
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': self.device.pk})}")
56
56
  # Check the computed field does NOT appear in the primary information tab
57
57
  self.assertFalse(self.browser.is_text_present("Device Computed Field"))
58
58
  self.assertFalse(self.browser.is_text_present(f"{self.device.name} is awesome!"))
@@ -96,12 +96,13 @@ class CustomFieldTestCase(SeleniumTestCase):
96
96
 
97
97
  def test_fail_create_invalid_type_with_choices(self):
98
98
  """Test fail type!=select with choices."""
99
+ cf_label = "Test Text"
99
100
  with self.assertRaises(AssertionError):
100
- self._create_custom_field(field_label="Test Text", field_type="text", choices=["bad1"])
101
+ self._create_custom_field(field_label=cf_label, field_type="text", choices=["bad1"])
101
102
 
102
103
  # Assert error state
103
- self.assertTrue(self.browser.is_text_present("Editing custom field"))
104
- self.assertTrue(self.browser.is_text_present("Errors encountered when saving custom field choices"))
104
+ self.assertTrue(self.browser.is_text_present("Add a new custom field"))
105
+ self.assertTrue(self.browser.is_text_present(f"{cf_label} failed validation"))
105
106
  self.assertTrue(self.browser.is_text_present("Custom field choices can only be assigned to selection fields"))
106
107
 
107
108
  def test_create_type_select_with_choices_adding_dynamic_row(self):
@@ -133,7 +134,8 @@ class CustomFieldTestCase(SeleniumTestCase):
133
134
  choices = ["replace_me"]
134
135
 
135
136
  # Create the field
136
- self._create_custom_field(field_label="Test Select", field_type="select", choices=choices)
137
+ cf_label = "Test Select"
138
+ self._create_custom_field(field_label=cf_label, field_type="select", choices=choices)
137
139
  detail_url = self.browser.url
138
140
 
139
141
  #
@@ -148,7 +150,8 @@ class CustomFieldTestCase(SeleniumTestCase):
148
150
  self.browser.fill("custom_field_choices-0-value", "")
149
151
  self.assertEqual(self.browser.find_by_name("custom_field_choices-0-value").value, "")
150
152
  self.browser.find_by_text("Update").click()
151
- self.assertTrue(self.browser.is_text_present("Errors encountered when saving custom field choices"))
153
+ self.assertTrue(self.browser.is_text_present(f"{cf_label} failed validation"))
154
+ self.assertTrue(self.browser.is_text_present("This field is required."))
152
155
 
153
156
  #
154
157
  # Pass updating existing choice (changing value of existing choice)
@@ -208,7 +211,7 @@ class CustomFieldTestCase(SeleniumTestCase):
208
211
  device.cf[custom_field.key] = "This is some testing text"
209
212
  device.validated_save()
210
213
  # Visit the device detail page
211
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": device.pk})}')
214
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': device.pk})}")
212
215
  # Check the custom field appears in the primary information tab
213
216
  self.assertTrue(self.browser.is_text_present("Device Custom Field"))
214
217
  self.assertTrue(self.browser.is_text_present("This is some testing text"))
@@ -220,7 +223,7 @@ class CustomFieldTestCase(SeleniumTestCase):
220
223
  custom_field.advanced_ui = True
221
224
  custom_field.save()
222
225
  # Visit the device detail page
223
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": device.pk})}')
226
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': device.pk})}")
224
227
  # Check the custom field does NOT appear in the primary information tab
225
228
  self.assertFalse(self.browser.is_text_present("Device Custom Field"))
226
229
  self.assertFalse(self.browser.is_text_present("This is some testing text"))
@@ -245,7 +248,7 @@ class CustomFieldTestCase(SeleniumTestCase):
245
248
  device_content_type = ContentType.objects.get_for_model(Device)
246
249
  custom_field.content_types.set([device_content_type])
247
250
  # Visit the device edit page
248
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device_edit", kwargs={"pk": self.device.pk})}')
251
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device_edit', kwargs={'pk': self.device.pk})}")
249
252
  self.browser.find_by_id("id_cf_test_valid_json_field").first.type("test")
250
253
  active_web_element = self.browser.driver.switch_to.active_element
251
254
  # Type invalid JSON data into the form
@@ -271,7 +274,7 @@ class CustomFieldTestCase(SeleniumTestCase):
271
274
  device_content_type = ContentType.objects.get_for_model(Device)
272
275
  custom_field.content_types.set([device_content_type])
273
276
  # Visit the device edit page
274
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device_edit", kwargs={"pk": self.device.pk})}')
277
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device_edit', kwargs={'pk': self.device.pk})}")
275
278
  self.browser.find_by_id("id_cf_test_invalid_json_field").first.type("test")
276
279
  active_web_element = self.browser.driver.switch_to.active_element
277
280
  # Type invalid JSON data into the form
@@ -303,7 +306,7 @@ class CustomFieldTestCase(SeleniumTestCase):
303
306
  device_content_type = ContentType.objects.get_for_model(Device)
304
307
  custom_field.content_types.set([device_content_type])
305
308
  # Visit the device edit page
306
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device_edit", kwargs={"pk": device.pk})}')
309
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device_edit', kwargs={'pk': device.pk})}")
307
310
  # Get the first item selected on the custom field
308
311
  self.browser.find_by_xpath(".//label[contains(text(), 'Device Selection Field')]").click()
309
312
  active_web_element = self.browser.driver.switch_to.active_element
@@ -325,7 +328,7 @@ class CustomFieldTestCase(SeleniumTestCase):
325
328
  self.browser.find_by_xpath(".//button[contains(text(), 'Confirm')]").click()
326
329
 
327
330
  # Visit the device edit page
328
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device_edit", kwargs={"pk": device.pk})}')
331
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device_edit', kwargs={'pk': device.pk})}")
329
332
  # Click update button
330
333
  self.browser.find_by_xpath(".//button[contains(text(), 'Update')]").click()
331
334
  # Check successful redirect to device object page
@@ -79,6 +79,6 @@ class DynamicGroupTestCase(SeleniumTestCase):
79
79
 
80
80
  # Verify dynamic group shows up on device detail tab
81
81
  self.browser.visit(
82
- f'{self.live_server_url}{reverse("dcim:device_dynamicgroups", kwargs={"pk": devices[0].pk})}'
82
+ f"{self.live_server_url}{reverse('dcim:device_dynamicgroups', kwargs={'pk': devices[0].pk})}"
83
83
  )
84
84
  self.assertTrue(self.browser.is_text_present(name))
@@ -29,7 +29,7 @@ class NoteTestCase(SeleniumTestCase):
29
29
  location = Location.objects.create(name="Location 1", location_type=location_type, status=location_status)
30
30
 
31
31
  # Navigate to the created location.
32
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:location", kwargs={"pk": location.pk})}')
32
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:location', kwargs={'pk': location.pk})}")
33
33
 
34
34
  # Verify notes tab shows up and click it.
35
35
  self.assertTrue(self.browser.links.find_by_partial_href(f"/dcim/locations/{location.pk}/notes/"))
@@ -134,13 +134,13 @@ class AppDocumentationTest(SeleniumTestCase):
134
134
 
135
135
  def test_object_edit_help_provided(self):
136
136
  """The ExampleModel object provides model documentation, this test ensures the help link is rendered."""
137
- self.browser.visit(f'{self.live_server_url}{reverse("plugins:example_app:examplemodel_add")}')
137
+ self.browser.visit(f"{self.live_server_url}{reverse('plugins:example_app:examplemodel_add')}")
138
138
 
139
139
  self.assertTrue(self.browser.links.find_by_partial_href("example_app/docs/models/examplemodel.html"))
140
140
 
141
141
  def test_object_edit_help_not_provided(self):
142
142
  """The AnotherExampleModel object doesn't provide model documentation, this test ensures no help link is provided."""
143
- self.browser.visit(f'{self.live_server_url}{reverse("plugins:example_app:anotherexamplemodel_add")}')
143
+ self.browser.visit(f"{self.live_server_url}{reverse('plugins:example_app:anotherexamplemodel_add')}")
144
144
 
145
145
  self.assertFalse(self.browser.links.find_by_partial_href("example_app/docs/models/anotherexamplemodel.html"))
146
146
 
@@ -158,13 +158,13 @@ class AppReturnUrlTestCase(SeleniumTestCase):
158
158
 
159
159
  def test_app_return_url(self):
160
160
  """This test ensures that Apps return url for new objects is the list view."""
161
- self.browser.visit(f'{self.live_server_url}{reverse("plugins:example_app:examplemodel_add")}')
161
+ self.browser.visit(f"{self.live_server_url}{reverse('plugins:example_app:examplemodel_add')}")
162
162
 
163
163
  form = self.browser.find_by_tag("form")
164
164
 
165
165
  # Check that the Cancel button is a link to the examplemodel_list view.
166
166
  element = form.first.links.find_by_text("Cancel").first
167
- self.assertEqual(element["href"], f'{self.live_server_url}{reverse("plugins:example_app:examplemodel_list")}')
167
+ self.assertEqual(element["href"], f"{self.live_server_url}{reverse('plugins:example_app:examplemodel_list')}")
168
168
 
169
169
 
170
170
  class AppTabsTestCase(SeleniumTestCase):
@@ -193,7 +193,7 @@ class AppTabsTestCase(SeleniumTestCase):
193
193
  status=status,
194
194
  )
195
195
  # Visit the circuit's detail page and check that the tab is visible
196
- self.browser.visit(f'{self.live_server_url}{reverse("circuits:circuit", args=[str(circuit.pk)])}')
196
+ self.browser.visit(f"{self.live_server_url}{reverse('circuits:circuit', args=[str(circuit.pk)])}")
197
197
  self.assertTrue(self.browser.is_text_present("App Tab"))
198
198
  # Visit the tab link and check the view content
199
199
  self.browser.links.find_by_partial_text("Example App Tab")[0].click()
@@ -210,7 +210,7 @@ class AppTabsTestCase(SeleniumTestCase):
210
210
  # Set up the required objects:
211
211
  device = create_test_device("Test Device")
212
212
  # Visit the device's detail page and check that the tab is visible
213
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", args=[str(device.pk)])}')
213
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', args=[str(device.pk)])}")
214
214
  for tab_i in [1, 2]:
215
215
  self.assertTrue(self.browser.is_text_present(f"Example App Tab {tab_i}"))
216
216
  # Visit the tab link and check the view content
@@ -51,7 +51,7 @@ class RelationshipsTestCase(SeleniumTestCase):
51
51
  destination=power_panel,
52
52
  )
53
53
  # Visit the device detail page
54
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": device.pk})}')
54
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': device.pk})}")
55
55
  # Check the relationship appears in the primary information tab
56
56
  self.assertTrue(self.browser.is_text_present("power panel"))
57
57
  self.assertTrue(self.browser.is_text_present("Power Panel"))
@@ -63,7 +63,7 @@ class RelationshipsTestCase(SeleniumTestCase):
63
63
  relationship.advanced_ui = True
64
64
  relationship.save()
65
65
  # Visit the device detail page
66
- self.browser.visit(f'{self.live_server_url}{reverse("dcim:device", kwargs={"pk": device.pk})}')
66
+ self.browser.visit(f"{self.live_server_url}{reverse('dcim:device', kwargs={'pk': device.pk})}")
67
67
  # Check the relationship does NOT appear in the primary information tab
68
68
  self.assertFalse(self.browser.is_text_present("power panel"))
69
69
  self.assertFalse(self.browser.is_text_present("Power Panel"))