nautobot 1.6.31__py3-none-any.whl → 1.6.32__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nautobot might be problematic. Click here for more details.
- nautobot/circuits/forms.py +6 -0
- nautobot/circuits/views.py +1 -0
- nautobot/core/graphql/schema.py +3 -1
- nautobot/core/graphql/types.py +10 -0
- nautobot/core/models/__init__.py +2 -0
- nautobot/core/templates/generic/object_list.html +1 -1
- nautobot/core/tests/test_views.py +73 -0
- nautobot/core/urls.py +3 -3
- nautobot/core/views/__init__.py +21 -0
- nautobot/dcim/forms.py +29 -0
- nautobot/dcim/models/device_component_templates.py +4 -0
- nautobot/dcim/models/device_components.py +4 -0
- nautobot/dcim/models/devices.py +2 -0
- nautobot/dcim/views.py +4 -0
- nautobot/extras/forms/forms.py +12 -0
- nautobot/extras/models/customfields.py +2 -0
- nautobot/extras/models/datasources.py +2 -0
- nautobot/extras/models/groups.py +8 -0
- nautobot/extras/models/jobs.py +10 -0
- nautobot/extras/models/models.py +2 -0
- nautobot/extras/models/secrets.py +8 -2
- nautobot/extras/secrets/__init__.py +14 -0
- nautobot/extras/tests/test_models.py +26 -0
- nautobot/extras/views.py +1 -0
- nautobot/ipam/filters.py +1 -1
- nautobot/ipam/forms.py +6 -0
- nautobot/ipam/models.py +8 -0
- nautobot/ipam/views.py +1 -0
- nautobot/project-static/docs/404.html +62 -0
- nautobot/project-static/docs/additional-features/caching.html +62 -0
- nautobot/project-static/docs/additional-features/change-logging.html +62 -0
- nautobot/project-static/docs/additional-features/config-contexts.html +62 -0
- nautobot/project-static/docs/additional-features/graphql.html +62 -0
- nautobot/project-static/docs/additional-features/healthcheck.html +62 -0
- nautobot/project-static/docs/additional-features/job-scheduling-and-approvals.html +63 -1
- nautobot/project-static/docs/additional-features/jobs.html +62 -0
- nautobot/project-static/docs/additional-features/napalm.html +62 -0
- nautobot/project-static/docs/additional-features/prometheus-metrics.html +62 -0
- nautobot/project-static/docs/additional-features/template-filters.html +62 -0
- nautobot/project-static/docs/administration/celery-queues.html +63 -1
- nautobot/project-static/docs/administration/nautobot-server.html +62 -0
- nautobot/project-static/docs/administration/nautobot-shell.html +62 -0
- nautobot/project-static/docs/administration/permissions.html +62 -0
- nautobot/project-static/docs/administration/replicating-nautobot.html +62 -0
- nautobot/project-static/docs/administration/request-profiling.html +62 -0
- nautobot/project-static/docs/administration/security/index.html +4407 -0
- nautobot/project-static/docs/administration/security/notices.html +4797 -0
- nautobot/project-static/docs/apps/index.html +62 -0
- nautobot/project-static/docs/apps/nautobot-apps.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/api.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +83 -21
- nautobot/project-static/docs/code-reference/nautobot/apps/models.html +67 -1
- nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +140 -52
- nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3203 -3101
- nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +62 -0
- nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +210 -148
- nautobot/project-static/docs/code-reference/nautobot/apps/views.html +62 -0
- nautobot/project-static/docs/configuration/authentication/ldap.html +62 -0
- nautobot/project-static/docs/configuration/authentication/remote.html +62 -0
- nautobot/project-static/docs/configuration/authentication/sso.html +62 -0
- nautobot/project-static/docs/configuration/index.html +62 -0
- nautobot/project-static/docs/configuration/optional-settings.html +67 -5
- nautobot/project-static/docs/configuration/required-settings.html +62 -0
- nautobot/project-static/docs/core-functionality/circuits.html +62 -0
- nautobot/project-static/docs/core-functionality/device-types.html +62 -0
- nautobot/project-static/docs/core-functionality/devices.html +62 -0
- nautobot/project-static/docs/core-functionality/ipam.html +62 -0
- nautobot/project-static/docs/core-functionality/power.html +62 -0
- nautobot/project-static/docs/core-functionality/secrets.html +62 -0
- nautobot/project-static/docs/core-functionality/services.html +62 -0
- nautobot/project-static/docs/core-functionality/sites-and-racks.html +62 -0
- nautobot/project-static/docs/core-functionality/tenancy.html +62 -0
- nautobot/project-static/docs/core-functionality/virtualization.html +62 -0
- nautobot/project-static/docs/core-functionality/vlans.html +62 -0
- nautobot/project-static/docs/development/application-registry.html +62 -0
- nautobot/project-static/docs/development/best-practices.html +62 -0
- nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +62 -0
- nautobot/project-static/docs/development/extending-models.html +62 -0
- nautobot/project-static/docs/development/generic-views.html +62 -0
- nautobot/project-static/docs/development/getting-started.html +63 -1
- nautobot/project-static/docs/development/homepage.html +62 -0
- nautobot/project-static/docs/development/index.html +62 -0
- nautobot/project-static/docs/development/navigation-menu.html +62 -0
- nautobot/project-static/docs/development/release-checklist.html +62 -0
- nautobot/project-static/docs/development/style-guide.html +62 -0
- nautobot/project-static/docs/development/templates.html +62 -0
- nautobot/project-static/docs/development/testing.html +62 -0
- nautobot/project-static/docs/development/user-preferences.html +62 -0
- nautobot/project-static/docs/docker/index.html +62 -0
- nautobot/project-static/docs/index.html +62 -0
- nautobot/project-static/docs/installation/centos.html +62 -0
- nautobot/project-static/docs/installation/external-authentication.html +62 -0
- nautobot/project-static/docs/installation/http-server.html +62 -0
- nautobot/project-static/docs/installation/index.html +62 -0
- nautobot/project-static/docs/installation/migrating-from-netbox.html +62 -0
- nautobot/project-static/docs/installation/migrating-from-postgresql.html +62 -0
- nautobot/project-static/docs/installation/nautobot.html +62 -0
- nautobot/project-static/docs/installation/selinux-troubleshooting.html +62 -0
- nautobot/project-static/docs/installation/services.html +62 -0
- nautobot/project-static/docs/installation/ubuntu.html +62 -0
- nautobot/project-static/docs/installation/upgrading.html +62 -0
- nautobot/project-static/docs/models/circuits/circuit.html +62 -0
- nautobot/project-static/docs/models/circuits/circuittermination.html +62 -0
- nautobot/project-static/docs/models/circuits/circuittype.html +62 -0
- nautobot/project-static/docs/models/circuits/provider.html +62 -0
- nautobot/project-static/docs/models/circuits/providernetwork.html +62 -0
- nautobot/project-static/docs/models/dcim/cable.html +62 -0
- nautobot/project-static/docs/models/dcim/consoleport.html +62 -0
- nautobot/project-static/docs/models/dcim/consoleporttemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/consoleserverport.html +62 -0
- nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/device.html +62 -0
- nautobot/project-static/docs/models/dcim/devicebay.html +62 -0
- nautobot/project-static/docs/models/dcim/devicebaytemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +62 -0
- nautobot/project-static/docs/models/dcim/devicerole.html +62 -0
- nautobot/project-static/docs/models/dcim/devicetype.html +62 -0
- nautobot/project-static/docs/models/dcim/frontport.html +62 -0
- nautobot/project-static/docs/models/dcim/frontporttemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/interface.html +62 -0
- nautobot/project-static/docs/models/dcim/interfaceredundancygroup.html +62 -0
- nautobot/project-static/docs/models/dcim/interfacetemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/inventoryitem.html +62 -0
- nautobot/project-static/docs/models/dcim/location.html +62 -0
- nautobot/project-static/docs/models/dcim/locationtype.html +62 -0
- nautobot/project-static/docs/models/dcim/manufacturer.html +62 -0
- nautobot/project-static/docs/models/dcim/platform.html +62 -0
- nautobot/project-static/docs/models/dcim/powerfeed.html +62 -0
- nautobot/project-static/docs/models/dcim/poweroutlet.html +62 -0
- nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/powerpanel.html +62 -0
- nautobot/project-static/docs/models/dcim/powerport.html +62 -0
- nautobot/project-static/docs/models/dcim/powerporttemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/rack.html +62 -0
- nautobot/project-static/docs/models/dcim/rackgroup.html +62 -0
- nautobot/project-static/docs/models/dcim/rackreservation.html +62 -0
- nautobot/project-static/docs/models/dcim/rackrole.html +62 -0
- nautobot/project-static/docs/models/dcim/rearport.html +62 -0
- nautobot/project-static/docs/models/dcim/rearporttemplate.html +62 -0
- nautobot/project-static/docs/models/dcim/region.html +62 -0
- nautobot/project-static/docs/models/dcim/site.html +62 -0
- nautobot/project-static/docs/models/dcim/virtualchassis.html +62 -0
- nautobot/project-static/docs/models/extras/computedfield.html +63 -1
- nautobot/project-static/docs/models/extras/configcontext.html +62 -0
- nautobot/project-static/docs/models/extras/configcontextschema.html +62 -0
- nautobot/project-static/docs/models/extras/customfield.html +62 -0
- nautobot/project-static/docs/models/extras/customlink.html +63 -1
- nautobot/project-static/docs/models/extras/dynamicgroup.html +62 -0
- nautobot/project-static/docs/models/extras/exporttemplate.html +62 -0
- nautobot/project-static/docs/models/extras/gitrepository.html +62 -0
- nautobot/project-static/docs/models/extras/graphqlquery.html +62 -0
- nautobot/project-static/docs/models/extras/imageattachment.html +62 -0
- nautobot/project-static/docs/models/extras/job.html +62 -0
- nautobot/project-static/docs/models/extras/jobbutton.html +63 -1
- nautobot/project-static/docs/models/extras/jobhook.html +62 -0
- nautobot/project-static/docs/models/extras/joblogentry.html +62 -0
- nautobot/project-static/docs/models/extras/jobresult.html +62 -0
- nautobot/project-static/docs/models/extras/note.html +62 -0
- nautobot/project-static/docs/models/extras/relationship.html +62 -0
- nautobot/project-static/docs/models/extras/secret.html +62 -0
- nautobot/project-static/docs/models/extras/secretsgroup.html +62 -0
- nautobot/project-static/docs/models/extras/status.html +62 -0
- nautobot/project-static/docs/models/extras/tag.html +62 -0
- nautobot/project-static/docs/models/extras/webhook.html +62 -0
- nautobot/project-static/docs/models/ipam/aggregate.html +62 -0
- nautobot/project-static/docs/models/ipam/ipaddress.html +62 -0
- nautobot/project-static/docs/models/ipam/prefix.html +62 -0
- nautobot/project-static/docs/models/ipam/rir.html +62 -0
- nautobot/project-static/docs/models/ipam/role.html +62 -0
- nautobot/project-static/docs/models/ipam/routetarget.html +62 -0
- nautobot/project-static/docs/models/ipam/service.html +62 -0
- nautobot/project-static/docs/models/ipam/vlan.html +62 -0
- nautobot/project-static/docs/models/ipam/vlangroup.html +62 -0
- nautobot/project-static/docs/models/ipam/vrf.html +62 -0
- nautobot/project-static/docs/models/tenancy/tenant.html +62 -0
- nautobot/project-static/docs/models/tenancy/tenantgroup.html +62 -0
- nautobot/project-static/docs/models/users/objectpermission.html +62 -0
- nautobot/project-static/docs/models/users/token.html +62 -0
- nautobot/project-static/docs/models/virtualization/cluster.html +62 -0
- nautobot/project-static/docs/models/virtualization/clustergroup.html +62 -0
- nautobot/project-static/docs/models/virtualization/clustertype.html +62 -0
- nautobot/project-static/docs/models/virtualization/virtualmachine.html +62 -0
- nautobot/project-static/docs/models/virtualization/vminterface.html +62 -0
- nautobot/project-static/docs/plugins/development.html +63 -1
- nautobot/project-static/docs/plugins/index.html +62 -0
- nautobot/project-static/docs/plugins/porting-from-netbox.html +62 -0
- nautobot/project-static/docs/release-notes/index.html +62 -0
- nautobot/project-static/docs/release-notes/version-1.0.html +62 -0
- nautobot/project-static/docs/release-notes/version-1.1.html +64 -2
- nautobot/project-static/docs/release-notes/version-1.2.html +63 -1
- nautobot/project-static/docs/release-notes/version-1.3.html +62 -0
- nautobot/project-static/docs/release-notes/version-1.4.html +62 -0
- nautobot/project-static/docs/release-notes/version-1.5.html +62 -0
- nautobot/project-static/docs/release-notes/version-1.6.html +354 -188
- nautobot/project-static/docs/rest-api/authentication.html +62 -0
- nautobot/project-static/docs/rest-api/filtering.html +62 -0
- nautobot/project-static/docs/rest-api/overview.html +62 -0
- nautobot/project-static/docs/search/search_index.json +1 -1
- nautobot/project-static/docs/sitemap.xml +197 -187
- nautobot/project-static/docs/sitemap.xml.gz +0 -0
- nautobot/project-static/docs/user-guides/custom-fields.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +63 -1
- nautobot/project-static/docs/user-guides/getting-started/index.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/interfaces.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/ipam.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/platforms.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/regions.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/search-bar.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/tenants.html +62 -0
- nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +63 -1
- nautobot/project-static/docs/user-guides/git-data-source.html +62 -0
- nautobot/project-static/docs/user-guides/graphql.html +62 -0
- nautobot/project-static/docs/user-guides/relationships.html +62 -0
- nautobot/project-static/docs/user-guides/s3-django-storage.html +62 -0
- nautobot/tenancy/forms.py +10 -0
- nautobot/tenancy/views.py +1 -0
- nautobot/users/models.py +4 -0
- nautobot/utilities/testing/views.py +17 -1
- nautobot/utilities/tests/test_jinja_filters.py +26 -2
- nautobot/utilities/utils.py +14 -0
- nautobot/virtualization/forms.py +12 -0
- nautobot/virtualization/views.py +2 -0
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/METADATA +1 -1
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/RECORD +235 -233
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/LICENSE.txt +0 -0
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/NOTICE +0 -0
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/WHEEL +0 -0
- {nautobot-1.6.31.dist-info → nautobot-1.6.32.dist-info}/entry_points.txt +0 -0
|
@@ -871,6 +871,68 @@
|
|
|
871
871
|
|
|
872
872
|
|
|
873
873
|
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_7" >
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
<label class="md-nav__link" for="__nav_2_5_7" id="__nav_2_5_7_label" tabindex="0">
|
|
890
|
+
Security
|
|
891
|
+
<span class="md-nav__icon md-icon"></span>
|
|
892
|
+
</label>
|
|
893
|
+
|
|
894
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_7_label" aria-expanded="false">
|
|
895
|
+
<label class="md-nav__title" for="__nav_2_5_7">
|
|
896
|
+
<span class="md-nav__icon md-icon"></span>
|
|
897
|
+
Security
|
|
898
|
+
</label>
|
|
899
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
<li class="md-nav__item">
|
|
907
|
+
<a href="../administration/security/index.html" class="md-nav__link">
|
|
908
|
+
Nautobot Security
|
|
909
|
+
</a>
|
|
910
|
+
</li>
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
<li class="md-nav__item">
|
|
921
|
+
<a href="../administration/security/notices.html" class="md-nav__link">
|
|
922
|
+
Notices
|
|
923
|
+
</a>
|
|
924
|
+
</li>
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
</ul>
|
|
930
|
+
</nav>
|
|
931
|
+
</li>
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
|
|
874
936
|
</ul>
|
|
875
937
|
</nav>
|
|
876
938
|
</li>
|
|
@@ -871,6 +871,68 @@
|
|
|
871
871
|
|
|
872
872
|
|
|
873
873
|
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_7" >
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
<label class="md-nav__link" for="__nav_2_5_7" id="__nav_2_5_7_label" tabindex="0">
|
|
890
|
+
Security
|
|
891
|
+
<span class="md-nav__icon md-icon"></span>
|
|
892
|
+
</label>
|
|
893
|
+
|
|
894
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_7_label" aria-expanded="false">
|
|
895
|
+
<label class="md-nav__title" for="__nav_2_5_7">
|
|
896
|
+
<span class="md-nav__icon md-icon"></span>
|
|
897
|
+
Security
|
|
898
|
+
</label>
|
|
899
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
<li class="md-nav__item">
|
|
907
|
+
<a href="../administration/security/index.html" class="md-nav__link">
|
|
908
|
+
Nautobot Security
|
|
909
|
+
</a>
|
|
910
|
+
</li>
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
<li class="md-nav__item">
|
|
921
|
+
<a href="../administration/security/notices.html" class="md-nav__link">
|
|
922
|
+
Notices
|
|
923
|
+
</a>
|
|
924
|
+
</li>
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
</ul>
|
|
930
|
+
</nav>
|
|
931
|
+
</li>
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
|
|
874
936
|
</ul>
|
|
875
937
|
</nav>
|
|
876
938
|
</li>
|
|
@@ -871,6 +871,68 @@
|
|
|
871
871
|
|
|
872
872
|
|
|
873
873
|
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_7" >
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
<label class="md-nav__link" for="__nav_2_5_7" id="__nav_2_5_7_label" tabindex="0">
|
|
890
|
+
Security
|
|
891
|
+
<span class="md-nav__icon md-icon"></span>
|
|
892
|
+
</label>
|
|
893
|
+
|
|
894
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_7_label" aria-expanded="false">
|
|
895
|
+
<label class="md-nav__title" for="__nav_2_5_7">
|
|
896
|
+
<span class="md-nav__icon md-icon"></span>
|
|
897
|
+
Security
|
|
898
|
+
</label>
|
|
899
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
<li class="md-nav__item">
|
|
907
|
+
<a href="../administration/security/index.html" class="md-nav__link">
|
|
908
|
+
Nautobot Security
|
|
909
|
+
</a>
|
|
910
|
+
</li>
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
<li class="md-nav__item">
|
|
921
|
+
<a href="../administration/security/notices.html" class="md-nav__link">
|
|
922
|
+
Notices
|
|
923
|
+
</a>
|
|
924
|
+
</li>
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
</ul>
|
|
930
|
+
</nav>
|
|
931
|
+
</li>
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
|
|
874
936
|
</ul>
|
|
875
937
|
</nav>
|
|
876
938
|
</li>
|
|
@@ -871,6 +871,68 @@
|
|
|
871
871
|
|
|
872
872
|
|
|
873
873
|
|
|
874
|
+
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
<li class="md-nav__item md-nav__item--nested">
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
|
|
885
|
+
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_7" >
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
<label class="md-nav__link" for="__nav_2_5_7" id="__nav_2_5_7_label" tabindex="0">
|
|
890
|
+
Security
|
|
891
|
+
<span class="md-nav__icon md-icon"></span>
|
|
892
|
+
</label>
|
|
893
|
+
|
|
894
|
+
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_7_label" aria-expanded="false">
|
|
895
|
+
<label class="md-nav__title" for="__nav_2_5_7">
|
|
896
|
+
<span class="md-nav__icon md-icon"></span>
|
|
897
|
+
Security
|
|
898
|
+
</label>
|
|
899
|
+
<ul class="md-nav__list" data-md-scrollfix>
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
<li class="md-nav__item">
|
|
907
|
+
<a href="../administration/security/index.html" class="md-nav__link">
|
|
908
|
+
Nautobot Security
|
|
909
|
+
</a>
|
|
910
|
+
</li>
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
|
|
920
|
+
<li class="md-nav__item">
|
|
921
|
+
<a href="../administration/security/notices.html" class="md-nav__link">
|
|
922
|
+
Notices
|
|
923
|
+
</a>
|
|
924
|
+
</li>
|
|
925
|
+
|
|
926
|
+
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
</ul>
|
|
930
|
+
</nav>
|
|
931
|
+
</li>
|
|
932
|
+
|
|
933
|
+
|
|
934
|
+
|
|
935
|
+
|
|
874
936
|
</ul>
|
|
875
937
|
</nav>
|
|
876
938
|
</li>
|
nautobot/tenancy/forms.py
CHANGED
|
@@ -17,6 +17,9 @@ from nautobot.utilities.forms import (
|
|
|
17
17
|
)
|
|
18
18
|
from .models import Tenant, TenantGroup
|
|
19
19
|
|
|
20
|
+
from nautobot.utilities.forms import StaticSelect2
|
|
21
|
+
|
|
22
|
+
from nautobot.utilities.forms.constants import BOOLEAN_WITH_BLANK_CHOICES
|
|
20
23
|
|
|
21
24
|
#
|
|
22
25
|
# Tenant groups
|
|
@@ -37,6 +40,13 @@ class TenantGroupForm(NautobotModelForm):
|
|
|
37
40
|
]
|
|
38
41
|
|
|
39
42
|
|
|
43
|
+
class TenantGroupFilterForm(NautobotFilterForm):
|
|
44
|
+
model = TenantGroup
|
|
45
|
+
q = forms.CharField(required=False, label="Search")
|
|
46
|
+
parent = DynamicModelMultipleChoiceField(queryset=TenantGroup.objects.all(), to_field_name="name", required=False)
|
|
47
|
+
has_tenants = forms.NullBooleanField(required="False", widget=StaticSelect2(choices=BOOLEAN_WITH_BLANK_CHOICES))
|
|
48
|
+
|
|
49
|
+
|
|
40
50
|
class TenantGroupCSVForm(CustomFieldModelCSVForm):
|
|
41
51
|
parent = CSVModelChoiceField(
|
|
42
52
|
queryset=TenantGroup.objects.all(),
|
nautobot/tenancy/views.py
CHANGED
|
@@ -20,6 +20,7 @@ class TenantGroupListView(generic.ObjectListView):
|
|
|
20
20
|
TenantGroup.objects.all(), Tenant, "group", "tenant_count", cumulative=True
|
|
21
21
|
)
|
|
22
22
|
filterset = filters.TenantGroupFilterSet
|
|
23
|
+
filterset_form = forms.TenantGroupFilterForm
|
|
23
24
|
table = tables.TenantGroupTable
|
|
24
25
|
|
|
25
26
|
|
nautobot/users/models.py
CHANGED
|
@@ -110,6 +110,8 @@ class User(BaseModel, AbstractUser):
|
|
|
110
110
|
if commit:
|
|
111
111
|
self.save()
|
|
112
112
|
|
|
113
|
+
set_config.alters_data = True
|
|
114
|
+
|
|
113
115
|
def clear_config(self, path, commit=False):
|
|
114
116
|
"""
|
|
115
117
|
Delete a configuration parameter specified by its dotted path. The key and any child keys will be deleted.
|
|
@@ -137,6 +139,8 @@ class User(BaseModel, AbstractUser):
|
|
|
137
139
|
if commit:
|
|
138
140
|
self.save()
|
|
139
141
|
|
|
142
|
+
clear_config.alters_data = True
|
|
143
|
+
|
|
140
144
|
|
|
141
145
|
#
|
|
142
146
|
# Proxy models for admin
|
|
@@ -24,7 +24,13 @@ from nautobot.extras.models.mixins import NotesMixin
|
|
|
24
24
|
from nautobot.users.models import ObjectPermission
|
|
25
25
|
from nautobot.utilities.templatetags.helpers import bettertitle, validated_viewname
|
|
26
26
|
from nautobot.utilities.testing.mixins import NautobotTestCaseMixin
|
|
27
|
-
from nautobot.utilities.utils import
|
|
27
|
+
from nautobot.utilities.utils import (
|
|
28
|
+
get_changes_for_model,
|
|
29
|
+
get_filterset_for_model,
|
|
30
|
+
get_form_for_model,
|
|
31
|
+
get_view_for_model,
|
|
32
|
+
csv_format,
|
|
33
|
+
)
|
|
28
34
|
from .utils import disable_warnings, extract_page_body, get_deletable_objects, post_data
|
|
29
35
|
|
|
30
36
|
|
|
@@ -662,6 +668,16 @@ class ViewTestCases:
|
|
|
662
668
|
def get_title(self):
|
|
663
669
|
return bettertitle(self.model._meta.verbose_name_plural)
|
|
664
670
|
|
|
671
|
+
def get_list_view(self):
|
|
672
|
+
return get_view_for_model(self.model, view_type="List")
|
|
673
|
+
|
|
674
|
+
def test_list_view_has_filter_form(self):
|
|
675
|
+
view = self.get_list_view()
|
|
676
|
+
if hasattr(view, "filterset_form"): # ObjectListView
|
|
677
|
+
self.assertIsNotNone(view.filterset_form, "List view lacks a FilterForm")
|
|
678
|
+
if hasattr(view, "filterset_form_class"): # ObjectListViewMixin
|
|
679
|
+
self.assertIsNotNone(view.filterset_form_class, "List viewset lacks a FilterForm")
|
|
680
|
+
|
|
665
681
|
@override_settings(EXEMPT_VIEW_PERMISSIONS=["*"])
|
|
666
682
|
def test_list_objects_anonymous(self):
|
|
667
683
|
# Make the request as an unauthenticated user
|
|
@@ -3,7 +3,8 @@ from jinja2.exceptions import SecurityError, TemplateAssertionError
|
|
|
3
3
|
from netutils.utils import jinja2_convenience_function
|
|
4
4
|
|
|
5
5
|
from nautobot.utilities.utils import render_jinja2
|
|
6
|
-
from nautobot.dcim
|
|
6
|
+
from nautobot.dcim import models as dcim_models
|
|
7
|
+
from nautobot.extras import models as extras_models
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class NautobotJinjaFilterTest(TestCase):
|
|
@@ -73,7 +74,7 @@ class NautobotJinjaFilterTest(TestCase):
|
|
|
73
74
|
|
|
74
75
|
def test_safe_render(self):
|
|
75
76
|
"""Assert that safe Jinja rendering still works."""
|
|
76
|
-
site = Site.objects.filter(region__isnull=False).first()
|
|
77
|
+
site = dcim_models.Site.objects.filter(region__isnull=False).first()
|
|
77
78
|
template_code = "{{ obj.region.name }}"
|
|
78
79
|
try:
|
|
79
80
|
value = render_jinja2(template_code=template_code, context={"obj": site})
|
|
@@ -81,3 +82,26 @@ class NautobotJinjaFilterTest(TestCase):
|
|
|
81
82
|
self.fail("SecurityError raised on safe Jinja template render")
|
|
82
83
|
else:
|
|
83
84
|
self.assertEqual(value, site.region.name)
|
|
85
|
+
|
|
86
|
+
def test_render_blocks_various_unsafe_methods(self):
|
|
87
|
+
"""Assert that Jinja template rendering correctly blocks various unsafe Nautobot APIs."""
|
|
88
|
+
location = dcim_models.Location.objects.first()
|
|
89
|
+
secret = extras_models.Secret.objects.create(name="secret", provider="environment-variable")
|
|
90
|
+
|
|
91
|
+
context = {
|
|
92
|
+
"location": location,
|
|
93
|
+
"secret": secret,
|
|
94
|
+
"JobResult": extras_models.JobResult,
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
for call in [
|
|
98
|
+
# "device.create_components()", # 1.6 lacks a Device factory
|
|
99
|
+
# "interface_template.instantiate(device)", # 1.6 lacks an InterfaceTemplate factory
|
|
100
|
+
"location.validated_save()",
|
|
101
|
+
"secret.get_value()",
|
|
102
|
+
"JobResult.enqueue_job(None, None)",
|
|
103
|
+
"JobResult.log('hello world')",
|
|
104
|
+
]:
|
|
105
|
+
with self.subTest(call=call):
|
|
106
|
+
with self.assertRaises(SecurityError):
|
|
107
|
+
render_jinja2(template_code="{{ " + call + " }}", context=context)
|
nautobot/utilities/utils.py
CHANGED
|
@@ -693,6 +693,20 @@ def get_table_for_model(model):
|
|
|
693
693
|
return get_related_class_for_model(model, module_name="tables", object_suffix="Table")
|
|
694
694
|
|
|
695
695
|
|
|
696
|
+
def get_view_for_model(model, view_type=""):
|
|
697
|
+
"""Return the `UIViewSet` or `<view_type>View` class associated with a given `model`.
|
|
698
|
+
|
|
699
|
+
The view class is expected to be in the `views` module within the app associated with the model,
|
|
700
|
+
and its name is expected to be either `{ModelName}UIViewSet` or `{ModelName}{view_type}View`.
|
|
701
|
+
|
|
702
|
+
If neither view class is found, this will return `None`.
|
|
703
|
+
"""
|
|
704
|
+
result = get_related_class_for_model(model, module_name="views", object_suffix="UIViewSet")
|
|
705
|
+
if result is None:
|
|
706
|
+
result = get_related_class_for_model(model, module_name="views", object_suffix=f"{view_type}View")
|
|
707
|
+
return result
|
|
708
|
+
|
|
709
|
+
|
|
696
710
|
def get_url_patterns(urlconf=None, patterns_list=None, base_path="/"):
|
|
697
711
|
"""
|
|
698
712
|
Recursively yield a list of registered URL patterns.
|
nautobot/virtualization/forms.py
CHANGED
|
@@ -69,6 +69,12 @@ class ClusterTypeForm(NautobotModelForm):
|
|
|
69
69
|
]
|
|
70
70
|
|
|
71
71
|
|
|
72
|
+
class ClusterTypeFilterForm(NautobotFilterForm):
|
|
73
|
+
model = ClusterType
|
|
74
|
+
q = forms.CharField(required=False, label="Search")
|
|
75
|
+
clusters = DynamicModelMultipleChoiceField(queryset=Cluster.objects.all(), to_field_name="name", required=False)
|
|
76
|
+
|
|
77
|
+
|
|
72
78
|
class ClusterTypeCSVForm(CustomFieldModelCSVForm):
|
|
73
79
|
class Meta:
|
|
74
80
|
model = ClusterType
|
|
@@ -92,6 +98,12 @@ class ClusterGroupForm(NautobotModelForm):
|
|
|
92
98
|
]
|
|
93
99
|
|
|
94
100
|
|
|
101
|
+
class ClusterGroupFilterForm(NautobotFilterForm):
|
|
102
|
+
model = ClusterGroup
|
|
103
|
+
q = forms.CharField(required=False, label="Search")
|
|
104
|
+
clusters = DynamicModelMultipleChoiceField(queryset=Cluster.objects.all(), to_field_name="name", required=False)
|
|
105
|
+
|
|
106
|
+
|
|
95
107
|
class ClusterGroupCSVForm(CustomFieldModelCSVForm):
|
|
96
108
|
class Meta:
|
|
97
109
|
model = ClusterGroup
|
nautobot/virtualization/views.py
CHANGED
|
@@ -26,6 +26,7 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
|
|
|
26
26
|
class ClusterTypeListView(generic.ObjectListView):
|
|
27
27
|
queryset = ClusterType.objects.annotate(cluster_count=count_related(Cluster, "type"))
|
|
28
28
|
filterset = filters.ClusterTypeFilterSet
|
|
29
|
+
filterset_form = forms.ClusterTypeFilterForm
|
|
29
30
|
table = tables.ClusterTypeTable
|
|
30
31
|
|
|
31
32
|
|
|
@@ -85,6 +86,7 @@ class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
|
|
|
85
86
|
class ClusterGroupListView(generic.ObjectListView):
|
|
86
87
|
queryset = ClusterGroup.objects.annotate(cluster_count=count_related(Cluster, "group"))
|
|
87
88
|
filterset = filters.ClusterGroupFilterSet
|
|
89
|
+
filterset_form = forms.ClusterGroupFilterForm
|
|
88
90
|
table = tables.ClusterGroupTable
|
|
89
91
|
|
|
90
92
|
|