nautobot 2.4.10__py3-none-any.whl → 2.4.11__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/cloud/tests/test_views.py +13 -1
- nautobot/cloud/views.py +39 -9
- nautobot/core/celery/__init__.py +21 -0
- nautobot/core/celery/encoders.py +3 -0
- nautobot/core/forms/forms.py +4 -1
- nautobot/core/jobs/bulk_actions.py +8 -8
- nautobot/core/jobs/cleanup.py +11 -0
- nautobot/core/management/commands/generate_test_data.py +2 -1
- nautobot/core/templates/generic/object_retrieve.html +1 -1
- nautobot/core/testing/mixins.py +19 -1
- nautobot/core/testing/views.py +104 -8
- nautobot/core/tests/test_jobs.py +20 -4
- nautobot/core/tests/test_utils.py +193 -0
- nautobot/core/tests/test_views_utils.py +53 -2
- nautobot/core/ui/object_detail.py +4 -0
- nautobot/core/utils/lookup.py +4 -2
- nautobot/core/utils/module_loading.py +86 -58
- nautobot/core/views/generic.py +2 -12
- nautobot/core/views/mixins.py +19 -1
- nautobot/core/views/renderers.py +4 -13
- nautobot/core/views/utils.py +16 -0
- nautobot/dcim/api/serializers.py +13 -0
- nautobot/dcim/api/urls.py +1 -0
- nautobot/dcim/api/views.py +20 -0
- nautobot/dcim/apps.py +1 -0
- nautobot/dcim/factory.py +11 -0
- nautobot/dcim/filters/__init__.py +110 -0
- nautobot/dcim/forms.py +205 -19
- nautobot/dcim/migrations/0070_modulefamily_models.py +92 -0
- nautobot/dcim/models/__init__.py +2 -0
- nautobot/dcim/models/device_component_templates.py +14 -0
- nautobot/dcim/models/device_components.py +13 -1
- nautobot/dcim/models/devices.py +62 -0
- nautobot/dcim/navigation.py +16 -0
- nautobot/dcim/tables/__init__.py +2 -0
- nautobot/dcim/tables/devices.py +48 -0
- nautobot/dcim/tables/devicetypes.py +35 -1
- nautobot/dcim/tables/template_code.py +2 -0
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +1 -90
- nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +1 -1
- nautobot/dcim/templates/dcim/interfaceredundancygroup_retrieve.html +1 -63
- nautobot/dcim/templates/dcim/location.html +2 -249
- nautobot/dcim/templates/dcim/location_edit.html +2 -38
- nautobot/dcim/templates/dcim/location_retrieve.html +249 -0
- nautobot/dcim/templates/dcim/location_update.html +38 -0
- nautobot/dcim/templates/dcim/module_update.html +1 -0
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +93 -1
- nautobot/dcim/templates/dcim/modulefamily_retrieve.html +31 -0
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +6 -0
- nautobot/dcim/templates/dcim/powerfeed_retrieve.html +1 -160
- nautobot/dcim/tests/test_api.py +35 -0
- nautobot/dcim/tests/test_filters.py +102 -3
- nautobot/dcim/tests/test_models.py +146 -0
- nautobot/dcim/tests/test_views.py +70 -97
- nautobot/dcim/urls.py +4 -22
- nautobot/dcim/views.py +439 -153
- nautobot/extras/api/views.py +9 -2
- nautobot/extras/datasources/git.py +11 -3
- nautobot/extras/forms/forms.py +9 -5
- nautobot/extras/jobs.py +4 -2
- nautobot/extras/models/datasources.py +5 -8
- nautobot/extras/models/jobs.py +5 -0
- nautobot/extras/plugins/__init__.py +3 -0
- nautobot/extras/tables.py +40 -3
- nautobot/extras/templates/extras/configcontext.html +2 -220
- nautobot/extras/templates/extras/configcontext_edit.html +2 -50
- nautobot/extras/templates/extras/configcontext_retrieve.html +2 -0
- nautobot/extras/templates/extras/configcontext_update.html +50 -0
- nautobot/extras/templates/extras/configcontextschema.html +2 -48
- nautobot/extras/templates/extras/configcontextschema_edit.html +2 -19
- nautobot/extras/templates/extras/configcontextschema_retrieve.html +48 -0
- nautobot/extras/templates/extras/configcontextschema_update.html +19 -0
- nautobot/extras/templates/extras/inc/configcontext_data.html +1 -0
- nautobot/extras/templates/extras/inc/json_data.html +1 -1
- nautobot/extras/templates/extras/inc/json_format.html +2 -2
- nautobot/extras/templates/extras/job_edit.html +12 -6
- nautobot/extras/templates/extras/tag.html +2 -52
- nautobot/extras/templates/extras/tag_edit.html +2 -15
- nautobot/extras/templates/extras/tag_retrieve.html +52 -0
- nautobot/extras/templates/extras/tag_update.html +15 -0
- nautobot/extras/templates/extras/team_retrieve.html +2 -2
- nautobot/extras/tests/test_api.py +15 -15
- nautobot/extras/tests/test_filters.py +4 -4
- nautobot/extras/tests/test_jobs.py +23 -10
- nautobot/extras/tests/test_models.py +19 -8
- nautobot/extras/tests/test_plugins.py +6 -3
- nautobot/extras/tests/test_views.py +66 -11
- nautobot/extras/urls.py +4 -134
- nautobot/extras/views.py +113 -158
- nautobot/ipam/models.py +19 -4
- nautobot/ipam/tables.py +19 -0
- nautobot/ipam/templates/ipam/vlan.html +2 -84
- nautobot/ipam/templates/ipam/vlan_edit.html +2 -24
- nautobot/ipam/templates/ipam/vlan_retrieve.html +84 -0
- nautobot/ipam/templates/ipam/vlan_update.html +24 -0
- nautobot/ipam/tests/test_views.py +5 -0
- nautobot/ipam/urls.py +1 -21
- nautobot/ipam/views.py +45 -70
- nautobot/project-static/docs/404.html +31 -8
- nautobot/project-static/docs/apps/index.html +31 -8
- nautobot/project-static/docs/apps/nautobot-apps.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +120 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +31 -8
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +31 -8
- nautobot/project-static/docs/development/apps/api/configuration-view.html +31 -8
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +31 -8
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +31 -8
- nautobot/project-static/docs/development/apps/api/models/global-search.html +31 -8
- nautobot/project-static/docs/development/apps/api/models/graphql.html +31 -8
- nautobot/project-static/docs/development/apps/api/models/index.html +31 -8
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +40 -8
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +32 -9
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +31 -8
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +31 -8
- nautobot/project-static/docs/development/apps/api/prometheus.html +31 -8
- nautobot/project-static/docs/development/apps/api/setup.html +31 -8
- nautobot/project-static/docs/development/apps/api/testing.html +31 -8
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +31 -8
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +31 -8
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +31 -8
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +31 -8
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/base-template.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/index.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/notes.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +31 -8
- nautobot/project-static/docs/development/apps/api/views/urls.html +31 -8
- nautobot/project-static/docs/development/apps/index.html +31 -8
- nautobot/project-static/docs/development/apps/migration/code-updates.html +31 -8
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +31 -8
- nautobot/project-static/docs/development/apps/migration/from-v1.html +31 -8
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +31 -8
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +31 -8
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +31 -8
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +31 -8
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +31 -8
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +31 -8
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +31 -8
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +31 -8
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +31 -8
- nautobot/project-static/docs/development/core/application-registry.html +31 -8
- nautobot/project-static/docs/development/core/best-practices.html +31 -8
- nautobot/project-static/docs/development/core/bootstrap-ui.html +31 -8
- nautobot/project-static/docs/development/core/caching.html +31 -8
- nautobot/project-static/docs/development/core/controllers.html +31 -8
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +31 -8
- nautobot/project-static/docs/development/core/generic-views.html +31 -8
- nautobot/project-static/docs/development/core/getting-started.html +31 -8
- nautobot/project-static/docs/development/core/homepage.html +31 -8
- nautobot/project-static/docs/development/core/index.html +31 -8
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +31 -8
- nautobot/project-static/docs/development/core/model-checklist.html +31 -8
- nautobot/project-static/docs/development/core/model-features.html +31 -8
- nautobot/project-static/docs/development/core/natural-keys.html +31 -8
- nautobot/project-static/docs/development/core/navigation-menu.html +31 -8
- nautobot/project-static/docs/development/core/release-checklist.html +31 -8
- nautobot/project-static/docs/development/core/role-internals.html +31 -8
- nautobot/project-static/docs/development/core/settings.html +31 -8
- nautobot/project-static/docs/development/core/style-guide.html +31 -8
- nautobot/project-static/docs/development/core/templates.html +31 -8
- nautobot/project-static/docs/development/core/testing.html +31 -8
- nautobot/project-static/docs/development/core/ui-component-framework.html +31 -8
- nautobot/project-static/docs/development/core/user-preferences.html +31 -8
- nautobot/project-static/docs/development/index.html +31 -8
- nautobot/project-static/docs/development/jobs/getting-started.html +35 -8
- nautobot/project-static/docs/development/jobs/index.html +31 -8
- nautobot/project-static/docs/development/jobs/installation.html +31 -8
- nautobot/project-static/docs/development/jobs/job-extensions.html +31 -8
- nautobot/project-static/docs/development/jobs/job-logging.html +31 -8
- nautobot/project-static/docs/development/jobs/job-patterns.html +31 -8
- nautobot/project-static/docs/development/jobs/job-structure.html +31 -8
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +31 -8
- nautobot/project-static/docs/development/jobs/testing.html +31 -8
- nautobot/project-static/docs/index.html +31 -8
- nautobot/project-static/docs/insert-analytics.sh +36 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +31 -8
- nautobot/project-static/docs/overview/design_philosophy.html +31 -8
- nautobot/project-static/docs/release-notes/index.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.0.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.1.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.2.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.3.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.4.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.5.html +31 -8
- nautobot/project-static/docs/release-notes/version-1.6.html +31 -8
- nautobot/project-static/docs/release-notes/version-2.0.html +31 -8
- nautobot/project-static/docs/release-notes/version-2.1.html +31 -8
- nautobot/project-static/docs/release-notes/version-2.2.html +31 -8
- nautobot/project-static/docs/release-notes/version-2.3.html +31 -8
- nautobot/project-static/docs/release-notes/version-2.4.html +252 -8
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +302 -298
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +31 -8
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +31 -8
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/index.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +31 -8
- nautobot/project-static/docs/user-guide/administration/installation/services.html +31 -8
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +31 -8
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +31 -8
- nautobot/project-static/docs/user-guide/administration/security/index.html +31 -8
- nautobot/project-static/docs/user-guide/administration/security/notices.html +31 -8
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +31 -8
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +31 -8
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +43 -20
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +35 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +35 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +35 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulefamily.html +10261 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +34 -11
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +31 -8
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +41 -15
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +31 -8
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +31 -8
- nautobot/project-static/docs/user-guide/index.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +37 -9
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/managing-jobs.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +31 -8
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +31 -8
- nautobot/tenancy/tables.py +2 -0
- nautobot/virtualization/tests/test_views.py +1 -1
- nautobot/wireless/forms.py +0 -1
- nautobot/wireless/models.py +1 -1
- nautobot/wireless/tables.py +7 -0
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/METADATA +4 -4
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/RECORD +416 -401
- /nautobot/dcim/templates/dcim/{platform_edit.html → platform_create.html} +0 -0
- /nautobot/extras/test_jobs/{pass.py → pass_job.py} +0 -0
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/NOTICE +0 -0
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/WHEEL +0 -0
- {nautobot-2.4.10.dist-info → nautobot-2.4.11.dist-info}/entry_points.txt +0 -0
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
{% extends '
|
|
2
|
-
{%
|
|
3
|
-
|
|
4
|
-
{% block form %}
|
|
5
|
-
<div class="panel panel-default">
|
|
6
|
-
<div class="panel-heading"><strong>Config Context Schema</strong></div>
|
|
7
|
-
<div class="panel-body">
|
|
8
|
-
{% render_field form.name %}
|
|
9
|
-
{% render_field form.description %}
|
|
10
|
-
</div>
|
|
11
|
-
</div>
|
|
12
|
-
<div class="panel panel-default">
|
|
13
|
-
<div class="panel-heading"><strong>Data Schema</strong></div>
|
|
14
|
-
<div class="panel-body">
|
|
15
|
-
{% render_field form.data_schema %}
|
|
16
|
-
</div>
|
|
17
|
-
</div>
|
|
18
|
-
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
19
|
-
{% endblock %}
|
|
1
|
+
{% extends 'extras/configcontextschema_update.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{% extends 'generic/object_retrieve.html' %}
|
|
2
|
+
{% load buttons %}
|
|
3
|
+
{% load plugins %}
|
|
4
|
+
{% load helpers %}
|
|
5
|
+
|
|
6
|
+
{% block extra_nav_tabs %}
|
|
7
|
+
<li role="presentation"{% if active_tab == 'validation' %} class="active"{% endif %}>
|
|
8
|
+
<a href="{% url 'extras:configcontextschema_object_validation' pk=object.pk %}">Validation</a>
|
|
9
|
+
</li>
|
|
10
|
+
{% endblock extra_nav_tabs %}
|
|
11
|
+
|
|
12
|
+
{% block content_left_page %}
|
|
13
|
+
<div class="panel panel-default">
|
|
14
|
+
<div class="panel-heading">
|
|
15
|
+
<strong>Config Context Schema</strong>
|
|
16
|
+
</div>
|
|
17
|
+
<table class="table table-hover panel-body attr-table">
|
|
18
|
+
<tr>
|
|
19
|
+
<td>Name</td>
|
|
20
|
+
<td>
|
|
21
|
+
{{ object.name }}
|
|
22
|
+
</td>
|
|
23
|
+
</tr>
|
|
24
|
+
{% if object.owner %}
|
|
25
|
+
<tr>
|
|
26
|
+
<td>Owner</td>
|
|
27
|
+
<td>{{ object.owner|hyperlinked_object }}</td>
|
|
28
|
+
</tr>
|
|
29
|
+
{% endif %}
|
|
30
|
+
<tr>
|
|
31
|
+
<td>Description</td>
|
|
32
|
+
<td>{{ object.description|placeholder }}</td>
|
|
33
|
+
</tr>
|
|
34
|
+
</table>
|
|
35
|
+
</div>
|
|
36
|
+
{% endblock content_left_page %}
|
|
37
|
+
|
|
38
|
+
{% block content_right_page %}
|
|
39
|
+
<div class="panel panel-default">
|
|
40
|
+
<div class="panel-heading">
|
|
41
|
+
<strong>Data Schema</strong>
|
|
42
|
+
{% include 'extras/inc/json_format.html' %}
|
|
43
|
+
</div>
|
|
44
|
+
<div class="panel-body">
|
|
45
|
+
{% include 'extras/inc/json_data.html' with data=object.data_schema format=format %}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
{% endblock content_right_page %}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{% extends 'generic/object_create.html' %}
|
|
2
|
+
{% load form_helpers %}
|
|
3
|
+
|
|
4
|
+
{% block form %}
|
|
5
|
+
<div class="panel panel-default">
|
|
6
|
+
<div class="panel-heading"><strong>Config Context Schema</strong></div>
|
|
7
|
+
<div class="panel-body">
|
|
8
|
+
{% render_field form.name %}
|
|
9
|
+
{% render_field form.description %}
|
|
10
|
+
</div>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="panel panel-default">
|
|
13
|
+
<div class="panel-heading"><strong>Data Schema</strong></div>
|
|
14
|
+
<div class="panel-body">
|
|
15
|
+
{% render_field form.data_schema %}
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
19
|
+
{% endblock %}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{% include 'extras/inc/json_data.html' with data=object.data format=format %}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{% load helpers %}
|
|
2
2
|
|
|
3
3
|
<div class="rendered-json-data">
|
|
4
|
-
<pre>{% if
|
|
4
|
+
<pre>{% if data_format == 'json' %}{{ data|render_json }}{% elif data_format == 'yaml' %}{{ data|render_yaml }}{% else %}{{ data }}{% endif %}</pre>
|
|
5
5
|
</div>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div class="pull-right">
|
|
2
2
|
<div class="btn-group btn-group-xs" role="group">
|
|
3
|
-
<a href="?
|
|
4
|
-
<a href="?
|
|
3
|
+
<a href="?data_format=json" class="btn btn-default{% if data_format == 'json' %} active{% endif %}">JSON</a>
|
|
4
|
+
<a href="?data_format=yaml" class="btn btn-default{% if data_format == 'yaml' %} active{% endif %}">YAML</a>
|
|
5
5
|
</div>
|
|
6
6
|
</div>
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
const field_name = field_id.slice(3);
|
|
116
116
|
if ($(this).prop("checked")) {
|
|
117
117
|
field.attr("readonly", null);
|
|
118
|
-
field.
|
|
118
|
+
field.prop("disabled", false);
|
|
119
119
|
} else {
|
|
120
120
|
/* Revert the field to its default value */
|
|
121
121
|
if (field.attr("type") == "checkbox") {
|
|
@@ -131,11 +131,11 @@
|
|
|
131
131
|
* Note that "disabled" fields aren't included in form submission, so we have to be sure to
|
|
132
132
|
* re-enable them at form submission time.
|
|
133
133
|
*/
|
|
134
|
-
field.
|
|
134
|
+
field.prop("disabled", true);
|
|
135
135
|
} else {
|
|
136
136
|
/* Do we have a job class object to derive properties from? */
|
|
137
137
|
if (job_class_properties != "") {
|
|
138
|
-
if (field_name != "job_queues") {
|
|
138
|
+
if (field_name != "job_queues" && field_name != "default_job_queue") {
|
|
139
139
|
field.val(job_class_properties[field_name]);
|
|
140
140
|
}
|
|
141
141
|
} else if (field_name != "description") {
|
|
@@ -145,17 +145,23 @@
|
|
|
145
145
|
/* Textarea fields don't have a "value" attribute */
|
|
146
146
|
field.val(description_default);
|
|
147
147
|
}
|
|
148
|
-
|
|
148
|
+
if (field_name == "job_queues" || field_name == "default_job_queue") {
|
|
149
|
+
field.prop("disabled", true);
|
|
150
|
+
} else {
|
|
151
|
+
field.attr("readonly", "readonly");
|
|
152
|
+
}
|
|
149
153
|
}
|
|
150
154
|
}
|
|
151
155
|
});
|
|
152
156
|
$("[id^=id_][id$=_override]").change();
|
|
153
157
|
|
|
154
|
-
/* As mentioned above, we need to re-enable all checkboxes on form submission so they get included */
|
|
158
|
+
/* As mentioned above, we need to re-enable all checkboxes, job_queues and default_job_queue fields on form submission so they get included */
|
|
155
159
|
$("form").submit(function() {
|
|
156
160
|
$('input[type="checkbox"]:disabled').each(function() {
|
|
157
|
-
$(this).
|
|
161
|
+
$(this).prop("disabled", false);
|
|
158
162
|
});
|
|
163
|
+
$('#id_job_queues').prop("disabled", false);
|
|
164
|
+
$('#id_default_job_queues').prop("disabled", false);
|
|
159
165
|
});
|
|
160
166
|
</script>
|
|
161
167
|
{% endblock javascript %}
|
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
{% extends '
|
|
2
|
-
{%
|
|
3
|
-
|
|
4
|
-
{% block content_left_page %}
|
|
5
|
-
<div class="panel panel-default">
|
|
6
|
-
<div class="panel-heading">
|
|
7
|
-
<strong>Tag</strong>
|
|
8
|
-
</div>
|
|
9
|
-
<table class="table table-hover panel-body attr-table">
|
|
10
|
-
<tr>
|
|
11
|
-
<td>Name</td>
|
|
12
|
-
<td>
|
|
13
|
-
{{ object.name }}
|
|
14
|
-
</td>
|
|
15
|
-
</tr>
|
|
16
|
-
<tr>
|
|
17
|
-
<td>Tagged Items</td>
|
|
18
|
-
<td>
|
|
19
|
-
{{ items_count }}
|
|
20
|
-
</td>
|
|
21
|
-
</tr>
|
|
22
|
-
<tr>
|
|
23
|
-
<td>Color</td>
|
|
24
|
-
<td>
|
|
25
|
-
<span class="label color-block" style="background-color: #{{ object.color }}"> </span>
|
|
26
|
-
</td>
|
|
27
|
-
</tr>
|
|
28
|
-
<tr>
|
|
29
|
-
<td>Content Type(s)</td>
|
|
30
|
-
<td>
|
|
31
|
-
<ul class="list-unstyled">
|
|
32
|
-
{% for ct in content_types %}
|
|
33
|
-
<li>{{ ct }}</li>
|
|
34
|
-
{% endfor %}
|
|
35
|
-
</ul>
|
|
36
|
-
</td>
|
|
37
|
-
</tr>
|
|
38
|
-
<tr>
|
|
39
|
-
<td>Description</td>
|
|
40
|
-
<td>
|
|
41
|
-
{{ object.description|placeholder }}
|
|
42
|
-
</td>
|
|
43
|
-
</tr>
|
|
44
|
-
</table>
|
|
45
|
-
</div>
|
|
46
|
-
{% endblock content_left_page %}
|
|
47
|
-
|
|
48
|
-
{% block content_right_page %}
|
|
49
|
-
{% include 'panel_table.html' with table=items_table heading='Tagged Objects' %}
|
|
50
|
-
{% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
|
|
51
|
-
<div class="row"></div>
|
|
52
|
-
{% endblock content_right_page %}
|
|
1
|
+
{% extends 'extras/tag_retrieve.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
{% extends '
|
|
2
|
-
{%
|
|
3
|
-
|
|
4
|
-
{% block form %}
|
|
5
|
-
<div class="panel panel-default">
|
|
6
|
-
<div class="panel-heading"><strong>Tag</strong></div>
|
|
7
|
-
<div class="panel-body">
|
|
8
|
-
{% render_field form.name %}
|
|
9
|
-
{% render_field form.color %}
|
|
10
|
-
{% render_field form.description %}
|
|
11
|
-
{% render_field form.content_types %}
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
15
|
-
{% endblock %}
|
|
1
|
+
{% extends 'extras/tag_update.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{% extends 'generic/object_retrieve.html' %}
|
|
2
|
+
{% load helpers %}
|
|
3
|
+
|
|
4
|
+
{% block content_left_page %}
|
|
5
|
+
<div class="panel panel-default">
|
|
6
|
+
<div class="panel-heading">
|
|
7
|
+
<strong>Tag</strong>
|
|
8
|
+
</div>
|
|
9
|
+
<table class="table table-hover panel-body attr-table">
|
|
10
|
+
<tr>
|
|
11
|
+
<td>Name</td>
|
|
12
|
+
<td>
|
|
13
|
+
{{ object.name }}
|
|
14
|
+
</td>
|
|
15
|
+
</tr>
|
|
16
|
+
<tr>
|
|
17
|
+
<td>Tagged Items</td>
|
|
18
|
+
<td>
|
|
19
|
+
{{ items_count }}
|
|
20
|
+
</td>
|
|
21
|
+
</tr>
|
|
22
|
+
<tr>
|
|
23
|
+
<td>Color</td>
|
|
24
|
+
<td>
|
|
25
|
+
<span class="label color-block" style="background-color: #{{ object.color }}"> </span>
|
|
26
|
+
</td>
|
|
27
|
+
</tr>
|
|
28
|
+
<tr>
|
|
29
|
+
<td>Content Type(s)</td>
|
|
30
|
+
<td>
|
|
31
|
+
<ul class="list-unstyled">
|
|
32
|
+
{% for ct in content_types %}
|
|
33
|
+
<li>{{ ct }}</li>
|
|
34
|
+
{% endfor %}
|
|
35
|
+
</ul>
|
|
36
|
+
</td>
|
|
37
|
+
</tr>
|
|
38
|
+
<tr>
|
|
39
|
+
<td>Description</td>
|
|
40
|
+
<td>
|
|
41
|
+
{{ object.description|placeholder }}
|
|
42
|
+
</td>
|
|
43
|
+
</tr>
|
|
44
|
+
</table>
|
|
45
|
+
</div>
|
|
46
|
+
{% endblock content_left_page %}
|
|
47
|
+
|
|
48
|
+
{% block content_right_page %}
|
|
49
|
+
{% include 'panel_table.html' with table=items_table heading='Tagged Objects' %}
|
|
50
|
+
{% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
|
|
51
|
+
<div class="row"></div>
|
|
52
|
+
{% endblock content_right_page %}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{% extends 'generic/object_create.html' %}
|
|
2
|
+
{% load form_helpers %}
|
|
3
|
+
|
|
4
|
+
{% block form %}
|
|
5
|
+
<div class="panel panel-default">
|
|
6
|
+
<div class="panel-heading"><strong>Tag</strong></div>
|
|
7
|
+
<div class="panel-body">
|
|
8
|
+
{% render_field form.name %}
|
|
9
|
+
{% render_field form.color %}
|
|
10
|
+
{% render_field form.description %}
|
|
11
|
+
{% render_field form.content_types %}
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
15
|
+
{% endblock %}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
{% extends 'generic/object_retrieve.html' %}
|
|
2
|
-
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
1
|
+
{% extends 'generic/object_retrieve.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -1529,7 +1529,7 @@ class JobTest(
|
|
|
1529
1529
|
mock_get_worker_count.return_value = 1
|
|
1530
1530
|
obj_perm = ObjectPermission(
|
|
1531
1531
|
name="Test permission",
|
|
1532
|
-
constraints={"module_name__in": ["
|
|
1532
|
+
constraints={"module_name__in": ["pass_job", "fail"]},
|
|
1533
1533
|
actions=["run"],
|
|
1534
1534
|
)
|
|
1535
1535
|
obj_perm.save()
|
|
@@ -1543,10 +1543,10 @@ class JobTest(
|
|
|
1543
1543
|
self.assertHttpStatus(response, status.HTTP_404_NOT_FOUND)
|
|
1544
1544
|
|
|
1545
1545
|
# Try post to permitted job
|
|
1546
|
-
job_model = Job.objects.get_for_class_path("
|
|
1546
|
+
job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
|
|
1547
1547
|
job_model.enabled = True
|
|
1548
1548
|
job_model.validated_save()
|
|
1549
|
-
url = self.get_run_url("
|
|
1549
|
+
url = self.get_run_url("pass_job.TestPassJob")
|
|
1550
1550
|
response = self.client.post(url, **self.header)
|
|
1551
1551
|
self.assertHttpStatus(response, self.run_success_response_status)
|
|
1552
1552
|
|
|
@@ -1702,7 +1702,7 @@ class JobTest(
|
|
|
1702
1702
|
# Assert that we have an immediate ScheduledJob and that it matches the job_model.
|
|
1703
1703
|
schedule = ScheduledJob.objects.last()
|
|
1704
1704
|
self.assertIsNotNone(schedule)
|
|
1705
|
-
self.assertEqual(schedule.interval, JobExecutionType.
|
|
1705
|
+
self.assertEqual(schedule.interval, JobExecutionType.TYPE_FUTURE)
|
|
1706
1706
|
self.assertEqual(schedule.approval_required, self.job_model.approval_required)
|
|
1707
1707
|
self.assertEqual(schedule.kwargs["var4"], str(device_role.pk))
|
|
1708
1708
|
|
|
@@ -2136,7 +2136,7 @@ class JobTest(
|
|
|
2136
2136
|
@mock.patch("nautobot.extras.api.views.get_worker_count", return_value=1)
|
|
2137
2137
|
def test_run_job_with_default_queue_with_empty_job_model_job_queues(self, _):
|
|
2138
2138
|
self.add_permissions("extras.run_job")
|
|
2139
|
-
job_model = Job.objects.get_for_class_path("
|
|
2139
|
+
job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
|
|
2140
2140
|
data = {
|
|
2141
2141
|
"task_queue": job_model.default_job_queue.name,
|
|
2142
2142
|
}
|
|
@@ -2144,7 +2144,7 @@ class JobTest(
|
|
|
2144
2144
|
job_model.job_queues.set([])
|
|
2145
2145
|
job_model.enabled = True
|
|
2146
2146
|
job_model.validated_save()
|
|
2147
|
-
url = self.get_run_url("
|
|
2147
|
+
url = self.get_run_url("pass_job.TestPassJob")
|
|
2148
2148
|
response = self.client.post(url, data, format="json", **self.header)
|
|
2149
2149
|
self.assertHttpStatus(response, self.run_success_response_status)
|
|
2150
2150
|
|
|
@@ -2571,10 +2571,10 @@ class ScheduledJobTest(
|
|
|
2571
2571
|
@classmethod
|
|
2572
2572
|
def setUpTestData(cls):
|
|
2573
2573
|
user = User.objects.create(username="user1", is_active=True)
|
|
2574
|
-
job_model = Job.objects.get_for_class_path("
|
|
2574
|
+
job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
|
|
2575
2575
|
ScheduledJob.objects.create(
|
|
2576
2576
|
name="test1",
|
|
2577
|
-
task="
|
|
2577
|
+
task="pass_job.TestPassJob",
|
|
2578
2578
|
job_model=job_model,
|
|
2579
2579
|
interval=JobExecutionType.TYPE_IMMEDIATELY,
|
|
2580
2580
|
user=user,
|
|
@@ -2583,7 +2583,7 @@ class ScheduledJobTest(
|
|
|
2583
2583
|
)
|
|
2584
2584
|
ScheduledJob.objects.create(
|
|
2585
2585
|
name="test2",
|
|
2586
|
-
task="
|
|
2586
|
+
task="pass_job.TestPassJob",
|
|
2587
2587
|
job_model=job_model,
|
|
2588
2588
|
interval=JobExecutionType.TYPE_DAILY,
|
|
2589
2589
|
user=user,
|
|
@@ -2593,7 +2593,7 @@ class ScheduledJobTest(
|
|
|
2593
2593
|
)
|
|
2594
2594
|
ScheduledJob.objects.create(
|
|
2595
2595
|
name="test3",
|
|
2596
|
-
task="
|
|
2596
|
+
task="pass_job.TestPassJob",
|
|
2597
2597
|
job_model=job_model,
|
|
2598
2598
|
interval=JobExecutionType.TYPE_CUSTOM,
|
|
2599
2599
|
crontab="34 12 * * *",
|
|
@@ -2608,12 +2608,12 @@ class JobApprovalTest(APITestCase):
|
|
|
2608
2608
|
@classmethod
|
|
2609
2609
|
def setUpTestData(cls):
|
|
2610
2610
|
cls.additional_user = User.objects.create(username="user1", is_active=True)
|
|
2611
|
-
cls.job_model = Job.objects.get_for_class_path("
|
|
2611
|
+
cls.job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
|
|
2612
2612
|
cls.job_model.enabled = True
|
|
2613
2613
|
cls.job_model.save()
|
|
2614
2614
|
cls.scheduled_job = ScheduledJob.objects.create(
|
|
2615
2615
|
name="test pass",
|
|
2616
|
-
task="
|
|
2616
|
+
task="pass_job.TestPassJob",
|
|
2617
2617
|
job_model=cls.job_model,
|
|
2618
2618
|
interval=JobExecutionType.TYPE_IMMEDIATELY,
|
|
2619
2619
|
user=cls.additional_user,
|
|
@@ -2666,7 +2666,7 @@ class JobApprovalTest(APITestCase):
|
|
|
2666
2666
|
self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
|
|
2667
2667
|
scheduled_job = ScheduledJob.objects.create(
|
|
2668
2668
|
name="test",
|
|
2669
|
-
task="
|
|
2669
|
+
task="pass_job.TestPassJob",
|
|
2670
2670
|
job_model=self.job_model,
|
|
2671
2671
|
interval=JobExecutionType.TYPE_IMMEDIATELY,
|
|
2672
2672
|
user=self.user,
|
|
@@ -2689,7 +2689,7 @@ class JobApprovalTest(APITestCase):
|
|
|
2689
2689
|
self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
|
|
2690
2690
|
scheduled_job = ScheduledJob.objects.create(
|
|
2691
2691
|
name="test",
|
|
2692
|
-
task="
|
|
2692
|
+
task="pass_job.TestPassJob",
|
|
2693
2693
|
job_model=self.job_model,
|
|
2694
2694
|
interval=JobExecutionType.TYPE_FUTURE,
|
|
2695
2695
|
one_off=True,
|
|
@@ -2706,7 +2706,7 @@ class JobApprovalTest(APITestCase):
|
|
|
2706
2706
|
self.add_permissions("extras.approve_job", "extras.view_scheduledjob", "extras.change_scheduledjob")
|
|
2707
2707
|
scheduled_job = ScheduledJob.objects.create(
|
|
2708
2708
|
name="test",
|
|
2709
|
-
task="
|
|
2709
|
+
task="pass_job.TestPassJob",
|
|
2710
2710
|
job_model=self.job_model,
|
|
2711
2711
|
interval=JobExecutionType.TYPE_FUTURE,
|
|
2712
2712
|
one_off=True,
|
|
@@ -994,11 +994,11 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
|
|
|
994
994
|
jobs = Job.objects.all()[:3]
|
|
995
995
|
cls.jobs = jobs
|
|
996
996
|
user = User.objects.create(username="user1", is_active=True)
|
|
997
|
-
job_model = Job.objects.get_for_class_path("
|
|
997
|
+
job_model = Job.objects.get_for_class_path("pass_job.TestPassJob")
|
|
998
998
|
scheduled_jobs = [
|
|
999
999
|
ScheduledJob.objects.create(
|
|
1000
1000
|
name="test1",
|
|
1001
|
-
task="
|
|
1001
|
+
task="pass_job.TestPassJob",
|
|
1002
1002
|
job_model=job_model,
|
|
1003
1003
|
interval=JobExecutionType.TYPE_IMMEDIATELY,
|
|
1004
1004
|
user=user,
|
|
@@ -1007,7 +1007,7 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
|
|
|
1007
1007
|
),
|
|
1008
1008
|
ScheduledJob.objects.create(
|
|
1009
1009
|
name="test2",
|
|
1010
|
-
task="
|
|
1010
|
+
task="pass_job.TestPassJob",
|
|
1011
1011
|
job_model=job_model,
|
|
1012
1012
|
interval=JobExecutionType.TYPE_DAILY,
|
|
1013
1013
|
user=user,
|
|
@@ -1017,7 +1017,7 @@ class JobResultFilterSetTestCase(FilterTestCases.FilterTestCase):
|
|
|
1017
1017
|
),
|
|
1018
1018
|
ScheduledJob.objects.create(
|
|
1019
1019
|
name="test3",
|
|
1020
|
-
task="
|
|
1020
|
+
task="pass_job.TestPassJob",
|
|
1021
1021
|
job_model=job_model,
|
|
1022
1022
|
interval=JobExecutionType.TYPE_CUSTOM,
|
|
1023
1023
|
crontab="34 12 * * *",
|
|
@@ -167,7 +167,7 @@ class JobTest(TestCase):
|
|
|
167
167
|
self.assertTrue(job_class.supports_dryrun)
|
|
168
168
|
self.assertTrue(job_model.supports_dryrun)
|
|
169
169
|
|
|
170
|
-
module = "
|
|
170
|
+
module = "pass_job"
|
|
171
171
|
name = "TestPassJob"
|
|
172
172
|
job_class, job_model = get_job_class_and_model(module, name)
|
|
173
173
|
self.assertFalse(job_class.supports_dryrun)
|
|
@@ -212,7 +212,7 @@ register_jobs(MyJob)
|
|
|
212
212
|
self.assertIsNotNone(get_job("my_jobs.MyJob"))
|
|
213
213
|
# Also make sure some representative previous JOBS_ROOT jobs aren't still around:
|
|
214
214
|
self.assertNotIn("dry_run.TestDryRun", jobs_data.keys())
|
|
215
|
-
self.assertNotIn("
|
|
215
|
+
self.assertNotIn("pass_job.TestPassJob", jobs_data.keys())
|
|
216
216
|
|
|
217
217
|
# Create a second Job in the same module
|
|
218
218
|
with open(os.path.join(temp_dir, "my_jobs.py"), "a") as fd:
|
|
@@ -286,6 +286,19 @@ register_jobs(BadJob)
|
|
|
286
286
|
# Clean up back to normal behavior
|
|
287
287
|
get_jobs(reload=True)
|
|
288
288
|
|
|
289
|
+
def test_app_dynamic_jobs(self):
|
|
290
|
+
"""
|
|
291
|
+
Test that get_job() correctly reloads dynamic jobs when `NautobotAppConfig.provides_dynamic_jobs` is True.
|
|
292
|
+
"""
|
|
293
|
+
with mock.patch("nautobot.extras.jobs.get_jobs", autospec=True) as mock_get_jobs:
|
|
294
|
+
# example_app_with_view_override provides dynamic jobs
|
|
295
|
+
get_job("example_app_with_view_override.jobs.ExampleHiddenJob", reload=True)
|
|
296
|
+
mock_get_jobs.assert_called_once_with(reload=True)
|
|
297
|
+
mock_get_jobs.reset_mock()
|
|
298
|
+
# example_app does NOT provide dynamic jobs
|
|
299
|
+
get_job("example_app.jobs.ExampleEverythingJob", reload=True)
|
|
300
|
+
mock_get_jobs.assert_called_once_with(reload=False)
|
|
301
|
+
|
|
289
302
|
|
|
290
303
|
class JobTransactionTest(TransactionTestCase):
|
|
291
304
|
"""
|
|
@@ -423,7 +436,7 @@ class JobTransactionTest(TransactionTestCase):
|
|
|
423
436
|
"""
|
|
424
437
|
Job test with pass result.
|
|
425
438
|
"""
|
|
426
|
-
module = "
|
|
439
|
+
module = "pass_job"
|
|
427
440
|
name = "TestPassJob"
|
|
428
441
|
job_result = create_job_result_and_run_job(module, name)
|
|
429
442
|
self.assertJobResultStatus(job_result)
|
|
@@ -693,7 +706,7 @@ class JobTransactionTest(TransactionTestCase):
|
|
|
693
706
|
"""
|
|
694
707
|
Job test to see if the latest_result property is indeed returning the most recent job result
|
|
695
708
|
"""
|
|
696
|
-
module = "
|
|
709
|
+
module = "pass_job"
|
|
697
710
|
name = "TestPassJob"
|
|
698
711
|
job_result_1 = create_job_result_and_run_job(module, name)
|
|
699
712
|
self.assertJobResultStatus(job_result_1)
|
|
@@ -946,7 +959,7 @@ class RunJobManagementCommandTest(TransactionTestCase):
|
|
|
946
959
|
|
|
947
960
|
def test_runjob_nochange_successful(self):
|
|
948
961
|
"""Basic success-path test for Jobs that don't modify the Nautobot database."""
|
|
949
|
-
module = "
|
|
962
|
+
module = "pass_job"
|
|
950
963
|
name = "TestPassJob"
|
|
951
964
|
_job_class, job_model = get_job_class_and_model(module, name)
|
|
952
965
|
|
|
@@ -1044,7 +1057,7 @@ class JobButtonReceiverTest(TestCase):
|
|
|
1044
1057
|
|
|
1045
1058
|
def test_is_job_button(self):
|
|
1046
1059
|
with self.subTest(expected=False):
|
|
1047
|
-
module = "
|
|
1060
|
+
module = "pass_job"
|
|
1048
1061
|
name = "TestPassJob"
|
|
1049
1062
|
_job_class, job_model = get_job_class_and_model(module, name)
|
|
1050
1063
|
self.assertFalse(job_model.is_job_button_receiver)
|
|
@@ -1107,7 +1120,7 @@ class JobHookReceiverTest(TestCase):
|
|
|
1107
1120
|
|
|
1108
1121
|
def test_is_job_hook(self):
|
|
1109
1122
|
with self.subTest(expected=False):
|
|
1110
|
-
module = "
|
|
1123
|
+
module = "pass_job"
|
|
1111
1124
|
name = "TestPassJob"
|
|
1112
1125
|
_job_class, job_model = get_job_class_and_model(module, name)
|
|
1113
1126
|
self.assertFalse(job_model.is_job_hook_receiver)
|
|
@@ -1269,7 +1282,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
|
|
|
1269
1282
|
for i in range(1, 7):
|
|
1270
1283
|
models.ScheduledJob.objects.create(
|
|
1271
1284
|
name=f"test{i}",
|
|
1272
|
-
task="
|
|
1285
|
+
task="pass_job.TestPassJob",
|
|
1273
1286
|
interval=JobExecutionType.TYPE_FUTURE,
|
|
1274
1287
|
user=self.user,
|
|
1275
1288
|
start_time=timezone.now() - datetime.timedelta(days=i * 30),
|
|
@@ -1278,7 +1291,7 @@ class RemoveScheduledJobManagementCommandTestCase(TestCase):
|
|
|
1278
1291
|
|
|
1279
1292
|
models.ScheduledJob.objects.create(
|
|
1280
1293
|
name="test7",
|
|
1281
|
-
task="
|
|
1294
|
+
task="pass_job.TestPassJob",
|
|
1282
1295
|
interval=JobExecutionType.TYPE_DAILY,
|
|
1283
1296
|
user=self.user,
|
|
1284
1297
|
start_time=timezone.now() - datetime.timedelta(days=180),
|
|
@@ -1306,7 +1319,7 @@ class ScheduledJobIntervalTestCase(TestCase):
|
|
|
1306
1319
|
start_time = timezone.now() + datetime.timedelta(days=6)
|
|
1307
1320
|
scheduled_job = models.ScheduledJob.objects.create(
|
|
1308
1321
|
name="weekly_interval",
|
|
1309
|
-
task="
|
|
1322
|
+
task="pass_job.TestPassJob",
|
|
1310
1323
|
interval=JobExecutionType.TYPE_WEEKLY,
|
|
1311
1324
|
user=self.user,
|
|
1312
1325
|
start_time=start_time,
|