nautobot 3.0.0a2__py3-none-any.whl → 3.0.0rc1__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.
- nautobot/apps/choices.py +4 -2
- nautobot/apps/filters.py +7 -9
- nautobot/apps/models.py +2 -2
- nautobot/apps/ui.py +13 -1
- nautobot/apps/utils.py +8 -0
- nautobot/circuits/filters.py +3 -2
- nautobot/circuits/navigation.py +3 -2
- nautobot/circuits/templates/circuits/circuit_create.html +3 -3
- nautobot/circuits/templates/circuits/circuittermination_create.html +9 -24
- nautobot/circuits/templates/circuits/inc/circuit_termination_cable_fragment.html +6 -6
- nautobot/circuits/templates/circuits/inc/speed_widget.html +12 -12
- nautobot/circuits/tests/integration/test_circuit.py +10 -13
- nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +0 -3
- nautobot/circuits/views.py +6 -2
- nautobot/cloud/filters.py +1 -1
- nautobot/cloud/navigation.py +3 -2
- nautobot/core/api/schema.py +1 -1
- nautobot/core/api/serializers.py +6 -1
- nautobot/core/api/urls.py +2 -0
- nautobot/core/api/views.py +12 -0
- nautobot/core/apps/__init__.py +11 -10
- nautobot/core/celery/__init__.py +3 -5
- nautobot/core/checks.py +46 -0
- nautobot/core/choices.py +1 -1
- nautobot/core/cli/bootstrap_v3_to_v5.py +105 -13
- nautobot/core/cli/migrate_deprecated_templates.py +227 -0
- nautobot/core/constants.py +3 -0
- nautobot/core/context_processors.py +9 -1
- nautobot/core/filters.py +4 -0
- nautobot/core/forms/__init__.py +2 -0
- nautobot/core/forms/forms.py +1 -1
- nautobot/core/forms/widgets.py +21 -2
- nautobot/core/jobs/__init__.py +62 -3
- nautobot/core/jobs/groups.py +31 -1
- nautobot/core/management/commands/generate_test_data.py +28 -9
- nautobot/core/models/__init__.py +11 -0
- nautobot/core/models/generics.py +9 -1
- nautobot/core/models/tree_queries.py +10 -5
- nautobot/core/models/utils.py +1 -1
- nautobot/core/settings.py +35 -19
- nautobot/core/settings.yaml +17 -33
- nautobot/core/signals.py +12 -1
- nautobot/core/tables.py +13 -6
- nautobot/core/templates/40x.html +1 -1
- nautobot/core/templates/500.html +2 -2
- nautobot/core/templates/admin/base.html +1 -2
- nautobot/core/templates/admin/change_list.html +9 -12
- nautobot/core/templates/admin/config/config.html +12 -12
- nautobot/core/templates/admin/index.html +3 -3
- nautobot/core/templates/base_django.html +1 -2
- nautobot/core/templates/buttons/export.html +1 -1
- nautobot/core/templates/components/button/dropdown.html +5 -3
- nautobot/core/templates/components/panel/body_wrapper_generic_table.html +1 -1
- nautobot/core/templates/components/panel/header_extra_content_table.html +1 -1
- nautobot/core/templates/components/panel/panel.html +3 -3
- nautobot/core/templates/components/tab/content_wrapper.html +6 -7
- nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +1 -1
- nautobot/core/templates/echarts/echarts.html +22 -9
- nautobot/core/templates/generic/object_bulk_add_component.html +2 -1
- nautobot/core/templates/generic/object_bulk_create.html +6 -5
- nautobot/core/templates/generic/object_bulk_delete.html +1 -1
- nautobot/core/templates/generic/object_bulk_destroy.html +3 -3
- nautobot/core/templates/generic/object_bulk_edit.html +1 -1
- nautobot/core/templates/generic/object_bulk_import.html +1 -1
- nautobot/core/templates/generic/object_bulk_remove.html +2 -2
- nautobot/core/templates/generic/object_bulk_update.html +5 -4
- nautobot/core/templates/generic/object_create.html +5 -4
- nautobot/core/templates/generic/object_delete.html +1 -1
- nautobot/core/templates/generic/object_detail.html +1 -1
- nautobot/core/templates/generic/object_edit.html +1 -1
- nautobot/core/templates/generic/object_import.html +2 -1
- nautobot/core/templates/generic/object_list.html +12 -4
- nautobot/core/templates/generic/object_notes.html +5 -3
- nautobot/core/templates/generic/object_retrieve.html +4 -5
- nautobot/core/templates/graphene/graphiql.html +7 -8
- nautobot/core/templates/home.html +1 -1
- nautobot/core/templates/import_success.html +2 -1
- nautobot/core/templates/inc/computed_fields/panel_data.html +1 -1
- nautobot/core/templates/inc/created_updated.html +7 -3
- nautobot/core/templates/inc/custom_fields/panel_data.html +1 -1
- nautobot/core/templates/inc/footer.html +3 -1
- nautobot/core/templates/inc/form_static_field.html +6 -0
- nautobot/core/templates/inc/header.html +11 -1
- nautobot/core/templates/inc/image_attachments.html +2 -1
- nautobot/core/templates/inc/media.html +14 -0
- nautobot/core/templates/inc/nav_menu.html +3 -9
- nautobot/core/templates/inc/object_details_advanced_panel.html +2 -2
- nautobot/core/templates/inc/search_panel.html +4 -4
- nautobot/core/templates/login.html +4 -2
- nautobot/core/templates/nautobot_config.py.j2 +6 -11
- nautobot/core/templates/redoc_ui.html +7 -0
- nautobot/core/templates/rest_framework/api.html +103 -2
- nautobot/core/templates/search.html +1 -1
- nautobot/core/templates/swagger_ui.html +17 -3
- nautobot/core/templates/system_jobs/import_objects.html +1 -2
- nautobot/core/templates/utilities/confirmation_form.html +2 -2
- nautobot/core/templates/utilities/obj_table.html +10 -2
- nautobot/core/templates/utilities/render_field.html +7 -7
- nautobot/core/templates/utilities/render_jinja2.html +2 -2
- nautobot/core/templates/utilities/templatetags/filter_form_drawer.html +37 -4
- nautobot/core/templates/utilities/theme_preview.html +19 -3
- nautobot/core/templates/widgets/number_input_with_choices.html +44 -0
- nautobot/core/templates/widgets/selectwithdisabled_option.html +3 -1
- nautobot/core/templatetags/helpers.py +76 -18
- nautobot/core/testing/api.py +68 -9
- nautobot/core/testing/filters.py +0 -23
- nautobot/core/testing/integration.py +41 -17
- nautobot/core/testing/mixins.py +2 -0
- nautobot/core/testing/utils.py +18 -4
- nautobot/core/testing/views.py +104 -13
- nautobot/core/tests/integration/test_app_home.py +34 -30
- nautobot/core/tests/integration/test_app_navbar.py +3 -0
- nautobot/core/tests/integration/test_filters.py +48 -11
- nautobot/core/tests/integration/test_theme.py +22 -21
- nautobot/core/tests/nautobot_config.py +3 -0
- nautobot/core/tests/nautobot_config_without_example_apps.py +4 -0
- nautobot/core/tests/runner.py +8 -1
- nautobot/core/tests/test_api.py +5 -3
- nautobot/core/tests/test_breadcrumbs.py +27 -28
- nautobot/core/tests/test_checks.py +28 -0
- nautobot/core/tests/test_cli.py +40 -0
- nautobot/core/tests/test_config.py +2 -1
- nautobot/core/tests/test_forms.py +55 -13
- nautobot/core/tests/test_jobs.py +144 -3
- nautobot/core/tests/test_nautobot_server.py +2 -0
- nautobot/core/tests/test_navigations.py +76 -1
- nautobot/core/tests/test_patch_social_django.py +42 -0
- nautobot/core/tests/test_renderers.py +59 -0
- nautobot/core/tests/test_settings_schema.py +1 -0
- nautobot/core/tests/test_tables.py +3 -1
- nautobot/core/tests/test_templatetags_helpers.py +62 -13
- nautobot/core/tests/test_templatetags_ui_framework.py +4 -4
- nautobot/core/tests/test_titles.py +0 -16
- nautobot/core/tests/test_tree_queries.py +14 -1
- nautobot/core/tests/test_ui.py +123 -4
- nautobot/core/tests/test_utils.py +72 -5
- nautobot/core/tests/test_views.py +159 -31
- nautobot/core/ui/breadcrumbs.py +70 -29
- nautobot/core/ui/bulk_buttons.py +1 -1
- nautobot/core/ui/choices.py +143 -27
- nautobot/core/ui/constants.py +76 -12
- nautobot/core/ui/echarts.py +15 -20
- nautobot/core/ui/object_detail.py +143 -55
- nautobot/core/ui/titles.py +3 -6
- nautobot/core/urls.py +20 -9
- nautobot/core/utils/cache.py +2 -1
- nautobot/core/utils/filtering.py +28 -18
- nautobot/core/utils/lookup.py +49 -8
- nautobot/core/utils/module_loading.py +21 -0
- nautobot/core/utils/patch_social_django.py +128 -0
- nautobot/core/views/__init__.py +38 -1
- nautobot/core/views/generic.py +3 -3
- nautobot/core/views/mixins.py +45 -22
- nautobot/core/views/renderers.py +4 -3
- nautobot/core/views/viewsets.py +2 -1
- nautobot/data_validation/apps.py +1 -5
- nautobot/data_validation/custom_validators.py +4 -4
- nautobot/data_validation/filters.py +1 -1
- nautobot/data_validation/forms.py +40 -0
- nautobot/data_validation/migrations/0001_initial.py +0 -7
- nautobot/data_validation/migrations/0002_data_migration_from_app.py +3 -14
- nautobot/data_validation/models.py +16 -7
- nautobot/data_validation/navigation.py +8 -1
- nautobot/data_validation/tables.py +12 -5
- nautobot/data_validation/templates/data_validation/datacompliance_tab.html +1 -0
- nautobot/data_validation/templates/data_validation/device_constraints.html +61 -0
- nautobot/data_validation/tests/__init__.py +2 -2
- nautobot/data_validation/tests/migrations/test_migrations.py +83 -3
- nautobot/data_validation/tests/test_data_compliance_rules.py +12 -7
- nautobot/data_validation/tests/test_filters.py +8 -6
- nautobot/data_validation/tests/test_models.py +15 -0
- nautobot/data_validation/tests/test_views.py +190 -32
- nautobot/data_validation/urls.py +2 -5
- nautobot/data_validation/views.py +73 -40
- nautobot/dcim/api/serializers.py +3 -13
- nautobot/dcim/apps.py +4 -0
- nautobot/dcim/choices.py +65 -0
- nautobot/dcim/constants.py +7 -0
- nautobot/dcim/custom_validators.py +84 -0
- nautobot/dcim/factory.py +1 -1
- nautobot/dcim/filter_mixins.py +353 -4
- nautobot/dcim/{filters/__init__.py → filters.py} +15 -36
- nautobot/dcim/forms.py +90 -4
- nautobot/dcim/migrations/0075_interface_duplex_interface_speed_and_more.py +32 -0
- nautobot/dcim/migrations/{0075_add_deviceclusterassignment.py → 0076_add_deviceclusterassignment.py} +1 -1
- nautobot/dcim/migrations/{0076_device_cluster_to_clusters_data_migration.py → 0077_device_cluster_to_clusters_data_migration.py} +1 -1
- nautobot/dcim/migrations/{0077_remove_device_cluster.py → 0078_remove_device_cluster.py} +1 -1
- nautobot/dcim/migrations/0079_remove_device_location_tenant_name_uniqueness.py +16 -0
- nautobot/dcim/migrations/0080_device_name_data_migration.py +59 -0
- nautobot/dcim/migrations/0081_alter_device_device_redundancy_group_priority_and_more.py +25 -0
- nautobot/dcim/models/device_component_templates.py +33 -1
- nautobot/dcim/models/device_components.py +98 -64
- nautobot/dcim/models/devices.py +30 -20
- nautobot/dcim/navigation.py +7 -6
- nautobot/dcim/tables/devices.py +18 -0
- nautobot/dcim/tables/devicetypes.py +8 -1
- nautobot/dcim/tables/racks.py +0 -2
- nautobot/dcim/tables/template_code.py +15 -15
- nautobot/dcim/templates/dcim/cable_connect.html +28 -112
- nautobot/dcim/templates/dcim/cable_trace.html +0 -4
- nautobot/dcim/templates/dcim/{cable_edit.html → cable_update.html} +1 -1
- nautobot/dcim/templates/dcim/consoleport.html +7 -6
- nautobot/dcim/templates/dcim/consoleserverport.html +7 -6
- nautobot/dcim/templates/dcim/device/config.html +2 -2
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +1 -1
- nautobot/dcim/templates/dcim/device/status.html +8 -8
- nautobot/dcim/templates/dcim/device.html +1 -1
- nautobot/dcim/templates/dcim/device_component_add.html +2 -2
- nautobot/dcim/templates/dcim/device_create.html +5 -3
- nautobot/dcim/templates/dcim/device_interface_delete.html +1 -1
- nautobot/dcim/templates/dcim/device_list.html +73 -10
- nautobot/dcim/templates/dcim/devicebay.html +1 -1
- nautobot/dcim/templates/dcim/devicebay_populate.html +2 -2
- nautobot/dcim/templates/dcim/devicetype_component_add.html +2 -2
- nautobot/dcim/templates/dcim/footer_convert_to_contact_or_team_record.html +14 -0
- nautobot/dcim/templates/dcim/frontport.html +10 -9
- nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +1 -1
- nautobot/dcim/templates/dcim/inc/edit_form_softwareversion_js.html +2 -2
- nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +1 -1
- nautobot/dcim/templates/dcim/inc/rack_elevation.html +1 -1
- nautobot/dcim/templates/dcim/interface.html +35 -7
- nautobot/dcim/templates/dcim/interface_bulk_delete.html +1 -1
- nautobot/dcim/templates/dcim/interface_edit.html +2 -0
- nautobot/dcim/templates/dcim/inventoryitem.html +1 -1
- nautobot/dcim/templates/dcim/inventoryitem_add.html +3 -1
- nautobot/dcim/templates/dcim/inventoryitem_bulk_delete.html +1 -1
- nautobot/dcim/templates/dcim/inventoryitem_edit.html +3 -1
- nautobot/dcim/templates/dcim/module/base.html +49 -9
- nautobot/dcim/templates/dcim/module_consoleports.html +1 -1
- nautobot/dcim/templates/dcim/module_consoleserverports.html +1 -1
- nautobot/dcim/templates/dcim/module_frontports.html +1 -1
- nautobot/dcim/templates/dcim/module_interfaces.html +1 -1
- nautobot/dcim/templates/dcim/module_list.html +57 -8
- nautobot/dcim/templates/dcim/module_modulebays.html +1 -1
- nautobot/dcim/templates/dcim/module_poweroutlets.html +1 -1
- nautobot/dcim/templates/dcim/module_powerports.html +1 -1
- nautobot/dcim/templates/dcim/module_rearports.html +1 -1
- nautobot/dcim/templates/dcim/modulefamily_retrieve.html +1 -1
- nautobot/dcim/templates/dcim/moduletype_list.html +2 -2
- nautobot/dcim/templates/dcim/moduletype_retrieve.html +49 -9
- nautobot/dcim/templates/dcim/platform_create.html +1 -1
- nautobot/dcim/templates/dcim/poweroutlet.html +1 -1
- nautobot/dcim/templates/dcim/powerport.html +6 -5
- nautobot/dcim/templates/dcim/rack_elevation_list.html +17 -5
- nautobot/dcim/templates/dcim/rack_retrieve.html +22 -15
- nautobot/dcim/templates/dcim/rearport.html +8 -7
- nautobot/dcim/templates/dcim/trace/cable.html +1 -1
- nautobot/dcim/templates/dcim/virtualchassis_add_member.html +16 -14
- nautobot/dcim/templates/dcim/virtualchassis_update.html +15 -7
- nautobot/dcim/tests/integration/test_controller.py +4 -6
- nautobot/dcim/tests/integration/test_controller_managed_device_group.py +1 -5
- nautobot/dcim/tests/integration/test_create_device.py +0 -2
- nautobot/dcim/tests/integration/test_device_bulk_operations.py +1 -3
- nautobot/dcim/tests/integration/test_fileinputpicker.py +6 -10
- nautobot/dcim/tests/integration/test_location_bulk_operations.py +0 -2
- nautobot/dcim/tests/integration/test_module_bay_position.py +3 -4
- nautobot/dcim/tests/test_api.py +194 -6
- nautobot/dcim/tests/test_custom_validators.py +229 -0
- nautobot/dcim/tests/test_filters.py +55 -7
- nautobot/dcim/tests/test_forms.py +110 -8
- nautobot/dcim/tests/test_graphql.py +44 -1
- nautobot/dcim/tests/test_models.py +328 -4
- nautobot/dcim/tests/test_tables.py +160 -0
- nautobot/dcim/tests/test_views.py +132 -29
- nautobot/dcim/urls.py +64 -21
- nautobot/dcim/utils.py +3 -3
- nautobot/dcim/views.py +777 -397
- nautobot/extras/api/views.py +60 -45
- nautobot/extras/choices.py +2 -13
- nautobot/extras/datasources/git.py +3 -1
- nautobot/extras/{filters/mixins.py → filter_mixins.py} +1 -1
- nautobot/extras/{filters/customfields.py → filter_mixins_customfields.py} +42 -6
- nautobot/extras/{filters/__init__.py → filters.py} +33 -48
- nautobot/extras/forms/forms.py +14 -15
- nautobot/extras/forms/mixins.py +0 -41
- nautobot/extras/jobs.py +2 -0
- nautobot/extras/jobs_ui.py +4 -3
- nautobot/extras/management/__init__.py +11 -0
- nautobot/extras/management/commands/refresh_dynamic_group_member_caches.py +4 -1
- nautobot/extras/migrations/0127_approval_workflow_models.py +6 -6
- nautobot/extras/migrations/0129_jobresult_debug_log_count_jobresult_error_log_count_and_more.py +37 -0
- nautobot/extras/migrations/0130_jobresult_generate_log_entry_counts.py +42 -0
- nautobot/extras/migrations/0131_configcontext_device_families.py +18 -0
- nautobot/extras/models/__init__.py +1 -2
- nautobot/extras/models/approvals.py +33 -14
- nautobot/extras/models/change_logging.py +4 -0
- nautobot/extras/models/contacts.py +2 -0
- nautobot/extras/models/groups.py +44 -5
- nautobot/extras/models/jobs.py +60 -4
- nautobot/extras/models/mixins.py +28 -0
- nautobot/extras/models/models.py +23 -2
- nautobot/extras/models/secrets.py +1 -0
- nautobot/extras/models/statuses.py +0 -15
- nautobot/extras/navigation.py +13 -9
- nautobot/extras/plugins/__init__.py +33 -55
- nautobot/extras/plugins/marketplace_manifest.yml +49 -1
- nautobot/extras/plugins/tables.py +3 -3
- nautobot/extras/plugins/urls.py +2 -21
- nautobot/extras/plugins/utils.py +1 -33
- nautobot/extras/plugins/views.py +0 -9
- nautobot/extras/querysets.py +8 -0
- nautobot/extras/signals.py +20 -19
- nautobot/extras/tables.py +64 -68
- nautobot/extras/templates/django_ajax_tables/ajax_wrapper.html +2 -0
- nautobot/extras/templates/extras/approval_dashboard.html +7 -5
- nautobot/extras/templates/extras/approvalworkflowdefinition_update.html +4 -2
- nautobot/extras/templates/extras/approvalworkflowstage_retrieve.html +20 -12
- nautobot/extras/templates/extras/configcontext_update.html +1 -0
- nautobot/extras/templates/extras/configcontextschema_validation.html +2 -2
- nautobot/extras/templates/extras/dynamicgroup_retrieve.html +11 -5
- nautobot/extras/templates/extras/dynamicgroup_update.html +1 -1
- nautobot/extras/templates/extras/gitrepository_result.html +0 -2
- nautobot/extras/templates/extras/inc/approval_buttons_column.html +20 -6
- nautobot/extras/templates/extras/inc/bulk_edit_overridable_field.html +8 -7
- nautobot/extras/templates/extras/inc/configcontext_format.html +10 -3
- nautobot/extras/templates/extras/inc/graphqlquery_execute.html +71 -0
- nautobot/extras/templates/extras/inc/job_tiles.html +15 -3
- nautobot/extras/templates/extras/inc/json_format.html +10 -3
- nautobot/extras/templates/extras/inc/overridable_field.html +13 -12
- nautobot/extras/templates/extras/job.html +29 -12
- nautobot/extras/templates/extras/job_bulk_edit.html +18 -0
- nautobot/extras/templates/extras/job_edit.html +52 -46
- nautobot/extras/templates/extras/job_list.html +29 -25
- nautobot/extras/templates/extras/marketplace.html +5 -9
- nautobot/extras/templates/extras/object_configcontext.html +1 -1
- nautobot/extras/templates/extras/object_dynamicgroups.html +2 -2
- nautobot/extras/templates/extras/objectchange_retrieve.html +19 -39
- nautobot/extras/templates/extras/plugin_detail.html +29 -24
- nautobot/extras/templates/extras/plugins_list.html +16 -26
- nautobot/extras/templates/extras/role_retrieve.html +64 -0
- nautobot/extras/templates/extras/scheduledjob.html +4 -2
- nautobot/extras/templates/extras/secret_create.html +1 -1
- nautobot/extras/templatetags/custom_links.py +12 -12
- nautobot/extras/templatetags/job_buttons.py +14 -12
- nautobot/extras/test_jobs/invalid_import.py +9 -0
- nautobot/extras/test_jobs/log_counts_by_level.py +23 -0
- nautobot/extras/test_jobs/missing_import.py +11 -0
- nautobot/extras/tests/integration/test_computedfields.py +8 -9
- nautobot/extras/tests/integration/test_configcontextschema.py +27 -26
- nautobot/extras/tests/integration/test_customfields.py +9 -10
- nautobot/extras/tests/integration/test_dynamicgroups.py +12 -9
- nautobot/extras/tests/integration/test_plugin_banner.py +3 -0
- nautobot/extras/tests/integration/test_plugins.py +18 -6
- nautobot/extras/tests/integration/test_relationships.py +0 -2
- nautobot/extras/tests/test_api.py +90 -18
- nautobot/extras/tests/test_approvals.py +38 -38
- nautobot/extras/tests/test_changelog.py +59 -5
- nautobot/extras/tests/test_customfields.py +22 -13
- nautobot/extras/tests/test_customfields_filters.py +479 -0
- nautobot/extras/tests/test_dynamicgroups.py +39 -1
- nautobot/extras/tests/test_filters.py +57 -22
- nautobot/extras/tests/test_forms.py +18 -21
- nautobot/extras/tests/test_jobs.py +25 -4
- nautobot/extras/tests/test_migrations.py +1 -0
- nautobot/extras/tests/test_models.py +51 -33
- nautobot/extras/tests/test_plugins.py +36 -10
- nautobot/extras/tests/test_utils.py +3 -4
- nautobot/extras/tests/test_views.py +52 -112
- nautobot/extras/urls.py +0 -14
- nautobot/extras/views.py +164 -71
- nautobot/ipam/factory.py +7 -0
- nautobot/ipam/filter_mixins.py +38 -0
- nautobot/ipam/filters.py +53 -38
- nautobot/ipam/formfields.py +1 -1
- nautobot/ipam/forms.py +6 -3
- nautobot/ipam/migrations/0030_ipam__namespaces.py +13 -0
- nautobot/ipam/migrations/0031_ipam___data_migrations.py +4 -1
- nautobot/ipam/migrations/0054_namespace_tenant.py +25 -0
- nautobot/ipam/models.py +29 -2
- nautobot/ipam/navigation.py +3 -2
- nautobot/ipam/signals.py +71 -0
- nautobot/ipam/tables.py +19 -6
- nautobot/ipam/templates/ipam/inc/toggle_available.html +10 -10
- nautobot/ipam/templates/ipam/inc/vlangroup_header.html +1 -0
- nautobot/ipam/templates/ipam/ipaddress.html +14 -0
- nautobot/ipam/templates/ipam/ipaddress_merge.html +3 -3
- nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +1 -0
- nautobot/ipam/templates/ipam/namespace_ip_addresses.html +1 -1
- nautobot/ipam/templates/ipam/namespace_prefixes.html +1 -1
- nautobot/ipam/templates/ipam/namespace_update.html +15 -0
- nautobot/ipam/templates/ipam/namespace_vrfs.html +1 -1
- nautobot/ipam/templates/ipam/prefix_delete.html +1 -1
- nautobot/ipam/templates/ipam/prefix_list.html +14 -13
- nautobot/ipam/templates/ipam/vlan_interfaces.html +1 -1
- nautobot/ipam/templates/ipam/vlan_vminterfaces.html +1 -1
- nautobot/ipam/tests/migration/test_migrations.py +89 -0
- nautobot/ipam/tests/test_api.py +13 -6
- nautobot/ipam/tests/test_filters.py +36 -1
- nautobot/ipam/tests/test_forms.py +1 -1
- nautobot/ipam/tests/test_models.py +44 -2
- nautobot/ipam/tests/test_tables.py +1 -2
- nautobot/ipam/tests/test_utils.py +1 -1
- nautobot/ipam/tests/test_views.py +13 -14
- nautobot/ipam/ui.py +0 -17
- nautobot/ipam/utils/migrations.py +16 -2
- nautobot/ipam/utils/testing.py +9 -3
- nautobot/ipam/views.py +53 -11
- nautobot/load_balancers/__init__.py +0 -0
- nautobot/load_balancers/api/__init__.py +1 -0
- nautobot/load_balancers/api/serializers.py +75 -0
- nautobot/load_balancers/api/urls.py +23 -0
- nautobot/load_balancers/api/views.py +61 -0
- nautobot/load_balancers/apps.py +17 -0
- nautobot/load_balancers/choices.py +167 -0
- nautobot/load_balancers/filters.py +225 -0
- nautobot/load_balancers/forms.py +532 -0
- nautobot/load_balancers/management/commands/__init__.py +0 -0
- nautobot/load_balancers/management/commands/generate_load_balancer_models_test_data.py +38 -0
- nautobot/load_balancers/migrations/0001_initial.py +465 -0
- nautobot/load_balancers/migrations/0002_create_default_statuses_pool_members.py +31 -0
- nautobot/load_balancers/migrations/__init__.py +0 -0
- nautobot/load_balancers/models.py +423 -0
- nautobot/load_balancers/navigation.py +80 -0
- nautobot/load_balancers/tables.py +255 -0
- nautobot/load_balancers/tests/__init__.py +474 -0
- nautobot/load_balancers/tests/test_api.py +353 -0
- nautobot/load_balancers/tests/test_filters.py +134 -0
- nautobot/load_balancers/tests/test_forms.py +266 -0
- nautobot/load_balancers/tests/test_models.py +195 -0
- nautobot/load_balancers/tests/test_views.py +229 -0
- nautobot/load_balancers/urls.py +17 -0
- nautobot/load_balancers/views.py +248 -0
- nautobot/project-static/dist/css/github-dark.min.css +10 -0
- nautobot/project-static/dist/css/github.min.css +10 -0
- nautobot/project-static/dist/css/nautobot.css +1 -11
- nautobot/project-static/dist/css/nautobot.css.map +1 -1
- nautobot/project-static/dist/js/libraries.js +1 -1
- nautobot/project-static/dist/js/libraries.js.map +1 -1
- nautobot/project-static/dist/js/nautobot.js +1 -1
- nautobot/project-static/dist/js/nautobot.js.map +1 -1
- nautobot/project-static/js/cabletrace.js +1 -1
- nautobot/project-static/js/forms.js +13 -0
- nautobot/project-static/js/interface_filtering.js +20 -16
- nautobot/project-static/nautobot-icons/battery-3.svg +3 -0
- nautobot/project-static/nautobot-icons/bus-globe.svg +3 -0
- nautobot/project-static/nautobot-icons/bus-shield-check.svg +3 -0
- nautobot/project-static/nautobot-icons/bus-shield.svg +3 -0
- nautobot/project-static/nautobot-icons/cloud.svg +1 -1
- nautobot/project-static/nautobot-icons/control-panel.svg +1 -1
- nautobot/project-static/nautobot-icons/device-lifecycle.svg +1 -1
- nautobot/project-static/nautobot-icons/elements.svg +1 -1
- nautobot/project-static/nautobot-icons/extensibility.svg +3 -0
- nautobot/project-static/nautobot-icons/hammer.svg +1 -1
- nautobot/project-static/nautobot-icons/organization.svg +3 -0
- nautobot/project-static/nautobot-icons/secrets.svg +1 -1
- nautobot/project-static/nautobot-icons/security.svg +3 -0
- nautobot/project-static/nautobot-icons/server.svg +1 -1
- nautobot/project-static/nautobot-icons/star-filled.svg +1 -1
- nautobot/project-static/nautobot-icons/star.svg +1 -1
- nautobot/tenancy/api/serializers.py +1 -0
- nautobot/tenancy/api/views.py +2 -1
- nautobot/tenancy/{filters/__init__.py → filters.py} +2 -10
- nautobot/tenancy/navigation.py +3 -1
- nautobot/tenancy/tests/test_filters.py +0 -2
- nautobot/tenancy/views.py +2 -1
- nautobot/ui/package-lock.json +87 -4
- nautobot/ui/package.json +2 -1
- nautobot/ui/src/js/collapse.js +3 -3
- nautobot/ui/src/js/nautobot.js +16 -1
- nautobot/ui/src/js/select2.js +53 -2
- nautobot/ui/src/scss/colors.scss +1 -1
- nautobot/ui/src/scss/nautobot.scss +112 -30
- nautobot/ui/webpack.config.js +13 -0
- nautobot/users/templates/users/preferences.html +11 -2
- nautobot/users/templates/users/profile.html +45 -12
- nautobot/users/templates/users/sessionkey_delete.html +1 -1
- nautobot/users/tests/test_api.py +4 -0
- nautobot/users/views.py +4 -2
- nautobot/virtualization/filters.py +6 -1
- nautobot/virtualization/models.py +1 -68
- nautobot/virtualization/navigation.py +3 -2
- nautobot/virtualization/templates/virtualization/virtual_machine_vminterface_delete.html +1 -1
- nautobot/virtualization/templates/virtualization/virtualmachine_list.html +2 -2
- nautobot/virtualization/templates/virtualization/virtualmachine_update.html +3 -1
- nautobot/virtualization/tests/test_api.py +3 -0
- nautobot/virtualization/tests/test_filters.py +10 -1
- nautobot/virtualization/tests/test_models.py +45 -4
- nautobot/virtualization/views.py +4 -1
- nautobot/vpn/__init__.py +0 -0
- nautobot/vpn/api/serializers.py +113 -0
- nautobot/vpn/api/urls.py +19 -0
- nautobot/vpn/api/views.py +70 -0
- nautobot/vpn/apps.py +8 -0
- nautobot/vpn/choices.py +171 -0
- nautobot/vpn/factory.py +219 -0
- nautobot/vpn/filters.py +234 -0
- nautobot/vpn/forms.py +487 -0
- nautobot/vpn/homepage.py +19 -0
- nautobot/vpn/migrations/0001_initial.py +541 -0
- nautobot/vpn/migrations/0002_populate_defaults.py +199 -0
- nautobot/vpn/migrations/__init__.py +0 -0
- nautobot/vpn/models.py +535 -0
- nautobot/vpn/navigation.py +98 -0
- nautobot/vpn/tables.py +383 -0
- nautobot/vpn/templates/vpn/vpnprofile_create.html +150 -0
- nautobot/vpn/tests/__init__.py +0 -0
- nautobot/vpn/tests/test_api.py +336 -0
- nautobot/vpn/tests/test_filters.py +139 -0
- nautobot/vpn/tests/test_forms.py +293 -0
- nautobot/vpn/tests/test_models.py +147 -0
- nautobot/vpn/tests/test_views.py +300 -0
- nautobot/vpn/urls.py +16 -0
- nautobot/vpn/views.py +495 -0
- nautobot/wireless/navigation.py +3 -2
- nautobot/wireless/tests/integration/test_radio_profile.py +1 -5
- nautobot/wireless/tests/test_api.py +1 -1
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/METADATA +15 -15
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/RECORD +514 -572
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/entry_points.txt +1 -0
- nautobot/circuits/templates/circuits/circuit.html +0 -2
- nautobot/circuits/templates/circuits/circuit_edit.html +0 -2
- nautobot/circuits/templates/circuits/circuit_retrieve.html +0 -2
- nautobot/circuits/templates/circuits/circuit_update.html +0 -1
- nautobot/circuits/templates/circuits/circuittermination.html +0 -2
- nautobot/circuits/templates/circuits/circuittermination_edit.html +0 -2
- nautobot/circuits/templates/circuits/circuittermination_retrieve.html +0 -2
- nautobot/circuits/templates/circuits/circuittermination_update.html +0 -1
- nautobot/circuits/templates/circuits/circuittype.html +0 -2
- nautobot/circuits/templates/circuits/circuittype_retrieve.html +0 -2
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +0 -85
- nautobot/circuits/templates/circuits/provider.html +0 -2
- nautobot/circuits/templates/circuits/provider_edit.html +0 -2
- nautobot/circuits/templates/circuits/provider_retrieve.html +0 -1
- nautobot/circuits/templates/circuits/provider_update.html +0 -1
- nautobot/circuits/templates/circuits/providernetwork.html +0 -2
- nautobot/circuits/templates/circuits/providernetwork_retrieve.html +0 -2
- nautobot/cloud/templates/cloud/cloudaccount_retrieve.html +0 -2
- nautobot/cloud/templates/cloud/cloudnetwork_retrieve.html +0 -2
- nautobot/cloud/templates/cloud/cloudresourcetype_retrieve.html +0 -2
- nautobot/cloud/templates/cloud/cloudservice_retrieve.html +0 -2
- nautobot/core/templates/buttons/import.html +0 -9
- nautobot/data_validation/template_content.py +0 -42
- nautobot/data_validation/templates/data_validation/datacompliance_retrieve.html +0 -1
- nautobot/dcim/filters/mixins.py +0 -354
- nautobot/dcim/templates/dcim/controller/base.html +0 -2
- nautobot/dcim/templates/dcim/controller_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +0 -2
- nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/device/base.html +0 -2
- nautobot/dcim/templates/dcim/device/consoleports.html +0 -2
- nautobot/dcim/templates/dcim/device/consoleserverports.html +0 -2
- nautobot/dcim/templates/dcim/device/devicebays.html +0 -2
- nautobot/dcim/templates/dcim/device/frontports.html +0 -2
- nautobot/dcim/templates/dcim/device/interfaces.html +0 -2
- nautobot/dcim/templates/dcim/device/inventory.html +0 -2
- nautobot/dcim/templates/dcim/device/modulebays.html +0 -2
- nautobot/dcim/templates/dcim/device/poweroutlets.html +0 -2
- nautobot/dcim/templates/dcim/device/powerports.html +0 -2
- nautobot/dcim/templates/dcim/device/rearports.html +0 -2
- nautobot/dcim/templates/dcim/device/wireless.html +0 -2
- nautobot/dcim/templates/dcim/device_component.html +0 -2
- nautobot/dcim/templates/dcim/device_edit.html +0 -2
- nautobot/dcim/templates/dcim/devicefamily_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/deviceredundancygroup_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/devicetype.html +0 -2
- nautobot/dcim/templates/dcim/devicetype_edit.html +0 -2
- nautobot/dcim/templates/dcim/devicetype_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/inc/device_napalm_tabs.html +0 -1
- nautobot/dcim/templates/dcim/interfaceredundancygroup_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/location.html +0 -2
- nautobot/dcim/templates/dcim/location_edit.html +0 -2
- nautobot/dcim/templates/dcim/location_retrieve.html +0 -243
- nautobot/dcim/templates/dcim/locationtype.html +0 -2
- nautobot/dcim/templates/dcim/locationtype_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/manufacturer.html +0 -2
- nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -1
- nautobot/dcim/templates/dcim/platform.html +0 -2
- nautobot/dcim/templates/dcim/powerfeed.html +0 -2
- nautobot/dcim/templates/dcim/powerfeed_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/powerpanel.html +0 -2
- nautobot/dcim/templates/dcim/powerpanel_edit.html +0 -2
- nautobot/dcim/templates/dcim/powerpanel_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/rack.html +0 -2
- nautobot/dcim/templates/dcim/rack_edit.html +0 -2
- nautobot/dcim/templates/dcim/rackgroup.html +0 -2
- nautobot/dcim/templates/dcim/rackreservation.html +0 -2
- nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/softwareversion_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/virtualchassis.html +0 -2
- nautobot/dcim/templates/dcim/virtualchassis_add.html +0 -2
- nautobot/dcim/templates/dcim/virtualchassis_edit.html +0 -2
- nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +0 -2
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +0 -2
- nautobot/dcim/ui.py +0 -29
- nautobot/extras/templates/extras/computedfield.html +0 -2
- nautobot/extras/templates/extras/computedfield_retrieve.html +0 -2
- nautobot/extras/templates/extras/configcontext.html +0 -2
- nautobot/extras/templates/extras/configcontext_edit.html +0 -2
- nautobot/extras/templates/extras/configcontext_retrieve.html +0 -2
- nautobot/extras/templates/extras/configcontextschema.html +0 -2
- nautobot/extras/templates/extras/configcontextschema_edit.html +0 -2
- nautobot/extras/templates/extras/contact_retrieve.html +0 -2
- nautobot/extras/templates/extras/customfield.html +0 -2
- nautobot/extras/templates/extras/customfield_edit.html +0 -2
- nautobot/extras/templates/extras/customfield_retrieve.html +0 -2
- nautobot/extras/templates/extras/customlink.html +0 -2
- nautobot/extras/templates/extras/dynamicgroup.html +0 -2
- nautobot/extras/templates/extras/dynamicgroup_edit.html +0 -2
- nautobot/extras/templates/extras/exporttemplate.html +0 -2
- nautobot/extras/templates/extras/gitrepository.html +0 -2
- nautobot/extras/templates/extras/gitrepository_object_edit.html +0 -2
- nautobot/extras/templates/extras/graphqlquery.html +0 -2
- nautobot/extras/templates/extras/graphqlquery_list.html +0 -1
- nautobot/extras/templates/extras/graphqlquery_retrieve.html +0 -97
- nautobot/extras/templates/extras/job_detail.html +0 -2
- nautobot/extras/templates/extras/jobbutton_retrieve.html +0 -2
- nautobot/extras/templates/extras/jobhook.html +0 -2
- nautobot/extras/templates/extras/jobqueue_retrieve.html +0 -2
- nautobot/extras/templates/extras/jobresult.html +0 -2
- nautobot/extras/templates/extras/metadatatype_retrieve.html +0 -2
- nautobot/extras/templates/extras/note.html +0 -2
- nautobot/extras/templates/extras/note_retrieve.html +0 -1
- nautobot/extras/templates/extras/object_changelog.html +0 -2
- nautobot/extras/templates/extras/object_notes.html +0 -2
- nautobot/extras/templates/extras/objectchange.html +0 -2
- nautobot/extras/templates/extras/objectchange_list.html +0 -3
- nautobot/extras/templates/extras/relationship.html +0 -1
- nautobot/extras/templates/extras/secret.html +0 -1
- nautobot/extras/templates/extras/secret_edit.html +0 -1
- nautobot/extras/templates/extras/secretsgroup.html +0 -2
- nautobot/extras/templates/extras/secretsgroup_edit.html +0 -2
- nautobot/extras/templates/extras/secretsgroup_retrieve.html +0 -2
- nautobot/extras/templates/extras/status.html +0 -2
- nautobot/extras/templates/extras/tag.html +0 -2
- nautobot/extras/templates/extras/tag_edit.html +0 -2
- nautobot/extras/templates/extras/tag_retrieve.html +0 -2
- nautobot/extras/templates/extras/team_retrieve.html +0 -2
- nautobot/ipam/templates/ipam/inc/prefix_header_extra_content_table.html +0 -4
- nautobot/ipam/templates/ipam/namespace_retrieve.html +0 -1
- nautobot/ipam/templates/ipam/prefix.html +0 -2
- nautobot/ipam/templates/ipam/prefix_edit.html +0 -1
- nautobot/ipam/templates/ipam/prefix_retrieve.html +0 -2
- nautobot/ipam/templates/ipam/rir.html +0 -2
- nautobot/ipam/templates/ipam/routetarget.html +0 -1
- nautobot/ipam/templates/ipam/service.html +0 -2
- nautobot/ipam/templates/ipam/service_edit.html +0 -2
- nautobot/ipam/templates/ipam/service_retrieve.html +0 -2
- nautobot/ipam/templates/ipam/vlan.html +0 -2
- nautobot/ipam/templates/ipam/vlan_edit.html +0 -2
- nautobot/ipam/templates/ipam/vlan_retrieve.html +0 -2
- nautobot/ipam/templates/ipam/vlangroup.html +0 -2
- nautobot/ipam/templates/ipam/vrf.html +0 -1
- nautobot/tenancy/templates/tenancy/tenant.html +0 -2
- nautobot/tenancy/templates/tenancy/tenant_edit.html +0 -2
- nautobot/tenancy/templates/tenancy/tenantgroup.html +0 -2
- nautobot/tenancy/templates/tenancy/tenantgroup_retrieve.html +0 -1
- nautobot/virtualization/templates/virtualization/clustergroup.html +0 -2
- nautobot/virtualization/templates/virtualization/clustertype.html +0 -2
- nautobot/virtualization/templates/virtualization/virtualmachine.html +0 -2
- nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +0 -2
- nautobot/virtualization/templates/virtualization/virtualmachine_retrieve.html +0 -2
- nautobot/wireless/templates/wireless/radioprofile_retrieve.html +0 -2
- nautobot/wireless/templates/wireless/supporteddatarate_retrieve.html +0 -2
- nautobot/wireless/templates/wireless/wirelessnetwork_retrieve.html +0 -2
- /nautobot/dcim/templates/dcim/{cable.html → cable_retrieve.html} +0 -0
- /nautobot/tenancy/{filters/mixins.py → filter_mixins.py} +0 -0
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/NOTICE +0 -0
- {nautobot-3.0.0a2.dist-info → nautobot-3.0.0rc1.dist-info}/WHEEL +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{% load form_helpers %}
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
<
|
|
3
|
+
|
|
4
|
+
<hr class="border-top">
|
|
5
|
+
<div class="mb-10 d-lg-flex justify-content-center{% if field.errors %} has-error{% endif %}">
|
|
5
6
|
<label class="col-lg-3 col-form-label{% if field.field.required %} nb-required{% endif %}" for="{{ field.id_for_label }}">
|
|
6
7
|
{{ field.label }}
|
|
7
8
|
</label>
|
|
@@ -19,17 +20,17 @@
|
|
|
19
20
|
{% endif %}
|
|
20
21
|
</div>
|
|
21
22
|
</div>
|
|
22
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
23
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
23
24
|
<span class="col-lg-3 col-form-label">
|
|
24
25
|
</span>
|
|
25
26
|
<div class="col-lg-9">
|
|
26
|
-
<div>
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
<div class="form-check flex-wrap">
|
|
28
|
+
{{ override_field }}
|
|
29
|
+
<label class="form-check-label" for="{{ override_field.id_for_label }}">
|
|
29
30
|
<i>Clear override</i>
|
|
30
31
|
</label>
|
|
31
32
|
{% if override_field.help_text %}
|
|
32
|
-
<span class="form-text">{{ override_field.help_text|safe }}</span>
|
|
33
|
+
<span class="form-text w-100">{{ override_field.help_text|safe }}</span>
|
|
33
34
|
{% endif %}
|
|
34
35
|
</div>
|
|
35
36
|
</div>
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
{% load helpers %}
|
|
1
2
|
<div class="float-end">
|
|
2
|
-
<div class="btn-group btn-group-
|
|
3
|
-
<a href="
|
|
4
|
-
|
|
3
|
+
<div class="btn-group btn-group-sm" role="group">
|
|
4
|
+
<a href="{% django_querystring data_format='json' %}"
|
|
5
|
+
class="btn btn-primary {% if data_format == 'json' %}bg-primary nb-text-body-bg{% endif %}">
|
|
6
|
+
<span class="mdi mdi-code-json" aria-hidden="true"></span> JSON
|
|
7
|
+
</a>
|
|
8
|
+
<a href="{% django_querystring data_format='yaml' %}"
|
|
9
|
+
class="btn btn-primary {% if data_format == 'yaml' %}bg-primary nb-text-body-bg{% endif %}">
|
|
10
|
+
<span class="mdi mdi-format-list-group" aria-hidden="true"></span> YAML
|
|
11
|
+
</a>
|
|
5
12
|
</div>
|
|
6
13
|
</div>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{% load helpers %}
|
|
2
|
+
|
|
3
|
+
<div class="card">
|
|
4
|
+
<div class="card-header">
|
|
5
|
+
<strong>Response</strong>
|
|
6
|
+
<button class="btn btn-primary btn-sm float-end" onclick="test_query()">Execute</button>
|
|
7
|
+
</div>
|
|
8
|
+
{% if object.variables %}
|
|
9
|
+
<table class="table table-hover card-body attr-table">
|
|
10
|
+
<tr>
|
|
11
|
+
<td>Variables:</td>
|
|
12
|
+
<td><textarea id="query_variables" class="form-control">{{ object.variables|render_json:False }}</textarea></td>
|
|
13
|
+
</tr>
|
|
14
|
+
</table>
|
|
15
|
+
{% endif %}
|
|
16
|
+
<div class="card-footer">
|
|
17
|
+
<pre id="query_output" class="p-5">
|
|
18
|
+
|
|
19
|
+
</pre>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<script>
|
|
24
|
+
function fillQueryOutput(data) {
|
|
25
|
+
const queryOutput = document.querySelector('#query_output');
|
|
26
|
+
|
|
27
|
+
[...queryOutput.childNodes].forEach(childNode => childNode.remove());
|
|
28
|
+
|
|
29
|
+
const code = document.createElement('code');
|
|
30
|
+
code.classList.add('language-json');
|
|
31
|
+
code.textContent = JSON.stringify(data, undefined, 2);
|
|
32
|
+
|
|
33
|
+
queryOutput.appendChild(code);
|
|
34
|
+
|
|
35
|
+
hljs.highlightElement(code);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function test_query() {
|
|
39
|
+
const variables = document.querySelector('#query_variables')?.value;
|
|
40
|
+
|
|
41
|
+
$.ajax({
|
|
42
|
+
url: "{% url 'graphql' %}",
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: {"X-CSRFTOKEN": "{{ csrf_token }}"},
|
|
45
|
+
dataType: "json",
|
|
46
|
+
data: {
|
|
47
|
+
"query": `{{ object.query | escapejs }}`,
|
|
48
|
+
"variables": variables,
|
|
49
|
+
},
|
|
50
|
+
success: function(data) {
|
|
51
|
+
fillQueryOutput(data);
|
|
52
|
+
},
|
|
53
|
+
error: function(error) {
|
|
54
|
+
console.log(error);
|
|
55
|
+
fillQueryOutput(error.responseJSON);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
window.addEventListener("load", () => {
|
|
61
|
+
textarea = document.querySelector("#query_variables");
|
|
62
|
+
textarea.addEventListener('input', autoResize, false);
|
|
63
|
+
textarea.style.height = 'auto';
|
|
64
|
+
textarea.style.height = textarea.scrollHeight + 'px';
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
function autoResize() {
|
|
68
|
+
this.style.height = 'auto';
|
|
69
|
+
this.style.height = this.scrollHeight + 'px';
|
|
70
|
+
}
|
|
71
|
+
</script>
|
|
@@ -19,9 +19,21 @@
|
|
|
19
19
|
<header class="nb-tile-header">
|
|
20
20
|
<h3>{{ row.record.grouping|bettertitle }}</h3>
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
<
|
|
24
|
-
|
|
22
|
+
{% if perms.extras.run_job and row.record.runnable %}
|
|
23
|
+
<a href="{% url 'extras:job_run' pk=row.record.pk %}"
|
|
24
|
+
class="btn btn-primary btn-sm"
|
|
25
|
+
data-bs-toggle="tooltip"
|
|
26
|
+
data-bs-title="Run/Schedule">
|
|
27
|
+
<span class="mdi mdi-play" aria-hidden="true"><span class="visually-hidden">Run/Schedule</span></span>
|
|
28
|
+
</a>
|
|
29
|
+
{% else %}
|
|
30
|
+
<a aria-disabled="true"
|
|
31
|
+
class="btn btn-primary btn-sm disabled"
|
|
32
|
+
data-bs-toggle="tooltip"
|
|
33
|
+
data-bs-title="Run/Schedule">
|
|
34
|
+
<span class="mdi mdi-play" aria-hidden="true"><span class="visually-hidden">Run/Schedule</span></span>
|
|
35
|
+
</a>
|
|
36
|
+
{% endif %}
|
|
25
37
|
|
|
26
38
|
{% comment "TODO(norbert-mieczkowski-codilime): use the same buttons (actions) in tables and tiles when tables support dropdown menus" %}
|
|
27
39
|
{% for item in row.items %}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
+
{% load helpers %}
|
|
1
2
|
<div class="float-end">
|
|
2
|
-
<div class="btn-group btn-group-
|
|
3
|
-
<a href="
|
|
4
|
-
|
|
3
|
+
<div class="btn-group btn-group-sm" role="group">
|
|
4
|
+
<a href="{% django_querystring format='json' %}"
|
|
5
|
+
class="btn btn-primary{% if format == 'json' %} bg-primary nb-text-body-bg{% endif %}">
|
|
6
|
+
<span class="mdi mdi-code-json" aria-hidden="true"></span> JSON
|
|
7
|
+
</a>
|
|
8
|
+
<a href="{% django_querystring format='yaml' %}"
|
|
9
|
+
class="btn btn-primary{% if format == 'yaml' %} bg-primary nb-text-body-bg{% endif %}">
|
|
10
|
+
<span class="mdi mdi-format-list-group" aria-hidden="true"></span> YAML
|
|
11
|
+
</a>
|
|
5
12
|
</div>
|
|
6
13
|
</div>
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
{% load form_helpers %}
|
|
2
2
|
|
|
3
|
-
<div class="mb-10 d-flex justify-content-center{% if field.errors %} has-error{% endif %}">
|
|
3
|
+
<div class="mb-10 d-lg-flex justify-content-center{% if field.errors %} has-error{% endif %}">
|
|
4
4
|
<label class="col-lg-3 col-form-label{% if field.field.required %} nb-required{% endif %}" for="{{ field.id_for_label }}">
|
|
5
5
|
{{ field.label }}
|
|
6
6
|
</label>
|
|
7
|
-
<div class="col-lg-3">
|
|
8
|
-
<div class="form-check{% if override_field.errors %} has-error{% endif %}">
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
<div class="col-lg-3 pe-lg-10">
|
|
8
|
+
<div class="form-check my-6{% if override_field.errors %} has-error{% endif %}">
|
|
9
|
+
{{ override_field }}
|
|
10
|
+
<label class="form-check-label" for="{{ override_field.id_for_label }}">
|
|
11
11
|
<i>Override default value</i>
|
|
12
|
+
{% if override_field.help_text %}
|
|
13
|
+
<span class="form-text">{{ override_field.help_text|safe }}</span>
|
|
14
|
+
{% endif %}
|
|
12
15
|
</label>
|
|
13
|
-
{% if override_field.help_text %}
|
|
14
|
-
<span class="form-text">{{ override_field.help_text|safe }}</span>
|
|
15
|
-
{% endif %}
|
|
16
16
|
</div>
|
|
17
17
|
</div>
|
|
18
18
|
<div class="col-lg-6">
|
|
19
19
|
{% if field|widget_type == 'checkboxinput' %}
|
|
20
|
-
<div class="form-check{% if field.errors %} has-error{% endif %}">
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
<div class="form-check my-6{% if field.errors %} has-error{% endif %}">
|
|
21
|
+
{{ field }}
|
|
22
|
+
<label class="form-check-label" for="{{ field.id_for_label }}">
|
|
23
|
+
{{ field.label }}
|
|
24
|
+
{% if field.help_text %}<span class="form-text">{{ field.help_text|safe }}</span>{% endif %}
|
|
23
25
|
</label>
|
|
24
|
-
{% if field.help_text %}<span class="form-text">{{ field.help_text|safe }}</span>{% endif %}
|
|
25
26
|
</div>
|
|
26
27
|
{% else %}
|
|
27
28
|
{{ field }}
|
|
@@ -14,17 +14,10 @@
|
|
|
14
14
|
<li class="breadcrumb-item">Submission and Scheduling</li>
|
|
15
15
|
</ol>
|
|
16
16
|
</div>
|
|
17
|
-
<div>
|
|
18
|
-
<h1 class="mb-16">{{ job_model }}</h1>
|
|
19
|
-
{% if job_model.read_only %}
|
|
20
|
-
<span class="badge bg-body-secondary border">Read-only</span>
|
|
21
|
-
{% endif %}
|
|
22
|
-
<p>{{ job_model.description | render_markdown }}</p>
|
|
23
|
-
</div>
|
|
24
17
|
<form action="" method="post" enctype="multipart/form-data" class="h-100 vstack">
|
|
25
18
|
{% csrf_token %}
|
|
26
|
-
<div class="row
|
|
27
|
-
<div class="col-xl-8
|
|
19
|
+
<div class="row justify-content-center flex-fill">
|
|
20
|
+
<div class="col-xl-8 col-lg-10">
|
|
28
21
|
{% if not perms.extras.run_job %}
|
|
29
22
|
<div class="alert alert-warning">
|
|
30
23
|
<span aria-hidden="true" class="mdi mdi-alert"></span>
|
|
@@ -40,6 +33,11 @@
|
|
|
40
33
|
<span aria-hidden="true" class="mdi mdi-alert"></span> This job is not enabled to be run.
|
|
41
34
|
</div>
|
|
42
35
|
{% endif %}
|
|
36
|
+
{% if job_model.read_only %}
|
|
37
|
+
<div class="alert alert-info">
|
|
38
|
+
<span aria-hidden="true" class="mdi mdi-info"></span>This job is read-only in its operation.
|
|
39
|
+
</div>
|
|
40
|
+
{% endif %}
|
|
43
41
|
{% if job_form.non_field_errors or schedule_form.non_field_errors %}
|
|
44
42
|
<div class="card border-danger">
|
|
45
43
|
<div class="card-header bg-danger-subtle border-danger text-body">
|
|
@@ -88,7 +86,7 @@
|
|
|
88
86
|
id="id__run"
|
|
89
87
|
name="_run"
|
|
90
88
|
type="submit"
|
|
91
|
-
{% if not perms.extras.run_job or not job_model.runnable %}disabled
|
|
89
|
+
{% if not perms.extras.run_job or not job_model.runnable %}disabled{% endif %}
|
|
92
90
|
>
|
|
93
91
|
<span aria-hidden="true" class="mdi mdi-play me-4"></span><!--
|
|
94
92
|
-->Run Job Now
|
|
@@ -147,13 +145,32 @@
|
|
|
147
145
|
|
|
148
146
|
// Toggle schedule name and schedule time field rows.
|
|
149
147
|
['#id__schedule_name', '#id__schedule_start_time'].forEach((selector) => {
|
|
150
|
-
const
|
|
148
|
+
const input = document.querySelector(selector);
|
|
149
|
+
const row = input?.parentElement.parentElement;
|
|
151
150
|
row.classList.toggle('d-none', immediately);
|
|
151
|
+
const label = row.querySelector('label');
|
|
152
|
+
|
|
153
|
+
label?.classList.toggle('nb-required', !immediately);
|
|
154
|
+
if (immediately) {
|
|
155
|
+
input.removeAttribute('required');
|
|
156
|
+
} else {
|
|
157
|
+
input.setAttribute('required', '');
|
|
158
|
+
}
|
|
152
159
|
});
|
|
153
160
|
|
|
154
161
|
// Toggle custom crontab field row.
|
|
155
|
-
|
|
162
|
+
input = document.querySelector('#id__recurrence_custom_time')
|
|
163
|
+
const row = input.parentElement.parentElement;
|
|
156
164
|
row.classList.toggle('d-none', !custom);
|
|
165
|
+
const label = row.querySelector('label');
|
|
166
|
+
|
|
167
|
+
label?.classList.toggle('nb-required', custom);
|
|
168
|
+
if (!custom) {
|
|
169
|
+
input.removeAttribute('required');
|
|
170
|
+
} else {
|
|
171
|
+
input.setAttribute('required', '');
|
|
172
|
+
}
|
|
173
|
+
|
|
157
174
|
};
|
|
158
175
|
|
|
159
176
|
{% if job_model.has_sensitive_variables %}
|
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
{% extends 'generic/object_bulk_update.html' %}
|
|
2
2
|
{% load form_helpers %}
|
|
3
3
|
|
|
4
|
+
{% block extra_styles %}
|
|
5
|
+
<style>
|
|
6
|
+
tr a.job_run {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
gap: 0.625rem; /* 10px */
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
tr a.job_run .btn {
|
|
12
|
+
align-self: flex-start;
|
|
13
|
+
margin-block: -0.09375rem; /* -1.5px */
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
tr :last-child {
|
|
17
|
+
margin-bottom: 0;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
{% endblock %}
|
|
21
|
+
|
|
4
22
|
{% block form_fields %}
|
|
5
23
|
{% render_field form.enabled %}
|
|
6
24
|
{% include "extras/inc/bulk_edit_overridable_field.html" with field=form.grouping override_field=form.clear_grouping_override %}
|
|
@@ -6,69 +6,69 @@
|
|
|
6
6
|
<div class="card">
|
|
7
7
|
<div class="card-header"><strong>Job Source</strong></div>
|
|
8
8
|
<div class="card-body">
|
|
9
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
9
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
10
10
|
<label class="col-lg-3 col-form-label">Module</label>
|
|
11
|
-
<div class="col-lg-9
|
|
11
|
+
<div class="col-lg-9 pt-6">
|
|
12
12
|
<code>{{ obj.module_name }}</code>
|
|
13
13
|
<span class="form-text">Dotted name of the Python module providing this job</span>
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
16
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
16
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
17
17
|
<label class="col-lg-3 col-form-label">Job Class</label>
|
|
18
|
-
<div class="col-lg-9
|
|
18
|
+
<div class="col-lg-9 pt-6">
|
|
19
19
|
<code>{{ obj.job_class_name }}</code>
|
|
20
20
|
<span class="form-text">Name of the Python class providing this job</span>
|
|
21
21
|
</div>
|
|
22
22
|
</div>
|
|
23
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
23
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
24
24
|
<div class="col-lg-9 offset-lg-3">
|
|
25
|
-
<div class="form-check">
|
|
26
|
-
<
|
|
27
|
-
|
|
25
|
+
<div class="form-check mt-6">
|
|
26
|
+
<input class="form-check-input" id="id_installed" name="installed" type="checkbox" disabled {% if obj.installed %}checked{% endif %}>
|
|
27
|
+
<label class="form-check-label" for="id_installed">
|
|
28
28
|
Installed
|
|
29
|
+
<span class="form-text">
|
|
30
|
+
Whether the Python class providing this job is presently installed and loadable
|
|
31
|
+
</span>
|
|
29
32
|
</label>
|
|
30
|
-
<span class="form-text">
|
|
31
|
-
Whether the Python class providing this job is presently installed and loadable
|
|
32
|
-
</span>
|
|
33
33
|
</div>
|
|
34
34
|
</div>
|
|
35
35
|
</div>
|
|
36
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
36
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
37
37
|
<div class="col-lg-9 offset-lg-3">
|
|
38
|
-
<div class="form-check">
|
|
39
|
-
<
|
|
40
|
-
|
|
38
|
+
<div class="form-check mt-6">
|
|
39
|
+
<input class="form-check-input" id="id_supports_dryrun" name="supports_dryrun" type="checkbox" disabled {% if obj.supports_dryrun %}checked{% endif %}>
|
|
40
|
+
<label class="form-check-label" for="id_supports_dryrun">
|
|
41
41
|
Supports dryrun
|
|
42
|
+
<span class="form-text">
|
|
43
|
+
Whether this job supports bypassing approval when running with dryrun argument set to true
|
|
44
|
+
</span>
|
|
42
45
|
</label>
|
|
43
|
-
<span class="form-text">
|
|
44
|
-
Whether this job supports bypassing approval when running with dryrun argument set to true
|
|
45
|
-
</span>
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
|
48
48
|
</div>
|
|
49
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
49
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
50
50
|
<div class="col-lg-9 offset-lg-3">
|
|
51
|
-
<div class="form-check">
|
|
52
|
-
<
|
|
53
|
-
|
|
51
|
+
<div class="form-check mt-6">
|
|
52
|
+
<input class="form-check-input" id="id_is_job_hook_receiver" name="is_job_hook_receiver" type="checkbox" disabled {% if obj.is_job_hook_receiver %}checked{% endif %}>
|
|
53
|
+
<label class="form-check-label" for="id_is_job_hook_receiver">
|
|
54
54
|
Is job hook receiver
|
|
55
|
+
<span class="form-text">
|
|
56
|
+
Whether this job is a job hook receiver
|
|
57
|
+
</span>
|
|
55
58
|
</label>
|
|
56
|
-
<span class="form-text">
|
|
57
|
-
Whether this job is a job hook receiver
|
|
58
|
-
</span>
|
|
59
59
|
</div>
|
|
60
60
|
</div>
|
|
61
61
|
</div>
|
|
62
|
-
<div class="mb-10 d-flex justify-content-center">
|
|
62
|
+
<div class="mb-10 d-lg-flex justify-content-center">
|
|
63
63
|
<div class="col-lg-9 offset-lg-3">
|
|
64
|
-
<div class="form-check">
|
|
65
|
-
<
|
|
66
|
-
|
|
64
|
+
<div class="form-check mt-6">
|
|
65
|
+
<input class="form-check-input" id="id_is_job_button_receiver" name="is_job_button_receiver" type="checkbox" disabled {% if obj.is_job_button_receiver %}checked{% endif %}>
|
|
66
|
+
<label class="form-check-label" for="id_is_job_button_receiver">
|
|
67
67
|
Is job button receiver
|
|
68
|
+
<span class="form-text">
|
|
69
|
+
Whether this job is a job button receiver
|
|
70
|
+
</span>
|
|
68
71
|
</label>
|
|
69
|
-
<span class="form-text">
|
|
70
|
-
Whether this job is a job button receiver
|
|
71
|
-
</span>
|
|
72
72
|
</div>
|
|
73
73
|
</div>
|
|
74
74
|
</div>
|
|
@@ -103,12 +103,15 @@
|
|
|
103
103
|
{{ block.super }}
|
|
104
104
|
{{ obj.job_class.properties_dict | json_script:"job_class_properties" }}
|
|
105
105
|
<script>
|
|
106
|
+
/*
|
|
107
|
+
* Because some of the form fields are Select2 widgets, we need to stick with jQuery here for now
|
|
108
|
+
*/
|
|
106
109
|
const job_class_properties = JSON.parse(document.getElementById("job_class_properties").textContent);
|
|
107
110
|
const description_default = $("#id_description").val();
|
|
108
|
-
|
|
111
|
+
/* All id_*_override fields */
|
|
109
112
|
$("[id^=id_][id$=_override]").change(function() {
|
|
110
113
|
const override_id = $(this).attr("id");
|
|
111
|
-
|
|
114
|
+
/* What's the form field this is an override for? */
|
|
112
115
|
const field_id = override_id.slice(0, -9);
|
|
113
116
|
const field = $("#" + field_id);
|
|
114
117
|
const field_name = field_id.slice(3);
|
|
@@ -116,32 +119,32 @@
|
|
|
116
119
|
field.attr("readonly", null);
|
|
117
120
|
field.prop("disabled", false);
|
|
118
121
|
} else {
|
|
119
|
-
|
|
122
|
+
/* Revert the field to its default value */
|
|
120
123
|
if (field.attr("type") == "checkbox") {
|
|
121
|
-
|
|
124
|
+
/* Do we have a job class object to derive properties from? */
|
|
122
125
|
if (job_class_properties != "") {
|
|
123
126
|
field.prop("checked", job_class_properties[field_name]);
|
|
124
127
|
} else {
|
|
125
|
-
|
|
128
|
+
/* No, we don't - it's probably not installed */
|
|
126
129
|
field.prop("checked", field.attr("checked"));
|
|
127
130
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
/*
|
|
132
|
+
* Checkboxes can't be "readonly" in HTML :-(
|
|
133
|
+
* Note that "disabled" fields aren't included in form submission, so we have to be sure to
|
|
134
|
+
* re-enable them at form submission time.
|
|
135
|
+
*/
|
|
133
136
|
field.prop("disabled", true);
|
|
134
137
|
} else {
|
|
135
|
-
|
|
138
|
+
/* Do we have a job class object to derive properties from? */
|
|
136
139
|
if (job_class_properties != "") {
|
|
137
140
|
if (field_name != "job_queues" && field_name != "default_job_queue") {
|
|
138
141
|
field.val(job_class_properties[field_name]);
|
|
139
142
|
}
|
|
140
143
|
} else if (field_name != "description") {
|
|
141
|
-
|
|
144
|
+
/* No, we don't - it's probably not installed */
|
|
142
145
|
field.val(field.attr("value"));
|
|
143
146
|
} else {
|
|
144
|
-
|
|
147
|
+
/* Textarea fields don't have a "value" attribute */
|
|
145
148
|
field.val(description_default);
|
|
146
149
|
}
|
|
147
150
|
if (field_name == "job_queues" || field_name == "default_job_queue") {
|
|
@@ -154,7 +157,10 @@
|
|
|
154
157
|
});
|
|
155
158
|
$("[id^=id_][id$=_override]").change();
|
|
156
159
|
|
|
157
|
-
|
|
160
|
+
/*
|
|
161
|
+
* As mentioned above, we need to re-enable all checkboxes, job_queues and default_job_queue fields
|
|
162
|
+
* on form submission so they get included
|
|
163
|
+
*/
|
|
158
164
|
$("form").submit(function() {
|
|
159
165
|
$('input[type="checkbox"]:disabled').each(function() {
|
|
160
166
|
$(this).prop("disabled", false);
|
|
@@ -3,12 +3,22 @@
|
|
|
3
3
|
|
|
4
4
|
{% block extra_styles %}
|
|
5
5
|
<style>
|
|
6
|
+
tr a.job_run {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
gap: 0.625rem; /* 10px */
|
|
9
|
+
}
|
|
10
|
+
|
|
6
11
|
tr a.job_run .btn {
|
|
7
|
-
|
|
12
|
+
align-self: flex-start;
|
|
13
|
+
margin-block: -0.09375rem; /* -1.5px */
|
|
8
14
|
}
|
|
9
15
|
|
|
10
|
-
tr
|
|
11
|
-
|
|
16
|
+
tr :last-child {
|
|
17
|
+
margin-bottom: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
tr.disabled td {
|
|
21
|
+
color: var(--bs-secondary-color);
|
|
12
22
|
}
|
|
13
23
|
|
|
14
24
|
tr.disabled a.job_run {
|
|
@@ -17,19 +27,27 @@
|
|
|
17
27
|
}
|
|
18
28
|
|
|
19
29
|
tr.disabled a.job_run .btn {
|
|
20
|
-
cursor:
|
|
30
|
+
cursor: inherit;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
tr.disabled p {
|
|
34
|
+
color: inherit;
|
|
21
35
|
}
|
|
22
36
|
</style>
|
|
23
37
|
{% endblock %}
|
|
24
38
|
|
|
25
39
|
{% block buttons %}
|
|
26
|
-
<div class="btn-group">
|
|
27
|
-
<a
|
|
28
|
-
|
|
40
|
+
<div class="btn-group" role="group">
|
|
41
|
+
<a href="{% django_querystring display='list' %}"
|
|
42
|
+
class="btn btn-primary{% if display == 'list' %} bg-primary nb-text-body-bg{% endif %}">
|
|
43
|
+
<span class="mdi mdi-view-sequential" aria-hidden="true"></span> List
|
|
29
44
|
</a>
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
{# djlint:off B123 #}
|
|
46
|
+
<a href="{% django_querystring display='tiles' %}"
|
|
47
|
+
class="btn btn-primary{% if display == 'tiles' %} bg-primary nb-text-body-bg{% endif %}">
|
|
48
|
+
<span class="mdi mdi-view-grid" aria-hidden="true"></span> Tiles
|
|
32
49
|
</a>
|
|
50
|
+
{# djlint:on B123 #}
|
|
33
51
|
</div>
|
|
34
52
|
|
|
35
53
|
<button
|
|
@@ -38,22 +56,8 @@
|
|
|
38
56
|
data-nb-toggle="collapse-all"
|
|
39
57
|
data-nb-target="#job_accordion .collapse"
|
|
40
58
|
type="button"
|
|
41
|
-
{% if display == "tiles" %}disabled
|
|
59
|
+
{% if display == "tiles" %}disabled{% endif %}
|
|
42
60
|
>
|
|
43
|
-
Collapse All
|
|
61
|
+
Collapse All Groups
|
|
44
62
|
</button>
|
|
45
63
|
{% endblock %}
|
|
46
|
-
|
|
47
|
-
{% block javascript %}
|
|
48
|
-
{{ block.super }}
|
|
49
|
-
<script>
|
|
50
|
-
document.addEventListener('DOMContentLoaded', () => {
|
|
51
|
-
// Set display anchor links without losing other potentially active query params such as applied filters.
|
|
52
|
-
[...document.querySelectorAll('.set-job_list-display')].forEach((button) => {
|
|
53
|
-
const queryParams = new URLSearchParams(window.location.search);
|
|
54
|
-
queryParams.set('display', button.dataset.display);
|
|
55
|
-
button.setAttribute('href', `?${queryParams.toString()}`);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
</script>
|
|
59
|
-
{% endblock %}
|
|
@@ -60,18 +60,14 @@
|
|
|
60
60
|
{% block document_title %}{% render_title "plain" %}{% endblock %}
|
|
61
61
|
|
|
62
62
|
{% block content %}
|
|
63
|
-
<div class="row d-print-none">
|
|
63
|
+
<div class="row d-print-none mb-16">
|
|
64
64
|
<div class="col-lg-12">
|
|
65
|
-
|
|
65
|
+
<div class="float-end">
|
|
66
|
+
<a class="btn btn-primary" href="{% url 'apps:apps_list' %}">See Installed Apps</a>
|
|
67
|
+
</div>
|
|
66
68
|
</div>
|
|
67
69
|
</div>
|
|
68
70
|
|
|
69
|
-
<div class="float-end d-print-none">
|
|
70
|
-
<a class="btn btn-primary" href="{% url 'apps:apps_list' %}">See Installed Apps</a>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<h1>{% block page_heading %}{% render_title %}{% endblock page_heading %}</h1>
|
|
74
|
-
|
|
75
71
|
<div class="row">
|
|
76
72
|
<div class="col-lg-12">
|
|
77
73
|
<section class="nb-tiles">
|
|
@@ -119,7 +115,7 @@
|
|
|
119
115
|
{% if app.docs|default:None != None %}
|
|
120
116
|
<a href="{{ app.docs }}" class="btn btn-info btn-sm" target="_blank" data-bs-title="Docs">
|
|
121
117
|
{% else %}
|
|
122
|
-
<a
|
|
118
|
+
<a aria-disabled="true" class="btn btn-info btn-sm disabled" data-bs-title="No docs provided">
|
|
123
119
|
{% endif %}
|
|
124
120
|
<span class="mdi mdi-book-open-page-variant"></span>
|
|
125
121
|
</a>
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<div class="card">
|
|
9
9
|
<div class="card-header">
|
|
10
10
|
<strong>Rendered Context</strong>
|
|
11
|
-
{% include 'extras/inc/configcontext_format.html' %}
|
|
11
|
+
{% include 'extras/inc/configcontext_format.html' with data_format=format %}
|
|
12
12
|
</div>
|
|
13
13
|
<div class="card-body">
|
|
14
14
|
{% include 'extras/inc/json_data.html' with data=rendered_context format=format %}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
{% block content %}
|
|
8
8
|
<div class="alert alert-warning">
|
|
9
9
|
Dynamic group membership is cached for performance reasons, therefore this page may not always be up-to-date.
|
|
10
|
-
<br>You can refresh the membership of any specific group by
|
|
11
|
-
<a href="{% url 'extras:dynamicgroup_list' %}">Dynamic Groups list view</a
|
|
10
|
+
<br>You can refresh the membership of any specific group by accessing it from the list below or from the
|
|
11
|
+
<a href="{% url 'extras:dynamicgroup_list' %}">Dynamic Groups list view</a> and clicking the "Refresh Members" button.
|
|
12
12
|
<br>You can also refresh the membership of all groups by running the
|
|
13
13
|
<a href="{% url 'extras:job_run_by_class_path' class_path='nautobot.core.jobs.groups.RefreshDynamicGroupCaches' %}">Refresh Dynamic Group Caches job</a>.
|
|
14
14
|
</div>
|