nautobot 2.4.17__py3-none-any.whl → 2.4.18__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 (92) hide show
  1. nautobot/apps/views.py +2 -0
  2. nautobot/circuits/templates/circuits/circuittermination_retrieve.html +1 -8
  3. nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +9 -0
  4. nautobot/circuits/tests/integration/test_circuit.py +2 -2
  5. nautobot/circuits/views.py +32 -15
  6. nautobot/core/filters.py +2 -2
  7. nautobot/core/settings.py +1 -0
  8. nautobot/core/settings.yaml +9 -0
  9. nautobot/core/tables.py +21 -23
  10. nautobot/core/templates/components/breadcrumbs.html +19 -0
  11. nautobot/core/templates/generic/object_changelog.html +0 -2
  12. nautobot/core/templates/generic/object_list.html +15 -12
  13. nautobot/core/templates/generic/object_notes.html +0 -2
  14. nautobot/core/templates/generic/object_retrieve.html +16 -9
  15. nautobot/core/templatetags/helpers.py +24 -0
  16. nautobot/core/templatetags/ui_framework.py +40 -5
  17. nautobot/core/testing/filters.py +37 -21
  18. nautobot/core/testing/views.py +25 -0
  19. nautobot/core/tests/test_tables.py +43 -6
  20. nautobot/core/tests/test_templatetags_ui_framework.py +146 -0
  21. nautobot/core/tests/test_titles.py +2 -2
  22. nautobot/core/tests/test_ui.py +14 -1
  23. nautobot/core/tests/test_views.py +45 -0
  24. nautobot/core/ui/breadcrumbs.py +13 -8
  25. nautobot/core/ui/object_detail.py +43 -5
  26. nautobot/core/ui/titles.py +9 -5
  27. nautobot/core/views/__init__.py +24 -3
  28. nautobot/core/views/generic.py +42 -17
  29. nautobot/core/views/mixins.py +146 -12
  30. nautobot/core/views/utils.py +117 -0
  31. nautobot/dcim/models/devices.py +4 -0
  32. nautobot/dcim/tables/__init__.py +2 -0
  33. nautobot/dcim/tables/devices.py +24 -0
  34. nautobot/dcim/tables/power.py +2 -2
  35. nautobot/dcim/templates/dcim/device/base.html +1 -11
  36. nautobot/dcim/templates/dcim/device_component.html +0 -19
  37. nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -16
  38. nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +1 -50
  39. nautobot/dcim/tests/test_views.py +41 -0
  40. nautobot/dcim/views.py +160 -39
  41. nautobot/extras/filters/mixins.py +1 -1
  42. nautobot/extras/forms/forms.py +15 -0
  43. nautobot/extras/models/groups.py +10 -1
  44. nautobot/extras/models/jobs.py +2 -2
  45. nautobot/extras/plugins/views.py +18 -5
  46. nautobot/extras/tables.py +4 -2
  47. nautobot/extras/templates/extras/customfield_retrieve.html +1 -128
  48. nautobot/extras/templates/extras/dynamicgroup.html +2 -99
  49. nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -199
  50. nautobot/extras/templates/extras/dynamicgroup_retrieve.html +99 -0
  51. nautobot/extras/templates/extras/dynamicgroup_update.html +199 -0
  52. nautobot/extras/templates/extras/gitrepository.html +2 -82
  53. nautobot/extras/templates/extras/gitrepository_object_edit.html +2 -13
  54. nautobot/extras/templates/extras/gitrepository_retrieve.html +82 -0
  55. nautobot/extras/templates/extras/gitrepository_update.html +13 -0
  56. nautobot/extras/templates/extras/note_retrieve.html +0 -52
  57. nautobot/extras/templates/extras/plugin_detail.html +3 -7
  58. nautobot/extras/templates/extras/plugins_list.html +0 -2
  59. nautobot/extras/tests/test_dynamicgroups.py +73 -18
  60. nautobot/extras/tests/test_views.py +5 -0
  61. nautobot/extras/urls.py +2 -94
  62. nautobot/extras/views.py +424 -430
  63. nautobot/ipam/querysets.py +3 -3
  64. nautobot/ipam/signals.py +6 -1
  65. nautobot/ipam/templates/ipam/prefix.html +0 -8
  66. nautobot/ipam/tests/test_api.py +5 -0
  67. nautobot/ipam/tests/test_models.py +387 -0
  68. nautobot/ipam/tests/test_querysets.py +46 -0
  69. nautobot/ipam/utils/migrations.py +1 -1
  70. nautobot/ipam/views.py +17 -8
  71. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +72 -0
  72. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +45 -9
  73. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +393 -15
  74. nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +1 -1
  75. nautobot/project-static/docs/development/core/getting-started.html +0 -15
  76. nautobot/project-static/docs/development/core/ui-component-framework.html +6 -11
  77. nautobot/project-static/docs/objects.inv +0 -0
  78. nautobot/project-static/docs/release-notes/version-2.4.html +222 -0
  79. nautobot/project-static/docs/search/search_index.json +1 -1
  80. nautobot/project-static/docs/sitemap.xml +300 -300
  81. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  82. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +27 -0
  83. nautobot/project-static/img/nautobot_icon.svg +32 -34
  84. nautobot/project-static/js/table_sorting_indicator.js +0 -2
  85. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/METADATA +4 -4
  86. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/RECORD +90 -85
  87. nautobot/core/templates/inc/breadcrumbs.html +0 -14
  88. nautobot/project-static/docs/requirements.txt +0 -14
  89. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/LICENSE.txt +0 -0
  90. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/NOTICE +0 -0
  91. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/WHEEL +0 -0
  92. {nautobot-2.4.17.dist-info → nautobot-2.4.18.dist-info}/entry_points.txt +0 -0
