nautobot 2.4.3__py3-none-any.whl → 2.4.5__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 (198) hide show
  1. nautobot/__init__.py +19 -3
  2. nautobot/apps/filters.py +2 -0
  3. nautobot/circuits/filters.py +1 -1
  4. nautobot/circuits/tests/test_models.py +5 -3
  5. nautobot/cloud/filters.py +3 -6
  6. nautobot/cloud/tests/test_filters.py +21 -0
  7. nautobot/core/admin.py +2 -0
  8. nautobot/core/celery/__init__.py +5 -3
  9. nautobot/core/jobs/__init__.py +5 -3
  10. nautobot/core/management/commands/generate_performance_test_endpoints.py +9 -6
  11. nautobot/core/models/utils.py +6 -1
  12. nautobot/core/templates/inc/javascript.html +1 -0
  13. nautobot/core/templatetags/ui_framework.py +20 -4
  14. nautobot/core/testing/__init__.py +2 -0
  15. nautobot/core/testing/forms.py +1 -1
  16. nautobot/core/testing/mixins.py +9 -0
  17. nautobot/core/tests/test_api.py +1 -1
  18. nautobot/core/tests/test_graphql.py +3 -3
  19. nautobot/core/tests/test_jobs.py +30 -28
  20. nautobot/core/ui/object_detail.py +1 -1
  21. nautobot/dcim/api/serializers.py +36 -0
  22. nautobot/dcim/api/views.py +1 -1
  23. nautobot/dcim/elevations.py +17 -4
  24. nautobot/dcim/factory.py +9 -1
  25. nautobot/dcim/filters/__init__.py +27 -1
  26. nautobot/dcim/forms.py +13 -1
  27. nautobot/dcim/models/devices.py +11 -5
  28. nautobot/dcim/signals.py +26 -0
  29. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +0 -62
  30. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +6 -0
  31. nautobot/dcim/tests/test_api.py +176 -0
  32. nautobot/dcim/tests/test_filters.py +56 -3
  33. nautobot/dcim/tests/test_jobs.py +4 -6
  34. nautobot/dcim/tests/test_models.py +40 -0
  35. nautobot/dcim/views.py +24 -14
  36. nautobot/extras/api/mixins.py +1 -1
  37. nautobot/extras/api/views.py +2 -2
  38. nautobot/extras/choices.py +8 -3
  39. nautobot/extras/filters/__init__.py +4 -0
  40. nautobot/extras/jobs.py +181 -103
  41. nautobot/extras/management/utils.py +13 -2
  42. nautobot/extras/models/datasources.py +11 -4
  43. nautobot/extras/models/jobs.py +20 -17
  44. nautobot/extras/plugins/__init__.py +26 -1
  45. nautobot/extras/tables.py +25 -29
  46. nautobot/extras/templates/extras/inc/jobresult.html +12 -13
  47. nautobot/extras/templates/extras/objectchange.html +28 -12
  48. nautobot/extras/test_jobs/atomic_transaction.py +6 -6
  49. nautobot/extras/test_jobs/fail.py +75 -1
  50. nautobot/extras/tests/test_api.py +17 -16
  51. nautobot/extras/tests/test_datasources.py +64 -54
  52. nautobot/extras/tests/test_filters.py +2 -0
  53. nautobot/extras/tests/test_jobs.py +69 -62
  54. nautobot/extras/tests/test_models.py +1 -1
  55. nautobot/extras/tests/test_plugins.py +32 -1
  56. nautobot/extras/tests/test_relationships.py +5 -5
  57. nautobot/extras/tests/test_views.py +12 -2
  58. nautobot/extras/views.py +10 -1
  59. nautobot/ipam/api/serializers.py +7 -8
  60. nautobot/ipam/api/views.py +2 -2
  61. nautobot/ipam/factory.py +27 -8
  62. nautobot/ipam/filters.py +67 -29
  63. nautobot/ipam/formfields.py +51 -0
  64. nautobot/ipam/forms.py +28 -1
  65. nautobot/ipam/migrations/0051_added_optional_vrf_relationship_to_vdc.py +41 -0
  66. nautobot/ipam/models.py +63 -5
  67. nautobot/ipam/querysets.py +6 -0
  68. nautobot/ipam/tables.py +21 -7
  69. nautobot/ipam/templates/ipam/rir.html +1 -43
  70. nautobot/ipam/tests/test_api.py +107 -66
  71. nautobot/ipam/tests/test_filters.py +145 -5
  72. nautobot/ipam/tests/test_models.py +16 -0
  73. nautobot/ipam/tests/test_views.py +15 -2
  74. nautobot/ipam/urls.py +1 -21
  75. nautobot/ipam/views.py +24 -41
  76. nautobot/project-static/css/base.css +11 -0
  77. nautobot/project-static/css/dark.css +2 -1
  78. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +62 -0
  79. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +43 -5
  80. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +35 -0
  81. nautobot/project-static/docs/development/apps/api/configuration-view.html +0 -3
  82. nautobot/project-static/docs/development/apps/api/models/graphql.html +0 -4
  83. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +94 -1
  84. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +0 -3
  85. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +0 -3
  86. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +0 -3
  87. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +0 -3
  88. nautobot/project-static/docs/development/apps/api/prometheus.html +0 -3
  89. nautobot/project-static/docs/development/apps/api/testing.html +0 -6
  90. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +0 -3
  91. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +0 -3
  92. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +0 -3
  93. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +0 -3
  94. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -7
  95. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +0 -7
  96. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +0 -4
  97. nautobot/project-static/docs/development/apps/api/views/notes.html +0 -3
  98. nautobot/project-static/docs/development/apps/index.html +2 -35
  99. nautobot/project-static/docs/development/apps/migration/code-updates.html +1 -1
  100. nautobot/project-static/docs/development/core/application-registry.html +0 -6
  101. nautobot/project-static/docs/development/core/best-practices.html +0 -27
  102. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +58 -4
  103. nautobot/project-static/docs/development/core/getting-started.html +12 -16
  104. nautobot/project-static/docs/development/core/homepage.html +0 -3
  105. nautobot/project-static/docs/development/core/style-guide.html +0 -5
  106. nautobot/project-static/docs/development/core/templates.html +0 -3
  107. nautobot/project-static/docs/development/core/testing.html +0 -9
  108. nautobot/project-static/docs/development/jobs/index.html +30 -43
  109. nautobot/project-static/docs/objects.inv +0 -0
  110. nautobot/project-static/docs/overview/application_stack.html +0 -18
  111. nautobot/project-static/docs/release-notes/version-2.4.html +374 -0
  112. nautobot/project-static/docs/requirements.txt +2 -2
  113. nautobot/project-static/docs/search/search_index.json +1 -1
  114. nautobot/project-static/docs/sitemap.xml +290 -290
  115. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  116. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +0 -10
  117. nautobot/project-static/docs/user-guide/administration/guides/docker.html +0 -15
  118. nautobot/project-static/docs/user-guide/administration/installation/index.html +0 -16
  119. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +1 -4
  120. nautobot/project-static/docs/user-guide/administration/installation/services.html +0 -11
  121. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -3
  122. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +5 -35
  123. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-location-changes.yaml +1 -1
  124. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +1 -1
  125. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +0 -4
  126. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +0 -3
  127. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +0 -4
  128. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +0 -4
  129. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +0 -4
  130. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +0 -4
  131. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +0 -4
  132. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +0 -4
  133. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +0 -3
  134. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +0 -4
  135. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +0 -4
  136. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +0 -4
  137. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -17
  138. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +0 -3
  139. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +0 -4
  140. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +0 -4
  141. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +0 -3
  142. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -7
  143. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +0 -4
  144. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +0 -4
  145. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +0 -4
  146. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +0 -4
  147. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +0 -4
  148. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +0 -4
  149. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +0 -4
  150. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +0 -6
  151. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +0 -3
  152. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +0 -4
  153. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +0 -4
  154. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +0 -8
  155. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +3 -3
  156. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +0 -6
  157. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +0 -3
  158. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -15
  159. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +0 -26
  160. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +0 -8
  161. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +0 -3
  162. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +0 -8
  163. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +0 -7
  164. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +0 -3
  165. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +0 -3
  166. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +0 -14
  167. nautobot/project-static/docs/user-guide/platform-functionality/note.html +0 -3
  168. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -10
  169. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +0 -3
  170. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +0 -14
  171. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +0 -19
  172. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -9
  173. nautobot/project-static/docs/user-guide/platform-functionality/status.html +0 -8
  174. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +0 -4
  175. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -13
  176. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +0 -5
  177. nautobot/project-static/js/editor.js +292 -0
  178. nautobot/project-static/monaco-editor-0.52.2/README.md +81 -0
  179. nautobot/project-static/monaco-editor-0.52.2/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  180. nautobot/project-static/monaco-editor-0.52.2/vs/base/worker/workerMain.js +31 -0
  181. nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/xml/xml.js +10 -0
  182. nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/yaml/yaml.js +10 -0
  183. nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.css +8 -0
  184. nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.js +798 -0
  185. nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonMode.js +19 -0
  186. nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonWorker.js +42 -0
  187. nautobot/project-static/monaco-editor-0.52.2/vs/loader.js +11 -0
  188. nautobot/tenancy/filters/__init__.py +3 -5
  189. nautobot/tenancy/tests/test_filters.py +10 -0
  190. nautobot/virtualization/views.py +0 -1
  191. nautobot/wireless/tables.py +9 -4
  192. nautobot/wireless/tests/test_api.py +0 -9
  193. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/METADATA +4 -4
  194. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/RECORD +198 -186
  195. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/LICENSE.txt +0 -0
  196. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/NOTICE +0 -0
  197. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/WHEEL +0 -0
  198. {nautobot-2.4.3.dist-info → nautobot-2.4.5.dist-info}/entry_points.txt +0 -0
