nautobot 2.2.0b1__py3-none-any.whl → 2.2.1__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/__init__.py +31 -0
- nautobot/apps/api.py +1 -2
- nautobot/apps/utils.py +4 -0
- nautobot/apps/views.py +2 -0
- nautobot/circuits/api/urls.py +1 -2
- nautobot/circuits/api/views.py +0 -12
- nautobot/circuits/apps.py +1 -1
- nautobot/circuits/tests/test_filters.py +1 -1
- nautobot/core/api/routers.py +50 -3
- nautobot/core/api/utils.py +4 -0
- nautobot/core/api/views.py +21 -15
- nautobot/core/cli/__init__.py +18 -11
- nautobot/core/constants.py +85 -0
- nautobot/core/filters.py +7 -1
- nautobot/core/forms/widgets.py +1 -2
- nautobot/core/graphql/schema.py +1 -0
- nautobot/core/management/commands/generate_test_data.py +4 -4
- nautobot/core/models/__init__.py +1 -0
- nautobot/core/settings.py +24 -3
- nautobot/core/settings.yaml +20 -0
- nautobot/core/signals.py +1 -0
- nautobot/core/tables.py +2 -1
- nautobot/core/templates/admin/base.html +23 -94
- nautobot/core/templates/generic/object_retrieve.html +2 -2
- nautobot/core/templates/graphene/graphiql.html +18 -47
- nautobot/core/templates/inc/footer.html +5 -5
- nautobot/core/templates/inc/javascript.html +4 -4
- nautobot/core/templates/inc/media.html +2 -2
- nautobot/core/templates/inc/nav_menu.html +0 -7
- nautobot/core/templates/nautobot_config.py.j2 +14 -1
- nautobot/core/templates/rest_framework/api.html +12 -5
- nautobot/core/templatetags/helpers.py +2 -2
- nautobot/core/testing/__init__.py +1 -1
- nautobot/core/testing/filters.py +1 -1
- nautobot/core/testing/views.py +30 -0
- nautobot/core/tests/integration/test_view_authentication.py +68 -0
- nautobot/core/tests/test_api.py +13 -6
- nautobot/core/tests/test_csv.py +5 -4
- nautobot/core/tests/test_filters.py +2 -1
- nautobot/core/tests/test_graphql.py +4 -14
- nautobot/core/tests/test_navigations.py +3 -0
- nautobot/core/tests/test_views.py +44 -16
- nautobot/core/utils/data.py +1 -2
- nautobot/core/utils/lookup.py +126 -0
- nautobot/core/views/__init__.py +3 -7
- nautobot/core/views/generic.py +20 -6
- nautobot/core/views/mixins.py +7 -1
- nautobot/core/views/renderers.py +11 -6
- nautobot/dcim/api/serializers.py +4 -4
- nautobot/dcim/api/urls.py +2 -3
- nautobot/dcim/api/views.py +7 -18
- nautobot/dcim/apps.py +8 -4
- nautobot/dcim/elevations.py +5 -1
- nautobot/dcim/factory.py +7 -7
- nautobot/dcim/filters/__init__.py +16 -17
- nautobot/dcim/forms.py +61 -45
- nautobot/dcim/homepage.py +11 -3
- nautobot/dcim/management/commands/migrate_location_contacts.py +218 -0
- nautobot/dcim/migrations/0057_controller_models.py +11 -70
- nautobot/dcim/models/__init__.py +2 -2
- nautobot/dcim/models/devices.py +14 -16
- nautobot/dcim/models/racks.py +1 -3
- nautobot/dcim/navigation.py +23 -31
- nautobot/dcim/signals.py +6 -6
- nautobot/dcim/tables/__init__.py +2 -2
- nautobot/dcim/tables/devices.py +13 -16
- nautobot/dcim/tables/template_code.py +1 -1
- nautobot/dcim/templates/dcim/controller_create.html +70 -0
- nautobot/dcim/templates/dcim/controller_retrieve.html +35 -18
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +88 -0
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +75 -43
- nautobot/dcim/templates/dcim/device.html +11 -3
- nautobot/dcim/templates/dcim/device_edit.html +1 -1
- nautobot/dcim/templates/dcim/devicefamily_retrieve.html +4 -0
- nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +1 -1
- nautobot/dcim/tests/test_api.py +47 -6
- nautobot/dcim/tests/test_filters.py +92 -81
- nautobot/dcim/tests/test_graphql.py +11 -1
- nautobot/dcim/tests/test_models.py +15 -15
- nautobot/dcim/tests/test_signals.py +3 -1
- nautobot/dcim/tests/test_views.py +24 -12
- nautobot/dcim/urls.py +1 -1
- nautobot/dcim/views.py +25 -15
- nautobot/extras/api/serializers.py +20 -1
- nautobot/extras/api/urls.py +1 -2
- nautobot/extras/api/views.py +0 -10
- nautobot/extras/apps.py +7 -0
- nautobot/extras/context_managers.py +15 -4
- nautobot/extras/filters/__init__.py +53 -2
- nautobot/extras/filters/customfields.py +14 -9
- nautobot/extras/filters/mixins.py +6 -1
- nautobot/extras/forms/contacts.py +7 -0
- nautobot/extras/health_checks.py +1 -0
- nautobot/extras/jobs.py +1 -0
- nautobot/extras/managers.py +15 -2
- nautobot/extras/models/contacts.py +1 -0
- nautobot/extras/models/customfields.py +25 -2
- nautobot/extras/models/datasources.py +1 -0
- nautobot/extras/models/mixins.py +1 -0
- nautobot/extras/navigation.py +71 -65
- nautobot/extras/plugins/__init__.py +2 -1
- nautobot/extras/plugins/views.py +7 -11
- nautobot/extras/querysets.py +1 -2
- nautobot/extras/secrets/providers.py +1 -0
- nautobot/extras/signals.py +15 -5
- nautobot/extras/tasks.py +70 -17
- nautobot/extras/tests/test_api.py +2 -4
- nautobot/extras/tests/test_customfields.py +72 -9
- nautobot/extras/tests/test_dynamicgroups.py +2 -0
- nautobot/extras/tests/test_filters.py +89 -4
- nautobot/extras/tests/test_models.py +9 -0
- nautobot/extras/tests/test_relationships.py +10 -1
- nautobot/extras/tests/test_views.py +112 -1
- nautobot/extras/views.py +18 -17
- nautobot/ipam/api/serializers.py +10 -0
- nautobot/ipam/api/urls.py +1 -2
- nautobot/ipam/api/views.py +0 -11
- nautobot/ipam/apps.py +3 -2
- nautobot/ipam/tables.py +2 -22
- nautobot/ipam/tests/test_graphql.py +2 -3
- nautobot/ipam/tests/test_tables.py +42 -0
- nautobot/ipam/tests/test_views.py +1 -0
- nautobot/ipam/views.py +9 -9
- nautobot/project-static/css/base.css +1 -0
- nautobot/project-static/docs/404.html +126 -73
- nautobot/project-static/docs/apps/index.html +127 -71
- nautobot/project-static/docs/apps/nautobot-apps.html +127 -71
- nautobot/project-static/docs/assets/javascripts/{bundle.8fd75fb4.min.js → bundle.bd41221c.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.8fd75fb4.min.js.map → bundle.bd41221c.min.js.map} +3 -3
- nautobot/project-static/docs/assets/stylesheets/main.bcfcd587.min.css +1 -0
- nautobot/project-static/docs/assets/stylesheets/main.bcfcd587.min.css.map +1 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +167 -73
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +165 -72
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +128 -72
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +127 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +345 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +172 -73
- nautobot/project-static/docs/development/apps/api/configuration-view.html +127 -71
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +127 -71
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +127 -71
- nautobot/project-static/docs/development/apps/api/models/global-search.html +127 -71
- nautobot/project-static/docs/development/apps/api/models/graphql.html +127 -71
- nautobot/project-static/docs/development/apps/api/models/index.html +127 -71
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +127 -71
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +127 -71
- nautobot/project-static/docs/development/apps/api/prometheus.html +127 -71
- nautobot/project-static/docs/development/apps/api/setup.html +127 -71
- nautobot/project-static/docs/development/apps/api/testing.html +127 -71
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +127 -71
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +127 -71
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +127 -71
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +127 -71
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/base-template.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +141 -80
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +144 -83
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/index.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/notes.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +127 -71
- nautobot/project-static/docs/development/apps/api/views/urls.html +127 -71
- nautobot/project-static/docs/development/apps/index.html +127 -71
- nautobot/project-static/docs/development/apps/migration/code-updates.html +127 -71
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +127 -71
- nautobot/project-static/docs/development/apps/migration/from-v1.html +127 -71
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +127 -71
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +127 -71
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +127 -71
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +127 -71
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +127 -71
- nautobot/project-static/docs/development/core/application-registry.html +127 -71
- nautobot/project-static/docs/development/core/best-practices.html +145 -79
- nautobot/project-static/docs/development/core/bootstrap-ui.html +127 -71
- nautobot/project-static/docs/development/core/caching.html +127 -71
- nautobot/project-static/docs/development/core/controllers.html +141 -275
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +127 -71
- nautobot/project-static/docs/development/core/extending-models.html +13 -8166
- nautobot/project-static/docs/development/core/generic-views.html +142 -86
- nautobot/project-static/docs/development/core/getting-started.html +146 -81
- nautobot/project-static/docs/development/core/homepage.html +145 -89
- nautobot/project-static/docs/development/core/index.html +127 -71
- nautobot/project-static/docs/development/core/model-checklist.html +8354 -0
- nautobot/project-static/docs/development/core/model-features.html +130 -74
- nautobot/project-static/docs/development/core/natural-keys.html +127 -71
- nautobot/project-static/docs/development/core/navigation-menu.html +127 -71
- nautobot/project-static/docs/development/core/release-checklist.html +127 -71
- nautobot/project-static/docs/development/core/role-internals.html +127 -71
- nautobot/project-static/docs/development/core/settings.html +127 -71
- nautobot/project-static/docs/development/core/style-guide.html +127 -71
- nautobot/project-static/docs/development/core/templates.html +127 -71
- nautobot/project-static/docs/development/core/testing.html +127 -71
- nautobot/project-static/docs/development/core/user-preferences.html +127 -71
- nautobot/project-static/docs/development/extending-models.html +3 -3
- nautobot/project-static/docs/development/index.html +127 -71
- nautobot/project-static/docs/development/jobs/index.html +128 -72
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +127 -71
- nautobot/project-static/docs/index.html +126 -73
- nautobot/project-static/docs/models/dcim/{controllerdevicegroup.html → controllermanageddevicegroup.html} +3 -3
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.0.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.1.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.2.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.3.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.4.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.5.html +127 -71
- nautobot/project-static/docs/release-notes/version-1.6.html +127 -71
- nautobot/project-static/docs/release-notes/version-2.0.html +127 -71
- nautobot/project-static/docs/release-notes/version-2.1.html +538 -254
- nautobot/project-static/docs/release-notes/version-2.2.html +520 -101
- nautobot/project-static/docs/requirements.txt +3 -3
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +264 -259
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +127 -71
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +127 -71
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +127 -71
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +127 -71
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +192 -71
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +127 -71
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +131 -71
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +127 -71
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +130 -74
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +134 -74
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +8616 -0
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/index.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +127 -71
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +130 -74
- nautobot/project-static/docs/user-guide/administration/installation/services.html +127 -71
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +127 -71
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +127 -71
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +127 -71
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +127 -71
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +362 -79
- nautobot/project-static/docs/user-guide/core-data-model/dcim/{controllerdevicegroup.html → controllermanageddevicegroup.html} +210 -85
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +130 -74
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +138 -71
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +138 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +127 -71
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/{contact-and-team.html → contacts-and-teams.html} +128 -72
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +129 -73
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +129 -73
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +127 -71
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +127 -71
- nautobot/project-static/docs/user-guide/index.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +127 -71
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +127 -71
- nautobot/project-static/jquery/jquery-3.7.1.min.js +2 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_444444_256x240.png +0 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_555555_256x240.png +0 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_777620_256x240.png +0 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_777777_256x240.png +0 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_cc0000_256x240.png +0 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/images/ui-icons_ffffff_256x240.png +0 -0
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.css +7 -0
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.js +6 -0
- nautobot/project-static/jquery-ui-1.13.2/jquery-ui.structure.min.css +5 -0
- nautobot/project-static/{jquery-ui-1.13.1 → jquery-ui-1.13.2}/jquery-ui.theme.min.css +1 -1
- nautobot/tenancy/api/urls.py +1 -2
- nautobot/tenancy/api/views.py +0 -12
- nautobot/tenancy/tables.py +1 -1
- nautobot/tenancy/tests/test_views.py +1 -0
- nautobot/users/api/urls.py +1 -2
- nautobot/users/api/views.py +2 -65
- nautobot/users/views.py +8 -8
- nautobot/virtualization/api/urls.py +1 -2
- nautobot/virtualization/api/views.py +0 -12
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/METADATA +24 -24
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/RECORD +418 -412
- nautobot/dcim/templates/dcim/controllerdevicegroup_create.html +0 -43
- nautobot/project-static/docs/assets/stylesheets/main.f2e4d321.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/main.f2e4d321.min.css.map +0 -1
- nautobot/project-static/jquery/jquery-3.6.0.min.js +0 -2
- nautobot/project-static/jquery-ui-1.13.1/jquery-ui.min.css +0 -7
- nautobot/project-static/jquery-ui-1.13.1/jquery-ui.min.js +0 -6
- nautobot/project-static/jquery-ui-1.13.1/jquery-ui.structure.min.css +0 -5
- /nautobot/dcim/templates/dcim/{controllerdevicegroup_retrieve.html → controllermanageddevicegroup_retrieve.html} +0 -0
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/NOTICE +0 -0
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/WHEEL +0 -0
- {nautobot-2.2.0b1.dist-info → nautobot-2.2.1.dist-info}/entry_points.txt +0 -0
nautobot/dcim/api/views.py
CHANGED
|
@@ -13,7 +13,6 @@ from rest_framework.decorators import action
|
|
|
13
13
|
from rest_framework.mixins import ListModelMixin
|
|
14
14
|
from rest_framework.permissions import IsAuthenticated
|
|
15
15
|
from rest_framework.response import Response
|
|
16
|
-
from rest_framework.routers import APIRootView
|
|
17
16
|
from rest_framework.viewsets import GenericViewSet, ViewSet
|
|
18
17
|
|
|
19
18
|
from nautobot.circuits.models import Circuit
|
|
@@ -30,7 +29,7 @@ from nautobot.dcim.models import (
|
|
|
30
29
|
ConsoleServerPort,
|
|
31
30
|
ConsoleServerPortTemplate,
|
|
32
31
|
Controller,
|
|
33
|
-
|
|
32
|
+
ControllerManagedDeviceGroup,
|
|
34
33
|
Device,
|
|
35
34
|
DeviceBay,
|
|
36
35
|
DeviceBayTemplate,
|
|
@@ -76,16 +75,6 @@ from nautobot.virtualization.models import VirtualMachine
|
|
|
76
75
|
from . import serializers
|
|
77
76
|
from .exceptions import MissingFilterException
|
|
78
77
|
|
|
79
|
-
|
|
80
|
-
class DCIMRootView(APIRootView):
|
|
81
|
-
"""
|
|
82
|
-
DCIM API root view
|
|
83
|
-
"""
|
|
84
|
-
|
|
85
|
-
def get_view_name(self):
|
|
86
|
-
return "DCIM"
|
|
87
|
-
|
|
88
|
-
|
|
89
78
|
# Mixins
|
|
90
79
|
|
|
91
80
|
|
|
@@ -391,7 +380,7 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NautobotModelViewSet):
|
|
|
391
380
|
"software_version",
|
|
392
381
|
"virtual_chassis__master",
|
|
393
382
|
"device_redundancy_group",
|
|
394
|
-
"
|
|
383
|
+
"controller_managed_device_group",
|
|
395
384
|
"secrets_group",
|
|
396
385
|
"status",
|
|
397
386
|
).prefetch_related("tags", "primary_ip4__nat_outside_list", "primary_ip6__nat_outside_list", "software_image_files")
|
|
@@ -786,7 +775,7 @@ class ConnectedDeviceViewSet(ViewSet):
|
|
|
786
775
|
|
|
787
776
|
# Determine local interface from peer interface's connection
|
|
788
777
|
peer_interface = get_object_or_404(
|
|
789
|
-
Interface.objects.
|
|
778
|
+
Interface.objects.restrict(request.user, "view"),
|
|
790
779
|
device__name=peer_device_name,
|
|
791
780
|
name=peer_interface_name,
|
|
792
781
|
)
|
|
@@ -840,11 +829,11 @@ class ControllerViewSet(NautobotModelViewSet):
|
|
|
840
829
|
filterset_class = filters.ControllerFilterSet
|
|
841
830
|
|
|
842
831
|
|
|
843
|
-
class
|
|
844
|
-
queryset =
|
|
832
|
+
class ControllerManagedDeviceGroupViewSet(NautobotModelViewSet):
|
|
833
|
+
queryset = ControllerManagedDeviceGroup.objects.select_related(
|
|
845
834
|
"controller",
|
|
846
835
|
"parent",
|
|
847
836
|
).prefetch_related("tags")
|
|
848
837
|
|
|
849
|
-
serializer_class = serializers.
|
|
850
|
-
filterset_class = filters.
|
|
838
|
+
serializer_class = serializers.ControllerManagedDeviceGroupSerializer
|
|
839
|
+
filterset_class = filters.ControllerManagedDeviceGroupFilterSet
|
nautobot/dcim/apps.py
CHANGED
|
@@ -5,14 +5,18 @@ class DCIMConfig(NautobotConfig):
|
|
|
5
5
|
name = "nautobot.dcim"
|
|
6
6
|
verbose_name = "DCIM"
|
|
7
7
|
searchable_models = [
|
|
8
|
+
"cable",
|
|
9
|
+
"controller",
|
|
10
|
+
"device",
|
|
11
|
+
"devicefamily",
|
|
12
|
+
"deviceredundancygroup",
|
|
13
|
+
"devicetype",
|
|
8
14
|
"location",
|
|
15
|
+
"powerfeed",
|
|
9
16
|
"rack",
|
|
10
17
|
"rackgroup",
|
|
11
|
-
"
|
|
12
|
-
"device",
|
|
18
|
+
"softwareversion",
|
|
13
19
|
"virtualchassis",
|
|
14
|
-
"cable",
|
|
15
|
-
"powerfeed",
|
|
16
20
|
]
|
|
17
21
|
|
|
18
22
|
def ready(self):
|
nautobot/dcim/elevations.py
CHANGED
|
@@ -3,6 +3,8 @@ from django.urls import reverse
|
|
|
3
3
|
from django.utils.http import urlencode
|
|
4
4
|
import svgwrite
|
|
5
5
|
|
|
6
|
+
from nautobot.core.utils.config import get_settings_or_config
|
|
7
|
+
|
|
6
8
|
from .choices import DeviceFaceChoices
|
|
7
9
|
from .constants import RACK_ELEVATION_BORDER_WIDTH
|
|
8
10
|
|
|
@@ -233,7 +235,9 @@ class RackElevationSVG:
|
|
|
233
235
|
start_y + unit_height / 2 + RACK_ELEVATION_BORDER_WIDTH,
|
|
234
236
|
)
|
|
235
237
|
unit = ru + 1 if self.rack.desc_units else self.rack.u_height - ru
|
|
236
|
-
|
|
238
|
+
unit_two_digit_format = get_settings_or_config("RACK_ELEVATION_UNIT_TWO_DIGIT_FORMAT")
|
|
239
|
+
unit_display = f"{unit:02d}" if unit_two_digit_format else str(unit)
|
|
240
|
+
drawing.add(drawing.text(unit_display, position_coordinates, class_="unit"))
|
|
237
241
|
|
|
238
242
|
for unit in self.merge_elevations(face):
|
|
239
243
|
# Loop through all units in the elevation
|
nautobot/dcim/factory.py
CHANGED
|
@@ -26,7 +26,7 @@ from nautobot.dcim.choices import (
|
|
|
26
26
|
)
|
|
27
27
|
from nautobot.dcim.models import (
|
|
28
28
|
Controller,
|
|
29
|
-
|
|
29
|
+
ControllerManagedDeviceGroup,
|
|
30
30
|
Device,
|
|
31
31
|
DeviceFamily,
|
|
32
32
|
DeviceRedundancyGroup,
|
|
@@ -167,7 +167,7 @@ class DeviceFactory(PrimaryModelFactory):
|
|
|
167
167
|
factory.Faker("pyint", min_value=1, max_value=500),
|
|
168
168
|
)
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
controller_managed_device_group = random_instance(ControllerManagedDeviceGroup)
|
|
171
171
|
|
|
172
172
|
has_comments = NautobotBoolIterator()
|
|
173
173
|
comments = factory.Maybe("has_comments", factory.Faker("bs"))
|
|
@@ -694,19 +694,19 @@ class ControllerFactory(PrimaryModelFactory):
|
|
|
694
694
|
location = random_instance(lambda: Location.objects.get_for_model(Controller), allow_null=False)
|
|
695
695
|
tenant = random_instance(Tenant)
|
|
696
696
|
external_integration = random_instance(ExternalIntegration)
|
|
697
|
-
|
|
698
|
-
|
|
697
|
+
controller_device = factory.Maybe("has_device", random_instance(Device), None)
|
|
698
|
+
controller_device_redundancy_group = factory.Maybe("has_device", None, random_instance(DeviceRedundancyGroup))
|
|
699
699
|
|
|
700
700
|
|
|
701
|
-
class
|
|
701
|
+
class ControllerManagedDeviceGroupFactory(PrimaryModelFactory):
|
|
702
702
|
class Meta:
|
|
703
|
-
model =
|
|
703
|
+
model = ControllerManagedDeviceGroup
|
|
704
704
|
|
|
705
705
|
class Params:
|
|
706
706
|
has_parent = NautobotBoolIterator()
|
|
707
707
|
|
|
708
708
|
name = UniqueFaker("word")
|
|
709
|
-
parent = factory.Maybe("has_parent", random_instance(
|
|
709
|
+
parent = factory.Maybe("has_parent", random_instance(ControllerManagedDeviceGroup), None)
|
|
710
710
|
controller = factory.LazyAttribute(
|
|
711
711
|
lambda o: o.parent.controller if o.parent else Controller.objects.order_by("?").first()
|
|
712
712
|
)
|
|
@@ -42,7 +42,7 @@ from nautobot.dcim.models import (
|
|
|
42
42
|
ConsoleServerPort,
|
|
43
43
|
ConsoleServerPortTemplate,
|
|
44
44
|
Controller,
|
|
45
|
-
|
|
45
|
+
ControllerManagedDeviceGroup,
|
|
46
46
|
Device,
|
|
47
47
|
DeviceBay,
|
|
48
48
|
DeviceBayTemplate,
|
|
@@ -99,7 +99,7 @@ __all__ = (
|
|
|
99
99
|
"ConsoleServerPortFilterSet",
|
|
100
100
|
"ConsoleServerPortTemplateFilterSet",
|
|
101
101
|
"ControllerFilterSet",
|
|
102
|
-
"
|
|
102
|
+
"ControllerManagedDeviceGroupFilterSet",
|
|
103
103
|
"DeviceBayFilterSet",
|
|
104
104
|
"DeviceBayTemplateFilterSet",
|
|
105
105
|
"DeviceFilterSet",
|
|
@@ -918,11 +918,11 @@ class DeviceFilterSet(
|
|
|
918
918
|
to_field_name="name",
|
|
919
919
|
label="Device Redundancy Groups (name or ID)",
|
|
920
920
|
)
|
|
921
|
-
|
|
922
|
-
field_name="
|
|
923
|
-
queryset=
|
|
921
|
+
controller_managed_device_group = NaturalKeyOrPKMultipleChoiceFilter(
|
|
922
|
+
field_name="controller_managed_device_group",
|
|
923
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
924
924
|
to_field_name="name",
|
|
925
|
-
label="Controller Device Groups (name or ID)",
|
|
925
|
+
label="Controller Managed Device Groups (name or ID)",
|
|
926
926
|
)
|
|
927
927
|
virtual_chassis_member = is_virtual_chassis_member
|
|
928
928
|
has_console_ports = RelatedMembershipBooleanFilter(
|
|
@@ -1842,7 +1842,6 @@ class ControllerFilterSet(
|
|
|
1842
1842
|
NautobotFilterSet,
|
|
1843
1843
|
LocatableModelFilterSetMixin,
|
|
1844
1844
|
TenancyModelFilterSetMixin,
|
|
1845
|
-
LocalContextModelFilterSetMixin,
|
|
1846
1845
|
StatusModelFilterSetMixin,
|
|
1847
1846
|
RoleModelFilterSetMixin,
|
|
1848
1847
|
):
|
|
@@ -1864,15 +1863,15 @@ class ControllerFilterSet(
|
|
|
1864
1863
|
to_field_name="name",
|
|
1865
1864
|
label="External integration (name or ID)",
|
|
1866
1865
|
)
|
|
1867
|
-
|
|
1866
|
+
controller_device = NaturalKeyOrPKMultipleChoiceFilter(
|
|
1868
1867
|
queryset=Device.objects.all(),
|
|
1869
1868
|
to_field_name="name",
|
|
1870
|
-
label="
|
|
1869
|
+
label="Controller device (name or ID)",
|
|
1871
1870
|
)
|
|
1872
|
-
|
|
1871
|
+
controller_device_redundancy_group = NaturalKeyOrPKMultipleChoiceFilter(
|
|
1873
1872
|
queryset=DeviceRedundancyGroup.objects.all(),
|
|
1874
1873
|
to_field_name="name",
|
|
1875
|
-
label="
|
|
1874
|
+
label="Controller device redundancy group (name or ID)",
|
|
1876
1875
|
)
|
|
1877
1876
|
|
|
1878
1877
|
class Meta:
|
|
@@ -1880,8 +1879,8 @@ class ControllerFilterSet(
|
|
|
1880
1879
|
fields = "__all__"
|
|
1881
1880
|
|
|
1882
1881
|
|
|
1883
|
-
class
|
|
1884
|
-
"""Filters for
|
|
1882
|
+
class ControllerManagedDeviceGroupFilterSet(NautobotFilterSet):
|
|
1883
|
+
"""Filters for ControllerManagedDeviceGroup model."""
|
|
1885
1884
|
|
|
1886
1885
|
q = SearchFilter(
|
|
1887
1886
|
filter_predicates={
|
|
@@ -1894,7 +1893,7 @@ class ControllerDeviceGroupFilterSet(NautobotFilterSet):
|
|
|
1894
1893
|
label="Controller (name or ID)",
|
|
1895
1894
|
)
|
|
1896
1895
|
parent = NaturalKeyOrPKMultipleChoiceFilter(
|
|
1897
|
-
queryset=
|
|
1896
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
1898
1897
|
to_field_name="name",
|
|
1899
1898
|
label="Parent group (name or ID)",
|
|
1900
1899
|
)
|
|
@@ -1906,7 +1905,7 @@ class ControllerDeviceGroupFilterSet(NautobotFilterSet):
|
|
|
1906
1905
|
)
|
|
1907
1906
|
|
|
1908
1907
|
class Meta:
|
|
1909
|
-
model =
|
|
1908
|
+
model = ControllerManagedDeviceGroup
|
|
1910
1909
|
fields = "__all__"
|
|
1911
1910
|
|
|
1912
1911
|
def generate_query__subtree(self, value):
|
|
@@ -1914,7 +1913,7 @@ class ControllerDeviceGroupFilterSet(NautobotFilterSet):
|
|
|
1914
1913
|
if value:
|
|
1915
1914
|
params = Q(pk__in=[v.pk for v in value])
|
|
1916
1915
|
filter_name = "in"
|
|
1917
|
-
for _ in range(
|
|
1916
|
+
for _ in range(ControllerManagedDeviceGroup.objects.max_depth + 1):
|
|
1918
1917
|
filter_name = f"parent__{filter_name}"
|
|
1919
1918
|
params |= Q(**{filter_name: value})
|
|
1920
1919
|
return params
|
|
@@ -1922,6 +1921,6 @@ class ControllerDeviceGroupFilterSet(NautobotFilterSet):
|
|
|
1922
1921
|
|
|
1923
1922
|
@extend_schema_field({"type": "string"})
|
|
1924
1923
|
def _subtree(self, queryset, name, value):
|
|
1925
|
-
"""FilterSet method for getting Groups that are or are descended from a given
|
|
1924
|
+
"""FilterSet method for getting Groups that are or are descended from a given ControllerManagedDeviceGroup(s)."""
|
|
1926
1925
|
params = self.generate_query__subtree(value)
|
|
1927
1926
|
return queryset.filter(params)
|
nautobot/dcim/forms.py
CHANGED
|
@@ -95,7 +95,7 @@ from .models import (
|
|
|
95
95
|
ConsoleServerPort,
|
|
96
96
|
ConsoleServerPortTemplate,
|
|
97
97
|
Controller,
|
|
98
|
-
|
|
98
|
+
ControllerManagedDeviceGroup,
|
|
99
99
|
Device,
|
|
100
100
|
DeviceBay,
|
|
101
101
|
DeviceBayTemplate,
|
|
@@ -1548,7 +1548,9 @@ class DeviceForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, LocalC
|
|
|
1548
1548
|
},
|
|
1549
1549
|
)
|
|
1550
1550
|
device_redundancy_group = DynamicModelChoiceField(queryset=DeviceRedundancyGroup.objects.all(), required=False)
|
|
1551
|
-
|
|
1551
|
+
controller_managed_device_group = DynamicModelChoiceField(
|
|
1552
|
+
queryset=ControllerManagedDeviceGroup.objects.all(), required=False
|
|
1553
|
+
)
|
|
1552
1554
|
position = forms.IntegerField(
|
|
1553
1555
|
required=False,
|
|
1554
1556
|
help_text="The lowest-numbered unit occupied by the device",
|
|
@@ -1618,7 +1620,7 @@ class DeviceForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, LocalC
|
|
|
1618
1620
|
"rack",
|
|
1619
1621
|
"device_redundancy_group",
|
|
1620
1622
|
"device_redundancy_group_priority",
|
|
1621
|
-
"
|
|
1623
|
+
"controller_managed_device_group",
|
|
1622
1624
|
"position",
|
|
1623
1625
|
"face",
|
|
1624
1626
|
"status",
|
|
@@ -1760,7 +1762,9 @@ class DeviceBulkEditForm(
|
|
|
1760
1762
|
secrets_group = DynamicModelChoiceField(queryset=SecretsGroup.objects.all(), required=False)
|
|
1761
1763
|
device_redundancy_group = DynamicModelChoiceField(queryset=DeviceRedundancyGroup.objects.all(), required=False)
|
|
1762
1764
|
device_redundancy_group_priority = forms.IntegerField(required=False, min_value=1)
|
|
1763
|
-
|
|
1765
|
+
controller_managed_device_group = DynamicModelChoiceField(
|
|
1766
|
+
queryset=ControllerManagedDeviceGroup.objects.all(), required=False
|
|
1767
|
+
)
|
|
1764
1768
|
software_version = DynamicModelChoiceField(queryset=SoftwareVersion.objects.all(), required=False)
|
|
1765
1769
|
software_image_files = DynamicModelMultipleChoiceField(queryset=SoftwareImageFile.objects.all(), required=False)
|
|
1766
1770
|
|
|
@@ -1778,7 +1782,7 @@ class DeviceBulkEditForm(
|
|
|
1778
1782
|
"secrets_group",
|
|
1779
1783
|
"device_redundancy_group",
|
|
1780
1784
|
"device_redundancy_group_priority",
|
|
1781
|
-
"
|
|
1785
|
+
"controller_managed_device_group",
|
|
1782
1786
|
"software_image_files",
|
|
1783
1787
|
"software_version",
|
|
1784
1788
|
]
|
|
@@ -1858,8 +1862,8 @@ class DeviceFilterForm(
|
|
|
1858
1862
|
null_option="None",
|
|
1859
1863
|
)
|
|
1860
1864
|
device_redundancy_group_priority = NumericArrayField(base_field=forms.IntegerField(min_value=1), required=False)
|
|
1861
|
-
|
|
1862
|
-
queryset=
|
|
1865
|
+
controller_managed_device_group = DynamicModelMultipleChoiceField(
|
|
1866
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
1863
1867
|
to_field_name="name",
|
|
1864
1868
|
required=False,
|
|
1865
1869
|
null_option="None",
|
|
@@ -4123,9 +4127,30 @@ class SoftwareVersionForm(NautobotModelForm):
|
|
|
4123
4127
|
fields = "__all__"
|
|
4124
4128
|
|
|
4125
4129
|
|
|
4126
|
-
class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm
|
|
4130
|
+
class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm):
|
|
4127
4131
|
"""Controller create/edit form."""
|
|
4128
4132
|
|
|
4133
|
+
platform = DynamicModelChoiceField(
|
|
4134
|
+
queryset=Platform.objects.all(),
|
|
4135
|
+
required=False,
|
|
4136
|
+
)
|
|
4137
|
+
tenant = DynamicModelChoiceField(
|
|
4138
|
+
queryset=Tenant.objects.all(),
|
|
4139
|
+
required=False,
|
|
4140
|
+
)
|
|
4141
|
+
external_integration = DynamicModelChoiceField(
|
|
4142
|
+
queryset=ExternalIntegration.objects.all(),
|
|
4143
|
+
required=False,
|
|
4144
|
+
)
|
|
4145
|
+
controller_device = DynamicModelChoiceField(
|
|
4146
|
+
queryset=Device.objects.all(),
|
|
4147
|
+
required=False,
|
|
4148
|
+
)
|
|
4149
|
+
controller_device_redundancy_group = DynamicModelChoiceField(
|
|
4150
|
+
queryset=DeviceRedundancyGroup.objects.all(),
|
|
4151
|
+
required=False,
|
|
4152
|
+
)
|
|
4153
|
+
|
|
4129
4154
|
class Meta:
|
|
4130
4155
|
model = Controller
|
|
4131
4156
|
fields = (
|
|
@@ -4137,15 +4162,14 @@ class ControllerForm(LocatableModelFormMixin, NautobotModelForm, TenancyForm, Lo
|
|
|
4137
4162
|
"tenant",
|
|
4138
4163
|
"location",
|
|
4139
4164
|
"external_integration",
|
|
4140
|
-
"
|
|
4141
|
-
"
|
|
4165
|
+
"controller_device",
|
|
4166
|
+
"controller_device_redundancy_group",
|
|
4142
4167
|
"tags",
|
|
4143
4168
|
)
|
|
4144
4169
|
|
|
4145
4170
|
|
|
4146
4171
|
class ControllerFilterForm(
|
|
4147
4172
|
NautobotFilterForm,
|
|
4148
|
-
LocalContextFilterForm,
|
|
4149
4173
|
LocatableModelFilterFormMixin,
|
|
4150
4174
|
TenancyFilterForm,
|
|
4151
4175
|
StatusModelFilterFormMixin,
|
|
@@ -4167,15 +4191,15 @@ class ControllerFilterForm(
|
|
|
4167
4191
|
required=False,
|
|
4168
4192
|
label="External integration",
|
|
4169
4193
|
)
|
|
4170
|
-
|
|
4194
|
+
controller_device = DynamicModelMultipleChoiceField(
|
|
4171
4195
|
queryset=Device.objects.all(),
|
|
4172
4196
|
required=False,
|
|
4173
|
-
label="
|
|
4197
|
+
label="Controller device",
|
|
4174
4198
|
)
|
|
4175
|
-
|
|
4199
|
+
controller_device_redundancy_group = DynamicModelMultipleChoiceField(
|
|
4176
4200
|
queryset=DeviceRedundancyGroup.objects.all(),
|
|
4177
4201
|
required=False,
|
|
4178
|
-
label="
|
|
4202
|
+
label="Controller device redundancy group",
|
|
4179
4203
|
)
|
|
4180
4204
|
tags = TagFilterField(model)
|
|
4181
4205
|
field_order = (
|
|
@@ -4188,8 +4212,8 @@ class ControllerFilterForm(
|
|
|
4188
4212
|
"platform",
|
|
4189
4213
|
"tenant",
|
|
4190
4214
|
"external_integration",
|
|
4191
|
-
"
|
|
4192
|
-
"
|
|
4215
|
+
"controller_device",
|
|
4216
|
+
"controller_device_redundancy_group",
|
|
4193
4217
|
"tags",
|
|
4194
4218
|
)
|
|
4195
4219
|
|
|
@@ -4200,7 +4224,6 @@ class ControllerBulkEditForm(
|
|
|
4200
4224
|
StatusModelBulkEditFormMixin,
|
|
4201
4225
|
RoleModelBulkEditFormMixin,
|
|
4202
4226
|
NautobotBulkEditForm,
|
|
4203
|
-
LocalContextModelBulkEditForm,
|
|
4204
4227
|
):
|
|
4205
4228
|
"""Controller bulk edit form."""
|
|
4206
4229
|
|
|
@@ -4220,11 +4243,11 @@ class ControllerBulkEditForm(
|
|
|
4220
4243
|
queryset=ExternalIntegration.objects.all(),
|
|
4221
4244
|
required=False,
|
|
4222
4245
|
)
|
|
4223
|
-
|
|
4246
|
+
controller_device = DynamicModelChoiceField(
|
|
4224
4247
|
queryset=Device.objects.all(),
|
|
4225
4248
|
required=False,
|
|
4226
4249
|
)
|
|
4227
|
-
|
|
4250
|
+
controller_device_redundancy_group = DynamicModelChoiceField(
|
|
4228
4251
|
queryset=DeviceRedundancyGroup.objects.all(),
|
|
4229
4252
|
required=False,
|
|
4230
4253
|
)
|
|
@@ -4239,24 +4262,24 @@ class ControllerBulkEditForm(
|
|
|
4239
4262
|
"platform",
|
|
4240
4263
|
"tenant",
|
|
4241
4264
|
"external_integration",
|
|
4242
|
-
"
|
|
4243
|
-
"
|
|
4265
|
+
"controller_device",
|
|
4266
|
+
"controller_device_redundancy_group",
|
|
4244
4267
|
"tags",
|
|
4245
4268
|
)
|
|
4246
4269
|
|
|
4247
4270
|
|
|
4248
|
-
class
|
|
4249
|
-
"""
|
|
4271
|
+
class ControllerManagedDeviceGroupForm(NautobotModelForm):
|
|
4272
|
+
"""ControllerManagedDeviceGroup create/edit form."""
|
|
4250
4273
|
|
|
4251
|
-
controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=
|
|
4274
|
+
controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=True)
|
|
4252
4275
|
devices = DynamicModelMultipleChoiceField(queryset=Device.objects.all(), required=False)
|
|
4253
|
-
parent = DynamicModelChoiceField(queryset=
|
|
4276
|
+
parent = DynamicModelChoiceField(queryset=ControllerManagedDeviceGroup.objects.all(), required=False)
|
|
4254
4277
|
|
|
4255
4278
|
class Meta:
|
|
4256
|
-
model =
|
|
4279
|
+
model = ControllerManagedDeviceGroup
|
|
4257
4280
|
fields = (
|
|
4258
|
-
"name",
|
|
4259
4281
|
"controller",
|
|
4282
|
+
"name",
|
|
4260
4283
|
"devices",
|
|
4261
4284
|
"parent",
|
|
4262
4285
|
"weight",
|
|
@@ -4275,13 +4298,10 @@ class ControllerDeviceGroupForm(NautobotModelForm):
|
|
|
4275
4298
|
return instance
|
|
4276
4299
|
|
|
4277
4300
|
|
|
4278
|
-
class
|
|
4279
|
-
|
|
4280
|
-
NautobotFilterForm,
|
|
4281
|
-
):
|
|
4282
|
-
"""ControllerDeviceGroup basic filter form."""
|
|
4301
|
+
class ControllerManagedDeviceGroupFilterForm(NautobotFilterForm):
|
|
4302
|
+
"""ControllerManagedDeviceGroup basic filter form."""
|
|
4283
4303
|
|
|
4284
|
-
model =
|
|
4304
|
+
model = ControllerManagedDeviceGroup
|
|
4285
4305
|
q = forms.CharField(required=False, label="Search")
|
|
4286
4306
|
name = forms.CharField(required=False, label="Name")
|
|
4287
4307
|
controller = DynamicModelChoiceField(
|
|
@@ -4290,13 +4310,13 @@ class ControllerDeviceGroupFilterForm(
|
|
|
4290
4310
|
label="Controller",
|
|
4291
4311
|
)
|
|
4292
4312
|
parent = DynamicModelChoiceField(
|
|
4293
|
-
queryset=
|
|
4313
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
4294
4314
|
required=False,
|
|
4295
4315
|
label="Parent",
|
|
4296
4316
|
)
|
|
4297
4317
|
weight = forms.IntegerField(required=False, label="Weight")
|
|
4298
4318
|
subtree = DynamicModelMultipleChoiceField(
|
|
4299
|
-
queryset=
|
|
4319
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
4300
4320
|
to_field_name="name",
|
|
4301
4321
|
required=False,
|
|
4302
4322
|
)
|
|
@@ -4312,23 +4332,19 @@ class ControllerDeviceGroupFilterForm(
|
|
|
4312
4332
|
)
|
|
4313
4333
|
|
|
4314
4334
|
|
|
4315
|
-
class
|
|
4316
|
-
|
|
4317
|
-
NautobotBulkEditForm,
|
|
4318
|
-
LocalContextModelBulkEditForm,
|
|
4319
|
-
):
|
|
4320
|
-
"""ControllerDeviceGroup bulk edit form."""
|
|
4335
|
+
class ControllerManagedDeviceGroupBulkEditForm(TagsBulkEditFormMixin, NautobotBulkEditForm):
|
|
4336
|
+
"""ControllerManagedDeviceGroup bulk edit form."""
|
|
4321
4337
|
|
|
4322
4338
|
pk = forms.ModelMultipleChoiceField(
|
|
4323
|
-
queryset=
|
|
4339
|
+
queryset=ControllerManagedDeviceGroup.objects.all(),
|
|
4324
4340
|
widget=forms.MultipleHiddenInput,
|
|
4325
4341
|
)
|
|
4326
4342
|
controller = DynamicModelChoiceField(queryset=Controller.objects.all(), required=False)
|
|
4327
|
-
parent = DynamicModelChoiceField(queryset=
|
|
4343
|
+
parent = DynamicModelChoiceField(queryset=ControllerManagedDeviceGroup.objects.all(), required=False)
|
|
4328
4344
|
weight = forms.IntegerField(required=False)
|
|
4329
4345
|
|
|
4330
4346
|
class Meta:
|
|
4331
|
-
model =
|
|
4347
|
+
model = ControllerManagedDeviceGroup
|
|
4332
4348
|
fields = (
|
|
4333
4349
|
"controller",
|
|
4334
4350
|
"parent",
|
nautobot/dcim/homepage.py
CHANGED
|
@@ -79,13 +79,21 @@ layout = (
|
|
|
79
79
|
description="Represents a set of devices which share a common control plane",
|
|
80
80
|
weight=400,
|
|
81
81
|
),
|
|
82
|
+
HomePageItem(
|
|
83
|
+
name="Controllers",
|
|
84
|
+
link="dcim:controller_list",
|
|
85
|
+
model=models.Controller,
|
|
86
|
+
permissions=["dcim.view_controller"],
|
|
87
|
+
description="Represents a network or SDN (Software-Defined Networking) controllers",
|
|
88
|
+
weight=500,
|
|
89
|
+
),
|
|
82
90
|
HomePageItem(
|
|
83
91
|
name="Device Redundancy Groups",
|
|
84
92
|
link="dcim:deviceredundancygroup_list",
|
|
85
93
|
model=models.DeviceRedundancyGroup,
|
|
86
94
|
permissions=["dcim.view_deviceredundancygroup"],
|
|
87
95
|
description="Represents a set of devices which operate in a failover/HA group",
|
|
88
|
-
weight=
|
|
96
|
+
weight=600,
|
|
89
97
|
),
|
|
90
98
|
HomePageItem(
|
|
91
99
|
name="Interface Redundancy Groups",
|
|
@@ -93,11 +101,11 @@ layout = (
|
|
|
93
101
|
model=models.InterfaceRedundancyGroup,
|
|
94
102
|
permissions=["dcim.view_interfaceredundancygroup"],
|
|
95
103
|
description="Represents a set of interfaces which operate in a failover/HA group",
|
|
96
|
-
weight=
|
|
104
|
+
weight=700,
|
|
97
105
|
),
|
|
98
106
|
HomePageGroup(
|
|
99
107
|
name="Connections",
|
|
100
|
-
weight=
|
|
108
|
+
weight=800,
|
|
101
109
|
items=(
|
|
102
110
|
HomePageItem(
|
|
103
111
|
name="Cables",
|