@@ -9183,6 +9183,39 @@
9183
9183
  </ul>
9184
9184
  </nav>
9185
9185
 
9186
+ </li>
9187
+
9188
+ <li class="md-nav__item">
9189
+ <a href="#nautobot.apps.views.UIComponentsMixin" class="md-nav__link">
9190
+ <span class="md-ellipsis">
9191
+ UIComponentsMixin
9192
+ </span>
9193
+ </a>
9194
+
9195
+ <nav class="md-nav" aria-label="UIComponentsMixin">
9196
+ <ul class="md-nav__list">
9197
+
9198
+ <li class="md-nav__item">
9199
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_breadcrumbs" class="md-nav__link">
9200
+ <span class="md-ellipsis">
9201
+ get_breadcrumbs
9202
+ </span>
9203
+ </a>
9204
+
9205
+ </li>
9206
+
9207
+ <li class="md-nav__item">
9208
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_view_titles" class="md-nav__link">
9209
+ <span class="md-ellipsis">
9210
+ get_view_titles
9211
+ </span>
9212
+ </a>
9213
+
9214
+ </li>
9215
+
9216
+ </ul>
9217
+ </nav>
9218
+
9186
9219
  </li>
9187
9220
 
9188
9221
  <li class="md-nav__item">
@@ -11890,6 +11923,39 @@
11890
11923
  </ul>
11891
11924
  </nav>
11892
11925
 
11926
+ </li>
11927
+
11928
+ <li class="md-nav__item">
11929
+ <a href="#nautobot.apps.views.UIComponentsMixin" class="md-nav__link">
11930
+ <span class="md-ellipsis">
11931
+ UIComponentsMixin
11932
+ </span>
11933
+ </a>
11934
+
11935
+ <nav class="md-nav" aria-label="UIComponentsMixin">
11936
+ <ul class="md-nav__list">
11937
+
11938
+ <li class="md-nav__item">
11939
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_breadcrumbs" class="md-nav__link">
11940
+ <span class="md-ellipsis">
11941
+ get_breadcrumbs
11942
+ </span>
11943
+ </a>
11944
+
11945
+ </li>
11946
+
11947
+ <li class="md-nav__item">
11948
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_view_titles" class="md-nav__link">
11949
+ <span class="md-ellipsis">
11950
+ get_view_titles
11951
+ </span>
11952
+ </a>
11953
+
11954
+ </li>
11955
+
11956
+ </ul>
11957
+ </nav>
11958
+
11893
11959
  </li>