@@ -9190,10 +9190,6 @@
9190
9190
  <p>This documentation covers the development of custom Apps for Nautobot. Nautobot apps are essentially self-contained <a href="https://docs.djangoproject.com/en/stable/ref/applications/">Django applications</a> which integrate with Nautobot to provide custom functionality. Since the development of Django applications is already very well-documented, this will only be covering the aspects that are specific to Nautobot.</p>
9191
9191
  <p>Apps can <a href="index.html#capabilities">do a lot of different things</a>, all of which will be covered in detail in this document.
9192
9192
  Keep in mind that each piece of functionality is entirely optional. For example, if your app merely adds a piece of middleware or an API endpoint for existing data, there's no need to define any new models.</p>
9193
- <details class="version-changed">
9194
- <summary>Changed in version 1.5.2</summary>
9195
- <p>The <code>nautobot.apps</code> namespace was added in Nautobot 1.5.2. If developing apps to be backwards-compatible with older versions of Nautobot, please refer to the app developer documentation of your required Nautobot version.</p>
9196
- </details>
9197
9193
  <div class="admonition tip">
9198
9194
  <p class="admonition-title">Tip</p>
9199
9195
  <p>The app detail view (<code>/apps/installed-apps/&lt;app_name&gt;/</code>, accessible via <strong>Apps -&gt; Installed Apps</strong> in the navigation menu, then selecting a specific app) provides in-depth information about which features any installed app is implementing or making use of.</p>
