nautobot 1.6.30__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.

Files changed (236) hide show
  1. nautobot/circuits/forms.py +6 -0
  2. nautobot/circuits/views.py +1 -0
  3. nautobot/core/graphql/schema.py +3 -1
  4. nautobot/core/graphql/types.py +10 -0
  5. nautobot/core/models/__init__.py +2 -0
  6. nautobot/core/templates/generic/object_list.html +1 -1
  7. nautobot/core/tests/test_views.py +73 -0
  8. nautobot/core/urls.py +3 -3
  9. nautobot/core/views/__init__.py +21 -0
  10. nautobot/dcim/forms.py +29 -0
  11. nautobot/dcim/models/device_component_templates.py +4 -0
  12. nautobot/dcim/models/device_components.py +4 -0
  13. nautobot/dcim/models/devices.py +2 -0
  14. nautobot/dcim/views.py +5 -0
  15. nautobot/extras/forms/forms.py +12 -0
  16. nautobot/extras/models/customfields.py +2 -0
  17. nautobot/extras/models/datasources.py +2 -0
  18. nautobot/extras/models/groups.py +8 -0
  19. nautobot/extras/models/jobs.py +10 -0
  20. nautobot/extras/models/models.py +2 -0
  21. nautobot/extras/models/secrets.py +8 -2
  22. nautobot/extras/secrets/__init__.py +14 -0
  23. nautobot/extras/tests/test_models.py +26 -0
  24. nautobot/extras/views.py +1 -0
  25. nautobot/ipam/filters.py +1 -1
  26. nautobot/ipam/forms.py +6 -0
  27. nautobot/ipam/models.py +8 -0
  28. nautobot/ipam/views.py +1 -0
  29. nautobot/project-static/docs/404.html +62 -0
  30. nautobot/project-static/docs/additional-features/caching.html +62 -0
  31. nautobot/project-static/docs/additional-features/change-logging.html +62 -0
  32. nautobot/project-static/docs/additional-features/config-contexts.html +62 -0
  33. nautobot/project-static/docs/additional-features/graphql.html +62 -0
  34. nautobot/project-static/docs/additional-features/healthcheck.html +62 -0
  35. nautobot/project-static/docs/additional-features/job-scheduling-and-approvals.html +63 -1
  36. nautobot/project-static/docs/additional-features/jobs.html +62 -0
  37. nautobot/project-static/docs/additional-features/napalm.html +62 -0
  38. nautobot/project-static/docs/additional-features/prometheus-metrics.html +62 -0
  39. nautobot/project-static/docs/additional-features/template-filters.html +62 -0
  40. nautobot/project-static/docs/administration/celery-queues.html +63 -1
  41. nautobot/project-static/docs/administration/nautobot-server.html +62 -0
  42. nautobot/project-static/docs/administration/nautobot-shell.html +62 -0
  43. nautobot/project-static/docs/administration/permissions.html +62 -0
  44. nautobot/project-static/docs/administration/replicating-nautobot.html +62 -0
  45. nautobot/project-static/docs/administration/request-profiling.html +62 -0
  46. nautobot/project-static/docs/administration/security/index.html +4407 -0
  47. nautobot/project-static/docs/administration/security/notices.html +4797 -0
  48. nautobot/project-static/docs/apps/index.html +62 -0
  49. nautobot/project-static/docs/apps/nautobot-apps.html +62 -0
  50. nautobot/project-static/docs/code-reference/nautobot/apps/__init__.html +62 -0
  51. nautobot/project-static/docs/code-reference/nautobot/apps/admin.html +62 -0
  52. nautobot/project-static/docs/code-reference/nautobot/apps/api.html +62 -0
  53. nautobot/project-static/docs/code-reference/nautobot/apps/choices.html +62 -0
  54. nautobot/project-static/docs/code-reference/nautobot/apps/datasources.html +62 -0
  55. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +62 -0
  56. nautobot/project-static/docs/code-reference/nautobot/apps/forms.html +83 -21
  57. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +67 -1
  58. nautobot/project-static/docs/code-reference/nautobot/apps/secrets.html +140 -52
  59. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +62 -0
  60. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +3203 -3101
  61. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +62 -0
  62. nautobot/project-static/docs/code-reference/nautobot/apps/urls.html +62 -0
  63. nautobot/project-static/docs/code-reference/nautobot/apps/utils.html +210 -148
  64. nautobot/project-static/docs/code-reference/nautobot/apps/views.html +62 -0
  65. nautobot/project-static/docs/configuration/authentication/ldap.html +62 -0
  66. nautobot/project-static/docs/configuration/authentication/remote.html +62 -0
  67. nautobot/project-static/docs/configuration/authentication/sso.html +62 -0
  68. nautobot/project-static/docs/configuration/index.html +62 -0
  69. nautobot/project-static/docs/configuration/optional-settings.html +67 -5
  70. nautobot/project-static/docs/configuration/required-settings.html +62 -0
  71. nautobot/project-static/docs/core-functionality/circuits.html +62 -0
  72. nautobot/project-static/docs/core-functionality/device-types.html +62 -0
  73. nautobot/project-static/docs/core-functionality/devices.html +62 -0
  74. nautobot/project-static/docs/core-functionality/ipam.html +62 -0
  75. nautobot/project-static/docs/core-functionality/power.html +62 -0
  76. nautobot/project-static/docs/core-functionality/secrets.html +62 -0
  77. nautobot/project-static/docs/core-functionality/services.html +62 -0
  78. nautobot/project-static/docs/core-functionality/sites-and-racks.html +62 -0
  79. nautobot/project-static/docs/core-functionality/tenancy.html +62 -0
  80. nautobot/project-static/docs/core-functionality/virtualization.html +62 -0
  81. nautobot/project-static/docs/core-functionality/vlans.html +62 -0
  82. nautobot/project-static/docs/development/application-registry.html +62 -0
  83. nautobot/project-static/docs/development/best-practices.html +62 -0
  84. nautobot/project-static/docs/development/docker-compose-advanced-use-cases.html +62 -0
  85. nautobot/project-static/docs/development/extending-models.html +62 -0
  86. nautobot/project-static/docs/development/generic-views.html +62 -0
  87. nautobot/project-static/docs/development/getting-started.html +63 -1
  88. nautobot/project-static/docs/development/homepage.html +62 -0
  89. nautobot/project-static/docs/development/index.html +62 -0
  90. nautobot/project-static/docs/development/navigation-menu.html +62 -0
  91. nautobot/project-static/docs/development/release-checklist.html +62 -0
  92. nautobot/project-static/docs/development/style-guide.html +62 -0
  93. nautobot/project-static/docs/development/templates.html +62 -0
  94. nautobot/project-static/docs/development/testing.html +62 -0
  95. nautobot/project-static/docs/development/user-preferences.html +62 -0
  96. nautobot/project-static/docs/docker/index.html +62 -0
  97. nautobot/project-static/docs/index.html +62 -0
  98. nautobot/project-static/docs/installation/centos.html +62 -0
  99. nautobot/project-static/docs/installation/external-authentication.html +62 -0
  100. nautobot/project-static/docs/installation/http-server.html +62 -0
  101. nautobot/project-static/docs/installation/index.html +62 -0
  102. nautobot/project-static/docs/installation/migrating-from-netbox.html +62 -0
  103. nautobot/project-static/docs/installation/migrating-from-postgresql.html +62 -0
  104. nautobot/project-static/docs/installation/nautobot.html +62 -0
  105. nautobot/project-static/docs/installation/selinux-troubleshooting.html +62 -0
  106. nautobot/project-static/docs/installation/services.html +62 -0
  107. nautobot/project-static/docs/installation/ubuntu.html +62 -0
  108. nautobot/project-static/docs/installation/upgrading.html +62 -0
  109. nautobot/project-static/docs/models/circuits/circuit.html +62 -0
  110. nautobot/project-static/docs/models/circuits/circuittermination.html +62 -0
  111. nautobot/project-static/docs/models/circuits/circuittype.html +62 -0
  112. nautobot/project-static/docs/models/circuits/provider.html +62 -0
  113. nautobot/project-static/docs/models/circuits/providernetwork.html +62 -0
  114. nautobot/project-static/docs/models/dcim/cable.html +62 -0
  115. nautobot/project-static/docs/models/dcim/consoleport.html +62 -0
  116. nautobot/project-static/docs/models/dcim/consoleporttemplate.html +62 -0
  117. nautobot/project-static/docs/models/dcim/consoleserverport.html +62 -0
  118. nautobot/project-static/docs/models/dcim/consoleserverporttemplate.html +62 -0
  119. nautobot/project-static/docs/models/dcim/device.html +62 -0
  120. nautobot/project-static/docs/models/dcim/devicebay.html +62 -0
  121. nautobot/project-static/docs/models/dcim/devicebaytemplate.html +62 -0
  122. nautobot/project-static/docs/models/dcim/deviceredundancygroup.html +62 -0
  123. nautobot/project-static/docs/models/dcim/devicerole.html +62 -0
  124. nautobot/project-static/docs/models/dcim/devicetype.html +62 -0
  125. nautobot/project-static/docs/models/dcim/frontport.html +62 -0
  126. nautobot/project-static/docs/models/dcim/frontporttemplate.html +62 -0
  127. nautobot/project-static/docs/models/dcim/interface.html +62 -0
  128. nautobot/project-static/docs/models/dcim/interfaceredundancygroup.html +62 -0
  129. nautobot/project-static/docs/models/dcim/interfacetemplate.html +62 -0
  130. nautobot/project-static/docs/models/dcim/inventoryitem.html +62 -0
  131. nautobot/project-static/docs/models/dcim/location.html +62 -0
  132. nautobot/project-static/docs/models/dcim/locationtype.html +62 -0
  133. nautobot/project-static/docs/models/dcim/manufacturer.html +62 -0
  134. nautobot/project-static/docs/models/dcim/platform.html +62 -0
  135. nautobot/project-static/docs/models/dcim/powerfeed.html +62 -0
  136. nautobot/project-static/docs/models/dcim/poweroutlet.html +62 -0
  137. nautobot/project-static/docs/models/dcim/poweroutlettemplate.html +62 -0
  138. nautobot/project-static/docs/models/dcim/powerpanel.html +62 -0
  139. nautobot/project-static/docs/models/dcim/powerport.html +62 -0
  140. nautobot/project-static/docs/models/dcim/powerporttemplate.html +62 -0
  141. nautobot/project-static/docs/models/dcim/rack.html +62 -0
  142. nautobot/project-static/docs/models/dcim/rackgroup.html +62 -0
  143. nautobot/project-static/docs/models/dcim/rackreservation.html +62 -0
  144. nautobot/project-static/docs/models/dcim/rackrole.html +62 -0
  145. nautobot/project-static/docs/models/dcim/rearport.html +62 -0
  146. nautobot/project-static/docs/models/dcim/rearporttemplate.html +62 -0
  147. nautobot/project-static/docs/models/dcim/region.html +62 -0
  148. nautobot/project-static/docs/models/dcim/site.html +62 -0
  149. nautobot/project-static/docs/models/dcim/virtualchassis.html +62 -0
  150. nautobot/project-static/docs/models/extras/computedfield.html +63 -1
  151. nautobot/project-static/docs/models/extras/configcontext.html +62 -0
  152. nautobot/project-static/docs/models/extras/configcontextschema.html +62 -0
  153. nautobot/project-static/docs/models/extras/customfield.html +62 -0
  154. nautobot/project-static/docs/models/extras/customlink.html +63 -1
  155. nautobot/project-static/docs/models/extras/dynamicgroup.html +62 -0
  156. nautobot/project-static/docs/models/extras/exporttemplate.html +62 -0
  157. nautobot/project-static/docs/models/extras/gitrepository.html +62 -0
  158. nautobot/project-static/docs/models/extras/graphqlquery.html +62 -0
  159. nautobot/project-static/docs/models/extras/imageattachment.html +62 -0
  160. nautobot/project-static/docs/models/extras/job.html +62 -0
  161. nautobot/project-static/docs/models/extras/jobbutton.html +63 -1
  162. nautobot/project-static/docs/models/extras/jobhook.html +62 -0
  163. nautobot/project-static/docs/models/extras/joblogentry.html +62 -0
  164. nautobot/project-static/docs/models/extras/jobresult.html +62 -0
  165. nautobot/project-static/docs/models/extras/note.html +62 -0
  166. nautobot/project-static/docs/models/extras/relationship.html +62 -0
  167. nautobot/project-static/docs/models/extras/secret.html +62 -0
  168. nautobot/project-static/docs/models/extras/secretsgroup.html +62 -0
  169. nautobot/project-static/docs/models/extras/status.html +62 -0
  170. nautobot/project-static/docs/models/extras/tag.html +62 -0
  171. nautobot/project-static/docs/models/extras/webhook.html +62 -0
  172. nautobot/project-static/docs/models/ipam/aggregate.html +62 -0
  173. nautobot/project-static/docs/models/ipam/ipaddress.html +62 -0
  174. nautobot/project-static/docs/models/ipam/prefix.html +62 -0
  175. nautobot/project-static/docs/models/ipam/rir.html +62 -0
  176. nautobot/project-static/docs/models/ipam/role.html +62 -0
  177. nautobot/project-static/docs/models/ipam/routetarget.html +62 -0
  178. nautobot/project-static/docs/models/ipam/service.html +62 -0
  179. nautobot/project-static/docs/models/ipam/vlan.html +62 -0
  180. nautobot/project-static/docs/models/ipam/vlangroup.html +62 -0
  181. nautobot/project-static/docs/models/ipam/vrf.html +62 -0
  182. nautobot/project-static/docs/models/tenancy/tenant.html +62 -0
  183. nautobot/project-static/docs/models/tenancy/tenantgroup.html +62 -0
  184. nautobot/project-static/docs/models/users/objectpermission.html +62 -0
  185. nautobot/project-static/docs/models/users/token.html +62 -0
  186. nautobot/project-static/docs/models/virtualization/cluster.html +62 -0
  187. nautobot/project-static/docs/models/virtualization/clustergroup.html +62 -0
  188. nautobot/project-static/docs/models/virtualization/clustertype.html +62 -0
  189. nautobot/project-static/docs/models/virtualization/virtualmachine.html +62 -0
  190. nautobot/project-static/docs/models/virtualization/vminterface.html +62 -0
  191. nautobot/project-static/docs/plugins/development.html +63 -1
  192. nautobot/project-static/docs/plugins/index.html +62 -0
  193. nautobot/project-static/docs/plugins/porting-from-netbox.html +62 -0
  194. nautobot/project-static/docs/release-notes/index.html +62 -0
  195. nautobot/project-static/docs/release-notes/version-1.0.html +62 -0
  196. nautobot/project-static/docs/release-notes/version-1.1.html +64 -2
  197. nautobot/project-static/docs/release-notes/version-1.2.html +63 -1
  198. nautobot/project-static/docs/release-notes/version-1.3.html +62 -0
  199. nautobot/project-static/docs/release-notes/version-1.4.html +62 -0
  200. nautobot/project-static/docs/release-notes/version-1.5.html +62 -0
  201. nautobot/project-static/docs/release-notes/version-1.6.html +466 -217
  202. nautobot/project-static/docs/requirements.txt +2 -1
  203. nautobot/project-static/docs/rest-api/authentication.html +62 -0
  204. nautobot/project-static/docs/rest-api/filtering.html +62 -0
  205. nautobot/project-static/docs/rest-api/overview.html +62 -0
  206. nautobot/project-static/docs/search/search_index.json +1 -1
  207. nautobot/project-static/docs/sitemap.xml +197 -187
  208. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  209. nautobot/project-static/docs/user-guides/custom-fields.html +62 -0
  210. nautobot/project-static/docs/user-guides/getting-started/creating-devices.html +63 -1
  211. nautobot/project-static/docs/user-guides/getting-started/index.html +62 -0
  212. nautobot/project-static/docs/user-guides/getting-started/interfaces.html +62 -0
  213. nautobot/project-static/docs/user-guides/getting-started/ipam.html +62 -0
  214. nautobot/project-static/docs/user-guides/getting-started/platforms.html +62 -0
  215. nautobot/project-static/docs/user-guides/getting-started/regions.html +62 -0
  216. nautobot/project-static/docs/user-guides/getting-started/search-bar.html +62 -0
  217. nautobot/project-static/docs/user-guides/getting-started/tenants.html +62 -0
  218. nautobot/project-static/docs/user-guides/getting-started/vlans-and-vlan-groups.html +63 -1
  219. nautobot/project-static/docs/user-guides/git-data-source.html +62 -0
  220. nautobot/project-static/docs/user-guides/graphql.html +62 -0
  221. nautobot/project-static/docs/user-guides/relationships.html +62 -0
  222. nautobot/project-static/docs/user-guides/s3-django-storage.html +62 -0
  223. nautobot/tenancy/forms.py +10 -0
  224. nautobot/tenancy/views.py +1 -0
  225. nautobot/users/models.py +4 -0
  226. nautobot/utilities/testing/views.py +17 -1
  227. nautobot/utilities/tests/test_jinja_filters.py +26 -2
  228. nautobot/utilities/utils.py +14 -0
  229. nautobot/virtualization/forms.py +12 -0
  230. nautobot/virtualization/views.py +2 -0
  231. {nautobot-1.6.30.dist-info → nautobot-1.6.32.dist-info}/METADATA +2 -2
  232. {nautobot-1.6.30.dist-info → nautobot-1.6.32.dist-info}/RECORD +236 -234
  233. {nautobot-1.6.30.dist-info → nautobot-1.6.32.dist-info}/LICENSE.txt +0 -0
  234. {nautobot-1.6.30.dist-info → nautobot-1.6.32.dist-info}/NOTICE +0 -0
  235. {nautobot-1.6.30.dist-info → nautobot-1.6.32.dist-info}/WHEEL +0 -0
  236. {nautobot-1.6.30.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 get_changes_for_model, get_filterset_for_model, get_form_for_model, csv_format
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.models import Site
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)
@@ -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.
@@ -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
@@ -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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nautobot
3
- Version: 1.6.30
3
+ Version: 1.6.32
4
4
  Summary: Source of truth and network automation platform.
5
5
  Home-page: https://nautobot.com
6
6
  License: Apache-2.0
@@ -24,7 +24,7 @@ Provides-Extra: remote-storage
24
24
  Provides-Extra: sso
25
25
  Requires-Dist: Django (>=3.2.25,<3.3.0)
26
26
  Requires-Dist: GitPython (>=3.1.41,<3.2.0)
27
- Requires-Dist: Jinja2 (>=3.1.5,<3.2.0)
27
+ Requires-Dist: Jinja2 (>=3.1.6,<3.2.0)
28
28
  Requires-Dist: Markdown (>=3.3.7,<3.4.0)
29
29
  Requires-Dist: MarkupSafe (>=2.1.3,<2.2.0)
30
30
  Requires-Dist: Pillow (>=10.3.0,<10.4.0)