nautobot 2.2.9__py3-none-any.whl → 2.3.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/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 +113 -0
- nautobot/cloud/filters.py +187 -0
- nautobot/cloud/forms.py +339 -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 +246 -0
- nautobot/cloud/navigation.py +85 -0
- nautobot/cloud/tables.py +157 -0
- nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +43 -0
- nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +122 -0
- nautobot/cloud/templates/cloud/cloudnetwork_update.html +33 -0
- nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +111 -0
- nautobot/cloud/templates/cloud/cloudservice_retrieve.html +69 -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 +125 -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 +95 -13
- nautobot/core/forms/fields.py +10 -4
- nautobot/core/forms/forms.py +11 -3
- nautobot/core/forms/widgets.py +18 -1
- nautobot/core/graphql/schema.py +26 -4
- nautobot/core/jobs/__init__.py +16 -2
- 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 +2 -17
- nautobot/core/settings.yaml +34 -13
- nautobot/core/settings_funcs.py +103 -0
- nautobot/core/tables.py +130 -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 -8
- 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 +63 -14
- 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_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 +122 -0
- 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 +119 -67
- nautobot/core/views/mixins.py +105 -36
- nautobot/core/views/paginator.py +9 -3
- nautobot/core/views/renderers.py +121 -56
- nautobot/core/views/utils.py +81 -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 +252 -18
- nautobot/dcim/filters/__init__.py +373 -193
- nautobot/dcim/filters/mixins.py +274 -1
- nautobot/dcim/forms.py +834 -121
- 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 +862 -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 -99
- nautobot/dcim/models/devices.py +468 -13
- nautobot/dcim/models/racks.py +0 -1
- nautobot/dcim/navigation.py +47 -0
- nautobot/dcim/signals.py +3 -3
- nautobot/dcim/tables/__init__.py +35 -23
- nautobot/dcim/tables/devices.py +229 -43
- 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 +14 -6
- 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/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 +159 -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 +693 -208
- nautobot/dcim/tests/test_filters.py +843 -217
- nautobot/dcim/tests/test_models.py +1072 -8
- nautobot/dcim/tests/test_views.py +1510 -341
- nautobot/dcim/urls.py +17 -2
- nautobot/dcim/utils.py +2 -3
- nautobot/dcim/views.py +1106 -116
- 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 +66 -0
- 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 +460 -9
- nautobot/extras/filters/__init__.py +174 -3
- nautobot/extras/filters/mixins.py +46 -43
- nautobot/extras/forms/base.py +24 -5
- 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 +14 -1
- 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 +6 -3
- nautobot/extras/models/metadata.py +441 -0
- nautobot/extras/models/mixins.py +72 -62
- nautobot/extras/models/models.py +118 -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 +95 -100
- nautobot/extras/tables.py +165 -12
- 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/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 +509 -23
- 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 +6 -6
- nautobot/extras/tests/test_models.py +501 -4
- nautobot/extras/tests/test_relationships.py +1 -0
- nautobot/extras/tests/test_views.py +565 -8
- nautobot/extras/tests/test_webhooks.py +1 -1
- nautobot/extras/urls.py +5 -0
- nautobot/extras/utils.py +51 -11
- nautobot/extras/views.py +542 -76
- nautobot/ipam/__init__.py +0 -1
- nautobot/ipam/apps.py +1 -0
- nautobot/ipam/factory.py +17 -19
- nautobot/ipam/filters.py +13 -0
- nautobot/ipam/forms.py +8 -4
- 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 +11 -8
- nautobot/ipam/querysets.py +1 -1
- nautobot/ipam/signals.py +4 -2
- nautobot/ipam/tables.py +5 -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 +6 -0
- 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 +18 -26
- nautobot/project-static/css/base.css +20 -0
- nautobot/project-static/css/dark.css +11 -0
- nautobot/project-static/docs/404.html +892 -88
- nautobot/project-static/docs/apps/index.html +892 -88
- nautobot/project-static/docs/apps/nautobot-apps.html +892 -88
- nautobot/project-static/docs/assets/_mkdocstrings.css +5 -0
- nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css +1 -0
- nautobot/project-static/docs/assets/stylesheets/main.3cba04c6.min.css.map +1 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +919 -120
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +904 -101
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1618 -903
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +935 -144
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +977 -188
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +901 -99
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +897 -93
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +991 -193
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +974 -131
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1078 -272
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1242 -334
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1727 -875
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1164 -381
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2088 -1374
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2246 -1422
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +912 -111
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +963 -163
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1010 -223
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1913 -1277
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1846 -1102
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +904 -101
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2331 -1699
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1802 -1024
- nautobot/project-static/docs/development/apps/api/configuration-view.html +892 -88
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +892 -88
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +892 -88
- nautobot/project-static/docs/development/apps/api/models/global-search.html +892 -88
- nautobot/project-static/docs/development/apps/api/models/graphql.html +892 -88
- nautobot/project-static/docs/development/apps/api/models/index.html +942 -90
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +892 -88
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +892 -88
- nautobot/project-static/docs/development/apps/api/prometheus.html +892 -88
- nautobot/project-static/docs/development/apps/api/setup.html +892 -88
- nautobot/project-static/docs/development/apps/api/testing.html +892 -88
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +892 -88
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +892 -88
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +892 -88
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +892 -88
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/base-template.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/index.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/notes.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +892 -88
- nautobot/project-static/docs/development/apps/api/views/urls.html +892 -88
- nautobot/project-static/docs/development/apps/index.html +892 -88
- nautobot/project-static/docs/development/apps/migration/code-updates.html +892 -88
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +892 -88
- nautobot/project-static/docs/development/apps/migration/from-v1.html +892 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +892 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +892 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +892 -88
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +892 -88
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +892 -88
- nautobot/project-static/docs/development/core/application-registry.html +892 -88
- nautobot/project-static/docs/development/core/best-practices.html +893 -88
- nautobot/project-static/docs/development/core/bootstrap-ui.html +892 -88
- nautobot/project-static/docs/development/core/caching.html +892 -88
- nautobot/project-static/docs/development/core/controllers.html +892 -88
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +892 -88
- nautobot/project-static/docs/development/core/generic-views.html +892 -88
- nautobot/project-static/docs/development/core/getting-started.html +892 -88
- nautobot/project-static/docs/development/core/homepage.html +892 -88
- nautobot/project-static/docs/development/core/index.html +892 -88
- nautobot/project-static/docs/development/core/model-checklist.html +901 -89
- nautobot/project-static/docs/development/core/model-features.html +892 -88
- nautobot/project-static/docs/development/core/natural-keys.html +892 -88
- nautobot/project-static/docs/development/core/navigation-menu.html +892 -88
- nautobot/project-static/docs/development/core/release-checklist.html +895 -91
- nautobot/project-static/docs/development/core/role-internals.html +892 -88
- nautobot/project-static/docs/development/core/settings.html +892 -88
- nautobot/project-static/docs/development/core/style-guide.html +893 -89
- nautobot/project-static/docs/development/core/templates.html +904 -89
- nautobot/project-static/docs/development/core/testing.html +892 -88
- nautobot/project-static/docs/development/core/user-preferences.html +892 -88
- nautobot/project-static/docs/development/index.html +892 -88
- nautobot/project-static/docs/development/jobs/index.html +893 -89
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +892 -88
- nautobot/project-static/docs/index.html +892 -88
- 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 +900 -89
- nautobot/project-static/docs/overview/design_philosophy.html +892 -88
- nautobot/project-static/docs/release-notes/index.html +1129 -92
- nautobot/project-static/docs/release-notes/version-1.0.html +892 -88
- nautobot/project-static/docs/release-notes/version-1.1.html +892 -88
- nautobot/project-static/docs/release-notes/version-1.2.html +892 -88
- nautobot/project-static/docs/release-notes/version-1.3.html +892 -88
- nautobot/project-static/docs/release-notes/version-1.4.html +892 -88
- nautobot/project-static/docs/release-notes/version-1.5.html +893 -89
- nautobot/project-static/docs/release-notes/version-1.6.html +893 -89
- nautobot/project-static/docs/release-notes/version-2.0.html +892 -88
- nautobot/project-static/docs/release-notes/version-2.1.html +892 -88
- nautobot/project-static/docs/release-notes/version-2.2.html +895 -91
- nautobot/project-static/docs/release-notes/version-2.3.html +9954 -0
- nautobot/project-static/docs/requirements.txt +5 -5
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +331 -256
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +892 -88
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +892 -88
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +892 -88
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +892 -88
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +992 -174
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +892 -88
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +896 -88
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +892 -88
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +892 -88
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +892 -88
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +892 -88
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +944 -153
- nautobot/project-static/docs/user-guide/administration/installation/index.html +901 -93
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +934 -122
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +954 -157
- nautobot/project-static/docs/user-guide/administration/installation/services.html +913 -112
- nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +908 -99
- nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +892 -88
- nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +892 -88
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +892 -88
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +892 -88
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +893 -89
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +892 -88
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +893 -89
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +896 -88
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +895 -91
- 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 +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +923 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +923 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +918 -100
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +923 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +913 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +920 -116
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +921 -117
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +918 -114
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +914 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +926 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +936 -118
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +928 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +937 -119
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +928 -110
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +918 -114
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +921 -117
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +923 -115
- 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 +916 -112
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +940 -83
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +924 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +943 -86
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +921 -103
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +929 -125
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +918 -114
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +922 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +924 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +906 -102
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +936 -88
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +897 -89
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +897 -89
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +901 -96
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +892 -88
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +897 -89
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +892 -88
- 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 +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +892 -88
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +892 -88
- nautobot/project-static/docs/user-guide/index.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1258 -785
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +895 -91
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +896 -88
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +895 -91
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +9061 -0
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +895 -91
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +895 -91
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +895 -91
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +950 -121
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +892 -88
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +892 -88
- 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 +24 -20
- 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/models.py +0 -2
- nautobot/virtualization/tables.py +10 -3
- 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.0.dist-info}/METADATA +20 -18
- {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/RECORD +677 -557
- nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css +0 -1
- nautobot/project-static/docs/assets/stylesheets/main.76a95c52.min.css.map +0 -1
- 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.0.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/NOTICE +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/WHEEL +0 -0
- {nautobot-2.2.9.dist-info → nautobot-2.3.0.dist-info}/entry_points.txt +0 -0
nautobot/extras/models/models.py
CHANGED
|
@@ -4,6 +4,7 @@ import json
|
|
|
4
4
|
from db_file_storage.model_utils import delete_file, delete_file_if_needed
|
|
5
5
|
from db_file_storage.storage import DatabaseFileStorage
|
|
6
6
|
from django.conf import settings
|
|
7
|
+
from django.contrib.auth import get_user_model
|
|
7
8
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
8
9
|
from django.contrib.contenttypes.models import ContentType
|
|
9
10
|
from django.core.exceptions import ValidationError
|
|
@@ -31,7 +32,7 @@ from nautobot.extras.choices import (
|
|
|
31
32
|
)
|
|
32
33
|
from nautobot.extras.constants import HTTP_CONTENT_TYPE_JSON
|
|
33
34
|
from nautobot.extras.models import ChangeLoggedModel
|
|
34
|
-
from nautobot.extras.models.mixins import NotesMixin
|
|
35
|
+
from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
|
|
35
36
|
from nautobot.extras.models.relationships import RelationshipModel
|
|
36
37
|
from nautobot.extras.querysets import ConfigContextQuerySet, NotesQuerySet
|
|
37
38
|
from nautobot.extras.utils import extras_features, FeatureQuery, image_upload
|
|
@@ -39,6 +40,7 @@ from nautobot.extras.utils import extras_features, FeatureQuery, image_upload
|
|
|
39
40
|
# Avoid breaking backward compatibility on anything that might expect these to still be defined here:
|
|
40
41
|
from .jobs import Job, JOB_LOGS, JobLogEntry, JobResult, ScheduledJob, ScheduledJobs # noqa: F401 # unused-import
|
|
41
42
|
|
|
43
|
+
User = get_user_model()
|
|
42
44
|
#
|
|
43
45
|
# Config contexts
|
|
44
46
|
#
|
|
@@ -68,7 +70,15 @@ def limit_dynamic_group_choices():
|
|
|
68
70
|
|
|
69
71
|
|
|
70
72
|
@extras_features("graphql")
|
|
71
|
-
class ConfigContext(
|
|
73
|
+
class ConfigContext(
|
|
74
|
+
ChangeLoggedModel,
|
|
75
|
+
ConfigContextSchemaValidationMixin,
|
|
76
|
+
ContactMixin,
|
|
77
|
+
# DynamicGroupsModelMixin, # TODO: conflicts with "dynamic_groups" M2M field on this model
|
|
78
|
+
NotesMixin,
|
|
79
|
+
SavedViewMixin,
|
|
80
|
+
BaseModel,
|
|
81
|
+
):
|
|
72
82
|
"""
|
|
73
83
|
A ConfigContext represents a set of arbitrary data available to any Device or VirtualMachine matching its assigned
|
|
74
84
|
qualifiers (location, tenant, etc.). For example, the data stored in a ConfigContext assigned to location A and tenant B
|
|
@@ -297,10 +307,18 @@ class ConfigContextSchema(OrganizationalModel):
|
|
|
297
307
|
|
|
298
308
|
|
|
299
309
|
@extras_features("graphql")
|
|
300
|
-
class CustomLink(
|
|
310
|
+
class CustomLink(
|
|
311
|
+
ChangeLoggedModel,
|
|
312
|
+
ContactMixin,
|
|
313
|
+
DynamicGroupsModelMixin,
|
|
314
|
+
NotesMixin,
|
|
315
|
+
SavedViewMixin,
|
|
316
|
+
BaseModel,
|
|
317
|
+
):
|
|
301
318
|
"""
|
|
302
|
-
A custom link to an external representation of a Nautobot object.
|
|
303
|
-
|
|
319
|
+
A custom link to an external representation of a Nautobot object.
|
|
320
|
+
|
|
321
|
+
The link text and URL fields accept Jinja2 template code to be rendered with an object as context.
|
|
304
322
|
"""
|
|
305
323
|
|
|
306
324
|
content_type = models.ForeignKey(
|
|
@@ -351,7 +369,15 @@ class CustomLink(BaseModel, ChangeLoggedModel, NotesMixin):
|
|
|
351
369
|
@extras_features(
|
|
352
370
|
"graphql",
|
|
353
371
|
)
|
|
354
|
-
class ExportTemplate(
|
|
372
|
+
class ExportTemplate(
|
|
373
|
+
ChangeLoggedModel,
|
|
374
|
+
ContactMixin,
|
|
375
|
+
DynamicGroupsModelMixin,
|
|
376
|
+
RelationshipModel,
|
|
377
|
+
NotesMixin,
|
|
378
|
+
SavedViewMixin,
|
|
379
|
+
BaseModel,
|
|
380
|
+
):
|
|
355
381
|
# An ExportTemplate *may* be owned by another model, such as a GitRepository, or it may be un-owned
|
|
356
382
|
owner_content_type = models.ForeignKey(
|
|
357
383
|
to=ContentType,
|
|
@@ -644,7 +670,14 @@ class FileProxy(BaseModel):
|
|
|
644
670
|
|
|
645
671
|
|
|
646
672
|
@extras_features("graphql")
|
|
647
|
-
class GraphQLQuery(
|
|
673
|
+
class GraphQLQuery(
|
|
674
|
+
ChangeLoggedModel,
|
|
675
|
+
ContactMixin,
|
|
676
|
+
DynamicGroupsModelMixin,
|
|
677
|
+
NotesMixin,
|
|
678
|
+
SavedViewMixin,
|
|
679
|
+
BaseModel,
|
|
680
|
+
):
|
|
648
681
|
name = models.CharField(max_length=CHARFIELD_MAX_LENGTH, unique=True)
|
|
649
682
|
query = models.TextField()
|
|
650
683
|
variables = models.JSONField(encoder=DjangoJSONEncoder, default=dict, blank=True)
|
|
@@ -697,6 +730,7 @@ class GraphQLQuery(BaseModel, ChangeLoggedModel, NotesMixin):
|
|
|
697
730
|
|
|
698
731
|
class HealthCheckTestModel(BaseModel):
|
|
699
732
|
title = models.CharField(max_length=CHARFIELD_MAX_LENGTH)
|
|
733
|
+
is_metadata_associable_model = False
|
|
700
734
|
|
|
701
735
|
|
|
702
736
|
#
|
|
@@ -768,7 +802,7 @@ class ImageAttachment(BaseModel):
|
|
|
768
802
|
|
|
769
803
|
|
|
770
804
|
@extras_features("graphql", "webhooks")
|
|
771
|
-
class Note(
|
|
805
|
+
class Note(ChangeLoggedModel, BaseModel):
|
|
772
806
|
"""
|
|
773
807
|
Notes allow anyone with proper permissions to add a note to an object.
|
|
774
808
|
"""
|
|
@@ -788,6 +822,8 @@ class Note(BaseModel, ChangeLoggedModel):
|
|
|
788
822
|
note = models.TextField()
|
|
789
823
|
objects = BaseManager.from_queryset(NotesQuerySet)()
|
|
790
824
|
|
|
825
|
+
is_metadata_associable_model = False
|
|
826
|
+
|
|
791
827
|
class Meta:
|
|
792
828
|
ordering = ["created"]
|
|
793
829
|
unique_together = [["assigned_object_type", "assigned_object_id", "user_name", "created"]]
|
|
@@ -801,13 +837,86 @@ class Note(BaseModel, ChangeLoggedModel):
|
|
|
801
837
|
return super().save(*args, **kwargs)
|
|
802
838
|
|
|
803
839
|
|
|
840
|
+
#
|
|
841
|
+
# SavedView
|
|
842
|
+
#
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
@extras_features(
|
|
846
|
+
"custom_validators",
|
|
847
|
+
)
|
|
848
|
+
class SavedView(BaseModel, ChangeLoggedModel):
|
|
849
|
+
owner = models.ForeignKey(
|
|
850
|
+
to=User, blank=False, null=False, on_delete=models.CASCADE, help_text="The user that created this view"
|
|
851
|
+
)
|
|
852
|
+
name = models.CharField(max_length=CHARFIELD_MAX_LENGTH, blank=False, null=False, help_text="The name of this view")
|
|
853
|
+
view = models.CharField(
|
|
854
|
+
max_length=CHARFIELD_MAX_LENGTH,
|
|
855
|
+
blank=False,
|
|
856
|
+
null=False,
|
|
857
|
+
help_text="The name of the list view that the saved view is derived from, e.g. dcim:device_list",
|
|
858
|
+
)
|
|
859
|
+
config = models.JSONField(
|
|
860
|
+
encoder=DjangoJSONEncoder, blank=True, default=dict, help_text="Saved Configuration on this view"
|
|
861
|
+
)
|
|
862
|
+
is_global_default = models.BooleanField(default=False)
|
|
863
|
+
is_shared = models.BooleanField(default=True)
|
|
864
|
+
|
|
865
|
+
documentation_static_path = "docs/user-guide/platform-functionality/savedview.html"
|
|
866
|
+
|
|
867
|
+
class Meta:
|
|
868
|
+
ordering = ["owner", "view", "name"]
|
|
869
|
+
unique_together = [["owner", "name", "view"]]
|
|
870
|
+
verbose_name = "saved view"
|
|
871
|
+
verbose_name_plural = "saved views"
|
|
872
|
+
|
|
873
|
+
def __str__(self):
|
|
874
|
+
return f"{self.owner.username} - {self.view} - {self.name}"
|
|
875
|
+
|
|
876
|
+
def save(self, *args, **kwargs):
|
|
877
|
+
# If this SavedView is set to a global default, all other saved views related to this view name should not be the global default.
|
|
878
|
+
if self.is_global_default:
|
|
879
|
+
SavedView.objects.filter(view=self.view, is_global_default=True).exclude(pk=self.pk).update(
|
|
880
|
+
is_global_default=False
|
|
881
|
+
)
|
|
882
|
+
# If the view is set to Global default, is_shared should be true regardless
|
|
883
|
+
self.is_shared = True
|
|
884
|
+
|
|
885
|
+
super().save(*args, **kwargs)
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
@extras_features("graphql")
|
|
889
|
+
class UserSavedViewAssociation(BaseModel):
|
|
890
|
+
saved_view = models.ForeignKey("extras.SavedView", on_delete=models.CASCADE, related_name="user_assignments")
|
|
891
|
+
user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="saved_view_assignments")
|
|
892
|
+
view_name = models.CharField(max_length=CHARFIELD_MAX_LENGTH)
|
|
893
|
+
is_metadata_associable_model = False
|
|
894
|
+
|
|
895
|
+
class Meta:
|
|
896
|
+
unique_together = [["user", "view_name"]]
|
|
897
|
+
|
|
898
|
+
def __str__(self):
|
|
899
|
+
return f"{self.user}: {self.saved_view} - {self.view_name}"
|
|
900
|
+
|
|
901
|
+
def clean(self):
|
|
902
|
+
super().clean()
|
|
903
|
+
self.view_name = self.saved_view.view
|
|
904
|
+
|
|
905
|
+
|
|
804
906
|
#
|
|
805
907
|
# Webhooks
|
|
806
908
|
#
|
|
807
909
|
|
|
808
910
|
|
|
809
911
|
@extras_features("graphql")
|
|
810
|
-
class Webhook(
|
|
912
|
+
class Webhook(
|
|
913
|
+
ChangeLoggedModel,
|
|
914
|
+
ContactMixin,
|
|
915
|
+
DynamicGroupsModelMixin,
|
|
916
|
+
NotesMixin,
|
|
917
|
+
SavedViewMixin,
|
|
918
|
+
BaseModel,
|
|
919
|
+
):
|
|
811
920
|
"""
|
|
812
921
|
A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or
|
|
813
922
|
delete in Nautobot. The request will contain a representation of the object, which the remote application can act on.
|
|
@@ -25,7 +25,7 @@ from nautobot.core.templatetags.helpers import bettertitle
|
|
|
25
25
|
from nautobot.core.utils.lookup import get_filterset_for_model, get_route_for_model
|
|
26
26
|
from nautobot.extras.choices import RelationshipRequiredSideChoices, RelationshipSideChoices, RelationshipTypeChoices
|
|
27
27
|
from nautobot.extras.models import ChangeLoggedModel
|
|
28
|
-
from nautobot.extras.models.mixins import NotesMixin
|
|
28
|
+
from nautobot.extras.models.mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin, SavedViewMixin
|
|
29
29
|
from nautobot.extras.utils import check_if_key_is_graphql_safe, extras_features, FeatureQuery
|
|
30
30
|
|
|
31
31
|
logger = logging.getLogger(__name__)
|
|
@@ -416,7 +416,14 @@ class RelationshipManager(BaseManager.from_queryset(RestrictedQuerySet)):
|
|
|
416
416
|
)
|
|
417
417
|
|
|
418
418
|
|
|
419
|
-
class Relationship(
|
|
419
|
+
class Relationship(
|
|
420
|
+
ChangeLoggedModel,
|
|
421
|
+
ContactMixin,
|
|
422
|
+
DynamicGroupsModelMixin,
|
|
423
|
+
NotesMixin,
|
|
424
|
+
SavedViewMixin,
|
|
425
|
+
BaseModel,
|
|
426
|
+
):
|
|
420
427
|
label = models.CharField(
|
|
421
428
|
max_length=CHARFIELD_MAX_LENGTH, unique=True, help_text="Label of the relationship as displayed to users"
|
|
422
429
|
)
|
nautobot/extras/models/tags.py
CHANGED
|
@@ -7,12 +7,13 @@ from nautobot.core.constants import CHARFIELD_MAX_LENGTH
|
|
|
7
7
|
from nautobot.core.models import BaseManager, BaseModel
|
|
8
8
|
from nautobot.core.models.fields import ColorField
|
|
9
9
|
from nautobot.core.models.querysets import RestrictedQuerySet
|
|
10
|
+
from nautobot.extras.models.mixins import SavedViewMixin
|
|
10
11
|
from nautobot.extras.utils import extras_features, TaggableClassesQuery
|
|
11
12
|
|
|
12
13
|
# These imports are in this particular order because of circular import problems
|
|
13
14
|
from .change_logging import ChangeLoggedModel
|
|
14
15
|
from .customfields import CustomFieldModel
|
|
15
|
-
from .mixins import NotesMixin
|
|
16
|
+
from .mixins import ContactMixin, DynamicGroupsModelMixin, NotesMixin
|
|
16
17
|
from .relationships import RelationshipModel
|
|
17
18
|
|
|
18
19
|
#
|
|
@@ -34,7 +35,16 @@ class TagQuerySet(RestrictedQuerySet):
|
|
|
34
35
|
@extras_features(
|
|
35
36
|
"custom_validators",
|
|
36
37
|
)
|
|
37
|
-
class Tag(
|
|
38
|
+
class Tag(
|
|
39
|
+
ChangeLoggedModel,
|
|
40
|
+
ContactMixin,
|
|
41
|
+
CustomFieldModel,
|
|
42
|
+
DynamicGroupsModelMixin,
|
|
43
|
+
NotesMixin,
|
|
44
|
+
RelationshipModel,
|
|
45
|
+
SavedViewMixin,
|
|
46
|
+
BaseModel,
|
|
47
|
+
):
|
|
38
48
|
name = models.CharField(max_length=CHARFIELD_MAX_LENGTH, unique=True)
|
|
39
49
|
content_types = models.ManyToManyField(
|
|
40
50
|
to=ContentType,
|
|
@@ -76,6 +86,7 @@ class TaggedItem(BaseModel, GenericUUIDTaggedItemBase):
|
|
|
76
86
|
tag = models.ForeignKey(to=Tag, related_name="%(app_label)s_%(class)s_items", on_delete=models.CASCADE)
|
|
77
87
|
|
|
78
88
|
documentation_static_path = "docs/user-guide/platform-functionality/tag.html"
|
|
89
|
+
is_metadata_associable_model = False
|
|
79
90
|
|
|
80
91
|
natural_key_field_names = ["pk"]
|
|
81
92
|
|
nautobot/extras/navigation.py
CHANGED
|
@@ -240,6 +240,20 @@ menu_items = (
|
|
|
240
240
|
),
|
|
241
241
|
),
|
|
242
242
|
),
|
|
243
|
+
NavMenuGroup(
|
|
244
|
+
name="Users",
|
|
245
|
+
weight=150,
|
|
246
|
+
items=(
|
|
247
|
+
NavMenuItem(
|
|
248
|
+
link="extras:savedview_list",
|
|
249
|
+
name="Saved Views",
|
|
250
|
+
weight=100,
|
|
251
|
+
permissions=[
|
|
252
|
+
"extras.view_savedview",
|
|
253
|
+
],
|
|
254
|
+
),
|
|
255
|
+
),
|
|
256
|
+
),
|
|
243
257
|
NavMenuGroup(
|
|
244
258
|
name="Data Sources",
|
|
245
259
|
weight=200,
|
|
@@ -448,6 +462,37 @@ menu_items = (
|
|
|
448
462
|
),
|
|
449
463
|
),
|
|
450
464
|
),
|
|
465
|
+
NavMenuGroup(
|
|
466
|
+
name="Metadata",
|
|
467
|
+
weight=700,
|
|
468
|
+
items=(
|
|
469
|
+
NavMenuItem(
|
|
470
|
+
link="extras:metadatatype_list",
|
|
471
|
+
name="Metadata Types",
|
|
472
|
+
weight=100,
|
|
473
|
+
permissions=[
|
|
474
|
+
"extras.view_metadatatype",
|
|
475
|
+
],
|
|
476
|
+
buttons=(
|
|
477
|
+
NavMenuAddButton(
|
|
478
|
+
link="extras:metadatatype_add",
|
|
479
|
+
permissions=[
|
|
480
|
+
"extras.add_metadatatype",
|
|
481
|
+
],
|
|
482
|
+
),
|
|
483
|
+
),
|
|
484
|
+
),
|
|
485
|
+
NavMenuItem(
|
|
486
|
+
link="extras:objectmetadata_list",
|
|
487
|
+
name="Object Metadata",
|
|
488
|
+
weight=200,
|
|
489
|
+
permissions=[
|
|
490
|
+
"extras.view_objectmetadata",
|
|
491
|
+
],
|
|
492
|
+
buttons=(),
|
|
493
|
+
),
|
|
494
|
+
),
|
|
495
|
+
),
|
|
451
496
|
),
|
|
452
497
|
),
|
|
453
498
|
NavMenuTab(
|
|
@@ -713,6 +758,18 @@ navigation = (
|
|
|
713
758
|
),
|
|
714
759
|
),
|
|
715
760
|
),
|
|
761
|
+
NavGrouping(
|
|
762
|
+
name="Users",
|
|
763
|
+
weight=500,
|
|
764
|
+
items=(
|
|
765
|
+
NavItem(
|
|
766
|
+
link="extras:savedview_list",
|
|
767
|
+
name="Saved Views",
|
|
768
|
+
weight=100,
|
|
769
|
+
permissions=["extras.view_savedviews"],
|
|
770
|
+
),
|
|
771
|
+
),
|
|
772
|
+
),
|
|
716
773
|
),
|
|
717
774
|
),
|
|
718
775
|
)
|
|
@@ -45,6 +45,8 @@ class NautobotAppConfig(NautobotConfig):
|
|
|
45
45
|
Subclass of Django's built-in AppConfig class, to be used for Nautobot plugins.
|
|
46
46
|
"""
|
|
47
47
|
|
|
48
|
+
default = True
|
|
49
|
+
|
|
48
50
|
# Plugin metadata
|
|
49
51
|
author = ""
|
|
50
52
|
author_email = ""
|
|
@@ -205,7 +207,7 @@ class NautobotAppConfig(NautobotConfig):
|
|
|
205
207
|
if override_views is not None:
|
|
206
208
|
for qualified_view_name, view in override_views.items():
|
|
207
209
|
self.features.setdefault("overridden_views", []).append(
|
|
208
|
-
(qualified_view_name, f"{view.__module__}.{view.__name__}")
|
|
210
|
+
(qualified_view_name, f"{view.__module__}.{view.view_class.__name__}")
|
|
209
211
|
)
|
|
210
212
|
register_override_views(override_views, self.name)
|
|
211
213
|
|
nautobot/extras/querysets.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
from django.conf import settings
|
|
2
2
|
from django.contrib.contenttypes.models import ContentType
|
|
3
|
-
from django.core.cache import cache
|
|
4
3
|
from django.db.models import F, Model, OuterRef, Q, Subquery
|
|
5
4
|
from django.db.models.functions import JSONObject
|
|
6
5
|
|
|
7
6
|
from nautobot.core.models.query_functions import EmptyGroupByJSONBAgg
|
|
8
7
|
from nautobot.core.models.querysets import RestrictedQuerySet
|
|
9
|
-
from nautobot.core.utils.config import get_settings_or_config
|
|
10
8
|
from nautobot.extras.models.tags import TaggedItem
|
|
11
9
|
|
|
12
10
|
|
|
@@ -85,10 +83,10 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|
|
85
83
|
"""
|
|
86
84
|
Attach the subquery annotation to the base queryset.
|
|
87
85
|
|
|
88
|
-
|
|
89
|
-
we include "weight" and "name" into the result so that we can
|
|
86
|
+
Note that the underlying function of our JSONBAgg in MySQL, `JSONARRAY_AGG`, does not support an `ordering`,
|
|
87
|
+
unlike PostgreSQL's implementation. This is why we include "weight" and "name" into the result so that we can
|
|
88
|
+
sort it within Python to ensure correctness.
|
|
90
89
|
|
|
91
|
-
TODO This method does not accurately reflect location inheritance because of the reasons stated in _get_config_context_filters()
|
|
92
90
|
Do not use this method by itself, use get_config_context() method directly on ConfigContextModel instead.
|
|
93
91
|
"""
|
|
94
92
|
from nautobot.extras.models import ConfigContext
|
|
@@ -96,7 +94,6 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|
|
96
94
|
return self.annotate(
|
|
97
95
|
config_context_data=Subquery(
|
|
98
96
|
ConfigContext.objects.filter(self._get_config_context_filters())
|
|
99
|
-
.order_by("weight", "name")
|
|
100
97
|
.annotate(
|
|
101
98
|
_data=EmptyGroupByJSONBAgg(
|
|
102
99
|
JSONObject(
|
|
@@ -107,15 +104,13 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|
|
107
104
|
)
|
|
108
105
|
)
|
|
109
106
|
.values("_data")
|
|
107
|
+
.order_by()
|
|
110
108
|
)
|
|
111
109
|
).distinct()
|
|
112
110
|
|
|
113
111
|
def _get_config_context_filters(self):
|
|
114
112
|
"""
|
|
115
113
|
This method is constructing the set of Q objects for the specific object types.
|
|
116
|
-
Note that locations filters are not included in the method because the filter needs the
|
|
117
|
-
ability to query the ancestors for a particular tree node for subquery and we lost it since
|
|
118
|
-
moving from mptt to django-tree-queries https://github.com/matthiask/django-tree-queries/issues/54.
|
|
119
114
|
"""
|
|
120
115
|
tag_query_filters = {
|
|
121
116
|
"object_id": OuterRef(OuterRef("pk")),
|
|
@@ -163,81 +158,50 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
|
|
|
163
158
|
|
|
164
159
|
|
|
165
160
|
class DynamicGroupQuerySet(RestrictedQuerySet):
|
|
166
|
-
"""Queryset for `DynamicGroup` objects that provides
|
|
161
|
+
"""Queryset for `DynamicGroup` objects that provides `get_for_object` and `get_for_model` methods."""
|
|
162
|
+
|
|
163
|
+
def get_for_model(self, model):
|
|
164
|
+
"""
|
|
165
|
+
Return all DynamicGroups assignable to the given model class.
|
|
166
|
+
"""
|
|
167
|
+
concrete_model = model._meta.concrete_model
|
|
168
|
+
content_type = ContentType.objects.get_for_model(concrete_model)
|
|
169
|
+
return self.filter(content_type=content_type)
|
|
167
170
|
|
|
168
171
|
def get_list_for_object(self, obj, use_cache=False):
|
|
169
172
|
"""
|
|
170
|
-
Return a list of `DynamicGroup` assigned to the given object.
|
|
171
|
-
which will return a queryset but that is an additional query to the DB when you may just
|
|
172
|
-
want a list.
|
|
173
|
+
Return a (cached) list of `DynamicGroup` objects assigned to the given object.
|
|
173
174
|
|
|
174
175
|
Args:
|
|
175
176
|
obj: The object to seek dynamic groups membership by.
|
|
176
|
-
use_cache:
|
|
177
|
+
use_cache: Obsolete; cache is always used. If truly necessary to get up-to-the-minute accuracy, you should
|
|
178
|
+
call `[dg.update_cached_members() for dg in DynamicGroup.objects.filter(content_type=...)]` beforehand,
|
|
179
|
+
but be aware that that's potentially quite expensive computationally.
|
|
177
180
|
"""
|
|
178
|
-
|
|
179
|
-
raise TypeError(f"{obj} is not an instance of Django Model class")
|
|
180
|
-
|
|
181
|
-
# Get dynamic groups for this content_type using the discrete content_type fields to
|
|
182
|
-
# optimize the query.
|
|
183
|
-
eligible_groups = self._get_eligible_dynamic_groups(obj, use_cache=use_cache)
|
|
184
|
-
|
|
185
|
-
# Filter down to matching groups.
|
|
186
|
-
my_groups = []
|
|
187
|
-
for dynamic_group in list(eligible_groups):
|
|
188
|
-
if dynamic_group.has_member(obj, use_cache=use_cache):
|
|
189
|
-
my_groups.append(dynamic_group)
|
|
190
|
-
|
|
191
|
-
return my_groups
|
|
181
|
+
return list(self.get_for_object(obj))
|
|
192
182
|
|
|
193
183
|
def get_for_object(self, obj, use_cache=False):
|
|
194
184
|
"""
|
|
195
|
-
Return a queryset of `DynamicGroup` objects that are assigned to the given object.
|
|
185
|
+
Return a (cached) queryset of `DynamicGroup` objects that are assigned to the given object.
|
|
196
186
|
|
|
197
187
|
Args:
|
|
198
188
|
obj: The object to seek dynamic groups membership by.
|
|
199
|
-
use_cache:
|
|
189
|
+
use_cache: Obsolete; cache is always used. If truly necessary to get up-to-the-minute accuracy, you should
|
|
190
|
+
call `[dg.update_cached_members() for dg in DynamicGroup.objects.filter(content_type=...)]` beforehand,
|
|
191
|
+
but be aware that's potentially quite expensive computationally.
|
|
200
192
|
"""
|
|
201
|
-
|
|
193
|
+
if not isinstance(obj, Model):
|
|
194
|
+
raise TypeError(f"{obj} is not an instance of Django Model class")
|
|
195
|
+
|
|
196
|
+
return self.filter(
|
|
197
|
+
content_type__app_label=obj._meta.app_label,
|
|
198
|
+
content_type__model=obj._meta.model_name,
|
|
199
|
+
static_group_associations__associated_object_id=obj.id,
|
|
200
|
+
)
|
|
202
201
|
|
|
203
202
|
def get_by_natural_key(self, slug):
|
|
204
203
|
return self.get(slug=slug)
|
|
205
204
|
|
|
206
|
-
@classmethod
|
|
207
|
-
def _get_eligible_dynamic_groups_cache_key(cls, obj):
|
|
208
|
-
"""
|
|
209
|
-
Return the cache key for the queryset of `DynamicGroup` objects that are eligible to potentially contain the
|
|
210
|
-
given object.
|
|
211
|
-
"""
|
|
212
|
-
return f"nautobot.{obj._meta.label_lower}._get_eligible_dynamic_groups"
|
|
213
|
-
|
|
214
|
-
def _get_eligible_dynamic_groups(self, obj, use_cache=False):
|
|
215
|
-
"""
|
|
216
|
-
Return a queryset of `DynamicGroup` objects that are eligible to potentially contain the given object.
|
|
217
|
-
"""
|
|
218
|
-
cache_key = self.__class__._get_eligible_dynamic_groups_cache_key(obj)
|
|
219
|
-
|
|
220
|
-
def _query_eligible_dynamic_groups():
|
|
221
|
-
"""
|
|
222
|
-
A callable to be used as the default value for the cache of which dynamic groups are
|
|
223
|
-
eligible for a given object.
|
|
224
|
-
"""
|
|
225
|
-
# Save a DB query if we can by using the _content_type field on the model which is a cached instance of the ContentType
|
|
226
|
-
if use_cache and hasattr(type(obj), "_content_type"):
|
|
227
|
-
return self.filter(content_type_id=type(obj)._content_type.id)
|
|
228
|
-
return self.filter(
|
|
229
|
-
content_type__app_label=obj._meta.app_label, content_type__model=obj._meta.model_name
|
|
230
|
-
).select_related("content_type")
|
|
231
|
-
|
|
232
|
-
if not use_cache:
|
|
233
|
-
eligible_dynamic_groups = _query_eligible_dynamic_groups()
|
|
234
|
-
cache.set(cache_key, eligible_dynamic_groups, get_settings_or_config("DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT"))
|
|
235
|
-
return eligible_dynamic_groups
|
|
236
|
-
|
|
237
|
-
return cache.get_or_set(
|
|
238
|
-
cache_key, _query_eligible_dynamic_groups, get_settings_or_config("DYNAMIC_GROUPS_MEMBER_CACHE_TIMEOUT")
|
|
239
|
-
)
|
|
240
|
-
|
|
241
205
|
|
|
242
206
|
class DynamicGroupMembershipQuerySet(RestrictedQuerySet):
|
|
243
207
|
"""Queryset for `DynamicGroupMembership` objects."""
|