11894
11960
 
11895
11961
  <li class="md-nav__item">
@@ -12072,7 +12138,7 @@
12072
12138
 
12073
12139
  <div class="doc doc-contents ">
12074
12140
  <p class="doc doc-class-bases">
12075
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12141
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12076
12142
 
12077
12143
 
12078
12144
  <p>Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines.</p>
@@ -12117,7 +12183,7 @@
12117
12183
 
12118
12184
  <div class="doc doc-contents ">
12119
12185
  <p class="doc doc-class-bases">
12120
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12186
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12121
12187
 
12122
12188
 
12123
12189
  <p>Create new objects in bulk.</p>
@@ -12167,7 +12233,7 @@ template_name: The name of the template</p>
12167
12233
 
12168
12234
  <div class="doc doc-contents ">
12169
12235
  <p class="doc doc-class-bases">
12170
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="nautobot.core.views.mixins.BulkEditAndBulkDeleteModelMixin">BulkEditAndBulkDeleteModelMixin</span></code>, <code><span title="django.views.generic.View">View</span></code></p>
12236
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="nautobot.core.views.mixins.BulkEditAndBulkDeleteModelMixin">BulkEditAndBulkDeleteModelMixin</span></code>, <code><span title="django.views.generic.View">View</span></code></p>
12171
12237
 
12172
12238
 
12173
12239
  <p>Delete objects in bulk.</p>
@@ -12235,7 +12301,7 @@ template_name: The name of the template</p>
12235
12301
 
12236
12302
  <div class="doc doc-contents ">
12237
12303
  <p class="doc doc-class-bases">
12238
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="nautobot.core.views.mixins.BulkEditAndBulkDeleteModelMixin">BulkEditAndBulkDeleteModelMixin</span></code>, <code><span title="django.views.generic.View">View</span></code></p>
12304
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="nautobot.core.views.mixins.BulkEditAndBulkDeleteModelMixin">BulkEditAndBulkDeleteModelMixin</span></code>, <code><span title="django.views.generic.View">View</span></code></p>
12239
12305
 
12240
12306
 
12241
12307
  <p>Edit objects in bulk.</p>
@@ -12303,7 +12369,7 @@ template_name: The name of the template</p>
12303
12369
 
12304
12370
  <div class="doc doc-contents ">
12305
12371
  <p class="doc doc-class-bases">
12306
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12372
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12307
12373
 
12308
12374
 
12309
12375
  <p>Import objects in bulk (CSV format).</p>
@@ -12352,7 +12418,7 @@ template_name: The name of the template</p>
12352
12418
 
12353
12419
  <div class="doc doc-contents ">
12354
12420
  <p class="doc doc-class-bases">
12355
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12421
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12356
12422
 
12357
12423
 
12358
12424
  <p>An extendable view for renaming objects in bulk.</p>
@@ -12470,7 +12536,7 @@ template_name: The name of the template</p>
12470
12536
 
12471
12537
  <div class="doc doc-contents ">
12472
12538
  <p class="doc doc-class-bases">
12473
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12539
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12474
12540
 
12475
12541
 
12476
12542
  <p>Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine.</p>
@@ -12585,7 +12651,7 @@ and fits within Nautobot's custom permission enforcement system.</p>
12585
12651
 
12586
12652
  <div class="doc doc-contents ">
12587
12653
  <p class="doc doc-class-bases">
12588
- Bases: <code><span title="django.contrib.auth.mixins.LoginRequiredMixin">LoginRequiredMixin</span></code>, <code><span title="django.views.generic.View">View</span></code></p>
12654
+ Bases: <code><span title="django.contrib.auth.mixins.LoginRequiredMixin">LoginRequiredMixin</span></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
12589
12655
 
