nautobot 2.0.4__py3-none-any.whl → 2.1.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/circuits/navigation.py +0 -25
- nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -9
- nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
- nautobot/circuits/tests/test_api.py +79 -2
- nautobot/circuits/tests/test_filters.py +1 -0
- nautobot/core/api/serializers.py +15 -5
- nautobot/core/api/views.py +18 -19
- nautobot/core/choices.py +1 -1
- nautobot/core/filters.py +12 -4
- nautobot/core/jobs/__init__.py +125 -3
- nautobot/core/management/commands/generate_test_data.py +6 -1
- nautobot/core/middleware.py +12 -4
- nautobot/core/models/fields.py +12 -2
- nautobot/core/settings.py +9 -8
- nautobot/core/tables.py +26 -31
- nautobot/core/templates/base_django.html +2 -2
- nautobot/core/templates/buttons/export.html +57 -30
- nautobot/core/templates/generic/object_list.html +2 -2
- nautobot/core/templates/generic/object_retrieve.html +8 -1
- nautobot/core/templates/home.html +5 -5
- nautobot/core/templates/inc/created_updated.html +2 -2
- nautobot/core/templates/inc/footer.html +2 -2
- nautobot/core/templates/inc/javascript.html +0 -10
- nautobot/core/templates/inc/media.html +2 -0
- nautobot/core/templates/inc/nav_menu.html +66 -68
- nautobot/core/templates/inc/object_details_advanced_panel.html +19 -0
- nautobot/core/templates/nautobot_config.py.j2 +10 -4
- nautobot/core/templates/panel_table.html +1 -1
- nautobot/core/templates/template.css +89 -0
- nautobot/core/templates/utilities/templatetags/table_config_form.html +1 -0
- nautobot/core/templatetags/buttons.py +7 -2
- nautobot/core/templatetags/helpers.py +9 -9
- nautobot/core/testing/views.py +34 -4
- nautobot/core/tests/integration/test_home.py +1 -43
- nautobot/core/tests/integration/test_navbar.py +10 -64
- nautobot/core/tests/integration/test_plugin_home.py +4 -5
- nautobot/core/tests/integration/test_plugin_navbar.py +20 -16
- nautobot/core/tests/integration/test_theme.py +4 -0
- nautobot/core/tests/test_api.py +14 -66
- nautobot/core/tests/test_filters.py +127 -0
- nautobot/core/tests/test_forms.py +4 -4
- nautobot/core/tests/test_graphql.py +165 -2
- nautobot/core/tests/test_jobs.py +112 -0
- nautobot/core/tests/test_openapi.py +6 -0
- nautobot/core/tests/test_utils.py +23 -20
- nautobot/core/tests/test_views.py +11 -85
- nautobot/core/urls.py +6 -1
- nautobot/core/utils/data.py +5 -1
- nautobot/core/utils/filtering.py +6 -4
- nautobot/core/utils/lookup.py +28 -0
- nautobot/core/utils/requests.py +2 -3
- nautobot/core/views/__init__.py +3 -4
- nautobot/core/views/generic.py +15 -11
- nautobot/core/views/mixins.py +9 -8
- nautobot/core/views/renderers.py +5 -0
- nautobot/core/views/utils.py +23 -24
- nautobot/dcim/api/serializers.py +8 -4
- nautobot/dcim/models/device_components.py +1 -0
- nautobot/dcim/models/devices.py +7 -6
- nautobot/dcim/navigation.py +10 -165
- nautobot/dcim/templates/dcim/location.html +1 -1
- nautobot/dcim/tests/features/locations.feature +143 -0
- nautobot/dcim/tests/test_api.py +8 -1
- nautobot/dcim/tests/test_filters.py +11 -3
- nautobot/dcim/views.py +5 -6
- nautobot/extras/admin.py +1 -1
- nautobot/extras/api/serializers.py +33 -0
- nautobot/extras/api/urls.py +6 -0
- nautobot/extras/api/views.py +45 -6
- nautobot/extras/context_managers.py +34 -8
- nautobot/extras/factory.py +28 -2
- nautobot/extras/filters/__init__.py +52 -0
- nautobot/extras/filters/mixins.py +4 -29
- nautobot/extras/forms/forms.py +43 -0
- nautobot/extras/jobs.py +39 -17
- nautobot/extras/migrations/0100_fileproxy_job_result.py +32 -0
- nautobot/extras/migrations/0101_externalintegration.py +61 -0
- nautobot/extras/migrations/0102_set_null_objectchange_contenttype.py +32 -0
- nautobot/extras/models/__init__.py +2 -0
- nautobot/extras/models/change_logging.py +2 -2
- nautobot/extras/models/customfields.py +2 -2
- nautobot/extras/models/models.py +101 -18
- nautobot/extras/models/relationships.py +13 -8
- nautobot/extras/navigation.py +17 -29
- nautobot/extras/signals.py +80 -59
- nautobot/extras/tables.py +28 -2
- nautobot/extras/templates/extras/externalintegration_retrieve.html +37 -0
- nautobot/extras/templates/extras/inc/jobresult.html +24 -0
- nautobot/extras/templates/extras/jobresult.html +24 -0
- nautobot/extras/templatetags/computed_fields.py +6 -13
- nautobot/extras/templatetags/custom_links.py +19 -12
- nautobot/extras/templatetags/job_buttons.py +34 -19
- nautobot/extras/templatetags/plugins.py +1 -1
- nautobot/extras/test_jobs/file_output.py +16 -0
- nautobot/extras/tests/test_api.py +92 -0
- nautobot/extras/tests/test_context_managers.py +94 -4
- nautobot/extras/tests/test_customfields.py +1 -1
- nautobot/extras/tests/test_filters.py +64 -2
- nautobot/extras/tests/test_jobs.py +75 -22
- nautobot/extras/tests/test_models.py +34 -0
- nautobot/extras/tests/test_relationships.py +2 -2
- nautobot/extras/tests/test_views.py +204 -4
- nautobot/extras/tests/test_webhooks.py +61 -25
- nautobot/extras/urls.py +1 -0
- nautobot/extras/views.py +27 -13
- nautobot/extras/webhooks.py +16 -25
- nautobot/ipam/fields.py +5 -0
- nautobot/ipam/forms.py +16 -0
- nautobot/ipam/models.py +13 -2
- nautobot/ipam/navigation.py +2 -59
- nautobot/ipam/tables.py +1 -1
- nautobot/ipam/templates/ipam/ipaddress.html +0 -9
- nautobot/ipam/templates/ipam/prefix.html +0 -9
- nautobot/ipam/tests/features/prefixes.feature +134 -0
- nautobot/ipam/tests/test_filters.py +5 -10
- nautobot/ipam/tests/test_models.py +7 -0
- nautobot/ipam/tests/test_views.py +8 -1
- nautobot/ipam/views.py +99 -58
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +191 -191
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +874 -881
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
- nautobot/project-static/css/base.css +138 -99
- nautobot/project-static/css/dark.css +65 -6
- nautobot/project-static/docs/404.html +45 -17
- nautobot/project-static/docs/apps/index.html +45 -17
- nautobot/project-static/docs/apps/nautobot-apps.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1598 -1458
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +229 -152
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +46 -18
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +354 -433
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +67 -39
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2083 -2234
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +1389 -1247
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +129 -111
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3601 -3457
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +45 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +320 -284
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +3863 -3801
- nautobot/project-static/docs/development/apps/api/configuration-view.html +45 -17
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +45 -17
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +45 -17
- nautobot/project-static/docs/development/apps/api/models/global-search.html +45 -17
- nautobot/project-static/docs/development/apps/api/models/graphql.html +45 -17
- nautobot/project-static/docs/development/apps/api/models/index.html +45 -17
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +45 -17
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +45 -17
- nautobot/project-static/docs/development/apps/api/prometheus.html +45 -17
- nautobot/project-static/docs/development/apps/api/setup.html +45 -17
- nautobot/project-static/docs/development/apps/api/testing.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +45 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/base-template.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/index.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/notes.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/urls.html +45 -17
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +45 -17
- nautobot/project-static/docs/development/apps/index.html +45 -17
- nautobot/project-static/docs/development/apps/migration/code-updates.html +45 -17
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +45 -17
- nautobot/project-static/docs/development/apps/migration/from-v1.html +45 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +45 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +45 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +45 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +45 -17
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +45 -17
- nautobot/project-static/docs/development/core/application-registry.html +45 -17
- nautobot/project-static/docs/development/core/best-practices.html +45 -17
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +45 -17
- nautobot/project-static/docs/development/core/extending-models.html +45 -17
- nautobot/project-static/docs/development/core/generic-views.html +45 -17
- nautobot/project-static/docs/development/core/getting-started.html +45 -17
- nautobot/project-static/docs/development/core/homepage.html +45 -17
- nautobot/project-static/docs/development/core/index.html +45 -17
- nautobot/project-static/docs/development/core/model-features.html +45 -17
- nautobot/project-static/docs/development/core/natural-keys.html +45 -17
- nautobot/project-static/docs/development/core/navigation-menu.html +45 -22
- nautobot/project-static/docs/development/core/react-ui.html +45 -17
- nautobot/project-static/docs/development/core/release-checklist.html +46 -18
- nautobot/project-static/docs/development/core/role-internals.html +45 -17
- nautobot/project-static/docs/development/core/style-guide.html +45 -17
- nautobot/project-static/docs/development/core/templates.html +45 -17
- nautobot/project-static/docs/development/core/testing.html +45 -17
- nautobot/project-static/docs/development/core/user-preferences.html +45 -17
- nautobot/project-static/docs/development/index.html +45 -17
- nautobot/project-static/docs/development/jobs/index.html +281 -235
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +45 -17
- nautobot/project-static/docs/index.html +45 -17
- nautobot/project-static/docs/media/nautobot_application_stack_low_level.png +0 -0
- nautobot/project-static/docs/media/nautobot_application_stack_low_level.txt +1 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +48 -20
- nautobot/project-static/docs/release-notes/version-1.0.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.1.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.2.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.3.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.4.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.5.html +45 -17
- nautobot/project-static/docs/release-notes/version-1.6.html +46 -18
- nautobot/project-static/docs/release-notes/version-2.0.html +372 -199
- nautobot/project-static/docs/release-notes/version-2.1.html +5724 -0
- nautobot/project-static/docs/requirements.txt +1 -1
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +247 -237
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +45 -17
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +45 -17
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +45 -17
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +45 -17
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +45 -17
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +110 -44
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +48 -20
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +45 -17
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +49 -20
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/index.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +45 -17
- nautobot/project-static/docs/user-guide/administration/installation/services.html +45 -17
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +45 -17
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +45 -17
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +45 -17
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +45 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +45 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +45 -17
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +45 -17
- nautobot/project-static/docs/user-guide/index.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +111 -17
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +48 -20
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +5359 -0
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +48 -20
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +114 -45
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +45 -17
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +45 -17
- nautobot/project-static/fonts/UFL.txt +96 -0
- nautobot/project-static/fonts/Ubuntu-Bold.woff2 +0 -0
- nautobot/project-static/fonts/Ubuntu-BoldItalic.woff2 +0 -0
- nautobot/project-static/fonts/Ubuntu-Italic.woff2 +0 -0
- nautobot/project-static/fonts/Ubuntu-Medium.woff2 +0 -0
- nautobot/project-static/fonts/Ubuntu-MediumItalic.woff2 +0 -0
- nautobot/project-static/fonts/Ubuntu-Regular.woff2 +0 -0
- nautobot/project-static/fonts/UbuntuMono-Bold.woff2 +0 -0
- nautobot/project-static/fonts/UbuntuMono-BoldItalic.woff2 +0 -0
- nautobot/project-static/fonts/UbuntuMono-Italic.woff2 +0 -0
- nautobot/project-static/fonts/UbuntuMono-Regular.woff2 +0 -0
- nautobot/project-static/img/dark-theme.png +0 -0
- nautobot/project-static/img/light-theme.png +0 -0
- nautobot/project-static/img/nautobot_chevron.svg +5 -0
- nautobot/project-static/img/nautobot_chevron_header.svg +5 -0
- nautobot/project-static/img/system-theme.png +0 -0
- nautobot/tenancy/navigation.py +0 -13
- nautobot/ui/package-lock.json +2 -2
- nautobot/ui/package.json +1 -1
- nautobot/users/admin.py +44 -0
- nautobot/users/migrations/0007_alter_objectpermission_object_types.py +33 -0
- nautobot/users/models.py +3 -2
- nautobot/virtualization/navigation.py +1 -33
- nautobot/virtualization/tests/test_api.py +1 -1
- nautobot/virtualization/tests/test_filters.py +1 -1
- {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/METADATA +2 -2
- {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/RECORD +405 -786
- CHANGELOG.md +0 -3
- CONTRIBUTING.md +0 -3
- NOTICE +0 -8
- nautobot/docs/apps/index.md +0 -22
- nautobot/docs/apps/nautobot-apps.md +0 -10
- nautobot/docs/assets/app-icons/icon-ChatOps.png +0 -0
- nautobot/docs/assets/app-icons/icon-DataValidationEngine.png +0 -0
- nautobot/docs/assets/app-icons/icon-DeviceLifecycle.png +0 -0
- nautobot/docs/assets/app-icons/icon-DeviceOnboarding.png +0 -0
- nautobot/docs/assets/app-icons/icon-FirewallModels.png +0 -0
- nautobot/docs/assets/app-icons/icon-GoldenConfiguration.png +0 -0
- nautobot/docs/assets/app-icons/icon-NautobotPluginNornir.png +0 -0
- nautobot/docs/assets/app-icons/icon-SSoT.png +0 -0
- nautobot/docs/assets/extra.css +0 -139
- nautobot/docs/assets/favicon.ico +0 -0
- nautobot/docs/assets/nautobot_logo.png +0 -0
- nautobot/docs/assets/nautobot_logo.svg +0 -131
- nautobot/docs/assets/networktocode_bw.png +0 -0
- nautobot/docs/assets/overrides/partials/copyright.html +0 -20
- nautobot/docs/development/apps/api/configuration-view.md +0 -35
- nautobot/docs/development/apps/api/database-backend-config.md +0 -26
- nautobot/docs/development/apps/api/models/django-admin.md +0 -20
- nautobot/docs/development/apps/api/models/global-search.md +0 -11
- nautobot/docs/development/apps/api/models/graphql.md +0 -97
- nautobot/docs/development/apps/api/models/index.md +0 -81
- nautobot/docs/development/apps/api/nautobot-app-config.md +0 -84
- nautobot/docs/development/apps/api/platform-features/custom-validators.md +0 -30
- nautobot/docs/development/apps/api/platform-features/filter-extensions.md +0 -49
- nautobot/docs/development/apps/api/platform-features/git-repository-content.md +0 -62
- nautobot/docs/development/apps/api/platform-features/index.md +0 -1
- nautobot/docs/development/apps/api/platform-features/jinja2-filters.md +0 -28
- nautobot/docs/development/apps/api/platform-features/jobs.md +0 -29
- nautobot/docs/development/apps/api/platform-features/populating-extensibility-features.md +0 -58
- nautobot/docs/development/apps/api/platform-features/secrets-providers.md +0 -64
- nautobot/docs/development/apps/api/platform-features/uniquely-identify-objects.md +0 -63
- nautobot/docs/development/apps/api/prometheus.md +0 -25
- nautobot/docs/development/apps/api/setup.md +0 -132
- nautobot/docs/development/apps/api/testing.md +0 -55
- nautobot/docs/development/apps/api/ui-extensions/banners.md +0 -26
- nautobot/docs/development/apps/api/ui-extensions/home-page.md +0 -9
- nautobot/docs/development/apps/api/ui-extensions/index.md +0 -1
- nautobot/docs/development/apps/api/ui-extensions/navigation.md +0 -15
- nautobot/docs/development/apps/api/ui-extensions/object-detail-views.md +0 -74
- nautobot/docs/development/apps/api/ui-extensions/tabs.md +0 -52
- nautobot/docs/development/apps/api/views/base-template.md +0 -38
- nautobot/docs/development/apps/api/views/core-view-overrides.md +0 -26
- nautobot/docs/development/apps/api/views/django-generic-views.md +0 -23
- nautobot/docs/development/apps/api/views/help-documentation.md +0 -16
- nautobot/docs/development/apps/api/views/index.md +0 -3
- nautobot/docs/development/apps/api/views/nautobot-generic-views.md +0 -35
- nautobot/docs/development/apps/api/views/nautobotuiviewset.md +0 -147
- nautobot/docs/development/apps/api/views/nautobotuiviewsetrouter.md +0 -41
- nautobot/docs/development/apps/api/views/notes.md +0 -25
- nautobot/docs/development/apps/api/views/rest-api.md +0 -64
- nautobot/docs/development/apps/api/views/urls.md +0 -26
- nautobot/docs/development/apps/api/views/view-overrides.md +0 -50
- nautobot/docs/development/apps/index.md +0 -75
- nautobot/docs/development/apps/migration/code-updates.md +0 -160
- nautobot/docs/development/apps/migration/dependency-updates.md +0 -13
- nautobot/docs/development/apps/migration/from-v1.md +0 -56
- nautobot/docs/development/apps/migration/model-updates/dcim.md +0 -285
- nautobot/docs/development/apps/migration/model-updates/extras.md +0 -30
- nautobot/docs/development/apps/migration/model-updates/global.md +0 -5
- nautobot/docs/development/apps/migration/model-updates/ipam.md +0 -22
- nautobot/docs/development/apps/porting-from-netbox.md +0 -23
- nautobot/docs/development/core/application-registry.md +0 -216
- nautobot/docs/development/core/best-practices.md +0 -469
- nautobot/docs/development/core/docker-compose-advanced-use-cases.md +0 -228
- nautobot/docs/development/core/extending-models.md +0 -93
- nautobot/docs/development/core/generic-views.md +0 -65
- nautobot/docs/development/core/getting-started.md +0 -859
- nautobot/docs/development/core/homepage.md +0 -63
- nautobot/docs/development/core/index.md +0 -334
- nautobot/docs/development/core/model-features.md +0 -44
- nautobot/docs/development/core/natural-keys.md +0 -121
- nautobot/docs/development/core/navigation-menu.md +0 -142
- nautobot/docs/development/core/react-ui.md +0 -137
- nautobot/docs/development/core/release-checklist.md +0 -312
- nautobot/docs/development/core/role-internals.md +0 -28
- nautobot/docs/development/core/style-guide.md +0 -200
- nautobot/docs/development/core/templates.md +0 -101
- nautobot/docs/development/core/testing.md +0 -238
- nautobot/docs/development/core/user-preferences.md +0 -11
- nautobot/docs/development/index.md +0 -1
- nautobot/docs/development/jobs/index.md +0 -835
- nautobot/docs/development/jobs/migration/from-v1.md +0 -160
- nautobot/docs/generate_code_reference_pages.py +0 -20
- nautobot/docs/img/edge_dev_circuit_relationship.png +0 -0
- nautobot/docs/img/leaf_dev_no_circuit_relationship.png +0 -0
- nautobot/docs/img/relationship_w_json_filter.png +0 -0
- nautobot/docs/index.md +0 -105
- nautobot/docs/media/admin_ui_run_permission.png +0 -0
- nautobot/docs/media/development/homepage_changelog_panel.png +0 -0
- nautobot/docs/media/development/homepage_dcim_panel.png +0 -0
- nautobot/docs/media/development/index_bug_wf.jpg +0 -0
- nautobot/docs/media/development/index_feature_request_wf.jpg +0 -0
- nautobot/docs/media/development/index_release_cadence.drawio +0 -90
- nautobot/docs/media/development/index_release_cadence.jpg +0 -0
- nautobot/docs/media/installation/nautobot_ui_admin.png +0 -0
- nautobot/docs/media/installation/nautobot_ui_guest.png +0 -0
- nautobot/docs/media/models/dcim_cable_trace.png +0 -0
- nautobot/docs/media/models/dcim_cable_trace_circuit.png +0 -0
- nautobot/docs/media/models/dynamicgroup_filtering_01.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_01.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_02.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_03.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_04.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_1_05.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_01.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_02.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_03.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_04.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_05.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_06.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_advanced_2_07.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_basic_01.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_basic_02.png +0 -0
- nautobot/docs/media/models/dynamicgroup_workflow_basic_03.png +0 -0
- nautobot/docs/media/models/jobbutton_form.png +0 -0
- nautobot/docs/media/models/site_jobbuttons.png +0 -0
- nautobot/docs/media/nautobot_application_stack_high_level.drawio +0 -1
- nautobot/docs/media/nautobot_application_stack_high_level.png +0 -0
- nautobot/docs/media/nautobot_application_stack_low_level.drawio +0 -1
- nautobot/docs/media/nautobot_application_stack_low_level.png +0 -0
- nautobot/docs/media/nautobot_chatops.gif +0 -0
- nautobot/docs/media/nautobot_config_context.gif +0 -0
- nautobot/docs/media/nautobot_golden_config.gif +0 -0
- nautobot/docs/media/nautobot_graphql.gif +0 -0
- nautobot/docs/media/nautobot_mainpage.gif +0 -0
- nautobot/docs/media/nautobot_prefix_hierarchy.gif +0 -0
- nautobot/docs/media/plugins/plugin_admin_config.png +0 -0
- nautobot/docs/media/plugins/plugin_admin_ui.png +0 -0
- nautobot/docs/media/plugins/plugin_rest_api_endpoint.png +0 -0
- nautobot/docs/media/power_distribution.png +0 -0
- nautobot/docs/media/ss_config_contexts.png +0 -0
- nautobot/docs/media/ss_graphiql.png +0 -0
- nautobot/docs/media/ss_main_page.png +0 -0
- nautobot/docs/media/ss_plugin_chatops.png +0 -0
- nautobot/docs/media/ss_plugin_golden_config.png +0 -0
- nautobot/docs/media/ss_prefix_hierarchy.png +0 -0
- nautobot/docs/media/user-guide/administration/guides/s3-django-storage/user-guide-s3-1.png +0 -0
- nautobot/docs/media/user-guide/administration/guides/s3-django-storage/user-guide-s3-2.png +0 -0
- nautobot/docs/media/user-guide/administration/upgrading/from-v1/ipam/tenant-affinity.png +0 -0
- nautobot/docs/nautobot_logo.png +0 -0
- nautobot/docs/nautobot_logo.svg +0 -131
- nautobot/docs/release-notes/index.md +0 -3
- nautobot/docs/release-notes/version-1.0.md +0 -530
- nautobot/docs/release-notes/version-1.1.md +0 -337
- nautobot/docs/release-notes/version-1.2.md +0 -509
- nautobot/docs/release-notes/version-1.3.md +0 -554
- nautobot/docs/release-notes/version-1.4.md +0 -677
- nautobot/docs/release-notes/version-1.5.md +0 -840
- nautobot/docs/release-notes/version-1.6.md +0 -290
- nautobot/docs/release-notes/version-2.0.md +0 -1359
- nautobot/docs/requirements.txt +0 -12
- nautobot/docs/user-guide/administration/configuration/authentication/ldap.md +0 -286
- nautobot/docs/user-guide/administration/configuration/authentication/remote.md +0 -46
- nautobot/docs/user-guide/administration/configuration/authentication/sso.md +0 -528
- nautobot/docs/user-guide/administration/configuration/index.md +0 -190
- nautobot/docs/user-guide/administration/configuration/node-configuration.md +0 -31
- nautobot/docs/user-guide/administration/configuration/optional-settings.md +0 -1302
- nautobot/docs/user-guide/administration/configuration/required-settings.md +0 -244
- nautobot/docs/user-guide/administration/guides/caching.md +0 -108
- nautobot/docs/user-guide/administration/guides/celery-queues.md +0 -42
- nautobot/docs/user-guide/administration/guides/healthcheck.md +0 -11
- nautobot/docs/user-guide/administration/guides/permissions.md +0 -98
- nautobot/docs/user-guide/administration/guides/prometheus-metrics.md +0 -55
- nautobot/docs/user-guide/administration/guides/replicating-nautobot.md +0 -70
- nautobot/docs/user-guide/administration/guides/s3-django-storage.md +0 -145
- nautobot/docs/user-guide/administration/installation/app-install.md +0 -94
- nautobot/docs/user-guide/administration/installation/docker.md +0 -286
- nautobot/docs/user-guide/administration/installation/external-authentication.md +0 -9
- nautobot/docs/user-guide/administration/installation/http-server.md +0 -279
- nautobot/docs/user-guide/administration/installation/index.md +0 -101
- nautobot/docs/user-guide/administration/installation/install_system.md +0 -493
- nautobot/docs/user-guide/administration/installation/nautobot.md +0 -367
- nautobot/docs/user-guide/administration/installation/selinux-troubleshooting.md +0 -194
- nautobot/docs/user-guide/administration/installation/services.md +0 -340
- nautobot/docs/user-guide/administration/migration/migrating-from-netbox.md +0 -336
- nautobot/docs/user-guide/administration/migration/migrating-from-postgresql.md +0 -122
- nautobot/docs/user-guide/administration/tools/nautobot-server.md +0 -858
- nautobot/docs/user-guide/administration/tools/nautobot-shell.md +0 -263
- nautobot/docs/user-guide/administration/upgrading/database-backup.md +0 -11
- nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.md +0 -55
- nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.md +0 -73
- nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.md +0 -211
- nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/index.md +0 -16
- nautobot/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.md +0 -157
- nautobot/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.md +0 -153
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-behavior-changes.yaml +0 -82
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-removed-fields.yaml +0 -175
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-api-renamed-fields.yaml +0 -124
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-location-changes.yaml +0 -241
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-removals.yaml +0 -57
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-renames.yaml +0 -5
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-behavior-changes.yaml +0 -76
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-removed-fields.yaml +0 -202
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-database-renamed-fields.yaml +0 -343
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-corrected-fields.yaml +0 -31
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-enhanced-fields.yaml +0 -244
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-removed-fields.yaml +0 -595
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-filters-renamed-fields.yaml +0 -253
- nautobot/docs/user-guide/administration/upgrading/from-v1/tables/v2-logging-renamed-loggers.yaml +0 -23
- nautobot/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.md +0 -574
- nautobot/docs/user-guide/administration/upgrading/upgrading.md +0 -127
- nautobot/docs/user-guide/core-data-model/circuits/circuit.md +0 -19
- nautobot/docs/user-guide/core-data-model/circuits/circuittermination.md +0 -10
- nautobot/docs/user-guide/core-data-model/circuits/circuittype.md +0 -8
- nautobot/docs/user-guide/core-data-model/circuits/provider.md +0 -5
- nautobot/docs/user-guide/core-data-model/circuits/providernetwork.md +0 -7
- nautobot/docs/user-guide/core-data-model/dcim/cable.md +0 -43
- nautobot/docs/user-guide/core-data-model/dcim/consoleport.md +0 -8
- nautobot/docs/user-guide/core-data-model/dcim/consoleporttemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/consoleserverport.md +0 -8
- nautobot/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/device.md +0 -29
- nautobot/docs/user-guide/core-data-model/dcim/devicebay.md +0 -11
- nautobot/docs/user-guide/core-data-model/dcim/devicebaytemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/deviceredundancygroup.md +0 -279
- nautobot/docs/user-guide/core-data-model/dcim/devicetype.md +0 -44
- nautobot/docs/user-guide/core-data-model/dcim/frontport.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/frontporttemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/interface.md +0 -34
- nautobot/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.md +0 -24
- nautobot/docs/user-guide/core-data-model/dcim/interfacetemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/inventoryitem.md +0 -10
- nautobot/docs/user-guide/core-data-model/dcim/location.md +0 -15
- nautobot/docs/user-guide/core-data-model/dcim/locationtype.md +0 -43
- nautobot/docs/user-guide/core-data-model/dcim/manufacturer.md +0 -3
- nautobot/docs/user-guide/core-data-model/dcim/platform.md +0 -19
- nautobot/docs/user-guide/core-data-model/dcim/powerfeed.md +0 -25
- nautobot/docs/user-guide/core-data-model/dcim/poweroutlet.md +0 -14
- nautobot/docs/user-guide/core-data-model/dcim/poweroutlettemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/powerpanel.md +0 -12
- nautobot/docs/user-guide/core-data-model/dcim/powerport.md +0 -15
- nautobot/docs/user-guide/core-data-model/dcim/powerporttemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/rack.md +0 -41
- nautobot/docs/user-guide/core-data-model/dcim/rackgroup.md +0 -7
- nautobot/docs/user-guide/core-data-model/dcim/rackreservation.md +0 -3
- nautobot/docs/user-guide/core-data-model/dcim/rearport.md +0 -9
- nautobot/docs/user-guide/core-data-model/dcim/rearporttemplate.md +0 -6
- nautobot/docs/user-guide/core-data-model/dcim/virtualchassis.md +0 -8
- nautobot/docs/user-guide/core-data-model/extras/configcontext.md +0 -78
- nautobot/docs/user-guide/core-data-model/extras/configcontextschema.md +0 -73
- nautobot/docs/user-guide/core-data-model/ipam/ipaddress.md +0 -69
- nautobot/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio +0 -1
- nautobot/docs/user-guide/core-data-model/ipam/media/ipam_namespace_documentation.drawio.svg +0 -4
- nautobot/docs/user-guide/core-data-model/ipam/namespace.md +0 -18
- nautobot/docs/user-guide/core-data-model/ipam/prefix.md +0 -65
- nautobot/docs/user-guide/core-data-model/ipam/rir.md +0 -10
- nautobot/docs/user-guide/core-data-model/ipam/routetarget.md +0 -5
- nautobot/docs/user-guide/core-data-model/ipam/service.md +0 -8
- nautobot/docs/user-guide/core-data-model/ipam/vlan.md +0 -17
- nautobot/docs/user-guide/core-data-model/ipam/vlangroup.md +0 -5
- nautobot/docs/user-guide/core-data-model/ipam/vrf.md +0 -15
- nautobot/docs/user-guide/core-data-model/tenancy/tenant.md +0 -20
- nautobot/docs/user-guide/core-data-model/tenancy/tenantgroup.md +0 -5
- nautobot/docs/user-guide/core-data-model/virtualization/cluster.md +0 -5
- nautobot/docs/user-guide/core-data-model/virtualization/clustergroup.md +0 -3
- nautobot/docs/user-guide/core-data-model/virtualization/clustertype.md +0 -3
- nautobot/docs/user-guide/core-data-model/virtualization/virtualmachine.md +0 -17
- nautobot/docs/user-guide/core-data-model/virtualization/vminterface.md +0 -19
- nautobot/docs/user-guide/feature-guides/custom-fields.md +0 -350
- nautobot/docs/user-guide/feature-guides/getting-started/creating-devices.md +0 -130
- nautobot/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.md +0 -113
- nautobot/docs/user-guide/feature-guides/getting-started/index.md +0 -29
- nautobot/docs/user-guide/feature-guides/getting-started/interfaces.md +0 -100
- nautobot/docs/user-guide/feature-guides/getting-started/ipam.md +0 -104
- nautobot/docs/user-guide/feature-guides/getting-started/platforms.md +0 -78
- nautobot/docs/user-guide/feature-guides/getting-started/search-bar.md +0 -40
- nautobot/docs/user-guide/feature-guides/getting-started/tenants.md +0 -40
- nautobot/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.md +0 -87
- nautobot/docs/user-guide/feature-guides/git-data-source.md +0 -307
- nautobot/docs/user-guide/feature-guides/graphql.md +0 -342
- nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_choices.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_grouped.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_detail_label.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_edit.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/custom-fields/custom_field_select.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/1-create-location-type.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/10-add-platform.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/11-platforms-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/12-add-tenant.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/13-assign-tenant-to-device.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/14-assign-tenant-to-device-2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/15-create-device-type.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/16-interface-templates.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/17-templated-interfaces.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/18-assign-device-type.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/19-edit-ints-for-lag.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/2-create-manufacturer.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/20-ints-int-lag.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/21-device-type.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/22-create-vlans.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/23-create-vlans-2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/24-vlan-main-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/25-add-vlan-to-interface.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/26-add-vlan-to-interface-2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/27-add-rir.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/3-create-role.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/30-add-prefix.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/32-add-ip-addr.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/33-assign-address.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/34-assign-address-2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/35-assign-address-3.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/36-verify-address.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/37-verify-prefix.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/38-verify-prefix2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/39-address-search.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/4-create-device-type.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/40-addr-main-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/41-device-search-results.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/42-address-search-v2.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/43-get-to-device-main-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/44-add-platform.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/5-create-device.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/6-create-location.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/7-location-type-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/getting-started-nautobot-ui/8-location-page.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/01-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/02-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/03-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/04-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/05-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/06-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/07-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/08-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/09-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/10-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/11-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/12-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/13-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/14-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/15-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/16-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/17-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/git-as-data-source/18-git-data-source.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/00-graphiql.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/01-graphiql-explorer.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/02-graphiql-explorer-device-query.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/03-graphiql-explorer-device-attributes.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/04-graphql-query-01.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/05-graphiql-autocomplete.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/06-graphql-query-02.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/07-graphql-query-03.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/08-graphql-query-04.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/09-graphql-query-05.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/10-graphql-swagger.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/graphql/11-graphql-query-06.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/ip_merge_button.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_button.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/merge_view.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/no_more_dup_ips.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/skip_button.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/ip-address-merge-tool/unselect_ips.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/01-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/02-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/03-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/04-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/05-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/06-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/07-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/08-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/09-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/10-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/images/relationships/11-relationships.png +0 -0
- nautobot/docs/user-guide/feature-guides/ip-address-merge-tool.md +0 -63
- nautobot/docs/user-guide/feature-guides/relationships.md +0 -125
- nautobot/docs/user-guide/index.md +0 -1
- nautobot/docs/user-guide/platform-functionality/change-logging.md +0 -21
- nautobot/docs/user-guide/platform-functionality/computedfield.md +0 -89
- nautobot/docs/user-guide/platform-functionality/customfield.md +0 -123
- nautobot/docs/user-guide/platform-functionality/customlink.md +0 -59
- nautobot/docs/user-guide/platform-functionality/dynamicgroup.md +0 -660
- nautobot/docs/user-guide/platform-functionality/exporttemplate.md +0 -55
- nautobot/docs/user-guide/platform-functionality/gitrepository.md +0 -353
- nautobot/docs/user-guide/platform-functionality/graphql.md +0 -259
- nautobot/docs/user-guide/platform-functionality/graphqlquery.md +0 -28
- nautobot/docs/user-guide/platform-functionality/imageattachment.md +0 -10
- nautobot/docs/user-guide/platform-functionality/jobs/index.md +0 -193
- nautobot/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.md +0 -78
- nautobot/docs/user-guide/platform-functionality/jobs/jobbutton.md +0 -79
- nautobot/docs/user-guide/platform-functionality/jobs/jobhook.md +0 -15
- nautobot/docs/user-guide/platform-functionality/jobs/models.md +0 -65
- nautobot/docs/user-guide/platform-functionality/napalm.md +0 -85
- nautobot/docs/user-guide/platform-functionality/note.md +0 -7
- nautobot/docs/user-guide/platform-functionality/relationship.md +0 -158
- nautobot/docs/user-guide/platform-functionality/rest-api/authentication.md +0 -67
- nautobot/docs/user-guide/platform-functionality/rest-api/filtering.md +0 -142
- nautobot/docs/user-guide/platform-functionality/rest-api/overview.md +0 -1045
- nautobot/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.md +0 -9
- nautobot/docs/user-guide/platform-functionality/role.md +0 -17
- nautobot/docs/user-guide/platform-functionality/secret.md +0 -136
- nautobot/docs/user-guide/platform-functionality/status.md +0 -92
- nautobot/docs/user-guide/platform-functionality/tag.md +0 -62
- nautobot/docs/user-guide/platform-functionality/template-filters.md +0 -306
- nautobot/docs/user-guide/platform-functionality/users/objectpermission.md +0 -56
- nautobot/docs/user-guide/platform-functionality/users/token.md +0 -21
- nautobot/docs/user-guide/platform-functionality/webhook.md +0 -137
- nautobot/project-static/docs/media/nautobot_application_stack_low_level.drawio +0 -1
- nautobot/project-static/docs/media/nautobot_chatops.gif +0 -0
- nautobot/project-static/docs/media/nautobot_config_context.gif +0 -0
- nautobot/project-static/docs/media/nautobot_golden_config.gif +0 -0
- nautobot/project-static/docs/media/nautobot_graphql.gif +0 -0
- nautobot/project-static/docs/media/nautobot_mainpage.gif +0 -0
- nautobot/project-static/docs/media/nautobot_prefix_hierarchy.gif +0 -0
- nautobot-2.0.4.dist-info/LICENSE.txt +0 -177
- /LICENSE.txt → /nautobot-2.1.0b1.dist-info/LICENSE.txt +0 -0
- {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/WHEEL +0 -0
- {nautobot-2.0.4.dist-info → nautobot-2.1.0b1.dist-info}/entry_points.txt +0 -0
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Populating the Home Page
|
|
2
|
-
|
|
3
|
-
+++ 1.2.0
|
|
4
|
-
|
|
5
|
-
Both core applications and plugins can contribute items to the Nautobot home page by defining `layout` inside of their app's `homepage.py`. Using a key and weight system, a developer can integrate amongst existing home page panels or can create entirely new panels as desired.
|
|
6
|
-
|
|
7
|
-
## Adding a new Home Page Panel
|
|
8
|
-
|
|
9
|
-
Each panel on the home page is defined by a `HomePagePanel` object. A `HomePagePanel` may contain either or both of `HomePageItem` and/or `HomePageGroup` objects, or may define custom content via a referenced Django template. A `HomePageGroup` may itself contain `HomePageItem` objects as well, and individual `HomePageItem` objects may also reference custom Django templates.
|
|
10
|
-
|
|
11
|
-
Some examples:
|
|
12
|
-
|
|
13
|
-

|
|
14
|
-
|
|
15
|
-
This is a single `HomePagePanel` (defined in `nautobot/dcim/homepage.py`) containing four `HomePageItem` and one `HomePageGroup` (the `Connections` group, which in turn contains four more `HomePageItem`). Using these objects together allows you to create panels that match the visual style of most other panels on the Nautobot home page.
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
This is a `HomePagePanel` (defined in `nautobot/extras/homepage.py`) that uses a custom template to render content that doesn't fit into the `HomePageGroup`/`HomePageItem` pattern.
|
|
20
|
-
|
|
21
|
-
The position of a panel in the home page is defined by its `weight`. The lower the weight the closer to the start (top/left) of the home page the object will be. All core objects have weights in multiples of 100, meaning there is plenty of space around the objects for plugins to customize.
|
|
22
|
-
|
|
23
|
-
In the below code example, you can see that the `Example Plugin` panel has a `weight` value of `150`. This means it will appear between `Organization` (weight `100`) and `DCIM` (weight `200`).
|
|
24
|
-
|
|
25
|
-
!!! tip
|
|
26
|
-
Weights for already existing items can be found in the Nautobot source code (in `nautobot/<app>/homepage.py`) or with a web session open to your Nautobot instance, you can inspect an element of the home page using the developer tools.
|
|
27
|
-
|
|
28
|
-
Example of custom code being used in a panel can be seen in the `Custom Example Plugin` panel below. The attribute `custom_template` is used to refer to the filename of a template. Templates need to be stored in the templates `inc` folder for the plugin (`/example_plugin/templates/example_plugin/inc/`).
|
|
29
|
-
|
|
30
|
-
If additional data is needed to render the custom template, callback functions can be used to collect this data. In the below example, the `Custom Example Plugin` panel is using the callback `get_example_data()` to dynamically populate the key `example_data` into the rendering context of this panel.
|
|
31
|
-
|
|
32
|
-
``` python
|
|
33
|
-
from nautobot.core.apps import HomePageItem, HomePagePanel
|
|
34
|
-
from .models import ExampleModel
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def get_example_data(request):
|
|
38
|
-
return ExampleModel.objects.all()
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
layout = (
|
|
42
|
-
HomePagePanel(
|
|
43
|
-
name="Example Plugin",
|
|
44
|
-
weight=150,
|
|
45
|
-
items=(
|
|
46
|
-
HomePageItem(
|
|
47
|
-
name="Example Models",
|
|
48
|
-
link="plugins:example_plugin:examplemodel_list",
|
|
49
|
-
description="List example plugin models.",
|
|
50
|
-
permissions=["example_plugin.view_examplemodel"],
|
|
51
|
-
weight=100,
|
|
52
|
-
),
|
|
53
|
-
),
|
|
54
|
-
),
|
|
55
|
-
HomePagePanel(
|
|
56
|
-
name="Custom Example Plugin",
|
|
57
|
-
custom_template="panel_example_example.html",
|
|
58
|
-
custom_data={"example_data": get_example_data},
|
|
59
|
-
permissions=["example_plugin.view_examplemodel"],
|
|
60
|
-
weight=350,
|
|
61
|
-
),
|
|
62
|
-
)
|
|
63
|
-
```
|
|
@@ -1,334 +0,0 @@
|
|
|
1
|
-
# Nautobot Development
|
|
2
|
-
|
|
3
|
-
Nautobot is maintained as a [GitHub project](https://github.com/nautobot/nautobot) under the Apache 2 license. Users are encouraged to submit GitHub issues for feature requests and bug reports.
|
|
4
|
-
|
|
5
|
-
## Governance
|
|
6
|
-
|
|
7
|
-
Nautobot is a community-based Free Open Source Software (FOSS) project sponsored by [Network to Code (NTC)](https://www.networktocode.com). As a network automation solution provider, Network to Code works with its clients around the world to craft and build network automation strategies and solutions, often tightly integrated with Nautobot serving as a Source of Truth and Network Automation Platform. The direction of this project will be shaped by the community as well as by input from NTC customers; independent of where requests come from, contributors will need to follow the Contributing Guidelines.
|
|
8
|
-
|
|
9
|
-
The Nautobot Core Team is responsible for the direction and execution of the code that gets committed to the project.
|
|
10
|
-
|
|
11
|
-
## Project Structure
|
|
12
|
-
|
|
13
|
-
Nautobot components are arranged into functional subsections called _apps_ (a carryover from Django vernacular). Each app holds the models, views, and templates relevant to a particular function:
|
|
14
|
-
|
|
15
|
-
* `circuits`: Communications circuits and providers (not to be confused with power circuits)
|
|
16
|
-
* `dcim`: Datacenter infrastructure management (locations, racks, and devices)
|
|
17
|
-
* `extras`: Additional features not considered part of the core data model
|
|
18
|
-
* `ipam`: IP address management (VRFs, prefixes, IP addresses, and VLANs)
|
|
19
|
-
* `tenancy`: Tenants (such as customers) to which Nautobot objects may be assigned
|
|
20
|
-
* `users`: Authentication and user preferences
|
|
21
|
-
* `utilities`: Resources which are not user-facing (extendable classes, etc.)
|
|
22
|
-
* `virtualization`: Virtual machines and clusters
|
|
23
|
-
|
|
24
|
-
## Release Management
|
|
25
|
-
|
|
26
|
-
### Roadmap
|
|
27
|
-
|
|
28
|
-
In order to best understand how to contribute and where to open an issue or discussion, you should understand how work moves from idea to feature and how the roadmap is structured.
|
|
29
|
-
|
|
30
|
-
There are three major "buckets" of work to be aware of within the lifecycle of getting contributions committed and released:
|
|
31
|
-
|
|
32
|
-
* **Current** - Work that is planned for the release currently being developed.
|
|
33
|
-
* **Near Term** - Work that is planned for one of the next two releases after the one currently being developed.
|
|
34
|
-
* **Future** - Work that needs more discussion and/or will be planned for a version three or more releases later.
|
|
35
|
-
|
|
36
|
-
The following provides more detail on these.
|
|
37
|
-
|
|
38
|
-
#### Current
|
|
39
|
-
|
|
40
|
-
* Current tickets (GitHub issues) that are being worked on for the _current_ release or bugs that are found and will be fixed in the _current_ release.
|
|
41
|
-
* Uses `current` label on GitHub.
|
|
42
|
-
* The GitHub **Release Milestone** will track items for the _current_ release.
|
|
43
|
-
|
|
44
|
-
#### Near Term
|
|
45
|
-
|
|
46
|
-
* Current tickets (GitHub issues) that are estimated to complete in one of the next two releases, e.g. 3-6 months to get into core, if accepted.
|
|
47
|
-
* GitHub discussions are used to create one or more GitHub issues when and if something moves from _Future_ to _Near Term_.
|
|
48
|
-
* Uses `near-term` label on GitHub.
|
|
49
|
-
|
|
50
|
-
#### Future
|
|
51
|
-
|
|
52
|
-
* Work that is for 3+ releases away or work that needs more free form discussions and brainstorming to better scope future bodies of work.
|
|
53
|
-
* Estimated 7+ months to get into core, if accepted.
|
|
54
|
-
* GitHub Discussions are used for collaborating on _future_ work.
|
|
55
|
-
* If a GitHub issue is opened and is deemed that it is out of scope for _Current_ or _Near Term_, it will be converted into a GitHub Discussion.
|
|
56
|
-
* GitHub Discussions will be closed when the topic/feature moves from _Future_ to _Near Term_.
|
|
57
|
-
|
|
58
|
-
Over time, the process of moving work from _Future_ to _Near Term_ to _Current_ will continue to get further refined.
|
|
59
|
-
|
|
60
|
-
Please read through the [Nautobot Roadmap](https://www.networktocode.com/nautobot/roadmap) so you can understand the current backlog and roadmap and which items are already in _Current, Near Term, and Future_.
|
|
61
|
-
|
|
62
|
-
### Versioning
|
|
63
|
-
|
|
64
|
-
Nautobot adheres to the Semantic Versioning ("SemVer") strategy, which gives us versions of the format `X.Y.Z`.
|
|
65
|
-
|
|
66
|
-
* `X` is the major release number. Contains breaking changes or switching default behavior and shadowing legacy/deprecated behavior. May contain new functionality and bug fixes as well.
|
|
67
|
-
* `Y` is the minor release number. Contains new functionality and bug fixes. May introduce deprecation warnings but will not remove or change default behavior.
|
|
68
|
-
* `Z` is the patch release number. Will only contain bug fixes, security updates, and small feature enhancements aimed at addressing user-experience bugs.
|
|
69
|
-
|
|
70
|
-
For more information, please visit [SemVer.org](https://semver.org/).
|
|
71
|
-
|
|
72
|
-
### Release Schedule
|
|
73
|
-
|
|
74
|
-
Nautobot aims to publish against following release schedule:
|
|
75
|
-
|
|
76
|
-
* One (1) major release per year
|
|
77
|
-
* Three (3) minor releases per year
|
|
78
|
-
* At minimum one (1) patch release every two weeks or more frequently as needed.
|
|
79
|
-
|
|
80
|
-
Using `2.0` as a release cycle example, that would mean we would publish:
|
|
81
|
-
|
|
82
|
-
* `2.0.z`
|
|
83
|
-
* `2.1.z`
|
|
84
|
-
* `2.2.z`
|
|
85
|
-
* `2.3.z`
|
|
86
|
-
|
|
87
|
-
After the third minor release (`2.3.0`), we would plan for another major release, in this case `3.0.0`.
|
|
88
|
-
|
|
89
|
-
We estimate non-patch releases will be released quarterly but dates are not set in stone. Dates and notifications will occur by updating the GitHub Release Milestone and on Slack.
|
|
90
|
-
|
|
91
|
-
An example of the release timeline for the `2.0` release cycle:
|
|
92
|
-
|
|
93
|
-

|
|
94
|
-
|
|
95
|
-
#### Patch Releases
|
|
96
|
-
|
|
97
|
-
Specifics around patch releases:
|
|
98
|
-
|
|
99
|
-
* Will be released every two weeks on Mondays, starting March 7th, 2022.
|
|
100
|
-
* Will be focused on bugs, security vulnerabilities, backports, and other issues as they arise.
|
|
101
|
-
* Will not introduce significant new functionality except as needed to address a bug.
|
|
102
|
-
* Will not be released if there have been no new merges to `develop` since the previous release.
|
|
103
|
-
* Should not be considered a mandatory upgrade: If it does not fix a bug or issue you are experiencing, you should not feel the need to upgrade right away.
|
|
104
|
-
* May happen a day or two after the Monday schedule if Monday is an observed holiday. We would like to ensure full team availability post-release.
|
|
105
|
-
|
|
106
|
-
Should a patch release contain a fix for security vulnerability(s) (i.e. CVE(s)), data-loss bug(s), or other critical issue(s), we will:
|
|
107
|
-
|
|
108
|
-
* Release a new patch release as soon as the fix has been identified, implemented, and thoroughly tested. No waiting for the next regularly scheduled release date.
|
|
109
|
-
* Bring special attention to these releases in our notification channels.
|
|
110
|
-
* Strongly urge you to upgrade to address these more serious issues as soon as possible.
|
|
111
|
-
* Not adjust any subsequent release dates (the next scheduled release will still occur as scheduled).
|
|
112
|
-
|
|
113
|
-
### Maintenance Release (LTM)
|
|
114
|
-
|
|
115
|
-
#### Overview
|
|
116
|
-
|
|
117
|
-
For the sake of abundance in clarity, we are officially naming what is sometimes called an "LTS" release of software a "Maintenance" or "Long Term Maintenance" (LTM) release of Nautobot. The mindset is that we always aim to release stable software and in fact label the latest releases of the current major version of Nautobot as "stable" (as seen in our documentation and in our Docker container tags).
|
|
118
|
-
|
|
119
|
-
New users who may choose to install an "LTS" release because it is assumed to be more stable, may almost immediately be presented with breaking changes upon their next upgrade to a "stable" Nautobot release. We want to avoid any confusion that may arise between the term "stable" representing our latest stable release compared to "long term support" which is commonly interpreted to represent a stable release.
|
|
120
|
-
|
|
121
|
-
Our LTM release will be the last minor version of the previous major release train. At the time of this writing `1.6` will be our maintenance release train of Nautobot for the `1.y` release cycle. Version 1 of Nautobot had an extended release cycle as it was our first major release of the platform. Going forward it can be expected that the `x.3` version of the platform will be the maintenance train of any major version.
|
|
122
|
-
|
|
123
|
-
With this schedule you can expect a few things per major/minor release:
|
|
124
|
-
|
|
125
|
-
* `x.0.0`
|
|
126
|
-
* Introduce breaking changes.
|
|
127
|
-
* Changing default behavior for user interfaces, APIs, and functions.
|
|
128
|
-
* Removal of previous REST API versions and possibly some functions and classes.
|
|
129
|
-
* `x.1.z`
|
|
130
|
-
* Typical minor release, adding features, bug fixes, potential deprecations.
|
|
131
|
-
* `x.2.z`
|
|
132
|
-
* Removal of the remainder of deprecated functions, classes introduced in the previous major release (ex: only if deprecated in `1.y`, removed in `2.2`).
|
|
133
|
-
* `x.3.z`
|
|
134
|
-
* Maintenance release candidate.
|
|
135
|
-
* Features may be added in `x.3.0` but nothing further in this cycle.
|
|
136
|
-
|
|
137
|
-
A release will only be marked as "In Maintenance" when the next major release is published. Active bug fixes will be applied to a `x.3` until that time. Once a new major release has been published, the following will apply to the `x.3` codebase:
|
|
138
|
-
|
|
139
|
-
* Dependencies are frozen/pinned to a specific release; will only be upgraded if addressing a security vulnerability.
|
|
140
|
-
* Data loss and CVE-related fixes will be back ported from the new active release cycle. All other fixes will be back ported on a case-by-case basis.
|
|
141
|
-
* Patch releases for this phase will be on an as-needed basis.
|
|
142
|
-
* Core features from newer releases will never be back ported. In some cases, developer-centric features that ease the transition to the next major release train may be back ported if it is determined that they will alleviate transitions related to backwards incompatible changes.
|
|
143
|
-
|
|
144
|
-
A maintenance release will be actively maintained until the next maintenance release is available, roughly a year from the launch of the previous one.
|
|
145
|
-
|
|
146
|
-
#### Launch of Maintenance Release Schedule (as an Example)
|
|
147
|
-
|
|
148
|
-
At the time of this writing we are in the active development of Nautobot 1.6. This will be our last minor release of the v1 series of releases and therefore become our first "Long Term Maintenance" (LTM) release of Nautobot. We will be actively applying the normal category of bug fixes (including UI tweaks, display bugs, etc.) to this release train until the release of Nautobot 2.0.
|
|
149
|
-
|
|
150
|
-
Once we launch Nautobot 2.0, 1.6 will go into maintenance mode and be considered LTM, continuing to receive data loss and CVE-related fixes. At that time we will encourage users to migrate to v2 as they are ready. Nautobot 1.6 will continue to receive such fixes until the release of Nautobot 2.3, where we will end the maintenance of Nautobot 1.6 and it will formally become "End of Life" (EOL). Nautobot 2.3 will then become the LTM release until Nautobot 3.3 is published the following year.
|
|
151
|
-
|
|
152
|
-
If for any reason the next maintenance release is delayed, we will continue to support the current maintenance release. There is no time limitation for this. We want to ensure our users always have a maintenance release available.
|
|
153
|
-
|
|
154
|
-
### Deprecation Policy
|
|
155
|
-
|
|
156
|
-
Functionality, features, or Python primitives that have been deprecated will be planned to be removed in the following major train's `x.2` release (ex: if deprecated in `1.y`, removed in `2.2`).
|
|
157
|
-
|
|
158
|
-
To provide assistance for knowing what features and functionality have been deprecated, additional transition features are as follows:
|
|
159
|
-
|
|
160
|
-
* Python primitives that have been deprecated will emit a `DeprecationWarning`, along with a message to which objects will be replacing them. The new objects may not be a direct replacement so please check the release notes and documentation for more migration information.
|
|
161
|
-
* Nautobot 1.2 introduced REST APIs versioning. Newer versions of the API become the default behavior on a major release (`x.0.0`) and older versions will be removed. For more information, see the [Versioning section of our REST API documentation](../../user-guide/platform-functionality/rest-api/overview.md#versioning).
|
|
162
|
-
* We will drop support for Python versions on a case-by-case basis: A patch release may drop support for a Python version if a security update of a critical dependency would require split or conditional support. For example, if the dependency has not published a vulnerability fix for an older Python version, we will drop support at that time. All other cases will be documented and will tend to occur on minor release boundaries.
|
|
163
|
-
* Any deprecation notice (announcement or removal) will be available in our release notes.
|
|
164
|
-
|
|
165
|
-
!!! warning "Backwards-Incompatible Changes and Deprecations"
|
|
166
|
-
Deprecated REST APIs will be removed in a `x.0.0` release. Deprecated REST APIs are kept intact during the same major release to simplify migrations to newer minor releases, however even subtle breaking changes in an `x.0.0` release can cause breaking changes to previous API versions. Therefore it is preferred to remove these API versions entirely to prevent accidental errors when their exact behavior cannot be kept intact. Types of breaking REST API changes include, but are not limited to, renaming of fields or filters, removing or collapsing of data models, and changing object relationships. This will also mean we will not publish deprecated APIs for models that no longer exist.
|
|
167
|
-
|
|
168
|
-
For example, in the upcoming `2.0.0` release we plan to collapse `Site` and `Region` to be `LocationType`s. This means there would no longer be a `site` property on objects such as `Device` as well as no `/api/dcim/sites` or `/api/dcim/regions` API endpoints.
|
|
169
|
-
|
|
170
|
-
Previously deprecated Python APIs may still be kept around on a case-by-case basis if adapting those changes are minimal, but in the example above, `.site` will no longer be an available property on `Device`.
|
|
171
|
-
|
|
172
|
-
We will document in major releases how breaking changes will affect existing APIs and Python primitives. Backwards-compatible changes would still be kept around following the normal deprecation policy.
|
|
173
|
-
|
|
174
|
-
## Communication
|
|
175
|
-
|
|
176
|
-
Communication among the contributors should always occur via public channels. The following outlines the best ways to communicate and engage on all things Nautobot.
|
|
177
|
-
|
|
178
|
-
### Slack
|
|
179
|
-
|
|
180
|
-
* [**#nautobot** on Network to Code Slack](http://slack.networktocode.com/) - Good for quick chats. Avoid any discussion that might need to be referenced later on, as the chat history is not retained long.
|
|
181
|
-
|
|
182
|
-
### GitHub
|
|
183
|
-
|
|
184
|
-
* [GitHub issues](https://github.com/nautobot/nautobot/issues) - All feature requests, bug reports, and other substantial changes should be documented in an issue.
|
|
185
|
-
* [GitHub discussions](https://github.com/nautobot/nautobot/discussions) - The preferred forum for general discussion and support issues. Ideal for shaping a feature request prior to submitting an issue.
|
|
186
|
-
|
|
187
|
-
GitHub's discussions are the best place to get help or propose rough ideas for
|
|
188
|
-
new functionality. Their integration with GitHub allows for easily cross-
|
|
189
|
-
referencing and converting posts to issues as needed. There are several
|
|
190
|
-
categories for discussions:
|
|
191
|
-
|
|
192
|
-
* **General** - General community discussion.
|
|
193
|
-
* **Ideas** - Ideas for new functionality that isn't yet ready for a formal
|
|
194
|
-
feature request. These ideas are what will be in scope to review when moving work from _Future_ to _Near Term_ as stated in the previous section.
|
|
195
|
-
* **Q&A** - Request help with installing or using Nautobot.
|
|
196
|
-
|
|
197
|
-
## Contributing
|
|
198
|
-
|
|
199
|
-
We welcome many forms of contributions to Nautobot. While we understand most contributions will commonly come from developers, we encourage others to contribute in the form of docs, tutorials, and user guides. If you have other ideas for contributing, don't hesitate to open an issue or have a discussion in one of the forums above.
|
|
200
|
-
|
|
201
|
-
Please also take a chance to look at our [Wiki on GitHub](https://github.com/nautobot/nautobot/wiki/Work-Intake-&-Issue-Management) to review any specifics as to how we define and scope work as a community.
|
|
202
|
-
|
|
203
|
-
### Reporting Bugs
|
|
204
|
-
|
|
205
|
-
* First, ensure that you're running the [latest stable version](https://github.com/nautobot/nautobot/releases)
|
|
206
|
-
of Nautobot. If you're running an older version, it's possible that the bug has
|
|
207
|
-
already been fixed.
|
|
208
|
-
|
|
209
|
-
* Next, check the GitHub [issues list](https://github.com/nautobot/nautobot/issues)
|
|
210
|
-
to see if the bug you've found has already been reported. If you think you may
|
|
211
|
-
be experiencing a reported issue that hasn't already been resolved, please
|
|
212
|
-
click "add a reaction" in the top right corner of the issue and add a thumbs
|
|
213
|
-
up (+1). You might also want to add a comment describing how it's affecting your installation. This will allow us to prioritize bugs based on how many users are affected.
|
|
214
|
-
|
|
215
|
-
* When submitting an issue, please be as descriptive as possible. Be sure to
|
|
216
|
-
provide all information request in the issue template, including:
|
|
217
|
-
* The environment in which Nautobot is running
|
|
218
|
-
* The exact steps that can be taken to reproduce the issue
|
|
219
|
-
* Expected and observed behavior
|
|
220
|
-
* Any error messages generated
|
|
221
|
-
* Screenshots (if applicable)
|
|
222
|
-
|
|
223
|
-
* Please avoid prepending any sort of tag (e.g. "[Bug]") to the issue title.
|
|
224
|
-
The issue will be reviewed by a maintainer after submission and the appropriate
|
|
225
|
-
labels will be applied for categorization.
|
|
226
|
-
|
|
227
|
-
* Keep in mind that bugs are prioritized based on their severity and how much
|
|
228
|
-
work is required to resolve them. It may take some time for someone to address
|
|
229
|
-
your issue.
|
|
230
|
-
|
|
231
|
-
Bugs will follow our published workflow from inbound triage to ultimate terminal state, whether accepted or closed:
|
|
232
|
-
|
|
233
|
-

|
|
234
|
-
|
|
235
|
-
### Opening Feature Requests
|
|
236
|
-
|
|
237
|
-
* First, check the GitHub [issues
|
|
238
|
-
list](https://github.com/nautobot/nautobot/issues) and
|
|
239
|
-
[Discussions](https://github.com/nautobot/nautobot/discussions) to see if the
|
|
240
|
-
feature you're requesting is already listed. You can greater visibility on the
|
|
241
|
-
committed by looking at the [Nautobot
|
|
242
|
-
Roadmap](https://www.networktocode.com/nautobot/roadmap) (Be sure to search
|
|
243
|
-
closed issues as well, since some feature requests have not have been accepted.)
|
|
244
|
-
If the feature you'd like to see has already been requested and is open, click
|
|
245
|
-
"add a reaction" in the top right corner of the issue and add a thumbs up (+1).
|
|
246
|
-
This ensures that the issue has a better chance of receiving attention. Also
|
|
247
|
-
feel free to add a comment with any additional justification for the feature.
|
|
248
|
-
(However, note that comments with no substance other than a "+1" will be deleted. Please use GitHub's reactions feature to indicate your support.)
|
|
249
|
-
|
|
250
|
-
* Before filing a new feature request, consider starting with a GitHub
|
|
251
|
-
Discussion. Feedback you receive there will help validate and shape the proposed feature before filing a formal issue. If the feature request does not get accepted into the _current_ or _near term_ backlog, it will get converted to a Discussion anyway.
|
|
252
|
-
|
|
253
|
-
* Good feature requests are very narrowly defined. Be sure to thoroughly
|
|
254
|
-
describe the functionality and data model(s) being proposed. The more effort you put into writing a feature request, the better its chance is of being
|
|
255
|
-
implemented. Overly broad feature requests will be closed.
|
|
256
|
-
|
|
257
|
-
* When submitting a feature request on GitHub, be sure to include all
|
|
258
|
-
information requested by the issue template, including:
|
|
259
|
-
* A detailed description of the proposed functionality
|
|
260
|
-
* A use case for the feature; who would use it and what value it would add to Nautobot
|
|
261
|
-
* A rough description of changes necessary to the database schema (if applicable)
|
|
262
|
-
* Any third-party libraries or other resources which would be involved
|
|
263
|
-
* Please avoid prepending any sort of tag (e.g. "[Feature]") to the issue title.
|
|
264
|
-
|
|
265
|
-
The issue will be reviewed by a moderator after submission and the appropriate
|
|
266
|
-
labels will be applied for categorization.
|
|
267
|
-
|
|
268
|
-
Feature requests will follow our published workflow from inbound triage to ultimate terminal state, whether accepted or closed:
|
|
269
|
-
|
|
270
|
-

|
|
271
|
-
|
|
272
|
-
### Submitting Pull Requests
|
|
273
|
-
|
|
274
|
-
* If you're interested in contributing to Nautobot, be sure to check out our
|
|
275
|
-
[getting started](getting-started.md)
|
|
276
|
-
documentation for tips on setting up your development environment.
|
|
277
|
-
|
|
278
|
-
* It is recommended to open an issue **before** starting work on a pull request, and discuss your idea with the Nautobot maintainers before beginning work. This will help prevent wasting time on something that we might not be able to implement. When suggesting a new feature, also make sure it won't conflict with any work that's already in progress.
|
|
279
|
-
|
|
280
|
-
* Once you've opened or identified an issue you'd like to work on, ask that it
|
|
281
|
-
be assigned to you so that others are aware it's being worked on. A maintainer
|
|
282
|
-
will then mark the issue as "accepted."
|
|
283
|
-
|
|
284
|
-
* If you followed the project guidelines, have ample tests, code quality, you will first be acknowledged for your work. So, thank you in advance! After that, the PR will be quickly reviewed to ensure that it makes sense as a contribution to the project, and to gauge the work effort or issues with merging into _current_. If the effort required by the core team isn’t trivial, it’ll likely still be a few weeks before it gets thoroughly reviewed and merged, thus it won't be uncommon to move it to _near term_ with a `near-term` label. It will just depend on the current backlog.
|
|
285
|
-
|
|
286
|
-
* All code submissions should meet the following criteria (CI will enforce
|
|
287
|
-
these checks):
|
|
288
|
-
* Python syntax is valid
|
|
289
|
-
* All unit tests pass successfully
|
|
290
|
-
* PEP 8 compliance is enforced, with the exception that lines may be
|
|
291
|
-
greater than 80 characters in length
|
|
292
|
-
* At least one [changelog fragment](#creating-changelog-fragments) has
|
|
293
|
-
been included in the feature branch
|
|
294
|
-
|
|
295
|
-
#### Creating Changelog Fragments
|
|
296
|
-
|
|
297
|
-
All pull requests to `next` or `develop` must include a changelog fragment file in the `./changes` directory. To create a fragment, use your github issue number and fragment type as the filename. For example, `2362.added`. Valid fragment types are:
|
|
298
|
-
|
|
299
|
-
* `added`
|
|
300
|
-
* `changed`
|
|
301
|
-
* `dependencies`
|
|
302
|
-
* `deprecated`
|
|
303
|
-
* `documentation`
|
|
304
|
-
* `fixed`
|
|
305
|
-
* `housekeeping`
|
|
306
|
-
* `removed`
|
|
307
|
-
* `security`
|
|
308
|
-
|
|
309
|
-
The change summary is added to the file in plain text. Change summaries should be complete sentences, starting with a capital letter and ending with a period, and be in past tense. Each line of the change fragment will generate a single change entry in the release notes. Use multiple lines in the same file if your change needs to generate multiple release notes in the same category. If the change needs to create multiple entries in separate categories, create multiple files.
|
|
310
|
-
|
|
311
|
-
!!! example
|
|
312
|
-
|
|
313
|
-
**Wrong**
|
|
314
|
-
```plaintext title="changes/1234.fixed"
|
|
315
|
-
fix critical bug in documentation
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
**Right**
|
|
319
|
-
```plaintext title="changes/1234.fixed"
|
|
320
|
-
Fixed critical bug in documentation.
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
!!! example "Multiple Entry Example"
|
|
324
|
-
|
|
325
|
-
This will generate 2 entries in the `fixed` category and one entry in the `changed` category.
|
|
326
|
-
|
|
327
|
-
```plaintext title="changes/1234.fixed"
|
|
328
|
-
Fixed critical bug in documentation.
|
|
329
|
-
Fixed release notes generation.
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
```plaintext title="changes/1234.changed"
|
|
333
|
-
Changed release notes generation.
|
|
334
|
-
```
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Registry Model Features
|
|
2
|
-
|
|
3
|
-
A dictionary of particular features (e.g. custom fields) mapped to the Nautobot models which support them, arranged by app.
|
|
4
|
-
|
|
5
|
-
## Add a new feature to the `model_features` registry
|
|
6
|
-
|
|
7
|
-
The `populate_model_features_registry()` function updates the registry model features with new apps. This is done by defining a list of dictionaries called `lookup_confs`. Each dictionary in `lookup_confs` contains the following three keys:
|
|
8
|
-
|
|
9
|
-
- `feature_name`: The name of the feature to be updated in the registry.
|
|
10
|
-
- `field_names`: A list of names of fields that must be present in order for the model to be considered a valid `model_feature`.
|
|
11
|
-
- `field_attributes`: An optional dictionary of attributes used to filter the fields. Only models with fields matching all the attributes specified in the dictionary will be considered. This parameter can be useful to narrow down the search for fields that match certain criteria. For example, if `field_attributes` is set to `{"related_model": RelationshipAssociation}`, only fields with a `related_model` of `RelationshipAssociation` will be considered.
|
|
12
|
-
|
|
13
|
-
To add a new feature to the `lookup_confs` list, follow these steps:
|
|
14
|
-
|
|
15
|
-
1. Determine the name of the feature to be added, This name should be in `snake_case` as per convention
|
|
16
|
-
2. Determine the names of the fields that must be present in order for the model to be considered a valid `model_feature`.
|
|
17
|
-
3. (Optional) Determine any field attributes that can be used to filter the fields if `field_names` would not be enough.
|
|
18
|
-
4. Add a new dictionary with the following keys to `lookup_confs` which is in `nautobot.extras.utils.populate_model_features_registry()`:
|
|
19
|
-
- `feature_name`: The name of the feature.
|
|
20
|
-
- `field_names`: The list of names of fields.
|
|
21
|
-
- `field_attributes`: (Optional) The dictionary of attributes to filter the fields.
|
|
22
|
-
|
|
23
|
-
```python
|
|
24
|
-
from nautobot.extras.models.relationships import RelationshipAssociation
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def populate_model_features_registry():
|
|
28
|
-
"""..."""
|
|
29
|
-
|
|
30
|
-
lookup_confs = [
|
|
31
|
-
...,
|
|
32
|
-
{
|
|
33
|
-
"feature_name": "relationships",
|
|
34
|
-
"field_names": ["source_for_associations", "destination_for_associations"],
|
|
35
|
-
"field_attributes": {"related_model": RelationshipAssociation},
|
|
36
|
-
},
|
|
37
|
-
...
|
|
38
|
-
]
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
With this only Models which have fields names of `source_for_associations` and `destination_for_associations`, which in turn has the attribute `related_model=RelationshipAssociation`, would be a valid model for the feature `relationships`.
|
|
42
|
-
|
|
43
|
-
!!! note
|
|
44
|
-
`populate_model_features_registry()` and `lookup_confs` provide an alternative to the older method of feature flagging models via the `@extras_features` decorator. In general new feature flags should preferentially be implemented via additions to `lookup_confs`, *not* by any new additions to `extras_features`.
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# Natural Keys in Nautobot Models
|
|
2
|
-
|
|
3
|
-
+++ 2.0.0
|
|
4
|
-
|
|
5
|
-
Nautobot models derived from `BaseModel` automatically support the following [natural key](https://docs.djangoproject.com/en/3.2/topics/serialization/#natural-keys) APIs:
|
|
6
|
-
|
|
7
|
-
- Django's `instance.natural_key()` and `Model.objects.get_by_natural_key()` method APIs
|
|
8
|
-
|
|
9
|
-
## Using the Natural Key APIs
|
|
10
|
-
|
|
11
|
-
The `natural_key()` and `get_by_natural_key()` APIs are symmetric with one another:
|
|
12
|
-
|
|
13
|
-
```python
|
|
14
|
-
>>> DeviceType.objects.first().natural_key()
|
|
15
|
-
['MegaCorp', 'Model 9000']
|
|
16
|
-
|
|
17
|
-
>>> DeviceType.objects.get_by_natural_key("MegaCorp", "Model 9000")
|
|
18
|
-
<DeviceType: Model 9000>
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Implementing the Natural Key APIs
|
|
22
|
-
|
|
23
|
-
In many model cases, Nautobot's default implementation of these APIs will suffice. As long as your model has any of the following, a default natural key will be automatically made available:
|
|
24
|
-
|
|
25
|
-
- One or more `UniqueConstraint` declarations
|
|
26
|
-
- Any `unique_together` declaration
|
|
27
|
-
- Any field (other than `id`) that is set as `unique=True`.
|
|
28
|
-
|
|
29
|
-
There are a few special cases that will need special handling as described below.
|
|
30
|
-
|
|
31
|
-
### Self-Referential Natural Keys
|
|
32
|
-
|
|
33
|
-
An example of this can be seen with the `Location` model, where a given instance is only uniquely identified by its name **in combination with its parent**, which is another `Location`. Nautobot's default implementation would fall into an infinite recursion when trying to identify the Location's natural key fields, since they would be identified as `("name", "parent__name", "parent__parent__name", "parent__parent__parent__name", ...)`.
|
|
34
|
-
|
|
35
|
-
In a case like this, Nautobot is able to support _variadic_ natural keys, where the number and listing of natural keys may vary depending on the data of a given instance. To make this work, you will need to override two APIs related to natural keys on your model (`natural_key_field_lookups` and `natural_key_args_to_kwargs`) as follows:
|
|
36
|
-
|
|
37
|
-
```python
|
|
38
|
-
class Location(TreeModel):
|
|
39
|
-
|
|
40
|
-
class Meta:
|
|
41
|
-
unique_together = [["parent", "name"]]
|
|
42
|
-
|
|
43
|
-
@classproperty
|
|
44
|
-
def natural_key_field_lookups(cls):
|
|
45
|
-
"""
|
|
46
|
-
Due to the recursive nature of Location's natural key, we need a custom implementation of this property.
|
|
47
|
-
|
|
48
|
-
This returns a set of natural key lookups based on the current maximum depth of the Location tree.
|
|
49
|
-
For example if the tree is 2 layers deep, it will return ["name", "parent__name", "parent__parent__name"].
|
|
50
|
-
|
|
51
|
-
Without this custom implementation, the generic `natural_key_field_lookups` would recurse infinitely.
|
|
52
|
-
"""
|
|
53
|
-
lookups = []
|
|
54
|
-
name = "name"
|
|
55
|
-
for _ in range(cls.objects.max_tree_depth() + 1):
|
|
56
|
-
lookups.append(name)
|
|
57
|
-
name = f"parent__{name}"
|
|
58
|
-
return lookups
|
|
59
|
-
|
|
60
|
-
@classmethod
|
|
61
|
-
def natural_key_args_to_kwargs(cls, args):
|
|
62
|
-
"""Handle the possibility that more recursive "parent" lookups were specified than we initially expected."""
|
|
63
|
-
args = list(args)
|
|
64
|
-
natural_key_field_lookups = list(cls.natural_key_field_lookups)
|
|
65
|
-
while len(args) < len(natural_key_field_lookups):
|
|
66
|
-
args.append(None)
|
|
67
|
-
while len(args) > len(natural_key_field_lookups):
|
|
68
|
-
natural_key_field_lookups.append(f"parent__{natural_key_field_lookups[-1]}")
|
|
69
|
-
return dict(zip(natural_key_field_lookups, args))
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### Natural Keys Referencing a Different Self-Referential Model
|
|
73
|
-
|
|
74
|
-
Similarly, if you have a model whose natural keys include a `ForeignKey` to a model like `Location` with self-referential and variadic natural keys, for the related model to be handled properly, you must always ensure that the related field is the **last** such field in your model's uniqueness constraint or `natural_key_field_names` declaration.
|
|
75
|
-
|
|
76
|
-
Instead of this:
|
|
77
|
-
|
|
78
|
-
```python
|
|
79
|
-
class VLANGroup(BaseModel):
|
|
80
|
-
class Meta:
|
|
81
|
-
unique_together = [["location", "name"]] # wrong, nested location natural key cannot be variadic
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Do this:
|
|
85
|
-
|
|
86
|
-
```python
|
|
87
|
-
class VLANGroup(BaseModel):
|
|
88
|
-
class Meta:
|
|
89
|
-
unique_together = [["name", "location"]] # correct, nested location natural key can be variadic
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### No Uniqueness Constraints
|
|
93
|
-
|
|
94
|
-
You really **shouldn't** implement any models that lack one of the aforementioned uniqueness constraints, but if for some reason you find yourself in this situation, there are two possible approaches you can take:
|
|
95
|
-
|
|
96
|
-
#### Approximate the Natural Key
|
|
97
|
-
|
|
98
|
-
Perhaps your model doesn't have any actual database-level uniqueness constraints, but there are one or more fields that practically serve to uniquely identify a model instance. An example case here might be a model that has a `DateTimeField` with `auto_now_add=True` - while it may not be guaranteed unique by the database, in most cases a given timestamp is going to match at most one model instance. In cases like this you can declare `natural_key_field_names` on your model class to explicitly specify the list of "nearly unique" fields that should serve as the natural key for your model:
|
|
99
|
-
|
|
100
|
-
```python
|
|
101
|
-
class FileProxy(BaseModel):
|
|
102
|
-
name = models.CharField(max_length=255)
|
|
103
|
-
uploaded_at = models.DateTimeField(auto_now_add=True)
|
|
104
|
-
|
|
105
|
-
# no UniqueConstraint or unique_together - whoops!
|
|
106
|
-
|
|
107
|
-
natural_key_field_names = ["name", "uploaded_at"]
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
#### Remove the Natural Key
|
|
111
|
-
|
|
112
|
-
If the model simply lacks any conceivable combination of fields that could uniquely identify a specific model instance, you'll need to explicitly remove the `natural_key` method from your model so that Django doesn't attempt to automatically call it at various points (notably, when running [`nautobot-server dumpdata --natural-primary`](../../user-guide/administration/tools/nautobot-server.md#dumpdata)) and error out. This can be accomplished as follows:
|
|
113
|
-
|
|
114
|
-
```python
|
|
115
|
-
class MyUnnaturalModel(BaseModel):
|
|
116
|
-
class AttributeRemover:
|
|
117
|
-
def __get__(self, instance, owner):
|
|
118
|
-
raise AttributeError("MyUnnaturalModel doesn't yet have a natural key!")
|
|
119
|
-
|
|
120
|
-
natural_key = AttributeRemover()
|
|
121
|
-
```
|