@@ -9207,48 +9203,19 @@ Keep in mind that each piece of functionality is entirely optional. For example,
9207
9203
  <li><strong>Add navigation menu items.</strong> An App can extend the navigation menus with new links and buttons or even entirely new menus.</li>
9208
9204
  <li><strong>Add home page content.</strong> An App can add custom items or custom panels to the Nautobot home page.</li>
9209
9205
  <li><strong>Add content to existing model detail views.</strong> An App can inject custom HTML content within the view of a core Nautobot model. This content can appear in the left column, right column, or full width of the page, and can also include custom buttons at the top of the page.</li>
9210
- </ul>
9211
- <details class="version-added">
9212
- <summary>Added in version 1.2.0</summary>
9213
- <ul>
9214
9206
  <li><strong>Add a banner.</strong> An App can add a custom banner to the top of any appropriate views.</li>
9215
- </ul>
9216
- </details>
9217
- <details class="version-added">
9218
- <summary>Added in version 1.4.0</summary>
9219
- <ul>
9220
9207
  <li><strong>Add extra tabs to existing model detail views.</strong> An App can inject additional tabs which will appear at the end of the object detail tabs list.</li>
9221
9208
  </ul>
9222
- </details>
9223
9209
  <h3 id="extend-and-customize-existing-nautobot-functionality">Extend and customize existing Nautobot functionality<a class="headerlink" href="#extend-and-customize-existing-nautobot-functionality" title="Permanent link">&para;</a></h3>
9224
9210
  <ul>
9225
9211
  <li><strong>Add custom validation logic to existing data models.</strong> An App can provide additional logic to customize the rules for validating created/updated data records.</li>
9226
9212
  <li><strong>Provide Jobs.</strong> An App can serve as a convenient way to package and install <a href="../../user-guide/platform-functionality/jobs/index.html">Jobs</a>.</li>
9227
9213
  <li><strong>Add additional Git data types.</strong> An App can add support for processing additional types of data stored in a <a href="../../user-guide/platform-functionality/gitrepository.html">Git repository</a>.</li>
9228
- </ul>
9229
- <details class="version-added">
9230
- <summary>Added in version 1.1.0</summary>
9231
- <ul>
9232
9214
  <li><strong>Register additional Jinja2 filters.</strong> An App can define custom Jinja2 filters to be used in computed fields, webhooks, custom links, and export templates.</li>
9233
- </ul>
9234
- </details>
9235
- <details class="version-added">
9236
- <summary>Added in version 1.2.0</summary>
9237
- <ul>
9238
- <li>
9239
- <p><strong>Populate extensibility features in the database.</strong> An App can add content to the Nautobot database when installed, such as automatically creating new custom fields, relationships, and so forth.</p>
9240
- </li>
9241
- <li>
9242
- <p><strong>Add additional secrets providers.</strong> An App can add support for retrieving <a href="../../user-guide/platform-functionality/secret.html">Secret</a> values from additional sources or external systems.</p>
9243
- </li>
9244
- </ul>
9245
- </details>
9246
- <details class="version-added">
9247
- <summary>Added in version 1.4.0</summary>
9248
- <ul>
9215
+ <li><strong>Populate extensibility features in the database.</strong> An App can add content to the Nautobot database when installed, such as automatically creating new custom fields, relationships, and so forth.</li>
9216
+ <li><strong>Add additional secrets providers.</strong> An App can add support for retrieving <a href="../../user-guide/platform-functionality/secret.html">Secret</a> values from additional sources or external systems.</li>
9249
9217
  <li><strong>Override already-defined views.</strong> An App can define a view which can be set to override a view from the core set of views or another App's view.</li>
9250
9218
  </ul>
9251
- </details>
9252
9219
  <h3 id="add-entirely-new-features">Add entirely new features<a class="headerlink" href="#add-entirely-new-features" title="Permanent link">&para;</a></h3>
9253
9220
  <ul>
9254
9221
  <li><strong>Add new data models.</strong> An App can introduce one or more models to hold data. (A model is essentially a table in the SQL database.) These models can be integrated with core implementations of GraphQL, webhooks, logging, custom relationships, custom fields, and tags.</li>
@@ -9538,7 +9538,7 @@
9538
9538
  </tr>
9539
9539
  <tr>
9540
9540
  <td>nautobot.utilities.utils</td>
9541
- <td>ensure_content_type_and_field_name_inquery_params</td>
9541
+ <td>ensure_content_type_and_field_name_in_query_params</td>
9542
9542
  <td>nautobot.core.utils.requests</td>
9543
9543
  </tr>
9544
9544
  <tr>
@@ -9370,9 +9370,6 @@
9370
9370
  </code></pre></div>