12590
12656
 
12591
12657
  <p>Base class for non-object-related views.</p>
@@ -12598,6 +12664,22 @@ and fits within Nautobot's custom permission enforcement system.</p>
12598
12664
 
12599
12665
 
12600
12666
 
12667
+
12668
+
12669
+ <div class="doc doc-children">
12670
+
12671
+
12672
+
12673
+
12674
+
12675
+
12676
+
12677
+
12678
+
12679
+
12680
+
12681
+ </div>
12682
+
12601
12683
  </div>
12602
12684
 
12603
12685
  </div>
@@ -12862,10 +12944,10 @@ and then initialize and return the filter_form used in the ObjectListView UI.</p
12862
12944
 
12863
12945
  <div class="doc doc-contents ">
12864
12946
  <p class="doc doc-class-bases">
12865
- Bases: <code><span title="rest_framework.viewsets.GenericViewSet">GenericViewSet</span></code>, <code><span title="django.contrib.auth.mixins.AccessMixin">AccessMixin</span></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><span title="django.views.generic.edit.FormView">FormView</span></code></p>
12947
+ Bases: <code><span title="rest_framework.viewsets.GenericViewSet">GenericViewSet</span></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><span title="django.contrib.auth.mixins.AccessMixin">AccessMixin</span></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><span title="django.views.generic.edit.FormView">FormView</span></code></p>
12866
12948
 
12867
12949
 
12868
- <p>NautobotViewSetMixin is an aggregation of various mixins from DRF, Django and Nautobot to acheive the desired behavior pattern for NautobotUIViewSet</p>
12950
+ <p>NautobotViewSetMixin is an aggregation of various mixins from DRF, Django and Nautobot to achieve the desired behavior pattern for NautobotUIViewSet</p>
12869
12951
 
12870
12952
 
12871
12953
 
@@ -13459,7 +13541,7 @@ will be used, as per <code>get_base_template()</code>.</p>
13459
13541
 
13460
13542
  <div class="doc doc-contents ">
13461
13543
  <p class="doc doc-class-bases">
13462
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
13544
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
13463
13545
 
13464
13546
 
13465
13547
  <p>Delete a single object.</p>
@@ -13723,7 +13805,7 @@ will be used, as per <code>get_base_template()</code>.</p>
13723
13805
 
13724
13806
  <div class="doc doc-contents ">
13725
13807
  <p class="doc doc-class-bases">
13726
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
13808
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
13727
13809
 
13728
13810
 
13729
13811
  <p>Create or edit a single object.</p>
@@ -14052,7 +14134,7 @@ Override to add more variables to Response.</p>
14052
14134
 
14053
14135
  <div class="doc doc-contents ">
14054
14136
  <p class="doc doc-class-bases">
14055
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14137
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.GetReturnURLMixin (nautobot.core.views.mixins.GetReturnURLMixin)" href="#nautobot.apps.views.GetReturnURLMixin">GetReturnURLMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14056
14138
 
14057
14139
 
14058
14140
  <p>Import a single object (YAML or JSON format).</p>
@@ -14101,7 +14183,7 @@ template_name: The name of the template</p>
14101
14183
 
14102
14184
  <div class="doc doc-contents ">
14103
14185
  <p class="doc doc-class-bases">
14104
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14186
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14105
14187
 
14106
14188
 
14107
14189
  <p>List a series of objects.</p>
@@ -14481,7 +14563,7 @@ to return only those objects on which the user is permitted to perform the speci
14481
14563
 
14482
14564
  <div class="doc doc-contents ">
14483
14565
  <p class="doc doc-class-bases">
