nautobot 2.2.0__py3-none-any.whl → 2.2.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/api.py +2 -1
- nautobot/apps/utils.py +0 -4
- nautobot/apps/views.py +0 -2
- nautobot/circuits/api/urls.py +2 -1
- nautobot/circuits/api/views.py +12 -0
- nautobot/circuits/tests/test_filters.py +1 -1
- nautobot/core/api/routers.py +3 -25
- nautobot/core/api/utils.py +0 -4
- nautobot/core/api/views.py +15 -21
- nautobot/core/filters.py +1 -7
- nautobot/core/management/commands/generate_test_data.py +4 -4
- nautobot/core/settings.py +0 -1
- nautobot/core/tables.py +1 -2
- nautobot/core/templates/admin/base.html +94 -23
- nautobot/core/templates/graphene/graphiql.html +47 -18
- nautobot/core/templates/inc/footer.html +5 -5
- nautobot/core/templates/inc/nav_menu.html +7 -0
- nautobot/core/templates/rest_framework/api.html +5 -12
- nautobot/core/templatetags/helpers.py +2 -2
- nautobot/core/testing/views.py +0 -30
- nautobot/core/tests/test_api.py +6 -13
- nautobot/core/tests/test_csv.py +4 -5
- nautobot/core/tests/test_filters.py +1 -2
- nautobot/core/tests/test_graphql.py +14 -4
- nautobot/core/tests/test_navigations.py +0 -3
- nautobot/core/tests/test_views.py +16 -22
- nautobot/core/utils/lookup.py +0 -124
- nautobot/core/views/__init__.py +7 -3
- nautobot/core/views/generic.py +3 -19
- nautobot/core/views/mixins.py +0 -7
- nautobot/core/views/renderers.py +1 -4
- nautobot/dcim/api/serializers.py +4 -4
- nautobot/dcim/api/urls.py +3 -2
- nautobot/dcim/api/views.py +18 -7
- nautobot/dcim/factory.py +7 -7
- nautobot/dcim/filters/__init__.py +17 -16
- nautobot/dcim/forms.py +45 -61
- nautobot/dcim/homepage.py +3 -11
- nautobot/dcim/migrations/0057_controller_models.py +70 -11
- nautobot/dcim/models/__init__.py +2 -2
- nautobot/dcim/models/devices.py +16 -14
- nautobot/dcim/models/racks.py +3 -1
- nautobot/dcim/navigation.py +31 -23
- nautobot/dcim/signals.py +6 -6
- nautobot/dcim/tables/__init__.py +2 -2
- nautobot/dcim/tables/devices.py +15 -12
- nautobot/dcim/tables/template_code.py +1 -1
- nautobot/dcim/templates/dcim/controller_retrieve.html +18 -35
- nautobot/dcim/templates/dcim/controllerdevicegroup_create.html +43 -0
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +43 -67
- nautobot/dcim/templates/dcim/device.html +2 -10
- nautobot/dcim/templates/dcim/device_edit.html +1 -1
- nautobot/dcim/tests/test_api.py +6 -11
- nautobot/dcim/tests/test_filters.py +81 -92
- nautobot/dcim/tests/test_graphql.py +1 -11
- nautobot/dcim/tests/test_models.py +15 -15
- nautobot/dcim/tests/test_signals.py +0 -2
- nautobot/dcim/tests/test_views.py +12 -24
- nautobot/dcim/urls.py +1 -1
- nautobot/dcim/views.py +15 -19
- nautobot/extras/api/urls.py +2 -1
- nautobot/extras/api/views.py +10 -0
- nautobot/extras/filters/__init__.py +2 -53
- nautobot/extras/forms/contacts.py +0 -7
- nautobot/extras/managers.py +0 -14
- nautobot/extras/navigation.py +65 -71
- nautobot/extras/plugins/views.py +11 -7
- nautobot/extras/tests/test_api.py +0 -2
- nautobot/extras/tests/test_dynamicgroups.py +0 -2
- nautobot/extras/tests/test_filters.py +4 -89
- nautobot/extras/tests/test_models.py +0 -9
- nautobot/extras/tests/test_relationships.py +1 -10
- nautobot/extras/tests/test_views.py +1 -112
- nautobot/extras/views.py +10 -10
- nautobot/ipam/api/urls.py +2 -1
- nautobot/ipam/api/views.py +11 -0
- nautobot/ipam/tables.py +22 -2
- nautobot/ipam/tests/test_graphql.py +3 -2
- nautobot/ipam/tests/test_views.py +0 -1
- nautobot/ipam/views.py +9 -9
- nautobot/project-static/css/base.css +0 -1
- nautobot/project-static/docs/404.html +3 -24
- nautobot/project-static/docs/apps/index.html +3 -24
- nautobot/project-static/docs/apps/nautobot-apps.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +5 -26
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +3 -24
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +3 -242
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +5 -69
- nautobot/project-static/docs/development/apps/api/configuration-view.html +3 -24
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +3 -24
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +3 -24
- nautobot/project-static/docs/development/apps/api/models/global-search.html +3 -24
- nautobot/project-static/docs/development/apps/api/models/graphql.html +3 -24
- nautobot/project-static/docs/development/apps/api/models/index.html +3 -24
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +3 -24
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +3 -24
- nautobot/project-static/docs/development/apps/api/prometheus.html +3 -24
- nautobot/project-static/docs/development/apps/api/setup.html +3 -24
- nautobot/project-static/docs/development/apps/api/testing.html +3 -24
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +3 -24
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +3 -24
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +3 -24
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +3 -24
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/base-template.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +12 -38
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +15 -41
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/index.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/notes.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +3 -24
- nautobot/project-static/docs/development/apps/api/views/urls.html +3 -24
- nautobot/project-static/docs/development/apps/index.html +3 -24
- nautobot/project-static/docs/development/apps/migration/code-updates.html +3 -24
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +3 -24
- nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -24
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +3 -24
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +3 -24
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +3 -24
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +3 -24
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +3 -24
- nautobot/project-static/docs/development/core/application-registry.html +3 -24
- nautobot/project-static/docs/development/core/best-practices.html +3 -24
- nautobot/project-static/docs/development/core/bootstrap-ui.html +3 -24
- nautobot/project-static/docs/development/core/caching.html +3 -24
- nautobot/project-static/docs/development/core/controllers.html +204 -35
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +3 -24
- nautobot/project-static/docs/development/core/extending-models.html +3 -24
- nautobot/project-static/docs/development/core/generic-views.html +3 -24
- nautobot/project-static/docs/development/core/getting-started.html +13 -43
- nautobot/project-static/docs/development/core/homepage.html +3 -24
- nautobot/project-static/docs/development/core/index.html +3 -24
- nautobot/project-static/docs/development/core/model-features.html +3 -24
- nautobot/project-static/docs/development/core/natural-keys.html +3 -24
- nautobot/project-static/docs/development/core/navigation-menu.html +3 -24
- nautobot/project-static/docs/development/core/release-checklist.html +3 -24
- nautobot/project-static/docs/development/core/role-internals.html +3 -24
- nautobot/project-static/docs/development/core/settings.html +3 -24
- nautobot/project-static/docs/development/core/style-guide.html +3 -24
- nautobot/project-static/docs/development/core/templates.html +3 -24
- nautobot/project-static/docs/development/core/testing.html +3 -24
- nautobot/project-static/docs/development/core/user-preferences.html +3 -24
- nautobot/project-static/docs/development/index.html +3 -24
- nautobot/project-static/docs/development/jobs/index.html +3 -24
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -24
- nautobot/project-static/docs/index.html +3 -24
- nautobot/project-static/docs/models/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +3 -3
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/release-notes/index.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.0.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.1.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.2.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.3.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.4.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.5.html +3 -24
- nautobot/project-static/docs/release-notes/version-1.6.html +3 -24
- nautobot/project-static/docs/release-notes/version-2.0.html +3 -24
- nautobot/project-static/docs/release-notes/version-2.1.html +162 -411
- nautobot/project-static/docs/release-notes/version-2.2.html +30 -212
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +255 -260
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +3 -24
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +3 -24
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/docker.html +6 -31
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/index.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +3 -24
- nautobot/project-static/docs/user-guide/administration/installation/selinux-troubleshooting.html +6 -27
- nautobot/project-static/docs/user-guide/administration/installation/services.html +3 -24
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +3 -24
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -24
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +3 -24
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +3 -24
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +11 -259
- nautobot/project-static/docs/user-guide/core-data-model/dcim/{controllermanageddevicegroup.html → controllerdevicegroup.html} +17 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +6 -27
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +3 -24
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/{contacts-and-teams.html → contact-and-team.html} +4 -25
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +5 -26
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +5 -26
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +3 -24
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +3 -24
- nautobot/project-static/docs/user-guide/index.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +3 -24
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +3 -24
- nautobot/tenancy/api/urls.py +2 -1
- nautobot/tenancy/api/views.py +12 -0
- nautobot/tenancy/tables.py +1 -1
- nautobot/tenancy/tests/test_views.py +0 -1
- nautobot/users/api/urls.py +2 -1
- nautobot/users/api/views.py +65 -2
- nautobot/users/views.py +8 -8
- nautobot/virtualization/api/urls.py +2 -1
- nautobot/virtualization/api/views.py +12 -0
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/METADATA +3 -3
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/RECORD +356 -361
- nautobot/core/tests/integration/test_view_authentication.py +0 -67
- nautobot/dcim/management/commands/migrate_location_contacts.py +0 -218
- nautobot/dcim/templates/dcim/controller_create.html +0 -70
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +0 -88
- nautobot/ipam/tests/test_tables.py +0 -42
- nautobot/project-static/docs/user-guide/administration/installation/health-checks.html +0 -8581
- /nautobot/dcim/templates/dcim/{controllermanageddevicegroup_retrieve.html → controllerdevicegroup_retrieve.html} +0 -0
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/NOTICE +0 -0
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/WHEEL +0 -0
- {nautobot-2.2.0.dist-info → nautobot-2.2.0b1.dist-info}/entry_points.txt +0 -0
nautobot/apps/api.py
CHANGED
|
@@ -19,7 +19,7 @@ from nautobot.core.api.fields import (
|
|
|
19
19
|
)
|
|
20
20
|
from nautobot.core.api.mixins import WritableSerializerMixin
|
|
21
21
|
from nautobot.core.api.parsers import NautobotCSVParser
|
|
22
|
-
from nautobot.core.api.routers import
|
|
22
|
+
from nautobot.core.api.routers import OrderedDefaultRouter
|
|
23
23
|
from nautobot.core.api.schema import NautobotAutoSchema
|
|
24
24
|
from nautobot.core.api.serializers import (
|
|
25
25
|
OptInFieldsMixin,
|
|
@@ -36,6 +36,7 @@ from nautobot.core.api.utils import (
|
|
|
36
36
|
versioned_serializer_selector,
|
|
37
37
|
)
|
|
38
38
|
from nautobot.core.api.views import (
|
|
39
|
+
APIRootView,
|
|
39
40
|
BulkDestroyModelMixin,
|
|
40
41
|
BulkUpdateModelMixin,
|
|
41
42
|
GetObjectCountsView,
|
nautobot/apps/utils.py
CHANGED
|
@@ -32,8 +32,6 @@ from nautobot.core.utils.lookup import (
|
|
|
32
32
|
get_related_class_for_model,
|
|
33
33
|
get_route_for_model,
|
|
34
34
|
get_table_for_model,
|
|
35
|
-
get_url_for_url_pattern,
|
|
36
|
-
get_url_patterns,
|
|
37
35
|
get_view_for_model,
|
|
38
36
|
)
|
|
39
37
|
from nautobot.core.utils.migrations import migrate_content_type_references_to_new_model
|
|
@@ -115,8 +113,6 @@ __all__ = (
|
|
|
115
113
|
"get_settings_or_config",
|
|
116
114
|
"get_table_for_model",
|
|
117
115
|
"get_view_for_model",
|
|
118
|
-
"get_url_for_url_pattern",
|
|
119
|
-
"get_url_patterns",
|
|
120
116
|
"get_worker_count",
|
|
121
117
|
"GitRepo",
|
|
122
118
|
"hex_to_rgb",
|
nautobot/apps/views.py
CHANGED
|
@@ -8,7 +8,6 @@ from nautobot.core.views.generic import (
|
|
|
8
8
|
BulkImportView, # 3.0 TODO: deprecated, will be removed in 3.0
|
|
9
9
|
BulkRenameView,
|
|
10
10
|
ComponentCreateView,
|
|
11
|
-
GenericView,
|
|
12
11
|
ObjectDeleteView,
|
|
13
12
|
ObjectEditView,
|
|
14
13
|
ObjectImportView,
|
|
@@ -58,7 +57,6 @@ __all__ = (
|
|
|
58
57
|
"csv_format",
|
|
59
58
|
"EnhancedPage",
|
|
60
59
|
"EnhancedPaginator",
|
|
61
|
-
"GenericView",
|
|
62
60
|
"get_csv_form_fields_from_serializer_class",
|
|
63
61
|
"get_paginate_count",
|
|
64
62
|
"GetReturnURLMixin",
|
nautobot/circuits/api/urls.py
CHANGED
|
@@ -2,7 +2,8 @@ from nautobot.core.api.routers import OrderedDefaultRouter
|
|
|
2
2
|
|
|
3
3
|
from . import views
|
|
4
4
|
|
|
5
|
-
router = OrderedDefaultRouter(
|
|
5
|
+
router = OrderedDefaultRouter()
|
|
6
|
+
router.APIRootView = views.CircuitsRootView
|
|
6
7
|
|
|
7
8
|
# Providers
|
|
8
9
|
router.register("providers", views.ProviderViewSet)
|
nautobot/circuits/api/views.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from rest_framework.routers import APIRootView
|
|
2
|
+
|
|
1
3
|
from nautobot.circuits import filters
|
|
2
4
|
from nautobot.circuits.models import Circuit, CircuitTermination, CircuitType, Provider, ProviderNetwork
|
|
3
5
|
from nautobot.core.models.querysets import count_related
|
|
@@ -6,6 +8,16 @@ from nautobot.extras.api.views import NautobotModelViewSet
|
|
|
6
8
|
|
|
7
9
|
from . import serializers
|
|
8
10
|
|
|
11
|
+
|
|
12
|
+
class CircuitsRootView(APIRootView):
|
|
13
|
+
"""
|
|
14
|
+
Circuits API root view
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def get_view_name(self):
|
|
18
|
+
return "Circuits"
|
|
19
|
+
|
|
20
|
+
|
|
9
21
|
#
|
|
10
22
|
# Providers
|
|
11
23
|
#
|
|
@@ -57,7 +57,7 @@ class ProviderTestCase(FilterTestCases.NameOnlyFilterTestCase, FilterTestCases.F
|
|
|
57
57
|
def test_location(self):
|
|
58
58
|
expected = self.queryset.filter(
|
|
59
59
|
circuits__circuit_terminations__location__in=[self.locations[0].pk, self.locations[1].pk]
|
|
60
|
-
)
|
|
60
|
+
)
|
|
61
61
|
params = {"location": [self.locations[0].pk, self.locations[1].pk]}
|
|
62
62
|
self.assertQuerysetEqualAndNotEmpty(self.filterset(params, self.queryset).qs, expected)
|
|
63
63
|
params = {"location": [self.locations[0].name, self.locations[1].name]}
|
nautobot/core/api/routers.py
CHANGED
|
@@ -1,23 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
from collections import OrderedDict
|
|
2
2
|
|
|
3
3
|
from rest_framework.routers import DefaultRouter
|
|
4
4
|
|
|
5
|
-
from nautobot.core.api.views import AuthenticatedAPIRootView
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(__name__)
|
|
8
|
-
|
|
9
5
|
|
|
10
6
|
class OrderedDefaultRouter(DefaultRouter):
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def __init__(self, *args, view_name=None, view_description=None, **kwargs):
|
|
7
|
+
def __init__(self, *args, **kwargs):
|
|
14
8
|
super().__init__(*args, **kwargs)
|
|
15
9
|
|
|
16
|
-
self.view_name = view_name
|
|
17
|
-
if view_name and not view_description:
|
|
18
|
-
view_description = f"{view_name} API root view"
|
|
19
|
-
self.view_description = view_description
|
|
20
|
-
|
|
21
10
|
# Extend the list view mappings to support the DELETE operation
|
|
22
11
|
self.routes[0].mapping.update(
|
|
23
12
|
{
|
|
@@ -31,20 +20,9 @@ class OrderedDefaultRouter(DefaultRouter):
|
|
|
31
20
|
"""
|
|
32
21
|
Wrap DRF's DefaultRouter to return an alphabetized list of endpoints.
|
|
33
22
|
"""
|
|
34
|
-
api_root_dict =
|
|
23
|
+
api_root_dict = OrderedDict()
|
|
35
24
|
list_name = self.routes[0].name
|
|
36
|
-
|
|
37
25
|
for prefix, _viewset, basename in sorted(self.registry, key=lambda x: x[0]):
|
|
38
26
|
api_root_dict[prefix] = list_name.format(basename=basename)
|
|
39
27
|
|
|
40
|
-
if issubclass(self.APIRootView, AuthenticatedAPIRootView):
|
|
41
|
-
return self.APIRootView.as_view(
|
|
42
|
-
api_root_dict=api_root_dict, name=self.view_name, description=self.view_description
|
|
43
|
-
)
|
|
44
|
-
# Fallback for the established practice of overriding self.APIRootView with a custom class
|
|
45
|
-
logger.warning(
|
|
46
|
-
"Something has changed an OrderedDefaultRouter's APIRootView attribute to a custom class. "
|
|
47
|
-
"Please verify that class %s implements appropriate authentication controls.",
|
|
48
|
-
self.APIRootView.__name__,
|
|
49
|
-
)
|
|
50
28
|
return self.APIRootView.as_view(api_root_dict=api_root_dict)
|
nautobot/core/api/utils.py
CHANGED
|
@@ -178,10 +178,6 @@ def get_view_name(view, suffix=None):
|
|
|
178
178
|
|
|
179
179
|
else:
|
|
180
180
|
# Replicate DRF's built-in behavior.
|
|
181
|
-
name = getattr(view, "name", None)
|
|
182
|
-
if name is not None:
|
|
183
|
-
return view.name
|
|
184
|
-
|
|
185
181
|
name = view.__class__.__name__
|
|
186
182
|
name = formatting.remove_trailing_string(name, "View")
|
|
187
183
|
name = formatting.remove_trailing_string(name, "ViewSet")
|
nautobot/core/api/views.py
CHANGED
|
@@ -24,9 +24,9 @@ from graphql import get_default_backend
|
|
|
24
24
|
from graphql.execution import ExecutionResult
|
|
25
25
|
from graphql.execution.middleware import MiddlewareManager
|
|
26
26
|
from graphql.type.schema import GraphQLSchema
|
|
27
|
-
from rest_framework import
|
|
27
|
+
from rest_framework import status
|
|
28
28
|
from rest_framework.exceptions import ParseError, PermissionDenied
|
|
29
|
-
from rest_framework.permissions import IsAuthenticated
|
|
29
|
+
from rest_framework.permissions import AllowAny, IsAuthenticated
|
|
30
30
|
from rest_framework.response import Response
|
|
31
31
|
from rest_framework.reverse import reverse
|
|
32
32
|
from rest_framework.views import APIView
|
|
@@ -347,25 +347,15 @@ class ReadOnlyModelViewSet(NautobotAPIVersionMixin, ModelViewSetMixin, ReadOnlyM
|
|
|
347
347
|
#
|
|
348
348
|
|
|
349
349
|
|
|
350
|
-
class
|
|
350
|
+
class APIRootView(NautobotAPIVersionMixin, APIView):
|
|
351
351
|
"""
|
|
352
|
-
|
|
352
|
+
This is the root of the REST API. API endpoints are arranged by app and model name; e.g. `/api/dcim/locations/`.
|
|
353
353
|
"""
|
|
354
354
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
name = None
|
|
358
|
-
description = None
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
class APIRootView(AuthenticatedAPIRootView):
|
|
362
|
-
"""
|
|
363
|
-
This is the root of the REST API.
|
|
355
|
+
_ignore_model_permissions = True
|
|
364
356
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
name = "API Root"
|
|
357
|
+
def get_view_name(self):
|
|
358
|
+
return "API Root"
|
|
369
359
|
|
|
370
360
|
@extend_schema(exclude=True)
|
|
371
361
|
def get(self, request, format=None): # pylint: disable=redefined-builtin
|
|
@@ -514,6 +504,11 @@ class NautobotSpectacularSwaggerView(APIVersioningGetSchemaURLMixin, Spectacular
|
|
|
514
504
|
@extend_schema(exclude=True)
|
|
515
505
|
def get(self, request, *args, **kwargs):
|
|
516
506
|
"""Fix up the rendering of the Swagger UI to work with Nautobot's UI."""
|
|
507
|
+
if not request.user.is_authenticated:
|
|
508
|
+
doc_url = reverse("api_docs")
|
|
509
|
+
login_url = reverse(settings.LOGIN_URL)
|
|
510
|
+
return redirect(f"{login_url}?next={doc_url}")
|
|
511
|
+
|
|
517
512
|
# For backward compatibility wtih drf-yasg, `/api/docs/?format=openapi` is a redirect to the JSON schema.
|
|
518
513
|
if request.GET.get("format") == "openapi":
|
|
519
514
|
return redirect("schema_json", permanent=True)
|
|
@@ -542,12 +537,11 @@ class NautobotSpectacularRedocView(APIVersioningGetSchemaURLMixin, SpectacularRe
|
|
|
542
537
|
class GraphQLDRFAPIView(NautobotAPIVersionMixin, APIView):
|
|
543
538
|
"""
|
|
544
539
|
API View for GraphQL to integrate properly with DRF authentication mechanism.
|
|
540
|
+
The code is a stripped down version of graphene-django default View
|
|
541
|
+
https://github.com/graphql-python/graphene-django/blob/main/graphene_django/views.py#L57
|
|
545
542
|
"""
|
|
546
543
|
|
|
547
|
-
|
|
548
|
-
# https://github.com/graphql-python/graphene-django/blob/main/graphene_django/views.py#L57
|
|
549
|
-
|
|
550
|
-
permission_classes = [IsAuthenticated]
|
|
544
|
+
permission_classes = [AllowAny]
|
|
551
545
|
graphql_schema = None
|
|
552
546
|
executor = None
|
|
553
547
|
backend = None
|
nautobot/core/filters.py
CHANGED
|
@@ -260,9 +260,6 @@ class ContentTypeMultipleChoiceFilter(django_filters.MultipleChoiceFilter):
|
|
|
260
260
|
if not self.conjoined:
|
|
261
261
|
qs = qs.filter(q)
|
|
262
262
|
|
|
263
|
-
if self.distinct:
|
|
264
|
-
qs = qs.distinct()
|
|
265
|
-
|
|
266
263
|
return qs
|
|
267
264
|
|
|
268
265
|
|
|
@@ -525,10 +522,7 @@ class TreeNodeMultipleChoiceFilter(NaturalKeyOrPKMultipleChoiceFilter):
|
|
|
525
522
|
|
|
526
523
|
# Fetch the generated Q object and filter the incoming qs with it before passing it along.
|
|
527
524
|
query = self.generate_query(value)
|
|
528
|
-
|
|
529
|
-
if self.distinct:
|
|
530
|
-
result = result.distinct()
|
|
531
|
-
return result
|
|
525
|
+
return self.get_method(qs)(query)
|
|
532
526
|
|
|
533
527
|
|
|
534
528
|
#
|
|
@@ -58,8 +58,8 @@ class Command(BaseCommand):
|
|
|
58
58
|
ProviderNetworkFactory,
|
|
59
59
|
)
|
|
60
60
|
from nautobot.dcim.factory import (
|
|
61
|
+
ControllerDeviceGroupFactory,
|
|
61
62
|
ControllerFactory,
|
|
62
|
-
ControllerManagedDeviceGroupFactory,
|
|
63
63
|
DeviceFactory,
|
|
64
64
|
DeviceFamilyFactory,
|
|
65
65
|
DeviceRedundancyGroupFactory,
|
|
@@ -131,7 +131,7 @@ class Command(BaseCommand):
|
|
|
131
131
|
LocationFactory.create_batch(10, has_parent=False, using=db_name)
|
|
132
132
|
self.stdout.write("Creating Controller with Groups...")
|
|
133
133
|
ControllerFactory.create_batch(1)
|
|
134
|
-
|
|
134
|
+
ControllerDeviceGroupFactory.create_batch(5)
|
|
135
135
|
self.stdout.write("Creating RIRs...")
|
|
136
136
|
RIRFactory.create_batch(9, using=db_name) # only 9 unique RIR names are hard-coded presently
|
|
137
137
|
self.stdout.write("Creating RouteTargets...")
|
|
@@ -207,7 +207,7 @@ class Command(BaseCommand):
|
|
|
207
207
|
ExternalIntegrationFactory.create_batch(20, using=db_name)
|
|
208
208
|
self.stdout.write("Creating Controllers with Device or DeviceRedundancyGroups...")
|
|
209
209
|
ControllerFactory.create_batch(10)
|
|
210
|
-
|
|
210
|
+
ControllerDeviceGroupFactory.create_batch(30)
|
|
211
211
|
# make sure we have some tenants that have null relationships to make filter tests happy
|
|
212
212
|
self.stdout.write("Creating Tenants without Circuits, Locations, IPAddresses, or Prefixes...")
|
|
213
213
|
TenantFactory.create_batch(10, using=db_name)
|
|
@@ -227,7 +227,7 @@ class Command(BaseCommand):
|
|
|
227
227
|
CircuitTerminationFactory,
|
|
228
228
|
CircuitTypeFactory,
|
|
229
229
|
ContactFactory,
|
|
230
|
-
|
|
230
|
+
ControllerDeviceGroupFactory,
|
|
231
231
|
ControllerFactory,
|
|
232
232
|
DeviceFactory,
|
|
233
233
|
DeviceFamilyFactory,
|
nautobot/core/settings.py
CHANGED
|
@@ -332,7 +332,6 @@ SPECTACULAR_SETTINGS = {
|
|
|
332
332
|
# trim it from all of the individual paths correspondingly.
|
|
333
333
|
# See also https://github.com/nautobot/nautobot-ansible/pull/135 for an example of why this is desirable.
|
|
334
334
|
"SERVERS": [{"url": "/api"}],
|
|
335
|
-
"SERVE_PERMISSIONS": ["rest_framework.permissions.IsAuthenticated"],
|
|
336
335
|
"SCHEMA_PATH_PREFIX": "/api",
|
|
337
336
|
"SCHEMA_PATH_PREFIX_TRIM": True,
|
|
338
337
|
# use sidecar - locally packaged UI files, not CDN
|
nautobot/core/tables.py
CHANGED
|
@@ -34,7 +34,7 @@ class BaseTable(django_tables2.Table):
|
|
|
34
34
|
"class": "table table-hover table-headings",
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
def __init__(self, *args, user=None,
|
|
37
|
+
def __init__(self, *args, user=None, **kwargs):
|
|
38
38
|
# Add custom field columns
|
|
39
39
|
model = self._meta.model
|
|
40
40
|
|
|
@@ -64,7 +64,6 @@ class BaseTable(django_tables2.Table):
|
|
|
64
64
|
|
|
65
65
|
# Init table
|
|
66
66
|
super().__init__(*args, **kwargs)
|
|
67
|
-
self.hide_hierarchy_ui = hide_hierarchy_ui
|
|
68
67
|
|
|
69
68
|
# Set default empty_text if none was provided
|
|
70
69
|
if self.empty_text is None:
|
|
@@ -8,7 +8,55 @@
|
|
|
8
8
|
<html lang="en"{% if request.COOKIES|get_item:"theme" == 'dark' %} data-theme="dark"{% endif %}>
|
|
9
9
|
<head>
|
|
10
10
|
<title>{% block title %}Admin Home{% endblock %} - Nautobot</title>
|
|
11
|
-
|
|
11
|
+
<link rel="stylesheet"
|
|
12
|
+
href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"
|
|
13
|
+
onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/css/bootstrap.min.css'">
|
|
14
|
+
<link rel="stylesheet"
|
|
15
|
+
href="{% static 'materialdesignicons-6.5.95/css/materialdesignicons.min.css' %}"
|
|
16
|
+
onerror="window.location='{% url 'media_failure' %}?filename=materialdesignicons-6.5.95/css/materialdesignicons.min.css'">
|
|
17
|
+
<link rel="stylesheet"
|
|
18
|
+
href="{% static 'jquery-ui-1.13.1/jquery-ui.min.css' %}"
|
|
19
|
+
onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.css'">
|
|
20
|
+
<link rel="stylesheet"
|
|
21
|
+
href="{% static 'select2-4.0.13/select2.min.css' %}"
|
|
22
|
+
onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.css'">
|
|
23
|
+
<link rel="stylesheet"
|
|
24
|
+
href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css' %}"
|
|
25
|
+
onerror="window.location='{% url 'media_failure' %}?filename=select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css'">
|
|
26
|
+
<link rel="stylesheet"
|
|
27
|
+
href="{% static 'flatpickr-4.6.9/themes/light.min.css' %}"
|
|
28
|
+
onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/themes/light.min.css'">
|
|
29
|
+
<link rel="stylesheet" id="dark-theme"
|
|
30
|
+
href="{% versioned_static 'css/dark.css' %}"
|
|
31
|
+
onerror="window.location='{% url 'media_failure' %}?filename=css/dark.css'"{% if request.COOKIES|get_item:"theme" != 'dark' %} disabled="disabled"{% endif %} />
|
|
32
|
+
<link rel="stylesheet" id="base-theme"
|
|
33
|
+
href="{% versioned_static 'css/base.css' %}"
|
|
34
|
+
onerror="window.location='{% url 'media_failure' %}?filename=css/base.css'">
|
|
35
|
+
<link rel="apple-touch-icon" sizes="180x180" href="{% custom_branding_or_static 'icon_180' 'img/nautobot_icon_180x180.png' %}">
|
|
36
|
+
<link rel="icon" type="image/png" sizes="32x32" href="{% custom_branding_or_static 'icon_32' 'img/nautobot_icon_32x32.png' %}">
|
|
37
|
+
<link rel="icon" type="image/png" sizes="16x16" href="{% custom_branding_or_static 'icon_16' 'img/nautobot_icon_16x16.png' %}">
|
|
38
|
+
<link rel="icon" type="image/png" href="{% custom_branding_or_static 'icon_192' 'img/nautobot_icon_192x192.png' %}" sizes="192x192">
|
|
39
|
+
<link rel="mask-icon" href="{% custom_branding_or_static 'icon_mask' 'img/nautobot_icon_monochrome.svg' %}" color="#0097ff">
|
|
40
|
+
<link rel="shortcut icon" href="{% custom_branding_or_static 'favicon' 'img/favicon.ico' %}">
|
|
41
|
+
|
|
42
|
+
<script src="{% static 'jquery/jquery-3.6.0.min.js' %}"
|
|
43
|
+
onerror="window.location='{% url 'media_failure' %}?filename=jquery/jquery-3.6.0.min.js'"></script>
|
|
44
|
+
<script src="{% static 'jquery-ui-1.13.1/jquery-ui.min.js' %}"
|
|
45
|
+
onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.js'"></script>
|
|
46
|
+
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"
|
|
47
|
+
onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/js/bootstrap.min.js'"></script>
|
|
48
|
+
<script src="{% static 'select2-4.0.13/select2.min.js' %}"
|
|
49
|
+
onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.js'"></script>
|
|
50
|
+
<script src="{% static 'flatpickr-4.6.9/flatpickr.min.js' %}"
|
|
51
|
+
onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/flatpickr.min.js'"></script>
|
|
52
|
+
<script src="{% static 'js/forms.js' %}"
|
|
53
|
+
onerror="window.location='{% url 'media_failure' %}?filename=js/forms.js'"></script>
|
|
54
|
+
|
|
55
|
+
<meta name="msapplication-TileColor" content="#2d89ef">
|
|
56
|
+
<meta name="theme-color" content="#ffffff">
|
|
57
|
+
<meta charset="UTF-8">
|
|
58
|
+
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
|
|
59
|
+
|
|
12
60
|
{% block extrahead %}{% endblock %}
|
|
13
61
|
{% block extrastyle %}{% endblock %}
|
|
14
62
|
|
|
@@ -46,27 +94,23 @@
|
|
|
46
94
|
}
|
|
47
95
|
</style>
|
|
48
96
|
</head>
|
|
49
|
-
<body {% if is_popup %}style="padding-
|
|
50
|
-
|
|
97
|
+
<body {% if is_popup %}style="padding-top: 0px;"{% endif %}>
|
|
51
98
|
{% if not is_popup %}
|
|
52
99
|
{% include 'inc/nav_menu.html' %}
|
|
53
100
|
{% endif %}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
{{ "BANNER_TOP"|settings_or_config|safe }}
|
|
60
|
-
</div>
|
|
61
|
-
{% endif %}
|
|
62
|
-
{% if settings.MAINTENANCE_MODE %}
|
|
63
|
-
<div class="alert alert-warning text-center" role="alert">
|
|
64
|
-
<h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
|
|
65
|
-
<p>Nautobot is currently in maintenance mode. Functionality may be limited.</p>
|
|
66
|
-
</div>
|
|
67
|
-
{% endif %}
|
|
68
|
-
{% plugin_banners %}
|
|
101
|
+
<div class="container-fluid wrapper" {% if is_popup %}style="padding-bottom: 0px;"{% endif %}>
|
|
102
|
+
{% if "BANNER_TOP"|settings_or_config %}
|
|
103
|
+
<div class="alert alert-info text-center" role="alert">
|
|
104
|
+
{{ "BANNER_TOP"|settings_or_config|safe }}
|
|
105
|
+
</div>
|
|
69
106
|
{% endif %}
|
|
107
|
+
{% if settings.MAINTENANCE_MODE %}
|
|
108
|
+
<div class="alert alert-warning text-center" role="alert">
|
|
109
|
+
<h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
|
|
110
|
+
<p>Nautobot is currently in maintenance mode. Functionality may be limited.</p>
|
|
111
|
+
</div>
|
|
112
|
+
{% endif %}
|
|
113
|
+
{% plugin_banners %}
|
|
70
114
|
{% for message in messages %}
|
|
71
115
|
<div class="alert alert-{{ message.tags }} alert-dismissable" role="alert">
|
|
72
116
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
|
@@ -104,6 +148,8 @@
|
|
|
104
148
|
{% block content %}{{ content }}{% endblock %}
|
|
105
149
|
</div>
|
|
106
150
|
</div>
|
|
151
|
+
|
|
152
|
+
{% block footer %}<footer id="footer"></footer>{% endblock %}
|
|
107
153
|
<div class="push"></div>
|
|
108
154
|
{% if "BANNER_BOTTOM"|settings_or_config %}
|
|
109
155
|
<div class="alert alert-info text-center banner-bottom" role="alert">
|
|
@@ -112,12 +158,37 @@
|
|
|
112
158
|
{% endif %}
|
|
113
159
|
</div>
|
|
114
160
|
{% if not is_popup %}
|
|
115
|
-
|
|
161
|
+
<footer class="footer">
|
|
162
|
+
<div class="container-fluid">
|
|
163
|
+
<div class="row">
|
|
164
|
+
<div class="col-xs-4">
|
|
165
|
+
<p class="text-muted">{{ settings.HOSTNAME }} (v{{ settings.VERSION }})</p>
|
|
166
|
+
</div>
|
|
167
|
+
<div class="col-xs-4 text-center">
|
|
168
|
+
<p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="col-xs-4 text-right noprint">
|
|
171
|
+
<p class="text-muted">
|
|
172
|
+
<a href="#theme_modal" data-toggle="modal" data-target="#theme_modal" id="btn-theme-modal"><i class="mdi mdi-theme-light-dark text-primary"></i>Theme</a> ·
|
|
173
|
+
<i class="mdi mdi-book-open-page-variant text-primary"></i>
|
|
174
|
+
{% if settings.BRANDING_URLS.docs %}
|
|
175
|
+
<a href="{{ settings.BRANDING_URLS.docs }}">Docs</a>
|
|
176
|
+
{% else %}
|
|
177
|
+
<a href="{% static 'docs/index.html' %}">Docs</a>
|
|
178
|
+
{% endif %}
|
|
179
|
+
·
|
|
180
|
+
<i class="mdi mdi-cloud-braces text-primary"></i> <a href="{% url 'api_docs' %}">API</a> ·
|
|
181
|
+
<i class="mdi mdi-graphql text-primary"></i> <a href="{% url 'graphql' %}">GraphQL</a> ·
|
|
182
|
+
<i class="mdi mdi-xml text-primary"></i> <a href="{{ settings.BRANDING_URLS.code }}">Code</a> ·
|
|
183
|
+
<i class="mdi mdi-lifebuoy text-primary"></i> <a href="{{ settings.BRANDING_URLS.help }}">Help</a>
|
|
184
|
+
</p>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
</footer>
|
|
116
189
|
{% endif %}
|
|
117
190
|
{% include 'modals/modal_theme.html' with name='theme'%}
|
|
118
|
-
|
|
119
|
-
{% block javascript %}
|
|
120
|
-
{% include 'inc/javascript.html' %}
|
|
121
|
-
{% endblock %}
|
|
191
|
+
<script src="{% versioned_static 'js/theme.js' %}"></script>
|
|
192
|
+
{% block javascript %}{% endblock %}
|
|
122
193
|
</body>
|
|
123
194
|
</html>
|
|
@@ -10,31 +10,53 @@ add "&raw" to the end of the URL within a browser.
|
|
|
10
10
|
<!DOCTYPE html>
|
|
11
11
|
<html>
|
|
12
12
|
<head>
|
|
13
|
-
{% include 'inc/media.html' %}
|
|
14
|
-
{% block extra_styles %}{% endblock %}
|
|
15
13
|
<!-- Nautobot template requirements -->
|
|
16
14
|
<title>{% block title %}GraphiQL{% endblock %} - {{ settings.BRANDING_TITLE }}</title>
|
|
17
|
-
|
|
15
|
+
<link rel="stylesheet"
|
|
16
|
+
href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"
|
|
17
|
+
onerror="window.location='{% url 'media_failure' %}?filename=bootstrap-3.4.1-dist/css/bootstrap.min.css'">
|
|
18
|
+
<link rel="stylesheet"
|
|
19
|
+
href="{% static 'materialdesignicons-6.5.95/css/materialdesignicons.min.css' %}"
|
|
20
|
+
onerror="window.location='{% url 'media_failure' %}?filename=materialdesignicons-6.5.95/css/materialdesignicons.min.css'">
|
|
21
|
+
<link rel="stylesheet"
|
|
22
|
+
href="{% static 'jquery-ui-1.13.1/jquery-ui.min.css' %}"
|
|
23
|
+
onerror="window.location='{% url 'media_failure' %}?filename=jquery-ui-1.13.1/jquery-ui.min.css'">
|
|
24
|
+
<link rel="stylesheet"
|
|
25
|
+
href="{% static 'select2-4.0.13/select2.min.css' %}"
|
|
26
|
+
onerror="window.location='{% url 'media_failure' %}?filename=select2-4.0.13/select2.min.css'">
|
|
27
|
+
<link rel="stylesheet"
|
|
28
|
+
href="{% static 'select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css' %}"
|
|
29
|
+
onerror="window.location='{% url 'media_failure' %}?filename=select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css'">
|
|
30
|
+
<link rel="stylesheet"
|
|
31
|
+
href="{% static 'flatpickr-4.6.9/themes/light.min.css' %}"
|
|
32
|
+
onerror="window.location='{% url 'media_failure' %}?filename=flatpickr-4.6.9/themes/light.min.css'">
|
|
33
|
+
<link rel="stylesheet" id="dark-theme"
|
|
34
|
+
href="{% versioned_static 'css/dark.css' %}"
|
|
35
|
+
onerror="window.location='{% url 'media_failure' %}?filename=css/dark.css'" disabled="disabled" />
|
|
36
|
+
<link rel="stylesheet"
|
|
37
|
+
href="{% versioned_static 'css/base.css' %}"
|
|
38
|
+
onerror="window.location='{% url 'media_failure' %}?filename=css/base.css'">
|
|
39
|
+
<link rel="apple-touch-icon" sizes="180x180" href="{% custom_branding_or_static 'icon_180' 'img/nautobot_icon_180x180.png' %}">
|
|
40
|
+
<link rel="icon" type="image/png" sizes="32x32" href="{% custom_branding_or_static 'icon_32' 'img/nautobot_icon_32x32.png' %}">
|
|
41
|
+
<link rel="icon" type="image/png" sizes="16x16" href="{% custom_branding_or_static 'icon_16' 'img/nautobot_icon_16x16.png' %}">
|
|
42
|
+
<link rel="icon" type="image/png" sizes="192x192" href="{% custom_branding_or_static 'icon_192' 'img/nautobot_icon_192x192.png' %}">
|
|
43
|
+
<link rel="mask-icon" type="image/png" color="#0097ff" href="{% custom_branding_or_static 'icon_mask' 'img/nautobot_icon_monochrome.png' %}">
|
|
44
|
+
<link rel="shortcut icon" href="{% custom_branding_or_static 'favicon' 'img/favicon.ico' %}">
|
|
45
|
+
<meta name="msapplication-TileColor" content="#2d89ef">
|
|
46
|
+
<meta name="theme-color" content="#ffffff">
|
|
47
|
+
<meta charset="UTF-8">
|
|
48
|
+
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
|
|
18
49
|
<!-- GraphiQL template requirements -->
|
|
19
50
|
<style>
|
|
20
|
-
#editor {
|
|
51
|
+
html, body, #editor {
|
|
52
|
+
height: 100%;
|
|
21
53
|
margin: 0;
|
|
22
54
|
width: 100%;
|
|
23
|
-
height: calc(100vh - 56px - 3rem);
|
|
24
55
|
}
|
|
25
56
|
.toolbar .dropdown-menu > li > a {
|
|
26
57
|
clear: left;
|
|
27
58
|
margin-right: 120px; /* leave room for the "Save Changes" button if present */
|
|
28
59
|
}
|
|
29
|
-
.graphiql-container .doc-explorer-title-bar {
|
|
30
|
-
box-sizing: content-box;
|
|
31
|
-
}
|
|
32
|
-
.graphiql-container .history-title-bar {
|
|
33
|
-
box-sizing: content-box;
|
|
34
|
-
}
|
|
35
|
-
.graphiql-container .docExplorerShow {
|
|
36
|
-
white-space: nowrap;
|
|
37
|
-
}
|
|
38
60
|
</style>
|
|
39
61
|
<!-- As Nautobot may be run without internet access, we source these files locally rather than from an online CDN -->
|
|
40
62
|
<link rel="stylesheet"
|
|
@@ -50,16 +72,23 @@ add "&raw" to the end of the URL within a browser.
|
|
|
50
72
|
onerror="window.location='{% url 'media_failure' %}?filename=graphiql-1.5.16/graphiql.min.js'"></script>
|
|
51
73
|
<script src="{% static 'subscriptions-transport-ws-0.9.18/client.min.js' %}"
|
|
52
74
|
onerror="window.location='{% url 'media_failure' %}?filename=subscriptions-transport-ws-0.9.18/client.min.js'"></script>
|
|
75
|
+
<!-- Custom CSS to address some conflicts between the two -->
|
|
76
|
+
<style>
|
|
77
|
+
body {
|
|
78
|
+
padding-top: 54px;
|
|
79
|
+
}
|
|
80
|
+
.graphiql-container .doc-explorer-title-bar {
|
|
81
|
+
box-sizing: content-box;
|
|
82
|
+
}
|
|
83
|
+
</style>
|
|
53
84
|
</head>
|
|
54
85
|
<body>
|
|
55
86
|
<!-- Nautobot page contents -->
|
|
56
87
|
{% include 'inc/nav_menu.html' %}
|
|
57
88
|
{% include 'modals/modal_theme.html' with name='theme'%}
|
|
58
89
|
{% include 'inc/javascript.html' %}
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
<div id="editor"></div>
|
|
62
|
-
</div>
|
|
90
|
+
<!-- GraphiQL page contents -->
|
|
91
|
+
<div id="editor"></div>
|
|
63
92
|
{% include 'inc/footer.html' %}
|
|
64
93
|
{% csrf_token %}
|
|
65
94
|
<script type="application/javascript">
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
{% load plugins %}
|
|
4
4
|
|
|
5
5
|
<style>
|
|
6
|
-
/* Styles for viewports narrower than
|
|
7
|
-
@media (max-width:
|
|
6
|
+
/* Styles for viewports narrower than 1007px */
|
|
7
|
+
@media (max-width: 1007px) {
|
|
8
8
|
.footer-col-1, .footer-col-2, .footer-col-3 {
|
|
9
9
|
text-align: center !important;
|
|
10
10
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<footer class="footer" id="footer">
|
|
20
20
|
<div class="container-fluid">
|
|
21
21
|
<div class="row">
|
|
22
|
-
<div class="col-xl-4 col-lg-4 col-md-
|
|
22
|
+
<div class="col-xl-4 col-lg-4 col-md-4 col-sm-3 col-xs-12 text-left footer-col-1 no-wrap">
|
|
23
23
|
{% if request.user.is_authenticated %}
|
|
24
24
|
<p class="text-muted">
|
|
25
25
|
{% if settings.BRANDING_FILEPATHS.logo and settings.BRANDING_POWERED_BY_URL %}<a href="{{ settings.BRANDING_POWERED_BY_URL }}"><img src="{% static 'img/nautobot_logo.svg' %}" height="20" /> Powered</a> ·{% endif %}
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
</p>
|
|
28
28
|
{% endif %}
|
|
29
29
|
</div>
|
|
30
|
-
<div class="col-xl-4 col-lg-
|
|
30
|
+
<div class="col-xl-4 col-lg-4 col-md-4 col-sm-3 col-xs-12 text-center footer-col-2">
|
|
31
31
|
<p class="text-muted">{% now 'Y-m-d H:i:s T' %}</p>
|
|
32
32
|
</div>
|
|
33
|
-
<div class="col-xl-4 col-lg-
|
|
33
|
+
<div class="col-xl-4 col-lg-4 col-md-4 col-sm-6 col-xs-12 text-right footer-col-3 noprint">
|
|
34
34
|
{% if request.user.is_authenticated %}
|
|
35
35
|
<p class="text-muted footer-links">
|
|
36
36
|
<a href="#theme_modal" data-toggle="modal" data-target="#theme_modal" id="btn-theme-modal"><i class="mdi mdi-theme-light-dark text-primary"></i>Theme</a> ·
|
|
@@ -121,6 +121,9 @@
|
|
|
121
121
|
document.addEventListener('DOMContentLoaded', function() {
|
|
122
122
|
const navbar = document.querySelector('.navbar-fixed-left');
|
|
123
123
|
const navbarHeader = document.querySelector('.navbar-header');
|
|
124
|
+
const breadcrumb = document.querySelector('.breadcrumb');
|
|
125
|
+
const bannerAlertArea = document.querySelector('.banner-alert-area');
|
|
126
|
+
const bannerAlert = document.querySelector('.plugin-banner') !== null;
|
|
124
127
|
const mainContent = document.querySelector('#main-content');
|
|
125
128
|
const footer = document.querySelector('#footer');
|
|
126
129
|
const dropdownToggles = document.querySelectorAll('.navbar-fixed-left .navbar-nav > .dropdown > a[data-toggle="collapse"]');
|
|
@@ -177,6 +180,10 @@
|
|
|
177
180
|
function adjustElementsForNavbarState(isCollapsed) {
|
|
178
181
|
const marginLeftValue = isCollapsed ? '-240px' : '0px';
|
|
179
182
|
mainContent.style.marginLeft = marginLeftValue;
|
|
183
|
+
bannerAlertArea.classList.toggle('collapsed', isCollapsed);
|
|
184
|
+
if(!bannerAlert && breadcrumb) {
|
|
185
|
+
breadcrumb.classList.toggle('collapsed', isCollapsed);
|
|
186
|
+
};
|
|
180
187
|
if(footer) footer.style.marginLeft = marginLeftValue;
|
|
181
188
|
toggler.style.left = isCollapsed ? '-5px' : '225px';
|
|
182
189
|
}
|
|
@@ -7,20 +7,13 @@
|
|
|
7
7
|
{% include 'inc/media.html' %}
|
|
8
8
|
{% endblock bootstrap_theme %}
|
|
9
9
|
|
|
10
|
-
{% block
|
|
10
|
+
{% block navbar %}
|
|
11
11
|
{% include 'inc/nav_menu.html' %}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
{% endblock navbar %}
|
|
13
|
+
|
|
14
|
+
{% block body %}
|
|
15
|
+
{{ block.super }}
|
|
15
16
|
{% include 'inc/footer.html' %}
|
|
16
|
-
<style>
|
|
17
|
-
.navbar-static-top {
|
|
18
|
-
display: none;
|
|
19
|
-
}
|
|
20
|
-
#main-content {
|
|
21
|
-
min-height: calc(100vh - 70px);
|
|
22
|
-
}
|
|
23
|
-
</style>
|
|
24
17
|
{% endblock body %}
|
|
25
18
|
|
|
26
19
|
{% block script %}
|