9371
9371
  <p>Apps may extend this dictionary with additional data sources and/or data types by calling <code>extras.registry.register_datasource_contents()</code> as desired.</p>
9372
9372
  <h3 id="homepage_layout"><code>homepage_layout</code><a class="headerlink" href="#homepage_layout" title="Permanent link">&para;</a></h3>
9373
- <details class="version-added">
9374
- <summary>Added in version 1.2.0</summary>
9375
- </details>
9376
9373
  <p>A dictionary holding information about the layout of Nautobot's homepage. Each app may register homepage panels and items using objects from the generic app class. Each object has a weight attribute allowing the developer to define the position of the object.</p>
9377
9374
  <div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a><span class="p">{</span>
9378
9375
  <a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a> <span class="s2">&quot;panels&quot;</span><span class="p">:</span> <span class="p">{</span>
@@ -9445,9 +9442,6 @@
9445
9442
  </code></pre></div>
9446
9443
  <p>For more information visit <a href="model-features.html">model-features</a>.</p>
9447
9444
  <h3 id="nav_menu"><code>nav_menu</code><a class="headerlink" href="#nav_menu" title="Permanent link">&para;</a></h3>
9448
- <details class="version-added">
9449
- <summary>Added in version 1.1.0</summary>
9450
- </details>
9451
9445
  <p>Navigation menu items provided by Nautobot applications. Each app may register its navbar configuration inside of the <code>nav_menu</code> dictionary using <code>navigation.py</code>. Tabs are stored in the top level moving down to groups, items and buttons. Tabs, groups and items can be modified by using the key values inside other core applications and Apps. The <code>nav_menu</code> dict should never be modified directly.</p>
9452
9446
  <p>Example:</p>
9453
9447
  <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="p">{</span>
@@ -8333,15 +8333,6 @@
8333
8333
  </ul>
8334
8334
  </nav>
8335
8335
 
8336
- </li>
8337
-
8338
- <li class="md-nav__item">
8339
- <a href="#using-nautobotuiviewset-for-app-development" class="md-nav__link">
8340
- <span class="md-ellipsis">
8341
- Using NautobotUIViewSet for App Development
8342
- </span>
8343
- </a>
8344
-
8345
8336
  </li>
8346
8337
 
8347
8338
  </ul>
@@ -9578,15 +9569,6 @@
9578
9569
  </ul>
9579
9570
  </nav>
9580
9571
 
9581
- </li>
9582
-
9583
- <li class="md-nav__item">
9584
- <a href="#using-nautobotuiviewset-for-app-development" class="md-nav__link">
9585
- <span class="md-ellipsis">
9586
- Using NautobotUIViewSet for App Development
9587
- </span>
9588
- </a>
9589
-
9590
9572
  </li>
9591
9573
 
9592
9574
  </ul>
@@ -9761,10 +9743,6 @@ For most purposes, this is not the case you are intending to check!</p>
9761
9743
  <div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a><span class="kn">from</span> <span class="nn">nautobot.core.utils.lookup</span> <span class="kn">import</span> <span class="n">get_route_for_model</span>
9762
9744
  </code></pre></div>
9763
9745
  <p>This utility function supports both UI and API views for both Nautobot core apps and Nautobot Apps.</p>
9764
- <details class="version-added">
9765
- <summary>Added in version 1.4.3</summary>
9766
- <p>Support for generating API routes was added to <code>get_route_for_model()</code> by passing the argument <code>api=True</code>.</p>
9767
- </details>
9768
9746
  <h3 id="ui-routes">UI Routes<a class="headerlink" href="#ui-routes" title="Permanent link">&para;</a></h3>
9769
9747
  <p>Instead of:</p>
9770
9748
  <div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="n">route</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">app_label</span><span class="si">}</span><span class="s2">:</span><span class="si">{</span><span class="n">model</span><span class="o">.</span><span class="n">_meta</span><span class="o">.</span><span class="n">model_name</span><span class="si">}</span><span class="s2">_list&quot;</span>
@@ -10054,11 +10032,6 @@ For most purposes, this is not the case you are intending to check!</p>
10054
10032
  <li>For exceptions such as <code>DeviceFilterSet.has_primary_ip</code> where it checks for both <code>Device.primary_ip4</code> OR <code>Device.primary_ip6</code>, method filters may still be necessary, however, they would be <strong>the exception and not the norm.</strong></li>
10055
10033
  <li>The good news is that in the core there are not that many of these filter methods defined, but we also don’t want to see them continue to proliferate.</li>
10056
10034
  </ul>
10057
- <h2 id="using-nautobotuiviewset-for-app-development">Using NautobotUIViewSet for App Development<a class="headerlink" href="#using-nautobotuiviewset-for-app-development" title="Permanent link">&para;</a></h2>
10058
- <details class="version-added">
10059
- <summary>Added in version 1.4.0</summary>
10060
- <p>Using <code>NautobotUIViewSet</code> for <a href="../apps/api/views/nautobotuiviewset.html">App development</a> is strongly recommended.</p>
10061
- </details>
10062
10035
 
10063
10036
 
10064
10037
 
@@ -8208,6 +8208,30 @@
8208
8208
  </span>
8209
8209
  </a>
8210
8210
 
8211
+ <nav class="md-nav" aria-label="Remote Debugging Configuration">
8212
+ <ul class="md-nav__list">
8213
+
8214
+ <li class="md-nav__item">
8215
+ <a href="#running-inside-the-nautobot-workspace" class="md-nav__link">
8216
+ <span class="md-ellipsis">
8217
+ Running inside the Nautobot workspace
8218
+ </span>
8219
+ </a>
8220
+
8221
+ </li>
8222
+
8223
+ <li class="md-nav__item">
8224
+ <a href="#adding-nautobot-folder-to-an-existing-workspace" class="md-nav__link">
8225
+ <span class="md-ellipsis">
8226
+ Adding Nautobot folder to an existing workspace
8227
+ </span>
8228
+ </a>
8229
+
8230
+ </li>
8231
+
8232
+ </ul>
8233
+ </nav>
8234
+
8211
8235
  </li>
8212
8236
 
8213
8237
  </ul>
@@ -9450,6 +9474,30 @@
9450
9474
  </span>
9451
9475
  </a>
9452
9476
 
9477
+ <nav class="md-nav" aria-label="Remote Debugging Configuration">
9478
+ <ul class="md-nav__list">
9479
+
9480
+ <li class="md-nav__item">
9481
+ <a href="#running-inside-the-nautobot-workspace" class="md-nav__link">
9482
+ <span class="md-ellipsis">
9483
+ Running inside the Nautobot workspace
9484
+ </span>
9485
+ </a>
9486
+
9487
+ </li>
9488
+
9489
+ <li class="md-nav__item">
9490
+ <a href="#adding-nautobot-folder-to-an-existing-workspace" class="md-nav__link">
9491
+ <span class="md-ellipsis">
9492
+ Adding Nautobot folder to an existing workspace
9493
+ </span>
9494
+ </a>
9495
+
9496
+ </li>
9497
+
9498
+ </ul>
9499
+ </nav>
9500
+
9453
9501
  </li>
9454
9502
 
9455
9503
  </ul>
@@ -9486,6 +9534,7 @@
9486
9534
  <li><code>compose_dir</code>: the full path to the directory containing the Docker Compose YAML files (default: <code>"&lt;nautobot source directory&gt;/development"</code>)</li>
9487
9535
  <li><code>compose_files</code>: the Docker Compose YAML file(s) to use (default: <code>["docker-compose.yml", "docker-compose.postgres.yml", "docker-compose.dev.yml"]</code>)</li>
9488
9536
  <li><code>docker_image_names_main</code> and <code>docker_image_names_develop</code>: Used when <a href="release-checklist.html#publish-docker-images">building Docker images for publication</a>; you shouldn't generally need to change these.</li>
9537
+ <li><code>ephemeral_ports</code>: Setting this value to <code>True</code> will make all Nautobot containers with published ports expose themselves with dynamic ports. This is useful when running multiple Nautobot versions at the same time on the same machine so you won't experience system port conflicts.</li>
9489
9538
  </ul>
9490
9539
  <p>These setting may be overridden several different ways (from highest to lowest precedence):</p>
9491
9540
  <ul>
@@ -9621,8 +9670,13 @@
9621
9670
  <li>As a last step open the folder <code>/opt/nautobot</code> in VS Code.</li>
9622
9671
  </ul>
9623
9672
  <h3 id="remote-debugging-configuration">Remote Debugging Configuration<a class="headerlink" href="#remote-debugging-configuration" title="Permanent link">&para;</a></h3>
9624
- <p>Using the Remote-Attach functionality of VS Code debugger is an alternative to debugging in a development container. This allows a local VS Code instance to connect to a remote container and debug the code running in the container the same way as when debugging locally.</p>
9625
- <p>Follow the steps below to configure VS Code to debug Nautobot and Celery Worker running in a remote container:</p>
9673
+ <p>Using the <a href="https://code.visualstudio.com/docs/python/debugging#_debugging-by-attaching-over-a-network-connection">Remote-Attach functionality of VS Code</a> debugger is an alternative to debugging in a development container. This allows a local VS Code instance to connect to a remote container and debug the code running in the container the same way as when debugging locally. To learn more about debugging in VSCode, please <a href="https://code.visualstudio.com/docs/editor/debugging">follow the official docs</a>.</p>
9674
+ <p>Follow either of the options below to configure VS Code to debug Nautobot and Celery Worker running in a remote container:</p>
9675
+ <h4 id="running-inside-the-nautobot-workspace">Running inside the Nautobot workspace<a class="headerlink" href="#running-inside-the-nautobot-workspace" title="Permanent link">&para;</a></h4>
9676
+ <p>If you have opened the project via the workspace file <code>nautobot.code-workspace</code> then there are two debug configurations for remote debugging available. These can be run via one of the debug tasks:
9677
+ - <code>Python: Nautobot (Remote)</code> or
9678
+ - <code>Python: Nautobot-Celery (Remote)</code></p>
9679
+ <h4 id="adding-nautobot-folder-to-an-existing-workspace">Adding Nautobot folder to an existing workspace<a class="headerlink" href="#adding-nautobot-folder-to-an-existing-workspace" title="Permanent link">&para;</a></h4>
9626
9680
  <ol>
9627
9681
  <li>
9628
9682
  <p><strong>Configure <code>invoke.yml</code> to use the <code>docker-compose.vscode-rdb.yml</code> file.</strong></p>
@@ -9662,10 +9716,10 @@ then copy the <code>launch:</code> values to the <code>.vscode/launch.json</code
9662
9716
  <a id="__codelineno-9-12" name="__codelineno-9-12" href="#__codelineno-9-12"></a><span class="w"> </span><span class="p">]</span>
9663
9717
  <a id="__codelineno-9-13" name="__codelineno-9-13" href="#__codelineno-9-13"></a><span class="p">}</span>
9664
9718
  </code></pre></div>
9665
- </li>
9666
- </ol>
9667
9719
  <p>It is now possible to debug the containerized Nautobot and Celery Worker using the VS Code debugger.</p>
9668
9720
  <p>After restarting the Celery-Worker container you need to restart the debug session.</p>
9721
+ </li>
9722
+ </ol>
9669
9723
 
9670
9724
 
9671
9725
 
@@ -10359,10 +10359,6 @@
10359
10359
  <p>You may install Poetry in your user environment by running:</p>
10360
10360
  <div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>curl -sSL https://install.python-poetry.org | python3 -
10361
10361
  </code></pre></div>
10362
- <details class="version-changed">
10363
- <summary>Changed in version 1.5.6</summary>
10364
- <p>Poetry 1.3+ is required to be able to install packages against the latest lockfile.</p>
10365
- </details>
10366
10362
  <div class="admonition danger">
10367
10363
  <p class="admonition-title">Danger</p>
10368
10364
  <p>Always utilize this documented method to install Poetry for use when developing Nautobot.</p>
@@ -10549,7 +10545,7 @@
10549
10545
  <p>Do not use <code>poetry run nautobot-server runserver</code> as it will crash unless you also pass the <code>--noreload</code> flag, which somewhat defeats the purpose of using the development server. It is recommended to use <code>nautobot-server runserver</code> from within an active virtualenv (e.g. <code>poetry shell</code>). This is a <a href="https://github.com/python-poetry/poetry/issues/2435">known issue with Django and Poetry</a>.</p>
10550
10546
  </div>
10551
10547
  <p>Please see the <a href="https://docs.djangoproject.com/en/stable/ref/django-admin/#runserver">official Django documentation on <code>runserver</code></a> for more information.</p>
10552
- <p>You can connect to the development server at <code>localhost:8080</code>.</p>
10548
+ <p>You can connect to the development server in your local web browser at <code>http://localhost:8080</code>. If you are using the ephemeral ports feature (disabled by default), you can make use of the command, <code>invoke open-nautobot-web</code>. This will open up the default web-browser on your system pointing to the correct Nautobot admin port. Note that this command can be used regardless of ephemeral port mode.</p>
10553
10549
  <h3 id="starting-the-worker-server">Starting the Worker Server<a class="headerlink" href="#starting-the-worker-server" title="Permanent link">&para;</a></h3>
10554
10550
  <p>In order to run Nautobot Jobs or anything that requires a worker you must start a Celery worker.</p>
10555
10551
  <p>The worker is started in Docker Workflow with <a href="https://pythonhosted.org/watchdog/">watchdog</a> and can be setup to be started with watchdog in the Virtual Environment Workflow. Watchdog provides a similar experience to the Django lightweight HTTP/WSGI for restarting your application automatically. Watchdog can watch for changes on your filesystem, this is helpful when adjusting existing Python files to not have to restart the Celery worker when testing jobs.</p>
@@ -10752,10 +10748,10 @@
10752
10748
  <p class="admonition-title">Tip</p>
10753
10749
  <p>You may also use <code>invoke integration-test</code> in the Virtual Environment workflow given that the <code>selenium</code> container is running, and that the <code>INVOKE_NAUTOBOT_LOCAL=True</code> environment variable has been set.</p>
10754
10750
  </div>
10755
- <details class="version-changed">
10756
- <summary>Changed in version 1.5.11</summary>
10751
+ <div class="admonition tip">
10752
+ <p class="admonition-title">Tip</p>
10757
10753
  <p>The <code>--cache-test-fixtures</code> argument was added to the <code>invoke integration-test</code> and <code>nautobot-server test</code> commands to allow for caching of test factory data between test runs. See the <a href="testing.html#factory-caching">factories documentation</a> for more information.</p>
10758
- </details>
10754
+ </div>
10759
10755
  <h5 id="customizing-integration-test-executions">Customizing Integration Test Executions<a class="headerlink" href="#customizing-integration-test-executions" title="Permanent link">&para;</a></h5>
10760
10756
  <p>The following environment variables can be provided when running tests to customize where Nautobot looks for Selenium and where Selenium looks for Nautobot. If using the default setup documented above, there is no need to customize these.</p>
10761
10757
  <ul>
@@ -10845,27 +10841,27 @@
10845
10841
  <p>Some features require documentation updates or new documentation to be written. The documentation files can be found in the <code>docs</code> directory. To preview these changes locally, you can use <code>mkdocs</code>.</p>
10846
10842
  <p>For substantial changes to the code (including new features, removal of existing features, or significant changes in behavior) you should always make corresponding documentation updates. Nautobot's documentation pipeline includes a custom plugin for <code>mkdocs</code> that adds a few useful macros for annotating such changes:</p>
10847
10843
  <ul>
10848
- <li><code>+++ 1.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-added "Added in version 1.4.3"</code></li>
10849
- <li><code>+/- 1.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-changed "Changed in version 1.4.3"</code></li>
10850
- <li><code>--- 1.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-removed "Removed in version 1.4.3"</code></li>
10844
+ <li><code>+++ 2.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-added "Added in version 2.4.3"</code></li>
10845
+ <li><code>+/- 2.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-changed "Changed in version 2.4.3"</code></li>
10846
+ <li><code>--- 2.4.3</code>, on a line by itself, is a shorthand for <code>!!! version-removed "Removed in version 2.4.3"</code></li>
10851
10847
  </ul>
10852
10848
  <p>These admonitions in turn appear in the rendered documentation as follows:</p>
10853
10849
  <details class="version-added">
10854
- <summary>Added in version 1.4.3</summary>
10850
+ <summary>Added in version 2.4.3</summary>
10855
10851
  </details>
10856
10852
  <details class="version-changed">
10857
- <summary>Changed in version 1.4.3</summary>
10853
+ <summary>Changed in version 2.4.3</summary>
10858
10854
  </details>
10859
10855
  <details class="version-removed">
10860
- <summary>Removed in version 1.4.3</summary>
10856
+ <summary>Removed in version 2.4.3</summary>
10861
10857
  </details>
10862
10858
  <p>You can also add text to any of these admonitions for further clarity, for example:</p>
10863
- <div class="highlight"><pre><span></span><code>??? version-added &quot;Added in version 1.4.3&quot;
10859
+ <div class="highlight"><pre><span></span><code>??? version-added &quot;Added in version 2.4.3&quot;
10864
10860
  The custom `mkdocs` plugin was added.
10865
10861
  </code></pre></div>
10866
10862
  <p>will render as:</p>
10867
10863
  <details class="version-added">
10868
- <summary>Added in version 1.4.3</summary>
10864
+ <summary>Added in version 2.4.3</summary>
10869
10865
  <p>The custom <code>mkdocs</code> plugin was added.</p>
10870
10866
  </details>
10871
10867
  <div class="admonition caution">
@@ -9176,9 +9176,6 @@
9176
9176
 
9177
9177
 
9178
9178
  <h1 id="populating-the-home-page">Populating the Home Page<a class="headerlink" href="#populating-the-home-page" title="Permanent link">&para;</a></h1>
9179
- <details class="version-added">
9180
- <summary>Added in version 1.2.0</summary>
9181
- </details>
9182
9179
  <p>Both core applications and Apps can contribute items to the Nautobot home page by defining <code>layout</code> inside of their app's <code>homepage.py</code>. Using a key and weight system, a developer can integrate amongst existing home page panels or can create entirely new panels as desired.</p>
9183
9180
  <h2 id="adding-a-new-home-page-panel">Adding a new Home Page Panel<a class="headerlink" href="#adding-a-new-home-page-panel" title="Permanent link">&para;</a></h2>
9184
9181
  <p>Each panel on the home page is defined by a <code>HomePagePanel</code> object. A <code>HomePagePanel</code> may contain either or both of <code>HomePageItem</code> and/or <code>HomePageGroup</code> objects, or may define custom content via a referenced Django template. A <code>HomePageGroup</code> may itself contain <code>HomePageItem</code> objects as well, and individual <code>HomePageItem</code> objects may also reference custom Django templates.</p>
@@ -9471,10 +9471,6 @@
9471
9471
  <li>
9472
9472
  <p>The combination of <code>nautobot.core.forms.BootstrapMixin</code>, <code>nautobot.extras.forms.CustomFieldModelFormMixin</code>, <code>nautobot.extras.forms.RelationshipModelFormMixin</code> and <code>nautobot.extras.forms.NoteModelFormMixin</code> is such a common use case throughout the code base that they have a helper class which combines all of these at <code>nautobot.extras.forms.NautobotModelForm</code>. Use this helper class if you need the functionality from these classes.</p>
9473
9473
  </li>
9474
- </ul>
9475
- <details class="version-added">
9476
- <summary>Added in version 1.4.0</summary>
9477
- <ul>
9478
9474
  <li>
9479
9475
  <p>Similarly, for filter forms, <code>nautobot.extras.forms.NautobotFilterForm</code> combines <code>nautobot.core.forms.BootstrapMixin</code>, <code>nautobot.extras.forms.ContactTeamModelFilterFormMixin</code> (since Nautobot 2.3.0), <code>nautobot.extras.forms.CustomFieldModelFilterFormMixin</code>, and <code>nautobot.extras.forms.RelationshipModelFilterFormMixin</code>, and should be used where appropriate.</p>
9480
9476
  </li>
@@ -9491,7 +9487,6 @@
9491
9487
  <p>API Views for most models should inherit from <code>nautobot.extras.api.views.NautobotModelViewSet</code>. Only use more abstract base classes such as <code>ModelViewSet</code> where absolutely required.</p>
9492
9488
  </li>
9493
9489
  </ul>
9494
- </details>
9495
9490
  <h2 id="branding">Branding<a class="headerlink" href="#branding" title="Permanent link">&para;</a></h2>
9496
9491
  <ul>
9497
9492
  <li>When referring to Nautobot in writing, use the proper form "<code>Nautobot</code>," with the letter N. The lowercase form "<code>nautobot</code>" should be used in code, filenames, etc.</li>
@@ -9308,9 +9308,6 @@ This document presents these templates and their features.</p>
9308
9308
  <p>You can use these templates as the basis for your templates by calling <code>{% extends '&lt;template_name&gt;' %}</code>
9309
9309
  at the top of your template file.</p>
9310
9310
  <h2 id="object-detail">Object Detail<a class="headerlink" href="#object-detail" title="Permanent link">&para;</a></h2>
9311
- <details class="version-added">
9312
- <summary>Added in version 1.2.0</summary>
9313
- </details>
9314
9311
  <p>The most customizable template is <code>generic/object_retrieve.html</code>, as object detail views have a wide range of specific requirements to be accommodated. It provides the following blocks:</p>
9315
9312
  <ul>
9316
9313
  <li><code>header</code>: overloading this block allows for changing the entire top row of
@@ -9549,9 +9549,6 @@
9549
9549
  <h3 id="troubleshooting-integration-tests">Troubleshooting Integration Tests<a class="headerlink" href="#troubleshooting-integration-tests" title="Permanent link">&para;</a></h3>
9550
9550
  <p>Because integration tests normally involve interacting with Nautobot through a browser via <a href="https://www.selenium.dev/selenium/docs/api/py/index.html">Selenium</a> and the <a href="https://splinter.readthedocs.io/en/latest/">Splinter</a> wrapper library, they can be difficult to troubleshoot directly from the Python code when a failure occurs. A common troubleshooting technique is to add a <code>breakpoint()</code> at the appropriate place in the Python test code (i.e., immediately prior to the observed failure). When the breakpoint is hit and the test pauses, you can then use a VNC viewer application (such as macOS's "Screen Sharing" app) to connect to the running Selenium instance (<code>localhost:15900</code> if using the Docker development environment; the default password if prompted is simply "<code>secret</code>"). This will allow you to interact live with the testing web browser in its current state and can often provide invaluable insight into the nature of any test failure.</p>
9551
9551
  <h2 id="factories">Factories<a class="headerlink" href="#factories" title="Permanent link">&para;</a></h2>
9552
- <details class="version-added">
9553
- <summary>Added in version 1.5.0</summary>
9554
- </details>
9555
9552
  <p>Nautobot uses the <a href="https://factoryboy.readthedocs.io/en/stable/"><code>factory_boy</code></a> library as a way to generate randomized but plausible database data for use in unit and integration tests, or for convenience in populating a local development instance.</p>
9556
9553
  <p>Factories for each Nautobot app's models are defined in the corresponding <code>nautobot/APPNAME/factory.py</code> files. Helper classes and functions for certain common patterns are defined in <code>nautobot/core/factory.py</code>. Factories can be used directly from <code>nautobot-server nbshell</code> so long as you have <code>factory_boy</code> installed. Examples:</p>
9557
9554
  <div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a><span class="o">&gt;&gt;&gt;</span> <span class="kn">from</span> <span class="nn">nautobot.tenancy.factory</span> <span class="kn">import</span> <span class="n">TenantFactory</span><span class="p">,</span> <span class="n">TenantGroupFactory</span>
@@ -9580,9 +9577,6 @@
9580
9577
  <p>In short, we should only have one place in our tests where factories are called, and that's the <code>generate_test_data</code> management command. Individual tests should use standard <code>create()</code> or <code>save()</code> model methods, never factories.</p>
9581
9578
  </div>
9582
9579
  <h3 id="factory-caching">Factory Caching<a class="headerlink" href="#factory-caching" title="Permanent link">&para;</a></h3>
9583
- <details class="version-added">
9584
- <summary>Added in version 1.5.11</summary>
9585
- </details>
9586
9580
  <p>To reduce the time taken between multiple test runs, a new argument has been added to the <code>nautobot-server test</code> command: <code>--cache-test-fixtures</code>. When running tests with <code>--cache-test-fixtures</code> for the first time, after the factory data has been generated it will be saved to a <code>factory_dump.json</code> file in the <code>development</code> directory. On subsequent runs of unit or integration tests, if <code>--cache-test-fixtures</code> is again specified (hint: it is included by default when running <code>invoke unittest</code> or <code>invoke integration-test</code>), the factory data will be loaded from the file instead of being generated again. This can significantly reduce the time taken to run tests.</p>
9587
9581
  <details class="version-changed">
9588
9582
  <summary>Changed in version 2.2.7 — Hashing of migrations in the factory dump</summary>
@@ -9601,9 +9595,6 @@
9601
9595
  </ol>
9602
9596
  </div>
9603
9597
  <h2 id="performance-tests">Performance Tests<a class="headerlink" href="#performance-tests" title="Permanent link">&para;</a></h2>
9604
- <details class="version-added">
9605
- <summary>Added in version 1.5.0</summary>
9606
- </details>
9607
9598
  <h3 id="running-performance-tests">Running Performance Tests<a class="headerlink" href="#running-performance-tests" title="Permanent link">&para;</a></h3>
9608
9599
  <p>Nautobot uses <a href="https://pypi.org/project/django-slowtests/"><code>django-slowtests</code></a> to run performance tests. To run performance tests, you need to install the <code>django-slowtests</code> package.
9609
9600
  Once you install the package, you can do <code>invoke performance-test</code> or <code>invoke unittest --performance-test</code> to run unit tests with <code>NautobotPerformanceTestRunner</code>. The invoke commands will automatically add <code>--testrunner nautobot.core.tests.runner.NautobotPerformanceTestRunner</code> to the <code>coverage run</code> command and this flag will replace the default <code>NautobotTestRunner</code> while retaining all its functionalities with the addition of performance evaluation after test runs.</p>