nautobot 2.2.9__py3-none-any.whl → 2.3.0b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/apps/forms.py +4 -0
- nautobot/apps/models.py +10 -1
- nautobot/circuits/__init__.py +0 -1
- nautobot/circuits/apps.py +1 -0
- nautobot/circuits/factory.py +15 -3
- nautobot/circuits/filters.py +13 -0
- nautobot/circuits/forms.py +13 -0
- nautobot/circuits/migrations/0021_alter_circuit_status_alter_circuittermination__path.py +32 -0
- nautobot/circuits/migrations/0022_circuittermination_cloud_network.py +25 -0
- nautobot/circuits/models.py +16 -3
- nautobot/circuits/tables.py +16 -2
- nautobot/circuits/templates/circuits/circuittermination_create.html +10 -2
- nautobot/circuits/templates/circuits/circuittermination_retrieve.html +6 -0
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +6 -1
- nautobot/circuits/tests/test_api.py +7 -5
- nautobot/circuits/tests/test_filters.py +12 -5
- nautobot/circuits/tests/test_models.py +33 -2
- nautobot/circuits/views.py +2 -3
- nautobot/cloud/__init__.py +0 -0
- nautobot/cloud/api/__init__.py +0 -0
- nautobot/cloud/api/serializers.py +54 -0
- nautobot/cloud/api/urls.py +16 -0
- nautobot/cloud/api/views.py +48 -0
- nautobot/cloud/apps.py +13 -0
- nautobot/cloud/factory.py +111 -0
- nautobot/cloud/filters.py +184 -0
- nautobot/cloud/forms.py +333 -0
- nautobot/cloud/homepage.py +43 -0
- nautobot/cloud/migrations/0001_initial.py +304 -0
- nautobot/cloud/migrations/__init__.py +0 -0
- nautobot/cloud/models.py +247 -0
- nautobot/cloud/navigation.py +85 -0
- nautobot/cloud/tables.py +173 -0
- nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
- nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +128 -0
- nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
- nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +100 -0
- nautobot/cloud/templates/cloud/cloudservice_retrieve.html +65 -0
- nautobot/cloud/templates/cloud/cloudservice_update.html +25 -0
- nautobot/cloud/tests/__init__.py +0 -0
- nautobot/cloud/tests/test_api.py +248 -0
- nautobot/cloud/tests/test_filters.py +113 -0
- nautobot/cloud/tests/test_models.py +43 -0
- nautobot/cloud/tests/test_views.py +153 -0
- nautobot/cloud/urls.py +14 -0
- nautobot/cloud/views.py +181 -0
- nautobot/core/__init__.py +0 -3
- nautobot/core/api/metadata.py +1 -0
- nautobot/core/api/parsers.py +7 -1
- nautobot/core/api/urls.py +1 -0
- nautobot/core/api/utils.py +1 -0
- nautobot/core/api/views.py +4 -0
- nautobot/core/apps/__init__.py +6 -3
- nautobot/core/constants.py +8 -0
- nautobot/core/factory.py +32 -1
- nautobot/core/filters.py +96 -28
- nautobot/core/forms/fields.py +10 -4
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/widgets.py +18 -1
- nautobot/core/graphql/generators.py +2 -2
- nautobot/core/graphql/schema.py +34 -4
- nautobot/core/jobs/__init__.py +17 -6
- nautobot/core/jobs/cleanup.py +100 -0
- nautobot/core/jobs/groups.py +38 -0
- nautobot/core/management/commands/generate_test_data.py +116 -3
- nautobot/core/models/__init__.py +34 -9
- nautobot/core/models/generics.py +19 -3
- nautobot/core/models/name_color_content_types.py +7 -28
- nautobot/core/models/querysets.py +4 -3
- nautobot/core/models/tree_queries.py +1 -1
- nautobot/core/models/utils.py +21 -5
- nautobot/core/settings.py +4 -30
- nautobot/core/settings.yaml +34 -27
- nautobot/core/settings_funcs.py +103 -0
- nautobot/core/tables.py +127 -56
- nautobot/core/templates/admin/search_form.html +1 -1
- nautobot/core/templates/buttons/add.html +11 -3
- nautobot/core/templates/buttons/consolidated_bulk_action_buttons.html +13 -0
- nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +13 -0
- nautobot/core/templates/buttons/export.html +101 -53
- nautobot/core/templates/buttons/job_import.html +11 -3
- nautobot/core/templates/generic/object_bulk_destroy.html +3 -1
- nautobot/core/templates/generic/object_bulk_update.html +3 -1
- nautobot/core/templates/generic/object_changelog.html +0 -9
- nautobot/core/templates/generic/object_list.html +156 -17
- nautobot/core/templates/generic/object_retrieve.html +80 -16
- nautobot/core/templates/inc/extras_features_edit_form_fields.html +8 -0
- nautobot/core/templates/inc/javascript.html +2 -0
- nautobot/core/templates/inc/media.html +2 -2
- nautobot/core/templates/inc/nav_menu.html +1 -0
- nautobot/core/templates/inc/paginator.html +7 -7
- nautobot/core/templates/inc/search_panel.html +2 -2
- nautobot/core/templates/inc/table.html +2 -2
- nautobot/core/templates/nautobot_config.py.j2 +13 -23
- nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +37 -0
- nautobot/core/templates/utilities/templatetags/filter_form_modal.html +2 -2
- nautobot/core/templates/utilities/templatetags/saved_view_modal.html +38 -0
- nautobot/core/templates/utilities/theme_preview.html +25 -8
- nautobot/core/templates/utilities/worker_status.html +152 -0
- nautobot/core/templatetags/buttons.py +335 -38
- nautobot/core/templatetags/form_helpers.py +1 -1
- nautobot/core/templatetags/helpers.py +181 -11
- nautobot/core/testing/api.py +5 -4
- nautobot/core/testing/filters.py +51 -13
- nautobot/core/testing/mixins.py +46 -0
- nautobot/core/testing/models.py +22 -0
- nautobot/core/testing/schema.py +4 -8
- nautobot/core/testing/views.py +31 -14
- nautobot/core/tests/integration/test_general_functionality.py +1 -1
- nautobot/core/tests/integration/test_import_objects_ui.py +1 -0
- nautobot/core/tests/integration/test_swagger.py +1 -1
- nautobot/core/tests/nautobot_config.py +0 -1
- nautobot/core/tests/runner.py +2 -2
- nautobot/core/tests/test_api.py +1 -0
- nautobot/core/tests/test_authentication.py +7 -2
- nautobot/core/tests/test_filters.py +11 -9
- nautobot/core/tests/test_forms.py +9 -0
- nautobot/core/tests/test_graphql.py +27 -16
- nautobot/core/tests/test_jobs.py +123 -74
- nautobot/core/tests/test_tables.py +3 -1
- nautobot/core/tests/test_templatetags_helpers.py +12 -5
- nautobot/core/tests/test_utils.py +31 -20
- nautobot/core/tests/test_views.py +6 -6
- nautobot/core/urls.py +8 -3
- nautobot/core/utils/deprecation.py +29 -0
- nautobot/core/utils/filtering.py +12 -9
- nautobot/core/utils/lookup.py +37 -2
- nautobot/core/utils/requests.py +4 -1
- nautobot/core/views/__init__.py +137 -24
- nautobot/core/views/generic.py +118 -66
- nautobot/core/views/mixins.py +104 -35
- nautobot/core/views/paginator.py +9 -3
- nautobot/core/views/renderers.py +121 -56
- nautobot/core/views/utils.py +79 -1
- nautobot/dcim/__init__.py +0 -1
- nautobot/dcim/api/serializers.py +180 -44
- nautobot/dcim/api/urls.py +7 -3
- nautobot/dcim/api/views.py +53 -7
- nautobot/dcim/apps.py +3 -0
- nautobot/dcim/choices.py +25 -0
- nautobot/dcim/constants.py +7 -0
- nautobot/dcim/factory.py +249 -18
- nautobot/dcim/filters/__init__.py +369 -193
- nautobot/dcim/filters/mixins.py +274 -1
- nautobot/dcim/forms.py +817 -109
- nautobot/dcim/graphql/types.py +2 -2
- nautobot/dcim/homepage.py +1 -1
- nautobot/dcim/migrations/0059_add_role_field_to_interface_models.py +27 -0
- nautobot/dcim/migrations/0060_alter_cable_status_alter_consoleport__path_and_more.py +303 -0
- nautobot/dcim/migrations/0061_module_models.py +861 -0
- nautobot/dcim/migrations/0062_module_data_migration.py +25 -0
- nautobot/dcim/models/__init__.py +8 -0
- nautobot/dcim/models/cables.py +15 -0
- nautobot/dcim/models/device_component_templates.py +207 -53
- nautobot/dcim/models/device_components.py +275 -106
- nautobot/dcim/models/devices.py +466 -13
- nautobot/dcim/navigation.py +47 -0
- nautobot/dcim/signals.py +3 -3
- nautobot/dcim/tables/__init__.py +35 -23
- nautobot/dcim/tables/devices.py +231 -59
- nautobot/dcim/tables/devicetypes.py +65 -9
- nautobot/dcim/tables/racks.py +5 -1
- nautobot/dcim/tables/template_code.py +46 -26
- nautobot/dcim/templates/dcim/cable_connect.html +76 -3
- nautobot/dcim/templates/dcim/console_port_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/device/base.html +15 -7
- nautobot/dcim/templates/dcim/device/consoleports.html +2 -3
- nautobot/dcim/templates/dcim/device/consoleserverports.html +2 -3
- nautobot/dcim/templates/dcim/device/devicebays.html +6 -7
- nautobot/dcim/templates/dcim/device/frontports.html +2 -3
- nautobot/dcim/templates/dcim/device/interfaces.html +2 -3
- nautobot/dcim/templates/dcim/device/inventory.html +2 -3
- nautobot/dcim/templates/dcim/device/modulebays.html +49 -0
- nautobot/dcim/templates/dcim/device/poweroutlets.html +2 -3
- nautobot/dcim/templates/dcim/device/powerports.html +2 -3
- nautobot/dcim/templates/dcim/device/rearports.html +2 -3
- nautobot/dcim/templates/dcim/device.html +45 -1
- nautobot/dcim/templates/dcim/device_component.html +13 -5
- nautobot/dcim/templates/dcim/device_list.html +2 -1
- nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -6
- nautobot/dcim/templates/dcim/devicetype.html +99 -98
- nautobot/dcim/templates/dcim/devicetype_list.html +8 -16
- nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
- nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +39 -0
- nautobot/dcim/templates/dcim/interface.html +17 -2
- nautobot/dcim/templates/dcim/interface_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/interface_edit.html +1 -0
- nautobot/dcim/templates/dcim/manufacturer.html +24 -0
- nautobot/dcim/templates/dcim/module/base.html +97 -0
- nautobot/dcim/templates/dcim/module_bulk_destroy.html +5 -0
- nautobot/dcim/templates/dcim/module_consoleports.html +53 -0
- nautobot/dcim/templates/dcim/module_consoleserverports.html +53 -0
- nautobot/dcim/templates/dcim/module_destroy.html +5 -0
- nautobot/dcim/templates/dcim/module_frontports.html +53 -0
- nautobot/dcim/templates/dcim/module_interfaces.html +57 -0
- nautobot/dcim/templates/dcim/module_list.html +20 -0
- nautobot/dcim/templates/dcim/module_modulebays.html +49 -0
- nautobot/dcim/templates/dcim/module_poweroutlets.html +53 -0
- nautobot/dcim/templates/dcim/module_powerports.html +53 -0
- nautobot/dcim/templates/dcim/module_rearports.html +53 -0
- nautobot/dcim/templates/dcim/module_retrieve.html +63 -0
- nautobot/dcim/templates/dcim/module_update.html +71 -0
- nautobot/dcim/templates/dcim/modulebay_bulk_destroy.html +5 -0
- nautobot/dcim/templates/dcim/modulebay_destroy.html +8 -0
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +101 -0
- nautobot/dcim/templates/dcim/moduletype_list.html +11 -0
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +142 -0
- nautobot/dcim/templates/dcim/power_port_connection_list.html +7 -5
- nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +65 -19
- nautobot/dcim/tests/integration/test_cable_connect_form.py +4 -4
- nautobot/dcim/tests/test_api.py +691 -208
- nautobot/dcim/tests/test_filters.py +836 -217
- nautobot/dcim/tests/test_models.py +1072 -39
- nautobot/dcim/tests/test_views.py +1488 -358
- nautobot/dcim/urls.py +17 -2
- nautobot/dcim/utils.py +2 -3
- nautobot/dcim/views.py +1107 -120
- nautobot/extras/__init__.py +0 -1
- nautobot/extras/api/serializers.py +115 -3
- nautobot/extras/api/urls.py +12 -0
- nautobot/extras/api/views.py +125 -7
- nautobot/extras/apps.py +2 -2
- nautobot/extras/choices.py +43 -0
- nautobot/extras/context_managers.py +13 -8
- nautobot/extras/datasources/git.py +2 -0
- nautobot/extras/factory.py +422 -9
- nautobot/extras/filters/__init__.py +174 -3
- nautobot/extras/filters/mixins.py +46 -43
- nautobot/extras/forms/base.py +17 -4
- nautobot/extras/forms/forms.py +227 -8
- nautobot/extras/forms/mixins.py +93 -0
- nautobot/extras/graphql/types.py +23 -10
- nautobot/extras/homepage.py +16 -13
- nautobot/extras/jobs.py +2 -2
- nautobot/extras/management/__init__.py +1 -0
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +1 -16
- nautobot/extras/migrations/0021_customfield_changelog_data.py +1 -0
- nautobot/extras/migrations/0109_dynamicgroup_group_type_dynamicgroup_tags_and_more.py +108 -0
- nautobot/extras/migrations/0110_alter_configcontext_cluster_groups_and_more.py +111 -0
- nautobot/extras/migrations/0111_metadata.py +162 -0
- nautobot/extras/migrations/0112_dynamic_group_group_type_data_migration.py +28 -0
- nautobot/extras/migrations/0113_saved_views.py +77 -0
- nautobot/extras/models/__init__.py +15 -1
- nautobot/extras/models/change_logging.py +3 -3
- nautobot/extras/models/contacts.py +4 -0
- nautobot/extras/models/customfields.py +18 -3
- nautobot/extras/models/groups.py +389 -225
- nautobot/extras/models/jobs.py +4 -84
- nautobot/extras/models/metadata.py +441 -0
- nautobot/extras/models/mixins.py +72 -62
- nautobot/extras/models/models.py +116 -9
- nautobot/extras/models/relationships.py +9 -2
- nautobot/extras/models/tags.py +13 -2
- nautobot/extras/navigation.py +57 -0
- nautobot/extras/plugins/__init__.py +3 -1
- nautobot/extras/querysets.py +30 -66
- nautobot/extras/signals.py +96 -114
- nautobot/extras/tables.py +171 -47
- nautobot/extras/templates/extras/dynamicgroup.html +44 -15
- nautobot/extras/templates/extras/dynamicgroup_edit.html +2 -0
- nautobot/extras/templates/extras/job.html +1 -1
- nautobot/extras/templates/extras/job_detail.html +0 -11
- nautobot/extras/templates/extras/jobresult.html +61 -74
- nautobot/extras/templates/extras/metadatatype_create.html +89 -0
- nautobot/extras/templates/extras/metadatatype_retrieve.html +67 -0
- nautobot/extras/templates/extras/object_dynamicgroups.html +7 -0
- nautobot/extras/templates/extras/objectchange_list.html +0 -12
- nautobot/extras/templates/extras/plugins_list.html +1 -3
- nautobot/extras/templates/extras/role_retrieve.html +48 -0
- nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +20 -0
- nautobot/extras/tests/integration/test_customfields.py +1 -0
- nautobot/extras/tests/test_api.py +501 -22
- nautobot/extras/tests/test_changelog.py +20 -9
- nautobot/extras/tests/test_context_managers.py +22 -15
- nautobot/extras/tests/test_datasources.py +13 -1
- nautobot/extras/tests/test_dynamicgroups.py +201 -171
- nautobot/extras/tests/test_filters.py +211 -12
- nautobot/extras/tests/test_jobs.py +4 -4
- nautobot/extras/tests/test_models.py +499 -4
- nautobot/extras/tests/test_relationships.py +1 -0
- nautobot/extras/tests/test_views.py +565 -28
- nautobot/extras/tests/test_webhooks.py +1 -1
- nautobot/extras/urls.py +5 -0
- nautobot/extras/utils.py +56 -45
- nautobot/extras/views.py +585 -96
- nautobot/ipam/__init__.py +0 -1
- nautobot/ipam/apps.py +1 -0
- nautobot/ipam/factory.py +17 -19
- nautobot/ipam/filters.py +14 -1
- nautobot/ipam/forms.py +9 -5
- nautobot/ipam/graphql/types.py +2 -2
- nautobot/ipam/migrations/0047_alter_ipaddress_role_alter_ipaddress_status_and_more.py +59 -0
- nautobot/ipam/models.py +23 -9
- nautobot/ipam/querysets.py +1 -1
- nautobot/ipam/signals.py +4 -2
- nautobot/ipam/tables.py +1 -0
- nautobot/ipam/templates/ipam/ipaddress_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/prefix.html +1 -0
- nautobot/ipam/tests/test_api.py +37 -18
- nautobot/ipam/tests/test_filters.py +26 -2
- nautobot/ipam/tests/test_models.py +8 -3
- nautobot/ipam/tests/test_querysets.py +1 -1
- nautobot/ipam/tests/test_views.py +3 -2
- nautobot/ipam/urls.py +2 -2
- nautobot/ipam/views.py +25 -28
- nautobot/project-static/css/base.css +20 -1
- nautobot/project-static/css/dark.css +11 -0
- nautobot/project-static/docs/404.html +884 -80
- nautobot/project-static/docs/apps/index.html +884 -80
- nautobot/project-static/docs/apps/nautobot-apps.html +884 -80
- nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +911 -112
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +896 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1457 -790
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +927 -136
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +969 -180
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +893 -91
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +889 -85
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +983 -185
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +938 -143
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1064 -274
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1190 -346
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1663 -865
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1156 -373
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2200 -1502
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2229 -1421
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +904 -103
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +955 -155
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1002 -215
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1911 -1275
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1835 -1091
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +896 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2323 -1693
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1785 -1023
- nautobot/project-static/docs/development/apps/api/configuration-view.html +884 -80
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/global-search.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/graphql.html +884 -80
- nautobot/project-static/docs/development/apps/api/models/index.html +922 -81
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +884 -80
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +884 -80
- nautobot/project-static/docs/development/apps/api/prometheus.html +884 -80
- nautobot/project-static/docs/development/apps/api/setup.html +884 -80
- nautobot/project-static/docs/development/apps/api/testing.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +884 -80
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/base-template.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/index.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/notes.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +884 -80
- nautobot/project-static/docs/development/apps/api/views/urls.html +884 -80
- nautobot/project-static/docs/development/apps/index.html +884 -80
- nautobot/project-static/docs/development/apps/migration/code-updates.html +884 -80
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +884 -80
- nautobot/project-static/docs/development/apps/migration/from-v1.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +884 -80
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +884 -80
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +884 -80
- nautobot/project-static/docs/development/core/application-registry.html +884 -80
- nautobot/project-static/docs/development/core/best-practices.html +885 -80
- nautobot/project-static/docs/development/core/bootstrap-ui.html +884 -80
- nautobot/project-static/docs/development/core/caching.html +884 -80
- nautobot/project-static/docs/development/core/controllers.html +884 -80
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +884 -80
- nautobot/project-static/docs/development/core/generic-views.html +884 -80
- nautobot/project-static/docs/development/core/getting-started.html +884 -80
- nautobot/project-static/docs/development/core/homepage.html +884 -80
- nautobot/project-static/docs/development/core/index.html +884 -91
- nautobot/project-static/docs/development/core/model-checklist.html +887 -81
- nautobot/project-static/docs/development/core/model-features.html +884 -80
- nautobot/project-static/docs/development/core/natural-keys.html +884 -80
- nautobot/project-static/docs/development/core/navigation-menu.html +884 -80
- nautobot/project-static/docs/development/core/release-checklist.html +887 -83
- nautobot/project-static/docs/development/core/role-internals.html +884 -80
- nautobot/project-static/docs/development/core/settings.html +884 -80
- nautobot/project-static/docs/development/core/style-guide.html +885 -81
- nautobot/project-static/docs/development/core/templates.html +896 -81
- nautobot/project-static/docs/development/core/testing.html +884 -80
- nautobot/project-static/docs/development/core/user-preferences.html +884 -80
- nautobot/project-static/docs/development/index.html +884 -80
- nautobot/project-static/docs/development/jobs/index.html +1247 -457
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +884 -80
- nautobot/project-static/docs/index.html +13 -8228
- nautobot/project-static/docs/media/models/cloud_aws_direct_connect_dark.png +0 -0
- nautobot/project-static/docs/media/models/cloud_aws_direct_connect_light.png +0 -0
- nautobot/project-static/docs/models/cloud/cloudaccount.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudnetwork.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudnetworkprefixassignment.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudresourcetype.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudservice.html +15 -0
- nautobot/project-static/docs/models/cloud/cloudservicenetworkassignment.html +15 -0
- nautobot/project-static/docs/models/dcim/module.html +15 -0
- nautobot/project-static/docs/models/dcim/modulebay.html +15 -0
- nautobot/project-static/docs/models/dcim/modulebaytemplate.html +15 -0
- nautobot/project-static/docs/models/dcim/moduletype.html +15 -0
- nautobot/project-static/docs/models/extras/metadatachoice.html +15 -0
- nautobot/project-static/docs/models/extras/metadatatype.html +15 -0
- nautobot/project-static/docs/models/extras/objectmetadata.html +15 -0
- nautobot/project-static/docs/models/extras/role.html +15 -0
- nautobot/project-static/docs/models/extras/savedview.html +15 -0
- nautobot/project-static/docs/models/extras/staticgroupassociation.html +15 -0
- nautobot/project-static/docs/models/extras/status.html +15 -0
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +892 -81
- nautobot/project-static/docs/overview/design_philosophy.html +886 -82
- nautobot/project-static/docs/overview/index.html +9032 -13
- nautobot/project-static/docs/release-notes/index.html +887 -83
- nautobot/project-static/docs/release-notes/version-1.0.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.1.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.2.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.3.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.4.html +884 -80
- nautobot/project-static/docs/release-notes/version-1.5.html +885 -81
- nautobot/project-static/docs/release-notes/version-1.6.html +885 -81
- nautobot/project-static/docs/release-notes/version-2.0.html +884 -80
- nautobot/project-static/docs/release-notes/version-2.1.html +884 -80
- nautobot/project-static/docs/release-notes/version-2.2.html +990 -323
- nautobot/project-static/docs/release-notes/version-2.3.html +9524 -0
- nautobot/project-static/docs/requirements.txt +4 -4
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +335 -260
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +983 -197
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +884 -80
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +888 -84
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +884 -80
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/index.html +888 -80
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation/services.html +888 -80
- nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +900 -91
- nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +884 -80
- nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +884 -80
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +884 -80
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +884 -80
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +915 -163
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +884 -80
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +885 -81
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +888 -80
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +887 -83
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloud.html +8984 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudaccount.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetwork.html +8829 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudnetworkprefixassignment.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudresourcetype.html +8829 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservice.html +8833 -0
- nautobot/project-static/docs/user-guide/core-data-model/cloud/cloudservicenetworkassignment.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/cable.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +910 -92
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +915 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +905 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +912 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +913 -109
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +906 -97
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +918 -100
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +928 -110
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +920 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +929 -111
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +920 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +913 -109
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +914 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/module.html +8828 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebay.html +8846 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/modulebaytemplate.html +8843 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/moduletype.html +8823 -0
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +932 -75
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +916 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +935 -78
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +913 -95
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +921 -117
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +910 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +914 -96
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +916 -98
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +898 -94
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +889 -81
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +889 -81
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +893 -88
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +884 -80
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +889 -81
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/clear-view-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/cleared-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/config-table-columns-to-locations.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/configure-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/create-saved-view-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/current-saved-view-drop-down-menu.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/default-location-list-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/dropdown-button-after-new-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-application-to-locations.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/filter-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/global-default-location-list-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/location-list-view-with-saved-views.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/navigation-menu.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-as-new-view-drop-down.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/save-view-modal.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-buttons.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view-unchecked.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-admin-edit-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-different-user.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/saved-view-modal-unchecked.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-button.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/set-as-my-default-success.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/unsaved-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/images/saved-views/updated-saved-view.png +0 -0
- nautobot/project-static/docs/user-guide/feature-guides/ip-address-merge-tool.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +884 -80
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +884 -80
- nautobot/project-static/docs/user-guide/index.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1250 -777
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +888 -80
- nautobot/project-static/docs/user-guide/platform-functionality/metadata.html +8948 -0
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +887 -83
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +942 -113
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +884 -80
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +884 -80
- nautobot/project-static/js/forms.js +71 -0
- nautobot/project-static/js/table_sorting_indicator.js +46 -0
- nautobot/project-static/js/tableconfig.js +6 -1
- nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +3 -0
- nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.eot +0 -0
- nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/fonts/materialdesignicons-webfont.ttf +0 -0
- nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff +0 -0
- nautobot/project-static/materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 +0 -0
- nautobot/tenancy/__init__.py +0 -1
- nautobot/tenancy/apps.py +1 -0
- nautobot/tenancy/factory.py +3 -2
- nautobot/tenancy/filters/__init__.py +1 -0
- nautobot/tenancy/forms.py +1 -1
- nautobot/tenancy/templates/tenancy/tenant.html +22 -18
- nautobot/tenancy/views.py +11 -10
- nautobot/users/__init__.py +0 -1
- nautobot/users/api/serializers.py +1 -1
- nautobot/users/api/views.py +4 -2
- nautobot/users/apps.py +3 -2
- nautobot/users/factory.py +3 -3
- nautobot/users/migrations/0010_user_default_saved_views.py +20 -0
- nautobot/users/models.py +12 -0
- nautobot/users/tests/test_filters.py +6 -3
- nautobot/users/urls.py +8 -0
- nautobot/virtualization/__init__.py +0 -1
- nautobot/virtualization/apps.py +1 -0
- nautobot/virtualization/filters.py +6 -1
- nautobot/virtualization/forms.py +11 -3
- nautobot/virtualization/graphql/types.py +2 -2
- nautobot/virtualization/migrations/0029_add_role_field_to_interface_models.py +27 -0
- nautobot/virtualization/migrations/0030_alter_virtualmachine_local_config_context_data_owner_content_type_and_more.py +67 -0
- nautobot/virtualization/tables.py +15 -5
- nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
- nautobot/virtualization/templates/virtualization/vminterface.html +7 -1
- nautobot/virtualization/templates/virtualization/vminterface_edit.html +1 -0
- nautobot/virtualization/tests/test_api.py +9 -4
- nautobot/virtualization/tests/test_filters.py +22 -0
- nautobot/virtualization/tests/test_models.py +7 -3
- nautobot/virtualization/tests/test_views.py +19 -3
- nautobot/virtualization/urls.py +2 -2
- nautobot/virtualization/views.py +10 -32
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/METADATA +21 -19
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/RECORD +679 -559
- nautobot/project-static/materialdesignicons-6.5.95/.github/ISSUE_TEMPLATE.md +0 -3
- nautobot/project-static/materialdesignicons-6.5.95/README.md +0 -25
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css +0 -26654
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.css.map +0 -16
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css +0 -3
- nautobot/project-static/materialdesignicons-6.5.95/css/materialdesignicons.min.css.map +0 -16
- nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff +0 -0
- nautobot/project-static/materialdesignicons-6.5.95/fonts/materialdesignicons-webfont.woff2 +0 -0
- nautobot/project-static/materialdesignicons-6.5.95/package.json +0 -28
- nautobot/project-static/materialdesignicons-6.5.95/preview.html +0 -717
- nautobot/project-static/materialdesignicons-6.5.95/scss/_animated.scss +0 -27
- nautobot/project-static/materialdesignicons-6.5.95/scss/_core.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_extras.scss +0 -65
- nautobot/project-static/materialdesignicons-6.5.95/scss/_functions.scss +0 -20
- nautobot/project-static/materialdesignicons-6.5.95/scss/_icons.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_path.scss +0 -10
- nautobot/project-static/materialdesignicons-6.5.95/scss/_variables.scss +0 -6606
- nautobot/project-static/materialdesignicons-6.5.95/scss/materialdesignicons.scss +0 -8
- /nautobot/project-static/{materialdesignicons-6.5.95 → materialdesignicons-7.4.47}/LICENSE +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/NOTICE +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/WHEEL +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0b1.dist-info}/entry_points.txt +0 -0
|
@@ -2,6 +2,7 @@ import hashlib
|
|
|
2
2
|
import json
|
|
3
3
|
import os
|
|
4
4
|
|
|
5
|
+
from django.contrib.contenttypes.models import ContentType
|
|
5
6
|
from django.core.management import call_command
|
|
6
7
|
from django.core.management.base import BaseCommand, CommandError
|
|
7
8
|
from django.core.serializers.json import DjangoJSONEncoder
|
|
@@ -68,30 +69,56 @@ class Command(BaseCommand):
|
|
|
68
69
|
ProviderFactory,
|
|
69
70
|
ProviderNetworkFactory,
|
|
70
71
|
)
|
|
72
|
+
from nautobot.cloud.factory import (
|
|
73
|
+
CloudAccountFactory,
|
|
74
|
+
CloudNetworkFactory,
|
|
75
|
+
CloudResourceTypeFactory,
|
|
76
|
+
CloudServiceFactory,
|
|
77
|
+
)
|
|
71
78
|
from nautobot.dcim.factory import (
|
|
79
|
+
ConsolePortTemplateFactory,
|
|
80
|
+
ConsoleServerPortTemplateFactory,
|
|
72
81
|
ControllerFactory,
|
|
73
82
|
ControllerManagedDeviceGroupFactory,
|
|
74
83
|
DeviceFactory,
|
|
75
84
|
DeviceFamilyFactory,
|
|
76
85
|
DeviceRedundancyGroupFactory,
|
|
77
86
|
DeviceTypeFactory,
|
|
87
|
+
FrontPortTemplateFactory,
|
|
88
|
+
InterfaceTemplateFactory,
|
|
78
89
|
LocationFactory,
|
|
79
90
|
LocationTypeFactory,
|
|
80
91
|
ManufacturerFactory,
|
|
92
|
+
ModuleBayTemplateFactory,
|
|
93
|
+
ModuleFactory,
|
|
94
|
+
ModuleTypeFactory,
|
|
81
95
|
PlatformFactory,
|
|
96
|
+
PowerOutletTemplateFactory,
|
|
97
|
+
PowerPortTemplateFactory,
|
|
98
|
+
RearPortTemplateFactory,
|
|
82
99
|
SoftwareImageFileFactory,
|
|
83
100
|
SoftwareVersionFactory,
|
|
84
101
|
)
|
|
102
|
+
from nautobot.extras.choices import MetadataTypeDataTypeChoices
|
|
85
103
|
from nautobot.extras.factory import (
|
|
86
104
|
ContactFactory,
|
|
105
|
+
DynamicGroupFactory,
|
|
87
106
|
ExternalIntegrationFactory,
|
|
107
|
+
JobLogEntryFactory,
|
|
108
|
+
JobResultFactory,
|
|
109
|
+
MetadataChoiceFactory,
|
|
110
|
+
MetadataTypeFactory,
|
|
111
|
+
ObjectChangeFactory,
|
|
112
|
+
ObjectMetadataFactory,
|
|
88
113
|
RoleFactory,
|
|
114
|
+
SavedViewFactory,
|
|
89
115
|
StatusFactory,
|
|
90
116
|
TagFactory,
|
|
91
117
|
TeamFactory,
|
|
92
118
|
)
|
|
93
119
|
from nautobot.extras.management import populate_role_choices, populate_status_choices
|
|
94
|
-
from nautobot.extras.
|
|
120
|
+
from nautobot.extras.models import MetadataType
|
|
121
|
+
from nautobot.extras.utils import FeatureQuery, TaggableClassesQuery
|
|
95
122
|
from nautobot.ipam.choices import PrefixTypeChoices
|
|
96
123
|
from nautobot.ipam.factory import (
|
|
97
124
|
NamespaceFactory,
|
|
@@ -103,6 +130,7 @@ class Command(BaseCommand):
|
|
|
103
130
|
VRFFactory,
|
|
104
131
|
)
|
|
105
132
|
from nautobot.tenancy.factory import TenantFactory, TenantGroupFactory
|
|
133
|
+
from nautobot.users.factory import UserFactory
|
|
106
134
|
except ImportError as err:
|
|
107
135
|
raise CommandError('Unable to load data factories. Is the "factory-boy" package installed?') from err
|
|
108
136
|
|
|
@@ -133,6 +161,8 @@ class Command(BaseCommand):
|
|
|
133
161
|
)
|
|
134
162
|
# ...and some tags that apply to a random subset of content-types
|
|
135
163
|
_create_batch(TagFactory, 15, description="on some content-types")
|
|
164
|
+
_create_batch(UserFactory, 5)
|
|
165
|
+
_create_batch(SavedViewFactory, 20)
|
|
136
166
|
_create_batch(ContactFactory, 20)
|
|
137
167
|
_create_batch(TeamFactory, 20)
|
|
138
168
|
_create_batch(TenantGroupFactory, 10, description="without parents", has_parent=False)
|
|
@@ -176,11 +206,25 @@ class Command(BaseCommand):
|
|
|
176
206
|
_create_batch(SoftwareImageFileFactory, 25, description="to be usable by DeviceTypes")
|
|
177
207
|
_create_batch(ManufacturerFactory, 4, description="without Platforms") # 4 more hard-coded Manufacturers
|
|
178
208
|
_create_batch(DeviceTypeFactory, 30)
|
|
209
|
+
_create_batch(ModuleTypeFactory, 20)
|
|
210
|
+
_create_batch(ConsolePortTemplateFactory, 30)
|
|
211
|
+
_create_batch(ConsoleServerPortTemplateFactory, 30)
|
|
212
|
+
_create_batch(RearPortTemplateFactory, 30)
|
|
213
|
+
_create_batch(FrontPortTemplateFactory, 30)
|
|
214
|
+
_create_batch(InterfaceTemplateFactory, 30)
|
|
215
|
+
_create_batch(PowerPortTemplateFactory, 30)
|
|
216
|
+
_create_batch(PowerOutletTemplateFactory, 30)
|
|
217
|
+
_create_batch(ModuleBayTemplateFactory, 90)
|
|
179
218
|
_create_batch(ManufacturerFactory, 2, description="without Platforms or DeviceTypes") # Last 2 hard-coded
|
|
180
219
|
_create_batch(DeviceRedundancyGroupFactory, 20)
|
|
181
220
|
_create_batch(DeviceFactory, 20)
|
|
221
|
+
_create_batch(ModuleFactory, 20)
|
|
182
222
|
_create_batch(SoftwareVersionFactory, 5, description="without Devices")
|
|
183
223
|
_create_batch(SoftwareImageFileFactory, 5, description="without DeviceTypes")
|
|
224
|
+
_create_batch(CloudAccountFactory, 10)
|
|
225
|
+
_create_batch(CloudResourceTypeFactory, 20)
|
|
226
|
+
_create_batch(CloudNetworkFactory, 20)
|
|
227
|
+
_create_batch(CloudServiceFactory, 20)
|
|
184
228
|
_create_batch(CircuitTypeFactory, 40)
|
|
185
229
|
_create_batch(ProviderFactory, 20, description="to be usable by Circuits")
|
|
186
230
|
_create_batch(ProviderNetworkFactory, 20)
|
|
@@ -207,6 +251,38 @@ class Command(BaseCommand):
|
|
|
207
251
|
has_location=False,
|
|
208
252
|
term_side="Z",
|
|
209
253
|
)
|
|
254
|
+
_create_batch(
|
|
255
|
+
CircuitTerminationFactory,
|
|
256
|
+
2,
|
|
257
|
+
description="with a cloud network, for side A",
|
|
258
|
+
has_location=False,
|
|
259
|
+
has_cloud_network=True,
|
|
260
|
+
term_side="A",
|
|
261
|
+
)
|
|
262
|
+
_create_batch(
|
|
263
|
+
CircuitTerminationFactory,
|
|
264
|
+
2,
|
|
265
|
+
description="with a cloud network, for side Z",
|
|
266
|
+
has_location=False,
|
|
267
|
+
has_cloud_network=True,
|
|
268
|
+
term_side="Z",
|
|
269
|
+
)
|
|
270
|
+
_create_batch(
|
|
271
|
+
CircuitTerminationFactory,
|
|
272
|
+
2,
|
|
273
|
+
description="with a provider network, for side A",
|
|
274
|
+
has_location=False,
|
|
275
|
+
has_cloud_network=False,
|
|
276
|
+
term_side="A",
|
|
277
|
+
)
|
|
278
|
+
_create_batch(
|
|
279
|
+
CircuitTerminationFactory,
|
|
280
|
+
2,
|
|
281
|
+
description="with a provider network, for side Z",
|
|
282
|
+
has_location=False,
|
|
283
|
+
has_cloud_network=False,
|
|
284
|
+
term_side="Z",
|
|
285
|
+
)
|
|
210
286
|
_create_batch(
|
|
211
287
|
CircuitTerminationFactory,
|
|
212
288
|
2,
|
|
@@ -239,6 +315,37 @@ class Command(BaseCommand):
|
|
|
239
315
|
# _create_batch(ClusterFactory, 10)
|
|
240
316
|
# _create_batch(VirtualMachineFactory, 10)
|
|
241
317
|
# We need to remove them from there and enable them here instead, but that will require many test updates.
|
|
318
|
+
_create_batch(DynamicGroupFactory, 20, description="and StaticGroupAssociations")
|
|
319
|
+
_create_batch(
|
|
320
|
+
MetadataTypeFactory,
|
|
321
|
+
len(MetadataTypeDataTypeChoices.CHOICES),
|
|
322
|
+
description="on all content-types",
|
|
323
|
+
content_types=ContentType.objects.filter(FeatureQuery("metadata").get_query()),
|
|
324
|
+
)
|
|
325
|
+
_create_batch(
|
|
326
|
+
MetadataTypeFactory,
|
|
327
|
+
2 * len(MetadataTypeDataTypeChoices.CHOICES),
|
|
328
|
+
description="on various content-types",
|
|
329
|
+
)
|
|
330
|
+
_create_batch(MetadataChoiceFactory, 100)
|
|
331
|
+
_create_batch(ObjectChangeFactory, 100)
|
|
332
|
+
_create_batch(ObjectMetadataFactory, 100)
|
|
333
|
+
_create_batch(
|
|
334
|
+
ObjectMetadataFactory,
|
|
335
|
+
20,
|
|
336
|
+
metadata_type=MetadataType.objects.filter(data_type=MetadataTypeDataTypeChoices.TYPE_CONTACT_TEAM).first(),
|
|
337
|
+
has_contact=True,
|
|
338
|
+
description="with contacts",
|
|
339
|
+
)
|
|
340
|
+
_create_batch(
|
|
341
|
+
ObjectMetadataFactory,
|
|
342
|
+
20,
|
|
343
|
+
metadata_type=MetadataType.objects.filter(data_type=MetadataTypeDataTypeChoices.TYPE_CONTACT_TEAM).first(),
|
|
344
|
+
has_contact=False,
|
|
345
|
+
description="with teams",
|
|
346
|
+
)
|
|
347
|
+
_create_batch(JobResultFactory, 20)
|
|
348
|
+
_create_batch(JobLogEntryFactory, 100)
|
|
242
349
|
|
|
243
350
|
def handle(self, *args, **options):
|
|
244
351
|
if options["flush"]:
|
|
@@ -259,7 +366,13 @@ Type 'yes' to continue, or 'no' to cancel: """
|
|
|
259
366
|
self.stdout.write(
|
|
260
367
|
self.style.WARNING(f'Flushing all existing data from the database "{options["database"]}"...')
|
|
261
368
|
)
|
|
262
|
-
|
|
369
|
+
|
|
370
|
+
# If we already have a fixture file to use, suppress the "post_migrate" signal that "flush" would normally
|
|
371
|
+
# trigger, as that would lead to creation of Job records (etc.) that WILL conflict with the fixture data.
|
|
372
|
+
inhibit_post_migrate = options["cache_test_fixtures"] and os.path.exists(options["fixture_file"])
|
|
373
|
+
call_command(
|
|
374
|
+
"flush", "--no-input", "--database", options["database"], inhibit_post_migrate=inhibit_post_migrate
|
|
375
|
+
)
|
|
263
376
|
|
|
264
377
|
if options["cache_test_fixtures"] and os.path.exists(options["fixture_file"]):
|
|
265
378
|
self.stdout.write(self.style.WARNING(f"Loading factory data from file {options['fixture_file']}"))
|
|
@@ -277,7 +390,7 @@ Type 'yes' to continue, or 'no' to cancel: """
|
|
|
277
390
|
"dumpdata",
|
|
278
391
|
indent=2,
|
|
279
392
|
format="json",
|
|
280
|
-
exclude=["auth.permission"
|
|
393
|
+
exclude=["auth.permission"],
|
|
281
394
|
output=options["fixture_file"],
|
|
282
395
|
)
|
|
283
396
|
|
nautobot/core/models/__init__.py
CHANGED
|
@@ -19,6 +19,7 @@ __all__ = (
|
|
|
19
19
|
"BaseManager",
|
|
20
20
|
"BaseModel",
|
|
21
21
|
"CompositeKeyQuerySetMixin",
|
|
22
|
+
"ContentTypeRelatedQuerySet",
|
|
22
23
|
"RestrictedQuerySet",
|
|
23
24
|
"construct_composite_key",
|
|
24
25
|
"construct_natural_slug",
|
|
@@ -46,16 +47,19 @@ class BaseModel(models.Model):
|
|
|
46
47
|
|
|
47
48
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, unique=True, editable=False)
|
|
48
49
|
|
|
49
|
-
# Reverse relation so that deleting a BaseModel automatically deletes any ContactAssociations related to it.
|
|
50
|
-
associated_contacts = GenericRelation(
|
|
51
|
-
"extras.ContactAssociation",
|
|
52
|
-
content_type_field="associated_object_type",
|
|
53
|
-
object_id_field="associated_object_id",
|
|
54
|
-
related_query_name="associated_contacts_%(app_label)s_%(class)s", # e.g. 'associated_contacts_dcim_device'
|
|
55
|
-
)
|
|
56
|
-
|
|
57
50
|
objects = BaseManager.from_queryset(RestrictedQuerySet)()
|
|
58
|
-
is_contact_associable_model = True
|
|
51
|
+
is_contact_associable_model = False # ContactMixin overrides this to default True
|
|
52
|
+
is_dynamic_group_associable_model = False # DynamicGroupMixin overrides this to default True
|
|
53
|
+
is_metadata_associable_model = True
|
|
54
|
+
is_saved_view_model = False # SavedViewMixin overrides this to default True
|
|
55
|
+
is_cloud_resource_type_model = False # CloudResourceTypeMixin overrides this to default True
|
|
56
|
+
|
|
57
|
+
associated_object_metadatas = GenericRelation(
|
|
58
|
+
"extras.ObjectMetadata",
|
|
59
|
+
content_type_field="assigned_object_type",
|
|
60
|
+
object_id_field="assigned_object_id",
|
|
61
|
+
related_query_name="associated_object_metadatas_%(app_label)s_%(class)s", # e.g. 'associated_object_metadatas_dcim_device'
|
|
62
|
+
)
|
|
59
63
|
|
|
60
64
|
class Meta:
|
|
61
65
|
abstract = True
|
|
@@ -295,3 +299,24 @@ class BaseModel(models.Model):
|
|
|
295
299
|
f"expected no more than {len(natural_key_field_lookups)} but got {len(args)}."
|
|
296
300
|
)
|
|
297
301
|
return dict(zip(natural_key_field_lookups, args))
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
class ContentTypeRelatedQuerySet(RestrictedQuerySet):
|
|
305
|
+
def get_for_model(self, model):
|
|
306
|
+
"""
|
|
307
|
+
Return all `self.model` instances assigned to the given model.
|
|
308
|
+
"""
|
|
309
|
+
content_type = ContentType.objects.get_for_model(model._meta.concrete_model)
|
|
310
|
+
return self.filter(content_types=content_type)
|
|
311
|
+
|
|
312
|
+
# TODO(timizuo): Merge into get_for_model; Cant do this now cause it would require alot
|
|
313
|
+
# of refactoring
|
|
314
|
+
def get_for_models(self, models_):
|
|
315
|
+
"""
|
|
316
|
+
Return all `self.model` instances assigned to the given `_models`.
|
|
317
|
+
"""
|
|
318
|
+
q = models.Q()
|
|
319
|
+
for model in models_:
|
|
320
|
+
q |= models.Q(app_label=model._meta.app_label, model=model._meta.model_name)
|
|
321
|
+
content_types = ContentType.objects.filter(q)
|
|
322
|
+
return self.filter(content_types__in=content_types)
|
nautobot/core/models/generics.py
CHANGED
|
@@ -4,14 +4,21 @@ from nautobot.core.models import BaseModel
|
|
|
4
4
|
from nautobot.core.models.fields import TagsField
|
|
5
5
|
from nautobot.extras.models.change_logging import ChangeLoggedModel
|
|
6
6
|
from nautobot.extras.models.customfields import CustomFieldModel
|
|
7
|
-
from nautobot.extras.models.mixins import
|
|
7
|
+
from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
|
|
8
8
|
from nautobot.extras.models.relationships import RelationshipModel
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class OrganizationalModel(
|
|
14
|
-
|
|
14
|
+
ChangeLoggedModel,
|
|
15
|
+
ContactMixin,
|
|
16
|
+
CustomFieldModel,
|
|
17
|
+
DynamicGroupsModelMixin,
|
|
18
|
+
NotesMixin,
|
|
19
|
+
RelationshipModel,
|
|
20
|
+
SavedViewMixin,
|
|
21
|
+
BaseModel,
|
|
15
22
|
):
|
|
16
23
|
"""
|
|
17
24
|
Base abstract model for all organizational models.
|
|
@@ -27,7 +34,16 @@ class OrganizationalModel(
|
|
|
27
34
|
abstract = True
|
|
28
35
|
|
|
29
36
|
|
|
30
|
-
class PrimaryModel(
|
|
37
|
+
class PrimaryModel(
|
|
38
|
+
ChangeLoggedModel,
|
|
39
|
+
ContactMixin,
|
|
40
|
+
CustomFieldModel,
|
|
41
|
+
DynamicGroupsModelMixin,
|
|
42
|
+
NotesMixin,
|
|
43
|
+
RelationshipModel,
|
|
44
|
+
SavedViewMixin,
|
|
45
|
+
BaseModel,
|
|
46
|
+
):
|
|
31
47
|
"""
|
|
32
48
|
Base abstract model for all primary models.
|
|
33
49
|
|
|
@@ -1,50 +1,29 @@
|
|
|
1
1
|
from django.contrib.contenttypes.models import ContentType
|
|
2
2
|
from django.db import models
|
|
3
|
-
from django.db.models import Q
|
|
4
3
|
|
|
5
4
|
from nautobot.core.choices import ColorChoices
|
|
6
5
|
from nautobot.core.constants import CHARFIELD_MAX_LENGTH
|
|
7
|
-
from nautobot.core.models import BaseManager, BaseModel
|
|
6
|
+
from nautobot.core.models import BaseManager, BaseModel, ContentTypeRelatedQuerySet
|
|
8
7
|
from nautobot.core.models.fields import ColorField
|
|
9
|
-
from nautobot.core.models.querysets import RestrictedQuerySet
|
|
10
8
|
from nautobot.extras.models.change_logging import ChangeLoggedModel
|
|
11
9
|
|
|
12
10
|
# Importing CustomFieldModel, ChangeLoggedModel, RelationshipModel from nautobot.extras.models
|
|
13
11
|
# caused circular import error
|
|
14
12
|
from nautobot.extras.models.customfields import CustomFieldModel
|
|
15
|
-
from nautobot.extras.models.mixins import
|
|
13
|
+
from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
|
|
16
14
|
from nautobot.extras.models.relationships import RelationshipModel
|
|
17
15
|
|
|
18
16
|
|
|
19
|
-
class ContentTypeRelatedQuerySet(RestrictedQuerySet):
|
|
20
|
-
def get_for_model(self, model):
|
|
21
|
-
"""
|
|
22
|
-
Return all `self.model` instances assigned to the given model.
|
|
23
|
-
"""
|
|
24
|
-
content_type = ContentType.objects.get_for_model(model._meta.concrete_model)
|
|
25
|
-
return self.filter(content_types=content_type)
|
|
26
|
-
|
|
27
|
-
# TODO(timizuo): Merge into get_for_model; Cant do this now cause it would require alot
|
|
28
|
-
# of refactoring
|
|
29
|
-
def get_for_models(self, models_):
|
|
30
|
-
"""
|
|
31
|
-
Return all `self.model` instances assigned to the given `_models`.
|
|
32
|
-
"""
|
|
33
|
-
q = Q()
|
|
34
|
-
for model in models_:
|
|
35
|
-
q |= Q(app_label=model._meta.app_label, model=model._meta.model_name)
|
|
36
|
-
content_types = ContentType.objects.filter(q)
|
|
37
|
-
return self.filter(content_types__in=content_types)
|
|
38
|
-
|
|
39
|
-
|
|
40
17
|
# TODO(timizuo): Inheriting from OrganizationalModel here causes partial import error
|
|
41
18
|
class NameColorContentTypesModel(
|
|
42
|
-
BaseModel,
|
|
43
19
|
ChangeLoggedModel,
|
|
20
|
+
ContactMixin,
|
|
44
21
|
CustomFieldModel,
|
|
45
|
-
|
|
22
|
+
DynamicGroupsModelMixin,
|
|
46
23
|
NotesMixin,
|
|
47
|
-
|
|
24
|
+
RelationshipModel,
|
|
25
|
+
SavedViewMixin,
|
|
26
|
+
BaseModel,
|
|
48
27
|
):
|
|
49
28
|
"""
|
|
50
29
|
This abstract base properties model contains fields and functionality that are
|
|
@@ -6,7 +6,7 @@ from nautobot.core.utils import permissions
|
|
|
6
6
|
from nautobot.core.utils.data import merge_dicts_without_collision
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def count_related(model, field, *, filter_dict=None, distinct=False):
|
|
9
|
+
def count_related(model, field, *, filter_dict=None, manager_name="objects", distinct=False):
|
|
10
10
|
"""
|
|
11
11
|
Return a Subquery suitable for annotating a child object count.
|
|
12
12
|
|
|
@@ -14,13 +14,14 @@ def count_related(model, field, *, filter_dict=None, distinct=False):
|
|
|
14
14
|
model (Model): The related model to aggregate
|
|
15
15
|
field (str): The field on the related model which points back to the OuterRef model
|
|
16
16
|
filter_dict (dict): Optional dict of filter key/value pairs to limit the Subquery
|
|
17
|
+
manager_name (str): Name of the manager on the model to use
|
|
17
18
|
"""
|
|
18
19
|
filters = {field: OuterRef("pk")}
|
|
19
20
|
if filter_dict:
|
|
20
21
|
filters.update(filter_dict)
|
|
21
22
|
|
|
22
|
-
manager = model
|
|
23
|
-
if hasattr(
|
|
23
|
+
manager = getattr(model, manager_name)
|
|
24
|
+
if hasattr(manager, "without_tree_fields"):
|
|
24
25
|
manager = manager.without_tree_fields()
|
|
25
26
|
qs = manager.filter(**filters).order_by().values(field)
|
|
26
27
|
if distinct:
|
|
@@ -65,7 +65,7 @@ class TreeManager(TreeManager_, BaseManager.from_queryset(TreeQuerySet)):
|
|
|
65
65
|
Extend django-tree-queries' TreeManager to incorporate RestrictedQuerySet.
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
|
-
_with_tree_fields =
|
|
68
|
+
_with_tree_fields = False
|
|
69
69
|
use_in_migrations = True
|
|
70
70
|
|
|
71
71
|
@property
|
nautobot/core/models/utils.py
CHANGED
|
@@ -150,29 +150,45 @@ def serialize_object_v2(obj):
|
|
|
150
150
|
return data
|
|
151
151
|
|
|
152
152
|
|
|
153
|
-
def find_models_with_matching_fields(app_models, field_names, field_attributes=None):
|
|
153
|
+
def find_models_with_matching_fields(app_models, field_names=None, field_attributes=None, additional_constraints=None):
|
|
154
154
|
"""
|
|
155
|
-
Find all models that have fields with the specified names
|
|
155
|
+
Find all models that have fields with the specified names and satisfy the additional constraints,
|
|
156
|
+
and return them grouped by app.
|
|
156
157
|
|
|
157
158
|
Args:
|
|
158
159
|
app_models (list[BaseModel]): A list of model classes to search through.
|
|
159
160
|
field_names (list[str]): A list of names of fields that must be present in order for the model to be considered
|
|
160
161
|
field_attributes (dict): Optional dictionary of attributes to filter the fields by.
|
|
162
|
+
additional_constraints (dict): Optional dictionary of `{field: value}` to further filter the models by.
|
|
161
163
|
|
|
162
164
|
Return:
|
|
163
165
|
(dict): A dictionary where the keys are app labels and the values are sets of model names.
|
|
164
166
|
"""
|
|
165
167
|
registry_items = {}
|
|
168
|
+
field_names = field_names or []
|
|
166
169
|
field_attributes = field_attributes or {}
|
|
170
|
+
additional_constraints = additional_constraints or {}
|
|
167
171
|
for model_class in app_models:
|
|
168
172
|
app_label, model_name = model_class._meta.label_lower.split(".")
|
|
173
|
+
valid_model = True
|
|
169
174
|
for field_name in field_names:
|
|
170
175
|
try:
|
|
171
176
|
field = model_class._meta.get_field(field_name)
|
|
172
|
-
if all((getattr(field, item, None) == value for item, value in field_attributes.items())):
|
|
173
|
-
|
|
177
|
+
if not all((getattr(field, item, None) == value for item, value in field_attributes.items())):
|
|
178
|
+
valid_model = False
|
|
179
|
+
break
|
|
174
180
|
except FieldDoesNotExist:
|
|
175
|
-
|
|
181
|
+
valid_model = False
|
|
182
|
+
break
|
|
183
|
+
if valid_model:
|
|
184
|
+
if not all(
|
|
185
|
+
getattr(model_class, additional_field, None) == additional_value
|
|
186
|
+
for additional_field, additional_value in additional_constraints.items()
|
|
187
|
+
):
|
|
188
|
+
valid_model = False
|
|
189
|
+
if valid_model:
|
|
190
|
+
registry_items.setdefault(app_label, set()).add(model_name)
|
|
191
|
+
|
|
176
192
|
registry_items = {key: sorted(value) for key, value in registry_items.items()}
|
|
177
193
|
return registry_items
|
|
178
194
|
|
nautobot/core/settings.py
CHANGED
|
@@ -96,13 +96,6 @@ if "NAUTOBOT_DEPLOYMENT_ID" in os.environ and os.environ["NAUTOBOT_DEPLOYMENT_ID
|
|
|
96
96
|
if "NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY" in os.environ and os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"] != "":
|
|
97
97
|
DEVICE_NAME_AS_NATURAL_KEY = is_truthy(os.environ["NAUTOBOT_DEVICE_NAME_AS_NATURAL_KEY"])
|
|
98
98
|
|
|
99
|
-
# The number of seconds to cache the member list of dynamic groups. Set this to `0` to disable caching.
|
|
100
|
-
if (
|
|
101
|
-
"NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT" in os.environ
|
|
102
|
-
and os.environ["NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"] != ""
|
|
103
|
-
):
|
|
104
|
-
DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT = int(os.environ["NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"])
|
|
105
|
-
|
|
106
99
|
# Exclude potentially sensitive models from wildcard view exemption. These may still be exempted
|
|
107
100
|
# by specifying the model individually in the EXEMPT_VIEW_PERMISSIONS configuration parameter.
|
|
108
101
|
EXEMPT_EXCLUDE_MODELS = (
|
|
@@ -517,6 +510,7 @@ INSTALLED_APPS = [
|
|
|
517
510
|
"rest_framework", # Must be after `nautobot.core` for template overrides
|
|
518
511
|
"db_file_storage",
|
|
519
512
|
"nautobot.circuits",
|
|
513
|
+
"nautobot.cloud",
|
|
520
514
|
"nautobot.dcim",
|
|
521
515
|
"nautobot.ipam",
|
|
522
516
|
"nautobot.extras",
|
|
@@ -533,7 +527,6 @@ INSTALLED_APPS = [
|
|
|
533
527
|
# "health_check.contrib.migrations",
|
|
534
528
|
# "health_check.contrib.redis",
|
|
535
529
|
"django_extensions",
|
|
536
|
-
"constance.backends.database",
|
|
537
530
|
"django_ajax_tables",
|
|
538
531
|
"silk",
|
|
539
532
|
]
|
|
@@ -714,14 +707,6 @@ CONSTANCE_CONFIG = {
|
|
|
714
707
|
"Used for sending anonymous installation metrics, when settings.INSTALLATION_METRICS_ENABLED is set to True.",
|
|
715
708
|
field_type=str,
|
|
716
709
|
),
|
|
717
|
-
"DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT": ConstanceConfigItem(
|
|
718
|
-
default=0,
|
|
719
|
-
help_text="Dynamic Group member cache timeout in seconds. This is the amount of time that a Dynamic Group's member list "
|
|
720
|
-
"will be cached in Django cache backend. Since retrieving the member list of a Dynamic Group can be a very "
|
|
721
|
-
"expensive operation, especially in reverse, this cache is used to speed up the process of retrieving the "
|
|
722
|
-
"member list. This cache is invalidated when a Dynamic Group is saved. Set to 0 to disable caching.",
|
|
723
|
-
field_type=int,
|
|
724
|
-
),
|
|
725
710
|
"JOB_CREATE_FILE_MAX_SIZE": ConstanceConfigItem(
|
|
726
711
|
default=10 << 20,
|
|
727
712
|
help_text=mark_safe( # noqa: S308 # suspicious-mark-safe-usage, but this is a static string so it's safe
|
|
@@ -815,7 +800,7 @@ CONSTANCE_CONFIG_FIELDSETS = {
|
|
|
815
800
|
"Installation Metrics": ["DEPLOYMENT_ID"],
|
|
816
801
|
"Natural Keys": ["DEVICE_NAME_AS_NATURAL_KEY", "LOCATION_NAME_AS_NATURAL_KEY"],
|
|
817
802
|
"Pagination": ["PAGINATE_COUNT", "MAX_PAGE_SIZE", "PER_PAGE_DEFAULTS"],
|
|
818
|
-
"Performance": ["
|
|
803
|
+
"Performance": ["JOB_CREATE_FILE_MAX_SIZE"],
|
|
819
804
|
"Rack Elevation Rendering": [
|
|
820
805
|
"RACK_ELEVATION_DEFAULT_UNIT_HEIGHT",
|
|
821
806
|
"RACK_ELEVATION_DEFAULT_UNIT_WIDTH",
|
|
@@ -907,24 +892,13 @@ CELERY_TASK_TRACK_STARTED = True
|
|
|
907
892
|
# If enabled, a `task-sent` event will be sent for every task so tasks can be tracked before they're consumed by a worker.
|
|
908
893
|
CELERY_TASK_SEND_SENT_EVENT = True
|
|
909
894
|
|
|
910
|
-
# How many tasks a worker is allowed to reserve for its own consumption and execution.
|
|
911
|
-
# If set to zero (not recommended) a single worker can reserve all tasks even if other workers are free.
|
|
912
|
-
# For short running tasks (such as webhooks) you may want to set this to a larger number to increase throughput.
|
|
913
|
-
# Conversely, for long running tasks (such as SSoT or Golden-Config Jobs at scale) you may want to set this to 1
|
|
914
|
-
# so that a worker executing a long-running task will not prefetch other tasks, which would block their execution
|
|
915
|
-
# until the long-running task completes.
|
|
916
|
-
# https://docs.celeryq.dev/en/stable/userguide/optimizing.html#prefetch-limits
|
|
917
|
-
CELERY_WORKER_PREFETCH_MULTIPLIER = int(os.getenv("NAUTOBOT_CELERY_WORKER_PREFETCH_MULTIPLIER", "4"))
|
|
918
|
-
|
|
919
895
|
# If enabled stdout and stderr of running jobs will be redirected to the task logger.
|
|
920
896
|
CELERY_WORKER_REDIRECT_STDOUTS = is_truthy(os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS", "True"))
|
|
921
897
|
|
|
922
|
-
# The log level of log messages generated by redirected job stdout and stderr.
|
|
923
|
-
# Can be one of `DEBUG`, `INFO`, `WARNING`, `ERROR`, or `CRITICAL`.
|
|
898
|
+
# The log level of log messages generated by redirected job stdout and stderr. Can be one of `DEBUG`, `INFO`, `WARNING`, `ERROR`, or `CRITICAL`.
|
|
924
899
|
CELERY_WORKER_REDIRECT_STDOUTS_LEVEL = os.getenv("NAUTOBOT_CELERY_WORKER_REDIRECT_STDOUTS_LEVEL", "WARNING")
|
|
925
900
|
|
|
926
|
-
# Send task-related events so that tasks can be monitored using tools like flower.
|
|
927
|
-
# Sets the default value for the workers -E argument.
|
|
901
|
+
# Send task-related events so that tasks can be monitored using tools like flower. Sets the default value for the workers -E argument.
|
|
928
902
|
CELERY_WORKER_SEND_TASK_EVENTS = True
|
|
929
903
|
|
|
930
904
|
# Default celery queue name that will be used by workers and tasks if no queue is specified
|
nautobot/core/settings.yaml
CHANGED
|
@@ -426,20 +426,6 @@ properties:
|
|
|
426
426
|
see_also:
|
|
427
427
|
"`CELERY_TASK_SOFT_TIME_LIMIT`": "#celery_task_soft_time_limit"
|
|
428
428
|
type: "integer"
|
|
429
|
-
CELERY_WORKER_PREFETCH_MULTIPLIER:
|
|
430
|
-
default: 4
|
|
431
|
-
description: "How many tasks a worker is allowed to reserve for its own consumption and execution."
|
|
432
|
-
details: >-
|
|
433
|
-
If set to `0` (not recommended) a single worker can reserve all tasks even if other workers are free.
|
|
434
|
-
For short running tasks (such as webhooks) you may want to set this to a larger number to increase throughput.
|
|
435
|
-
Conversely, for long-running tasks (such as SSoT or Golden-Config Jobs at scale) you may want to set this to `1`
|
|
436
|
-
so that a worker executing a long-running task will not prefetch other tasks, which would block their execution
|
|
437
|
-
until the long-running task completes.
|
|
438
|
-
environment_variable: "NAUTOBOT_CELERY_WORKER_PREFETCH_MULTIPLIER"
|
|
439
|
-
see_also:
|
|
440
|
-
"Celery documentation": "https://docs.celeryq.dev/en/stable/userguide/optimizing.html#prefetch-limits"
|
|
441
|
-
type: "integer"
|
|
442
|
-
version_added: "2.2.9"
|
|
443
429
|
CELERY_WORKER_PROMETHEUS_PORTS:
|
|
444
430
|
default: []
|
|
445
431
|
description: "Ports for Prometheus metric HTTP server running on the celery worker(s)."
|
|
@@ -481,6 +467,12 @@ properties:
|
|
|
481
467
|
!!! warning
|
|
482
468
|
If enabling indefinite changelog retention, it is recommended to periodically delete old entries.
|
|
483
469
|
Otherwise, the database may eventually exceed capacity.
|
|
470
|
+
|
|
471
|
+
+/- 2.2.0
|
|
472
|
+
As of Nautobot 2.2.0, changelog cleanup does not run automatically. Use the `Cleanup of ObjectChange records`
|
|
473
|
+
system Job to handle changelog cleanup; you may schedule this to run automatically like any other Job if
|
|
474
|
+
desired. The `CHANGELOG_RETENTION` setting provides a default age cutoff for the Job but may be overridden
|
|
475
|
+
at runtime if desired.
|
|
484
476
|
environment_variable: "NAUTOBOT_CHANGELOG_RETENTION"
|
|
485
477
|
is_constance_config: true
|
|
486
478
|
type: "integer"
|
|
@@ -732,19 +724,6 @@ properties:
|
|
|
732
724
|
is_constance_config: true
|
|
733
725
|
type: "boolean"
|
|
734
726
|
version_added: "2.0.0"
|
|
735
|
-
DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT:
|
|
736
|
-
default: 0
|
|
737
|
-
description: >-
|
|
738
|
-
The number of seconds to cache the member list of dynamic groups. Set this to `0` to disable caching.
|
|
739
|
-
details: >-
|
|
740
|
-
With large datasets (those in scope of a Dynamic Group and number of Dynamic Groups themselves),
|
|
741
|
-
users will encounter a performance penalty using or accessing the membership lists.
|
|
742
|
-
This setting allows users to accept a cached list for common use cases (particularly in the UI)
|
|
743
|
-
that expires after the configured time."
|
|
744
|
-
environment_variable: "NAUTOBOT_DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"
|
|
745
|
-
is_constance_config: true
|
|
746
|
-
type: "integer"
|
|
747
|
-
version_added: "1.6.0"
|
|
748
727
|
EXEMPT_VIEW_PERMISSIONS:
|
|
749
728
|
default: []
|
|
750
729
|
description: "A list of Nautobot models to exempt from the enforcement of view permissions."
|
|
@@ -1120,6 +1099,34 @@ properties:
|
|
|
1120
1099
|
* `nautobot.core.graphql.*` - [GraphQL](../../platform-functionality/graphql.md) initialization and operation.
|
|
1121
1100
|
* `nautobot.extras.plugins.*` - App loading and activity
|
|
1122
1101
|
* `nautobot.core.views.generic.*` - Generic views which handle business logic for the web UI
|
|
1102
|
+
|
|
1103
|
+
#### Structlog Configuration
|
|
1104
|
+
|
|
1105
|
+
As of Nautobot 2.3, [django-structlog](https://django-structlog.readthedocs.io/en/latest/) is added as a core dependency. To use structlog, you can add the following code to your `nautobot_config.py` file:
|
|
1106
|
+
|
|
1107
|
+
```python
|
|
1108
|
+
from nautobot.core.settings_funcs import setup_structlog_logging
|
|
1109
|
+
|
|
1110
|
+
setup_structlog_logging(
|
|
1111
|
+
LOGGING,
|
|
1112
|
+
INSTALLED_APPS,
|
|
1113
|
+
MIDDLEWARE,
|
|
1114
|
+
log_level="DEBUG" if DEBUG else "INFO",
|
|
1115
|
+
root_level="INFO",
|
|
1116
|
+
plain_format=bool(DEBUG), # Set to True to use human-readable structlog format over JSON
|
|
1117
|
+
debug_db=False, # Set to True to log all database queries
|
|
1118
|
+
)
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
Calling this function disables logging if running tests, otherwise:
|
|
1122
|
+
|
|
1123
|
+
* Overwrites all `formatters` and `handlers` to avoid logging duplication.
|
|
1124
|
+
It's possible to add custom `formatters` and `handlers` after calling this function.
|
|
1125
|
+
* Updates all `loggers` to use structlog with the specified `log_level`.
|
|
1126
|
+
* Adds or updates the root logger to use structlog with the specified `root_level`.
|
|
1127
|
+
* Uses a human-readable structlog format if `plain_format` is True, otherwise uses JSON.
|
|
1128
|
+
* Adds database query logging if `debug_db` is True.
|
|
1129
|
+
* Adds necessary Django apps and middleware for structlog.
|
|
1123
1130
|
properties:
|
|
1124
1131
|
additionalProperties: true
|
|
1125
1132
|
disable_existing_loggers:
|