nautobot 2.2.8__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 +110 -14
- nautobot/core/forms/fields.py +10 -4
- nautobot/core/forms/forms.py +11 -3
- nautobot/core/forms/widgets.py +18 -1
- nautobot/core/graphql/generators.py +2 -2
- nautobot/core/graphql/schema.py +28 -7
- nautobot/core/jobs/__init__.py +20 -3
- 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 +15 -19
- nautobot/core/settings.yaml +48 -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 +28 -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_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 +204 -2
- nautobot/core/tests/test_tables.py +3 -1
- nautobot/core/tests/test_templatetags_helpers.py +12 -5
- nautobot/core/tests/test_templatetags_netutils.py +3 -3
- 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 +282 -99
- nautobot/dcim/models/devices.py +472 -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 +248 -47
- 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/deviceredundancygroup_retrieve.html +6 -0
- 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 +1103 -8
- nautobot/dcim/tests/test_views.py +1525 -343
- nautobot/dcim/urls.py +17 -2
- nautobot/dcim/utils.py +2 -3
- nautobot/dcim/views.py +1109 -113
- 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 +73 -59
- 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 +26 -3
- 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 +87 -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 +109 -101
- nautobot/extras/tables.py +201 -17
- 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 +11 -0
- 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 +586 -8
- nautobot/extras/tests/test_webhooks.py +1 -1
- nautobot/extras/urls.py +5 -0
- nautobot/extras/utils.py +85 -16
- nautobot/extras/views.py +562 -122
- 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 +20 -20
- 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 +9 -2
- 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 +20 -34
- nautobot/project-static/css/base.css +21 -0
- nautobot/project-static/css/dark.css +11 -0
- nautobot/project-static/docs/404.html +894 -90
- nautobot/project-static/docs/apps/index.html +894 -90
- nautobot/project-static/docs/apps/nautobot-apps.html +894 -90
- 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 +921 -122
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +906 -103
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +1620 -905
- nautobot/project-static/docs/code-reference/nautobot/apps/change_logging.html +937 -146
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +979 -190
- nautobot/project-static/docs/code-reference/nautobot/apps/config.html +903 -101
- nautobot/project-static/docs/code-reference/nautobot/apps/constants.html +899 -95
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +993 -195
- nautobot/project-static/docs/code-reference/nautobot/apps/exceptions.html +976 -133
- nautobot/project-static/docs/code-reference/nautobot/apps/factory.html +1080 -274
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +1244 -336
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +1729 -877
- nautobot/project-static/docs/code-reference/nautobot/apps/graphql.html +1166 -383
- nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +2090 -1376
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +2248 -1424
- nautobot/project-static/docs/code-reference/nautobot/apps/querysets.html +914 -113
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +965 -165
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +1012 -225
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +1915 -1279
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +1848 -1104
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +906 -103
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +2335 -1701
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +1804 -1026
- nautobot/project-static/docs/development/apps/api/configuration-view.html +894 -90
- nautobot/project-static/docs/development/apps/api/database-backend-config.html +894 -90
- nautobot/project-static/docs/development/apps/api/models/django-admin.html +894 -90
- nautobot/project-static/docs/development/apps/api/models/global-search.html +894 -90
- nautobot/project-static/docs/development/apps/api/models/graphql.html +894 -90
- nautobot/project-static/docs/development/apps/api/models/index.html +944 -92
- nautobot/project-static/docs/development/apps/api/nautobot-app-config.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/git-repository-content.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/index.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/jobs.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +894 -90
- nautobot/project-static/docs/development/apps/api/platform-features/uniquely-identify-objects.html +894 -90
- nautobot/project-static/docs/development/apps/api/prometheus.html +894 -90
- nautobot/project-static/docs/development/apps/api/setup.html +894 -90
- nautobot/project-static/docs/development/apps/api/testing.html +894 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +894 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +894 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/index.html +894 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/navigation.html +894 -90
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/base-template.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/django-generic-views.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/help-documentation.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/index.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/notes.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/rest-api.html +894 -90
- nautobot/project-static/docs/development/apps/api/views/urls.html +894 -90
- nautobot/project-static/docs/development/apps/index.html +894 -90
- nautobot/project-static/docs/development/apps/migration/code-updates.html +894 -90
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +894 -90
- nautobot/project-static/docs/development/apps/migration/from-v1.html +894 -90
- nautobot/project-static/docs/development/apps/migration/model-updates/dcim.html +894 -90
- nautobot/project-static/docs/development/apps/migration/model-updates/extras.html +894 -90
- nautobot/project-static/docs/development/apps/migration/model-updates/global.html +894 -90
- nautobot/project-static/docs/development/apps/migration/model-updates/ipam.html +894 -90
- nautobot/project-static/docs/development/apps/porting-from-netbox.html +894 -90
- nautobot/project-static/docs/development/core/application-registry.html +894 -90
- nautobot/project-static/docs/development/core/best-practices.html +895 -90
- nautobot/project-static/docs/development/core/bootstrap-ui.html +894 -90
- nautobot/project-static/docs/development/core/caching.html +894 -90
- nautobot/project-static/docs/development/core/controllers.html +894 -90
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +894 -90
- nautobot/project-static/docs/development/core/generic-views.html +894 -90
- nautobot/project-static/docs/development/core/getting-started.html +894 -90
- nautobot/project-static/docs/development/core/homepage.html +894 -90
- nautobot/project-static/docs/development/core/index.html +905 -90
- nautobot/project-static/docs/development/core/model-checklist.html +903 -91
- nautobot/project-static/docs/development/core/model-features.html +894 -90
- nautobot/project-static/docs/development/core/natural-keys.html +894 -90
- nautobot/project-static/docs/development/core/navigation-menu.html +894 -90
- nautobot/project-static/docs/development/core/release-checklist.html +897 -93
- nautobot/project-static/docs/development/core/role-internals.html +894 -90
- nautobot/project-static/docs/development/core/settings.html +894 -90
- nautobot/project-static/docs/development/core/style-guide.html +895 -91
- nautobot/project-static/docs/development/core/templates.html +906 -91
- nautobot/project-static/docs/development/core/testing.html +894 -90
- nautobot/project-static/docs/development/core/user-preferences.html +894 -90
- nautobot/project-static/docs/development/index.html +894 -90
- nautobot/project-static/docs/development/jobs/index.html +1271 -453
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +894 -90
- nautobot/project-static/docs/index.html +9032 -13
- 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 +902 -91
- nautobot/project-static/docs/overview/design_philosophy.html +896 -92
- nautobot/project-static/docs/overview/index.html +13 -8228
- nautobot/project-static/docs/release-notes/index.html +1131 -94
- nautobot/project-static/docs/release-notes/version-1.0.html +894 -90
- nautobot/project-static/docs/release-notes/version-1.1.html +894 -90
- nautobot/project-static/docs/release-notes/version-1.2.html +894 -90
- nautobot/project-static/docs/release-notes/version-1.3.html +894 -90
- nautobot/project-static/docs/release-notes/version-1.4.html +894 -90
- nautobot/project-static/docs/release-notes/version-1.5.html +895 -91
- nautobot/project-static/docs/release-notes/version-1.6.html +895 -91
- nautobot/project-static/docs/release-notes/version-2.0.html +894 -90
- nautobot/project-static/docs/release-notes/version-2.1.html +894 -90
- nautobot/project-static/docs/release-notes/version-2.2.html +1137 -196
- 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 +335 -260
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +894 -90
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/remote.html +894 -90
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +894 -90
- nautobot/project-static/docs/user-guide/administration/configuration/index.html +894 -90
- nautobot/project-static/docs/user-guide/administration/configuration/optional-settings.html +1025 -175
- nautobot/project-static/docs/user-guide/administration/configuration/required-settings.html +894 -90
- nautobot/project-static/docs/user-guide/administration/configuration/time-zones.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/caching.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +902 -90
- nautobot/project-static/docs/user-guide/administration/guides/healthcheck.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/permissions.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/replicating-nautobot.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +894 -90
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +894 -90
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +894 -90
- nautobot/project-static/docs/user-guide/administration/installation/external-authentication.html +894 -90
- nautobot/project-static/docs/user-guide/administration/installation/http-server.html +946 -155
- nautobot/project-static/docs/user-guide/administration/installation/index.html +903 -95
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +936 -124
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +956 -159
- nautobot/project-static/docs/user-guide/administration/installation/services.html +915 -114
- nautobot/project-static/docs/user-guide/administration/installation-extras/docker.html +910 -101
- nautobot/project-static/docs/user-guide/administration/installation-extras/health-checks.html +894 -90
- nautobot/project-static/docs/user-guide/administration/installation-extras/selinux-troubleshooting.html +894 -90
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-netbox.html +894 -90
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +894 -90
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +977 -121
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/database-backup.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/after-you-upgrade.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/before-you-upgrade.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/for-developers.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/index.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/ipam/whats-changed.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/region-and-site-data-migration-guide.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +894 -90
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuit.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittermination.html +895 -91
- nautobot/project-static/docs/user-guide/core-data-model/circuits/circuittype.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/circuits/provider.html +898 -90
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +897 -93
- 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 +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +925 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +925 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +920 -102
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +925 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controller.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/controllermanageddevicegroup.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/device.html +915 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +922 -118
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +923 -119
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicefamily.html +920 -116
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +916 -107
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +928 -110
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +938 -120
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +930 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +939 -121
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +930 -112
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +920 -116
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +923 -119
- nautobot/project-static/docs/user-guide/core-data-model/dcim/manufacturer.html +925 -117
- 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 +918 -114
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerfeed.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +942 -85
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +926 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerpanel.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +945 -88
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +923 -105
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rack.html +931 -127
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackgroup.html +920 -116
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rackreservation.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +924 -106
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +926 -108
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareversion.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/dcim/virtualchassis.html +908 -104
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +938 -90
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/extras/contact.html +899 -91
- nautobot/project-static/docs/user-guide/core-data-model/extras/team.html +899 -91
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/namespace.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/prefix.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/rir.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/routetarget.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/service.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlangroup.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vrf.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/overview/introduction.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenant.html +903 -98
- nautobot/project-static/docs/user-guide/core-data-model/tenancy/tenantgroup.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/cluster.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustergroup.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/clustertype.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/virtualmachine.html +894 -90
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +899 -91
- nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/index.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +894 -90
- 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 +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/relationships.html +894 -90
- nautobot/project-static/docs/user-guide/feature-guides/software-image-files-and-versions.html +894 -90
- nautobot/project-static/docs/user-guide/index.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/change-logging.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/customlink.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1260 -787
- nautobot/project-static/docs/user-guide/platform-functionality/exporttemplate.html +897 -93
- nautobot/project-static/docs/user-guide/platform-functionality/externalintegration.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/graphqlquery.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/imageattachment.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +898 -90
- nautobot/project-static/docs/user-guide/platform-functionality/napalm.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +897 -93
- nautobot/project-static/docs/user-guide/platform-functionality/objectmetadata.html +9061 -0
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +897 -93
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/ui-related-endpoints.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/role.html +897 -93
- nautobot/project-static/docs/user-guide/platform-functionality/savedview.html +9137 -0
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +897 -93
- nautobot/project-static/docs/user-guide/platform-functionality/staticgroupassociation.html +8933 -0
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +952 -123
- nautobot/project-static/docs/user-guide/platform-functionality/users/objectpermission.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/users/token.html +894 -90
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +894 -90
- 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 +12 -8
- 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.8.dist-info → nautobot-2.3.0.dist-info}/METADATA +21 -19
- {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/RECORD +684 -564
- 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.8.dist-info → nautobot-2.3.0.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/NOTICE +0 -0
- {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/WHEEL +0 -0
- {nautobot-2.2.8.dist-info → nautobot-2.3.0.dist-info}/entry_points.txt +0 -0
nautobot/extras/models/mixins.py
CHANGED
|
@@ -2,95 +2,79 @@
|
|
|
2
2
|
Class-modifying mixins that need to be standalone to avoid circular imports.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
from django.contrib.contenttypes.fields import GenericRelation
|
|
6
|
+
from django.db import models
|
|
5
7
|
from django.urls import NoReverseMatch, reverse
|
|
6
8
|
|
|
9
|
+
from nautobot.core.utils.deprecation import method_deprecated_in_favor_of
|
|
7
10
|
from nautobot.core.utils.lookup import get_route_for_model
|
|
8
11
|
|
|
9
12
|
|
|
10
|
-
class
|
|
11
|
-
"""
|
|
12
|
-
Adds properties to a model to facilitate reversing DynamicGroup membership:
|
|
13
|
+
class ContactMixin(models.Model):
|
|
14
|
+
"""Abstract mixin for enabling Contact/Team association to a given model class."""
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
- `dynamic_groups_list` - A list of `DynamicGroup` objects this instance is a member of, performs one less database query than `dynamic_groups`.
|
|
17
|
-
- `dynamic_groups_list_cached` - A list of `DynamicGroup` objects this instance is a member of, uses cached member list if available. Performs no database queries in optimal conditions.
|
|
16
|
+
class Meta:
|
|
17
|
+
abstract = True
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
EX: `delattr(instance, "_dynamic_groups")`
|
|
21
|
-
"""
|
|
19
|
+
is_contact_associable_model = True
|
|
22
20
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
""
|
|
26
|
-
|
|
21
|
+
# Reverse relation so that deleting a ContactMixin automatically deletes any ContactAssociations related to it.
|
|
22
|
+
associated_contacts = GenericRelation(
|
|
23
|
+
"extras.ContactAssociation",
|
|
24
|
+
content_type_field="associated_object_type",
|
|
25
|
+
object_id_field="associated_object_id",
|
|
26
|
+
related_query_name="associated_contacts_%(app_label)s_%(class)s", # e.g. 'associated_contacts_dcim_device'
|
|
27
|
+
)
|
|
27
28
|
|
|
28
|
-
This will NOT use the cached member lists of the dynamic groups and will always query the database for each DynamicGroup.
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
class DynamicGroupMixin:
|
|
31
|
+
"""
|
|
32
|
+
DEPRECATED - use DynamicGroupsModelMixin instead if you need to mark a model as supporting Dynamic Groups.
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
This is necessary because DynamicGroupMixin was incorrectly not implemented as a subclass of models.Model,
|
|
35
|
+
and so it cannot properly implement Model behaviors like the `static_group_association_set` ReverseRelation.
|
|
36
|
+
However, adding this inheritance to DynamicGroupMixin itself would negatively impact existing migrations.
|
|
37
|
+
So unfortunately our best option is to deprecate this class and gradually convert core and app models alike
|
|
38
|
+
to the new DynamicGroupsModelMixin in its place.
|
|
37
39
|
|
|
38
|
-
|
|
40
|
+
Adds `dynamic_groups` property to a model to facilitate reversing (cached) DynamicGroup membership.
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"""
|
|
43
|
-
Return a queryset of `DynamicGroup` objects this instance is a member of.
|
|
42
|
+
If up-to-the-minute accuracy is necessary for your use case, it's up to you to call the
|
|
43
|
+
`DynamicGroup.update_cached_members()` API on any relevant DynamicGroups before accessing this property.
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
Other related properties added by this mixin should be considered obsolete.
|
|
46
|
+
"""
|
|
46
47
|
|
|
47
|
-
|
|
48
|
+
is_dynamic_group_associable_model = True
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
@property
|
|
51
|
+
def dynamic_groups(self):
|
|
52
|
+
"""
|
|
53
|
+
Return a queryset of (cached) `DynamicGroup` objects this instance is a member of.
|
|
50
54
|
"""
|
|
51
55
|
from nautobot.extras.models.groups import DynamicGroup
|
|
52
56
|
|
|
53
|
-
|
|
54
|
-
queryset = DynamicGroup.objects.get_for_object(self, use_cache=True)
|
|
55
|
-
self._dynamic_groups_cached = queryset
|
|
57
|
+
return DynamicGroup.objects.get_for_object(self)
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
@property
|
|
60
|
+
@method_deprecated_in_favor_of(dynamic_groups.fget)
|
|
61
|
+
def dynamic_groups_cached(self):
|
|
62
|
+
"""Deprecated - use `self.dynamic_groups` instead."""
|
|
63
|
+
return self.dynamic_groups
|
|
58
64
|
|
|
59
65
|
@property
|
|
66
|
+
@method_deprecated_in_favor_of(dynamic_groups.fget)
|
|
60
67
|
def dynamic_groups_list(self):
|
|
61
|
-
"""
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
This will NOT use the cached member lists of the dynamic groups and will always query the database for each DynamicGroup.
|
|
65
|
-
|
|
66
|
-
This saves a final query to turn the list into a queryset.
|
|
67
|
-
"""
|
|
68
|
-
from nautobot.extras.models.groups import DynamicGroup
|
|
69
|
-
|
|
70
|
-
if not hasattr(self, "_dynamic_groups_list"):
|
|
71
|
-
dg_list = DynamicGroup.objects.get_list_for_object(self)
|
|
72
|
-
self._dynamic_groups_list = dg_list
|
|
73
|
-
|
|
74
|
-
return self._dynamic_groups_list
|
|
68
|
+
"""Deprecated - use `list(self.dynamic_groups)` instead."""
|
|
69
|
+
return list(self.dynamic_groups)
|
|
75
70
|
|
|
76
71
|
@property
|
|
72
|
+
@method_deprecated_in_favor_of(dynamic_groups.fget)
|
|
77
73
|
def dynamic_groups_list_cached(self):
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
This will use the cached member lists of the dynamic groups if available.
|
|
82
|
-
|
|
83
|
-
In optimal conditions this will incur no database queries.
|
|
84
|
-
"""
|
|
85
|
-
|
|
86
|
-
from nautobot.extras.models.groups import DynamicGroup
|
|
87
|
-
|
|
88
|
-
if not hasattr(self, "_dynamic_groups_list_cached"):
|
|
89
|
-
dg_list = DynamicGroup.objects.get_list_for_object(self, use_cache=True)
|
|
90
|
-
self._dynamic_groups_list_cached = dg_list
|
|
91
|
-
|
|
92
|
-
return self._dynamic_groups_list_cached
|
|
74
|
+
"""Deprecated - use `list(self.dynamic_groups)` instead."""
|
|
75
|
+
return self.dynamic_groups_list
|
|
93
76
|
|
|
77
|
+
# TODO may be able to remove this entirely???
|
|
94
78
|
def get_dynamic_groups_url(self):
|
|
95
79
|
"""Return the dynamic groups URL for a given instance."""
|
|
96
80
|
route = get_route_for_model(self, "dynamicgroups")
|
|
@@ -109,6 +93,23 @@ class DynamicGroupMixin:
|
|
|
109
93
|
return None
|
|
110
94
|
|
|
111
95
|
|
|
96
|
+
class DynamicGroupsModelMixin(DynamicGroupMixin, models.Model):
|
|
97
|
+
"""
|
|
98
|
+
Add this to models to make them fully support Dynamic Groups.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
class Meta:
|
|
102
|
+
abstract = True
|
|
103
|
+
|
|
104
|
+
# Reverse relation so that deleting a DynamicGroupMixin automatically deletes any related StaticGroupAssociations
|
|
105
|
+
static_group_association_set = GenericRelation( # not "static_group_associations" as that'd collide on DynamicGroup
|
|
106
|
+
"extras.StaticGroupAssociation",
|
|
107
|
+
content_type_field="associated_object_type",
|
|
108
|
+
object_id_field="associated_object_id",
|
|
109
|
+
related_query_name="static_group_association_set_%(app_label)s_%(class)s",
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
|
|
112
113
|
class NotesMixin:
|
|
113
114
|
"""
|
|
114
115
|
Adds a `notes` property that returns a queryset of `Notes` membership.
|
|
@@ -141,3 +142,12 @@ class NotesMixin:
|
|
|
141
142
|
continue
|
|
142
143
|
|
|
143
144
|
return None
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class SavedViewMixin(models.Model):
|
|
148
|
+
"""Abstract mixin for enabling Saved View functionality to a given model class."""
|
|
149
|
+
|
|
150
|
+
class Meta:
|
|
151
|
+
abstract = True
|
|
152
|
+
|
|
153
|
+
is_saved_view_model = True
|
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
|
|