nautobot 2.3.11__py3-none-any.whl → 2.3.13__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/core/api/serializers.py +1 -0
- nautobot/core/celery/log.py +4 -4
- nautobot/core/models/tree_queries.py +5 -2
- nautobot/core/settings.py +26 -0
- nautobot/core/settings.yaml +31 -0
- nautobot/core/tables.py +60 -10
- nautobot/core/templates/generic/object_notes.html +1 -1
- nautobot/core/templates/generic/object_retrieve.html +1 -1
- nautobot/core/templatetags/helpers.py +7 -1
- nautobot/core/testing/api.py +5 -1
- nautobot/core/testing/views.py +15 -4
- nautobot/core/tests/test_api.py +20 -0
- nautobot/core/tests/test_csv.py +25 -3
- nautobot/core/tests/test_utils.py +8 -0
- nautobot/core/utils/lookup.py +11 -8
- nautobot/dcim/api/views.py +3 -0
- nautobot/dcim/choices.py +6 -0
- nautobot/dcim/filters/__init__.py +26 -1
- nautobot/dcim/forms.py +4 -0
- nautobot/dcim/tables/devices.py +2 -6
- nautobot/dcim/templates/dcim/controller_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/device/base.html +1 -1
- nautobot/dcim/tests/test_filters.py +33 -0
- nautobot/dcim/tests/test_views.py +6 -0
- nautobot/extras/api/serializers.py +1 -0
- nautobot/extras/api/views.py +2 -0
- nautobot/extras/forms/forms.py +2 -0
- nautobot/extras/group_sync.py +42 -0
- nautobot/extras/models/metadata.py +1 -0
- nautobot/extras/models/models.py +1 -1
- nautobot/extras/plugins/__init__.py +15 -3
- nautobot/extras/tables.py +1 -0
- nautobot/extras/templates/extras/inc/job_table.html +1 -1
- nautobot/extras/tests/test_views.py +2 -2
- nautobot/extras/views.py +0 -2
- nautobot/ipam/lookups.py +101 -62
- nautobot/ipam/tables.py +22 -15
- nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +1 -1
- nautobot/ipam/tests/test_querysets.py +49 -1
- nautobot/ipam/utils/__init__.py +24 -0
- nautobot/ipam/views.py +61 -68
- nautobot/project-static/docs/404.html +10 -10
- nautobot/project-static/docs/additional-features/caching.html +1 -2
- nautobot/project-static/docs/additional-features/change-logging.html +1 -2
- nautobot/project-static/docs/additional-features/config-contexts.html +1 -2
- nautobot/project-static/docs/additional-features/healthcheck.html +1 -2
- nautobot/project-static/docs/additional-features/jobs.html +1 -2
- nautobot/project-static/docs/additional-features/prometheus-metrics.html +1 -2
- nautobot/project-static/docs/administration/celery-queues.html +1 -2
- nautobot/project-static/docs/administration/nautobot-server.html +1 -2
- nautobot/project-static/docs/administration/nautobot-shell.html +1 -2
- nautobot/project-static/docs/administration/permissions.html +1 -2
- nautobot/project-static/docs/administration/replicating-nautobot.html +1 -2
- nautobot/project-static/docs/apps/index.html +10 -10
- nautobot/project-static/docs/apps/migrating-jobs-from-nautobot-v1.html +1 -2
- nautobot/project-static/docs/apps/nautobot-apps.html +10 -10
- nautobot/project-static/docs/assets/stylesheets/main.6f8fc17f.min.css +1 -0
- nautobot/project-static/docs/assets/stylesheets/main.6f8fc17f.min.css.map +1 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +206 -14
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +10 -10
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +25 -11
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +10 -10
- nautobot/project-static/docs/configuration/authentication/ldap.html +1 -2
- nautobot/project-static/docs/configuration/authentication/remote.html +1 -2
- nautobot/project-static/docs/configuration/authentication/sso.html +1 -2
- nautobot/project-static/docs/configuration/index.html +1 -2
- nautobot/project-static/docs/configuration/optional-settings.html +1 -2
- nautobot/project-static/docs/configuration/required-settings.html +1 -2
- nautobot/project-static/docs/core-functionality/circuits.html +1 -2
- nautobot/project-static/docs/core-functionality/device-types.html +1 -2
- nautobot/project-static/docs/core-functionality/devices.html +1 -2
- nautobot/project-static/docs/core-functionality/ipam.html +1 -2
- nautobot/project-static/docs/core-functionality/power.html +1 -2
- nautobot/project-static/docs/core-functionality/secrets.html +1 -2
- nautobot/project-static/docs/core-functionality/services.html +1 -2
- nautobot/project-static/docs/core-functionality/sites-and-racks.html +1 -2
- nautobot/project-static/docs/core-functionality/tenancy.html +1 -2
- nautobot/project-static/docs/core-functionality/virtualization.html +1 -2
- nautobot/project-static/docs/core-functionality/vlans.html +1 -2
- nautobot/project-static/docs/development/application-registry.html +1 -2
- nautobot/project-static/docs/development/apps/api/configuration-view.html +10 -10
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +10 -10
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +10 -10
- nautobot/project-static/docs/development/apps/api/models/global-search.html +10 -10
- nautobot/project-static/docs/development/apps/api/models/graphql.html +10 -10
- nautobot/project-static/docs/development/apps/api/models/index.html +10 -10
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +10 -10
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +32 -13
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +10 -10
- nautobot/project-static/docs/development/apps/api/prometheus.html +10 -10
- nautobot/project-static/docs/development/apps/api/setup.html +10 -10
- nautobot/project-static/docs/development/apps/api/testing.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-detail-views.html +1 -2
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +10 -10
- nautobot/project-static/docs/development/apps/api/ui-extensions/tabs.html +1 -2
- nautobot/project-static/docs/development/apps/api/views/base-template.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/index.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/notes.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/urls.html +10 -10
- nautobot/project-static/docs/development/apps/api/views/view-overrides.html +1 -2
- nautobot/project-static/docs/development/apps/index.html +10 -10
- nautobot/project-static/docs/development/apps/migration/code-updates.html +10 -10
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +10 -10
- nautobot/project-static/docs/development/apps/migration/from-v1.html +10 -10
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +10 -10
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +10 -10
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +10 -10
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +10 -10
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +10 -10
- nautobot/project-static/docs/development/best-practices.html +1 -2
- nautobot/project-static/docs/development/core/application-registry.html +10 -10
- nautobot/project-static/docs/development/core/best-practices.html +10 -10
- nautobot/project-static/docs/development/core/bootstrap-ui.html +10 -10
- nautobot/project-static/docs/development/core/caching.html +10 -10
- nautobot/project-static/docs/development/core/controllers.html +10 -10
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +10 -10
- nautobot/project-static/docs/development/core/extending-models.html +1 -2
- nautobot/project-static/docs/development/core/generic-views.html +10 -10
- nautobot/project-static/docs/development/core/getting-started.html +10 -10
- nautobot/project-static/docs/development/core/homepage.html +10 -10
- nautobot/project-static/docs/development/core/index.html +10 -10
- nautobot/project-static/docs/development/core/model-checklist.html +10 -10
- nautobot/project-static/docs/development/core/model-features.html +10 -10
- nautobot/project-static/docs/development/core/natural-keys.html +10 -10
- nautobot/project-static/docs/development/core/navigation-menu.html +10 -10
- nautobot/project-static/docs/development/core/react-ui.html +1 -2
- nautobot/project-static/docs/development/core/release-checklist.html +10 -10
- nautobot/project-static/docs/development/core/role-internals.html +10 -10
- nautobot/project-static/docs/development/core/settings.html +10 -10
- nautobot/project-static/docs/development/core/style-guide.html +10 -10
- nautobot/project-static/docs/development/core/templates.html +10 -10
- nautobot/project-static/docs/development/core/testing.html +12 -12
- nautobot/project-static/docs/development/core/user-preferences.html +10 -10
- nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +1 -2
- nautobot/project-static/docs/development/extending-models.html +1 -2
- nautobot/project-static/docs/development/generic-views.html +1 -2
- nautobot/project-static/docs/development/getting-started.html +1 -2
- nautobot/project-static/docs/development/homepage.html +1 -2
- nautobot/project-static/docs/development/index.html +10 -10
- nautobot/project-static/docs/development/jobs/index.html +10 -10
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +10 -10
- nautobot/project-static/docs/development/model-features.html +1 -2
- nautobot/project-static/docs/development/natural-keys.html +1 -2
- nautobot/project-static/docs/development/navigation-menu.html +1 -2
- nautobot/project-static/docs/development/react-ui.html +1 -2
- nautobot/project-static/docs/development/release-checklist.html +1 -2
- nautobot/project-static/docs/development/role-internals.html +1 -2
- nautobot/project-static/docs/development/style-guide.html +1 -2
- nautobot/project-static/docs/development/templates.html +1 -2
- nautobot/project-static/docs/development/testing.html +1 -2
- nautobot/project-static/docs/development/user-preferences.html +1 -2
- nautobot/project-static/docs/docker/index.html +1 -2
- nautobot/project-static/docs/index.html +10 -10
- nautobot/project-static/docs/installation/centos.html +1 -2
- nautobot/project-static/docs/installation/external-authentication.html +1 -2
- nautobot/project-static/docs/installation/http-server.html +1 -2
- nautobot/project-static/docs/installation/index.html +1 -2
- nautobot/project-static/docs/installation/migrating-from-netbox.html +1 -2
- nautobot/project-static/docs/installation/migrating-from-postgresql.html +1 -2
- nautobot/project-static/docs/installation/nautobot.html +1 -2
- nautobot/project-static/docs/installation/region-and-site-data-migration-guide.html +1 -2
- nautobot/project-static/docs/installation/selinux-troubleshooting.html +1 -2
- nautobot/project-static/docs/installation/services.html +1 -2
- nautobot/project-static/docs/installation/ubuntu.html +1 -2
- nautobot/project-static/docs/installation/upgrading-from-nautobot-v1.html +1 -2
- nautobot/project-static/docs/installation/upgrading.html +1 -2
- nautobot/project-static/docs/models/circuits/circuit.html +1 -2
- nautobot/project-static/docs/models/circuits/circuittermination.html +1 -2
- nautobot/project-static/docs/models/circuits/circuittype.html +1 -2
- nautobot/project-static/docs/models/circuits/provider.html +1 -2
- nautobot/project-static/docs/models/circuits/providernetwork.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudaccount.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudnetwork.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudresourcetype.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudservice.html +1 -2
- nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +1 -2
- nautobot/project-static/docs/models/dcim/cable.html +1 -2
- nautobot/project-static/docs/models/dcim/consoleport.html +1 -2
- nautobot/project-static/docs/models/dcim/consoleporttemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/consoleserverport.html +1 -2
- nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/controller.html +1 -2
- nautobot/project-static/docs/models/dcim/controllermanageddevicegroup.html +1 -2
- nautobot/project-static/docs/models/dcim/device.html +1 -2
- nautobot/project-static/docs/models/dcim/devicebay.html +1 -2
- nautobot/project-static/docs/models/dcim/devicebaytemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/devicefamily.html +1 -2
- nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +1 -2
- nautobot/project-static/docs/models/dcim/devicetype.html +1 -2
- nautobot/project-static/docs/models/dcim/frontport.html +1 -2
- nautobot/project-static/docs/models/dcim/frontporttemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/interface.html +1 -2
- nautobot/project-static/docs/models/dcim/interfacetemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/inventoryitem.html +1 -2
- nautobot/project-static/docs/models/dcim/location.html +1 -2
- nautobot/project-static/docs/models/dcim/locationtype.html +1 -2
- nautobot/project-static/docs/models/dcim/manufacturer.html +1 -2
- nautobot/project-static/docs/models/dcim/module.html +1 -2
- nautobot/project-static/docs/models/dcim/modulebay.html +1 -2
- nautobot/project-static/docs/models/dcim/modulebaytemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/moduletype.html +1 -2
- nautobot/project-static/docs/models/dcim/platform.html +1 -2
- nautobot/project-static/docs/models/dcim/powerfeed.html +1 -2
- nautobot/project-static/docs/models/dcim/poweroutlet.html +1 -2
- nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/powerpanel.html +1 -2
- nautobot/project-static/docs/models/dcim/powerport.html +1 -2
- nautobot/project-static/docs/models/dcim/powerporttemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/rack.html +1 -2
- nautobot/project-static/docs/models/dcim/rackgroup.html +1 -2
- nautobot/project-static/docs/models/dcim/rackreservation.html +1 -2
- nautobot/project-static/docs/models/dcim/rearport.html +1 -2
- nautobot/project-static/docs/models/dcim/rearporttemplate.html +1 -2
- nautobot/project-static/docs/models/dcim/softwareimagefile.html +1 -2
- nautobot/project-static/docs/models/dcim/softwareversion.html +1 -2
- nautobot/project-static/docs/models/dcim/virtualchassis.html +1 -2
- nautobot/project-static/docs/models/extras/computedfield.html +1 -2
- nautobot/project-static/docs/models/extras/configcontext.html +1 -2
- nautobot/project-static/docs/models/extras/configcontextschema.html +1 -2
- nautobot/project-static/docs/models/extras/contact.html +1 -2
- nautobot/project-static/docs/models/extras/customfield.html +1 -2
- nautobot/project-static/docs/models/extras/customlink.html +1 -2
- nautobot/project-static/docs/models/extras/dynamicgroup.html +1 -2
- nautobot/project-static/docs/models/extras/exporttemplate.html +1 -2
- nautobot/project-static/docs/models/extras/gitrepository.html +1 -2
- nautobot/project-static/docs/models/extras/jobhook.html +1 -2
- nautobot/project-static/docs/models/extras/joblogentry.html +1 -2
- nautobot/project-static/docs/models/extras/jobresult.html +1 -2
- nautobot/project-static/docs/models/extras/metadatachoice.html +1 -2
- nautobot/project-static/docs/models/extras/metadatatype.html +1 -2
- nautobot/project-static/docs/models/extras/objectmetadata.html +1 -2
- nautobot/project-static/docs/models/extras/role.html +1 -2
- nautobot/project-static/docs/models/extras/savedview.html +1 -2
- nautobot/project-static/docs/models/extras/secret.html +1 -2
- nautobot/project-static/docs/models/extras/secretsgroup.html +1 -2
- nautobot/project-static/docs/models/extras/staticgroupassociation.html +1 -2
- nautobot/project-static/docs/models/extras/status.html +1 -2
- nautobot/project-static/docs/models/extras/team.html +1 -2
- nautobot/project-static/docs/models/ipam/ipaddress.html +1 -2
- nautobot/project-static/docs/models/ipam/prefix.html +1 -2
- nautobot/project-static/docs/models/ipam/rir.html +1 -2
- nautobot/project-static/docs/models/ipam/routetarget.html +1 -2
- nautobot/project-static/docs/models/ipam/service.html +1 -2
- nautobot/project-static/docs/models/ipam/vlan.html +1 -2
- nautobot/project-static/docs/models/ipam/vlangroup.html +1 -2
- nautobot/project-static/docs/models/ipam/vrf.html +1 -2
- nautobot/project-static/docs/models/tenancy/tenant.html +1 -2
- nautobot/project-static/docs/models/tenancy/tenantgroup.html +1 -2
- nautobot/project-static/docs/models/virtualization/cluster.html +1 -2
- nautobot/project-static/docs/models/virtualization/clustergroup.html +1 -2
- nautobot/project-static/docs/models/virtualization/clustertype.html +1 -2
- nautobot/project-static/docs/models/virtualization/virtualmachine.html +1 -2
- nautobot/project-static/docs/models/virtualization/vminterface.html +1 -2
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +10 -10
- nautobot/project-static/docs/overview/design_philosophy.html +10 -10
- nautobot/project-static/docs/overview/index.html +1 -2
- nautobot/project-static/docs/plugins/development.html +1 -2
- nautobot/project-static/docs/plugins/index.html +1 -2
- nautobot/project-static/docs/plugins/porting-from-netbox.html +1 -2
- nautobot/project-static/docs/release-notes/index.html +15 -15
- nautobot/project-static/docs/release-notes/version-1.0.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.1.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.2.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.3.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.4.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.5.html +10 -10
- nautobot/project-static/docs/release-notes/version-1.6.html +623 -188
- nautobot/project-static/docs/release-notes/version-2.0.html +10 -10
- nautobot/project-static/docs/release-notes/version-2.1.html +10 -10
- nautobot/project-static/docs/release-notes/version-2.2.html +10 -10
- nautobot/project-static/docs/release-notes/version-2.3.html +548 -192
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/rest-api/overview.html +1 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +270 -270
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +10 -10
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +10 -10
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +65 -12
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +10 -10
- nautobot/project-static/docs/user-guide/administration/configuration/node-configuration.html +1 -2
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1 -2
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +10 -10
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +1 -2
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +122 -10
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +1 -2
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +1 -2
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +10 -10
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +1 -2
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +1 -2
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/index.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +1 -2
- nautobot/project-static/docs/user-guide/administration/installation/services.html +10 -10
- nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +1 -2
- nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +1 -2
- nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +1 -2
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +10 -10
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +10 -10
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +10 -10
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +10 -10
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +10 -10
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +10 -10
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +10 -10
- nautobot/project-static/docs/user-guide/index.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +10 -10
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +10 -10
- nautobot/project-static/docs/user-guides/custom-fields.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/index.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/interfaces.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/ipam.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/platforms.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/search-bar.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/tenants.html +1 -2
- nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +1 -2
- nautobot/project-static/docs/user-guides/git-data-source.html +1 -2
- nautobot/project-static/docs/user-guides/graphql.html +1 -2
- nautobot/project-static/docs/user-guides/ip-address-merge-tool.html +1 -2
- nautobot/project-static/docs/user-guides/relationships.html +1 -2
- nautobot/project-static/docs/user-guides/s3-django-storage.html +1 -2
- nautobot/project-static/js/forms.js +10 -0
- nautobot/users/api/serializers.py +1 -0
- nautobot/virtualization/filters.py +19 -2
- nautobot/virtualization/forms.py +3 -3
- nautobot/virtualization/templates/virtualization/vminterface.html +4 -0
- nautobot/virtualization/tests/test_filters.py +9 -0
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/METADATA +4 -4
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/RECORD +514 -513
- nautobot/project-static/docs/assets/stylesheets/main.0253249f.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/main.0253249f.min.css.map +0 -1
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/NOTICE +0 -0
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/WHEEL +0 -0
- {nautobot-2.3.11.dist-info → nautobot-2.3.13.dist-info}/entry_points.txt +0 -0
nautobot/ipam/tables.py
CHANGED
|
@@ -175,14 +175,6 @@ VLAN_PREFIXES = """
|
|
|
175
175
|
{% endfor %}
|
|
176
176
|
"""
|
|
177
177
|
|
|
178
|
-
VLAN_ROLE_LINK = """
|
|
179
|
-
{% if record.role %}
|
|
180
|
-
<a href="{% url 'ipam:vlan_list' %}?role={{ record.role.name }}">{{ record.role }}</a>
|
|
181
|
-
{% else %}
|
|
182
|
-
—
|
|
183
|
-
{% endif %}
|
|
184
|
-
"""
|
|
185
|
-
|
|
186
178
|
VLANGROUP_ADD_VLAN = """
|
|
187
179
|
{% with next_vid=record.get_next_available_vid %}
|
|
188
180
|
{% if next_vid and perms.ipam.add_vlan %}
|
|
@@ -346,7 +338,9 @@ class PrefixTable(StatusTableMixin, RoleTableMixin, BaseTable):
|
|
|
346
338
|
prefix = tables.TemplateColumn(
|
|
347
339
|
template_code=PREFIX_COPY_LINK, attrs={"td": {"class": "text-nowrap"}}, order_by=("network", "prefix_length")
|
|
348
340
|
)
|
|
349
|
-
vrf_count = LinkedCountColumn(
|
|
341
|
+
vrf_count = LinkedCountColumn(
|
|
342
|
+
viewname="ipam:vrf_list", url_params={"prefix": "pk"}, reverse_lookup="prefixes", verbose_name="VRFs"
|
|
343
|
+
)
|
|
350
344
|
tenant = TenantColumn()
|
|
351
345
|
namespace = tables.Column(linkify=True)
|
|
352
346
|
vlan = tables.Column(linkify=True, verbose_name="VLAN")
|
|
@@ -448,13 +442,27 @@ class IPAddressTable(StatusTableMixin, RoleTableMixin, BaseTable):
|
|
|
448
442
|
)
|
|
449
443
|
tenant = TenantColumn()
|
|
450
444
|
parent__namespace = tables.Column(linkify=True)
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
445
|
+
interface_count = LinkedCountColumn(
|
|
446
|
+
viewname="dcim:interface_list", url_params={"ip_addresses": "pk"}, verbose_name="Interfaces"
|
|
447
|
+
)
|
|
448
|
+
# TODO: what about interfaces assigned to modules?
|
|
449
|
+
interface_parent_count = LinkedCountColumn(
|
|
450
|
+
viewname="dcim:device_list",
|
|
451
|
+
url_params={"ip_addresses": "pk"},
|
|
452
|
+
reverse_lookup="interfaces__ip_addresses",
|
|
453
|
+
distinct=True,
|
|
454
|
+
verbose_name="Devices",
|
|
455
|
+
)
|
|
454
456
|
vm_interface_count = LinkedCountColumn(
|
|
455
457
|
viewname="virtualization:vminterface_list", url_params={"ip_addresses": "pk"}, verbose_name="VM Interfaces"
|
|
456
458
|
)
|
|
457
|
-
vm_interface_parent_count =
|
|
459
|
+
vm_interface_parent_count = LinkedCountColumn(
|
|
460
|
+
viewname="virtualization:virtualmachine_list",
|
|
461
|
+
url_params={"ip_addresses": "pk"},
|
|
462
|
+
reverse_lookup="interfaces__ip_addresses",
|
|
463
|
+
distinct=True,
|
|
464
|
+
verbose_name="Virtual Machines",
|
|
465
|
+
)
|
|
458
466
|
|
|
459
467
|
class Meta(BaseTable.Meta):
|
|
460
468
|
model = IPAddress
|
|
@@ -766,7 +774,7 @@ class VLANVirtualMachinesTable(VLANMembersTable):
|
|
|
766
774
|
fields = ("virtual_machine", "name", "tagged", "actions")
|
|
767
775
|
|
|
768
776
|
|
|
769
|
-
class InterfaceVLANTable(StatusTableMixin, BaseTable):
|
|
777
|
+
class InterfaceVLANTable(StatusTableMixin, RoleTableMixin, BaseTable):
|
|
770
778
|
"""
|
|
771
779
|
List VLANs assigned to a specific Interface.
|
|
772
780
|
"""
|
|
@@ -775,7 +783,6 @@ class InterfaceVLANTable(StatusTableMixin, BaseTable):
|
|
|
775
783
|
tagged = BooleanColumn()
|
|
776
784
|
vlan_group = tables.Column(accessor=Accessor("vlan_group__name"), verbose_name="Group")
|
|
777
785
|
tenant = TenantColumn()
|
|
778
|
-
role = tables.TemplateColumn(template_code=VLAN_ROLE_LINK)
|
|
779
786
|
location_count = LinkedCountColumn(
|
|
780
787
|
viewname="dcim:location_list",
|
|
781
788
|
url_params={"vlans": "pk"},
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
{% block masthead %}
|
|
6
6
|
<h1>
|
|
7
|
-
<span class="hover_copy"><span id="copy_title">{{ object }}</span><button type="button" class="btn btn-inline btn-default hover_copy_button" data-clipboard-
|
|
7
|
+
<span class="hover_copy"><span id="copy_title">{{ object }}</span><button type="button" class="btn btn-inline btn-default hover_copy_button" data-clipboard-text="{{ object }}">
|
|
8
8
|
<span class="mdi mdi-content-copy"></span>
|
|
9
9
|
</button>
|
|
10
10
|
</span>
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from unittest import skipIf
|
|
3
3
|
|
|
4
|
-
from django.
|
|
4
|
+
from django.contrib.contenttypes.models import ContentType
|
|
5
|
+
from django.db import connection, transaction
|
|
5
6
|
import netaddr
|
|
6
7
|
|
|
7
8
|
from nautobot.core.testing import TestCase
|
|
8
9
|
from nautobot.extras.models import Status
|
|
9
10
|
from nautobot.ipam import choices
|
|
10
11
|
from nautobot.ipam.models import IPAddress, Namespace, Prefix
|
|
12
|
+
from nautobot.users.models import ObjectPermission
|
|
11
13
|
|
|
12
14
|
|
|
13
15
|
class IPAddressQuerySet(TestCase):
|
|
@@ -266,6 +268,28 @@ class IPAddressQuerySet(TestCase):
|
|
|
266
268
|
[instance for ip, instance in self.ips.items() if "10.0.0" in ip],
|
|
267
269
|
)
|
|
268
270
|
|
|
271
|
+
def test_lookup_not_ambiguous(self):
|
|
272
|
+
"""Check for issues like https://github.com/nautobot/nautobot/issues/5166."""
|
|
273
|
+
obj_perm = ObjectPermission.objects.create(name="Test Permission", constraints={}, actions=["view"])
|
|
274
|
+
obj_perm.object_types.add(ContentType.objects.get_for_model(IPAddress))
|
|
275
|
+
obj_perm.users.add(self.user)
|
|
276
|
+
queryset = IPAddress.objects.select_related("parent", "nat_inside", "status")
|
|
277
|
+
|
|
278
|
+
for permission_constraint in (
|
|
279
|
+
{"host__family": 4},
|
|
280
|
+
{"host__net_host": "10.0.0.1"},
|
|
281
|
+
{"host__net_host_contained": "10.0.0.0/24"},
|
|
282
|
+
{"host__net_in": ["10.0.0.0/24"]},
|
|
283
|
+
):
|
|
284
|
+
with self.subTest(permission_type=next(iter(permission_constraint.keys()))):
|
|
285
|
+
try:
|
|
286
|
+
with transaction.atomic():
|
|
287
|
+
obj_perm.constraints = permission_constraint
|
|
288
|
+
obj_perm.save()
|
|
289
|
+
list(queryset.restrict(self.user, "view"))
|
|
290
|
+
finally:
|
|
291
|
+
delattr(self.user, "_object_perm_cache")
|
|
292
|
+
|
|
269
293
|
@skipIf(
|
|
270
294
|
connection.vendor == "postgresql",
|
|
271
295
|
"Not currently supported on postgresql",
|
|
@@ -648,6 +672,30 @@ class PrefixQuerysetTestCase(TestCase):
|
|
|
648
672
|
prefix = Prefix.objects.filter(network__net_equals="192.168.0.0/16")[0]
|
|
649
673
|
self.assertEqual(Prefix.objects.filter(prefix="192.168.0.0/16")[0], prefix)
|
|
650
674
|
|
|
675
|
+
def test_lookup_not_ambiguous(self):
|
|
676
|
+
"""Check for issues like https://github.com/nautobot/nautobot/issues/5166."""
|
|
677
|
+
obj_perm = ObjectPermission.objects.create(name="Test Permission", constraints={}, actions=["view"])
|
|
678
|
+
obj_perm.object_types.add(ContentType.objects.get_for_model(Prefix))
|
|
679
|
+
obj_perm.users.add(self.user)
|
|
680
|
+
queryset = Prefix.objects.select_related("parent", "rir", "role", "status", "namespace")
|
|
681
|
+
|
|
682
|
+
for permission_constraint in (
|
|
683
|
+
{"network__family": 4},
|
|
684
|
+
{"network__net_equals": "192.168.0.0/16"},
|
|
685
|
+
{"network__net_contained": "192.0.0.0/8"},
|
|
686
|
+
{"network__net_contained_or_equal": "192.0.0.0/8"},
|
|
687
|
+
{"network__net_contains": "192.168.3.192/32"},
|
|
688
|
+
{"network__net_contains_or_equals": "192.168.3.192/32"},
|
|
689
|
+
):
|
|
690
|
+
with self.subTest(permission_type=next(iter(permission_constraint.keys()))):
|
|
691
|
+
try:
|
|
692
|
+
with transaction.atomic():
|
|
693
|
+
obj_perm.constraints = permission_constraint
|
|
694
|
+
obj_perm.save()
|
|
695
|
+
list(queryset.restrict(self.user, "view"))
|
|
696
|
+
finally:
|
|
697
|
+
delattr(self.user, "_object_perm_cache")
|
|
698
|
+
|
|
651
699
|
@skipIf(
|
|
652
700
|
connection.vendor == "postgresql",
|
|
653
701
|
"Not currently supported on postgresql",
|
nautobot/ipam/utils/__init__.py
CHANGED
|
@@ -4,6 +4,7 @@ import netaddr
|
|
|
4
4
|
from nautobot.core.forms.utils import compress_range
|
|
5
5
|
from nautobot.dcim.models import Interface
|
|
6
6
|
from nautobot.extras.models import RelationshipAssociation
|
|
7
|
+
from nautobot.ipam.choices import PrefixTypeChoices
|
|
7
8
|
from nautobot.ipam.models import Prefix, VLAN
|
|
8
9
|
from nautobot.ipam.querysets import IPAddressQuerySet
|
|
9
10
|
from nautobot.virtualization.models import VMInterface
|
|
@@ -25,6 +26,13 @@ def add_available_prefixes(parent, prefix_list):
|
|
|
25
26
|
return prefix_list
|
|
26
27
|
|
|
27
28
|
|
|
29
|
+
def get_add_available_prefixes_callback(show_available, parent):
|
|
30
|
+
"""Conditionally provide a callback for add_available_prefixes()."""
|
|
31
|
+
if show_available:
|
|
32
|
+
return lambda prefixes: add_available_prefixes(parent.prefix, prefixes)
|
|
33
|
+
return lambda prefixes: prefixes
|
|
34
|
+
|
|
35
|
+
|
|
28
36
|
def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False):
|
|
29
37
|
"""
|
|
30
38
|
Annotate ranges of available IP addresses within a given prefix. If is_pool is True, the first and last IP will be
|
|
@@ -81,6 +89,15 @@ def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False):
|
|
|
81
89
|
return output
|
|
82
90
|
|
|
83
91
|
|
|
92
|
+
def get_add_available_ipaddresses_callback(show_available, parent):
|
|
93
|
+
"""Conditionally provide a callback for add_available_ipaddresses()."""
|
|
94
|
+
if show_available:
|
|
95
|
+
return lambda ip_addresses: add_available_ipaddresses(
|
|
96
|
+
parent.prefix, ip_addresses, is_pool=(parent.type == PrefixTypeChoices.TYPE_POOL)
|
|
97
|
+
)
|
|
98
|
+
return lambda ip_addresses: ip_addresses
|
|
99
|
+
|
|
100
|
+
|
|
84
101
|
def add_available_vlans(vlan_group, vlans):
|
|
85
102
|
"""
|
|
86
103
|
Create fake records for all gaps between used VLANs
|
|
@@ -99,6 +116,13 @@ def add_available_vlans(vlan_group, vlans):
|
|
|
99
116
|
return vlans
|
|
100
117
|
|
|
101
118
|
|
|
119
|
+
def get_add_available_vlans_callback(show_available, vlan_group):
|
|
120
|
+
"""Conditionally provide a callback for add_available_vlans()."""
|
|
121
|
+
if show_available:
|
|
122
|
+
return lambda vlans: add_available_vlans(vlan_group=vlan_group, vlans=vlans)
|
|
123
|
+
return lambda vlans: vlans
|
|
124
|
+
|
|
125
|
+
|
|
102
126
|
def handle_relationship_changes_when_merging_ips(merged_ip, merged_attributes, collapsed_ips):
|
|
103
127
|
"""
|
|
104
128
|
Update/Delete RelationshipAssociation instances after we collapsed the IPs.
|
nautobot/ipam/views.py
CHANGED
|
@@ -2,7 +2,9 @@ import logging
|
|
|
2
2
|
|
|
3
3
|
from django.conf import settings
|
|
4
4
|
from django.contrib import messages
|
|
5
|
+
from django.contrib.auth.models import AnonymousUser
|
|
5
6
|
from django.core.cache import cache
|
|
7
|
+
from django.core.exceptions import ObjectDoesNotExist
|
|
6
8
|
from django.db import models, transaction
|
|
7
9
|
from django.db.models import Prefetch, ProtectedError, Q
|
|
8
10
|
from django.forms.models import model_to_dict
|
|
@@ -23,7 +25,7 @@ from nautobot.core.views import generic, mixins as view_mixins
|
|
|
23
25
|
from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
|
|
24
26
|
from nautobot.core.views.utils import handle_protectederror
|
|
25
27
|
from nautobot.dcim.models import Device, Interface, Location
|
|
26
|
-
from nautobot.extras.models import Role, Status, Tag
|
|
28
|
+
from nautobot.extras.models import Role, SavedView, Status, Tag
|
|
27
29
|
from nautobot.ipam import choices, constants
|
|
28
30
|
from nautobot.ipam.api import serializers
|
|
29
31
|
from nautobot.tenancy.models import Tenant
|
|
@@ -43,9 +45,9 @@ from .models import (
|
|
|
43
45
|
VRF,
|
|
44
46
|
)
|
|
45
47
|
from .utils import (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
get_add_available_ipaddresses_callback,
|
|
49
|
+
get_add_available_prefixes_callback,
|
|
50
|
+
get_add_available_vlans_callback,
|
|
49
51
|
handle_relationship_changes_when_merging_ips,
|
|
50
52
|
retrieve_interface_or_vminterface_from_request,
|
|
51
53
|
)
|
|
@@ -101,23 +103,12 @@ class NamespaceIPAddressesView(generic.ObjectView):
|
|
|
101
103
|
|
|
102
104
|
def get_extra_context(self, request, instance):
|
|
103
105
|
# Find all IPAddresses belonging to this Namespace
|
|
104
|
-
ip_addresses = (
|
|
105
|
-
instance.ip_addresses.restrict(request.user, "view")
|
|
106
|
-
.select_related("role", "status", "tenant")
|
|
107
|
-
.annotate(
|
|
108
|
-
interface_count=count_related(Interface, "ip_addresses"),
|
|
109
|
-
interface_parent_count=count_related(Device, "interfaces__ip_addresses", distinct=True),
|
|
110
|
-
vm_interface_count=count_related(VMInterface, "ip_addresses"),
|
|
111
|
-
vm_interface_parent_count=count_related(VirtualMachine, "interfaces__ip_addresses", distinct=True),
|
|
112
|
-
)
|
|
113
|
-
)
|
|
106
|
+
ip_addresses = instance.ip_addresses.restrict(request.user, "view").select_related("role", "status", "tenant")
|
|
114
107
|
|
|
115
|
-
ip_address_table = tables.IPAddressTable(ip_addresses)
|
|
108
|
+
ip_address_table = tables.IPAddressTable(ip_addresses, exclude=["namespace"])
|
|
116
109
|
if request.user.has_perm("ipam.change_ipaddress") or request.user.has_perm("ipam.delete_ipaddress"):
|
|
117
110
|
ip_address_table.columns.show("pk")
|
|
118
111
|
|
|
119
|
-
ip_address_table.exclude = ("namespace",)
|
|
120
|
-
|
|
121
112
|
paginate = {
|
|
122
113
|
"paginator_class": EnhancedPaginator,
|
|
123
114
|
"per_page": get_paginate_count(request),
|
|
@@ -154,12 +145,10 @@ class NamespacePrefixesView(generic.ObjectView):
|
|
|
154
145
|
# Find all Prefixes belonging to this Namespace
|
|
155
146
|
prefixes = instance.prefixes.restrict(request.user, "view").select_related("status")
|
|
156
147
|
|
|
157
|
-
prefix_table = tables.PrefixTable(prefixes)
|
|
148
|
+
prefix_table = tables.PrefixTable(prefixes, exclude=["namespace"])
|
|
158
149
|
if request.user.has_perm("ipam.change_prefix") or request.user.has_perm("ipam.delete_prefix"):
|
|
159
150
|
prefix_table.columns.show("pk")
|
|
160
151
|
|
|
161
|
-
prefix_table.exclude = ("namespace",)
|
|
162
|
-
|
|
163
152
|
paginate = {
|
|
164
153
|
"paginator_class": EnhancedPaginator,
|
|
165
154
|
"per_page": get_paginate_count(request),
|
|
@@ -196,12 +185,10 @@ class NamespaceVRFsView(generic.ObjectView):
|
|
|
196
185
|
# Find all VRFs belonging to this Namespace
|
|
197
186
|
vrfs = instance.vrfs.restrict(request.user, "view")
|
|
198
187
|
|
|
199
|
-
vrf_table = tables.VRFTable(vrfs)
|
|
188
|
+
vrf_table = tables.VRFTable(vrfs, exclude=["namespace"])
|
|
200
189
|
if request.user.has_perm("ipam.change_vrf") or request.user.has_perm("ipam.delete_vrf"):
|
|
201
190
|
vrf_table.columns.show("pk")
|
|
202
191
|
|
|
203
|
-
vrf_table.exclude = ("namespace",)
|
|
204
|
-
|
|
205
192
|
paginate = {
|
|
206
193
|
"paginator_class": EnhancedPaginator,
|
|
207
194
|
"per_page": get_paginate_count(request),
|
|
@@ -266,8 +253,7 @@ class VRFView(generic.ObjectView):
|
|
|
266
253
|
# TODO(jathan): This table might need to live on Device and on VRFs
|
|
267
254
|
# (possibly replacing `device_table` above.
|
|
268
255
|
vrfs = instance.device_assignments.restrict(request.user, "view")
|
|
269
|
-
vrf_table = tables.VRFDeviceAssignmentTable(vrfs)
|
|
270
|
-
vrf_table.exclude = ("vrf",)
|
|
256
|
+
vrf_table = tables.VRFDeviceAssignmentTable(vrfs, exclude=["vrf"])
|
|
271
257
|
# context["vrf_table"] = vrf_table
|
|
272
258
|
|
|
273
259
|
paginate = {
|
|
@@ -466,8 +452,7 @@ class PrefixView(generic.ObjectView):
|
|
|
466
452
|
def get_extra_context(self, request, instance):
|
|
467
453
|
# Parent prefixes table
|
|
468
454
|
parent_prefixes = instance.ancestors().restrict(request.user, "view")
|
|
469
|
-
parent_prefix_table = tables.PrefixTable(parent_prefixes)
|
|
470
|
-
parent_prefix_table.exclude = ("namespace",)
|
|
455
|
+
parent_prefix_table = tables.PrefixTable(parent_prefixes, exclude=["namespace"])
|
|
471
456
|
|
|
472
457
|
vrfs = instance.vrf_assignments.restrict(request.user, "view")
|
|
473
458
|
vrf_table = tables.VRFPrefixAssignmentTable(vrfs, orderable=False)
|
|
@@ -498,19 +483,19 @@ class PrefixPrefixesView(generic.ObjectView):
|
|
|
498
483
|
|
|
499
484
|
def get_extra_context(self, request, instance):
|
|
500
485
|
# Child prefixes table
|
|
501
|
-
child_prefixes = (
|
|
502
|
-
instance.descendants()
|
|
503
|
-
.restrict(request.user, "view")
|
|
504
|
-
.select_related("parent", "status", "role", "vlan", "namespace")
|
|
505
|
-
.annotate(location_count=count_related(Location, "prefixes"))
|
|
506
|
-
)
|
|
486
|
+
child_prefixes = instance.descendants().restrict(request.user, "view")
|
|
507
487
|
|
|
508
488
|
# Add available prefixes to the table if requested
|
|
509
|
-
|
|
510
|
-
|
|
489
|
+
data_transform_callback = get_add_available_prefixes_callback(
|
|
490
|
+
show_available=request.GET.get("show_available", "true") == "true", parent=instance
|
|
491
|
+
)
|
|
511
492
|
|
|
512
|
-
prefix_table = tables.PrefixDetailTable(
|
|
513
|
-
|
|
493
|
+
prefix_table = tables.PrefixDetailTable(
|
|
494
|
+
child_prefixes,
|
|
495
|
+
hide_hierarchy_ui=True,
|
|
496
|
+
exclude=["namespace"],
|
|
497
|
+
data_transform_callback=data_transform_callback,
|
|
498
|
+
)
|
|
514
499
|
if request.user.has_perm("ipam.change_prefix") or request.user.has_perm("ipam.delete_prefix"):
|
|
515
500
|
prefix_table.columns.show("pk")
|
|
516
501
|
|
|
@@ -545,26 +530,16 @@ class PrefixIPAddressesView(generic.ObjectView):
|
|
|
545
530
|
|
|
546
531
|
def get_extra_context(self, request, instance):
|
|
547
532
|
# Find all IPAddresses belonging to this Prefix
|
|
548
|
-
ipaddresses = (
|
|
549
|
-
instance.get_all_ips()
|
|
550
|
-
.restrict(request.user, "view")
|
|
551
|
-
.select_related("role", "status", "tenant")
|
|
552
|
-
.prefetch_related("primary_ip4_for", "primary_ip6_for")
|
|
553
|
-
.annotate(
|
|
554
|
-
interface_count=count_related(Interface, "ip_addresses"),
|
|
555
|
-
interface_parent_count=count_related(Device, "interfaces__ip_addresses", distinct=True),
|
|
556
|
-
vm_interface_count=count_related(VMInterface, "ip_addresses"),
|
|
557
|
-
vm_interface_parent_count=count_related(VirtualMachine, "interfaces__ip_addresses", distinct=True),
|
|
558
|
-
)
|
|
559
|
-
)
|
|
533
|
+
ipaddresses = instance.get_all_ips().restrict(request.user, "view")
|
|
560
534
|
|
|
561
535
|
# Add available IP addresses to the table if requested
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
)
|
|
536
|
+
data_transform_callback = get_add_available_ipaddresses_callback(
|
|
537
|
+
show_available=request.GET.get("show_available", "true") == "true", parent=instance
|
|
538
|
+
)
|
|
566
539
|
|
|
567
|
-
ip_table = tables.IPAddressTable(
|
|
540
|
+
ip_table = tables.IPAddressTable(
|
|
541
|
+
ipaddresses, exclude=["parent__namespace"], data_transform_callback=data_transform_callback
|
|
542
|
+
)
|
|
568
543
|
if request.user.has_perm("ipam.change_ipaddress") or request.user.has_perm("ipam.delete_ipaddress"):
|
|
569
544
|
ip_table.columns.show("pk")
|
|
570
545
|
|
|
@@ -761,18 +736,36 @@ class PrefixBulkDeleteView(generic.BulkDeleteView):
|
|
|
761
736
|
|
|
762
737
|
|
|
763
738
|
class IPAddressListView(generic.ObjectListView):
|
|
764
|
-
queryset = IPAddress.objects.
|
|
765
|
-
interface_count=count_related(Interface, "ip_addresses"),
|
|
766
|
-
interface_parent_count=count_related(Device, "interfaces__ip_addresses", distinct=True),
|
|
767
|
-
vm_interface_count=count_related(VMInterface, "ip_addresses"),
|
|
768
|
-
vm_interface_parent_count=count_related(VirtualMachine, "interfaces__ip_addresses", distinct=True),
|
|
769
|
-
assigned_count=count_related(Interface, "ip_addresses") + count_related(VMInterface, "ip_addresses"),
|
|
770
|
-
)
|
|
739
|
+
queryset = IPAddress.objects.all()
|
|
771
740
|
filterset = filters.IPAddressFilterSet
|
|
772
741
|
filterset_form = forms.IPAddressFilterForm
|
|
773
742
|
table = tables.IPAddressDetailTable
|
|
774
743
|
template_name = "ipam/ipaddress_list.html"
|
|
775
|
-
|
|
744
|
+
|
|
745
|
+
def alter_queryset(self, request):
|
|
746
|
+
queryset = super().alter_queryset(request)
|
|
747
|
+
|
|
748
|
+
# All of the below is just to determine whether we are displaying the "assigned_count" column, and if so,
|
|
749
|
+
# perform the relevant queryset annotation. Ref: nautobot/nautobot#6605
|
|
750
|
+
if request.user is None or isinstance(request.user, AnonymousUser):
|
|
751
|
+
table_columns = None
|
|
752
|
+
else:
|
|
753
|
+
table_columns = request.user.get_config("tables.IPAddressDetailTable.columns")
|
|
754
|
+
current_saved_view_pk = request.GET.get("saved_view", None)
|
|
755
|
+
if current_saved_view_pk:
|
|
756
|
+
try:
|
|
757
|
+
current_saved_view = SavedView.objects.get(view="ipam:ipaddress_list", pk=current_saved_view_pk)
|
|
758
|
+
view_table_config = current_saved_view.config.get("table_config", {}).get("IPAddressDetailTable", None)
|
|
759
|
+
if view_table_config is not None:
|
|
760
|
+
table_columns = view_table_config.get("columns", table_columns)
|
|
761
|
+
except ObjectDoesNotExist:
|
|
762
|
+
pass
|
|
763
|
+
|
|
764
|
+
if table_columns and "assigned_count" in table_columns:
|
|
765
|
+
queryset = queryset.annotate(
|
|
766
|
+
assigned_count=count_related(Interface, "ip_addresses") + count_related(VMInterface, "ip_addresses"),
|
|
767
|
+
)
|
|
768
|
+
return queryset
|
|
776
769
|
|
|
777
770
|
|
|
778
771
|
class IPAddressView(generic.ObjectView):
|
|
@@ -1265,17 +1258,18 @@ class VLANGroupView(generic.ObjectView):
|
|
|
1265
1258
|
def get_extra_context(self, request, instance):
|
|
1266
1259
|
vlans = (
|
|
1267
1260
|
VLAN.objects.restrict(request.user, "view")
|
|
1268
|
-
.annotate(location_count=count_related(Location, "vlans"))
|
|
1269
1261
|
.filter(vlan_group=instance)
|
|
1270
1262
|
.prefetch_related(Prefetch("prefixes", queryset=Prefix.objects.restrict(request.user)))
|
|
1271
1263
|
)
|
|
1272
1264
|
vlans_count = vlans.count()
|
|
1273
|
-
vlans = add_available_vlans(vlan_group=instance, vlans=vlans)
|
|
1274
1265
|
|
|
1275
|
-
|
|
1266
|
+
data_transform_callback = get_add_available_vlans_callback(show_available=True, vlan_group=instance)
|
|
1267
|
+
|
|
1268
|
+
vlan_table = tables.VLANDetailTable(
|
|
1269
|
+
vlans, exclude=["vlan_group"], data_transform_callback=data_transform_callback
|
|
1270
|
+
)
|
|
1276
1271
|
if request.user.has_perm("ipam.change_vlan") or request.user.has_perm("ipam.delete_vlan"):
|
|
1277
1272
|
vlan_table.columns.show("pk")
|
|
1278
|
-
vlan_table.columns.hide("vlan_group")
|
|
1279
1273
|
|
|
1280
1274
|
paginate = {
|
|
1281
1275
|
"paginator_class": EnhancedPaginator,
|
|
@@ -1350,8 +1344,7 @@ class VLANView(generic.ObjectView):
|
|
|
1350
1344
|
"namespace",
|
|
1351
1345
|
)
|
|
1352
1346
|
)
|
|
1353
|
-
prefix_table = tables.PrefixTable(list(prefixes), hide_hierarchy_ui=True)
|
|
1354
|
-
prefix_table.exclude = ("vlan",)
|
|
1347
|
+
prefix_table = tables.PrefixTable(list(prefixes), hide_hierarchy_ui=True, exclude=["vlan"])
|
|
1355
1348
|
|
|
1356
1349
|
paginate = {
|
|
1357
1350
|
"paginator_class": EnhancedPaginator,
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
<link rel="icon" href="/projects/core/en/stable/assets/favicon.ico">
|
|
15
|
-
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.
|
|
15
|
+
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.47">
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
<link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.
|
|
23
|
+
<link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/main.6f8fc17f.min.css">
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
<link rel="stylesheet" href="/projects/core/en/stable/assets/stylesheets/palette.06af60db.min.css">
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
<style>:root{--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.
|
|
35
|
+
<style>:root{--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M288 0H128c-17.7 0-32 14.3-32 32s14.3 32 32 32v132.8c0 11.8-3.3 23.5-9.5 33.5L10.3 406.2C3.6 417.2 0 429.7 0 442.6 0 480.9 31.1 512 69.4 512h309.2c38.3 0 69.4-31.1 69.4-69.4 0-12.8-3.6-25.4-10.3-36.4L329.5 230.4c-6.2-10.1-9.5-21.7-9.5-33.5V64c17.7 0 32-14.3 32-32S337.7 0 320 0zm-96 196.8V64h64v132.8c0 23.7 6.6 46.9 19 67.1l34.5 56.1h-171l34.5-56.1c12.4-20.2 19-43.4 19-67.1"/></svg>');}</style>
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
|
|
@@ -197,7 +197,7 @@
|
|
|
197
197
|
<a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
|
|
198
198
|
<div class="md-source__icon md-icon">
|
|
199
199
|
|
|
200
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.
|
|
200
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
|
|
201
201
|
</div>
|
|
202
202
|
<div class="md-source__repository">
|
|
203
203
|
GitHub
|
|
@@ -355,7 +355,7 @@
|
|
|
355
355
|
<a href="https://github.com/nautobot/nautobot" title="Go to repository" class="md-source" data-md-component="source">
|
|
356
356
|
<div class="md-source__icon md-icon">
|
|
357
357
|
|
|
358
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.
|
|
358
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
|
|
359
359
|
</div>
|
|
360
360
|
<div class="md-source__repository">
|
|
361
361
|
GitHub
|
|
@@ -8600,7 +8600,7 @@
|
|
|
8600
8600
|
|
|
8601
8601
|
|
|
8602
8602
|
<a href="https://blog.networktocode.com/blog/tags/nautobot" target="_blank" rel="noopener" title="Network to Code Blog" class="md-social__link">
|
|
8603
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.
|
|
8603
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M0 64c0-17.7 14.3-32 32-32 229.8 0 416 186.2 416 416 0 17.7-14.3 32-32 32s-32-14.3-32-32C384 253.6 226.4 96 32 96 14.3 96 0 81.7 0 64m0 352a64 64 0 1 1 128 0 64 64 0 1 1-128 0m32-256c159.1 0 288 128.9 288 288 0 17.7-14.3 32-32 32s-32-14.3-32-32c0-123.7-100.3-224-224-224-17.7 0-32-14.3-32-32s14.3-32 32-32"/></svg>
|
|
8604
8604
|
</a>
|
|
8605
8605
|
|
|
8606
8606
|
|
|
@@ -8608,7 +8608,7 @@
|
|
|
8608
8608
|
|
|
8609
8609
|
|
|
8610
8610
|
<a href="https://www.youtube.com/playlist?list=PLjA0bhxgryJ2Ts4GJMDA-tPzVWEncv4pb" target="_blank" rel="noopener" title="Nautobot Videos" class="md-social__link">
|
|
8611
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.
|
|
8611
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305m-317.51 213.508V175.185l142.739 81.205z"/></svg>
|
|
8612
8612
|
</a>
|
|
8613
8613
|
|
|
8614
8614
|
|
|
@@ -8616,7 +8616,7 @@
|
|
|
8616
8616
|
|
|
8617
8617
|
|
|
8618
8618
|
<a href="https://www.networktocode.com/community/" target="_blank" rel="noopener" title="Network to Code Community" class="md-social__link">
|
|
8619
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.
|
|
8619
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1s21.16-47.06 47.06-47.06h47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06zm47.06-188.98c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 243.96 0 222.8 0 196.9s21.16-47.06 47.06-47.06zm188.98 47.06c0-25.9 21.16-47.06 47.06-47.06S448 171 448 196.9s-21.16 47.06-47.06 47.06h-47.06zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06zM283.1 385.88c25.9 0 47.06 21.16 47.06 47.06S309 480 283.1 480s-47.06-21.16-47.06-47.06v-47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06s21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06z"/></svg>
|
|
8620
8620
|
</a>
|
|
8621
8621
|
|
|
8622
8622
|
|
|
@@ -8624,7 +8624,7 @@
|
|
|
8624
8624
|
|
|
8625
8625
|
|
|
8626
8626
|
<a href="https://github.com/nautobot/nautobot" target="_blank" rel="noopener" title="GitHub Repo" class="md-social__link">
|
|
8627
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.
|
|
8627
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
|
|
8628
8628
|
</a>
|
|
8629
8629
|
|
|
8630
8630
|
|
|
@@ -8632,7 +8632,7 @@
|
|
|
8632
8632
|
|
|
8633
8633
|
|
|
8634
8634
|
<a href="https://twitter.com/networktocode" target="_blank" rel="noopener" title="Network to Code Twitter" class="md-social__link">
|
|
8635
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.
|
|
8635
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253"/></svg>
|
|
8636
8636
|
</a>
|
|
8637
8637
|
|
|
8638
8638
|
</div>
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<title>Redirecting...</title>
|
|
7
7
|
<link rel="canonical" href="../user-guide/administration/configuration/redis.html">
|
|
8
|
-
<meta name="robots" content="noindex">
|
|
9
8
|
<script>var anchor=window.location.hash.substr(1);location.href="../user-guide/administration/configuration/redis.html"+(anchor?"#"+anchor:"")</script>
|
|
10
9
|
<meta http-equiv="refresh" content="0; url=../user-guide/administration/configuration/redis.html">
|
|
11
10
|
</head>
|
|
12
11
|
<body>
|
|
13
|
-
|
|
12
|
+
You're being redirected to a <a href="../user-guide/administration/configuration/redis.html">new destination</a>.
|
|
14
13
|
</body>
|
|
15
14
|
</html>
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<title>Redirecting...</title>
|
|
7
7
|
<link rel="canonical" href="../user-guide/platform-functionality/change-logging.html">
|
|
8
|
-
<meta name="robots" content="noindex">
|
|
9
8
|
<script>var anchor=window.location.hash.substr(1);location.href="../user-guide/platform-functionality/change-logging.html"+(anchor?"#"+anchor:"")</script>
|
|
10
9
|
<meta http-equiv="refresh" content="0; url=../user-guide/platform-functionality/change-logging.html">
|
|
11
10
|
</head>
|
|
12
11
|
<body>
|
|
13
|
-
|
|
12
|
+
You're being redirected to a <a href="../user-guide/platform-functionality/change-logging.html">new destination</a>.
|
|
14
13
|
</body>
|
|
15
14
|
</html>
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<title>Redirecting...</title>
|
|
7
7
|
<link rel="canonical" href="../user-guide/core-data-model/extras/configcontext.html">
|
|
8
|
-
<meta name="robots" content="noindex">
|
|
9
8
|
<script>var anchor=window.location.hash.substr(1);location.href="../user-guide/core-data-model/extras/configcontext.html"+(anchor?"#"+anchor:"")</script>
|
|
10
9
|
<meta http-equiv="refresh" content="0; url=../user-guide/core-data-model/extras/configcontext.html">
|
|
11
10
|
</head>
|
|
12
11
|
<body>
|
|
13
|
-
|
|
12
|
+
You're being redirected to a <a href="../user-guide/core-data-model/extras/configcontext.html">new destination</a>.
|
|
14
13
|
</body>
|
|
15
14
|
</html>
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<title>Redirecting...</title>
|
|
7
7
|
<link rel="canonical" href="../user-guide/administration/guides/health-checks.html">
|
|
8
|
-
<meta name="robots" content="noindex">
|
|
9
8
|
<script>var anchor=window.location.hash.substr(1);location.href="../user-guide/administration/guides/health-checks.html"+(anchor?"#"+anchor:"")</script>
|
|
10
9
|
<meta http-equiv="refresh" content="0; url=../user-guide/administration/guides/health-checks.html">
|
|
11
10
|
</head>
|
|
12
11
|
<body>
|
|
13
|
-
|
|
12
|
+
You're being redirected to a <a href="../user-guide/administration/guides/health-checks.html">new destination</a>.
|
|
14
13
|
</body>
|
|
15
14
|
</html>
|
|
@@ -5,11 +5,10 @@
|
|
|
5
5
|
<meta charset="utf-8">
|
|
6
6
|
<title>Redirecting...</title>
|
|
7
7
|
<link rel="canonical" href="../development/jobs/index.html">
|
|
8
|
-
<meta name="robots" content="noindex">
|
|
9
8
|
<script>var anchor=window.location.hash.substr(1);location.href="../development/jobs/index.html"+(anchor?"#"+anchor:"")</script>
|
|
10
9
|
<meta http-equiv="refresh" content="0; url=../development/jobs/index.html">
|
|
11
10
|
</head>
|
|
12
11
|
<body>
|
|
13
|
-
|
|
12
|
+
You're being redirected to a <a href="../development/jobs/index.html">new destination</a>.
|
|
14
13
|
</body>
|
|
15
14
|
</html>
|