nautobot 2.4.0__py3-none-any.whl → 2.4.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/apps/__init__.py +1 -1
- nautobot/apps/api.py +8 -8
- nautobot/apps/change_logging.py +2 -2
- nautobot/apps/choices.py +4 -4
- nautobot/apps/events.py +3 -3
- nautobot/apps/factory.py +2 -2
- nautobot/apps/filters.py +1 -1
- nautobot/apps/forms.py +20 -20
- nautobot/apps/graphql.py +2 -2
- nautobot/apps/jobs.py +8 -8
- nautobot/apps/models.py +19 -19
- nautobot/apps/tables.py +1 -1
- nautobot/apps/testing.py +10 -10
- nautobot/apps/ui.py +2 -2
- nautobot/apps/utils.py +7 -7
- nautobot/apps/views.py +7 -7
- nautobot/circuits/api/serializers.py +0 -1
- nautobot/circuits/api/views.py +8 -4
- nautobot/circuits/tables.py +1 -2
- nautobot/circuits/templates/circuits/circuit_create.html +7 -1
- nautobot/circuits/views.py +3 -3
- nautobot/cloud/api/views.py +10 -6
- nautobot/cloud/models.py +1 -1
- nautobot/cloud/views.py +16 -0
- nautobot/core/api/fields.py +5 -5
- nautobot/core/api/filter_backends.py +9 -3
- nautobot/core/api/schema.py +2 -13
- nautobot/core/api/serializers.py +34 -40
- nautobot/core/api/views.py +4 -56
- nautobot/core/celery/log.py +4 -4
- nautobot/core/celery/schedulers.py +1 -1
- nautobot/core/choices.py +2 -2
- nautobot/core/events/__init__.py +3 -3
- nautobot/core/filters.py +16 -21
- nautobot/core/fixtures/user-data.json +59 -0
- nautobot/core/forms/__init__.py +19 -19
- nautobot/core/forms/fields.py +11 -14
- nautobot/core/forms/forms.py +2 -33
- nautobot/core/graphql/types.py +1 -1
- nautobot/core/jobs/__init__.py +7 -28
- nautobot/core/jobs/cleanup.py +12 -48
- nautobot/core/jobs/groups.py +1 -1
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/models/__init__.py +1 -1
- nautobot/core/models/query_functions.py +2 -2
- nautobot/core/models/tree_queries.py +3 -6
- nautobot/core/settings.py +2 -29
- nautobot/core/settings.yaml +0 -21
- nautobot/core/tables.py +60 -74
- nautobot/core/templates/inc/media.html +0 -3
- nautobot/core/templates/inc/nav_menu.html +0 -1
- nautobot/core/templates/nautobot_config.py.j2 +0 -13
- nautobot/core/templates/search.html +0 -7
- nautobot/core/templates/utilities/render_jinja2.html +1 -1
- nautobot/core/templates/utilities/templatetags/tag.html +1 -1
- nautobot/core/templates/utilities/theme_preview.html +0 -7
- nautobot/core/templatetags/helpers.py +2 -11
- nautobot/core/testing/__init__.py +8 -8
- nautobot/core/testing/api.py +15 -170
- nautobot/core/testing/filters.py +2 -25
- nautobot/core/testing/forms.py +0 -2
- nautobot/core/testing/mixins.py +2 -7
- nautobot/core/testing/views.py +29 -44
- nautobot/core/tests/integration/test_app_home.py +1 -0
- nautobot/core/tests/integration/test_app_navbar.py +1 -0
- nautobot/core/tests/integration/test_filters.py +2 -0
- nautobot/core/tests/integration/test_home.py +1 -0
- nautobot/core/tests/integration/test_navbar.py +1 -0
- nautobot/core/tests/integration/test_view_authentication.py +0 -1
- nautobot/core/tests/runner.py +1 -1
- nautobot/core/tests/test_api.py +1 -98
- nautobot/core/tests/test_csv.py +3 -25
- nautobot/core/tests/test_forms.py +0 -1
- nautobot/core/tests/test_jobs.py +1 -303
- nautobot/core/tests/test_settings_schema.py +0 -7
- nautobot/core/tests/test_tables.py +0 -100
- nautobot/core/tests/test_utils.py +1 -63
- nautobot/core/tests/test_views.py +3 -30
- nautobot/core/ui/nav.py +0 -1
- nautobot/core/ui/object_detail.py +1 -15
- nautobot/core/urls.py +0 -11
- nautobot/core/utils/lookup.py +8 -11
- nautobot/core/utils/requests.py +9 -24
- nautobot/core/views/__init__.py +0 -42
- nautobot/core/views/generic.py +176 -78
- nautobot/core/views/mixins.py +34 -94
- nautobot/core/views/renderers.py +6 -6
- nautobot/dcim/api/serializers.py +62 -54
- nautobot/dcim/api/views.py +113 -47
- nautobot/dcim/filters/__init__.py +2 -31
- nautobot/dcim/forms.py +17 -36
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/models/__init__.py +1 -1
- nautobot/dcim/models/device_component_templates.py +2 -2
- nautobot/dcim/models/device_components.py +20 -22
- nautobot/dcim/models/devices.py +1 -10
- nautobot/dcim/models/locations.py +3 -3
- nautobot/dcim/models/power.py +5 -6
- nautobot/dcim/models/racks.py +4 -4
- nautobot/dcim/tables/__init__.py +3 -3
- nautobot/dcim/tables/devices.py +5 -7
- nautobot/dcim/tables/devicetypes.py +2 -2
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/controller_create.html +7 -1
- nautobot/dcim/templates/dcim/controller_retrieve.html +9 -1
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -2
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -5
- nautobot/dcim/templates/dcim/device.html +9 -1
- nautobot/dcim/templates/dcim/device_edit.html +37 -36
- nautobot/dcim/templates/dcim/location.html +9 -1
- nautobot/dcim/templates/dcim/location_edit.html +7 -1
- nautobot/dcim/templates/dcim/rack.html +9 -1
- nautobot/dcim/templates/dcim/rack_edit.html +7 -1
- nautobot/dcim/templates/dcim/rackreservation.html +9 -1
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +9 -1
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +7 -1
- nautobot/dcim/tests/test_api.py +3 -16
- nautobot/dcim/tests/test_filters.py +0 -33
- nautobot/dcim/tests/test_forms.py +2 -51
- nautobot/dcim/tests/test_graphql.py +0 -52
- nautobot/dcim/tests/test_models.py +5 -34
- nautobot/dcim/tests/test_views.py +83 -21
- nautobot/dcim/views.py +13 -1
- nautobot/extras/api/customfields.py +2 -2
- nautobot/extras/api/serializers.py +85 -90
- nautobot/extras/api/views.py +27 -22
- nautobot/extras/constants.py +0 -2
- nautobot/extras/filters/__init__.py +6 -8
- nautobot/extras/forms/base.py +2 -2
- nautobot/extras/forms/forms.py +31 -139
- nautobot/extras/forms/mixins.py +5 -13
- nautobot/extras/group_sync.py +3 -3
- nautobot/extras/health_checks.py +2 -1
- nautobot/extras/jobs.py +12 -70
- nautobot/extras/managers.py +1 -3
- nautobot/extras/migrations/0018_joblog_data_migration.py +9 -7
- nautobot/extras/models/__init__.py +1 -1
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/customfields.py +11 -12
- nautobot/extras/models/groups.py +9 -11
- nautobot/extras/models/jobs.py +4 -23
- nautobot/extras/models/models.py +2 -2
- nautobot/extras/plugins/__init__.py +2 -13
- nautobot/extras/plugins/marketplace_manifest.yml +79 -84
- nautobot/extras/plugins/tables.py +14 -16
- nautobot/extras/plugins/views.py +69 -65
- nautobot/extras/registry.py +1 -1
- nautobot/extras/secrets/__init__.py +2 -2
- nautobot/extras/tables.py +5 -7
- nautobot/extras/templates/extras/dynamicgroup.html +9 -1
- nautobot/extras/templates/extras/job_detail.html +0 -16
- nautobot/extras/templates/extras/job_edit.html +0 -1
- nautobot/extras/templates/extras/jobqueue_retrieve.html +9 -1
- nautobot/extras/templates/extras/marketplace.html +11 -29
- nautobot/extras/templates/extras/plugin_detail.html +15 -32
- nautobot/extras/templates/extras/plugins_tiles.html +10 -21
- nautobot/extras/test_jobs/api_test_job.py +1 -1
- nautobot/extras/test_jobs/atomic_transaction.py +2 -2
- nautobot/extras/test_jobs/dry_run.py +1 -1
- nautobot/extras/test_jobs/fail.py +5 -5
- nautobot/extras/test_jobs/file_output.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -1
- nautobot/extras/test_jobs/file_upload_pass.py +1 -1
- nautobot/extras/test_jobs/ipaddress_vars.py +1 -3
- nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
- nautobot/extras/test_jobs/log_redaction.py +1 -1
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
- nautobot/extras/test_jobs/modify_db.py +1 -1
- nautobot/extras/test_jobs/object_var_optional.py +1 -1
- nautobot/extras/test_jobs/object_var_required.py +1 -1
- nautobot/extras/test_jobs/object_vars.py +1 -1
- nautobot/extras/test_jobs/pass.py +3 -3
- nautobot/extras/test_jobs/profiling.py +1 -1
- nautobot/extras/test_jobs/relative_import.py +3 -3
- nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
- nautobot/extras/test_jobs/task_queues.py +1 -1
- nautobot/extras/tests/integration/test_plugin_banner.py +2 -0
- nautobot/extras/tests/test_api.py +13 -13
- nautobot/extras/tests/test_customfields.py +1 -1
- nautobot/extras/tests/test_datasources.py +1 -2
- nautobot/extras/tests/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/test_filters.py +6 -6
- nautobot/extras/tests/test_forms.py +1 -20
- nautobot/extras/tests/test_jobs.py +19 -160
- nautobot/extras/tests/test_models.py +10 -10
- nautobot/extras/tests/test_plugins.py +9 -62
- nautobot/extras/tests/test_relationships.py +9 -120
- nautobot/extras/tests/test_views.py +191 -52
- nautobot/extras/utils.py +2 -3
- nautobot/extras/views.py +98 -30
- nautobot/ipam/api/fields.py +3 -3
- nautobot/ipam/api/serializers.py +33 -41
- nautobot/ipam/api/views.py +117 -68
- nautobot/ipam/factory.py +1 -1
- nautobot/ipam/filters.py +2 -3
- nautobot/ipam/lookups.py +62 -101
- nautobot/ipam/models.py +16 -66
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +7 -23
- nautobot/ipam/templates/ipam/ipaddress.html +9 -1
- nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +7 -1
- nautobot/ipam/templates/ipam/ipaddress_edit.html +7 -1
- nautobot/ipam/templates/ipam/prefix.html +9 -1
- nautobot/ipam/templates/ipam/prefix_edit.html +7 -1
- nautobot/ipam/templates/ipam/vlan.html +9 -1
- nautobot/ipam/templates/ipam/vlan_edit.html +7 -1
- nautobot/ipam/templates/ipam/vrf_edit.html +7 -1
- nautobot/ipam/tests/test_api.py +3 -416
- nautobot/ipam/tests/test_forms.py +47 -49
- nautobot/ipam/tests/test_migrations.py +30 -30
- nautobot/ipam/tests/test_models.py +34 -95
- nautobot/ipam/tests/test_querysets.py +1 -63
- nautobot/ipam/tests/test_views.py +0 -3
- nautobot/ipam/utils/__init__.py +6 -36
- nautobot/ipam/views.py +87 -61
- 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.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +2 -40
- 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/docs/404.html +4 -46
- nautobot/project-static/docs/apps/index.html +4 -46
- nautobot/project-static/docs/apps/nautobot-apps.html +6 -47
- nautobot/project-static/docs/assets/_mkdocstrings.css +1 -25
- nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js → bundle.83f73b43.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.88dd0f4e.min.js.map → bundle.83f73b43.min.js.map} +2 -2
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -62
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +7 -59
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +122 -374
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +18 -90
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +21 -95
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +6 -53
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +5 -52
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +17 -79
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +28 -102
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +21 -108
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +38 -131
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +65 -239
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +165 -581
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +36 -109
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +167 -453
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +211 -493
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +8 -60
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +15 -71
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +55 -407
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +205 -585
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +412 -858
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +7 -59
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +186 -448
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +147 -365
- nautobot/project-static/docs/development/apps/api/configuration-view.html +4 -46
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/global-search.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/graphql.html +4 -46
- nautobot/project-static/docs/development/apps/api/models/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +4 -46
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +7 -68
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +4 -46
- nautobot/project-static/docs/development/apps/api/prometheus.html +4 -46
- nautobot/project-static/docs/development/apps/api/setup.html +4 -46
- nautobot/project-static/docs/development/apps/api/testing.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +4 -46
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/base-template.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/index.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/notes.html +4 -46
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +6 -52
- nautobot/project-static/docs/development/apps/api/views/urls.html +4 -46
- nautobot/project-static/docs/development/apps/index.html +4 -46
- nautobot/project-static/docs/development/apps/migration/code-updates.html +4 -46
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +4 -46
- nautobot/project-static/docs/development/apps/migration/from-v1.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +4 -46
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +4 -46
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +8 -50
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +4 -46
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +14 -211
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +4 -46
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +4 -46
- nautobot/project-static/docs/development/core/application-registry.html +4 -46
- nautobot/project-static/docs/development/core/best-practices.html +4 -46
- nautobot/project-static/docs/development/core/bootstrap-ui.html +4 -46
- nautobot/project-static/docs/development/core/caching.html +4 -46
- nautobot/project-static/docs/development/core/controllers.html +4 -46
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +74 -73
- nautobot/project-static/docs/development/core/generic-views.html +4 -46
- nautobot/project-static/docs/development/core/getting-started.html +224 -249
- nautobot/project-static/docs/development/core/homepage.html +7 -49
- nautobot/project-static/docs/development/core/index.html +4 -46
- nautobot/project-static/docs/development/core/{minikube-dev-environment-for-k8s-jobs.html → local-k8s.html} +168 -469
- nautobot/project-static/docs/development/core/model-checklist.html +12 -56
- nautobot/project-static/docs/development/core/model-features.html +4 -46
- nautobot/project-static/docs/development/core/natural-keys.html +4 -46
- nautobot/project-static/docs/development/core/navigation-menu.html +4 -46
- nautobot/project-static/docs/development/core/release-checklist.html +7 -49
- nautobot/project-static/docs/development/core/role-internals.html +4 -46
- nautobot/project-static/docs/development/core/settings.html +4 -46
- nautobot/project-static/docs/development/core/style-guide.html +7 -49
- nautobot/project-static/docs/development/core/templates.html +4 -46
- nautobot/project-static/docs/development/core/testing.html +4 -46
- nautobot/project-static/docs/development/core/ui-component-framework.html +273 -369
- nautobot/project-static/docs/development/core/user-preferences.html +4 -46
- nautobot/project-static/docs/development/index.html +4 -46
- nautobot/project-static/docs/development/jobs/index.html +122 -216
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +4 -46
- nautobot/project-static/docs/index.html +23 -54
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +7 -47
- nautobot/project-static/docs/overview/design_philosophy.html +4 -46
- nautobot/project-static/docs/release-notes/index.html +12 -52
- nautobot/project-static/docs/release-notes/version-1.0.html +193 -234
- nautobot/project-static/docs/release-notes/version-1.1.html +190 -231
- nautobot/project-static/docs/release-notes/version-1.2.html +265 -306
- nautobot/project-static/docs/release-notes/version-1.3.html +291 -332
- nautobot/project-static/docs/release-notes/version-1.4.html +377 -417
- nautobot/project-static/docs/release-notes/version-1.5.html +566 -605
- nautobot/project-static/docs/release-notes/version-1.6.html +447 -904
- nautobot/project-static/docs/release-notes/version-2.0.html +489 -528
- nautobot/project-static/docs/release-notes/version-2.1.html +324 -363
- nautobot/project-static/docs/release-notes/version-2.2.html +317 -356
- nautobot/project-static/docs/release-notes/version-2.3.html +352 -997
- nautobot/project-static/docs/release-notes/version-2.4.html +101 -417
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +287 -295
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +6 -48
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +4 -46
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +8 -110
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +4 -46
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +6 -48
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +8 -66
- nautobot/project-static/docs/user-guide/administration/installation/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +5 -47
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +4 -46
- nautobot/project-static/docs/user-guide/administration/installation/services.html +4 -46
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +4 -46
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +4 -46
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +4 -46
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +8 -49
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +4 -46
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +12 -50
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +7 -49
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +4 -46
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +7 -51
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +4 -46
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +7 -49
- nautobot/project-static/docs/user-guide/index.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +8 -50
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +7 -50
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +7 -49
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +5 -47
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +25 -94
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +5 -74
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +4 -46
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +4 -46
- nautobot/project-static/js/forms.js +1 -1
- nautobot/tenancy/api/views.py +13 -9
- nautobot/tenancy/views.py +2 -4
- nautobot/users/admin.py +1 -1
- nautobot/users/api/serializers.py +4 -5
- nautobot/users/api/views.py +3 -3
- nautobot/virtualization/api/serializers.py +4 -4
- nautobot/virtualization/api/views.py +24 -5
- nautobot/virtualization/filters.py +3 -20
- nautobot/virtualization/models.py +1 -1
- nautobot/virtualization/tables.py +2 -2
- nautobot/virtualization/templates/virtualization/cluster_edit.html +7 -1
- nautobot/virtualization/templates/virtualization/virtualmachine.html +9 -1
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +8 -2
- nautobot/virtualization/tests/test_filters.py +0 -17
- nautobot/wireless/filters.py +2 -2
- nautobot/wireless/forms.py +1 -1
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +9 -1
- nautobot/wireless/tests/test_filters.py +1 -29
- nautobot/wireless/views.py +10 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/METADATA +6 -6
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/RECORD +543 -591
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/WHEEL +1 -1
- nautobot/core/api/constants.py +0 -11
- nautobot/core/jobs/bulk_actions.py +0 -248
- nautobot/core/templates/about.html +0 -67
- nautobot/core/templates/inc/tenancy_form_panel.html +0 -9
- nautobot/core/templates/inc/tenant_table_row.html +0 -11
- nautobot/core/utils/querysets.py +0 -64
- nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +0 -25
- nautobot/dcim/tests/integration/test_controller.py +0 -62
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +0 -71
- nautobot/dcim/tests/test_jobs.py +0 -118
- nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +0 -22
- nautobot/extras/migrations/0121_alter_team_contacts.py +0 -17
- nautobot/extras/test_jobs/singleton.py +0 -16
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +0 -9444
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +0 -9722
- nautobot/wireless/tests/integration/__init__.py +0 -0
- nautobot/wireless/tests/integration/test_radio_profile.py +0 -42
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/NOTICE +0 -0
- {nautobot-2.4.0.dist-info → nautobot-2.4.0b1.dist-info}/entry_points.txt +0 -0
nautobot/dcim/models/__init__.py
CHANGED
|
@@ -63,12 +63,12 @@ __all__ = (
|
|
|
63
63
|
"Device",
|
|
64
64
|
"DeviceBay",
|
|
65
65
|
"DeviceBayTemplate",
|
|
66
|
-
"DeviceFamily",
|
|
67
66
|
"DeviceRedundancyGroup",
|
|
68
67
|
"DeviceType",
|
|
69
68
|
"DeviceTypeToSoftwareImageFile",
|
|
70
69
|
"FrontPort",
|
|
71
70
|
"FrontPortTemplate",
|
|
71
|
+
"DeviceFamily",
|
|
72
72
|
"Interface",
|
|
73
73
|
"InterfaceRedundancyGroup",
|
|
74
74
|
"InterfaceRedundancyGroupAssociation",
|
|
@@ -100,7 +100,7 @@ class ComponentTemplateModel(
|
|
|
100
100
|
def get_absolute_url(self, api=False):
|
|
101
101
|
# TODO: in the new UI, this should be able to link directly to the object, instead of the device-type.
|
|
102
102
|
if not api:
|
|
103
|
-
return self.device_type.get_absolute_url(api=api)
|
|
103
|
+
return self.device_type.get_absolute_url(api=api)
|
|
104
104
|
return super().get_absolute_url(api=api)
|
|
105
105
|
|
|
106
106
|
def instantiate_model(self, model, device, **kwargs):
|
|
@@ -460,7 +460,7 @@ class DeviceBayTemplate(ComponentTemplateModel):
|
|
|
460
460
|
return self.instantiate_model(model=DeviceBay, device=device)
|
|
461
461
|
|
|
462
462
|
def clean(self):
|
|
463
|
-
if self.device_type and self.device_type.subdevice_role != SubdeviceRoleChoices.ROLE_PARENT:
|
|
463
|
+
if self.device_type and self.device_type.subdevice_role != SubdeviceRoleChoices.ROLE_PARENT:
|
|
464
464
|
raise ValidationError(
|
|
465
465
|
f'Subdevice role of device type ({self.device_type}) must be set to "parent" to allow device bays.'
|
|
466
466
|
)
|
|
@@ -138,7 +138,7 @@ class ModularComponentModel(ComponentModel):
|
|
|
138
138
|
@property
|
|
139
139
|
def parent(self):
|
|
140
140
|
"""Device that this component belongs to, walking up module inheritance if necessary."""
|
|
141
|
-
return self.module.device if self.module else self.device
|
|
141
|
+
return self.module.device if self.module else self.device
|
|
142
142
|
|
|
143
143
|
def render_name_template(self, save=False):
|
|
144
144
|
"""
|
|
@@ -161,9 +161,9 @@ class ModularComponentModel(ComponentModel):
|
|
|
161
161
|
|
|
162
162
|
The deeply nested interface would be named "A{module.parent}" after calling this method.
|
|
163
163
|
"""
|
|
164
|
-
if self.module and self.module.parent_module_bay and "{module" in self.name:
|
|
164
|
+
if self.module and self.module.parent_module_bay and "{module" in self.name:
|
|
165
165
|
name = ""
|
|
166
|
-
module_bay = self.module.parent_module_bay
|
|
166
|
+
module_bay = self.module.parent_module_bay
|
|
167
167
|
positions = []
|
|
168
168
|
while module_bay is not None:
|
|
169
169
|
position = getattr(module_bay, "position", None)
|
|
@@ -291,11 +291,11 @@ class PathEndpoint(models.Model):
|
|
|
291
291
|
return []
|
|
292
292
|
|
|
293
293
|
# Construct the complete path
|
|
294
|
-
path = [self, *self._path.get_path()]
|
|
294
|
+
path = [self, *self._path.get_path()]
|
|
295
295
|
while (len(path) + 1) % 3:
|
|
296
296
|
# Pad to ensure we have complete three-tuples (e.g. for paths that end at a RearPort)
|
|
297
297
|
path.append(None)
|
|
298
|
-
path.append(self._path.destination)
|
|
298
|
+
path.append(self._path.destination)
|
|
299
299
|
|
|
300
300
|
# Return the path as a list of three-tuples (A termination, cable, B termination)
|
|
301
301
|
return list(zip(*[iter(path)] * 3))
|
|
@@ -555,7 +555,7 @@ class BaseInterface(RelationshipModel):
|
|
|
555
555
|
|
|
556
556
|
def clean(self):
|
|
557
557
|
# Remove untagged VLAN assignment for non-802.1Q interfaces
|
|
558
|
-
if not self.mode and self.untagged_vlan is not None:
|
|
558
|
+
if not self.mode and self.untagged_vlan is not None:
|
|
559
559
|
raise ValidationError({"untagged_vlan": "Mode must be set when specifying untagged_vlan"})
|
|
560
560
|
|
|
561
561
|
def save(self, *args, **kwargs):
|
|
@@ -569,8 +569,8 @@ class BaseInterface(RelationshipModel):
|
|
|
569
569
|
self.status = status
|
|
570
570
|
|
|
571
571
|
# Only "tagged" interfaces may have tagged VLANs assigned. ("tagged all" implies all VLANs are assigned.)
|
|
572
|
-
if self.present_in_database and self.mode != InterfaceModeChoices.MODE_TAGGED:
|
|
573
|
-
self.tagged_vlans.clear()
|
|
572
|
+
if self.present_in_database and self.mode != InterfaceModeChoices.MODE_TAGGED:
|
|
573
|
+
self.tagged_vlans.clear()
|
|
574
574
|
|
|
575
575
|
return super().save(*args, **kwargs)
|
|
576
576
|
|
|
@@ -710,19 +710,18 @@ class Interface(ModularComponentModel, CableTermination, PathEndpoint, BaseInter
|
|
|
710
710
|
)
|
|
711
711
|
|
|
712
712
|
# An interface's parent must belong to the same device or virtual chassis
|
|
713
|
-
if self.parent and self.parent_interface.parent != self.parent:
|
|
713
|
+
if self.parent and self.parent_interface.parent != self.parent:
|
|
714
714
|
if getattr(self.parent, "virtual_chassis", None) is None:
|
|
715
715
|
raise ValidationError(
|
|
716
|
-
{
|
|
717
|
-
"parent_interface": f"The selected parent interface ({self.parent_interface}) belongs "
|
|
718
|
-
f"
|
|
716
|
+
{
|
|
717
|
+
"parent_interface": f"The selected parent interface ({self.parent_interface}) belongs to a different device "
|
|
718
|
+
f"({self.parent_interface.parent})."
|
|
719
719
|
}
|
|
720
720
|
)
|
|
721
|
-
elif self.parent_interface.parent.virtual_chassis != self.parent.virtual_chassis:
|
|
721
|
+
elif self.parent_interface.parent.virtual_chassis != self.parent.virtual_chassis:
|
|
722
722
|
raise ValidationError(
|
|
723
|
-
{
|
|
724
|
-
"parent_interface": f"The selected parent interface ({self.parent_interface}) belongs "
|
|
725
|
-
f"to {self.parent_interface.parent}, which "
|
|
723
|
+
{
|
|
724
|
+
"parent_interface": f"The selected parent interface ({self.parent_interface}) belongs to {self.parent_interface.parent}, which "
|
|
726
725
|
f"is not part of virtual chassis {self.parent.virtual_chassis}."
|
|
727
726
|
}
|
|
728
727
|
)
|
|
@@ -755,22 +754,21 @@ class Interface(ModularComponentModel, CableTermination, PathEndpoint, BaseInter
|
|
|
755
754
|
raise ValidationError({"bridge": "An interface cannot be bridged to itself."})
|
|
756
755
|
|
|
757
756
|
# A bridged interface belong to the same device or virtual chassis
|
|
758
|
-
if self.parent and self.bridge.parent != self.parent:
|
|
757
|
+
if self.parent and self.bridge.parent != self.parent:
|
|
759
758
|
if getattr(self.parent, "virtual_chassis", None) is None:
|
|
760
759
|
raise ValidationError(
|
|
761
760
|
{
|
|
762
761
|
"bridge": (
|
|
763
|
-
# pylint: disable=no-member # false positive on bridge.parent
|
|
764
762
|
f"The selected bridge interface ({self.bridge}) belongs to a different device "
|
|
765
763
|
f"({self.bridge.parent})."
|
|
766
764
|
)
|
|
767
765
|
}
|
|
768
766
|
)
|
|
769
|
-
elif self.bridge.parent.virtual_chassis_id != self.parent.virtual_chassis_id:
|
|
767
|
+
elif self.bridge.parent.virtual_chassis_id != self.parent.virtual_chassis_id:
|
|
770
768
|
raise ValidationError(
|
|
771
769
|
{
|
|
772
770
|
"bridge": (
|
|
773
|
-
f"The selected bridge interface ({self.bridge}) belongs to {self.bridge.parent}, which "
|
|
771
|
+
f"The selected bridge interface ({self.bridge}) belongs to {self.bridge.parent}, which "
|
|
774
772
|
f"is not part of virtual chassis {self.parent.virtual_chassis}."
|
|
775
773
|
)
|
|
776
774
|
}
|
|
@@ -1086,8 +1084,8 @@ class DeviceBay(ComponentModel):
|
|
|
1086
1084
|
super().clean()
|
|
1087
1085
|
|
|
1088
1086
|
# Validate that the parent Device can have DeviceBays
|
|
1089
|
-
if not self.device.device_type.is_parent_device:
|
|
1090
|
-
raise ValidationError(f"This type of device ({self.device.device_type}) does not support device bays.")
|
|
1087
|
+
if not self.device.device_type.is_parent_device:
|
|
1088
|
+
raise ValidationError(f"This type of device ({self.device.device_type}) does not support device bays.")
|
|
1091
1089
|
|
|
1092
1090
|
# Cannot install a device into itself, obviously
|
|
1093
1091
|
if self.device == self.installed_device:
|
nautobot/dcim/models/devices.py
CHANGED
|
@@ -48,7 +48,6 @@ __all__ = (
|
|
|
48
48
|
"Controller",
|
|
49
49
|
"ControllerManagedDeviceGroup",
|
|
50
50
|
"Device",
|
|
51
|
-
"DeviceFamily",
|
|
52
51
|
"DeviceRedundancyGroup",
|
|
53
52
|
"DeviceType",
|
|
54
53
|
"InterfaceVDCAssignment",
|
|
@@ -824,7 +823,6 @@ class Device(PrimaryModel, ConfigContextModel):
|
|
|
824
823
|
|
|
825
824
|
# If any software image file is specified, validate that
|
|
826
825
|
# each of the software image files belongs to the device's device type or is a default image
|
|
827
|
-
# TODO: this is incorrect as we cannot validate a ManyToMany during clean() - nautobot/nautobot#6344
|
|
828
826
|
for image_file in self.software_image_files.all():
|
|
829
827
|
if not image_file.default_image and self.device_type not in image_file.device_types.all():
|
|
830
828
|
raise ValidationError(
|
|
@@ -1483,13 +1481,6 @@ class ControllerManagedDeviceGroup(TreeModel, PrimaryModel):
|
|
|
1483
1481
|
null=True,
|
|
1484
1482
|
help_text="List of capabilities supported by the controller device group, these capabilities are used to enhance views in Nautobot.",
|
|
1485
1483
|
)
|
|
1486
|
-
tenant = models.ForeignKey(
|
|
1487
|
-
to="tenancy.Tenant",
|
|
1488
|
-
on_delete=models.PROTECT,
|
|
1489
|
-
related_name="controller_managed_device_groups",
|
|
1490
|
-
blank=True,
|
|
1491
|
-
null=True,
|
|
1492
|
-
)
|
|
1493
1484
|
|
|
1494
1485
|
class Meta:
|
|
1495
1486
|
ordering = ("weight",)
|
|
@@ -1509,7 +1500,7 @@ class ControllerManagedDeviceGroup(TreeModel, PrimaryModel):
|
|
|
1509
1500
|
if self.controller == self._original_controller and self.parent == self._original_parent:
|
|
1510
1501
|
return
|
|
1511
1502
|
|
|
1512
|
-
if self.parent and self.controller and self.controller != self.parent.controller:
|
|
1503
|
+
if self.parent and self.controller and self.controller != self.parent.controller:
|
|
1513
1504
|
raise ValidationError(
|
|
1514
1505
|
{"controller": "Controller device group must have the same controller as the parent group."}
|
|
1515
1506
|
)
|
|
@@ -283,7 +283,7 @@ class Location(TreeModel, PrimaryModel):
|
|
|
283
283
|
# We shouldn't have a parent, *unless* our own location type is permitted to be nested.
|
|
284
284
|
if self.parent is not None:
|
|
285
285
|
if self.location_type.nestable:
|
|
286
|
-
if self.parent.location_type != self.location_type:
|
|
286
|
+
if self.parent.location_type != self.location_type:
|
|
287
287
|
raise ValidationError(
|
|
288
288
|
{
|
|
289
289
|
"parent": f"A Location of type {self.location_type} may only have "
|
|
@@ -304,7 +304,7 @@ class Location(TreeModel, PrimaryModel):
|
|
|
304
304
|
|
|
305
305
|
# Is the parent location of a correct type?
|
|
306
306
|
if self.location_type.nestable:
|
|
307
|
-
if self.parent.location_type not in (self.location_type, self.location_type.parent):
|
|
307
|
+
if self.parent.location_type not in (self.location_type, self.location_type.parent):
|
|
308
308
|
raise ValidationError(
|
|
309
309
|
{
|
|
310
310
|
"parent": f"A Location of type {self.location_type} can only have a Location "
|
|
@@ -312,7 +312,7 @@ class Location(TreeModel, PrimaryModel):
|
|
|
312
312
|
}
|
|
313
313
|
)
|
|
314
314
|
else:
|
|
315
|
-
if self.parent.location_type != self.location_type.parent:
|
|
315
|
+
if self.parent.location_type != self.location_type.parent:
|
|
316
316
|
raise ValidationError(
|
|
317
317
|
{
|
|
318
318
|
"parent": f"A Location of type {self.location_type} can only have a Location "
|
nautobot/dcim/models/power.py
CHANGED
|
@@ -73,11 +73,11 @@ class PowerPanel(PrimaryModel):
|
|
|
73
73
|
if self.rack_group:
|
|
74
74
|
if (
|
|
75
75
|
self.location is not None
|
|
76
|
-
and self.rack_group.location is not None
|
|
77
|
-
and self.rack_group.location not in self.location.ancestors(include_self=True)
|
|
76
|
+
and self.rack_group.location is not None
|
|
77
|
+
and self.rack_group.location not in self.location.ancestors(include_self=True)
|
|
78
78
|
):
|
|
79
79
|
raise ValidationError(
|
|
80
|
-
{
|
|
80
|
+
{
|
|
81
81
|
"rack_group": f'Rack group "{self.rack_group}" belongs to a location '
|
|
82
82
|
f'("{self.rack_group.location}") that does not contain "{self.location}".'
|
|
83
83
|
}
|
|
@@ -151,10 +151,9 @@ class PowerFeed(PrimaryModel, PathEndpoint, CableTermination):
|
|
|
151
151
|
super().clean()
|
|
152
152
|
|
|
153
153
|
# Rack must belong to same Location as PowerPanel
|
|
154
|
-
if self.rack and self.rack.location != self.power_panel.location:
|
|
154
|
+
if self.rack and self.rack.location != self.power_panel.location:
|
|
155
155
|
raise ValidationError(
|
|
156
|
-
f"Rack {self.rack} ({self.rack.location}) and
|
|
157
|
-
f"power panel {self.power_panel} ({self.power_panel.location}) are in different locations"
|
|
156
|
+
f"Rack {self.rack} ({self.rack.location}) and power panel {self.power_panel} ({self.power_panel.location}) are in different locations"
|
|
158
157
|
)
|
|
159
158
|
|
|
160
159
|
# AC voltage cannot be negative
|
nautobot/dcim/models/racks.py
CHANGED
|
@@ -77,11 +77,11 @@ class RackGroup(TreeModel, OrganizationalModel):
|
|
|
77
77
|
# Parent RackGroup (if any) must belong to the same or ancestor Location
|
|
78
78
|
if (
|
|
79
79
|
self.parent is not None
|
|
80
|
-
and self.parent.location is not None
|
|
81
|
-
and self.parent.location not in self.location.ancestors(include_self=True)
|
|
80
|
+
and self.parent.location is not None
|
|
81
|
+
and self.parent.location not in self.location.ancestors(include_self=True)
|
|
82
82
|
):
|
|
83
83
|
raise ValidationError(
|
|
84
|
-
{
|
|
84
|
+
{
|
|
85
85
|
"location": f'Location "{self.location}" is not descended from '
|
|
86
86
|
f'parent rack group "{self.parent}" location "{self.parent.location}".'
|
|
87
87
|
}
|
|
@@ -296,7 +296,7 @@ class Rack(PrimaryModel):
|
|
|
296
296
|
# Determine which devices the user has permission to view
|
|
297
297
|
permitted_device_ids = []
|
|
298
298
|
if user is not None:
|
|
299
|
-
permitted_device_ids = self.devices.restrict(user, "view").values_list("pk", flat=True)
|
|
299
|
+
permitted_device_ids = self.devices.restrict(user, "view").values_list("pk", flat=True)
|
|
300
300
|
|
|
301
301
|
for device in queryset:
|
|
302
302
|
if expand_devices:
|
nautobot/dcim/tables/__init__.py
CHANGED
|
@@ -145,7 +145,7 @@ class ConsoleConnectionTable(BaseTable):
|
|
|
145
145
|
linkify=True,
|
|
146
146
|
verbose_name="Port",
|
|
147
147
|
)
|
|
148
|
-
device = tables.Column(linkify=True, accessor="parent"
|
|
148
|
+
device = tables.Column(linkify=True, accessor="parent")
|
|
149
149
|
name = tables.Column(linkify=True, verbose_name="Console Port")
|
|
150
150
|
reachable = BooleanColumn(accessor=Accessor("_path__is_active"), verbose_name="Reachable")
|
|
151
151
|
|
|
@@ -173,7 +173,7 @@ class PowerConnectionTable(BaseTable):
|
|
|
173
173
|
linkify=True,
|
|
174
174
|
verbose_name="Outlet",
|
|
175
175
|
)
|
|
176
|
-
device = tables.Column(linkify=True, accessor="parent"
|
|
176
|
+
device = tables.Column(linkify=True, accessor="parent")
|
|
177
177
|
name = tables.Column(linkify=True, verbose_name="Power Port")
|
|
178
178
|
reachable = BooleanColumn(accessor=Accessor("_path__is_active"), verbose_name="Reachable")
|
|
179
179
|
|
|
@@ -183,7 +183,7 @@ class PowerConnectionTable(BaseTable):
|
|
|
183
183
|
|
|
184
184
|
|
|
185
185
|
class InterfaceConnectionTable(BaseTable):
|
|
186
|
-
device_a = tables.Column(accessor=Accessor("parent"), linkify=True, verbose_name="Device A"
|
|
186
|
+
device_a = tables.Column(accessor=Accessor("parent"), linkify=True, verbose_name="Device A")
|
|
187
187
|
interface_a = tables.Column(accessor=Accessor("name"), linkify=True, verbose_name="Interface A")
|
|
188
188
|
device_b = tables.Column(
|
|
189
189
|
accessor=Accessor("_path__destination__parent"),
|
nautobot/dcim/tables/devices.py
CHANGED
|
@@ -64,8 +64,8 @@ from .template_code import (
|
|
|
64
64
|
__all__ = (
|
|
65
65
|
"ConsolePortTable",
|
|
66
66
|
"ConsoleServerPortTable",
|
|
67
|
-
"ControllerManagedDeviceGroupTable",
|
|
68
67
|
"ControllerTable",
|
|
68
|
+
"ControllerManagedDeviceGroupTable",
|
|
69
69
|
"DeviceBayTable",
|
|
70
70
|
"DeviceDeviceBayTable",
|
|
71
71
|
"DeviceImportTable",
|
|
@@ -75,19 +75,19 @@ __all__ = (
|
|
|
75
75
|
"DeviceModuleConsoleServerPortTable",
|
|
76
76
|
"DeviceModuleFrontPortTable",
|
|
77
77
|
"DeviceModuleInterfaceTable",
|
|
78
|
-
"DeviceModulePowerOutletTable",
|
|
79
78
|
"DeviceModulePowerPortTable",
|
|
79
|
+
"DeviceModulePowerOutletTable",
|
|
80
80
|
"DeviceModuleRearPortTable",
|
|
81
81
|
"DeviceRedundancyGroupTable",
|
|
82
82
|
"DeviceTable",
|
|
83
83
|
"FrontPortTable",
|
|
84
|
-
"InterfaceRedundancyGroupAssociationTable",
|
|
85
|
-
"InterfaceRedundancyGroupTable",
|
|
86
84
|
"InterfaceTable",
|
|
85
|
+
"InterfaceRedundancyGroupTable",
|
|
86
|
+
"InterfaceRedundancyGroupAssociationTable",
|
|
87
87
|
"InventoryItemTable",
|
|
88
|
+
"ModuleTable",
|
|
88
89
|
"ModuleBayTable",
|
|
89
90
|
"ModuleModuleBayTable",
|
|
90
|
-
"ModuleTable",
|
|
91
91
|
"PlatformTable",
|
|
92
92
|
"PowerOutletTable",
|
|
93
93
|
"PowerPortTable",
|
|
@@ -1409,7 +1409,6 @@ class ControllerManagedDeviceGroupTable(BaseTable):
|
|
|
1409
1409
|
name = tables.TemplateColumn(template_code=TREE_LINK, attrs={"td": {"class": "text-nowrap"}})
|
|
1410
1410
|
weight = tables.Column()
|
|
1411
1411
|
controller = tables.Column(linkify=True)
|
|
1412
|
-
tenant = TenantColumn()
|
|
1413
1412
|
capabilities = tables.Column()
|
|
1414
1413
|
tags = TagColumn(url_name="dcim:controllermanageddevicegroup_list")
|
|
1415
1414
|
actions = ButtonsColumn(ControllerManagedDeviceGroup)
|
|
@@ -1441,7 +1440,6 @@ class ControllerManagedDeviceGroupTable(BaseTable):
|
|
|
1441
1440
|
"wireless_networks_count",
|
|
1442
1441
|
"controller",
|
|
1443
1442
|
"weight",
|
|
1444
|
-
"tenant",
|
|
1445
1443
|
"capabilities",
|
|
1446
1444
|
"tags",
|
|
1447
1445
|
"actions",
|
|
@@ -253,7 +253,7 @@ class PowerOutletTemplateTable(ComponentTemplateTable):
|
|
|
253
253
|
"name",
|
|
254
254
|
"label",
|
|
255
255
|
"type",
|
|
256
|
-
"
|
|
256
|
+
"power_port",
|
|
257
257
|
"feed_leg",
|
|
258
258
|
"description",
|
|
259
259
|
"actions",
|
|
@@ -290,7 +290,7 @@ class FrontPortTemplateTable(ComponentTemplateTable):
|
|
|
290
290
|
"name",
|
|
291
291
|
"label",
|
|
292
292
|
"type",
|
|
293
|
-
"
|
|
293
|
+
"rear_port",
|
|
294
294
|
"rear_port_position",
|
|
295
295
|
"description",
|
|
296
296
|
"actions",
|
nautobot/dcim/tables/racks.py
CHANGED
|
@@ -15,10 +15,10 @@ from nautobot.tenancy.tables import TenantColumn
|
|
|
15
15
|
from .template_code import RACKGROUP_ELEVATIONS, TREE_LINK, UTILIZATION_GRAPH
|
|
16
16
|
|
|
17
17
|
__all__ = (
|
|
18
|
+
"RackTable",
|
|
18
19
|
"RackDetailTable",
|
|
19
20
|
"RackGroupTable",
|
|
20
21
|
"RackReservationTable",
|
|
21
|
-
"RackTable",
|
|
22
22
|
)
|
|
23
23
|
|
|
24
24
|
|
|
@@ -34,7 +34,13 @@
|
|
|
34
34
|
{% endwith %}
|
|
35
35
|
</div>
|
|
36
36
|
</div>
|
|
37
|
-
|
|
37
|
+
<div class="panel panel-default">
|
|
38
|
+
<div class="panel-heading"><strong>Tenancy</strong></div>
|
|
39
|
+
<div class="panel-body">
|
|
40
|
+
{% render_field form.tenant_group %}
|
|
41
|
+
{% render_field form.tenant %}
|
|
42
|
+
</div>
|
|
43
|
+
</div>
|
|
38
44
|
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
39
45
|
{% endblock form %}
|
|
40
46
|
|
|
@@ -34,7 +34,15 @@
|
|
|
34
34
|
<td>Platform</td>
|
|
35
35
|
<td>{{ object.platform|hyperlinked_object }}</td>
|
|
36
36
|
</tr>
|
|
37
|
-
|
|
37
|
+
<tr>
|
|
38
|
+
<td>Tenant</td>
|
|
39
|
+
<td>
|
|
40
|
+
{% if object.tenant and object.tenant.tenant_group %}
|
|
41
|
+
{{ object.tenant.tenant_group|hyperlinked_object }} /
|
|
42
|
+
{% endif %}
|
|
43
|
+
{{ object.tenant|hyperlinked_object }}
|
|
44
|
+
</td>
|
|
45
|
+
</tr>
|
|
38
46
|
<tr>
|
|
39
47
|
<td>Description</td>
|
|
40
48
|
<td>{{ object.description|placeholder }}</td>
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
{% render_field form.capabilities %}
|
|
16
16
|
{% render_field form.weight %}
|
|
17
17
|
{% render_field form.radio_profiles %}
|
|
18
|
-
{% render_field form.description %}
|
|
19
18
|
</div>
|
|
20
19
|
</div>
|
|
21
20
|
<div class="panel panel-default">
|
|
@@ -70,7 +69,6 @@
|
|
|
70
69
|
</table>
|
|
71
70
|
</div>
|
|
72
71
|
</div>
|
|
73
|
-
{% include 'inc/tenancy_form_panel.html' %}
|
|
74
72
|
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
75
73
|
{% endblock form %}
|
|
76
74
|
|
|
@@ -51,7 +51,15 @@
|
|
|
51
51
|
{% endif %}
|
|
52
52
|
</td>
|
|
53
53
|
</tr>
|
|
54
|
-
|
|
54
|
+
<tr>
|
|
55
|
+
<td>Tenant</td>
|
|
56
|
+
<td>
|
|
57
|
+
{% if object.tenant and object.tenant.tenant_group %}
|
|
58
|
+
{{ object.tenant.tenant_group|hyperlinked_object }} /
|
|
59
|
+
{% endif %}
|
|
60
|
+
{{ object.tenant|hyperlinked_object }}
|
|
61
|
+
</td>
|
|
62
|
+
</tr>
|
|
55
63
|
<tr>
|
|
56
64
|
<td>Device Family</td>
|
|
57
65
|
<td>{{ object.device_type.device_family|hyperlinked_object }}</td>
|
|
@@ -9,8 +9,34 @@
|
|
|
9
9
|
<div class="panel-body">
|
|
10
10
|
{% render_field form.name %}
|
|
11
11
|
{% render_field form.role %}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="panel panel-default">
|
|
15
|
+
<div class="panel-heading"><strong>Hardware</strong></div>
|
|
16
|
+
<div class="panel-body">
|
|
17
|
+
{% render_field form.manufacturer %}
|
|
18
|
+
{% render_field form.device_type %}
|
|
19
|
+
{% render_field form.serial %}
|
|
20
|
+
{% render_field form.asset_tag %}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="panel panel-default">
|
|
24
|
+
<div class="panel-heading"><strong>Software</strong></div>
|
|
25
|
+
<div class="panel-body">
|
|
26
|
+
{% render_field form.platform %}
|
|
27
|
+
{% render_field form.software_version %}
|
|
28
|
+
<div class="form-group" id="software_version_image_container" style="display:none">
|
|
29
|
+
<div class="col-md-3"></div>
|
|
30
|
+
<div class="col-md-9">
|
|
31
|
+
<span class="help-block">
|
|
32
|
+
<span id="software_version_image_description"><img src="{% static 'img/ajax-loader.gif' %}"></span>
|
|
33
|
+
<ul id="software_version_image_list">
|
|
34
|
+
<li> Software images for the selected software version will appear here </li>
|
|
35
|
+
</ul>
|
|
36
|
+
</span>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
{% render_field form.software_image_files %}
|
|
14
40
|
</div>
|
|
15
41
|
</div>
|
|
16
42
|
<div class="panel panel-default">
|
|
@@ -47,34 +73,6 @@
|
|
|
47
73
|
{% endif %}
|
|
48
74
|
</div>
|
|
49
75
|
</div>
|
|
50
|
-
<div class="panel panel-default">
|
|
51
|
-
<div class="panel-heading"><strong>Hardware</strong></div>
|
|
52
|
-
<div class="panel-body">
|
|
53
|
-
{% render_field form.manufacturer %}
|
|
54
|
-
{% render_field form.device_type %}
|
|
55
|
-
{% render_field form.serial %}
|
|
56
|
-
{% render_field form.asset_tag %}
|
|
57
|
-
</div>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="panel panel-default">
|
|
60
|
-
<div class="panel-heading"><strong>Software</strong></div>
|
|
61
|
-
<div class="panel-body">
|
|
62
|
-
{% render_field form.platform %}
|
|
63
|
-
{% render_field form.software_version %}
|
|
64
|
-
<div class="form-group" id="software_version_image_container" style="display:none">
|
|
65
|
-
<div class="col-md-3"></div>
|
|
66
|
-
<div class="col-md-9">
|
|
67
|
-
<span class="help-block">
|
|
68
|
-
<span id="software_version_image_description"><img src="{% static 'img/ajax-loader.gif' %}"></span>
|
|
69
|
-
<ul id="software_version_image_list">
|
|
70
|
-
<li> Software images for the selected software version will appear here </li>
|
|
71
|
-
</ul>
|
|
72
|
-
</span>
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
{% render_field form.software_image_files %}
|
|
76
|
-
</div>
|
|
77
|
-
</div>
|
|
78
76
|
<div class="panel panel-default">
|
|
79
77
|
<div class="panel-heading"><strong>VRF Assignment</strong></div>
|
|
80
78
|
<div class="panel-body">
|
|
@@ -84,15 +82,12 @@
|
|
|
84
82
|
<div class="panel panel-default">
|
|
85
83
|
<div class="panel-heading"><strong>Management</strong></div>
|
|
86
84
|
<div class="panel-body">
|
|
85
|
+
{% render_field form.status %}
|
|
87
86
|
{% if editing %}
|
|
88
87
|
{% render_field form.primary_ip4 %}
|
|
89
88
|
{% render_field form.primary_ip6 %}
|
|
90
89
|
{% endif %}
|
|
91
|
-
|
|
92
|
-
</div>
|
|
93
|
-
<div class="panel panel-default">
|
|
94
|
-
<div class="panel-heading"><strong>Topology</strong></div>
|
|
95
|
-
<div class="panel-body">
|
|
90
|
+
{% render_field form.secrets_group %}
|
|
96
91
|
{% render_field form.device_redundancy_group %}
|
|
97
92
|
{% render_field form.device_redundancy_group_priority %}
|
|
98
93
|
{% render_field form.controller_managed_device_group %}
|
|
@@ -105,7 +100,13 @@
|
|
|
105
100
|
{% render_field form.cluster %}
|
|
106
101
|
</div>
|
|
107
102
|
</div>
|
|
108
|
-
|
|
103
|
+
<div class="panel panel-default">
|
|
104
|
+
<div class="panel-heading"><strong>Tenancy</strong></div>
|
|
105
|
+
<div class="panel-body">
|
|
106
|
+
{% render_field form.tenant_group %}
|
|
107
|
+
{% render_field form.tenant %}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
109
110
|
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
110
111
|
<div class="panel panel-default">
|
|
111
112
|
<div class="panel-heading"><strong>Local Config Context Data</strong></div>
|
|
@@ -32,7 +32,15 @@
|
|
|
32
32
|
{% include 'dcim/inc/location_hierarchy.html' with location=object %}
|
|
33
33
|
</td>
|
|
34
34
|
</tr>
|
|
35
|
-
|
|
35
|
+
<tr>
|
|
36
|
+
<td>Tenant</td>
|
|
37
|
+
<td>
|
|
38
|
+
{% if object.tenant and object.tenant.tenant_group %}
|
|
39
|
+
{{ object.tenant.tenant_group|hyperlinked_object }} /
|
|
40
|
+
{% endif %}
|
|
41
|
+
{{ object.tenant|hyperlinked_object }}
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
36
44
|
<tr>
|
|
37
45
|
<td>Facility</td>
|
|
38
46
|
<td>{{ object.facility|placeholder }}</td>
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
{% render_field form.description %}
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
18
|
-
|
|
18
|
+
<div class="panel panel-default">
|
|
19
|
+
<div class="panel-heading"><strong>Tenancy</strong></div>
|
|
20
|
+
<div class="panel-body">
|
|
21
|
+
{% render_field form.tenant_group %}
|
|
22
|
+
{% render_field form.tenant %}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
19
25
|
<div class="panel panel-default">
|
|
20
26
|
<div class="panel-heading"><strong>Contact Info</strong></div>
|
|
21
27
|
<div class="panel-body">
|
|
@@ -57,7 +57,15 @@
|
|
|
57
57
|
<td>Facility ID</td>
|
|
58
58
|
<td>{{ object.facility_id|placeholder }}</td>
|
|
59
59
|
</tr>
|
|
60
|
-
|
|
60
|
+
<tr>
|
|
61
|
+
<td>Tenant</td>
|
|
62
|
+
<td>
|
|
63
|
+
{% if object.tenant and object.tenant.tenant_group %}
|
|
64
|
+
{{ object.tenant.tenant_group|hyperlinked_object }} /
|
|
65
|
+
{% endif %}
|
|
66
|
+
{{ object.tenant|hyperlinked_object }}
|
|
67
|
+
</td>
|
|
68
|
+
</tr>
|
|
61
69
|
<tr>
|
|
62
70
|
<td>Status</td>
|
|
63
71
|
<td>
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
{% render_field form.asset_tag %}
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
18
|
-
|
|
18
|
+
<div class="panel panel-default">
|
|
19
|
+
<div class="panel-heading"><strong>Tenancy</strong></div>
|
|
20
|
+
<div class="panel-body">
|
|
21
|
+
{% render_field form.tenant_group %}
|
|
22
|
+
{% render_field form.tenant %}
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
19
25
|
<div class="panel panel-default">
|
|
20
26
|
<div class="panel-heading"><strong>Dimensions</strong></div>
|
|
21
27
|
<div class="panel-body">
|