nautobot 2.2.0__py3-none-any.whl → 2.2.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 (362) hide show
  1. nautobot/apps/api.py +2 -1
  2. nautobot/apps/utils.py +0 -4
  3. nautobot/apps/views.py +0 -2
  4. nautobot/circuits/api/urls.py +2 -1
  5. nautobot/circuits/api/views.py +12 -0
  6. nautobot/circuits/tests/test_filters.py +1 -1
  7. nautobot/core/api/routers.py +3 -25
  8. nautobot/core/api/utils.py +0 -4
  9. nautobot/core/api/views.py +15 -21
  10. nautobot/core/filters.py +1 -7
  11. nautobot/core/management/commands/generate_test_data.py +4 -4
  12. nautobot/core/settings.py +0 -1
  13. nautobot/core/tables.py +1 -2
  14. nautobot/core/templates/admin/base.html +94 -23
  15. nautobot/core/templates/graphene/graphiql.html +47 -18
  16. nautobot/core/templates/inc/footer.html +5 -5
  17. nautobot/core/templates/inc/nav_menu.html +7 -0
  18. nautobot/core/templates/rest_framework/api.html +5 -12
  19. nautobot/core/templatetags/helpers.py +2 -2
  20. nautobot/core/testing/views.py +0 -30
  21. nautobot/core/tests/test_api.py +6 -13
  22. nautobot/core/tests/test_csv.py +4 -5
  23. nautobot/core/tests/test_filters.py +1 -2
  24. nautobot/core/tests/test_graphql.py +14 -4
  25. nautobot/core/tests/test_navigations.py +0 -3
  26. nautobot/core/tests/test_views.py +16 -22
  27. nautobot/core/utils/lookup.py +0 -124
  28. nautobot/core/views/__init__.py +7 -3
  29. nautobot/core/views/generic.py +3 -19
  30. nautobot/core/views/mixins.py +0 -7
  31. nautobot/core/views/renderers.py +1 -4
  32. nautobot/dcim/api/serializers.py +4 -4
  33. nautobot/dcim/api/urls.py +3 -2
  34. nautobot/dcim/api/views.py +18 -7
  35. nautobot/dcim/factory.py +7 -7
  36. nautobot/dcim/filters/__init__.py +17 -16
  37. nautobot/dcim/forms.py +45 -61
  38. nautobot/dcim/homepage.py +3 -11
  39. nautobot/dcim/migrations/0057_controller_models.py +70 -11
  40. nautobot/dcim/models/__init__.py +2 -2
  41. nautobot/dcim/models/devices.py +16 -14
  42. nautobot/dcim/models/racks.py +3 -1
  43. nautobot/dcim/navigation.py +31 -23
  44. nautobot/dcim/signals.py +6 -6
  45. nautobot/dcim/tables/__init__.py +2 -2
  46. nautobot/dcim/tables/devices.py +15 -12
  47. nautobot/dcim/tables/template_code.py +1 -1
  48. nautobot/dcim/templates/dcim/controller_retrieve.html +18 -35
  49. nautobot/dcim/templates/dcim/controllerdevicegroup_create.html +43 -0
  50. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +43 -67
  51. nautobot/dcim/templates/dcim/device.html +2 -10
  52. nautobot/dcim/templates/dcim/device_edit.html +1 -1
  53. nautobot/dcim/tests/test_api.py +6 -11
  54. nautobot/dcim/tests/test_filters.py +81 -92
  55. nautobot/dcim/tests/test_graphql.py +1 -11
  56. nautobot/dcim/tests/test_models.py +15 -15
  57. nautobot/dcim/tests/test_signals.py +0 -2
  58. nautobot/dcim/tests/test_views.py +12 -24
  59. nautobot/dcim/urls.py +1 -1
  60. nautobot/dcim/views.py +15 -19
  61. nautobot/extras/api/urls.py +2 -1
  62. nautobot/extras/api/views.py +10 -0
  63. nautobot/extras/filters/__init__.py +2 -53
  64. nautobot/extras/forms/contacts.py +0 -7
  65. nautobot/extras/managers.py +0 -14
  66. nautobot/extras/navigation.py +65 -71
  67. nautobot/extras/plugins/views.py +11 -7
  68. nautobot/extras/tests/test_api.py +0 -2
  69. nautobot/extras/tests/test_dynamicgroups.py +0 -2
  70. nautobot/extras/tests/test_filters.py +4 -89
  71. nautobot/extras/tests/test_models.py +0 -9
  72. nautobot/extras/tests/test_relationships.py +1 -10
  73. nautobot/extras/tests/test_views.py +1 -112
  74. nautobot/extras/views.py +10 -10
  75. nautobot/ipam/api/urls.py +2 -1
  76. nautobot/ipam/api/views.py +11 -0
  77. nautobot/ipam/tables.py +22 -2
  78. nautobot/ipam/tests/test_graphql.py +3 -2
  79. nautobot/ipam/tests/test_views.py +0 -1
  80. nautobot/ipam/views.py +9 -9
  81. nautobot/project-static/css/base.css +0 -1
  82. nautobot/project-static/docs/404.html +3 -24
  83. nautobot/project-static/docs/apps/index.html +3 -24
  84. nautobot/project-static/docs/apps/nautobot-apps.html +3 -24
  85. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +3 -24
  86. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +3 -24
  87. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +5 -26
  88. nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +3 -24
  89. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +3 -24
  90. nautobot/project-static/docs/code-reference/nautobot/apps/config.html +3 -24
  91. nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +3 -24
  92. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +3 -24
  93. nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +3 -24
  94. nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +3 -24
  95. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +3 -24
  96. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +3 -24
  97. nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +3 -24
  98. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +3 -24
  99. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +3 -24
  100. nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +3 -24
  101. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +3 -24
  102. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +3 -24
  103. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3 -24
  104. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +3 -24
  105. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +3 -24
  106. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +3 -242
  107. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +5 -69
  108. nautobot/project-static/docs/development/apps/api/configuration-view.html +3 -24
  109. nautobot/project-static/docs/development/apps/api/database-backend-config.html +3 -24
  110. nautobot/project-static/docs/development/apps/api/models/django-admin.html +3 -24
  111. nautobot/project-static/docs/development/apps/api/models/global-search.html +3 -24
  112. nautobot/project-static/docs/development/apps/api/models/graphql.html +3 -24
  113. nautobot/project-static/docs/development/apps/api/models/index.html +3 -24
  114. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +3 -24
  115. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +3 -24
  116. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +3 -24
  117. nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +3 -24
  118. nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -24
  119. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +3 -24
  120. nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +3 -24
  121. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +3 -24
  122. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +3 -24
  123. nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +3 -24
  124. nautobot/project-static/docs/development/apps/api/prometheus.html +3 -24
  125. nautobot/project-static/docs/development/apps/api/setup.html +3 -24
  126. nautobot/project-static/docs/development/apps/api/testing.html +3 -24
  127. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +3 -24
  128. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +3 -24
  129. nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +3 -24
  130. nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +3 -24
  131. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +3 -24
  132. nautobot/project-static/docs/development/apps/api/views/base-template.html +3 -24
  133. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +12 -38
  134. nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +15 -41
  135. nautobot/project-static/docs/development/apps/api/views/help-documentation.html +3 -24
  136. nautobot/project-static/docs/development/apps/api/views/index.html +3 -24
  137. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +3 -24
  138. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +3 -24
  139. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +3 -24
  140. nautobot/project-static/docs/development/apps/api/views/notes.html +3 -24
  141. nautobot/project-static/docs/development/apps/api/views/rest-api.html +3 -24
  142. nautobot/project-static/docs/development/apps/api/views/urls.html +3 -24
  143. nautobot/project-static/docs/development/apps/index.html +3 -24
  144. nautobot/project-static/docs/development/apps/migration/code-updates.html +3 -24
  145. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +3 -24
  146. nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -24
  147. nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +3 -24
  148. nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +3 -24
  149. nautobot/project-static/docs/development/apps/migration/model-updates/global.html +3 -24
  150. nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +3 -24
  151. nautobot/project-static/docs/development/apps/porting-from-netbox.html +3 -24
  152. nautobot/project-static/docs/development/core/application-registry.html +3 -24
  153. nautobot/project-static/docs/development/core/best-practices.html +3 -24
  154. nautobot/project-static/docs/development/core/bootstrap-ui.html +3 -24
  155. nautobot/project-static/docs/development/core/caching.html +3 -24
  156. nautobot/project-static/docs/development/core/controllers.html +204 -35
  157. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +3 -24
  158. nautobot/project-static/docs/development/core/extending-models.html +3 -24
  159. nautobot/project-static/docs/development/core/generic-views.html +3 -24
  160. nautobot/project-static/docs/development/core/getting-started.html +13 -43
  161. nautobot/project-static/docs/development/core/homepage.html +3 -24
  162. nautobot/project-static/docs/development/core/index.html +3 -24
  163. nautobot/project-static/docs/development/core/model-features.html +3 -24
  164. nautobot/project-static/docs/development/core/natural-keys.html +3 -24
  165. nautobot/project-static/docs/development/core/navigation-menu.html +3 -24
  166. nautobot/project-static/docs/development/core/release-checklist.html +3 -24
  167. nautobot/project-static/docs/development/core/role-internals.html +3 -24
  168. nautobot/project-static/docs/development/core/settings.html +3 -24
  169. nautobot/project-static/docs/development/core/style-guide.html +3 -24
  170. nautobot/project-static/docs/development/core/templates.html +3 -24
  171. nautobot/project-static/docs/development/core/testing.html +3 -24
  172. nautobot/project-static/docs/development/core/user-preferences.html +3 -24
  173. nautobot/project-static/docs/development/index.html +3 -24
  174. nautobot/project-static/docs/development/jobs/index.html +3 -24
  175. nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -24
  176. nautobot/project-static/docs/index.html +3 -24
  177. nautobot/project-static/docs/models/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +3 -3
  178. nautobot/project-static/docs/objects.inv +0 -0
  179. nautobot/project-static/docs/release-notes/index.html +3 -24
  180. nautobot/project-static/docs/release-notes/version-1.0.html +3 -24
  181. nautobot/project-static/docs/release-notes/version-1.1.html +3 -24
  182. nautobot/project-static/docs/release-notes/version-1.2.html +3 -24
  183. nautobot/project-static/docs/release-notes/version-1.3.html +3 -24
  184. nautobot/project-static/docs/release-notes/version-1.4.html +3 -24
  185. nautobot/project-static/docs/release-notes/version-1.5.html +3 -24
  186. nautobot/project-static/docs/release-notes/version-1.6.html +3 -24
  187. nautobot/project-static/docs/release-notes/version-2.0.html +3 -24
  188. nautobot/project-static/docs/release-notes/version-2.1.html +162 -411
  189. nautobot/project-static/docs/release-notes/version-2.2.html +30 -212
  190. nautobot/project-static/docs/search/search_index.json +1 -1
  191. nautobot/project-static/docs/sitemap.xml +255 -260
  192. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  193. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -24
  194. nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +3 -24
  195. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +3 -24
  196. nautobot/project-static/docs/user-guide/administration/configuration/index.html +3 -24
  197. nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +3 -24
  198. nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +3 -24
  199. nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +3 -24
  200. nautobot/project-static/docs/user-guide/administration/guides/caching.html +3 -24
  201. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +3 -24
  202. nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +3 -24
  203. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +3 -24
  204. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +3 -24
  205. nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +3 -24
  206. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +3 -24
  207. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +3 -24
  208. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +3 -24
  209. nautobot/project-static/docs/user-guide/administration/installation/docker.html +6 -31
  210. nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +3 -24
  211. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -24
  212. nautobot/project-static/docs/user-guide/administration/installation/index.html +3 -24
  213. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +3 -24
  214. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +3 -24
  215. nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +6 -27
  216. nautobot/project-static/docs/user-guide/administration/installation/services.html +3 -24
  217. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +3 -24
  218. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -24
  219. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +3 -24
  220. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +3 -24
  221. nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +3 -24
  222. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +3 -24
  223. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +3 -24
  224. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +3 -24
  225. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +3 -24
  226. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +3 -24
  227. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +3 -24
  228. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +3 -24
  229. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +3 -24
  230. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +3 -24
  231. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +3 -24
  232. nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +3 -24
  233. nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +3 -24
  234. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +3 -24
  235. nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +3 -24
  236. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +3 -24
  237. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +3 -24
  238. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +3 -24
  239. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +3 -24
  240. nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -259
  241. nautobot/project-static/docs/user-guide/core-data-model/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +17 -107
  242. nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +3 -24
  243. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +3 -24
  244. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +3 -24
  245. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +3 -24
  246. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +3 -24
  247. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +3 -24
  248. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +3 -24
  249. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +3 -24
  250. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +3 -24
  251. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +3 -24
  252. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +3 -24
  253. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +3 -24
  254. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +3 -24
  255. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +3 -24
  256. nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +3 -24
  257. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +3 -24
  258. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +3 -24
  259. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +3 -24
  260. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +3 -24
  261. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +3 -24
  262. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +3 -24
  263. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +3 -24
  264. nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +3 -24
  265. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +3 -24
  266. nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +3 -24
  267. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +3 -24
  268. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +3 -24
  269. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +3 -24
  270. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +3 -24
  271. nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +3 -24
  272. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +6 -27
  273. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +3 -24
  274. nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +3 -24
  275. nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +3 -24
  276. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +3 -24
  277. nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +3 -24
  278. nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +3 -24
  279. nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +3 -24
  280. nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +3 -24
  281. nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +3 -24
  282. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +3 -24
  283. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +3 -24
  284. nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +3 -24
  285. nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +3 -24
  286. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +3 -24
  287. nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +3 -24
  288. nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +3 -24
  289. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +3 -24
  290. nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +3 -24
  291. nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +3 -24
  292. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +3 -24
  293. nautobot/project-static/docs/user-guide/feature-guides/{contacts-and-teams.html → contact-and-team.html} +4 -25
  294. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +5 -26
  295. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +3 -24
  296. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +3 -24
  297. nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +3 -24
  298. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +3 -24
  299. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +3 -24
  300. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +3 -24
  301. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +5 -26
  302. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +3 -24
  303. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +3 -24
  304. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +3 -24
  305. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +3 -24
  306. nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +3 -24
  307. nautobot/project-static/docs/user-guide/feature-guides/relationships.html +3 -24
  308. nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +3 -24
  309. nautobot/project-static/docs/user-guide/index.html +3 -24
  310. nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +3 -24
  311. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +3 -24
  312. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -24
  313. nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +3 -24
  314. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +3 -24
  315. nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +3 -24
  316. nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +3 -24
  317. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +3 -24
  318. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -24
  319. nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +3 -24
  320. nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +3 -24
  321. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +3 -24
  322. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +3 -24
  323. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +3 -24
  324. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +3 -24
  325. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +3 -24
  326. nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +3 -24
  327. nautobot/project-static/docs/user-guide/platform-functionality/note.html +3 -24
  328. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +3 -24
  329. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +3 -24
  330. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +3 -24
  331. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +3 -24
  332. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +3 -24
  333. nautobot/project-static/docs/user-guide/platform-functionality/role.html +3 -24
  334. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -24
  335. nautobot/project-static/docs/user-guide/platform-functionality/status.html +3 -24
  336. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +3 -24
  337. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +3 -24
  338. nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +3 -24
  339. nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +3 -24
  340. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +3 -24
  341. nautobot/tenancy/api/urls.py +2 -1
  342. nautobot/tenancy/api/views.py +12 -0
  343. nautobot/tenancy/tables.py +1 -1
  344. nautobot/tenancy/tests/test_views.py +0 -1
  345. nautobot/users/api/urls.py +2 -1
  346. nautobot/users/api/views.py +65 -2
  347. nautobot/users/views.py +8 -8
  348. nautobot/virtualization/api/urls.py +2 -1
  349. nautobot/virtualization/api/views.py +12 -0
  350. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/METADATA +3 -3
  351. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/RECORD +356 -361
  352. nautobot/core/tests/integration/test_view_authentication.py +0 -67
  353. nautobot/dcim/management/commands/migrate_location_contacts.py +0 -218
  354. nautobot/dcim/templates/dcim/controller_create.html +0 -70
  355. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -88
  356. nautobot/ipam/tests/test_tables.py +0 -42
  357. nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +0 -8581
  358. /nautobot/dcim/templates/dcim/{controllermanageddevicegroup_retrieve.html → controllerdevicegroup_retrieve.html} +0 -0
  359. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/LICENSE.txt +0 -0
  360. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/NOTICE +0 -0
  361. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/WHEEL +0 -0
  362. {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/entry_points.txt +0 -0
nautobot/apps/api.py CHANGED
@@ -19,7 +19,7 @@ from nautobot.core.api.fields import (
19
19
  )
20
20
  from nautobot.core.api.mixins import WritableSerializerMixin
21
21
  from nautobot.core.api.parsers import NautobotCSVParser
22
- from nautobot.core.api.routers import AuthenticatedAPIRootView as APIRootView, OrderedDefaultRouter
22
+ from nautobot.core.api.routers import OrderedDefaultRouter
23
23
  from nautobot.core.api.schema import NautobotAutoSchema
24
24
  from nautobot.core.api.serializers import (
25
25
  OptInFieldsMixin,
@@ -36,6 +36,7 @@ from nautobot.core.api.utils import (
36
36
  versioned_serializer_selector,
37
37
  )
38
38
  from nautobot.core.api.views import (
39
+ APIRootView,
39
40
  BulkDestroyModelMixin,
40
41
  BulkUpdateModelMixin,
41
42
  GetObjectCountsView,
nautobot/apps/utils.py CHANGED
@@ -32,8 +32,6 @@ from nautobot.core.utils.lookup import (
32
32
  get_related_class_for_model,
33
33
  get_route_for_model,
34
34
  get_table_for_model,
35
- get_url_for_url_pattern,
36
- get_url_patterns,
37
35
  get_view_for_model,
38
36
  )
39
37
  from nautobot.core.utils.migrations import migrate_content_type_references_to_new_model
@@ -115,8 +113,6 @@ __all__ = (
115
113
  "get_settings_or_config",
116
114
  "get_table_for_model",
117
115
  "get_view_for_model",
118
- "get_url_for_url_pattern",
119
- "get_url_patterns",
120
116
  "get_worker_count",
121
117
  "GitRepo",
122
118
  "hex_to_rgb",
nautobot/apps/views.py CHANGED
@@ -8,7 +8,6 @@ from nautobot.core.views.generic import (
8
8
  BulkImportView, # 3.0 TODO: deprecated, will be removed in 3.0
9
9
  BulkRenameView,
10
10
  ComponentCreateView,
11
- GenericView,
12
11
  ObjectDeleteView,
13
12
  ObjectEditView,
14
13
  ObjectImportView,
@@ -58,7 +57,6 @@ __all__ = (
58
57
  "csv_format",
59
58
  "EnhancedPage",
60
59
  "EnhancedPaginator",
61
- "GenericView",
62
60
  "get_csv_form_fields_from_serializer_class",
63
61
  "get_paginate_count",
64
62
  "GetReturnURLMixin",
@@ -2,7 +2,8 @@ from nautobot.core.api.routers import OrderedDefaultRouter
2
2
 
3
3
  from . import views
4
4
 
5
- router = OrderedDefaultRouter(view_name="Circuits")
5
+ router = OrderedDefaultRouter()
6
+ router.APIRootView = views.CircuitsRootView
6
7
 
7
8
  # Providers
8
9
  router.register("providers", views.ProviderViewSet)
@@ -1,3 +1,5 @@
1
+ from rest_framework.routers import APIRootView
2
+
1
3
  from nautobot.circuits import filters
2
4
  from nautobot.circuits.models import Circuit, CircuitTermination, CircuitType, Provider, ProviderNetwork
3
5
  from nautobot.core.models.querysets import count_related
@@ -6,6 +8,16 @@ from nautobot.extras.api.views import NautobotModelViewSet
6
8
 
7
9
  from . import serializers
8
10
 
11
+
12
+ class CircuitsRootView(APIRootView):
13
+ """
14
+ Circuits API root view
15
+ """
16
+
17
+ def get_view_name(self):
18
+ return "Circuits"
19
+
20
+
9
21
  #
10
22
  # Providers
11
23
  #
@@ -57,7 +57,7 @@ class ProviderTestCase(FilterTestCases.NameOnlyFilterTestCase, FilterTestCases.F
57
57
  def test_location(self):
58
58
  expected = self.queryset.filter(
59
59
  circuits__circuit_terminations__location__in=[self.locations[0].pk, self.locations[1].pk]
60
- ).distinct()
60
+ )
61
61
  params = {"location": [self.locations[0].pk, self.locations[1].pk]}
62
62
  self.assertQuerysetEqualAndNotEmpty(self.filterset(params, self.queryset).qs, expected)
63
63
  params = {"location": [self.locations[0].name, self.locations[1].name]}
@@ -1,23 +1,12 @@
1
- import logging
1
+ from collections import OrderedDict
2
2
 
3
3
  from rest_framework.routers import DefaultRouter
4
4
 
5
- from nautobot.core.api.views import AuthenticatedAPIRootView
6
-
7
- logger = logging.getLogger(__name__)
8
-
9
5
 
10
6
  class OrderedDefaultRouter(DefaultRouter):
11
- APIRootView = AuthenticatedAPIRootView
12
-
13
- def __init__(self, *args, view_name=None, view_description=None, **kwargs):
7
+ def __init__(self, *args, **kwargs):
14
8
  super().__init__(*args, **kwargs)
15
9
 
16
- self.view_name = view_name
17
- if view_name and not view_description:
18
- view_description = f"{view_name} API root view"
19
- self.view_description = view_description
20
-
21
10
  # Extend the list view mappings to support the DELETE operation
22
11
  self.routes[0].mapping.update(
23
12
  {
@@ -31,20 +20,9 @@ class OrderedDefaultRouter(DefaultRouter):
31
20
  """
32
21
  Wrap DRF's DefaultRouter to return an alphabetized list of endpoints.
33
22
  """
34
- api_root_dict = {}
23
+ api_root_dict = OrderedDict()
35
24
  list_name = self.routes[0].name
36
-
37
25
  for prefix, _viewset, basename in sorted(self.registry, key=lambda x: x[0]):
38
26
  api_root_dict[prefix] = list_name.format(basename=basename)
39
27
 
40
- if issubclass(self.APIRootView, AuthenticatedAPIRootView):
41
- return self.APIRootView.as_view(
42
- api_root_dict=api_root_dict, name=self.view_name, description=self.view_description
43
- )
44
- # Fallback for the established practice of overriding self.APIRootView with a custom class
45
- logger.warning(
46
- "Something has changed an OrderedDefaultRouter's APIRootView attribute to a custom class. "
47
- "Please verify that class %s implements appropriate authentication controls.",
48
- self.APIRootView.__name__,
49
- )
50
28
  return self.APIRootView.as_view(api_root_dict=api_root_dict)
@@ -178,10 +178,6 @@ def get_view_name(view, suffix=None):
178
178
 
179
179
  else:
180
180
  # Replicate DRF's built-in behavior.
181
- name = getattr(view, "name", None)
182
- if name is not None:
183
- return view.name
184
-
185
181
  name = view.__class__.__name__
186
182
  name = formatting.remove_trailing_string(name, "View")
187
183
  name = formatting.remove_trailing_string(name, "ViewSet")
@@ -24,9 +24,9 @@ from graphql import get_default_backend
24
24
  from graphql.execution import ExecutionResult
25
25
  from graphql.execution.middleware import MiddlewareManager
26
26
  from graphql.type.schema import GraphQLSchema
27
- from rest_framework import routers, status
27
+ from rest_framework import status
28
28
  from rest_framework.exceptions import ParseError, PermissionDenied
29
- from rest_framework.permissions import IsAuthenticated
29
+ from rest_framework.permissions import AllowAny, IsAuthenticated
30
30
  from rest_framework.response import Response
31
31
  from rest_framework.reverse import reverse
32
32
  from rest_framework.views import APIView
@@ -347,25 +347,15 @@ class ReadOnlyModelViewSet(NautobotAPIVersionMixin, ModelViewSetMixin, ReadOnlyM
347
347
  #
348
348
 
349
349
 
350
- class AuthenticatedAPIRootView(NautobotAPIVersionMixin, routers.APIRootView):
350
+ class APIRootView(NautobotAPIVersionMixin, APIView):
351
351
  """
352
- Extends DRF's base APIRootView class to enforce user authentication.
352
+ This is the root of the REST API. API endpoints are arranged by app and model name; e.g. `/api/dcim/locations/`.
353
353
  """
354
354
 
355
- permission_classes = [IsAuthenticated]
356
-
357
- name = None
358
- description = None
359
-
360
-
361
- class APIRootView(AuthenticatedAPIRootView):
362
- """
363
- This is the root of the REST API.
355
+ _ignore_model_permissions = True
364
356
 
365
- API endpoints are arranged by app and model name; e.g. `/api/dcim/locations/`.
366
- """
367
-
368
- name = "API Root"
357
+ def get_view_name(self):
358
+ return "API Root"
369
359
 
370
360
  @extend_schema(exclude=True)
371
361
  def get(self, request, format=None): # pylint: disable=redefined-builtin
@@ -514,6 +504,11 @@ class NautobotSpectacularSwaggerView(APIVersioningGetSchemaURLMixin, Spectacular
514
504
  @extend_schema(exclude=True)
515
505
  def get(self, request, *args, **kwargs):
516
506
  """Fix up the rendering of the Swagger UI to work with Nautobot's UI."""
507
+ if not request.user.is_authenticated:
508
+ doc_url = reverse("api_docs")
509
+ login_url = reverse(settings.LOGIN_URL)
510
+ return redirect(f"{login_url}?next={doc_url}")
511
+
517
512
  # For backward compatibility wtih drf-yasg, `/api/docs/?format=openapi` is a redirect to the JSON schema.
518
513
  if request.GET.get("format") == "openapi":
519
514
  return redirect("schema_json", permanent=True)
@@ -542,12 +537,11 @@ class NautobotSpectacularRedocView(APIVersioningGetSchemaURLMixin, SpectacularRe
542
537
  class GraphQLDRFAPIView(NautobotAPIVersionMixin, APIView):
543
538
  """
544
539
  API View for GraphQL to integrate properly with DRF authentication mechanism.
540
+ The code is a stripped down version of graphene-django default View
541
+ https://github.com/graphql-python/graphene-django/blob/main/graphene_django/views.py#L57
545
542
  """
546
543
 
547
- # The code is a stripped down version of graphene-django default View
548
- # https://github.com/graphql-python/graphene-django/blob/main/graphene_django/views.py#L57
549
-
550
- permission_classes = [IsAuthenticated]
544
+ permission_classes = [AllowAny]
551
545
  graphql_schema = None
552
546
  executor = None
553
547
  backend = None
nautobot/core/filters.py CHANGED
@@ -260,9 +260,6 @@ class ContentTypeMultipleChoiceFilter(django_filters.MultipleChoiceFilter):
260
260
  if not self.conjoined:
261
261
  qs = qs.filter(q)
262
262
 
263
- if self.distinct:
264
- qs = qs.distinct()
265
-
266
263
  return qs
267
264
 
268
265
 
@@ -525,10 +522,7 @@ class TreeNodeMultipleChoiceFilter(NaturalKeyOrPKMultipleChoiceFilter):
525
522
 
526
523
  # Fetch the generated Q object and filter the incoming qs with it before passing it along.
527
524
  query = self.generate_query(value)
528
- result = self.get_method(qs)(query)
529
- if self.distinct:
530
- result = result.distinct()
531
- return result
525
+ return self.get_method(qs)(query)
532
526
 
533
527
 
534
528
  #
@@ -58,8 +58,8 @@ class Command(BaseCommand):
58
58
  ProviderNetworkFactory,
59
59
  )
60
60
  from nautobot.dcim.factory import (
61
+ ControllerDeviceGroupFactory,
61
62
  ControllerFactory,
62
- ControllerManagedDeviceGroupFactory,
63
63
  DeviceFactory,
64
64
  DeviceFamilyFactory,
65
65
  DeviceRedundancyGroupFactory,
@@ -131,7 +131,7 @@ class Command(BaseCommand):
131
131
  LocationFactory.create_batch(10, has_parent=False, using=db_name)
132
132
  self.stdout.write("Creating Controller with Groups...")
133
133
  ControllerFactory.create_batch(1)
134
- ControllerManagedDeviceGroupFactory.create_batch(5)
134
+ ControllerDeviceGroupFactory.create_batch(5)
135
135
  self.stdout.write("Creating RIRs...")
136
136
  RIRFactory.create_batch(9, using=db_name) # only 9 unique RIR names are hard-coded presently
137
137
  self.stdout.write("Creating RouteTargets...")
@@ -207,7 +207,7 @@ class Command(BaseCommand):
207
207
  ExternalIntegrationFactory.create_batch(20, using=db_name)
208
208
  self.stdout.write("Creating Controllers with Device or DeviceRedundancyGroups...")
209
209
  ControllerFactory.create_batch(10)
210
- ControllerManagedDeviceGroupFactory.create_batch(30)
210
+ ControllerDeviceGroupFactory.create_batch(30)
211
211
  # make sure we have some tenants that have null relationships to make filter tests happy
212
212
  self.stdout.write("Creating Tenants without Circuits, Locations, IPAddresses, or Prefixes...")
213
213
  TenantFactory.create_batch(10, using=db_name)
@@ -227,7 +227,7 @@ class Command(BaseCommand):
227
227
  CircuitTerminationFactory,
228
228
  CircuitTypeFactory,
229
229
  ContactFactory,
230
- ControllerManagedDeviceGroupFactory,
230
+ ControllerDeviceGroupFactory,
231
231
  ControllerFactory,
232
232
  DeviceFactory,
233
233
  DeviceFamilyFactory,
nautobot/core/settings.py CHANGED
@@ -332,7 +332,6 @@ SPECTACULAR_SETTINGS = {
332
332
  # trim it from all of the individual paths correspondingly.
333
333
  # See also https://github.com/nautobot/nautobot-ansible/pull/135 for an example of why this is desirable.
334
334
  "SERVERS": [{"url": "/api"}],
335
- "SERVE_PERMISSIONS": ["rest_framework.permissions.IsAuthenticated"],
336
335
  "SCHEMA_PATH_PREFIX": "/api",
337
336
  "SCHEMA_PATH_PREFIX_TRIM": True,
338
337
  # use sidecar - locally packaged UI files, not CDN
nautobot/core/tables.py CHANGED
@@ -34,7 +34,7 @@ class BaseTable(django_tables2.Table):
34
34
  "class": "table table-hover table-headings",
35
35
  }
36
36
 
37
- def __init__(self, *args, user=None, hide_hierarchy_ui=False, **kwargs):
37
+ def __init__(self, *args, user=None, **kwargs):
38
38
  # Add custom field columns
39
39
  model = self._meta.model
40
40
 
@@ -64,7 +64,6 @@ class BaseTable(django_tables2.Table):
64
64
 
65
65
  # Init table
66
66
  super().__init__(*args, **kwargs)
67
- self.hide_hierarchy_ui = hide_hierarchy_ui
68
67
 
69
68
  # Set default empty_text if none was provided
70
69
  if self.empty_text is None:
@@ -8,7 +8,55 @@
8
8
  <html lang="en"{% if request.COOKIES|get_item:"theme" == 'dark' %} data-theme="dark"{% endif %}>
9
9
  <head>
10
10
  <title>{% block title %}Admin Home{% endblock %} - Nautobot</title>
11
- {% include 'inc/media.html' %}
11
+ <link rel="stylesheet"
12
+ href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"
13
+ onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/css/bootstrap.min.css'">
14
+ <link rel="stylesheet"
15
+ href="{% static 'materialdesignicons-6.5.95/css/materialdesignicons.min.css' %}"
16
+ onerror="window.location='{% url 'media_failure' %}?filename=materialdesignicons-6.5.95/css/materialdesignicons.min.css'">
17
+ <link rel="stylesheet"
18
+ href="{% static 'jquery-ui-1.13.1/jquery-ui.min.css' %}"
19
+ onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.css'">
20
+ <link rel="stylesheet"
21
+ href="{% static 'select2-4.0.13/select2.min.css' %}"
22
+ onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.css'">
23
+ <link rel="stylesheet"
24
+ href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css' %}"
25
+ onerror="window.location='{% url 'media_failure' %}?filename=select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css'">
26
+ <link rel="stylesheet"
27
+ href="{% static 'flatpickr-4.6.9/themes/light.min.css' %}"
28
+ onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/themes/light.min.css'">
29
+ <link rel="stylesheet" id="dark-theme"
30
+ href="{% versioned_static 'css/dark.css' %}"
31
+ onerror="window.location='{% url 'media_failure' %}?filename=css/dark.css'"{% if request.COOKIES|get_item:"theme" != 'dark' %} disabled="disabled"{% endif %} />
32
+ <link rel="stylesheet" id="base-theme"
33
+ href="{% versioned_static 'css/base.css' %}"
34
+ onerror="window.location='{% url 'media_failure' %}?filename=css/base.css'">
35
+ <link rel="apple-touch-icon" sizes="180x180" href="{% custom_branding_or_static 'icon_180' 'img/nautobot_icon_180x180.png' %}">
36
+ <link rel="icon" type="image/png" sizes="32x32" href="{% custom_branding_or_static 'icon_32' 'img/nautobot_icon_32x32.png' %}">
37
+ <link rel="icon" type="image/png" sizes="16x16" href="{% custom_branding_or_static 'icon_16' 'img/nautobot_icon_16x16.png' %}">
38
+ <link rel="icon" type="image/png" href="{% custom_branding_or_static 'icon_192' 'img/nautobot_icon_192x192.png' %}" sizes="192x192">
39
+ <link rel="mask-icon" href="{% custom_branding_or_static 'icon_mask' 'img/nautobot_icon_monochrome.svg' %}" color="#0097ff">
40
+ <link rel="shortcut icon" href="{% custom_branding_or_static 'favicon' 'img/favicon.ico' %}">
41
+
42
+ <script src="{% static 'jquery/jquery-3.6.0.min.js' %}"
43
+ onerror="window.location='{% url 'media_failure' %}?filename=jquery/jquery-3.6.0.min.js'"></script>
44
+ <script src="{% static 'jquery-ui-1.13.1/jquery-ui.min.js' %}"
45
+ onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.js'"></script>
46
+ <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"
47
+ onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/js/bootstrap.min.js'"></script>
48
+ <script src="{% static 'select2-4.0.13/select2.min.js' %}"
49
+ onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.js'"></script>
50
+ <script src="{% static 'flatpickr-4.6.9/flatpickr.min.js' %}"
51
+ onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/flatpickr.min.js'"></script>
52
+ <script src="{% static 'js/forms.js' %}"
53
+ onerror="window.location='{% url 'media_failure' %}?filename=js/forms.js'"></script>
54
+
55
+ <meta name="msapplication-TileColor" content="#2d89ef">
56
+ <meta name="theme-color" content="#ffffff">
57
+ <meta charset="UTF-8">
58
+ <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
59
+
12
60
  {% block extrahead %}{% endblock %}
13
61
  {% block extrastyle %}{% endblock %}
14
62
 
@@ -46,27 +94,23 @@
46
94
  }
47
95
  </style>
48
96
  </head>
49
- <body {% if is_popup %}style="padding-left: 0px;"{% endif %}>
50
-
97
+ <body {% if is_popup %}style="padding-top: 0px;"{% endif %}>
51
98
  {% if not is_popup %}
52
99
  {% include 'inc/nav_menu.html' %}
53
100
  {% endif %}
54
-
55
- <div class="container-fluid wrapper" id="main-content" {% if is_popup %}style="padding-bottom: 0px;"{% endif %}>
56
- {% if not is_popup %}
57
- {% if "BANNER_TOP"|settings_or_config %}
58
- <div class="alert alert-info text-center" role="alert">
59
- {{ "BANNER_TOP"|settings_or_config|safe }}
60
- </div>
61
- {% endif %}
62
- {% if settings.MAINTENANCE_MODE %}
63
- <div class="alert alert-warning text-center" role="alert">
64
- <h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
65
- <p>Nautobot is currently in maintenance mode. Functionality may be limited.</p>
66
- </div>
67
- {% endif %}
68
- {% plugin_banners %}
101
+ <div class="container-fluid wrapper" {% if is_popup %}style="padding-bottom: 0px;"{% endif %}>
102
+ {% if "BANNER_TOP"|settings_or_config %}
103
+ <div class="alert alert-info text-center" role="alert">
104
+ {{ "BANNER_TOP"|settings_or_config|safe }}
105
+ </div>
69
106
  {% endif %}
107
+ {% if settings.MAINTENANCE_MODE %}
108
+ <div class="alert alert-warning text-center" role="alert">
109
+ <h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
110
+ <p>Nautobot is currently in maintenance mode. Functionality may be limited.</p>
111
+ </div>
112
+ {% endif %}
113
+ {% plugin_banners %}
70
114
  {% for message in messages %}
71
115
  <div class="alert alert-{{ message.tags }} alert-dismissable" role="alert">
72
116
  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
@@ -104,6 +148,8 @@
104
148
  {% block content %}{{ content }}{% endblock %}
105
149
  </div>
106
150
  </div>
151
+
152
+ {% block footer %}<footer id="footer"></footer>{% endblock %}
107
153
  <div class="push"></div>
108
154
  {% if "BANNER_BOTTOM"|settings_or_config %}
109
155
  <div class="alert alert-info text-center banner-bottom" role="alert">
@@ -112,12 +158,37 @@
112
158
  {% endif %}
113
159
  </div>
114
160
  {% if not is_popup %}
115
- {% include 'inc/footer.html' %}
161
+ <footer class="footer">
162
+ <div class="container-fluid">
163
+ <div class="row">
164
+ <div class="col-xs-4">
165
+ <p class="text-muted">{{ settings.HOSTNAME }} (v{{ settings.VERSION }})</p>
166
+ </div>
167
+ <div class="col-xs-4 text-center">
168
+ <p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p>
169
+ </div>
170
+ <div class="col-xs-4 text-right noprint">
171
+ <p class="text-muted">
172
+ <a href="#theme_modal" data-toggle="modal" data-target="#theme_modal" id="btn-theme-modal"><i class="mdi mdi-theme-light-dark text-primary"></i>Theme</a> &middot;
173
+ <i class="mdi mdi-book-open-page-variant text-primary"></i>
174
+ {% if settings.BRANDING_URLS.docs %}
175
+ <a href="{{ settings.BRANDING_URLS.docs }}">Docs</a>
176
+ {% else %}
177
+ <a href="{% static 'docs/index.html' %}">Docs</a>
178
+ {% endif %}
179
+ &middot;
180
+ <i class="mdi mdi-cloud-braces text-primary"></i> <a href="{% url 'api_docs' %}">API</a> &middot;
181
+ <i class="mdi mdi-graphql text-primary"></i> <a href="{% url 'graphql' %}">GraphQL</a> &middot;
182
+ <i class="mdi mdi-xml text-primary"></i> <a href="{{ settings.BRANDING_URLS.code }}">Code</a> &middot;
183
+ <i class="mdi mdi-lifebuoy text-primary"></i> <a href="{{ settings.BRANDING_URLS.help }}">Help</a>
184
+ </p>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </footer>
116
189
  {% endif %}
117
190
  {% include 'modals/modal_theme.html' with name='theme'%}
118
-
119
- {% block javascript %}
120
- {% include 'inc/javascript.html' %}
121
- {% endblock %}
191
+ <script src="{% versioned_static 'js/theme.js' %}"></script>
192
+ {% block javascript %}{% endblock %}
122
193
  </body>
123
194
  </html>
@@ -10,31 +10,53 @@ add "&raw" to the end of the URL within a browser.
10
10
  <!DOCTYPE html>
11
11
  <html>
12
12
  <head>
13
- {% include 'inc/media.html' %}
14
- {% block extra_styles %}{% endblock %}
15
13
  <!-- Nautobot template requirements -->
16
14
  <title>{% block title %}GraphiQL{% endblock %} - {{ settings.BRANDING_TITLE }}</title>
17
-
15
+ <link rel="stylesheet"
16
+ href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"
17
+ onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/css/bootstrap.min.css'">
18
+ <link rel="stylesheet"
19
+ href="{% static 'materialdesignicons-6.5.95/css/materialdesignicons.min.css' %}"
20
+ onerror="window.location='{% url 'media_failure' %}?filename=materialdesignicons-6.5.95/css/materialdesignicons.min.css'">
21
+ <link rel="stylesheet"
22
+ href="{% static 'jquery-ui-1.13.1/jquery-ui.min.css' %}"
23
+ onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.css'">
24
+ <link rel="stylesheet"
25
+ href="{% static 'select2-4.0.13/select2.min.css' %}"
26
+ onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.css'">
27
+ <link rel="stylesheet"
28
+ href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css' %}"
29
+ onerror="window.location='{% url 'media_failure' %}?filename=select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css'">
30
+ <link rel="stylesheet"
31
+ href="{% static 'flatpickr-4.6.9/themes/light.min.css' %}"
32
+ onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/themes/light.min.css'">
33
+ <link rel="stylesheet" id="dark-theme"
34
+ href="{% versioned_static 'css/dark.css' %}"
35
+ onerror="window.location='{% url 'media_failure' %}?filename=css/dark.css'" disabled="disabled" />
36
+ <link rel="stylesheet"
37
+ href="{% versioned_static 'css/base.css' %}"
38
+ onerror="window.location='{% url 'media_failure' %}?filename=css/base.css'">
39
+ <link rel="apple-touch-icon" sizes="180x180" href="{% custom_branding_or_static 'icon_180' 'img/nautobot_icon_180x180.png' %}">
40
+ <link rel="icon" type="image/png" sizes="32x32" href="{% custom_branding_or_static 'icon_32' 'img/nautobot_icon_32x32.png' %}">
41
+ <link rel="icon" type="image/png" sizes="16x16" href="{% custom_branding_or_static 'icon_16' 'img/nautobot_icon_16x16.png' %}">
42
+ <link rel="icon" type="image/png" sizes="192x192" href="{% custom_branding_or_static 'icon_192' 'img/nautobot_icon_192x192.png' %}">
43
+ <link rel="mask-icon" type="image/png" color="#0097ff" href="{% custom_branding_or_static 'icon_mask' 'img/nautobot_icon_monochrome.png' %}">
44
+ <link rel="shortcut icon" href="{% custom_branding_or_static 'favicon' 'img/favicon.ico' %}">
45
+ <meta name="msapplication-TileColor" content="#2d89ef">
46
+ <meta name="theme-color" content="#ffffff">
47
+ <meta charset="UTF-8">
48
+ <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
18
49
  <!-- GraphiQL template requirements -->
19
50
  <style>
20
- #editor {
51
+ html, body, #editor {
52
+ height: 100%;
21
53
  margin: 0;
22
54
  width: 100%;
23
- height: calc(100vh - 56px - 3rem);
24
55
  }
25
56
  .toolbar .dropdown-menu > li > a {
26
57
  clear: left;
27
58
  margin-right: 120px; /* leave room for the "Save Changes" button if present */
28
59
  }
29
- .graphiql-container .doc-explorer-title-bar {
30
- box-sizing: content-box;
31
- }
32
- .graphiql-container .history-title-bar {
33
- box-sizing: content-box;
34
- }
35
- .graphiql-container .docExplorerShow {
36
- white-space: nowrap;
37
- }
38
60
  </style>
39
61
  <!-- As Nautobot may be run without internet access, we source these files locally rather than from an online CDN -->
40
62
  <link rel="stylesheet"
@@ -50,16 +72,23 @@ add "&raw" to the end of the URL within a browser.
50
72
  onerror="window.location='{% url 'media_failure' %}?filename=graphiql-1.5.16/graphiql.min.js'"></script>
51
73
  <script src="{% static 'subscriptions-transport-ws-0.9.18/client.min.js' %}"
52
74
  onerror="window.location='{% url 'media_failure' %}?filename=subscriptions-transport-ws-0.9.18/client.min.js'"></script>
75
+ <!-- Custom CSS to address some conflicts between the two -->
76
+ <style>
77
+ body {
78
+ padding-top: 54px;
79
+ }
80
+ .graphiql-container .doc-explorer-title-bar {
81
+ box-sizing: content-box;
82
+ }
83
+ </style>
53
84
  </head>
54
85
  <body>
55
86
  <!-- Nautobot page contents -->
56
87
  {% include 'inc/nav_menu.html' %}
57
88
  {% include 'modals/modal_theme.html' with name='theme'%}
58
89
  {% include 'inc/javascript.html' %}
59
- <div class="container-fluid wrapper" id="main-content">
60
- <!-- GraphiQL page contents -->
61
- <div id="editor"></div>
62
- </div>
90
+ <!-- GraphiQL page contents -->
91
+ <div id="editor"></div>
63
92
  {% include 'inc/footer.html' %}
64
93
  {% csrf_token %}
65
94
  <script type="application/javascript">
@@ -3,8 +3,8 @@
3
3
  {% load plugins %}
4
4
 
5
5
  <style>
6
- /* Styles for viewports narrower than 1232px, i.e. bootstrap 'xs' and 'sm' layouts */
7
- @media (max-width: 1232px) {
6
+ /* Styles for viewports narrower than 1007px */
7
+ @media (max-width: 1007px) {
8
8
  .footer-col-1, .footer-col-2, .footer-col-3 {
9
9
  text-align: center !important;
10
10
  }
@@ -19,7 +19,7 @@
19
19
  <footer class="footer" id="footer">
20
20
  <div class="container-fluid">
21
21
  <div class="row">
22
- <div class="col-xl-4 col-lg-4 col-md-3 col-sm-12 col-xs-12 text-left footer-col-1 no-wrap">
22
+ <div class="col-xl-4 col-lg-4 col-md-4 col-sm-3 col-xs-12 text-left footer-col-1 no-wrap">
23
23
  {% if request.user.is_authenticated %}
24
24
  <p class="text-muted">
25
25
  {% if settings.BRANDING_FILEPATHS.logo and settings.BRANDING_POWERED_BY_URL %}<a href="{{ settings.BRANDING_POWERED_BY_URL }}"><img src="{% static 'img/nautobot_logo.svg' %}" height="20" /> Powered</a> &middot;{% endif %}
@@ -27,10 +27,10 @@
27
27
  </p>
28
28
  {% endif %}
29
29
  </div>
30
- <div class="col-xl-4 col-lg-3 col-md-3 col-sm-12 col-xs-12 text-center footer-col-2">
30
+ <div class="col-xl-4 col-lg-4 col-md-4 col-sm-3 col-xs-12 text-center footer-col-2">
31
31
  <p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p>
32
32
  </div>
33
- <div class="col-xl-4 col-lg-5 col-md-6 col-sm-12 col-xs-12 text-right footer-col-3 noprint">
33
+ <div class="col-xl-4 col-lg-4 col-md-4 col-sm-6 col-xs-12 text-right footer-col-3 noprint">
34
34
  {% if request.user.is_authenticated %}
35
35
  <p class="text-muted footer-links">
36
36
  <a href="#theme_modal" data-toggle="modal" data-target="#theme_modal" id="btn-theme-modal"><i class="mdi mdi-theme-light-dark text-primary"></i>Theme</a> &middot;
@@ -121,6 +121,9 @@
121
121
  document.addEventListener('DOMContentLoaded', function() {
122
122
  const navbar = document.querySelector('.navbar-fixed-left');
123
123
  const navbarHeader = document.querySelector('.navbar-header');
124
+ const breadcrumb = document.querySelector('.breadcrumb');
125
+ const bannerAlertArea = document.querySelector('.banner-alert-area');
126
+ const bannerAlert = document.querySelector('.plugin-banner') !== null;
124
127
  const mainContent = document.querySelector('#main-content');
125
128
  const footer = document.querySelector('#footer');
126
129
  const dropdownToggles = document.querySelectorAll('.navbar-fixed-left .navbar-nav > .dropdown > a[data-toggle="collapse"]');
@@ -177,6 +180,10 @@
177
180
  function adjustElementsForNavbarState(isCollapsed) {
178
181
  const marginLeftValue = isCollapsed ? '-240px' : '0px';
179
182
  mainContent.style.marginLeft = marginLeftValue;
183
+ bannerAlertArea.classList.toggle('collapsed', isCollapsed);
184
+ if(!bannerAlert && breadcrumb) {
185
+ breadcrumb.classList.toggle('collapsed', isCollapsed);
186
+ };
180
187
  if(footer) footer.style.marginLeft = marginLeftValue;
181
188
  toggler.style.left = isCollapsed ? '-5px' : '225px';
182
189
  }
@@ -7,20 +7,13 @@
7
7
  {% include 'inc/media.html' %}
8
8
  {% endblock bootstrap_theme %}
9
9
 
10
- {% block body %}
10
+ {% block navbar %}
11
11
  {% include 'inc/nav_menu.html' %}
12
- <div class="container-fluid" id="main-content">
13
- {{ block.super }}
14
- </div>
12
+ {% endblock navbar %}
13
+
14
+ {% block body %}
15
+ {{ block.super }}
15
16
  {% include 'inc/footer.html' %}
16
- <style>
17
- .navbar-static-top {
18
- display: none;
19
- }
20
- #main-content {
21
- min-height: calc(100vh - 70px);
22
- }
23
- </style>
24
17
  {% endblock body %}
25
18
 
26
19
  {% block script %}