nautobot 2.4.2__py3-none-any.whl → 2.4.4__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/filters.py +2 -0
- nautobot/circuits/filters.py +1 -1
- nautobot/circuits/templates/circuits/inc/circuit_termination.html +1 -1
- nautobot/circuits/tests/integration/test_circuit.py +135 -0
- nautobot/circuits/tests/test_models.py +5 -3
- nautobot/circuits/views.py +4 -1
- nautobot/cloud/api/views.py +3 -3
- nautobot/cloud/filters.py +3 -6
- nautobot/cloud/tests/test_filters.py +21 -0
- nautobot/core/admin.py +2 -0
- nautobot/core/constants.py +0 -1
- nautobot/core/forms/__init__.py +2 -0
- nautobot/core/forms/forms.py +2 -1
- nautobot/core/forms/widgets.py +8 -0
- nautobot/core/jobs/__init__.py +2 -1
- nautobot/core/management/commands/generate_performance_test_endpoints.py +271 -0
- nautobot/core/models/utils.py +6 -1
- nautobot/core/templates/generic/object_bulk_delete.html +1 -1
- 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_create.html +5 -0
- 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/inc/javascript.html +3 -0
- nautobot/core/templates/widgets/clearable_file.html +5 -0
- nautobot/core/templatetags/helpers.py +3 -3
- nautobot/core/templatetags/ui_framework.py +20 -4
- nautobot/core/testing/forms.py +1 -1
- nautobot/core/testing/integration.py +37 -7
- nautobot/core/tests/test_api.py +1 -1
- nautobot/core/tests/test_commands.py +31 -0
- nautobot/core/tests/test_graphql.py +3 -3
- nautobot/core/tests/test_jobs.py +4 -1
- nautobot/core/tests/test_utils.py +17 -2
- nautobot/core/ui/object_detail.py +1 -1
- nautobot/core/utils/lookup.py +12 -1
- nautobot/core/views/generic.py +9 -1
- nautobot/core/views/mixins.py +9 -1
- nautobot/dcim/api/serializers.py +36 -0
- nautobot/dcim/api/views.py +12 -11
- nautobot/dcim/elevations.py +17 -4
- nautobot/dcim/factory.py +9 -1
- nautobot/dcim/filters/__init__.py +27 -1
- nautobot/dcim/forms.py +16 -7
- nautobot/dcim/models/devices.py +12 -7
- nautobot/dcim/signals.py +26 -0
- nautobot/dcim/templates/dcim/cable_trace.html +4 -4
- nautobot/dcim/templates/dcim/consoleport.html +14 -4
- nautobot/dcim/templates/dcim/consoleserverport.html +14 -4
- nautobot/dcim/templates/dcim/device/lldp_neighbors.html +3 -3
- nautobot/dcim/templates/dcim/frontport.html +7 -2
- nautobot/dcim/templates/dcim/interface.html +9 -4
- nautobot/dcim/templates/dcim/powerfeed.html +8 -3
- nautobot/dcim/templates/dcim/poweroutlet.html +14 -4
- nautobot/dcim/templates/dcim/powerport.html +14 -4
- nautobot/dcim/templates/dcim/rearport.html +7 -2
- nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +0 -62
- nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +6 -0
- nautobot/dcim/tests/integration/test_fileinputpicker.py +87 -0
- nautobot/dcim/tests/test_api.py +176 -0
- nautobot/dcim/tests/test_filters.py +56 -3
- nautobot/dcim/tests/test_models.py +41 -1
- nautobot/dcim/views.py +24 -14
- nautobot/extras/api/mixins.py +1 -1
- nautobot/extras/api/views.py +4 -4
- nautobot/extras/filters/__init__.py +4 -0
- nautobot/extras/forms/forms.py +4 -0
- nautobot/extras/jobs.py +8 -1
- nautobot/extras/models/datasources.py +7 -3
- nautobot/extras/plugins/__init__.py +26 -1
- nautobot/extras/templates/extras/inc/jobresult.html +12 -13
- nautobot/extras/templates/extras/job.html +1 -0
- nautobot/extras/templates/extras/objectchange.html +28 -12
- nautobot/extras/tests/test_api.py +16 -15
- nautobot/extras/tests/test_dynamicgroups.py +14 -0
- nautobot/extras/tests/test_filters.py +2 -0
- nautobot/extras/tests/test_plugins.py +32 -1
- nautobot/extras/tests/test_views.py +209 -11
- nautobot/extras/utils.py +30 -0
- nautobot/extras/views.py +32 -14
- nautobot/ipam/api/serializers.py +7 -8
- nautobot/ipam/api/views.py +5 -5
- nautobot/ipam/factory.py +27 -8
- nautobot/ipam/filters.py +67 -29
- nautobot/ipam/formfields.py +51 -0
- nautobot/ipam/forms.py +15 -7
- nautobot/ipam/migrations/0051_added_optional_vrf_relationship_to_vdc.py +41 -0
- nautobot/ipam/models.py +63 -5
- nautobot/ipam/tables.py +21 -7
- nautobot/ipam/tests/test_api.py +107 -66
- nautobot/ipam/tests/test_filters.py +145 -5
- nautobot/ipam/tests/test_views.py +15 -2
- nautobot/project-static/bootstrap-filestyle-1.2.3/bootstrap-filestyle.min.js +11 -0
- nautobot/project-static/css/base.css +11 -0
- nautobot/project-static/css/dark.css +2 -1
- nautobot/project-static/docs/apps/index.html +1 -1
- nautobot/project-static/docs/apps/nautobot-apps.html +1 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +62 -0
- nautobot/project-static/docs/development/apps/api/configuration-view.html +0 -3
- nautobot/project-static/docs/development/apps/api/models/graphql.html +9 -13
- nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +94 -1
- nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +2 -5
- nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +0 -3
- nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +0 -3
- nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +0 -3
- nautobot/project-static/docs/development/apps/api/prometheus.html +0 -3
- nautobot/project-static/docs/development/apps/api/setup.html +1 -1
- nautobot/project-static/docs/development/apps/api/testing.html +0 -6
- nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +0 -3
- nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +0 -3
- nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +0 -3
- nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +0 -3
- nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -7
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +0 -7
- nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +0 -4
- nautobot/project-static/docs/development/apps/api/views/notes.html +0 -3
- nautobot/project-static/docs/development/apps/index.html +2 -35
- nautobot/project-static/docs/development/apps/migration/code-updates.html +7 -6
- nautobot/project-static/docs/development/apps/migration/dependency-updates.html +2 -2
- nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -3
- nautobot/project-static/docs/development/core/application-registry.html +0 -6
- nautobot/project-static/docs/development/core/best-practices.html +1 -28
- nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -1
- nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +65 -11
- nautobot/project-static/docs/development/core/getting-started.html +14 -18
- nautobot/project-static/docs/development/core/homepage.html +0 -3
- nautobot/project-static/docs/development/core/index.html +1 -1
- nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +3 -3
- nautobot/project-static/docs/development/core/model-checklist.html +1 -1
- nautobot/project-static/docs/development/core/navigation-menu.html +1 -1
- nautobot/project-static/docs/development/core/release-checklist.html +1 -1
- nautobot/project-static/docs/development/core/settings.html +1 -1
- nautobot/project-static/docs/development/core/style-guide.html +4 -9
- nautobot/project-static/docs/development/core/templates.html +0 -3
- nautobot/project-static/docs/development/core/testing.html +0 -9
- nautobot/project-static/docs/development/jobs/index.html +11 -30
- nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -2
- nautobot/project-static/docs/index.html +3 -2
- nautobot/project-static/docs/objects.inv +0 -0
- nautobot/project-static/docs/overview/application_stack.html +2 -20
- nautobot/project-static/docs/release-notes/version-1.0.html +2 -2
- nautobot/project-static/docs/release-notes/version-1.1.html +2 -2
- nautobot/project-static/docs/release-notes/version-1.2.html +3 -3
- nautobot/project-static/docs/release-notes/version-1.3.html +1 -1
- nautobot/project-static/docs/release-notes/version-1.4.html +17 -17
- nautobot/project-static/docs/release-notes/version-1.5.html +8 -8
- nautobot/project-static/docs/release-notes/version-1.6.html +4 -4
- nautobot/project-static/docs/release-notes/version-2.0.html +10 -10
- nautobot/project-static/docs/release-notes/version-2.1.html +7 -7
- nautobot/project-static/docs/release-notes/version-2.2.html +1 -1
- nautobot/project-static/docs/release-notes/version-2.3.html +4 -4
- nautobot/project-static/docs/release-notes/version-2.4.html +379 -0
- nautobot/project-static/docs/requirements.txt +1 -1
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +290 -290
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -3
- nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +4 -4
- nautobot/project-static/docs/user-guide/administration/configuration/redis.html +1 -1
- nautobot/project-static/docs/user-guide/administration/configuration/settings.html +3 -13
- nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +5 -5
- nautobot/project-static/docs/user-guide/administration/guides/docker.html +3 -18
- nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +1 -1
- nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -4
- nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +15 -15
- nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +2 -2
- nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/index.html +0 -16
- nautobot/project-static/docs/user-guide/administration/installation/install_system.html +1 -1
- nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +7 -10
- nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -12
- nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -3
- nautobot/project-static/docs/user-guide/administration/security/index.html +1 -1
- nautobot/project-static/docs/user-guide/administration/security/notices.html +1 -0
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +5 -35
- nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-location-changes.yaml +1 -1
- nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +12 -9
- nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +0 -3
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +0 -3
- nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -17
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +0 -3
- nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +0 -3
- nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -7
- nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +0 -6
- nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +0 -3
- nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +0 -4
- nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +0 -8
- nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +15 -15
- nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
- nautobot/project-static/docs/user-guide/feature-guides/graphql.html +0 -6
- nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +0 -3
- nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -15
- nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -27
- nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +0 -8
- nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -6
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +0 -8
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +0 -7
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +0 -3
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +0 -3
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +2 -2
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +6 -6
- nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +0 -14
- nautobot/project-static/docs/user-guide/platform-functionality/note.html +0 -3
- nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -10
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +0 -3
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +0 -14
- nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +0 -19
- nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -9
- nautobot/project-static/docs/user-guide/platform-functionality/status.html +0 -8
- nautobot/project-static/docs/user-guide/platform-functionality/tag.html +0 -4
- nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -13
- nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +0 -5
- nautobot/project-static/js/dropdown.js +28 -0
- nautobot/project-static/js/editor.js +292 -0
- nautobot/project-static/monaco-editor-0.52.2/README.md +81 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/base/worker/workerMain.js +31 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/xml/xml.js +10 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/yaml/yaml.js +10 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.css +8 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.js +798 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonMode.js +19 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonWorker.js +42 -0
- nautobot/project-static/monaco-editor-0.52.2/vs/loader.js +11 -0
- nautobot/tenancy/filters/__init__.py +3 -5
- nautobot/tenancy/forms.py +9 -0
- nautobot/tenancy/templates/tenancy/tenant_create.html +21 -0
- nautobot/tenancy/templates/tenancy/tenant_edit.html +2 -21
- nautobot/tenancy/templates/tenancy/tenantgroup.html +2 -44
- nautobot/tenancy/templates/tenancy/tenantgroup_retrieve.html +1 -0
- nautobot/tenancy/tests/test_filters.py +10 -0
- nautobot/tenancy/tests/test_views.py +5 -1
- nautobot/tenancy/urls.py +7 -79
- nautobot/tenancy/views.py +51 -80
- nautobot/virtualization/views.py +0 -1
- nautobot/wireless/api/serializers.py +6 -1
- nautobot/wireless/api/views.py +3 -3
- nautobot/wireless/tables.py +9 -4
- nautobot/wireless/tests/test_api.py +5 -9
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/METADATA +9 -9
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/RECORD +267 -246
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/LICENSE.txt +0 -0
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/NOTICE +0 -0
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/WHEEL +0 -0
- {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/entry_points.txt +0 -0
|
@@ -11,7 +11,8 @@ from nautobot.core.filters import (
|
|
|
11
11
|
from nautobot.core.utils.deprecation import class_deprecated_in_favor_of
|
|
12
12
|
from nautobot.dcim.models import Device, Location, Rack, RackReservation
|
|
13
13
|
from nautobot.extras.filters import NautobotFilterSet
|
|
14
|
-
from nautobot.ipam.
|
|
14
|
+
from nautobot.ipam.filters import PrefixFilter
|
|
15
|
+
from nautobot.ipam.models import IPAddress, RouteTarget, VLAN, VRF
|
|
15
16
|
from nautobot.tenancy.filters.mixins import TenancyModelFilterSetMixin
|
|
16
17
|
from nautobot.tenancy.models import Tenant, TenantGroup
|
|
17
18
|
from nautobot.virtualization.models import Cluster, VirtualMachine
|
|
@@ -112,10 +113,7 @@ class TenantFilterSet(NautobotFilterSet):
|
|
|
112
113
|
field_name="locations",
|
|
113
114
|
label="Has locations",
|
|
114
115
|
)
|
|
115
|
-
prefixes =
|
|
116
|
-
queryset=Prefix.objects.all(),
|
|
117
|
-
label="Prefixes (ID)",
|
|
118
|
-
)
|
|
116
|
+
prefixes = PrefixFilter()
|
|
119
117
|
has_prefixes = RelatedMembershipBooleanFilter(
|
|
120
118
|
field_name="prefixes",
|
|
121
119
|
label="Has prefixes",
|
nautobot/tenancy/forms.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from django import forms
|
|
2
2
|
|
|
3
|
+
from nautobot.core.constants import CHARFIELD_MAX_LENGTH
|
|
3
4
|
from nautobot.core.forms import (
|
|
4
5
|
CommentField,
|
|
5
6
|
DynamicModelChoiceField,
|
|
@@ -22,6 +23,14 @@ from .models import Tenant, TenantGroup
|
|
|
22
23
|
#
|
|
23
24
|
|
|
24
25
|
|
|
26
|
+
class TenantGroupBulkEditForm(NautobotBulkEditForm):
|
|
27
|
+
pk = forms.ModelMultipleChoiceField(queryset=TenantGroup.objects.all(), widget=forms.MultipleHiddenInput())
|
|
28
|
+
description = forms.CharField(max_length=CHARFIELD_MAX_LENGTH, required=False)
|
|
29
|
+
|
|
30
|
+
class Meta:
|
|
31
|
+
nullable_fields = []
|
|
32
|
+
|
|
33
|
+
|
|
25
34
|
class TenantGroupForm(NautobotModelForm):
|
|
26
35
|
parent = DynamicModelChoiceField(queryset=TenantGroup.objects.all(), required=False)
|
|
27
36
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{% extends 'generic/object_create.html' %}
|
|
2
|
+
{% load static %}
|
|
3
|
+
{% load form_helpers %}
|
|
4
|
+
|
|
5
|
+
{% block form %}
|
|
6
|
+
<div class="panel panel-default">
|
|
7
|
+
<div class="panel-heading"><strong>Tenant</strong></div>
|
|
8
|
+
<div class="panel-body">
|
|
9
|
+
{% render_field form.name %}
|
|
10
|
+
{% render_field form.tenant_group %}
|
|
11
|
+
{% render_field form.description %}
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
15
|
+
<div class="panel panel-default">
|
|
16
|
+
<div class="panel-heading"><strong>Comments</strong></div>
|
|
17
|
+
<div class="panel-body">
|
|
18
|
+
{% render_field form.comments %}
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
{% endblock %}
|
|
@@ -1,21 +1,2 @@
|
|
|
1
|
-
{% extends '
|
|
2
|
-
{%
|
|
3
|
-
{% load form_helpers %}
|
|
4
|
-
|
|
5
|
-
{% block form %}
|
|
6
|
-
<div class="panel panel-default">
|
|
7
|
-
<div class="panel-heading"><strong>Tenant</strong></div>
|
|
8
|
-
<div class="panel-body">
|
|
9
|
-
{% render_field form.name %}
|
|
10
|
-
{% render_field form.tenant_group %}
|
|
11
|
-
{% render_field form.description %}
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
{% include 'inc/extras_features_edit_form_fields.html' %}
|
|
15
|
-
<div class="panel panel-default">
|
|
16
|
-
<div class="panel-heading"><strong>Comments</strong></div>
|
|
17
|
-
<div class="panel-body">
|
|
18
|
-
{% render_field form.comments %}
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
{% endblock %}
|
|
1
|
+
{% extends 'tenancy/tenant_create.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -1,44 +1,2 @@
|
|
|
1
|
-
{% extends '
|
|
2
|
-
{%
|
|
3
|
-
|
|
4
|
-
{% block content_left_page %}
|
|
5
|
-
<div class="panel panel-default">
|
|
6
|
-
<div class="panel-heading">
|
|
7
|
-
<strong>Tenant Group</strong>
|
|
8
|
-
</div>
|
|
9
|
-
<table class="table table-hover panel-body attr-table">
|
|
10
|
-
<tr>
|
|
11
|
-
<td>Description</td>
|
|
12
|
-
<td>{{ object.description|placeholder }}</td>
|
|
13
|
-
</tr>
|
|
14
|
-
<tr>
|
|
15
|
-
<td>Parent</td>
|
|
16
|
-
<td>{{ object.parent|hyperlinked_object }}</td>
|
|
17
|
-
</tr>
|
|
18
|
-
<tr>
|
|
19
|
-
<td>Tenants</td>
|
|
20
|
-
<td>
|
|
21
|
-
<a href="{% url 'tenancy:tenant_list' %}?tenant_group={{ object.name }}">{{ tenant_table.rows|length }}</a>
|
|
22
|
-
</td>
|
|
23
|
-
</tr>
|
|
24
|
-
</table>
|
|
25
|
-
</div>
|
|
26
|
-
{% endblock content_left_page %}
|
|
27
|
-
|
|
28
|
-
{% block content_right_page %}
|
|
29
|
-
<div class="panel panel-default">
|
|
30
|
-
<div class="panel-heading">
|
|
31
|
-
<strong>Tenants</strong>
|
|
32
|
-
</div>
|
|
33
|
-
{% include 'inc/table.html' with table=tenant_table %}
|
|
34
|
-
{% if perms.teanancy.add_tenant %}
|
|
35
|
-
<div class="panel-footer text-right noprint">
|
|
36
|
-
<a href="{% url 'tenancy:tenant_add' %}?tenant_group={{ object.pk }}" class="btn btn-xs btn-primary">
|
|
37
|
-
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add tenant
|
|
38
|
-
</a>
|
|
39
|
-
</div>
|
|
40
|
-
{% endif %}
|
|
41
|
-
</div>
|
|
42
|
-
{% include 'inc/paginator.html' with paginator=tenant_table.paginator page=tenant_table.page %}
|
|
43
|
-
<div class="row"></div>
|
|
44
|
-
{% endblock content_right_page %}
|
|
1
|
+
{% extends 'tenancy/tenantgroup_retrieve.html' %}
|
|
2
|
+
{% comment %}3.0 TODO: remove this template, which only exists for backward compatibility with 2.4 and earlier{% endcomment %}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{% extends 'generic/object_retrieve.html' %}
|
|
@@ -145,3 +145,13 @@ class TenantTestCase(FilterTestCases.FilterTestCase):
|
|
|
145
145
|
self.filterset(params, self.queryset).qs,
|
|
146
146
|
self.queryset.filter(locations__in=[self.locations[0], self.locations[1]]).distinct(),
|
|
147
147
|
)
|
|
148
|
+
|
|
149
|
+
def test_prefixes_by_string(self):
|
|
150
|
+
"""Test filtering by prefix strings as an alternative to pk."""
|
|
151
|
+
prefix = self.queryset.filter(prefixes__isnull=False).first().prefixes.first()
|
|
152
|
+
params = {"prefixes": [prefix.prefix]}
|
|
153
|
+
self.assertQuerysetEqualAndNotEmpty(
|
|
154
|
+
self.filterset(params, self.queryset).qs,
|
|
155
|
+
self.queryset.filter(prefixes__network=prefix.network, prefixes__prefix_length=prefix.prefix_length),
|
|
156
|
+
ordered=False,
|
|
157
|
+
)
|
|
@@ -3,7 +3,7 @@ from nautobot.extras.models import Tag
|
|
|
3
3
|
from nautobot.tenancy.models import Tenant, TenantGroup
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class TenantGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
|
|
6
|
+
class TenantGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase, ViewTestCases.BulkEditObjectsViewTestCase):
|
|
7
7
|
model = TenantGroup
|
|
8
8
|
sort_on_field = "name"
|
|
9
9
|
|
|
@@ -14,6 +14,10 @@ class TenantGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
|
|
|
14
14
|
"description": "A new tenant group",
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
cls.bulk_edit_data = {
|
|
18
|
+
"description": "New description",
|
|
19
|
+
}
|
|
20
|
+
|
|
17
21
|
|
|
18
22
|
class TenantTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|
19
23
|
model = Tenant
|
nautobot/tenancy/urls.py
CHANGED
|
@@ -1,83 +1,11 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
from nautobot.extras.views import ObjectChangeLogView, ObjectNotesView
|
|
1
|
+
from nautobot.core.views.routers import NautobotUIViewSetRouter
|
|
4
2
|
|
|
5
3
|
from . import views
|
|
6
|
-
from .models import Tenant, TenantGroup
|
|
7
4
|
|
|
8
5
|
app_name = "tenancy"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
name="tenantgroup_add",
|
|
16
|
-
),
|
|
17
|
-
path(
|
|
18
|
-
"tenant-groups/import/",
|
|
19
|
-
views.TenantGroupBulkImportView.as_view(), # 3.0 TODO: remove, unused
|
|
20
|
-
name="tenantgroup_import",
|
|
21
|
-
),
|
|
22
|
-
path(
|
|
23
|
-
"tenant-groups/delete/",
|
|
24
|
-
views.TenantGroupBulkDeleteView.as_view(),
|
|
25
|
-
name="tenantgroup_bulk_delete",
|
|
26
|
-
),
|
|
27
|
-
path(
|
|
28
|
-
"tenant-groups/<uuid:pk>/",
|
|
29
|
-
views.TenantGroupView.as_view(),
|
|
30
|
-
name="tenantgroup",
|
|
31
|
-
),
|
|
32
|
-
path(
|
|
33
|
-
"tenant-groups/<uuid:pk>/edit/",
|
|
34
|
-
views.TenantGroupEditView.as_view(),
|
|
35
|
-
name="tenantgroup_edit",
|
|
36
|
-
),
|
|
37
|
-
path(
|
|
38
|
-
"tenant-groups/<uuid:pk>/delete/",
|
|
39
|
-
views.TenantGroupDeleteView.as_view(),
|
|
40
|
-
name="tenantgroup_delete",
|
|
41
|
-
),
|
|
42
|
-
path(
|
|
43
|
-
"tenant-groups/<uuid:pk>/changelog/",
|
|
44
|
-
ObjectChangeLogView.as_view(),
|
|
45
|
-
name="tenantgroup_changelog",
|
|
46
|
-
kwargs={"model": TenantGroup},
|
|
47
|
-
),
|
|
48
|
-
path(
|
|
49
|
-
"tenant-groups/<uuid:pk>/notes/",
|
|
50
|
-
ObjectNotesView.as_view(),
|
|
51
|
-
name="tenantgroup_notes",
|
|
52
|
-
kwargs={"model": TenantGroup},
|
|
53
|
-
),
|
|
54
|
-
# Tenants
|
|
55
|
-
path("tenants/", views.TenantListView.as_view(), name="tenant_list"),
|
|
56
|
-
path("tenants/add/", views.TenantEditView.as_view(), name="tenant_add"),
|
|
57
|
-
path("tenants/import/", views.TenantBulkImportView.as_view(), name="tenant_import"), # 3.0 TODO: remove, unused
|
|
58
|
-
path("tenants/edit/", views.TenantBulkEditView.as_view(), name="tenant_bulk_edit"),
|
|
59
|
-
path(
|
|
60
|
-
"tenants/delete/",
|
|
61
|
-
views.TenantBulkDeleteView.as_view(),
|
|
62
|
-
name="tenant_bulk_delete",
|
|
63
|
-
),
|
|
64
|
-
path("tenants/<uuid:pk>/", views.TenantView.as_view(), name="tenant"),
|
|
65
|
-
path("tenants/<uuid:pk>/edit/", views.TenantEditView.as_view(), name="tenant_edit"),
|
|
66
|
-
path(
|
|
67
|
-
"tenants/<uuid:pk>/delete/",
|
|
68
|
-
views.TenantDeleteView.as_view(),
|
|
69
|
-
name="tenant_delete",
|
|
70
|
-
),
|
|
71
|
-
path(
|
|
72
|
-
"tenants/<uuid:pk>/changelog/",
|
|
73
|
-
ObjectChangeLogView.as_view(),
|
|
74
|
-
name="tenant_changelog",
|
|
75
|
-
kwargs={"model": Tenant},
|
|
76
|
-
),
|
|
77
|
-
path(
|
|
78
|
-
"tenants/<uuid:pk>/notes/",
|
|
79
|
-
ObjectNotesView.as_view(),
|
|
80
|
-
name="tenant_notes",
|
|
81
|
-
kwargs={"model": Tenant},
|
|
82
|
-
),
|
|
83
|
-
]
|
|
6
|
+
router = NautobotUIViewSetRouter()
|
|
7
|
+
router.register("tenant-groups", views.TenantGroupUIViewSet)
|
|
8
|
+
router.register("tenants", views.TenantUIViewSet)
|
|
9
|
+
|
|
10
|
+
urlpatterns = []
|
|
11
|
+
urlpatterns += router.urls
|
nautobot/tenancy/views.py
CHANGED
|
@@ -2,12 +2,13 @@ from django_tables2 import RequestConfig
|
|
|
2
2
|
|
|
3
3
|
from nautobot.circuits.models import Circuit
|
|
4
4
|
from nautobot.core.ui.choices import SectionChoices
|
|
5
|
-
from nautobot.core.ui.object_detail import ObjectDetailContent, ObjectFieldsPanel, StatsPanel
|
|
6
|
-
from nautobot.core.views import generic
|
|
5
|
+
from nautobot.core.ui.object_detail import ObjectDetailContent, ObjectFieldsPanel, ObjectsTablePanel, StatsPanel
|
|
7
6
|
from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
|
|
7
|
+
from nautobot.core.views.viewsets import NautobotUIViewSet
|
|
8
8
|
from nautobot.dcim.models import Controller, ControllerManagedDeviceGroup, Device, Location, Rack, RackReservation
|
|
9
9
|
from nautobot.extras.models import DynamicGroup
|
|
10
10
|
from nautobot.ipam.models import IPAddress, Prefix, VLAN, VRF
|
|
11
|
+
from nautobot.tenancy.api import serializers
|
|
11
12
|
from nautobot.virtualization.models import Cluster, VirtualMachine
|
|
12
13
|
|
|
13
14
|
from . import filters, forms, tables
|
|
@@ -18,52 +19,51 @@ from .models import Tenant, TenantGroup
|
|
|
18
19
|
#
|
|
19
20
|
|
|
20
21
|
|
|
21
|
-
class
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class TenantGroupView(generic.ObjectView):
|
|
22
|
+
class TenantGroupUIViewSet(NautobotUIViewSet):
|
|
23
|
+
bulk_update_form_class = forms.TenantGroupBulkEditForm
|
|
24
|
+
filterset_class = filters.TenantGroupFilterSet
|
|
25
|
+
filterset_form_class = forms.TenantGroupFilterForm
|
|
26
|
+
form_class = forms.TenantGroupForm
|
|
29
27
|
queryset = TenantGroup.objects.all()
|
|
28
|
+
serializer_class = serializers.TenantGroupSerializer
|
|
29
|
+
table_class = tables.TenantGroupTable
|
|
30
|
+
object_detail_content = ObjectDetailContent(
|
|
31
|
+
panels=(
|
|
32
|
+
ObjectFieldsPanel(
|
|
33
|
+
section=SectionChoices.LEFT_HALF,
|
|
34
|
+
weight=100,
|
|
35
|
+
fields="__all__",
|
|
36
|
+
),
|
|
37
|
+
ObjectsTablePanel(
|
|
38
|
+
weight=100,
|
|
39
|
+
section=SectionChoices.RIGHT_HALF,
|
|
40
|
+
context_table_key="tenant_table",
|
|
41
|
+
exclude_columns=["tenant_group"],
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
)
|
|
30
45
|
|
|
31
46
|
def get_extra_context(self, request, instance):
|
|
32
47
|
# Tenants
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class TenantGroupDeleteView(generic.ObjectDeleteView):
|
|
55
|
-
queryset = TenantGroup.objects.all()
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
class TenantGroupBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
|
|
59
|
-
queryset = TenantGroup.objects.all()
|
|
60
|
-
table = tables.TenantGroupTable
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class TenantGroupBulkDeleteView(generic.BulkDeleteView):
|
|
64
|
-
queryset = TenantGroup.objects.all()
|
|
65
|
-
table = tables.TenantGroupTable
|
|
66
|
-
filterset = filters.TenantGroupFilterSet
|
|
48
|
+
context = super().get_extra_context(request, instance)
|
|
49
|
+
if self.action == "retrieve":
|
|
50
|
+
# ObjectsTablePanel usually handles the generation of this table, this is an exception here
|
|
51
|
+
# Because we are filtering on its tenant_group as well as the tenant group's descendants
|
|
52
|
+
# i.e. `instance.descendants(include_self=True)`
|
|
53
|
+
tenants = Tenant.objects.restrict(request.user, "view").filter(
|
|
54
|
+
tenant_group__in=instance.descendants(include_self=True)
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
tenant_table = tables.TenantTable(tenants)
|
|
58
|
+
tenant_table.columns.hide("tenant_group")
|
|
59
|
+
|
|
60
|
+
paginate = {
|
|
61
|
+
"paginator_class": EnhancedPaginator,
|
|
62
|
+
"per_page": get_paginate_count(request),
|
|
63
|
+
}
|
|
64
|
+
RequestConfig(request, paginate).configure(tenant_table)
|
|
65
|
+
context["tenant_table"] = tenant_table
|
|
66
|
+
return context
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
#
|
|
@@ -71,15 +71,14 @@ class TenantGroupBulkDeleteView(generic.BulkDeleteView):
|
|
|
71
71
|
#
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
class
|
|
74
|
+
class TenantUIViewSet(NautobotUIViewSet):
|
|
75
|
+
bulk_update_form_class = forms.TenantBulkEditForm
|
|
76
|
+
filterset_class = filters.TenantFilterSet
|
|
77
|
+
filterset_form_class = forms.TenantFilterForm
|
|
78
|
+
form_class = forms.TenantForm
|
|
75
79
|
queryset = Tenant.objects.all()
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
table = tables.TenantTable
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class TenantView(generic.ObjectView):
|
|
82
|
-
queryset = Tenant.objects.select_related("tenant_group")
|
|
80
|
+
serializer_class = serializers.TenantSerializer
|
|
81
|
+
table_class = tables.TenantTable
|
|
83
82
|
object_detail_content = ObjectDetailContent(
|
|
84
83
|
panels=(
|
|
85
84
|
ObjectFieldsPanel(
|
|
@@ -112,31 +111,3 @@ class TenantView(generic.ObjectView):
|
|
|
112
111
|
),
|
|
113
112
|
)
|
|
114
113
|
)
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
class TenantEditView(generic.ObjectEditView):
|
|
118
|
-
queryset = Tenant.objects.all()
|
|
119
|
-
model_form = forms.TenantForm
|
|
120
|
-
template_name = "tenancy/tenant_edit.html"
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
class TenantDeleteView(generic.ObjectDeleteView):
|
|
124
|
-
queryset = Tenant.objects.all()
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
class TenantBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
|
|
128
|
-
queryset = Tenant.objects.all()
|
|
129
|
-
table = tables.TenantTable
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
class TenantBulkEditView(generic.BulkEditView):
|
|
133
|
-
queryset = Tenant.objects.select_related("tenant_group")
|
|
134
|
-
filterset = filters.TenantFilterSet
|
|
135
|
-
table = tables.TenantTable
|
|
136
|
-
form = forms.TenantBulkEditForm
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
class TenantBulkDeleteView(generic.BulkDeleteView):
|
|
140
|
-
queryset = Tenant.objects.select_related("tenant_group")
|
|
141
|
-
filterset = filters.TenantFilterSet
|
|
142
|
-
table = tables.TenantTable
|
nautobot/virtualization/views.py
CHANGED
|
@@ -306,7 +306,6 @@ class VirtualMachineView(generic.ObjectView):
|
|
|
306
306
|
# VRF assignments
|
|
307
307
|
vrf_assignments = instance.vrf_assignments.restrict(request.user, "view")
|
|
308
308
|
vrf_table = VRFDeviceAssignmentTable(vrf_assignments)
|
|
309
|
-
vrf_table.exclude = ("device", "virtual_machine")
|
|
310
309
|
|
|
311
310
|
# Software images
|
|
312
311
|
if instance.software_version is not None:
|
|
@@ -15,10 +15,15 @@ class SupportedDataRateSerializer(TaggedModelSerializerMixin, NautobotModelSeria
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class RadioProfileSerializer(TaggedModelSerializerMixin, NautobotModelSerializer):
|
|
18
|
-
channel_width = serializers.ListField(
|
|
18
|
+
channel_width = serializers.ListField(
|
|
19
|
+
child=ChoiceField(choices=RadioProfileChannelWidthChoices),
|
|
20
|
+
allow_empty=True,
|
|
21
|
+
required=False,
|
|
22
|
+
)
|
|
19
23
|
allowed_channel_list = serializers.ListField(
|
|
20
24
|
child=serializers.IntegerField(required=False),
|
|
21
25
|
allow_empty=True,
|
|
26
|
+
required=False,
|
|
22
27
|
)
|
|
23
28
|
|
|
24
29
|
class Meta:
|
nautobot/wireless/api/views.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from nautobot.extras.api.views import NautobotModelViewSet
|
|
1
|
+
from nautobot.extras.api.views import ModelViewSet, NautobotModelViewSet
|
|
2
2
|
from nautobot.wireless import filters, models
|
|
3
3
|
|
|
4
4
|
from . import serializers
|
|
@@ -22,13 +22,13 @@ class WirelessNetworkViewSet(NautobotModelViewSet):
|
|
|
22
22
|
filterset_class = filters.WirelessNetworkFilterSet
|
|
23
23
|
|
|
24
24
|
|
|
25
|
-
class ControllerManagedDeviceGroupWirelessNetworkAssignmentViewSet(
|
|
25
|
+
class ControllerManagedDeviceGroupWirelessNetworkAssignmentViewSet(ModelViewSet):
|
|
26
26
|
queryset = models.ControllerManagedDeviceGroupWirelessNetworkAssignment.objects.all()
|
|
27
27
|
serializer_class = serializers.ControllerManagedDeviceGroupWirelessNetworkAssignmentSerializer
|
|
28
28
|
filterset_class = filters.ControllerManagedDeviceGroupWirelessNetworkAssignmentFilterSet
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
class ControllerManagedDeviceGroupRadioProfileAssignmentViewSet(
|
|
31
|
+
class ControllerManagedDeviceGroupRadioProfileAssignmentViewSet(ModelViewSet):
|
|
32
32
|
queryset = models.ControllerManagedDeviceGroupRadioProfileAssignment.objects.all()
|
|
33
33
|
serializer_class = serializers.ControllerManagedDeviceGroupRadioProfileAssignmentSerializer
|
|
34
34
|
filterset_class = filters.ControllerManagedDeviceGroupRadioProfileAssignmentFilterSet
|
nautobot/wireless/tables.py
CHANGED
|
@@ -8,9 +8,14 @@ from nautobot.core.tables import (
|
|
|
8
8
|
TagColumn,
|
|
9
9
|
ToggleColumn,
|
|
10
10
|
)
|
|
11
|
-
from nautobot.dcim.models import ControllerManagedDeviceGroup
|
|
12
11
|
|
|
13
|
-
from .models import
|
|
12
|
+
from .models import (
|
|
13
|
+
ControllerManagedDeviceGroupRadioProfileAssignment,
|
|
14
|
+
ControllerManagedDeviceGroupWirelessNetworkAssignment,
|
|
15
|
+
RadioProfile,
|
|
16
|
+
SupportedDataRate,
|
|
17
|
+
WirelessNetwork,
|
|
18
|
+
)
|
|
14
19
|
|
|
15
20
|
|
|
16
21
|
class RadioProfileTable(BaseTable):
|
|
@@ -151,7 +156,7 @@ class ControllerManagedDeviceGroupWirelessNetworkAssignmentTable(BaseTable):
|
|
|
151
156
|
)
|
|
152
157
|
|
|
153
158
|
class Meta(BaseTable.Meta):
|
|
154
|
-
model =
|
|
159
|
+
model = ControllerManagedDeviceGroupWirelessNetworkAssignment
|
|
155
160
|
fields = (
|
|
156
161
|
"wireless_network",
|
|
157
162
|
"controller_managed_device_group",
|
|
@@ -204,7 +209,7 @@ class ControllerManagedDeviceGroupRadioProfileAssignmentTable(BaseTable):
|
|
|
204
209
|
regulatory_domain = tables.Column(accessor="radio_profile.regulatory_domain", verbose_name="Regulatory Domain")
|
|
205
210
|
|
|
206
211
|
class Meta(BaseTable.Meta):
|
|
207
|
-
model =
|
|
212
|
+
model = ControllerManagedDeviceGroupRadioProfileAssignment
|
|
208
213
|
fields = (
|
|
209
214
|
"radio_profile",
|
|
210
215
|
"controller_managed_device_group",
|
|
@@ -12,15 +12,6 @@ class SupportedDataRateTest(APIViewTestCases.APIViewTestCase):
|
|
|
12
12
|
|
|
13
13
|
@classmethod
|
|
14
14
|
def setUpTestData(cls):
|
|
15
|
-
models.SupportedDataRate.objects.create(
|
|
16
|
-
rate=1000, standard=choices.SupportedDataRateStandardChoices.B, mcs_index=1
|
|
17
|
-
)
|
|
18
|
-
models.SupportedDataRate.objects.create(
|
|
19
|
-
rate=6000, standard=choices.SupportedDataRateStandardChoices.G, mcs_index=2
|
|
20
|
-
)
|
|
21
|
-
models.SupportedDataRate.objects.create(
|
|
22
|
-
rate=54000, standard=choices.SupportedDataRateStandardChoices.N, mcs_index=3
|
|
23
|
-
)
|
|
24
15
|
cls.create_data = [
|
|
25
16
|
{
|
|
26
17
|
"rate": 200000,
|
|
@@ -107,6 +98,11 @@ class RadioProfileTest(APIViewTestCases.APIViewTestCase):
|
|
|
107
98
|
"tx_power_min": 20,
|
|
108
99
|
"allowed_channel_list": [],
|
|
109
100
|
},
|
|
101
|
+
{
|
|
102
|
+
"name": "Radio Profile 7",
|
|
103
|
+
"frequency": "6GHz",
|
|
104
|
+
"regulatory_domain": "US",
|
|
105
|
+
},
|
|
110
106
|
]
|
|
111
107
|
cls.bulk_update_data = {
|
|
112
108
|
"frequency": "5GHz",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: nautobot
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.4
|
|
4
4
|
Summary: Source of truth and network automation platform.
|
|
5
5
|
Home-page: https://nautobot.com
|
|
6
6
|
License: Apache-2.0
|
|
@@ -22,7 +22,7 @@ Provides-Extra: mysql
|
|
|
22
22
|
Provides-Extra: napalm
|
|
23
23
|
Provides-Extra: remote-storage
|
|
24
24
|
Provides-Extra: sso
|
|
25
|
-
Requires-Dist: Django (>=4.2.
|
|
25
|
+
Requires-Dist: Django (>=4.2.19,<4.3.0)
|
|
26
26
|
Requires-Dist: GitPython (>=3.1.44,<3.2.0)
|
|
27
27
|
Requires-Dist: Jinja2 (>=3.1.5,<3.2.0)
|
|
28
28
|
Requires-Dist: Markdown (>=3.6,<3.7)
|
|
@@ -33,18 +33,18 @@ Requires-Dist: django-ajax-tables (>=1.1.1,<1.2.0)
|
|
|
33
33
|
Requires-Dist: django-auth-ldap (>=5.1.0,<5.2.0) ; extra == "all" or extra == "ldap"
|
|
34
34
|
Requires-Dist: django-celery-beat (>=2.6.0,<2.7.0)
|
|
35
35
|
Requires-Dist: django-celery-results (>=2.5.1,<2.6.0)
|
|
36
|
-
Requires-Dist: django-constance (>=3.
|
|
36
|
+
Requires-Dist: django-constance (>=4.3.0,<4.4.0)
|
|
37
37
|
Requires-Dist: django-cors-headers (>=4.4.0,<4.5.0)
|
|
38
38
|
Requires-Dist: django-db-file-storage (>=0.5.6.1,<0.6.0.0)
|
|
39
39
|
Requires-Dist: django-extensions (>=3.2.3,<3.3.0)
|
|
40
|
-
Requires-Dist: django-filter (>=
|
|
40
|
+
Requires-Dist: django-filter (>=25.1,<25.2)
|
|
41
41
|
Requires-Dist: django-health-check (>=3.18.3,<3.19.0)
|
|
42
42
|
Requires-Dist: django-jinja (>=2.11.0,<2.12.0)
|
|
43
43
|
Requires-Dist: django-prometheus (>=2.3.1,<2.4.0)
|
|
44
44
|
Requires-Dist: django-redis (>=5.4.0,<5.5.0)
|
|
45
45
|
Requires-Dist: django-silk (>=5.3.2,<5.4.0)
|
|
46
46
|
Requires-Dist: django-storages (==1.14.3) ; extra == "all" or extra == "remote-storage"
|
|
47
|
-
Requires-Dist: django-structlog[celery] (>=9.0.
|
|
47
|
+
Requires-Dist: django-structlog[celery] (>=9.0.1,<10.0.0)
|
|
48
48
|
Requires-Dist: django-tables2 (>=2.7.5,<2.8.0)
|
|
49
49
|
Requires-Dist: django-taggit (>=6.1.0,<6.2.0)
|
|
50
50
|
Requires-Dist: django-timezone-field (>=7.0,<7.1)
|
|
@@ -57,7 +57,7 @@ Requires-Dist: graphene-django (>=2.16.0,<2.17.0)
|
|
|
57
57
|
Requires-Dist: graphene-django-optimizer (>=0.8.0,<0.9.0)
|
|
58
58
|
Requires-Dist: jsonschema (>=4.7.0,<5.0.0)
|
|
59
59
|
Requires-Dist: kombu (>=5.4.2,<5.5.0)
|
|
60
|
-
Requires-Dist: kubernetes (>=
|
|
60
|
+
Requires-Dist: kubernetes (>=32.0.0,<33.0.0)
|
|
61
61
|
Requires-Dist: mysqlclient (>=2.2.7,<2.3.0) ; extra == "all" or extra == "mysql"
|
|
62
62
|
Requires-Dist: napalm (>=4.1.0,<6.0.0) ; extra == "all" or extra == "napalm"
|
|
63
63
|
Requires-Dist: netaddr (>=1.3.0,<1.4.0)
|
|
@@ -68,8 +68,8 @@ Requires-Dist: prometheus-client (>=0.20.0,<0.21.0)
|
|
|
68
68
|
Requires-Dist: psycopg2-binary (>=2.9.10,<2.10.0)
|
|
69
69
|
Requires-Dist: python-slugify (>=8.0.3,<8.1.0)
|
|
70
70
|
Requires-Dist: pyuwsgi (>=2.0.26,<2.1.0)
|
|
71
|
-
Requires-Dist: social-auth-app-django (>=5.4.
|
|
72
|
-
Requires-Dist: social-auth-core[saml] (>=4.5.
|
|
71
|
+
Requires-Dist: social-auth-app-django (>=5.4.3,<5.5.0)
|
|
72
|
+
Requires-Dist: social-auth-core[saml] (>=4.5.6,<4.6.0) ; extra == "all" or extra == "sso"
|
|
73
73
|
Requires-Dist: svgwrite (>=1.4.2,<1.5.0)
|
|
74
74
|
Project-URL: Documentation, https://docs.nautobot.com
|
|
75
75
|
Project-URL: Repository, https://github.com/nautobot/nautobot
|
|
@@ -92,7 +92,7 @@ Nautobot is a Network Source of Truth and Network Automation Platform built as a
|
|
|
92
92
|
|
|
93
93
|
The complete documentation for Nautobot can be found at [Read the Docs](https://docs.nautobot.com/).
|
|
94
94
|
|
|
95
|
-
Questions? Comments? Start by perusing our [GitHub discussions](https://github.com/nautobot/nautobot/discussions) for the topic you have in mind, or join the
|
|
95
|
+
Questions? Comments? Start by perusing our [GitHub discussions](https://github.com/nautobot/nautobot/discussions) for the topic you have in mind, or join the `#nautobot` channel on [Network to Code's Slack community](https://slack.networktocode.com/)!
|
|
96
96
|
|
|
97
97
|
## Build Status
|
|
98
98
|
|