14484
- Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14566
+ Bases: <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.ObjectPermissionRequiredMixin (nautobot.core.views.mixins.ObjectPermissionRequiredMixin)" href="#nautobot.apps.views.ObjectPermissionRequiredMixin">ObjectPermissionRequiredMixin</a></code>, <code><a class="autorefs autorefs-internal" title="nautobot.apps.views.UIComponentsMixin (nautobot.core.views.mixins.UIComponentsMixin)" href="#nautobot.apps.views.UIComponentsMixin">UIComponentsMixin</a></code>, <code><span title="django.views.generic.View">View</span></code></p>
14485
14567
 
14486
14568
 
14487
14569
  <p>Retrieve a single object for display.</p>
@@ -14633,6 +14715,302 @@ template_name: Name of the template to use</p>
14633
14715
 
14634
14716
 
14635
14717
 
14718
+ </div>
14719
+
14720
+ </div>
14721
+
14722
+ </div>
14723
+
14724
+ <div class="doc doc-object doc-class">
14725
+
14726
+
14727
+
14728
+ <h2 id="nautobot.apps.views.UIComponentsMixin" class="doc doc-heading">
14729
+ <code>nautobot.apps.views.UIComponentsMixin</code>
14730
+
14731
+
14732
+ <a href="#nautobot.apps.views.UIComponentsMixin" class="headerlink" title="Permanent link">&para;</a></h2>
14733
+
14734
+
14735
+ <div class="doc doc-contents ">
14736
+
14737
+
14738
+ <p>Mixin that resolves UI components (e.g., breadcrumbs, titles) either from:
14739
+ 1) the current view class (preferred),
14740
+ 2) a related view class for a given model (via <code>lookup.get_view_for_model()</code>),
14741
+ 3) or a default component class.</p>
14742
+ <p>The public helpers (<code>get_view_titles()</code>, <code>get_breadcrumbs()</code>) return concrete
14743
+ component <em>instances</em> ready to use in renderers/templates.</p>
14744
+ <p>It should be used in views that use the <code>nautobot.apps.views.GenericView</code> and standard Nautobot templates.</p>
14745
+ <p>Example usage:
14746
+ <div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>def get(self, request, *args, **kwargs):
14747
+ <a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> context = {
14748
+ <a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a> ...
14749
+ <a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a> &quot;breadcrumbs&quot;: self.get_breadcrumbs(model),
14750
+ <a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a> }
14751
+ <a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a> context[&quot;title&quot;] = self.get_view_titles(model).render(context)
14752
+ <a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>
14753
+ <a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a> return render(
14754
+ <a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> request,
14755
+ <a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> &quot;extras/plugins_list.html&quot;,
14756
+ <a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> context,
14757
+ <a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> )
14758
+ </code></pre></div></p>
14759
+
14760
+
14761
+ <p><span class="doc-section-title">Attributes:</span></p>
14762
+ <table>
14763
+ <thead>
14764
+ <tr>
14765
+ <th>Name</th>
14766
+ <th>Type</th>
14767
+ <th>Description</th>
14768
+ </tr>
14769
+ </thead>
14770
+ <tbody>
14771
+ <tr class="doc-section-item">
14772
+ <td><code><span title="nautobot.apps.views.UIComponentsMixin.breadcrumbs">breadcrumbs</span></code></td>
14773
+ <td>
14774
+ <code><span title="typing.ClassVar">ClassVar</span>[<span title="typing.Optional">Optional</span>[<a class="autorefs autorefs-internal" title="nautobot.apps.ui.Breadcrumbs (nautobot.core.ui.breadcrumbs.Breadcrumbs)" href="ui.html#nautobot.apps.ui.Breadcrumbs">Breadcrumbs</a>]]</code>
14775
+ </td>
14776
+ <td>
14777
+ <div class="doc-md-description">
14778
+ <p>Optional component declared on the view class. May be:
14779
+ - <code>None</code> (no local definition, fall back),
14780
+ - a component <em>class</em> (will be instantiated),
14781
+ - or a pre-instantiated component (returned as-is).</p>
14782
+ </div>
14783
+ </td>
14784
+ </tr>
14785
+ <tr class="doc-section-item">
14786
+ <td><code><span title="nautobot.apps.views.UIComponentsMixin.view_titles">view_titles</span></code></td>
14787
+ <td>
14788
+ <code><span title="typing.ClassVar">ClassVar</span>[<span title="typing.Optional">Optional</span>[<a class="autorefs autorefs-internal" title="nautobot.apps.ui.Titles (nautobot.core.ui.titles.Titles)" href="ui.html#nautobot.apps.ui.Titles">Titles</a>]]</code>
14789
+ </td>
14790
+ <td>
14791
+ <div class="doc-md-description">
14792
+ <p>Same contract as <code>breadcrumbs</code>,
14793
+ but for titles.</p>
14794
+ </div>
14795
+ </td>
14796
+ </tr>
14797
+ </tbody>
14798
+ </table>
14799
+
14800
+
14801
+
14802
+
14803
+
14804
+
14805
+
14806
+
14807
+
14808
+
14809
+ <div class="doc doc-children">
14810
+
14811
+
14812
+
14813
+
14814
+
14815
+
14816
+
14817
+
14818
+
14819
+ <div class="doc doc-object doc-function">
14820
+
14821
+
14822
+ <h3 id="nautobot.apps.views.UIComponentsMixin.get_breadcrumbs" class="doc doc-heading">
14823
+ <code class="highlight language-python"><span class="n">get_breadcrumbs</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">view_type</span><span class="o">=</span><span class="s1">&#39;List&#39;</span><span class="p">)</span></code>
14824
+
14825
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_breadcrumbs" class="headerlink" title="Permanent link">&para;</a></h3>
14826
+
14827
+
14828
+ <div class="doc doc-contents ">
14829
+
14830
+ <p>Resolve and return the <code>Breadcrumbs</code> component instance.</p>
14831
+ <p>Resolution order mirrors <code>get_view_titles()</code>:
14832
+ 1) Use <code>self.breadcrumbs</code> if set locally.
14833
+ 2) Else, if <code>model</code> is provided, copy the <code>breadcrumbs</code> from the view
14834
+ class associated with that model via <code>lookup.get_view_for_model(model, action)</code>.
14835
+ 3) Else return a new default <code>Breadcrumbs()</code>.</p>
14836
+
14837
+
14838
+ <p><span class="doc-section-title">Parameters:</span></p>
14839
+ <table>
14840
+ <thead>
14841
+ <tr>
14842
+ <th>Name</th>
14843
+ <th>Type</th>
14844
+ <th>Description</th>
14845
+ <th>Default</th>
14846
+ </tr>
14847
+ </thead>
14848
+ <tbody>
14849
+ <tr class="doc-section-item">
14850
+ <td>
14851
+ <code>model</code>
14852
+ </td>
14853
+ <td>
14854
+ <code><span title="typing.Union">Union</span>[None, <span title="str">str</span>, <span title="typing.Type">Type</span>[<span title="django.db.models.Model">Model</span>], <span title="django.db.models.Model">Model</span>]</code>
14855
+ </td>
14856
+ <td>
14857
+ <div class="doc-md-description">
14858
+ <p>A Django model <strong>class</strong>, <strong>instance</strong>, dotted name string, or <code>None</code>.
14859
+ Passed to <code>lookup.get_view_for_model()</code> to find the related view class.
14860
+ If <code>None</code>, only local/default resolution is used.</p>
14861
+ </div>
14862
+ </td>
14863
+ <td>
14864
+ <code>None</code>
14865
+ </td>
14866
+ </tr>
14867
+ <tr class="doc-section-item">
14868
+ <td>
14869
+ <code>view_type</code>
14870
+ </td>
14871
+ <td>
14872
+ <code><span title="str">str</span></code>
14873
+ </td>
14874
+ <td>
14875
+ <div class="doc-md-description">
14876
+ <p>Logical view type used by <code>lookup.get_view_for_model()</code> (e.g., <code>"List"</code> or empty to construct <code>"DeviceView"</code> string).</p>
14877
+ </div>
14878
+ </td>
14879
+ <td>
14880
+ <code>&#39;List&#39;</code>
14881
+ </td>
14882
+ </tr>
14883
+ </tbody>
14884
+ </table>
14885
+
14886
+
14887
+ <p><span class="doc-section-title">Returns:</span></p>
14888
+ <table>
14889
+ <thead>
14890
+ <tr>
14891
+ <th>Name</th> <th>Type</th>
14892
+ <th>Description</th>
14893
+ </tr>
14894
+ </thead>
14895
+ <tbody>
14896
+ <tr class="doc-section-item">
14897
+ <td><code>Breadcrumbs</code></td> <td>
14898
+ <code><a class="autorefs autorefs-internal" title="nautobot.apps.ui.Breadcrumbs (nautobot.core.ui.breadcrumbs.Breadcrumbs)" href="ui.html#nautobot.apps.ui.Breadcrumbs">Breadcrumbs</a></code>
14899
+ </td>
14900
+ <td>
14901
+ <div class="doc-md-description">
14902
+ <p>A concrete <code>Breadcrumbs</code> component instance.</p>
14903
+ </div>
14904
+ </td>
14905
+ </tr>
14906
+ </tbody>
14907
+ </table>
14908
+
14909
+
14910
+ </div>
14911
+
14912
+ </div>
14913
+
14914
+ <div class="doc doc-object doc-function">
14915
+
14916
+
14917
+ <h3 id="nautobot.apps.views.UIComponentsMixin.get_view_titles" class="doc doc-heading">
14918
+ <code class="highlight language-python"><span class="n">get_view_titles</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">view_type</span><span class="o">=</span><span class="s1">&#39;List&#39;</span><span class="p">)</span></code>
14919
+
14920
+ <a href="#nautobot.apps.views.UIComponentsMixin.get_view_titles" class="headerlink" title="Permanent link">&para;</a></h3>
14921
+
14922
+
14923
+ <div class="doc doc-contents ">
14924
+
14925
+ <p>Resolve and return the <code>Titles</code> component instance.</p>
14926
+
14927
+
14928
+ <details class="resolution-order" open>
14929
+ <summary>Resolution order</summary>
14930
+ <p>1) If <code>self.view_titles</code> is set on the current view, use it.
14931
+ 2) Else, if <code>model</code> is provided, copy the <code>view_titles</code> from the view
14932
+ class associated with that model via <code>lookup.get_view_for_model(model, action)</code>.
14933
+ 3) Else, instantiate and return the default <code>Titles()</code>.</p>
14934
+ </details>
14935
+
14936
+ <p><span class="doc-section-title">Parameters:</span></p>
14937
+ <table>
14938
+ <thead>
14939
+ <tr>
14940
+ <th>Name</th>
14941
+ <th>Type</th>
14942
+ <th>Description</th>
14943
+ <th>Default</th>
14944
+ </tr>
14945
+ </thead>
14946
+ <tbody>
14947
+ <tr class="doc-section-item">
14948
+ <td>
14949
+ <code>model</code>
14950
+ </td>
14951
+ <td>
14952
+ <code><span title="typing.Union">Union</span>[None, <span title="str">str</span>, <span title="typing.Type">Type</span>[<span title="django.db.models.Model">Model</span>], <span title="django.db.models.Model">Model</span>]</code>
14953
+ </td>
14954
+ <td>
14955
+ <div class="doc-md-description">
14956
+ <p>A Django model <strong>class</strong>, <strong>instance</strong>, dotted name string, or <code>None</code>.
14957
+ Passed to <code>lookup.get_view_for_model()</code> to find the related view class.
14958
+ If <code>None</code>, only local/default resolution is used.</p>
14959
+ </div>
14960
+ </td>
14961
+ <td>
14962
+ <code>None</code>
14963
+ </td>
14964
+ </tr>
14965
+ <tr class="doc-section-item">
14966
+ <td>
14967
+ <code>view_type</code>
14968
+ </td>
14969
+ <td>
14970
+ <code><span title="str">str</span></code>
14971
+ </td>
14972
+ <td>
14973
+ <div class="doc-md-description">
14974
+ <p>Logical view type used by <code>lookup.get_view_for_model()</code> (e.g., <code>"List"</code> or empty to construct <code>"DeviceView"</code> string).</p>
14975
+ </div>
14976
+ </td>
14977
+ <td>
14978
+ <code>&#39;List&#39;</code>
14979
+ </td>
14980
+ </tr>
14981
+ </tbody>
14982
+ </table>
14983
+
14984
+
14985
+ <p><span class="doc-section-title">Returns:</span></p>
14986
+ <table>
14987
+ <thead>
14988
+ <tr>
14989
+ <th>Name</th> <th>Type</th>
14990
+ <th>Description</th>
14991
+ </tr>
14992
+ </thead>
14993
+ <tbody>
14994
+ <tr class="doc-section-item">
14995
+ <td><code>Titles</code></td> <td>
14996
+ <code><a class="autorefs autorefs-internal" title="nautobot.apps.ui.Titles (nautobot.core.ui.titles.Titles)" href="ui.html#nautobot.apps.ui.Titles">Titles</a></code>
14997
+ </td>
14998
+ <td>
14999
+ <div class="doc-md-description">
15000
+ <p>A concrete <code>Titles</code> component instance ready to use.</p>
15001
+ </div>
15002
+ </td>
15003
+ </tr>
15004
+ </tbody>
15005
+ </table>
15006
+
15007
+
15008
+ </div>
15009
+
15010
+ </div>
15011
+
15012
+
15013
+
14636
15014
  </div>
