nautobot 2.3.16__py3-none-any.whl → 2.4.0__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/__init__.py +15 -0
- nautobot/apps/__init__.py +1 -1
- nautobot/apps/api.py +8 -10
- nautobot/apps/change_logging.py +2 -2
- nautobot/apps/choices.py +4 -4
- nautobot/apps/config.py +32 -3
- nautobot/apps/events.py +19 -0
- nautobot/apps/exceptions.py +0 -2
- 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 +44 -9
- nautobot/apps/utils.py +7 -15
- nautobot/apps/views.py +8 -6
- nautobot/circuits/api/serializers.py +1 -0
- nautobot/circuits/api/views.py +4 -8
- nautobot/circuits/navigation.py +0 -57
- nautobot/circuits/templates/circuits/circuit_create.html +1 -7
- nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -71
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -64
- nautobot/circuits/templates/circuits/inc/circuit_termination_cable_fragment.html +40 -0
- nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +26 -0
- nautobot/circuits/templates/circuits/provider_retrieve.html +0 -76
- nautobot/circuits/tests/integration/test_relationships.py +33 -24
- nautobot/circuits/tests/test_filters.py +4 -8
- nautobot/circuits/views.py +140 -23
- nautobot/cloud/api/views.py +6 -10
- nautobot/cloud/factory.py +4 -1
- nautobot/cloud/tests/test_filters.py +5 -4
- nautobot/cloud/views.py +0 -16
- nautobot/core/api/constants.py +11 -0
- nautobot/core/api/filter_backends.py +3 -9
- nautobot/core/api/metadata.py +28 -256
- nautobot/core/api/pagination.py +3 -2
- nautobot/core/api/renderers.py +3 -0
- nautobot/core/api/schema.py +13 -2
- nautobot/core/api/serializers.py +45 -259
- nautobot/core/api/urls.py +3 -4
- nautobot/core/api/utils.py +0 -62
- nautobot/core/api/views.py +99 -157
- nautobot/core/apps/__init__.py +22 -578
- nautobot/core/celery/__init__.py +13 -0
- nautobot/core/celery/schedulers.py +47 -2
- nautobot/core/choices.py +2 -2
- nautobot/core/cli/__init__.py +8 -0
- nautobot/core/constants.py +7 -0
- nautobot/core/events/__init__.py +116 -0
- nautobot/core/events/base.py +27 -0
- nautobot/core/events/exceptions.py +10 -0
- nautobot/core/events/redis_broker.py +48 -0
- nautobot/core/events/syslog_broker.py +19 -0
- nautobot/core/exceptions.py +0 -6
- nautobot/core/forms/__init__.py +19 -19
- nautobot/core/forms/fields.py +57 -9
- nautobot/core/forms/forms.py +33 -2
- nautobot/core/forms/utils.py +2 -1
- nautobot/core/graphql/schema.py +3 -1
- nautobot/core/jobs/__init__.py +24 -3
- nautobot/core/jobs/bulk_actions.py +248 -0
- nautobot/core/jobs/cleanup.py +1 -1
- nautobot/core/management/commands/generate_test_data.py +21 -0
- nautobot/core/middleware.py +16 -0
- nautobot/core/models/fields.py +11 -7
- nautobot/core/settings.py +68 -4
- nautobot/core/settings.yaml +99 -0
- nautobot/core/tables.py +10 -46
- nautobot/core/tasks.py +1 -1
- nautobot/core/templates/about.html +67 -0
- nautobot/core/templates/components/button/default.html +7 -0
- nautobot/core/templates/components/button/dropdown.html +20 -0
- nautobot/core/templates/components/layout/one_over_two.html +19 -0
- nautobot/core/templates/components/layout/two_over_one.html +19 -0
- nautobot/core/templates/components/panel/body_content_data_table.html +27 -0
- nautobot/core/templates/components/panel/body_content_objects_table.html +4 -0
- nautobot/core/templates/components/panel/body_content_tags.html +6 -0
- nautobot/core/templates/components/panel/body_content_text.html +12 -0
- nautobot/core/templates/components/panel/body_wrapper_generic.html +3 -0
- nautobot/core/templates/components/panel/body_wrapper_key_value_table.html +3 -0
- nautobot/core/templates/components/panel/body_wrapper_table.html +3 -0
- nautobot/core/templates/components/panel/footer_contacts_table.html +20 -0
- nautobot/core/templates/components/panel/footer_content_table.html +14 -0
- nautobot/core/templates/components/panel/grouping_toggle.html +14 -0
- nautobot/core/templates/components/panel/header_extra_content_table.html +3 -0
- nautobot/core/templates/components/panel/panel.html +16 -0
- nautobot/core/templates/components/panel/stats_panel_body.html +8 -0
- nautobot/core/templates/components/tab/content_wrapper.html +3 -0
- nautobot/core/templates/components/tab/label_wrapper.html +5 -0
- nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +3 -0
- nautobot/core/templates/generic/object_retrieve.html +28 -17
- nautobot/core/templates/inc/computed_fields/panel_data.html +4 -7
- nautobot/core/templates/inc/custom_fields/panel.html +2 -2
- nautobot/core/templates/inc/custom_fields/panel_data.html +4 -7
- nautobot/core/templates/inc/footer.html +1 -0
- nautobot/core/templates/inc/nav_menu.html +2 -1
- nautobot/core/templates/inc/relationships_panel.html +1 -1
- 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/panel_table.html +12 -0
- nautobot/core/templates/utilities/render_jinja2.html +117 -0
- nautobot/core/templates/utilities/templatetags/tag.html +1 -1
- nautobot/core/templates/utilities/theme_preview.html +7 -0
- nautobot/core/templatetags/helpers.py +104 -6
- nautobot/core/templatetags/ui_framework.py +40 -0
- nautobot/core/testing/__init__.py +8 -8
- nautobot/core/testing/api.py +187 -137
- nautobot/core/testing/context.py +18 -0
- nautobot/core/testing/filters.py +41 -35
- nautobot/core/testing/forms.py +2 -0
- nautobot/core/testing/views.py +65 -148
- nautobot/core/tests/integration/test_view_authentication.py +1 -1
- nautobot/core/tests/nautobot_config.py +198 -0
- nautobot/core/tests/runner.py +2 -2
- nautobot/core/tests/test_api.py +154 -176
- nautobot/core/tests/test_events.py +214 -0
- nautobot/core/tests/test_forms.py +1 -0
- nautobot/core/tests/test_jinja_filters.py +1 -0
- nautobot/core/tests/test_jobs.py +387 -14
- nautobot/core/tests/test_navigations.py +7 -241
- nautobot/core/tests/test_settings_schema.py +7 -0
- nautobot/core/tests/test_tables.py +100 -0
- nautobot/core/tests/test_templatetags_helpers.py +16 -0
- nautobot/core/tests/test_ui.py +150 -0
- nautobot/core/tests/test_utils.py +55 -18
- nautobot/core/tests/test_views.py +124 -5
- nautobot/core/ui/__init__.py +0 -0
- nautobot/core/ui/base.py +11 -0
- nautobot/core/ui/choices.py +44 -0
- nautobot/core/ui/homepage.py +167 -0
- nautobot/core/ui/nav.py +280 -0
- nautobot/core/ui/object_detail.py +1855 -0
- nautobot/core/ui/utils.py +36 -0
- nautobot/core/urls.py +6 -0
- nautobot/core/utils/config.py +30 -3
- nautobot/core/utils/lookup.py +12 -2
- nautobot/core/utils/querysets.py +64 -0
- nautobot/core/utils/requests.py +24 -9
- nautobot/core/views/__init__.py +48 -1
- nautobot/core/views/generic.py +37 -140
- nautobot/core/views/mixins.py +82 -32
- nautobot/core/views/paginator.py +8 -5
- nautobot/core/views/renderers.py +9 -9
- nautobot/core/views/utils.py +11 -0
- nautobot/core/wsgi.py +3 -3
- nautobot/dcim/api/serializers.py +34 -141
- nautobot/dcim/api/urls.py +5 -0
- nautobot/dcim/api/views.py +57 -110
- nautobot/dcim/apps.py +1 -0
- nautobot/dcim/choices.py +28 -0
- nautobot/dcim/factory.py +58 -0
- nautobot/dcim/filters/__init__.py +204 -2
- nautobot/dcim/forms.py +219 -9
- nautobot/dcim/migrations/0063_interfacevdcassignment_virtualdevicecontext_and_more.py +165 -0
- nautobot/dcim/migrations/0064_virtualdevicecontext_status_data_migration.py +28 -0
- nautobot/dcim/migrations/0065_controller_capabilities_and_more.py +29 -0
- nautobot/dcim/migrations/0066_controllermanageddevicegroup_radio_profiles_and_more.py +33 -0
- nautobot/dcim/migrations/0067_controllermanageddevicegroup_tenant.py +25 -0
- nautobot/dcim/models/__init__.py +5 -1
- nautobot/dcim/models/devices.py +180 -2
- nautobot/dcim/models/racks.py +2 -2
- nautobot/dcim/navigation.py +25 -224
- nautobot/dcim/signals.py +44 -0
- nautobot/dcim/tables/__init__.py +2 -0
- nautobot/dcim/tables/devices.py +103 -7
- nautobot/dcim/tables/racks.py +1 -1
- nautobot/dcim/templates/dcim/controller/base.html +10 -0
- nautobot/dcim/templates/dcim/controller_create.html +2 -7
- nautobot/dcim/templates/dcim/controller_retrieve.html +6 -10
- nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +25 -0
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +68 -0
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +51 -0
- nautobot/dcim/templates/dcim/device/base.html +6 -42
- nautobot/dcim/templates/dcim/device/wireless.html +73 -0
- nautobot/dcim/templates/dcim/device.html +4 -10
- nautobot/dcim/templates/dcim/device_edit.html +36 -37
- nautobot/dcim/templates/dcim/interface.html +1 -0
- nautobot/dcim/templates/dcim/interface_edit.html +1 -0
- nautobot/dcim/templates/dcim/location.html +1 -9
- nautobot/dcim/templates/dcim/location_edit.html +1 -7
- nautobot/dcim/templates/dcim/locationtype.html +0 -107
- nautobot/dcim/templates/dcim/locationtype_retrieve.html +8 -0
- nautobot/dcim/templates/dcim/rack.html +1 -9
- nautobot/dcim/templates/dcim/rack_edit.html +1 -7
- nautobot/dcim/templates/dcim/rackreservation.html +1 -9
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +68 -0
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +28 -0
- nautobot/dcim/tests/integration/test_controller.py +62 -0
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +71 -0
- nautobot/dcim/tests/test_api.py +188 -64
- nautobot/dcim/tests/test_filters.py +171 -76
- nautobot/dcim/tests/test_jobs.py +118 -0
- nautobot/dcim/tests/test_models.py +157 -6
- nautobot/dcim/tests/test_signals.py +1 -0
- nautobot/dcim/tests/test_views.py +118 -88
- nautobot/dcim/urls.py +72 -27
- nautobot/dcim/utils.py +2 -2
- nautobot/dcim/views.py +356 -61
- nautobot/extras/api/serializers.py +39 -18
- nautobot/extras/api/urls.py +4 -0
- nautobot/extras/api/views.py +89 -31
- nautobot/extras/choices.py +13 -0
- nautobot/extras/constants.py +2 -1
- nautobot/extras/context_managers.py +23 -6
- nautobot/extras/datasources/git.py +4 -1
- nautobot/extras/factory.py +27 -0
- nautobot/extras/filters/__init__.py +66 -5
- nautobot/extras/forms/base.py +2 -2
- nautobot/extras/forms/forms.py +262 -59
- nautobot/extras/forms/mixins.py +2 -2
- nautobot/extras/graphql/types.py +25 -1
- nautobot/extras/jobs.py +109 -15
- nautobot/extras/management/__init__.py +1 -0
- nautobot/extras/management/commands/runjob.py +7 -79
- nautobot/extras/management/commands/runjob_with_job_result.py +46 -0
- nautobot/extras/management/utils.py +87 -0
- nautobot/extras/migrations/0117_create_job_queue_model.py +129 -0
- nautobot/extras/migrations/0118_task_queue_to_job_queue_migration.py +78 -0
- nautobot/extras/migrations/0119_remove_task_queues_from_job_and_queue_from_scheduled_job.py +28 -0
- 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/models/__init__.py +5 -1
- nautobot/extras/models/change_logging.py +7 -3
- nautobot/extras/models/contacts.py +1 -1
- nautobot/extras/models/groups.py +0 -2
- nautobot/extras/models/jobs.py +233 -33
- nautobot/extras/models/relationships.py +69 -1
- nautobot/extras/models/secrets.py +5 -0
- nautobot/extras/navigation.py +20 -262
- nautobot/extras/plugins/__init__.py +54 -19
- nautobot/extras/plugins/marketplace_manifest.yml +455 -0
- nautobot/extras/plugins/tables.py +16 -14
- nautobot/extras/plugins/urls.py +1 -0
- nautobot/extras/plugins/views.py +103 -60
- nautobot/extras/registry.py +1 -1
- nautobot/extras/secrets/__init__.py +2 -2
- nautobot/extras/signals.py +39 -1
- nautobot/extras/tables.py +37 -1
- nautobot/extras/templates/extras/dynamicgroup.html +1 -9
- nautobot/extras/templates/extras/externalintegration_retrieve.html +0 -47
- nautobot/extras/templates/extras/inc/tags_panel.html +1 -5
- nautobot/extras/templates/extras/job_bulk_edit.html +2 -1
- nautobot/extras/templates/extras/job_detail.html +52 -6
- nautobot/extras/templates/extras/job_edit.html +6 -2
- nautobot/extras/templates/extras/job_list.html +2 -7
- nautobot/extras/templates/extras/jobqueue_retrieve.html +36 -0
- nautobot/extras/templates/extras/marketplace.html +296 -0
- nautobot/extras/templates/extras/plugin_detail.html +32 -15
- nautobot/extras/templates/extras/plugins_list.html +35 -1
- nautobot/extras/templates/extras/plugins_tiles.html +90 -0
- nautobot/extras/templates/extras/role_retrieve.html +16 -0
- nautobot/extras/templates/extras/secret.html +0 -65
- nautobot/extras/templates/extras/secret_check.js +16 -0
- nautobot/extras/templates/extras/secret_create.html +114 -0
- nautobot/extras/templates/extras/secret_edit.html +1 -114
- nautobot/extras/templates/extras/secretsgroup_edit.html +1 -1
- nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +2 -0
- nautobot/extras/templatetags/job_buttons.py +5 -4
- nautobot/extras/templatetags/plugins.py +69 -6
- nautobot/extras/test_jobs/singleton.py +16 -0
- nautobot/extras/tests/test_api.py +145 -43
- nautobot/extras/tests/test_context_managers.py +4 -1
- nautobot/extras/tests/test_filters.py +213 -529
- nautobot/extras/tests/test_job_variables.py +73 -152
- nautobot/extras/tests/test_jobs.py +181 -51
- nautobot/extras/tests/test_models.py +61 -6
- nautobot/extras/tests/test_plugins.py +62 -9
- nautobot/extras/tests/test_relationships.py +123 -9
- nautobot/extras/tests/test_utils.py +23 -2
- nautobot/extras/tests/test_views.py +146 -145
- nautobot/extras/tests/test_webhooks.py +2 -1
- nautobot/extras/urls.py +2 -20
- nautobot/extras/utils.py +119 -4
- nautobot/extras/views.py +168 -125
- nautobot/extras/webhooks.py +5 -2
- nautobot/ipam/api/serializers.py +10 -103
- nautobot/ipam/api/views.py +31 -49
- nautobot/ipam/factory.py +1 -1
- nautobot/ipam/filters.py +3 -2
- nautobot/ipam/models.py +10 -12
- nautobot/ipam/navigation.py +0 -90
- nautobot/ipam/tables.py +3 -1
- nautobot/ipam/templates/ipam/ipaddress.html +1 -9
- 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 +1 -9
- nautobot/ipam/templates/ipam/prefix_edit.html +1 -7
- nautobot/ipam/templates/ipam/routetarget.html +0 -28
- nautobot/ipam/templates/ipam/vlan.html +1 -9
- nautobot/ipam/templates/ipam/vlan_edit.html +1 -7
- nautobot/ipam/templates/ipam/vrf.html +0 -47
- nautobot/ipam/templates/ipam/vrf_edit.html +1 -7
- nautobot/ipam/tests/test_api.py +7 -5
- nautobot/ipam/tests/test_filters.py +39 -119
- nautobot/ipam/tests/test_forms.py +0 -2
- nautobot/ipam/tests/test_models.py +56 -36
- nautobot/ipam/tests/test_views.py +3 -0
- nautobot/ipam/urls.py +3 -69
- nautobot/ipam/utils/__init__.py +16 -10
- nautobot/ipam/views.py +91 -162
- 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/css/base.css +38 -3
- nautobot/project-static/docs/404.html +461 -17
- nautobot/project-static/docs/apps/index.html +461 -17
- nautobot/project-static/docs/apps/nautobot-apps.html +462 -19
- nautobot/project-static/docs/assets/_mkdocstrings.css +25 -1
- nautobot/project-static/docs/assets/extra.css +5 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +477 -23
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +474 -20
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +790 -289
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +505 -31
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +510 -34
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +471 -20
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +467 -18
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +497 -33
- nautobot/project-static/docs/code-reference/nautobot/apps/events.html +9883 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +523 -75
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +546 -51
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +670 -94
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1030 -177
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +524 -49
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +874 -188
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +955 -235
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +475 -21
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +486 -28
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +661 -99
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +947 -479
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +6425 -1234
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +474 -20
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +877 -344
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +828 -171
- nautobot/project-static/docs/development/apps/api/configuration-view.html +461 -17
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +461 -17
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +461 -17
- nautobot/project-static/docs/development/apps/api/models/global-search.html +461 -17
- nautobot/project-static/docs/development/apps/api/models/graphql.html +461 -17
- nautobot/project-static/docs/development/apps/api/models/index.html +461 -17
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/table-extensions.html +461 -17
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +461 -17
- nautobot/project-static/docs/development/apps/api/prometheus.html +461 -17
- nautobot/project-static/docs/development/apps/api/setup.html +465 -153
- nautobot/project-static/docs/development/apps/api/testing.html +461 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +461 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +461 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +461 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +461 -17
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +741 -128
- nautobot/project-static/docs/development/apps/api/views/base-template.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/index.html +463 -18
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +465 -17
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +491 -17
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/notes.html +461 -17
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +467 -19
- nautobot/project-static/docs/development/apps/api/views/urls.html +461 -17
- nautobot/project-static/docs/development/apps/index.html +461 -17
- nautobot/project-static/docs/development/apps/migration/code-updates.html +462 -50
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +462 -18
- nautobot/project-static/docs/development/apps/migration/from-v1.html +461 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +461 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +461 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +461 -17
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +464 -20
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/best-practices.html +9261 -0
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/custom-content.html +9375 -0
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/index.html +9671 -0
- nautobot/project-static/docs/development/apps/migration/ui-component-framework/migration-steps.html +9559 -0
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +464 -20
- nautobot/project-static/docs/development/core/application-registry.html +461 -17
- nautobot/project-static/docs/development/core/best-practices.html +461 -17
- nautobot/project-static/docs/development/core/bootstrap-ui.html +461 -17
- nautobot/project-static/docs/development/core/caching.html +461 -17
- nautobot/project-static/docs/development/core/controllers.html +463 -17
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +464 -20
- nautobot/project-static/docs/development/core/generic-views.html +461 -17
- nautobot/project-static/docs/development/core/getting-started.html +539 -127
- nautobot/project-static/docs/development/core/homepage.html +472 -28
- nautobot/project-static/docs/development/core/index.html +461 -17
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +9754 -0
- nautobot/project-static/docs/development/core/model-checklist.html +471 -25
- nautobot/project-static/docs/development/core/model-features.html +461 -17
- nautobot/project-static/docs/development/core/natural-keys.html +461 -17
- nautobot/project-static/docs/development/core/navigation-menu.html +478 -24
- nautobot/project-static/docs/development/core/release-checklist.html +478 -46
- nautobot/project-static/docs/development/core/role-internals.html +461 -17
- nautobot/project-static/docs/development/core/settings.html +461 -17
- nautobot/project-static/docs/development/core/style-guide.html +464 -20
- nautobot/project-static/docs/development/core/templates.html +471 -20
- nautobot/project-static/docs/development/core/testing.html +461 -17
- nautobot/project-static/docs/development/core/ui-component-framework.html +11116 -0
- nautobot/project-static/docs/development/core/user-preferences.html +464 -20
- nautobot/project-static/docs/development/index.html +461 -17
- nautobot/project-static/docs/development/jobs/index.html +499 -19
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +461 -17
- nautobot/project-static/docs/index.html +469 -36
- 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/basic-panel-layout.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/button-example.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/dropdown-button-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/grouped-key-value-table-panel-example-1.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/grouped-key-value-table-panel-example-2.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/object-fields-panel-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/media/development/core/ui-component-framework/stats-panel-example.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/table-panels-family.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/text-panels-family.png +0 -0
- nautobot/project-static/docs/media/development/core/ui-component-framework/ui-framework-example.png +0 -0
- nautobot/project-static/docs/media/models/virtual_device_context_overview.drawio +73 -0
- nautobot/project-static/docs/media/models/virtual_device_context_overview.png +0 -0
- nautobot/project-static/docs/models/dcim/virtualdevicecontext.html +14 -0
- nautobot/project-static/docs/models/extras/jobqueue.html +14 -0
- nautobot/project-static/docs/models/wireless/radioprofile.html +14 -0
- nautobot/project-static/docs/models/wireless/supporteddatarate.html +14 -0
- nautobot/project-static/docs/models/wireless/wirelessnetwork.html +14 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +467 -21
- nautobot/project-static/docs/overview/design_philosophy.html +461 -17
- nautobot/project-static/docs/release-notes/index.html +483 -20
- nautobot/project-static/docs/release-notes/version-1.0.html +649 -206
- nautobot/project-static/docs/release-notes/version-1.1.html +646 -203
- nautobot/project-static/docs/release-notes/version-1.2.html +721 -278
- nautobot/project-static/docs/release-notes/version-1.3.html +747 -304
- nautobot/project-static/docs/release-notes/version-1.4.html +832 -390
- nautobot/project-static/docs/release-notes/version-1.5.html +1020 -579
- nautobot/project-static/docs/release-notes/version-1.6.html +940 -516
- nautobot/project-static/docs/release-notes/version-2.0.html +943 -502
- nautobot/project-static/docs/release-notes/version-2.1.html +778 -337
- nautobot/project-static/docs/release-notes/version-2.2.html +771 -330
- nautobot/project-static/docs/release-notes/version-2.3.html +914 -471
- nautobot/project-static/docs/release-notes/version-2.4.html +10323 -0
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +342 -270
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +461 -17
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +461 -17
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +461 -17
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +473 -30
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +461 -17
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +842 -155
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +474 -27
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +461 -17
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +463 -19
- nautobot/project-static/docs/user-guide/administration/guides/selinux-troubleshooting.html +461 -17
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +461 -17
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +461 -17
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +481 -21
- nautobot/project-static/docs/user-guide/administration/installation/index.html +466 -18
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +462 -18
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +461 -17
- nautobot/project-static/docs/user-guide/administration/installation/services.html +461 -17
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +461 -17
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +482 -39
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +475 -64
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +475 -64
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +464 -21
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-nautobot-app-location.yaml +0 -16
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +461 -17
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +467 -19
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +497 -18
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +487 -20
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualdevicecontext.html +9375 -0
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +468 -28
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +464 -20
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +461 -17
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +464 -20
- nautobot/project-static/docs/user-guide/core-data-model/wireless/index.html +9313 -0
- nautobot/project-static/docs/user-guide/core-data-model/wireless/radioprofile.html +9217 -0
- nautobot/project-static/docs/user-guide/core-data-model/wireless/supporteddatarate.html +9211 -0
- nautobot/project-static/docs/user-guide/core-data-model/wireless/wirelessnetwork.html +9277 -0
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +466 -20
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +461 -17
- 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 +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +461 -17
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +464 -20
- nautobot/project-static/docs/user-guide/feature-guides/wireless-networks-and-controllers.html +9444 -0
- nautobot/project-static/docs/user-guide/index.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +465 -21
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/events.html +9617 -0
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +470 -21
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +9224 -0
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +9722 -0
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +465 -21
- nautobot/project-static/docs/user-guide/platform-functionality/rendering-jinja-templates.html +9292 -0
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +509 -38
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +492 -21
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +464 -20
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +529 -54
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +461 -17
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +461 -17
- nautobot/project-static/img/jinja_logo.svg +97 -0
- nautobot/project-static/js/forms.js +6 -1
- nautobot/project-static/js/nav_menu.js +2 -1
- nautobot/tenancy/api/serializers.py +0 -2
- nautobot/tenancy/api/views.py +9 -13
- nautobot/tenancy/factory.py +1 -1
- nautobot/tenancy/navigation.py +0 -29
- nautobot/tenancy/templates/tenancy/tenant.html +4 -91
- nautobot/tenancy/tests/test_filters.py +29 -134
- nautobot/tenancy/views.py +35 -24
- nautobot/users/admin.py +2 -0
- nautobot/users/api/views.py +2 -2
- nautobot/users/forms.py +19 -0
- nautobot/users/templates/users/preferences.html +22 -0
- nautobot/users/tests/test_filters.py +1 -19
- nautobot/users/tests/test_views.py +57 -0
- nautobot/users/utils.py +8 -0
- nautobot/users/views.py +48 -11
- nautobot/virtualization/api/views.py +5 -24
- nautobot/virtualization/filters.py +1 -2
- nautobot/virtualization/models.py +1 -1
- nautobot/virtualization/navigation.py +0 -48
- nautobot/virtualization/tables.py +2 -2
- nautobot/virtualization/templates/virtualization/cluster_edit.html +1 -7
- nautobot/virtualization/templates/virtualization/clustertype.html +0 -39
- nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -9
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +2 -8
- nautobot/virtualization/tests/test_filters.py +57 -166
- nautobot/virtualization/views.py +18 -15
- nautobot/wireless/__init__.py +0 -0
- nautobot/wireless/api/__init__.py +0 -0
- nautobot/wireless/api/serializers.py +44 -0
- nautobot/wireless/api/urls.py +20 -0
- nautobot/wireless/api/views.py +34 -0
- nautobot/wireless/apps.py +8 -0
- nautobot/wireless/choices.py +345 -0
- nautobot/wireless/factory.py +138 -0
- nautobot/wireless/filters.py +167 -0
- nautobot/wireless/forms.py +283 -0
- nautobot/wireless/homepage.py +19 -0
- nautobot/wireless/migrations/0001_initial.py +223 -0
- nautobot/wireless/migrations/__init__.py +0 -0
- nautobot/wireless/models.py +207 -0
- nautobot/wireless/navigation.py +105 -0
- nautobot/wireless/tables.py +244 -0
- nautobot/wireless/templates/wireless/radioprofile_retrieve.html +81 -0
- nautobot/wireless/templates/wireless/supporteddatarate_retrieve.html +26 -0
- nautobot/wireless/templates/wireless/wirelessnetwork_create.html +88 -0
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +56 -0
- nautobot/wireless/tests/__init__.py +0 -0
- nautobot/wireless/tests/integration/__init__.py +0 -0
- nautobot/wireless/tests/integration/test_radio_profile.py +42 -0
- nautobot/wireless/tests/test_api.py +247 -0
- nautobot/wireless/tests/test_filters.py +82 -0
- nautobot/wireless/tests/test_models.py +22 -0
- nautobot/wireless/tests/test_views.py +378 -0
- nautobot/wireless/urls.py +13 -0
- nautobot/wireless/views.py +119 -0
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/METADATA +9 -12
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/RECORD +720 -549
- nautobot/core/utils/navigation.py +0 -54
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/NOTICE +0 -0
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/WHEEL +0 -0
- {nautobot-2.3.16.dist-info → nautobot-2.4.0.dist-info}/entry_points.txt +0 -0
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
{% load plugins %}
|
|
9
9
|
{% load static %}
|
|
10
10
|
{% load tz %}
|
|
11
|
+
{% load ui_framework %}
|
|
11
12
|
|
|
12
13
|
{% block header %}
|
|
13
14
|
<div class="row noprint">
|
|
@@ -38,13 +39,14 @@
|
|
|
38
39
|
</div>
|
|
39
40
|
</form>
|
|
40
41
|
</div>
|
|
41
|
-
{% endif%}
|
|
42
|
+
{% endif %}
|
|
42
43
|
{% endwith %}
|
|
43
44
|
</div>
|
|
44
45
|
|
|
45
46
|
<div class="pull-right noprint">
|
|
46
47
|
{% block buttons %}
|
|
47
48
|
{% plugin_buttons object %}
|
|
49
|
+
{% render_detail_view_extra_buttons %}
|
|
48
50
|
{% block extra_buttons %}{% endblock extra_buttons %}
|
|
49
51
|
{% consolidate_detail_view_action_buttons %}
|
|
50
52
|
{% endblock buttons %}
|
|
@@ -69,6 +71,9 @@
|
|
|
69
71
|
|
|
70
72
|
<ul id="tabs" class="nav nav-tabs">
|
|
71
73
|
{% block nav_tabs %}
|
|
74
|
+
{% if object_detail_content %}
|
|
75
|
+
{% render_tabs_labels object_detail_content.tabs %}
|
|
76
|
+
{% else %}
|
|
72
77
|
<li role="presentation"{% if active_tab == "main" or request.GET.tab == "main" %} class="active"{% endif %}>
|
|
73
78
|
<a href="{{ object.get_absolute_url }}#main" onclick="switch_tab(this.href)" aria-controls="main" role="tab" data-toggle="tab">
|
|
74
79
|
{{ verbose_name|bettertitle }}
|
|
@@ -86,14 +91,6 @@
|
|
|
86
91
|
</a>
|
|
87
92
|
</li>
|
|
88
93
|
{% endif %}
|
|
89
|
-
{% block extra_nav_tabs %}{% endblock extra_nav_tabs %}
|
|
90
|
-
{% if perms.extras.view_note %}
|
|
91
|
-
{% if active_tab != 'notes' and object.get_notes_url or active_tab == 'notes' %}
|
|
92
|
-
<li role="presentation"{% if active_tab == 'notes' %} class="active"{% endif %}>
|
|
93
|
-
<a href="{{ object.get_notes_url }}">Notes</a>
|
|
94
|
-
</li>
|
|
95
|
-
{% endif %}
|
|
96
|
-
{% endif %}
|
|
97
94
|
{% if object.is_dynamic_group_associable_model and perms.extras.view_dynamicgroup %}
|
|
98
95
|
{% with object.dynamic_groups.count as dg_count %}
|
|
99
96
|
{% if dg_count %}
|
|
@@ -116,6 +113,14 @@
|
|
|
116
113
|
{% endif %}
|
|
117
114
|
{% endwith %}
|
|
118
115
|
{% endif %}
|
|
116
|
+
{% endif %}
|
|
117
|
+
{% if perms.extras.view_note %}
|
|
118
|
+
{% if active_tab != 'notes' and object.get_notes_url or active_tab == 'notes' %}
|
|
119
|
+
<li role="presentation"{% if active_tab == 'notes' %} class="active"{% endif %}>
|
|
120
|
+
<a href="{{ object.get_notes_url }}">Notes</a>
|
|
121
|
+
</li>
|
|
122
|
+
{% endif %}
|
|
123
|
+
{% endif %}
|
|
119
124
|
{% if perms.extras.view_objectchange %}
|
|
120
125
|
{% if active_tab != 'changelog' and object.get_changelog_url or active_tab == 'changelog' %}
|
|
121
126
|
<li role="presentation"{% if active_tab == 'changelog' %} class="active"{% endif %}>
|
|
@@ -123,6 +128,7 @@
|
|
|
123
128
|
</li>
|
|
124
129
|
{% endif %}
|
|
125
130
|
{% endif %}
|
|
131
|
+
{% block extra_nav_tabs %}{% endblock extra_nav_tabs %}
|
|
126
132
|
{% endblock nav_tabs %}
|
|
127
133
|
{% plugin_object_detail_tabs object %}
|
|
128
134
|
</ul>
|
|
@@ -130,11 +136,14 @@
|
|
|
130
136
|
|
|
131
137
|
{% block content %}
|
|
132
138
|
<div class="tab-content">
|
|
139
|
+
{% if object_detail_content %}
|
|
140
|
+
{% render_components object_detail_content.tabs %}
|
|
141
|
+
{% else %}
|
|
133
142
|
<div id="main" role="tabpanel" class="tab-pane {% if active_tab == "main" or request.GET.tab == "main" %}active{% else %}fade{% endif %}">
|
|
134
143
|
<div class="row">
|
|
135
144
|
<div class="col-md-6">
|
|
136
145
|
{% block content_left_page %}{% endblock content_left_page %}
|
|
137
|
-
{% include 'inc/custom_fields/panel.html' with custom_fields=object.get_custom_field_groupings_basic computed_fields=object.get_computed_fields_grouping_basic computed_fields_advanced_ui=False %}
|
|
146
|
+
{% include 'inc/custom_fields/panel.html' with custom_fields=object.get_custom_field_groupings_basic custom_fields_advanced_ui=False computed_fields=object.get_computed_fields_grouping_basic computed_fields_advanced_ui=False %}
|
|
138
147
|
{% include 'inc/relationships_panel.html' %}
|
|
139
148
|
{% include 'extras/inc/tags_panel.html' %}
|
|
140
149
|
{% plugin_left_page object %}
|
|
@@ -267,6 +276,8 @@
|
|
|
267
276
|
</div>
|
|
268
277
|
</div>
|
|
269
278
|
{% endif %}
|
|
279
|
+
{% endif %}
|
|
280
|
+
{% plugin_object_detail_tab_content object %}
|
|
270
281
|
{% block extra_tab_content %}{% endblock extra_tab_content %}
|
|
271
282
|
</div>
|
|
272
283
|
{% endblock content %}
|
|
@@ -325,28 +336,28 @@
|
|
|
325
336
|
$(`#tabs a[href="{{ object.get_absolute_url }}#${event.state.id}"]`).tab('show');
|
|
326
337
|
}
|
|
327
338
|
// Toggle v -. >
|
|
328
|
-
$("
|
|
339
|
+
$(".accordion-toggle").click(function () {
|
|
329
340
|
$(this).toggleClass("mdi-chevron-down mdi-chevron-right");
|
|
330
341
|
});
|
|
331
342
|
// Dynamically collapse/expand all when clicking the "Collapse All" button, and then update the button text.
|
|
332
|
-
$('
|
|
343
|
+
$('.accordion-toggle-all').click(function () {
|
|
333
344
|
|
|
334
345
|
if ($(this).data("lastState") === null || $(this).data("lastState") === 1) {
|
|
335
|
-
$('.collapse').collapse('show');
|
|
346
|
+
$($(this).data("target") + ' .collapse').collapse('show');
|
|
336
347
|
$(this).data("lastState", 0);
|
|
337
348
|
|
|
338
|
-
$("
|
|
349
|
+
$($(this).data("target") + " .accordion-toggle").addClass("mdi-chevron-down").removeClass("mdi-chevron-right");
|
|
339
350
|
|
|
340
351
|
$(this).text("Collapse All");
|
|
341
352
|
}
|
|
342
353
|
else {
|
|
343
|
-
$('[class^=collapseme]').removeData('bs.collapse').collapse({parent: false, toggle: false})
|
|
354
|
+
$($(this).data("target") + ' [class^=collapseme]').removeData('bs.collapse').collapse({parent: false, toggle: false})
|
|
344
355
|
.collapse('hide')
|
|
345
356
|
.removeData('bs.collapse')
|
|
346
|
-
.collapse({parent:
|
|
357
|
+
.collapse({parent: $(this).data("target"), toggle: false});
|
|
347
358
|
|
|
348
359
|
$(this).data("lastState", 1);
|
|
349
|
-
$("
|
|
360
|
+
$($(this).data("target") + " .accordion-toggle").addClass("mdi-chevron-right").removeClass("mdi-chevron-down");
|
|
350
361
|
|
|
351
362
|
$(this).text("Expand All");
|
|
352
363
|
}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
{% load helpers %}
|
|
2
2
|
{% if computed_fields %}
|
|
3
|
-
<style>
|
|
4
|
-
.accordion-toggle {
|
|
5
|
-
font-size: 14px;
|
|
6
|
-
}
|
|
7
|
-
</style>
|
|
8
3
|
<div class="panel panel-default">
|
|
9
4
|
<div class="panel-heading">
|
|
10
5
|
<strong>Computed Fields</strong>
|
|
11
|
-
<button type="button"
|
|
6
|
+
<button type="button"
|
|
7
|
+
class="btn-xs btn-primary pull-right accordion-toggle-all"
|
|
8
|
+
data-target="#computed_fields_accordion_{{ advanced_ui }}">Collapse All</button>
|
|
12
9
|
</div>
|
|
13
|
-
<table id="
|
|
10
|
+
<table id="computed_fields_accordion_{{ advanced_ui }}" class="table table-hover panel-body attr-table">
|
|
14
11
|
{% for grouping, fields in computed_fields.items %}
|
|
15
12
|
{% with forloop.counter0 as count %}
|
|
16
13
|
{% if grouping != "" %}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
{% load helpers %}
|
|
2
|
-
{% include 'inc/custom_fields/panel_data.html' %}
|
|
3
|
-
{% include 'inc/computed_fields/panel_data.html' with advanced_ui=computed_fields_advanced_ui %}
|
|
2
|
+
{% include 'inc/custom_fields/panel_data.html' with advanced_ui=custom_fields_advanced_ui %}
|
|
3
|
+
{% include 'inc/computed_fields/panel_data.html' with advanced_ui=computed_fields_advanced_ui %}
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
{% load helpers %}
|
|
2
2
|
{% if custom_fields %}
|
|
3
|
-
<style>
|
|
4
|
-
.accordion-toggle {
|
|
5
|
-
font-size: 14px;
|
|
6
|
-
}
|
|
7
|
-
</style>
|
|
8
3
|
<div class="panel panel-default">
|
|
9
4
|
<div class="panel-heading">
|
|
10
5
|
<strong>Custom Fields</strong>
|
|
11
|
-
<button type="button"
|
|
6
|
+
<button type="button"
|
|
7
|
+
class="btn-xs btn-primary pull-right accordion-toggle-all"
|
|
8
|
+
data-target="#custom_fields_accordion_{{ advanced_ui }}">Collapse All</button>
|
|
12
9
|
</div>
|
|
13
|
-
<table id="
|
|
10
|
+
<table id="custom_fields_accordion_{{ advanced_ui }}" class="table table-hover panel-body attr-table">
|
|
14
11
|
{% for grouping, fields in custom_fields.items %}
|
|
15
12
|
{% with forloop.counter0 as count %}
|
|
16
13
|
{% if grouping != "" %}
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
<a href="{% static 'docs/index.html' %}">Docs</a>
|
|
42
42
|
{% endif %}
|
|
43
43
|
·
|
|
44
|
+
<img src="{% static 'img/jinja_logo.svg' %}" style="height:20px"> <a href="{% url 'render_jinja_template' %}">Jinja Renderer</a> ·
|
|
44
45
|
<i class="mdi mdi-cloud-braces text-primary"></i> <a href="{% url 'api_docs' %}">API</a> ·
|
|
45
46
|
<i class="mdi mdi-graphql text-primary"></i> <a href="{% url 'graphql' %}">GraphQL</a> ·
|
|
46
47
|
<i class="mdi mdi-xml text-primary"></i> <a href="{{ settings.BRANDING_URLS.code }}">Code</a> ·
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
{% endcomment %}
|
|
57
57
|
{% url button_details.link as button_url %}
|
|
58
58
|
{% if button_url %}
|
|
59
|
-
<a href="{{ button_url }}"
|
|
59
|
+
<a href="{{ button_url }}{{ button_details.querystring }}"
|
|
60
60
|
data-button-weight="{{ button_details.weight }}"
|
|
61
61
|
class="btn btn-xs btn-{{ button_details.button_class }}"
|
|
62
62
|
title="{{ button_title }}">
|
|
@@ -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>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<strong>Relationships</strong>
|
|
8
8
|
</div>
|
|
9
9
|
<table class="table table-hover panel-body attr-table">
|
|
10
|
-
{% include 'inc/relationships_table_rows.html' with relationships_data=
|
|
10
|
+
{% include 'inc/relationships_table_rows.html' with relationships_data=relationships %}
|
|
11
11
|
</table>
|
|
12
12
|
</div>
|
|
13
13
|
{% endif %}
|
|
@@ -364,6 +364,9 @@ SECRET_KEY = os.getenv("NAUTOBOT_SECRET_KEY", "{{ secret_key }}")
|
|
|
364
364
|
# if "NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY" in os.environ and os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"] != "":
|
|
365
365
|
# DEVICE_NAME_AS_NATURAL_KEY = is_truthy(os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"])
|
|
366
366
|
|
|
367
|
+
# Event Brokers
|
|
368
|
+
# EVENT_BROKERS = {}
|
|
369
|
+
|
|
367
370
|
# Exempt certain models from the enforcement of view permissions. Models listed here will be viewable by all users and
|
|
368
371
|
# by anonymous users. List models in the form `<app>.<model>`. Add '*' to this list to exempt all models.
|
|
369
372
|
# Defaults to [].
|
|
@@ -460,6 +463,16 @@ INSTALLATION_METRICS_ENABLED = is_truthy(os.getenv("NAUTOBOT_INSTALLATION_METRIC
|
|
|
460
463
|
#
|
|
461
464
|
# NAPALM_ARGS = {}
|
|
462
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
|
+
|
|
463
476
|
# Default number of objects to display per page of the UI and REST API. Default is 50
|
|
464
477
|
#
|
|
465
478
|
# if "NAUTOBOT_PAGINATE_COUNT" in os.environ and os.environ["NAUTOBOT_PAGINATE_COUNT"] != "":
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{% load render_table from django_tables2 %}
|
|
2
|
+
{% load helpers %}
|
|
2
3
|
|
|
3
4
|
<div class="panel panel-{{ panel_class|default:'default' }}">
|
|
4
5
|
{% if heading %}
|
|
@@ -13,4 +14,15 @@
|
|
|
13
14
|
{% else %}
|
|
14
15
|
<div class="panel-body text-muted">None</div>
|
|
15
16
|
{% endif %}
|
|
17
|
+
{% if add_obj_url %}
|
|
18
|
+
<div class="panel-footer noprint">
|
|
19
|
+
<div class="pull-right">
|
|
20
|
+
<a href="{{ add_obj_url }}" class="btn btn-primary btn-xs">
|
|
21
|
+
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add {{ table.data.data.model|meta:"verbose_name" }}
|
|
22
|
+
</a>
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<div class="clearfix"></div>
|
|
26
|
+
</div>
|
|
27
|
+
{% endif %}
|
|
16
28
|
</div>
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
{% load form_helpers %}
|
|
3
|
+
{% load helpers %}
|
|
4
|
+
{% load static %}
|
|
5
|
+
|
|
6
|
+
{% block extra_styles %}
|
|
7
|
+
<style type="text/css">
|
|
8
|
+
.button-container {
|
|
9
|
+
margin-bottom: 24px;
|
|
10
|
+
}
|
|
11
|
+
#render_jinja_template_form textarea {
|
|
12
|
+
resize: vertical;
|
|
13
|
+
white-space: pre;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
</style>
|
|
17
|
+
{% endblock extra_styles %}
|
|
18
|
+
|
|
19
|
+
{% block header %}
|
|
20
|
+
<h1>{% block title %}Jinja Template Renderer{% endblock %}</h1>
|
|
21
|
+
<hr>
|
|
22
|
+
{% endblock %}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
{% block content %}
|
|
27
|
+
<form class="form form-horizontal" onsubmit="handleFormSubmit(event)" id="render_jinja_template_form">
|
|
28
|
+
<div class="row">
|
|
29
|
+
<div class="col-lg-6 col-md-6">
|
|
30
|
+
<div class="panel panel-default">
|
|
31
|
+
<div class="panel-heading"><strong>Template</strong></div>
|
|
32
|
+
<div class="panel-body">
|
|
33
|
+
<div class="form-group">
|
|
34
|
+
<label class="col-md-3 control-label required" for="id_template_code">Jinja Template</label>
|
|
35
|
+
<div class="col-md-9">
|
|
36
|
+
<textarea cols="40" rows="10" class="form-control" id="id_template_code" required=""></textarea>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="form-group">
|
|
40
|
+
<label class="col-md-3 control-label" for="id_context">Data</label>
|
|
41
|
+
<div class="col-md-9">
|
|
42
|
+
<textarea cols="40" rows="10" class="form-control" placeholder="{}" id="id_context">{}</textarea>
|
|
43
|
+
<span class="help-block">Enter data in <a href="https://json.org/">JSON</a> format.</span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
<div class="button-container text-right">
|
|
49
|
+
<button type="submit" class="btn btn-primary">Render</button>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="col-lg-6 col-md-6">
|
|
53
|
+
<div class="panel panel-default">
|
|
54
|
+
<div class="panel-heading">
|
|
55
|
+
<strong>Rendered Template</strong>
|
|
56
|
+
<button type="button" class="btn btn-inline btn-default copy-rendered-template" data-clipboard-target="#rendered_template">
|
|
57
|
+
<span class="mdi mdi-content-copy"></span>
|
|
58
|
+
</button>
|
|
59
|
+
</div>
|
|
60
|
+
<div class="panel-body">
|
|
61
|
+
<textarea readonly="readonly" cols="40" rows="23" class="form-control" placeholder="Rendered Template" id="rendered_template"></textarea>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</form>
|
|
67
|
+
{% endblock content %}
|
|
68
|
+
|
|
69
|
+
{% block javascript %}
|
|
70
|
+
{{ block.super }}
|
|
71
|
+
<script>
|
|
72
|
+
new ClipboardJS('.copy-rendered-template');
|
|
73
|
+
const sanitize = function(string) {
|
|
74
|
+
return string.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
75
|
+
};
|
|
76
|
+
async function handleFormSubmit(event) {
|
|
77
|
+
event.preventDefault(); // Prevent default form submission
|
|
78
|
+
|
|
79
|
+
// Check that the context is valid JSON
|
|
80
|
+
const context = document.getElementById("id_context");
|
|
81
|
+
var parsed_context;
|
|
82
|
+
try {
|
|
83
|
+
parsed_context = JSON.parse(context.value);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
context.setCustomValidity("Invalid JSON");
|
|
86
|
+
context.reportValidity();
|
|
87
|
+
context.setCustomValidity("");
|
|
88
|
+
return error;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
const rendered_template = document.getElementById("rendered_template");
|
|
93
|
+
rendered_template.innerHTML = "Loading...";
|
|
94
|
+
const template_code = document.getElementById("id_template_code").value;
|
|
95
|
+
const url = "{% url 'core-api:render_jinja_template' %}";
|
|
96
|
+
const data = {
|
|
97
|
+
template_code: template_code,
|
|
98
|
+
context: parsed_context
|
|
99
|
+
}
|
|
100
|
+
const response = await fetch(url, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
body: JSON.stringify(data),
|
|
103
|
+
headers: {"Content-Type": "application/json", "X-CSRFTOKEN": "{{ csrf_token }}"}
|
|
104
|
+
});
|
|
105
|
+
const responseData = await response.json();
|
|
106
|
+
if (!response.ok) {
|
|
107
|
+
const msg = responseData.detail ? responseData.detail : response.statusText;
|
|
108
|
+
rendered_template.innerHTML = sanitize(`An error occurred:\n\n${msg}`);
|
|
109
|
+
} else {
|
|
110
|
+
rendered_template.innerHTML = sanitize(responseData.rendered_template);
|
|
111
|
+
}
|
|
112
|
+
} catch (error) {
|
|
113
|
+
rendered_template.innerHTML = sanitize(`An error occurred:\n\n${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
</script>
|
|
117
|
+
{% endblock javascript %}
|
|
@@ -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>
|
|
@@ -21,6 +21,7 @@ import yaml
|
|
|
21
21
|
|
|
22
22
|
from nautobot.apps.config import get_app_settings_or_config
|
|
23
23
|
from nautobot.core import forms
|
|
24
|
+
from nautobot.core.constants import PAGINATE_COUNT_DEFAULT
|
|
24
25
|
from nautobot.core.utils import color, config, data, logging as nautobot_logging, lookup
|
|
25
26
|
from nautobot.core.utils.requests import add_nautobot_version_query_param_to_url
|
|
26
27
|
|
|
@@ -118,6 +119,26 @@ def placeholder(value):
|
|
|
118
119
|
return HTML_NONE
|
|
119
120
|
|
|
120
121
|
|
|
122
|
+
@library.filter()
|
|
123
|
+
@register.filter()
|
|
124
|
+
def pre_tag(value):
|
|
125
|
+
"""Render a value within `<pre></pre>` tags to enable formatting.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
value (any): Input value, can be any variable.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
(str): Value wrapped in `<pre></pre>` tags.
|
|
132
|
+
|
|
133
|
+
Example:
|
|
134
|
+
>>> pre_tag("")
|
|
135
|
+
'<pre></pre>'
|
|
136
|
+
>>> pre_tag("hello")
|
|
137
|
+
'<pre>hello</pre>'
|
|
138
|
+
"""
|
|
139
|
+
return format_html("<pre>{}</pre>", value)
|
|
140
|
+
|
|
141
|
+
|
|
121
142
|
@library.filter()
|
|
122
143
|
@register.filter()
|
|
123
144
|
def add_html_id(element_str, id_str):
|
|
@@ -202,6 +223,29 @@ def render_json(value, syntax_highlight=True, pretty_print=False):
|
|
|
202
223
|
|
|
203
224
|
Unless `syntax_highlight=False` is specified, the returned string will be wrapped in a
|
|
204
225
|
`<code class="language-json>` HTML tag to flag it for syntax highlighting by highlight.js.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
value (any): Input value, can be any variable.
|
|
229
|
+
syntax_highlight (bool): Whether to highlight the JSON syntax or not.
|
|
230
|
+
pretty_print (bool): Wraps rendered and highlighted JSON in <pre> tag for better code display.
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
(str): HTML
|
|
234
|
+
'<code class="language-json">{"json_key": "json_value"}</code>' if only syntax_highlight is True
|
|
235
|
+
- or -
|
|
236
|
+
'<pre><code class="language-json">{"json_key": "json_value"}</code></pre>' if both syntax_highlight and pretty_print are True
|
|
237
|
+
- or -
|
|
238
|
+
'{"json_key": "json_value"}' if only pretty_print is True (both syntax_highlight and pretty_print must be True for pretty print)
|
|
239
|
+
|
|
240
|
+
Examples:
|
|
241
|
+
>>> render_json({"key": "value"})
|
|
242
|
+
'<code class="language-json">{"key": "value"}</code>'
|
|
243
|
+
>>> render_json({"key": "value"}, syntax_highlight=False)
|
|
244
|
+
'{"key": "value"}'
|
|
245
|
+
>>> render_json({"key": "value"}, pretty_print=True)
|
|
246
|
+
'<pre><code class="language-json">{"key": "value"}</code></pre>'
|
|
247
|
+
>>> render_json({"key": "value"}, syntax_highlight=False, pretty_print=True)
|
|
248
|
+
'{"key": "value"}'
|
|
205
249
|
"""
|
|
206
250
|
rendered_json = json.dumps(value, indent=4, sort_keys=True, ensure_ascii=False)
|
|
207
251
|
if syntax_highlight:
|
|
@@ -616,6 +660,57 @@ def render_uptime(seconds):
|
|
|
616
660
|
)
|
|
617
661
|
|
|
618
662
|
|
|
663
|
+
@library.filter()
|
|
664
|
+
@register.filter()
|
|
665
|
+
def dbm(value):
|
|
666
|
+
"""Display value as dBm."""
|
|
667
|
+
return f"{value} dBm" if value else placeholder(value)
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
@library.filter()
|
|
671
|
+
@register.filter()
|
|
672
|
+
def hyperlinked_field(value, hyperlink=None):
|
|
673
|
+
"""Render a value as a hyperlink."""
|
|
674
|
+
if not value:
|
|
675
|
+
return placeholder(value)
|
|
676
|
+
hyperlink = hyperlink or value
|
|
677
|
+
return format_html('<a href="{}">{}</a>', hyperlink, value)
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
@library.filter()
|
|
681
|
+
@register.filter()
|
|
682
|
+
def render_content_types(value):
|
|
683
|
+
"""Render sorted by model and app_label ContentTypes value"""
|
|
684
|
+
if not value.exists():
|
|
685
|
+
return HTML_NONE
|
|
686
|
+
output = format_html("<ul>")
|
|
687
|
+
sorted_value = value.order_by("app_label", "model")
|
|
688
|
+
for content_type in sorted_value:
|
|
689
|
+
output += format_html("<li>{content_type}</li>", content_type=content_type)
|
|
690
|
+
output += format_html("</ul>")
|
|
691
|
+
|
|
692
|
+
return output
|
|
693
|
+
|
|
694
|
+
|
|
695
|
+
@library.filter()
|
|
696
|
+
@register.filter()
|
|
697
|
+
def render_ancestor_hierarchy(value):
|
|
698
|
+
"""Renders a nested HTML list representing the hierarchy of ancestors for a given object."""
|
|
699
|
+
result = format_html('<ul class="tree-hierarchy">')
|
|
700
|
+
append_to_result = format_html("</ul>")
|
|
701
|
+
for ancestor in value.ancestors():
|
|
702
|
+
nestable_tag = format_html('<span title="nestable">↺</span>' if getattr(ancestor, "nestable", False) else "")
|
|
703
|
+
result += format_html(
|
|
704
|
+
"<li>{value} {nestable_tag}<ul>", value=hyperlinked_object(ancestor, "name"), nestable_tag=nestable_tag
|
|
705
|
+
)
|
|
706
|
+
append_to_result += format_html("</ul></li>")
|
|
707
|
+
nestable_tag = format_html('<span title="nestable">↺</span>' if getattr(value, "nestable", False) else "")
|
|
708
|
+
result += format_html("<li><strong>{value} {nestable_tag}</strong></li>", value=value, nestable_tag=nestable_tag)
|
|
709
|
+
result += append_to_result
|
|
710
|
+
|
|
711
|
+
return result
|
|
712
|
+
|
|
713
|
+
|
|
619
714
|
#
|
|
620
715
|
# Tags
|
|
621
716
|
#
|
|
@@ -645,15 +740,15 @@ def querystring(request, **kwargs):
|
|
|
645
740
|
|
|
646
741
|
|
|
647
742
|
@register.simple_tag()
|
|
648
|
-
def table_config_button(table, table_name=None, extra_classes=""):
|
|
743
|
+
def table_config_button(table, table_name=None, extra_classes="", disabled=False):
|
|
649
744
|
if table_name is None:
|
|
650
745
|
table_name = table.__class__.__name__
|
|
651
746
|
html_template = (
|
|
652
747
|
'<button type="button" class="btn btn-default {}'
|
|
653
|
-
'" data-toggle="modal" data-target="#{}_config" title="Configure table">'
|
|
748
|
+
'" data-toggle="modal" data-target="#{}_config" {} title="Configure table">'
|
|
654
749
|
'<i class="mdi mdi-cog"></i> Configure</button>'
|
|
655
750
|
)
|
|
656
|
-
return format_html(html_template, extra_classes, table_name)
|
|
751
|
+
return format_html(html_template, extra_classes, table_name, 'disabled="disabled"' if disabled else "")
|
|
657
752
|
|
|
658
753
|
|
|
659
754
|
@register.simple_tag()
|
|
@@ -852,11 +947,11 @@ def saved_view_modal(
|
|
|
852
947
|
elif current_saved_view is not None and not per_page:
|
|
853
948
|
# no changes made, display current saved view pagination count
|
|
854
949
|
param_dict["per_page"] = current_saved_view.config.get(
|
|
855
|
-
"pagination_count", config.get_settings_or_config("PAGINATE_COUNT")
|
|
950
|
+
"pagination_count", config.get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
|
|
856
951
|
)
|
|
857
952
|
else:
|
|
858
953
|
# display default pagination count
|
|
859
|
-
param_dict["per_page"] = config.get_settings_or_config("PAGINATE_COUNT")
|
|
954
|
+
param_dict["per_page"] = config.get_settings_or_config("PAGINATE_COUNT", fallback=PAGINATE_COUNT_DEFAULT)
|
|
860
955
|
|
|
861
956
|
if sort_order:
|
|
862
957
|
# user made changes to saved view sort order
|
|
@@ -955,12 +1050,13 @@ def versioned_static(file_path):
|
|
|
955
1050
|
|
|
956
1051
|
|
|
957
1052
|
@register.simple_tag
|
|
958
|
-
def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui):
|
|
1053
|
+
def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui, base_depth=0):
|
|
959
1054
|
"""Generates a visual representation of a tree record hierarchy using dots.
|
|
960
1055
|
|
|
961
1056
|
Args:
|
|
962
1057
|
tree_depth (range): A range representing the depth of the tree nodes.
|
|
963
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).
|
|
964
1060
|
|
|
965
1061
|
Returns:
|
|
966
1062
|
str: A string containing dots (representing hierarchy levels) if `hide_hierarchy_ui` is False,
|
|
@@ -968,6 +1064,8 @@ def tree_hierarchy_ui_representation(tree_depth, hide_hierarchy_ui):
|
|
|
968
1064
|
"""
|
|
969
1065
|
if hide_hierarchy_ui or tree_depth == 0:
|
|
970
1066
|
return ""
|
|
1067
|
+
if isinstance(base_depth, int): # may be an empty string
|
|
1068
|
+
tree_depth = tree_depth[base_depth:]
|
|
971
1069
|
ui_representation = " ".join(['<i class="mdi mdi-circle-small"></i>' for _ in tree_depth])
|
|
972
1070
|
return mark_safe(ui_representation) # noqa: S308 # suspicious-mark-safe-usage, OK here since its just the `i` tag
|
|
973
1071
|
|