nautobot 2.4.0b1__py3-none-any.whl → 2.4.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/__init__.py +1 -1
- nautobot/apps/api.py +8 -8
- nautobot/apps/change_logging.py +2 -2
- nautobot/apps/choices.py +4 -4
- nautobot/apps/events.py +3 -3
- nautobot/apps/factory.py +2 -2
- nautobot/apps/filters.py +1 -1
- nautobot/apps/forms.py +20 -20
- nautobot/apps/graphql.py +2 -2
- nautobot/apps/jobs.py +8 -8
- nautobot/apps/models.py +19 -19
- nautobot/apps/tables.py +1 -1
- nautobot/apps/testing.py +10 -10
- nautobot/apps/ui.py +2 -2
- nautobot/apps/utils.py +7 -7
- nautobot/apps/views.py +7 -7
- nautobot/circuits/api/serializers.py +1 -0
- nautobot/circuits/api/views.py +4 -8
- nautobot/circuits/tables.py +2 -1
- nautobot/circuits/templates/circuits/circuit_create.html +1 -7
- nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +43 -0
- nautobot/circuits/tests/integration/test_relationships.py +1 -1
- nautobot/circuits/views.py +3 -3
- nautobot/cloud/api/views.py +6 -10
- nautobot/cloud/models.py +1 -1
- nautobot/cloud/views.py +0 -16
- nautobot/core/api/constants.py +11 -0
- nautobot/core/api/fields.py +5 -5
- nautobot/core/api/filter_backends.py +3 -9
- nautobot/core/api/schema.py +13 -2
- nautobot/core/api/serializers.py +40 -34
- nautobot/core/api/views.py +56 -4
- nautobot/core/apps/__init__.py +0 -5
- nautobot/core/celery/log.py +4 -4
- nautobot/core/celery/schedulers.py +2 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/events/__init__.py +3 -3
- nautobot/core/filters.py +67 -35
- nautobot/core/forms/__init__.py +19 -19
- nautobot/core/forms/fields.py +14 -11
- nautobot/core/forms/forms.py +33 -2
- nautobot/core/graphql/types.py +1 -1
- nautobot/core/jobs/__init__.py +28 -7
- nautobot/core/jobs/bulk_actions.py +285 -0
- nautobot/core/jobs/cleanup.py +48 -12
- nautobot/core/jobs/groups.py +1 -1
- nautobot/core/management/commands/validate_models.py +1 -1
- nautobot/core/models/__init__.py +3 -1
- nautobot/core/models/query_functions.py +2 -2
- nautobot/core/models/tree_queries.py +6 -3
- nautobot/core/settings.py +29 -2
- nautobot/core/settings.yaml +21 -0
- nautobot/core/tables.py +79 -61
- nautobot/core/templates/about.html +67 -0
- nautobot/core/templates/generic/object_bulk_destroy.html +1 -1
- nautobot/core/templates/inc/media.html +3 -0
- nautobot/core/templates/inc/nav_menu.html +1 -0
- nautobot/core/templates/inc/tenancy_form_panel.html +9 -0
- nautobot/core/templates/inc/tenant_table_row.html +11 -0
- nautobot/core/templates/nautobot_config.py.j2 +13 -0
- nautobot/core/templates/search.html +7 -0
- nautobot/core/templates/utilities/render_jinja2.html +1 -1
- nautobot/core/templates/utilities/templatetags/tag.html +1 -1
- nautobot/core/templates/utilities/theme_preview.html +7 -0
- nautobot/core/templatetags/helpers.py +11 -2
- nautobot/core/testing/__init__.py +8 -8
- nautobot/core/testing/api.py +170 -15
- nautobot/core/testing/filters.py +45 -10
- nautobot/core/testing/forms.py +2 -0
- nautobot/core/testing/integration.py +514 -5
- nautobot/core/testing/mixins.py +7 -2
- nautobot/core/testing/views.py +44 -29
- nautobot/core/tests/integration/test_app_home.py +0 -1
- nautobot/core/tests/integration/test_app_navbar.py +0 -1
- nautobot/core/tests/integration/test_filters.py +0 -2
- nautobot/core/tests/integration/test_home.py +0 -1
- nautobot/core/tests/integration/test_navbar.py +0 -1
- nautobot/core/tests/integration/test_view_authentication.py +1 -0
- nautobot/core/tests/runner.py +1 -1
- nautobot/core/tests/test_api.py +98 -1
- nautobot/core/tests/test_csv.py +25 -3
- nautobot/core/tests/test_filters.py +209 -246
- nautobot/core/tests/test_forms.py +1 -0
- nautobot/core/tests/test_jobs.py +492 -1
- nautobot/core/tests/test_models.py +9 -0
- nautobot/core/tests/test_settings_schema.py +7 -0
- nautobot/core/tests/test_tables.py +100 -0
- nautobot/core/tests/test_utils.py +63 -1
- nautobot/core/tests/test_views.py +30 -3
- nautobot/core/ui/nav.py +1 -0
- nautobot/core/ui/object_detail.py +15 -1
- nautobot/core/urls.py +11 -0
- nautobot/core/utils/git.py +7 -2
- nautobot/core/utils/lookup.py +11 -8
- nautobot/core/utils/querysets.py +64 -0
- nautobot/core/utils/requests.py +24 -9
- nautobot/core/views/__init__.py +42 -0
- nautobot/core/views/generic.py +131 -197
- nautobot/core/views/mixins.py +136 -41
- nautobot/core/views/renderers.py +6 -6
- nautobot/core/views/utils.py +2 -2
- nautobot/dcim/api/serializers.py +56 -64
- nautobot/dcim/api/views.py +47 -113
- nautobot/dcim/constants.py +6 -13
- nautobot/dcim/factory.py +6 -1
- nautobot/dcim/filters/__init__.py +31 -2
- nautobot/dcim/forms.py +48 -17
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
- nautobot/dcim/models/__init__.py +1 -1
- nautobot/dcim/models/device_component_templates.py +2 -2
- nautobot/dcim/models/device_components.py +22 -20
- nautobot/dcim/models/devices.py +10 -1
- nautobot/dcim/models/locations.py +3 -3
- nautobot/dcim/models/power.py +6 -5
- nautobot/dcim/models/racks.py +4 -4
- nautobot/dcim/tables/__init__.py +3 -3
- nautobot/dcim/tables/devices.py +9 -6
- nautobot/dcim/tables/devicetypes.py +2 -2
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/cable.html +1 -1
- nautobot/dcim/templates/dcim/controller_create.html +1 -7
- nautobot/dcim/templates/dcim/controller_retrieve.html +1 -9
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +2 -0
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +5 -0
- nautobot/dcim/templates/dcim/device/base.html +1 -1
- nautobot/dcim/templates/dcim/device.html +3 -11
- nautobot/dcim/templates/dcim/device_component.html +1 -1
- nautobot/dcim/templates/dcim/device_edit.html +36 -37
- nautobot/dcim/templates/dcim/devicetype.html +1 -1
- nautobot/dcim/templates/dcim/location.html +2 -10
- nautobot/dcim/templates/dcim/location_edit.html +1 -7
- nautobot/dcim/templates/dcim/locationtype.html +1 -1
- nautobot/dcim/templates/dcim/locationtype_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/manufacturer.html +1 -1
- nautobot/dcim/templates/dcim/platform.html +1 -1
- nautobot/dcim/templates/dcim/powerfeed.html +1 -1
- nautobot/dcim/templates/dcim/powerpanel.html +1 -1
- nautobot/dcim/templates/dcim/rack.html +2 -10
- nautobot/dcim/templates/dcim/rack_edit.html +1 -7
- nautobot/dcim/templates/dcim/rackgroup.html +1 -1
- nautobot/dcim/templates/dcim/rackreservation.html +3 -11
- nautobot/dcim/templates/dcim/virtualchassis.html +1 -1
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +1 -9
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +1 -7
- nautobot/dcim/tests/integration/test_controller.py +62 -0
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
- nautobot/dcim/tests/integration/test_device_bulk_operations.py +30 -0
- nautobot/dcim/tests/integration/test_location_bulk_operations.py +43 -0
- nautobot/dcim/tests/test_api.py +16 -5
- nautobot/dcim/tests/test_filters.py +33 -0
- nautobot/dcim/tests/test_forms.py +51 -2
- nautobot/dcim/tests/test_graphql.py +52 -0
- nautobot/dcim/tests/test_jobs.py +118 -0
- nautobot/dcim/tests/test_models.py +52 -9
- nautobot/dcim/tests/test_views.py +30 -84
- nautobot/dcim/views.py +13 -28
- nautobot/extras/api/customfields.py +2 -2
- nautobot/extras/api/serializers.py +123 -85
- nautobot/extras/api/views.py +33 -30
- nautobot/extras/constants.py +3 -0
- nautobot/extras/datasources/git.py +125 -0
- nautobot/extras/filters/__init__.py +8 -6
- nautobot/extras/forms/base.py +2 -2
- nautobot/extras/forms/forms.py +139 -31
- nautobot/extras/forms/mixins.py +14 -6
- nautobot/extras/group_sync.py +3 -3
- nautobot/extras/health_checks.py +1 -2
- nautobot/extras/jobs.py +85 -18
- nautobot/extras/managers.py +3 -1
- nautobot/extras/migrations/0018_joblog_data_migration.py +7 -9
- nautobot/extras/migrations/0120_job_is_singleton_job_is_singleton_override.py +22 -0
- nautobot/extras/migrations/0121_alter_team_contacts.py +17 -0
- nautobot/extras/migrations/0122_add_graphqlquery_owner_content_type.py +34 -0
- nautobot/extras/models/__init__.py +1 -1
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/customfields.py +41 -23
- nautobot/extras/models/datasources.py +85 -0
- nautobot/extras/models/groups.py +11 -9
- nautobot/extras/models/jobs.py +23 -4
- nautobot/extras/models/models.py +17 -2
- nautobot/extras/models/relationships.py +17 -5
- nautobot/extras/plugins/__init__.py +13 -2
- nautobot/extras/plugins/marketplace_manifest.yml +84 -79
- nautobot/extras/plugins/tables.py +16 -14
- nautobot/extras/plugins/views.py +65 -69
- nautobot/extras/registry.py +1 -1
- nautobot/extras/secrets/__init__.py +2 -2
- nautobot/extras/signals.py +15 -1
- nautobot/extras/tables.py +7 -5
- nautobot/extras/templates/extras/computedfield.html +1 -1
- nautobot/extras/templates/extras/configcontext.html +1 -1
- nautobot/extras/templates/extras/configcontextschema.html +1 -1
- nautobot/extras/templates/extras/customfield.html +1 -1
- nautobot/extras/templates/extras/customlink.html +1 -1
- nautobot/extras/templates/extras/dynamicgroup.html +2 -10
- nautobot/extras/templates/extras/exporttemplate.html +1 -1
- nautobot/extras/templates/extras/gitrepository.html +1 -1
- nautobot/extras/templates/extras/graphqlquery.html +1 -1
- nautobot/extras/templates/extras/job_detail.html +17 -1
- nautobot/extras/templates/extras/job_edit.html +1 -0
- nautobot/extras/templates/extras/jobbutton_retrieve.html +1 -1
- nautobot/extras/templates/extras/jobhook.html +1 -1
- nautobot/extras/templates/extras/jobqueue_retrieve.html +1 -9
- nautobot/extras/templates/extras/jobresult.html +1 -1
- nautobot/extras/templates/extras/marketplace.html +29 -11
- nautobot/extras/templates/extras/objectchange.html +1 -1
- nautobot/extras/templates/extras/plugin_detail.html +33 -16
- nautobot/extras/templates/extras/plugins_tiles.html +21 -10
- nautobot/extras/templates/extras/relationship.html +1 -63
- nautobot/extras/templates/extras/role_retrieve.html +1 -1
- nautobot/extras/templates/extras/scheduledjob.html +1 -1
- nautobot/extras/templates/extras/secret.html +1 -1
- nautobot/extras/templates/extras/secretsgroup.html +1 -1
- nautobot/extras/templates/extras/status.html +1 -1
- nautobot/extras/templates/extras/tag.html +1 -1
- nautobot/extras/templates/extras/webhook.html +1 -1
- nautobot/extras/templatetags/job_buttons.py +4 -4
- nautobot/extras/test_jobs/api_test_job.py +1 -1
- nautobot/extras/test_jobs/atomic_transaction.py +2 -2
- nautobot/extras/test_jobs/dry_run.py +1 -1
- nautobot/extras/test_jobs/fail.py +5 -5
- nautobot/extras/test_jobs/file_output.py +1 -1
- nautobot/extras/test_jobs/file_upload_fail.py +1 -1
- nautobot/extras/test_jobs/file_upload_pass.py +1 -1
- nautobot/extras/test_jobs/ipaddress_vars.py +3 -1
- nautobot/extras/test_jobs/jobs_module/jobs_submodule/jobs.py +1 -1
- nautobot/extras/test_jobs/location_with_custom_field.py +1 -1
- nautobot/extras/test_jobs/log_redaction.py +1 -1
- nautobot/extras/test_jobs/log_skip_db_logging.py +1 -1
- nautobot/extras/test_jobs/modify_db.py +1 -1
- nautobot/extras/test_jobs/object_var_optional.py +1 -1
- nautobot/extras/test_jobs/object_var_required.py +1 -1
- nautobot/extras/test_jobs/object_vars.py +1 -1
- nautobot/extras/test_jobs/pass.py +3 -3
- nautobot/extras/test_jobs/profiling.py +1 -1
- nautobot/extras/test_jobs/relative_import.py +3 -3
- nautobot/extras/test_jobs/singleton.py +16 -0
- nautobot/extras/test_jobs/soft_time_limit_greater_than_time_limit.py +1 -1
- nautobot/extras/test_jobs/task_queues.py +1 -1
- nautobot/extras/tests/git_data/01-valid-files/graphql_queries/device_interfaces.gql +8 -0
- nautobot/extras/tests/git_data/01-valid-files/graphql_queries/device_names.gql +5 -0
- nautobot/extras/tests/git_data/02-invalid-files/graphql_queries/bad_device_names.gql +5 -0
- nautobot/extras/tests/git_helper.py +9 -1
- nautobot/extras/tests/integration/__init__.py +29 -16
- nautobot/extras/tests/integration/test_plugin_banner.py +0 -2
- nautobot/extras/tests/test_api.py +19 -13
- nautobot/extras/tests/test_customfields.py +50 -52
- nautobot/extras/tests/test_datasources.py +29 -1
- nautobot/extras/tests/test_dynamicgroups.py +1 -1
- nautobot/extras/tests/test_filters.py +6 -6
- nautobot/extras/tests/test_forms.py +33 -1
- nautobot/extras/tests/test_jobs.py +178 -32
- nautobot/extras/tests/test_models.py +299 -10
- nautobot/extras/tests/test_plugins.py +62 -9
- nautobot/extras/tests/test_relationships.py +120 -9
- nautobot/extras/tests/test_utils.py +22 -1
- nautobot/extras/tests/test_views.py +56 -194
- nautobot/extras/utils.py +20 -10
- nautobot/extras/views.py +85 -110
- nautobot/ipam/api/fields.py +3 -3
- nautobot/ipam/api/serializers.py +41 -33
- nautobot/ipam/api/views.py +68 -117
- nautobot/ipam/factory.py +1 -1
- nautobot/ipam/filters.py +3 -2
- nautobot/ipam/lookups.py +101 -62
- nautobot/ipam/models.py +74 -18
- nautobot/ipam/querysets.py +2 -2
- nautobot/ipam/tables.py +25 -9
- nautobot/ipam/templates/ipam/ipaddress.html +2 -10
- nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +1 -7
- nautobot/ipam/templates/ipam/ipaddress_edit.html +1 -7
- nautobot/ipam/templates/ipam/prefix.html +2 -10
- nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
- nautobot/ipam/templates/ipam/rir.html +1 -1
- nautobot/ipam/templates/ipam/routetarget.html +1 -1
- nautobot/ipam/templates/ipam/service.html +1 -1
- nautobot/ipam/templates/ipam/vlan.html +2 -10
- nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
- nautobot/ipam/templates/ipam/vlangroup.html +1 -1
- nautobot/ipam/templates/ipam/vrf.html +1 -1
- nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
- nautobot/ipam/tests/test_api.py +436 -3
- nautobot/ipam/tests/test_forms.py +49 -47
- nautobot/ipam/tests/test_migrations.py +30 -30
- nautobot/ipam/tests/test_models.py +119 -34
- nautobot/ipam/tests/test_querysets.py +63 -1
- nautobot/ipam/tests/test_utils.py +41 -2
- nautobot/ipam/tests/test_views.py +3 -0
- nautobot/ipam/utils/__init__.py +54 -17
- nautobot/ipam/views.py +61 -87
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +40 -2
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +1 -1
- nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -1
- nautobot/project-static/docs/404.html +131 -14
- nautobot/project-static/docs/apps/index.html +131 -14
- nautobot/project-static/docs/apps/nautobot-apps.html +132 -16
- nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js → bundle.60a45f97.min.js} +2 -2
- nautobot/project-static/docs/assets/javascripts/{bundle.83f73b43.min.js.map → bundle.60a45f97.min.js.map} +2 -2
- nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js → search.f8cc74c7.min.js} +1 -1
- nautobot/project-static/docs/assets/javascripts/workers/{search.6ce7567c.min.js.map → search.f8cc74c7.min.js.map} +1 -1
- nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css → main.a40c8224.min.css} +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +147 -20
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +144 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +459 -132
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +175 -28
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +180 -31
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +138 -16
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +137 -15
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +164 -27
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +187 -38
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +193 -31
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +216 -48
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +324 -75
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +666 -175
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +194 -46
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +538 -177
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +578 -221
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +145 -18
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +156 -25
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +492 -65
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +705 -215
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +943 -422
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +144 -17
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +619 -200
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +474 -159
- nautobot/project-static/docs/development/apps/api/configuration-view.html +131 -14
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/global-search.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/graphql.html +131 -14
- nautobot/project-static/docs/development/apps/api/models/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +131 -14
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +153 -17
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +131 -14
- nautobot/project-static/docs/development/apps/api/prometheus.html +131 -14
- nautobot/project-static/docs/development/apps/api/setup.html +131 -14
- nautobot/project-static/docs/development/apps/api/testing.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +131 -14
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/base-template.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/index.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/notes.html +131 -14
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +137 -16
- nautobot/project-static/docs/development/apps/api/views/urls.html +131 -14
- nautobot/project-static/docs/development/apps/index.html +131 -14
- nautobot/project-static/docs/development/apps/migration/code-updates.html +131 -14
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +131 -14
- nautobot/project-static/docs/development/apps/migration/from-v1.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +131 -14
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +131 -14
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +135 -18
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +131 -14
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +297 -25
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +131 -14
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +131 -14
- nautobot/project-static/docs/development/core/application-registry.html +131 -14
- nautobot/project-static/docs/development/core/best-practices.html +131 -14
- nautobot/project-static/docs/development/core/bootstrap-ui.html +131 -14
- nautobot/project-static/docs/development/core/caching.html +131 -14
- nautobot/project-static/docs/development/core/controllers.html +131 -14
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +158 -84
- nautobot/project-static/docs/development/core/generic-views.html +131 -14
- nautobot/project-static/docs/development/core/getting-started.html +334 -234
- nautobot/project-static/docs/development/core/homepage.html +134 -17
- nautobot/project-static/docs/development/core/index.html +131 -14
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9829 -0
- nautobot/project-static/docs/development/core/model-checklist.html +141 -22
- nautobot/project-static/docs/development/core/model-features.html +131 -14
- nautobot/project-static/docs/development/core/natural-keys.html +131 -14
- nautobot/project-static/docs/development/core/navigation-menu.html +131 -14
- nautobot/project-static/docs/development/core/release-checklist.html +134 -17
- nautobot/project-static/docs/development/core/role-internals.html +131 -14
- nautobot/project-static/docs/development/core/settings.html +131 -14
- nautobot/project-static/docs/development/core/style-guide.html +134 -17
- nautobot/project-static/docs/development/core/templates.html +132 -15
- nautobot/project-static/docs/development/core/testing.html +131 -14
- nautobot/project-static/docs/development/core/ui-component-framework.html +454 -283
- nautobot/project-static/docs/development/core/user-preferences.html +131 -14
- nautobot/project-static/docs/development/index.html +131 -14
- nautobot/project-static/docs/development/jobs/index.html +301 -132
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +131 -14
- nautobot/project-static/docs/index.html +139 -33
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_edit_button.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_list_view.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_add.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_queue_config.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_completed.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_nav.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_result_pending.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_job_run_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_nautobot_login.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_job.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_run_scheduled_job_form.png +0 -0
- nautobot/project-static/docs/media/development/core/kubernetes/k8s_scheduled_job_result.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/buttons-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/cluster-type-before-after-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-example_2.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/stats-panel-example-code.png +0 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +132 -17
- nautobot/project-static/docs/overview/design_philosophy.html +131 -14
- nautobot/project-static/docs/release-notes/index.html +137 -22
- nautobot/project-static/docs/release-notes/version-1.0.html +319 -203
- nautobot/project-static/docs/release-notes/version-1.1.html +316 -200
- nautobot/project-static/docs/release-notes/version-1.2.html +391 -275
- nautobot/project-static/docs/release-notes/version-1.3.html +417 -301
- nautobot/project-static/docs/release-notes/version-1.4.html +502 -387
- nautobot/project-static/docs/release-notes/version-1.5.html +690 -576
- nautobot/project-static/docs/release-notes/version-1.6.html +989 -457
- nautobot/project-static/docs/release-notes/version-2.0.html +613 -499
- nautobot/project-static/docs/release-notes/version-2.1.html +448 -334
- nautobot/project-static/docs/release-notes/version-2.2.html +441 -327
- nautobot/project-static/docs/release-notes/version-2.3.html +1171 -451
- nautobot/project-static/docs/release-notes/version-2.4.html +800 -111
- nautobot/project-static/docs/requirements.txt +2 -2
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +303 -287
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +133 -16
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +131 -14
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +195 -18
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +134 -17
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +131 -14
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +133 -16
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +151 -18
- nautobot/project-static/docs/user-guide/administration/installation/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +132 -15
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +131 -14
- nautobot/project-static/docs/user-guide/administration/installation/services.html +131 -14
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +131 -14
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +131 -14
- nautobot/project-static/docs/user-guide/administration/security/index.html +9420 -0
- nautobot/project-static/docs/user-guide/administration/security/notices.html +9843 -0
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +131 -14
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +134 -18
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +131 -14
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +135 -22
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +134 -17
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +131 -14
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +134 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +236 -34
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/central-mode.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/device-group-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/radio-profile-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/supported-data-rate-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-1.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-controller-create-2.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-add.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/wireless/wireless-network-create.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +131 -14
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +134 -17
- nautobot/project-static/docs/{development/core/local-k8s.html → user-guide/feature-guides/wireless-networks-and-controllers.html} +632 -566
- nautobot/project-static/docs/user-guide/index.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +135 -18
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +451 -16
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +135 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +134 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9797 -0
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +132 -15
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +179 -35
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +159 -15
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +131 -14
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +131 -14
- nautobot/project-static/js/forms.js +1 -1
- nautobot/tenancy/api/views.py +9 -13
- nautobot/tenancy/templates/tenancy/tenant.html +1 -2
- nautobot/tenancy/templates/tenancy/tenantgroup.html +1 -1
- nautobot/tenancy/views.py +4 -2
- nautobot/users/admin.py +1 -1
- nautobot/users/api/serializers.py +5 -4
- nautobot/users/api/views.py +3 -3
- nautobot/virtualization/api/serializers.py +4 -4
- nautobot/virtualization/api/views.py +5 -24
- nautobot/virtualization/filters.py +20 -3
- nautobot/virtualization/models.py +1 -1
- nautobot/virtualization/tables.py +2 -2
- nautobot/virtualization/templates/virtualization/cluster.html +1 -1
- nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
- nautobot/virtualization/templates/virtualization/clustergroup.html +1 -1
- nautobot/virtualization/templates/virtualization/clustertype.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine.html +2 -10
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
- nautobot/virtualization/templates/virtualization/vminterface.html +1 -1
- nautobot/virtualization/tests/test_filters.py +17 -0
- nautobot/wireless/filters.py +2 -2
- nautobot/wireless/forms.py +1 -1
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +1 -9
- nautobot/wireless/tests/integration/__init__.py +0 -0
- nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
- nautobot/wireless/tests/test_filters.py +29 -1
- nautobot/wireless/tests/test_views.py +22 -1
- nautobot/wireless/views.py +0 -10
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/METADATA +9 -9
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/RECORD +667 -610
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/WHEEL +1 -1
- nautobot/core/fixtures/user-data.json +0 -59
- /nautobot/project-static/docs/assets/stylesheets/{main.6f8fc17f.min.css.map → main.a40c8224.min.css.map} +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/NOTICE +0 -0
- {nautobot-2.4.0b1.dist-info → nautobot-2.4.2.dist-info}/entry_points.txt +0 -0
nautobot/core/tables.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import logging
|
|
3
3
|
|
|
4
|
+
from django.conf import settings
|
|
4
5
|
from django.contrib.auth.models import AnonymousUser
|
|
5
6
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
6
7
|
from django.core.exceptions import FieldDoesNotExist, FieldError
|
|
7
|
-
from django.db import NotSupportedError
|
|
8
8
|
from django.db.models import Prefetch
|
|
9
9
|
from django.db.models.fields.related import ForeignKey, RelatedField
|
|
10
10
|
from django.db.models.fields.reverse_related import ManyToOneRel
|
|
@@ -14,13 +14,15 @@ from django.utils.http import urlencode
|
|
|
14
14
|
from django.utils.safestring import mark_safe
|
|
15
15
|
from django.utils.text import Truncator
|
|
16
16
|
import django_tables2
|
|
17
|
-
from django_tables2.data import TableQuerysetData
|
|
17
|
+
from django_tables2.data import TableData, TableQuerysetData
|
|
18
|
+
from django_tables2.rows import BoundRows
|
|
18
19
|
from django_tables2.utils import Accessor, OrderBy, OrderByTuple
|
|
19
20
|
from tree_queries.models import TreeNode
|
|
20
21
|
|
|
21
22
|
from nautobot.core.models.querysets import count_related
|
|
22
23
|
from nautobot.core.templatetags import helpers
|
|
23
24
|
from nautobot.core.utils.lookup import get_model_for_view_name, get_related_field_for_models, get_route_for_model
|
|
25
|
+
from nautobot.core.utils.querysets import maybe_prefetch_related, maybe_select_related
|
|
24
26
|
from nautobot.extras import choices, models
|
|
25
27
|
|
|
26
28
|
logger = logging.getLogger(__name__)
|
|
@@ -46,8 +48,27 @@ class BaseTable(django_tables2.Table):
|
|
|
46
48
|
user=None,
|
|
47
49
|
hide_hierarchy_ui=False,
|
|
48
50
|
order_by=None,
|
|
51
|
+
data_transform_callback=None,
|
|
49
52
|
**kwargs,
|
|
50
53
|
):
|
|
54
|
+
"""
|
|
55
|
+
Instantiate a BaseTable.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
*args (list, optional): Passed through to django_tables2.Table
|
|
59
|
+
table_changes_pending (bool): TODO
|
|
60
|
+
saved_view (SavedView, optional): TODO
|
|
61
|
+
user (User, optional): TODO
|
|
62
|
+
hide_hierarchy_ui (bool): Whether to display or hide hierarchy indentation of nested objects.
|
|
63
|
+
order_by (list, optional): Field(s) to sort by
|
|
64
|
+
data_transform_callback (function, optional): A function that takes the given `data` as an input and
|
|
65
|
+
returns new data. Runs after all of the queryset auto-optimization performed by this class.
|
|
66
|
+
Used for example in IPAM views to inject "fake" records for "available" Prefixes, IPAddresses, or VLANs.
|
|
67
|
+
**kwargs (dict, optional): Passed through to django_tables2.Table
|
|
68
|
+
Warning:
|
|
69
|
+
Do not modify/set the `base_columns` attribute after BaseTable class is instantiated.
|
|
70
|
+
Do not modify/set the `base_columns` attribute after calling super().__init__() of BaseTable class.
|
|
71
|
+
"""
|
|
51
72
|
# Add custom field columns
|
|
52
73
|
model = self._meta.model
|
|
53
74
|
|
|
@@ -89,6 +110,14 @@ class BaseTable(django_tables2.Table):
|
|
|
89
110
|
# Init table
|
|
90
111
|
super().__init__(*args, order_by=order_by, **kwargs)
|
|
91
112
|
|
|
113
|
+
if not isinstance(self.data, TableQuerysetData):
|
|
114
|
+
# LinkedCountColumns don't work properly if the data is a list of dicts instead of a queryset,
|
|
115
|
+
# as they rely on a `queryset.annotate()` call to gather the data.
|
|
116
|
+
self.exclude = [
|
|
117
|
+
*self.exclude,
|
|
118
|
+
*[column.name for column in self.columns if isinstance(column.column, LinkedCountColumn)],
|
|
119
|
+
]
|
|
120
|
+
|
|
92
121
|
# Don't show hierarchy if we're sorted
|
|
93
122
|
if order_by is not None and hide_hierarchy_ui is None:
|
|
94
123
|
hide_hierarchy_ui = True
|
|
@@ -122,7 +151,7 @@ class BaseTable(django_tables2.Table):
|
|
|
122
151
|
columns = user.get_config(f"tables.{self.__class__.__name__}.columns")
|
|
123
152
|
if columns:
|
|
124
153
|
for name, column in self.base_columns.items():
|
|
125
|
-
if name in columns:
|
|
154
|
+
if name in columns and name not in self.exclude:
|
|
126
155
|
self.columns.show(name)
|
|
127
156
|
else:
|
|
128
157
|
self.columns.hide(name)
|
|
@@ -161,7 +190,8 @@ class BaseTable(django_tables2.Table):
|
|
|
161
190
|
logger.error("Couldn't find model for %s", column.column.viewname)
|
|
162
191
|
continue
|
|
163
192
|
reverse_lookup = column.column.reverse_lookup or next(iter(column.column.url_params.keys()))
|
|
164
|
-
|
|
193
|
+
distinct = column.column.distinct
|
|
194
|
+
count_fields.append((column.name, column_model, reverse_lookup, distinct))
|
|
165
195
|
try:
|
|
166
196
|
lookup = column.column.lookup or get_related_field_for_models(model, column_model).name
|
|
167
197
|
# For some reason get_related_field_for_models(Tag, DynamicGroup) gives a M2M with the name
|
|
@@ -173,7 +203,8 @@ class BaseTable(django_tables2.Table):
|
|
|
173
203
|
if lookup is not None:
|
|
174
204
|
# Also attempt to prefetch the first matching record for display - see LinkedCountColumn
|
|
175
205
|
prefetch_fields.append(
|
|
176
|
-
|
|
206
|
+
# Use order_by() because we don't care about ordering here and it's potentially expensive
|
|
207
|
+
Prefetch(lookup, column_model.objects.order_by()[:1], to_attr=f"{lookup}_list")
|
|
177
208
|
)
|
|
178
209
|
continue
|
|
179
210
|
|
|
@@ -209,75 +240,46 @@ class BaseTable(django_tables2.Table):
|
|
|
209
240
|
prefetch_fields.append("__".join(prefetch_path))
|
|
210
241
|
|
|
211
242
|
if select_fields:
|
|
212
|
-
|
|
213
|
-
# one that has had union()/intersection()/difference() applied.
|
|
214
|
-
# We can detect and avoid these cases the same way that Django itself does.
|
|
215
|
-
if queryset._fields is not None:
|
|
216
|
-
logger.debug(
|
|
217
|
-
"NOT applying select_related(%s) to %s QuerySet as it includes .values()/.values_list()",
|
|
218
|
-
select_fields,
|
|
219
|
-
model.__name__,
|
|
220
|
-
)
|
|
221
|
-
elif queryset.query.combinator:
|
|
222
|
-
logger.debug(
|
|
223
|
-
"NOT applying select_related(%s) to %s QuerySet as it is a combinator query",
|
|
224
|
-
select_fields,
|
|
225
|
-
model.__name__,
|
|
226
|
-
)
|
|
227
|
-
else:
|
|
228
|
-
logger.debug("Applying .select_related(%s) to %s QuerySet", select_fields, model.__name__)
|
|
229
|
-
# Belt and suspenders - we should have avoided any error cases above, but be safe anyway:
|
|
230
|
-
try:
|
|
231
|
-
queryset = queryset.select_related(*select_fields)
|
|
232
|
-
except (TypeError, ValueError, NotSupportedError) as exc:
|
|
233
|
-
logger.warning(
|
|
234
|
-
"Unexpected error when trying to .select_related() on %s QuerySet: %s",
|
|
235
|
-
model.__name__,
|
|
236
|
-
exc,
|
|
237
|
-
)
|
|
243
|
+
queryset = maybe_select_related(queryset, select_fields)
|
|
238
244
|
|
|
239
245
|
if prefetch_fields:
|
|
240
|
-
|
|
241
|
-
logger.debug(
|
|
242
|
-
"NOT applying prefetch_related(%s) to %s QuerySet as it is a combinator query",
|
|
243
|
-
prefetch_fields,
|
|
244
|
-
model.__name__,
|
|
245
|
-
)
|
|
246
|
-
else:
|
|
247
|
-
logger.debug("Applying .prefetch_related(%s) to %s QuerySet", prefetch_fields, model.__name__)
|
|
248
|
-
# Belt and suspenders - we should have avoided any error cases above, but be safe anyway:
|
|
249
|
-
try:
|
|
250
|
-
queryset = queryset.prefetch_related(*prefetch_fields)
|
|
251
|
-
except (AttributeError, TypeError, ValueError, NotSupportedError) as exc:
|
|
252
|
-
logger.warning(
|
|
253
|
-
"Unexpected error when trying to .prefetch_related() on %s QuerySet: %s",
|
|
254
|
-
model.__name__,
|
|
255
|
-
exc,
|
|
256
|
-
)
|
|
246
|
+
queryset = maybe_prefetch_related(queryset, prefetch_fields)
|
|
257
247
|
|
|
258
248
|
if count_fields:
|
|
259
|
-
for column_name, column_model, lookup_name in count_fields:
|
|
249
|
+
for column_name, column_model, lookup_name, distinct in count_fields:
|
|
260
250
|
if hasattr(queryset.first(), column_name):
|
|
261
251
|
continue
|
|
262
252
|
try:
|
|
263
253
|
logger.debug(
|
|
264
|
-
"Applying .annotate(%s=count_related(%s, %r) to %s QuerySet",
|
|
254
|
+
"Applying .annotate(%s=count_related(%s, %r, distinct=%s) to %s QuerySet",
|
|
265
255
|
column_name,
|
|
266
256
|
column_model.__name__,
|
|
267
257
|
lookup_name,
|
|
258
|
+
distinct,
|
|
268
259
|
model.__name__,
|
|
269
260
|
)
|
|
270
|
-
queryset = queryset.annotate(
|
|
261
|
+
queryset = queryset.annotate(
|
|
262
|
+
**{column_name: count_related(column_model, lookup_name, distinct=distinct)}
|
|
263
|
+
)
|
|
271
264
|
except FieldError:
|
|
272
265
|
# No error message logged here as the above is *very much* best-effort
|
|
273
266
|
pass
|
|
274
267
|
|
|
275
268
|
self.data.data = queryset
|
|
276
269
|
|
|
270
|
+
# TODO: it would be better if we could apply this transformation and the above queryset optimizations
|
|
271
|
+
# **before** calling super().__init__(), but the current implementation works for now, though inelegant.
|
|
272
|
+
if data_transform_callback is not None:
|
|
273
|
+
self.data = TableData.from_data(data_transform_callback(self.data.data))
|
|
274
|
+
self.data.set_table(self)
|
|
275
|
+
self.rows = BoundRows(data=self.data, table=self, pinned_data=self.pinned_data)
|
|
276
|
+
|
|
277
277
|
@property
|
|
278
278
|
def configurable_columns(self):
|
|
279
279
|
selected_columns = [
|
|
280
|
-
(name,
|
|
280
|
+
(name, column.verbose_name)
|
|
281
|
+
for name, column in self.columns.items()
|
|
282
|
+
if name in self.sequence and name not in ["pk", "actions"]
|
|
281
283
|
]
|
|
282
284
|
available_columns = [
|
|
283
285
|
(name, column.verbose_name)
|
|
@@ -288,7 +290,7 @@ class BaseTable(django_tables2.Table):
|
|
|
288
290
|
|
|
289
291
|
@property
|
|
290
292
|
def visible_columns(self):
|
|
291
|
-
return [name for name in self.
|
|
293
|
+
return [name for name, column in self.columns.items() if column.visible and name not in self.exclude]
|
|
292
294
|
|
|
293
295
|
@property
|
|
294
296
|
def order_by(self):
|
|
@@ -443,7 +445,7 @@ class ChoiceFieldColumn(django_tables2.Column):
|
|
|
443
445
|
choices. The CSS class is derived by calling .get_FOO_class() on the row record.
|
|
444
446
|
"""
|
|
445
447
|
|
|
446
|
-
def render(self, record, bound_column, value): # pylint: disable=arguments-differ
|
|
448
|
+
def render(self, *, record, bound_column, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
|
|
447
449
|
if value:
|
|
448
450
|
name = bound_column.name
|
|
449
451
|
css_class = getattr(record, f"get_{name}_class")()
|
|
@@ -490,6 +492,7 @@ class LinkedCountColumn(django_tables2.Column):
|
|
|
490
492
|
TODO: this currently does *not* support nested lookups via `__`. That may be solvable in the future.
|
|
491
493
|
reverse_lookup (str, optional): The reverse lookup parameter to use to derive the count.
|
|
492
494
|
If not specified, the first key in `url_params` will be implicitly used as the `reverse_lookup` value.
|
|
495
|
+
distinct (bool, optional): Parameter passed through to `count_related()`.
|
|
493
496
|
**kwargs (dict, optional): As the parent Column class.
|
|
494
497
|
|
|
495
498
|
Examples:
|
|
@@ -514,25 +517,37 @@ class LinkedCountColumn(django_tables2.Column):
|
|
|
514
517
|
# We'd like to do the below but this module isn't currently smart enough to build the right Prefetch()
|
|
515
518
|
# for a nested lookup:
|
|
516
519
|
# lookup="circuit_terminations__circuit",
|
|
517
|
-
# For the count,
|
|
520
|
+
# For the count,
|
|
521
|
+
# .annotate(circuit_count=count_related(Circuit, "circuit_terminations__cloud_network", distinct=True))
|
|
518
522
|
reverse_lookup="circuit_terminations__cloud_network",
|
|
523
|
+
distinct=True,
|
|
519
524
|
verbose_name="Circuits",
|
|
520
525
|
)
|
|
521
526
|
```
|
|
522
527
|
"""
|
|
523
528
|
|
|
524
529
|
def __init__(
|
|
525
|
-
self,
|
|
530
|
+
self,
|
|
531
|
+
viewname,
|
|
532
|
+
*args,
|
|
533
|
+
view_kwargs=None,
|
|
534
|
+
url_params=None,
|
|
535
|
+
lookup=None,
|
|
536
|
+
reverse_lookup=None,
|
|
537
|
+
distinct=False,
|
|
538
|
+
default=None,
|
|
539
|
+
**kwargs,
|
|
526
540
|
):
|
|
527
541
|
self.viewname = viewname
|
|
528
542
|
self.lookup = lookup
|
|
529
543
|
self.view_kwargs = view_kwargs or {}
|
|
530
544
|
self.url_params = url_params
|
|
531
545
|
self.reverse_lookup = reverse_lookup or next(iter(url_params.keys()))
|
|
546
|
+
self.distinct = distinct
|
|
532
547
|
self.model = get_model_for_view_name(self.viewname)
|
|
533
548
|
super().__init__(*args, default=default, **kwargs)
|
|
534
549
|
|
|
535
|
-
def render(self, bound_column, record, value): # pylint: disable=arguments-differ
|
|
550
|
+
def render(self, *, bound_column, record, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
|
|
536
551
|
related_record = None
|
|
537
552
|
try:
|
|
538
553
|
lookup = self.lookup or get_related_field_for_models(bound_column._table._meta.model, self.model).name
|
|
@@ -543,7 +558,10 @@ class LinkedCountColumn(django_tables2.Column):
|
|
|
543
558
|
related_record = related_records[0]
|
|
544
559
|
url = reverse(self.viewname, kwargs=self.view_kwargs)
|
|
545
560
|
if self.url_params:
|
|
546
|
-
url += "?" + urlencode(
|
|
561
|
+
url += "?" + urlencode(
|
|
562
|
+
# Replace None values with `FILTERS_NULL_CHOICE_VALUE` to handle URL parameters correctly
|
|
563
|
+
{k: (getattr(record, v) or settings.FILTERS_NULL_CHOICE_VALUE) for k, v in self.url_params.items()}
|
|
564
|
+
)
|
|
547
565
|
if value > 1:
|
|
548
566
|
return format_html('<a href="{}" class="badge">{}</a>', url, value)
|
|
549
567
|
if related_record is not None:
|
|
@@ -616,7 +634,7 @@ class ComputedFieldColumn(django_tables2.Column):
|
|
|
616
634
|
|
|
617
635
|
super().__init__(*args, **kwargs)
|
|
618
636
|
|
|
619
|
-
def render(self, record):
|
|
637
|
+
def render(self, *, record): # pylint: disable=arguments-differ # tables2 varies its kwargs
|
|
620
638
|
return self.computedfield.render({"obj": record})
|
|
621
639
|
|
|
622
640
|
|
|
@@ -635,7 +653,7 @@ class CustomFieldColumn(django_tables2.Column):
|
|
|
635
653
|
|
|
636
654
|
super().__init__(*args, **kwargs)
|
|
637
655
|
|
|
638
|
-
def render(self, record, bound_column, value): # pylint: disable=arguments-differ
|
|
656
|
+
def render(self, *, record, bound_column, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
|
|
639
657
|
if self.customfield.type == choices.CustomFieldTypeChoices.TYPE_BOOLEAN:
|
|
640
658
|
template = helpers.render_boolean(value)
|
|
641
659
|
elif self.customfield.type == choices.CustomFieldTypeChoices.TYPE_MULTISELECT:
|
|
@@ -666,7 +684,7 @@ class RelationshipColumn(django_tables2.Column):
|
|
|
666
684
|
kwargs.setdefault("accessor", Accessor("associations"))
|
|
667
685
|
super().__init__(orderable=False, *args, **kwargs)
|
|
668
686
|
|
|
669
|
-
def render(self, record, value): # pylint: disable=arguments-differ
|
|
687
|
+
def render(self, *, record, value): # pylint: disable=arguments-differ # tables2 varies its kwargs
|
|
670
688
|
# Filter the relationship associations by the relationship instance.
|
|
671
689
|
# Since associations accessor returns all the relationship associations regardless of the relationship.
|
|
672
690
|
value = [v for v in value if v.relationship == self.relationship]
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{% extends 'base.html' %}
|
|
2
|
+
{% load helpers %}
|
|
3
|
+
{% load registry %}
|
|
4
|
+
|
|
5
|
+
{% block header %}
|
|
6
|
+
{{ block.super }}
|
|
7
|
+
{% if new_release %}
|
|
8
|
+
{# new_release is set only if the current user is a superuser or staff member #}
|
|
9
|
+
<div class="alert alert-info text-center" role="alert">
|
|
10
|
+
<i class="mdi mdi-information-outline"></i>
|
|
11
|
+
A new release is available: <a href="{{ new_release.url }}">Nautobot v{{ new_release.version }}</a> |
|
|
12
|
+
<a href="https://docs.nautobot.com/projects/core/en/v{{ new_release.version }}/installation/upgrading/">Upgrade instructions</a>
|
|
13
|
+
</div>
|
|
14
|
+
{% endif %}
|
|
15
|
+
{% endblock %}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
{% block content %}
|
|
19
|
+
<h1>About Nautobot</h1>
|
|
20
|
+
<div class="row">
|
|
21
|
+
<div class="col-md-6">
|
|
22
|
+
<div class="panel panel-default">
|
|
23
|
+
<div class="panel-heading">
|
|
24
|
+
<strong>About</strong>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="panel-body">
|
|
27
|
+
<a href="https://networktocode.com/nautobot/">Nautobot</a> is a product of <a href="https://networktocode.com/">Network to Code</a>. Nautobot is a Network Source of Truth and Network Automation Platform. Nautobot has an extensive ecosystem of solutions that can be installed to provide and power Network Automation feature sets. Please check the <a href="{% url 'apps:apps_marketplace' %}">App Marketplace</a> to learn more.
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="col-md-6">
|
|
32
|
+
<div class="panel panel-default">
|
|
33
|
+
<div class="panel-heading">
|
|
34
|
+
<strong>Support</strong>
|
|
35
|
+
</div>
|
|
36
|
+
<table class="table table-hover panel-body attr-table">
|
|
37
|
+
<tr>
|
|
38
|
+
<td>Support Contract Status</td>
|
|
39
|
+
<td>{{ support_contract_active | render_boolean }}</td>
|
|
40
|
+
</tr>
|
|
41
|
+
<tr>
|
|
42
|
+
<td>Contract Expiry Date</td>
|
|
43
|
+
<td>
|
|
44
|
+
{% if support_contract_active %}
|
|
45
|
+
{{ support_expiration_date | date }}
|
|
46
|
+
{% elif support_expiration_date %}
|
|
47
|
+
<span style="color: red;">{{ support_expiration_date | date }}</span>
|
|
48
|
+
{% else %}
|
|
49
|
+
—
|
|
50
|
+
{% endif %}
|
|
51
|
+
</td>
|
|
52
|
+
</tr>
|
|
53
|
+
<tr>
|
|
54
|
+
<td> </td>
|
|
55
|
+
<td>
|
|
56
|
+
{% if not support_expiration_date %}
|
|
57
|
+
To inquire about Nautobot support with Network to Code, please email <a href="mailto:info@networktocode.com">info@networktocode.com</a>.
|
|
58
|
+
{% else %}
|
|
59
|
+
If there is any question on the status of your Nautobot support contract with Network to Code, please email <a href="mailto:info@networktocode.com">info@networktocode.com</a>.
|
|
60
|
+
{% endif %}
|
|
61
|
+
</td>
|
|
62
|
+
</tr>
|
|
63
|
+
</table>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
{% endblock %}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
{% block content %}
|
|
8
8
|
<div class="row">
|
|
9
9
|
<div class="col-md-8 col-md-offset-2">
|
|
10
|
-
<div class="panel panel-danger">
|
|
10
|
+
<div class="panel panel-danger" id="confirm-bulk-deletion">
|
|
11
11
|
<div class="panel-heading"><strong>Confirm Bulk Deletion</strong></div>
|
|
12
12
|
<div class="panel-body">
|
|
13
13
|
<p><strong>Warning:</strong> The following operation will delete {{ total_objs_to_delete }} {{ obj_type_plural }}. {% if not delete_all %}Please carefully review the {{ obj_type_plural }} to be deleted and confirm below.{% endif %}</p>
|
|
@@ -47,3 +47,6 @@
|
|
|
47
47
|
<meta name="theme-color" content="#ffffff">
|
|
48
48
|
<meta charset="UTF-8">
|
|
49
49
|
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
|
|
50
|
+
{% if settings.PUBLISH_ROBOTS_TXT %}
|
|
51
|
+
<meta name="robots" content="noindex, nofollow">
|
|
52
|
+
{% endif %}
|
|
@@ -93,6 +93,7 @@
|
|
|
93
93
|
<span class="mdi mdi-chevron-down"></span>
|
|
94
94
|
</a>
|
|
95
95
|
<ul class="collapse nav-dropdown-menu" id="adminDropdown">
|
|
96
|
+
<li><a href="{% url 'about' %}"><i class="mdi mdi-information"></i> About</a></li>
|
|
96
97
|
<li><a href="{% url 'user:profile' %}"><i class="mdi mdi-account-box"></i> Profile</a></li>
|
|
97
98
|
{% if request.user.is_staff %}
|
|
98
99
|
<li><a href="{% url 'worker_status' %}"><i class="mdi mdi-server-network"></i> Worker Status</a></li>
|
|
@@ -463,6 +463,16 @@ INSTALLATION_METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_INSTALLATION_METRIC
|
|
|
463
463
|
#
|
|
464
464
|
# NAPALM_ARGS = {}
|
|
465
465
|
|
|
466
|
+
# Expiration date (YYYY-MM-DD) for an active Nautobot support contract with Network to Code.
|
|
467
|
+
# Displayed in the About page.
|
|
468
|
+
# if (
|
|
469
|
+
# "NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE" in os.environ
|
|
470
|
+
# and os.environ["NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE"] != ""
|
|
471
|
+
# ):
|
|
472
|
+
# NTC_SUPPORT_CONTRACT_EXPIRATION_DATE = datetime.date.fromisoformat(
|
|
473
|
+
# os.environ["NAUTOBOT_NTC_SUPPORT_CONTRACT_EXPIRATION_DATE"]
|
|
474
|
+
# )
|
|
475
|
+
|
|
466
476
|
# Default number of objects to display per page of the UI and REST API. Default is 50
|
|
467
477
|
#
|
|
468
478
|
# if "NAUTOBOT_PAGINATE_COUNT" in os.environ and os.environ["NAUTOBOT_PAGINATE_COUNT"] != "":
|
|
@@ -493,6 +503,9 @@ INSTALLATION_METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_INSTALLATION_METRIC
|
|
|
493
503
|
# if "NAUTOBOT_PREFER_IPV4" in os.environ and os.environ["NAUTOBOT_PREFER_IPV4"] != "":
|
|
494
504
|
# PREFER_IPV4 = is_truthy(os.environ["NAUTOBOT_PREFER_IPV4"])
|
|
495
505
|
|
|
506
|
+
# Publish a simple "no-index" robots.txt for Nautobot?
|
|
507
|
+
# PUBLISH_ROBOTS_TXT = is_truthy(os.getenv("NAUTOBOT_PUBLISH_ROBOTS_TXT", "True"))
|
|
508
|
+
|
|
496
509
|
# Default height and width in pixels of a single rack unit in rendered rack elevations. Defaults are 22 and 230
|
|
497
510
|
#
|
|
498
511
|
# if (
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
{% load helpers %}
|
|
2
2
|
|
|
3
|
-
{% if url_name %}<a href="{% url url_name %}?tags={{ tag.name }}">{% endif %}<span class="label
|
|
3
|
+
{% if url_name %}<a href="{% url url_name %}?tags={{ tag.name }}">{% endif %}<span class="label" style="color: {{ tag.color|fgcolor }}; background-color: #{{ tag.color }}">{{ tag }}</span>{% if url_name %}</a>{% endif %}
|
|
@@ -330,6 +330,7 @@
|
|
|
330
330
|
<small>title for most object views</small>
|
|
331
331
|
<span class="label label-default">Default</span>
|
|
332
332
|
<span class="label label-primary">Primary</span>
|
|
333
|
+
<span class="label label-transparent">Transparent</span>
|
|
333
334
|
<span class="label label-success">Success</span>
|
|
334
335
|
<span class="label label-info">Info</span>
|
|
335
336
|
<span class="label label-warning">Warning</span>
|
|
@@ -340,6 +341,7 @@
|
|
|
340
341
|
<small>used for special purposes such as Location detail "badges"</small>
|
|
341
342
|
<span class="label label-default">Default</span>
|
|
342
343
|
<span class="label label-primary">Primary</span>
|
|
344
|
+
<span class="label label-transparent">Transparent</span>
|
|
343
345
|
<span class="label label-success">Success</span>
|
|
344
346
|
<span class="label label-info">Info</span>
|
|
345
347
|
<span class="label label-warning">Warning</span>
|
|
@@ -350,6 +352,7 @@
|
|
|
350
352
|
<small>title for object create/edit forms</small>
|
|
351
353
|
<span class="label label-default">Default</span>
|
|
352
354
|
<span class="label label-primary">Primary</span>
|
|
355
|
+
<span class="label label-transparent">Transparent</span>
|
|
353
356
|
<span class="label label-success">Success</span>
|
|
354
357
|
<span class="label label-info">Info</span>
|
|
355
358
|
<span class="label label-warning">Warning</span>
|
|
@@ -360,6 +363,7 @@
|
|
|
360
363
|
<small>used in modal titles and a few others</small>
|
|
361
364
|
<span class="label label-default">Default</span>
|
|
362
365
|
<span class="label label-primary">Primary</span>
|
|
366
|
+
<span class="label label-transparent">Transparent</span>
|
|
363
367
|
<span class="label label-success">Success</span>
|
|
364
368
|
<span class="label label-info">Info</span>
|
|
365
369
|
<span class="label label-warning">Warning</span>
|
|
@@ -370,6 +374,7 @@
|
|
|
370
374
|
<small>used in user profiles and cable traces</small>
|
|
371
375
|
<span class="label label-default">Default</span>
|
|
372
376
|
<span class="label label-primary">Primary</span>
|
|
377
|
+
<span class="label label-transparent">Transparent</span>
|
|
373
378
|
<span class="label label-success">Success</span>
|
|
374
379
|
<span class="label label-info">Info</span>
|
|
375
380
|
<span class="label label-warning">Warning</span>
|
|
@@ -380,6 +385,7 @@
|
|
|
380
385
|
<small>Unused in core</small>
|
|
381
386
|
<span class="label label-default">Default</span>
|
|
382
387
|
<span class="label label-primary">Primary</span>
|
|
388
|
+
<span class="label label-transparent">Transparent</span>
|
|
383
389
|
<span class="label label-success">Success</span>
|
|
384
390
|
<span class="label label-info">Info</span>
|
|
385
391
|
<span class="label label-warning">Warning</span>
|
|
@@ -390,6 +396,7 @@
|
|
|
390
396
|
<small>Small text</small>
|
|
391
397
|
<span class="label label-default">Default</span>
|
|
392
398
|
<span class="label label-primary">Primary</span>
|
|
399
|
+
<span class="label label-transparent">Transparent</span>
|
|
393
400
|
<span class="label label-success">Success</span>
|
|
394
401
|
<span class="label label-info">Info</span>
|
|
395
402
|
<span class="label label-warning">Warning</span>
|
|
@@ -890,7 +890,13 @@ def saved_view_modal(
|
|
|
890
890
|
"clear_view",
|
|
891
891
|
]
|
|
892
892
|
|
|
893
|
-
|
|
893
|
+
view_class = lookup.get_view_for_model(model, "List")
|
|
894
|
+
table_name = None
|
|
895
|
+
if hasattr(view_class, "table"):
|
|
896
|
+
table_name = view_class.table.__name__
|
|
897
|
+
if hasattr(view_class, "table_class"):
|
|
898
|
+
table_name = view_class.table_class.__name__
|
|
899
|
+
|
|
894
900
|
for param in non_filter_params:
|
|
895
901
|
if param == "saved_view":
|
|
896
902
|
current_saved_view_pk = filters_applied.pop(param, None)
|
|
@@ -1044,12 +1050,13 @@ def versioned_static(file_path):
|
|
|
1044
1050
|
|
|
1045
1051
|
|
|
1046
1052
|
@register.simple_tag
|
|
1047
|
-
def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui):
|
|
1053
|
+
def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui, base_depth=0):
|
|
1048
1054
|
"""Generates a visual representation of a tree record hierarchy using dots.
|
|
1049
1055
|
|
|
1050
1056
|
Args:
|
|
1051
1057
|
tree_depth (range): A range representing the depth of the tree nodes.
|
|
1052
1058
|
hide_hierarchy_ui (bool): Indicates whether to hide the hierarchy UI.
|
|
1059
|
+
base_depth (int, optional): Starting depth (number of dots to skip rendering).
|
|
1053
1060
|
|
|
1054
1061
|
Returns:
|
|
1055
1062
|
str: A string containing dots (representing hierarchy levels) if `hide_hierarchy_ui` is False,
|
|
@@ -1057,6 +1064,8 @@ def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui):
|
|
|
1057
1064
|
"""
|
|
1058
1065
|
if hide_hierarchy_ui or tree_depth == 0:
|
|
1059
1066
|
return ""
|
|
1067
|
+
if isinstance(base_depth, int): # may be an empty string
|
|
1068
|
+
tree_depth = tree_depth[base_depth:]
|
|
1060
1069
|
ui_representation = " ".join(['<i class="mdi mdi-circle-small"></i>' for _ in tree_depth])
|
|
1061
1070
|
return mark_safe(ui_representation) # noqa: S308 # suspicious-mark-safe-usage, OK here since its just the `i` tag
|
|
1062
1071
|
|
|
@@ -21,23 +21,23 @@ from nautobot.extras.models import Job, JobResult
|
|
|
21
21
|
__all__ = (
|
|
22
22
|
"APITestCase",
|
|
23
23
|
"APIViewTestCases",
|
|
24
|
+
"FilterTestCases",
|
|
25
|
+
"JobClassInfo",
|
|
26
|
+
"ModelTestCase",
|
|
27
|
+
"ModelViewTestCase",
|
|
28
|
+
"NautobotTestCaseMixin",
|
|
29
|
+
"NautobotTestClient",
|
|
30
|
+
"TestCase",
|
|
31
|
+
"ViewTestCases",
|
|
24
32
|
"create_job_result_and_run_job",
|
|
25
33
|
"create_test_user",
|
|
26
34
|
"disable_warnings",
|
|
27
35
|
"extract_form_failures",
|
|
28
36
|
"extract_page_body",
|
|
29
|
-
"FilterTestCases",
|
|
30
37
|
"get_deletable_objects",
|
|
31
38
|
"get_job_class_and_model",
|
|
32
|
-
"JobClassInfo",
|
|
33
|
-
"ModelTestCase",
|
|
34
|
-
"ModelViewTestCase",
|
|
35
|
-
"NautobotTestCaseMixin",
|
|
36
|
-
"NautobotTestClient",
|
|
37
39
|
"post_data",
|
|
38
40
|
"run_job_for_testing",
|
|
39
|
-
"TestCase",
|
|
40
|
-
"ViewTestCases",
|
|
41
41
|
)
|
|
42
42
|
|
|
43
43
|
# Use the proper swappable User model
|