14637
15015
 
14638
15016
  </div>
@@ -10316,7 +10316,7 @@
10316
10316
  <tr>
10317
10317
  <td><code>searchable_models</code></td>
10318
10318
  <td><code>[]</code></td>
10319
- <td>A list of model names to include in the global Nautobot search</td>
10319
+ <td>A list of model names to include in the <a href="models/global-search.html">global Nautobot search</a></td>
10320
10320
  </tr>
10321
10321
  <tr>
10322
10322
  <td><code>constance_config</code></td>
@@ -11667,21 +11667,6 @@
11667
11667
  <p>Integration tests are automated tests written and run to ensure that the Nautobot application behaves as expected when being used as it would be in practice. By contrast to unit tests, where individual units of code are being tested, integration tests rely upon the server code actually running, and web UI clients or API clients to make real connections to the service to exercise actual workflows, such as navigating to the login page, filling out the username/passwords fields, and clicking the "Log In" button.</p>
11668
11668
  <p>Running integrations tests requires the use of Docker at this time. They can be directly invoked using <code>nautobot-server test</code> just as unit tests can, however, a headless Firefox browser provided by Selenium is required. Because Selenium installation and setup is complicated, we have included a configuration for this to work out of the box using Docker.</p>
11669
11669
  <p>The Selenium container is running a standalone, headless Firefox "web driver" browser that can be remotely controlled by Nautobot for use in integration testing.</p>
11670
- <p>Before running integration tests, the <code>selenium</code> container must be running. If you are using the Docker Compose workflow, it is automatically started for you. For the Virtual Environment workflow, you must start it manually.</p>
11671
- <table>
11672
- <thead>
11673
- <tr>
11674
- <th>Docker Compose Workflow</th>
11675
- <th>Virtual Environment Workflow</th>
11676
- </tr>
11677
- </thead>
11678
- <tbody>
11679
- <tr>
11680
- <td>(automatic)</td>
11681
- <td><code>invoke start --service selenium</code></td>
11682
- </tr>
11683
- </tbody>
11684
- </table>
11685
11670
  <p>Integration tests are run by passing <code>--tag integration</code> to the <code>invoke tests</code> command. All other optional parameters to this command can be used the same as with unit tests.</p>
11686
11671
  <table>
11687
11672
  <thead>