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.
Files changed (267) hide show
  1. nautobot/apps/filters.py +2 -0
  2. nautobot/circuits/filters.py +1 -1
  3. nautobot/circuits/templates/circuits/inc/circuit_termination.html +1 -1
  4. nautobot/circuits/tests/integration/test_circuit.py +135 -0
  5. nautobot/circuits/tests/test_models.py +5 -3
  6. nautobot/circuits/views.py +4 -1
  7. nautobot/cloud/api/views.py +3 -3
  8. nautobot/cloud/filters.py +3 -6
  9. nautobot/cloud/tests/test_filters.py +21 -0
  10. nautobot/core/admin.py +2 -0
  11. nautobot/core/constants.py +0 -1
  12. nautobot/core/forms/__init__.py +2 -0
  13. nautobot/core/forms/forms.py +2 -1
  14. nautobot/core/forms/widgets.py +8 -0
  15. nautobot/core/jobs/__init__.py +2 -1
  16. nautobot/core/management/commands/generate_performance_test_endpoints.py +271 -0
  17. nautobot/core/models/utils.py +6 -1
  18. nautobot/core/templates/generic/object_bulk_delete.html +1 -1
  19. nautobot/core/templates/generic/object_bulk_edit.html +1 -1
  20. nautobot/core/templates/generic/object_bulk_import.html +1 -1
  21. nautobot/core/templates/generic/object_create.html +5 -0
  22. nautobot/core/templates/generic/object_delete.html +1 -1
  23. nautobot/core/templates/generic/object_detail.html +1 -1
  24. nautobot/core/templates/generic/object_edit.html +1 -1
  25. nautobot/core/templates/inc/javascript.html +3 -0
  26. nautobot/core/templates/widgets/clearable_file.html +5 -0
  27. nautobot/core/templatetags/helpers.py +3 -3
  28. nautobot/core/templatetags/ui_framework.py +20 -4
  29. nautobot/core/testing/forms.py +1 -1
  30. nautobot/core/testing/integration.py +37 -7
  31. nautobot/core/tests/test_api.py +1 -1
  32. nautobot/core/tests/test_commands.py +31 -0
  33. nautobot/core/tests/test_graphql.py +3 -3
  34. nautobot/core/tests/test_jobs.py +4 -1
  35. nautobot/core/tests/test_utils.py +17 -2
  36. nautobot/core/ui/object_detail.py +1 -1
  37. nautobot/core/utils/lookup.py +12 -1
  38. nautobot/core/views/generic.py +9 -1
  39. nautobot/core/views/mixins.py +9 -1
  40. nautobot/dcim/api/serializers.py +36 -0
  41. nautobot/dcim/api/views.py +12 -11
  42. nautobot/dcim/elevations.py +17 -4
  43. nautobot/dcim/factory.py +9 -1
  44. nautobot/dcim/filters/__init__.py +27 -1
  45. nautobot/dcim/forms.py +16 -7
  46. nautobot/dcim/models/devices.py +12 -7
  47. nautobot/dcim/signals.py +26 -0
  48. nautobot/dcim/templates/dcim/cable_trace.html +4 -4
  49. nautobot/dcim/templates/dcim/consoleport.html +14 -4
  50. nautobot/dcim/templates/dcim/consoleserverport.html +14 -4
  51. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +3 -3
  52. nautobot/dcim/templates/dcim/frontport.html +7 -2
  53. nautobot/dcim/templates/dcim/interface.html +9 -4
  54. nautobot/dcim/templates/dcim/powerfeed.html +8 -3
  55. nautobot/dcim/templates/dcim/poweroutlet.html +14 -4
  56. nautobot/dcim/templates/dcim/powerport.html +14 -4
  57. nautobot/dcim/templates/dcim/rearport.html +7 -2
  58. nautobot/dcim/templates/dcim/virtualdevicecontext_retrieve.html +0 -62
  59. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +6 -0
  60. nautobot/dcim/tests/integration/test_fileinputpicker.py +87 -0
  61. nautobot/dcim/tests/test_api.py +176 -0
  62. nautobot/dcim/tests/test_filters.py +56 -3
  63. nautobot/dcim/tests/test_models.py +41 -1
  64. nautobot/dcim/views.py +24 -14
  65. nautobot/extras/api/mixins.py +1 -1
  66. nautobot/extras/api/views.py +4 -4
  67. nautobot/extras/filters/__init__.py +4 -0
  68. nautobot/extras/forms/forms.py +4 -0
  69. nautobot/extras/jobs.py +8 -1
  70. nautobot/extras/models/datasources.py +7 -3
  71. nautobot/extras/plugins/__init__.py +26 -1
  72. nautobot/extras/templates/extras/inc/jobresult.html +12 -13
  73. nautobot/extras/templates/extras/job.html +1 -0
  74. nautobot/extras/templates/extras/objectchange.html +28 -12
  75. nautobot/extras/tests/test_api.py +16 -15
  76. nautobot/extras/tests/test_dynamicgroups.py +14 -0
  77. nautobot/extras/tests/test_filters.py +2 -0
  78. nautobot/extras/tests/test_plugins.py +32 -1
  79. nautobot/extras/tests/test_views.py +209 -11
  80. nautobot/extras/utils.py +30 -0
  81. nautobot/extras/views.py +32 -14
  82. nautobot/ipam/api/serializers.py +7 -8
  83. nautobot/ipam/api/views.py +5 -5
  84. nautobot/ipam/factory.py +27 -8
  85. nautobot/ipam/filters.py +67 -29
  86. nautobot/ipam/formfields.py +51 -0
  87. nautobot/ipam/forms.py +15 -7
  88. nautobot/ipam/migrations/0051_added_optional_vrf_relationship_to_vdc.py +41 -0
  89. nautobot/ipam/models.py +63 -5
  90. nautobot/ipam/tables.py +21 -7
  91. nautobot/ipam/tests/test_api.py +107 -66
  92. nautobot/ipam/tests/test_filters.py +145 -5
  93. nautobot/ipam/tests/test_views.py +15 -2
  94. nautobot/project-static/bootstrap-filestyle-1.2.3/bootstrap-filestyle.min.js +11 -0
  95. nautobot/project-static/css/base.css +11 -0
  96. nautobot/project-static/css/dark.css +2 -1
  97. nautobot/project-static/docs/apps/index.html +1 -1
  98. nautobot/project-static/docs/apps/nautobot-apps.html +1 -1
  99. nautobot/project-static/docs/code-reference/nautobot/apps/filters.html +62 -0
  100. nautobot/project-static/docs/development/apps/api/configuration-view.html +0 -3
  101. nautobot/project-static/docs/development/apps/api/models/graphql.html +9 -13
  102. nautobot/project-static/docs/development/apps/api/platform-features/custom-validators.html +94 -1
  103. nautobot/project-static/docs/development/apps/api/platform-features/filter-extensions.html +2 -5
  104. nautobot/project-static/docs/development/apps/api/platform-features/jinja2-filters.html +0 -3
  105. nautobot/project-static/docs/development/apps/api/platform-features/populating-extensibility-features.html +0 -3
  106. nautobot/project-static/docs/development/apps/api/platform-features/secrets-providers.html +0 -3
  107. nautobot/project-static/docs/development/apps/api/prometheus.html +0 -3
  108. nautobot/project-static/docs/development/apps/api/setup.html +1 -1
  109. nautobot/project-static/docs/development/apps/api/testing.html +0 -6
  110. nautobot/project-static/docs/development/apps/api/ui-extensions/banners.html +0 -3
  111. nautobot/project-static/docs/development/apps/api/ui-extensions/home-page.html +0 -3
  112. nautobot/project-static/docs/development/apps/api/ui-extensions/object-views.html +0 -3
  113. nautobot/project-static/docs/development/apps/api/views/core-view-overrides.html +0 -3
  114. nautobot/project-static/docs/development/apps/api/views/nautobot-generic-views.html +1 -7
  115. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewset.html +0 -7
  116. nautobot/project-static/docs/development/apps/api/views/nautobotuiviewsetrouter.html +0 -4
  117. nautobot/project-static/docs/development/apps/api/views/notes.html +0 -3
  118. nautobot/project-static/docs/development/apps/index.html +2 -35
  119. nautobot/project-static/docs/development/apps/migration/code-updates.html +7 -6
  120. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +2 -2
  121. nautobot/project-static/docs/development/apps/migration/from-v1.html +3 -3
  122. nautobot/project-static/docs/development/core/application-registry.html +0 -6
  123. nautobot/project-static/docs/development/core/best-practices.html +1 -28
  124. nautobot/project-static/docs/development/core/bootstrap-ui.html +1 -1
  125. nautobot/project-static/docs/development/core/docker-compose-advanced-use-cases.html +65 -11
  126. nautobot/project-static/docs/development/core/getting-started.html +14 -18
  127. nautobot/project-static/docs/development/core/homepage.html +0 -3
  128. nautobot/project-static/docs/development/core/index.html +1 -1
  129. nautobot/project-static/docs/development/core/minikube-dev-environment-for-k8s-jobs.html +3 -3
  130. nautobot/project-static/docs/development/core/model-checklist.html +1 -1
  131. nautobot/project-static/docs/development/core/navigation-menu.html +1 -1
  132. nautobot/project-static/docs/development/core/release-checklist.html +1 -1
  133. nautobot/project-static/docs/development/core/settings.html +1 -1
  134. nautobot/project-static/docs/development/core/style-guide.html +4 -9
  135. nautobot/project-static/docs/development/core/templates.html +0 -3
  136. nautobot/project-static/docs/development/core/testing.html +0 -9
  137. nautobot/project-static/docs/development/jobs/index.html +11 -30
  138. nautobot/project-static/docs/development/jobs/migration/from-v1.html +3 -2
  139. nautobot/project-static/docs/index.html +3 -2
  140. nautobot/project-static/docs/objects.inv +0 -0
  141. nautobot/project-static/docs/overview/application_stack.html +2 -20
  142. nautobot/project-static/docs/release-notes/version-1.0.html +2 -2
  143. nautobot/project-static/docs/release-notes/version-1.1.html +2 -2
  144. nautobot/project-static/docs/release-notes/version-1.2.html +3 -3
  145. nautobot/project-static/docs/release-notes/version-1.3.html +1 -1
  146. nautobot/project-static/docs/release-notes/version-1.4.html +17 -17
  147. nautobot/project-static/docs/release-notes/version-1.5.html +8 -8
  148. nautobot/project-static/docs/release-notes/version-1.6.html +4 -4
  149. nautobot/project-static/docs/release-notes/version-2.0.html +10 -10
  150. nautobot/project-static/docs/release-notes/version-2.1.html +7 -7
  151. nautobot/project-static/docs/release-notes/version-2.2.html +1 -1
  152. nautobot/project-static/docs/release-notes/version-2.3.html +4 -4
  153. nautobot/project-static/docs/release-notes/version-2.4.html +379 -0
  154. nautobot/project-static/docs/requirements.txt +1 -1
  155. nautobot/project-static/docs/search/search_index.json +1 -1
  156. nautobot/project-static/docs/sitemap.xml +290 -290
  157. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  158. nautobot/project-static/docs/user-guide/administration/configuration/authentication/ldap.html +3 -3
  159. nautobot/project-static/docs/user-guide/administration/configuration/authentication/sso.html +4 -4
  160. nautobot/project-static/docs/user-guide/administration/configuration/redis.html +1 -1
  161. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +3 -13
  162. nautobot/project-static/docs/user-guide/administration/guides/celery-queues.html +5 -5
  163. nautobot/project-static/docs/user-guide/administration/guides/docker.html +3 -18
  164. nautobot/project-static/docs/user-guide/administration/guides/health-checks.html +1 -1
  165. nautobot/project-static/docs/user-guide/administration/guides/prometheus-metrics.html +4 -4
  166. nautobot/project-static/docs/user-guide/administration/guides/request-profiling.html +15 -15
  167. nautobot/project-static/docs/user-guide/administration/guides/s3-django-storage.html +2 -2
  168. nautobot/project-static/docs/user-guide/administration/installation/app-install.html +1 -1
  169. nautobot/project-static/docs/user-guide/administration/installation/index.html +0 -16
  170. nautobot/project-static/docs/user-guide/administration/installation/install_system.html +1 -1
  171. nautobot/project-static/docs/user-guide/administration/installation/nautobot.html +7 -10
  172. nautobot/project-static/docs/user-guide/administration/installation/services.html +1 -12
  173. nautobot/project-static/docs/user-guide/administration/migration/migrating-from-postgresql.html +3 -3
  174. nautobot/project-static/docs/user-guide/administration/security/index.html +1 -1
  175. nautobot/project-static/docs/user-guide/administration/security/notices.html +1 -0
  176. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +5 -35
  177. nautobot/project-static/docs/user-guide/administration/tools/nautobot-shell.html +1 -1
  178. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/tables/v2-code-location-changes.yaml +1 -1
  179. nautobot/project-static/docs/user-guide/administration/upgrading/from-v1/upgrading-from-nautobot-v1.html +12 -9
  180. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +0 -4
  181. nautobot/project-static/docs/user-guide/core-data-model/circuits/providernetwork.html +0 -3
  182. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleport.html +0 -4
  183. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleporttemplate.html +0 -4
  184. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverport.html +0 -4
  185. nautobot/project-static/docs/user-guide/core-data-model/dcim/consoleserverporttemplate.html +0 -4
  186. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebay.html +0 -4
  187. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicebaytemplate.html +0 -4
  188. nautobot/project-static/docs/user-guide/core-data-model/dcim/deviceredundancygroup.html +0 -3
  189. nautobot/project-static/docs/user-guide/core-data-model/dcim/devicetype.html +0 -4
  190. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontport.html +0 -4
  191. nautobot/project-static/docs/user-guide/core-data-model/dcim/frontporttemplate.html +0 -4
  192. nautobot/project-static/docs/user-guide/core-data-model/dcim/interface.html +1 -17
  193. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfaceredundancygroup.html +0 -3
  194. nautobot/project-static/docs/user-guide/core-data-model/dcim/interfacetemplate.html +0 -4
  195. nautobot/project-static/docs/user-guide/core-data-model/dcim/inventoryitem.html +0 -4
  196. nautobot/project-static/docs/user-guide/core-data-model/dcim/location.html +0 -3
  197. nautobot/project-static/docs/user-guide/core-data-model/dcim/locationtype.html +1 -7
  198. nautobot/project-static/docs/user-guide/core-data-model/dcim/platform.html +0 -4
  199. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlet.html +0 -4
  200. nautobot/project-static/docs/user-guide/core-data-model/dcim/poweroutlettemplate.html +0 -4
  201. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerport.html +0 -4
  202. nautobot/project-static/docs/user-guide/core-data-model/dcim/powerporttemplate.html +0 -4
  203. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearport.html +0 -4
  204. nautobot/project-static/docs/user-guide/core-data-model/dcim/rearporttemplate.html +0 -4
  205. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontext.html +0 -6
  206. nautobot/project-static/docs/user-guide/core-data-model/extras/configcontextschema.html +0 -3
  207. nautobot/project-static/docs/user-guide/core-data-model/ipam/ipaddress.html +0 -4
  208. nautobot/project-static/docs/user-guide/core-data-model/ipam/vlan.html +0 -4
  209. nautobot/project-static/docs/user-guide/core-data-model/virtualization/vminterface.html +0 -8
  210. nautobot/project-static/docs/user-guide/feature-guides/custom-fields.html +15 -15
  211. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
  212. nautobot/project-static/docs/user-guide/feature-guides/graphql.html +0 -6
  213. nautobot/project-static/docs/user-guide/platform-functionality/computedfield.html +0 -3
  214. nautobot/project-static/docs/user-guide/platform-functionality/customfield.html +3 -15
  215. nautobot/project-static/docs/user-guide/platform-functionality/dynamicgroup.html +1 -27
  216. nautobot/project-static/docs/user-guide/platform-functionality/gitrepository.html +0 -8
  217. nautobot/project-static/docs/user-guide/platform-functionality/graphql.html +3 -6
  218. nautobot/project-static/docs/user-guide/platform-functionality/jobs/index.html +0 -8
  219. nautobot/project-static/docs/user-guide/platform-functionality/jobs/job-scheduling-and-approvals.html +0 -7
  220. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobbutton.html +0 -3
  221. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobhook.html +0 -3
  222. nautobot/project-static/docs/user-guide/platform-functionality/jobs/jobqueue.html +2 -2
  223. nautobot/project-static/docs/user-guide/platform-functionality/jobs/kubernetes-job-support.html +6 -6
  224. nautobot/project-static/docs/user-guide/platform-functionality/jobs/models.html +0 -14
  225. nautobot/project-static/docs/user-guide/platform-functionality/note.html +0 -3
  226. nautobot/project-static/docs/user-guide/platform-functionality/relationship.html +1 -10
  227. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/authentication.html +0 -3
  228. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/filtering.html +0 -14
  229. nautobot/project-static/docs/user-guide/platform-functionality/rest-api/overview.html +0 -19
  230. nautobot/project-static/docs/user-guide/platform-functionality/secret.html +3 -9
  231. nautobot/project-static/docs/user-guide/platform-functionality/status.html +0 -8
  232. nautobot/project-static/docs/user-guide/platform-functionality/tag.html +0 -4
  233. nautobot/project-static/docs/user-guide/platform-functionality/template-filters.html +1 -13
  234. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +0 -5
  235. nautobot/project-static/js/dropdown.js +28 -0
  236. nautobot/project-static/js/editor.js +292 -0
  237. nautobot/project-static/monaco-editor-0.52.2/README.md +81 -0
  238. nautobot/project-static/monaco-editor-0.52.2/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  239. nautobot/project-static/monaco-editor-0.52.2/vs/base/worker/workerMain.js +31 -0
  240. nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/xml/xml.js +10 -0
  241. nautobot/project-static/monaco-editor-0.52.2/vs/basic-languages/yaml/yaml.js +10 -0
  242. nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.css +8 -0
  243. nautobot/project-static/monaco-editor-0.52.2/vs/editor/editor.main.js +798 -0
  244. nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonMode.js +19 -0
  245. nautobot/project-static/monaco-editor-0.52.2/vs/language/json/jsonWorker.js +42 -0
  246. nautobot/project-static/monaco-editor-0.52.2/vs/loader.js +11 -0
  247. nautobot/tenancy/filters/__init__.py +3 -5
  248. nautobot/tenancy/forms.py +9 -0
  249. nautobot/tenancy/templates/tenancy/tenant_create.html +21 -0
  250. nautobot/tenancy/templates/tenancy/tenant_edit.html +2 -21
  251. nautobot/tenancy/templates/tenancy/tenantgroup.html +2 -44
  252. nautobot/tenancy/templates/tenancy/tenantgroup_retrieve.html +1 -0
  253. nautobot/tenancy/tests/test_filters.py +10 -0
  254. nautobot/tenancy/tests/test_views.py +5 -1
  255. nautobot/tenancy/urls.py +7 -79
  256. nautobot/tenancy/views.py +51 -80
  257. nautobot/virtualization/views.py +0 -1
  258. nautobot/wireless/api/serializers.py +6 -1
  259. nautobot/wireless/api/views.py +3 -3
  260. nautobot/wireless/tables.py +9 -4
  261. nautobot/wireless/tests/test_api.py +5 -9
  262. {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/METADATA +9 -9
  263. {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/RECORD +267 -246
  264. {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/LICENSE.txt +0 -0
  265. {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/NOTICE +0 -0
  266. {nautobot-2.4.2.dist-info → nautobot-2.4.4.dist-info}/WHEEL +0 -0
  267. {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.models import IPAddress, Prefix, RouteTarget, VLAN, VRF
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 = django_filters.ModelMultipleChoiceFilter(
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 '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
+ {% 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 'generic/object_retrieve.html' %}
2
- {% load helpers %}
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 django.urls import path
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
- urlpatterns = [
10
- # Tenant groups
11
- path("tenant-groups/", views.TenantGroupListView.as_view(), name="tenantgroup_list"),
12
- path(
13
- "tenant-groups/add/",
14
- views.TenantGroupEditView.as_view(),
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 TenantGroupListView(generic.ObjectListView):
22
- queryset = TenantGroup.objects.all()
23
- filterset = filters.TenantGroupFilterSet
24
- filterset_form = forms.TenantGroupFilterForm
25
- table = tables.TenantGroupTable
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
- tenants = Tenant.objects.restrict(request.user, "view").filter(
34
- tenant_group__in=instance.descendants(include_self=True)
35
- )
36
-
37
- tenant_table = tables.TenantTable(tenants)
38
- tenant_table.columns.hide("tenant_group")
39
-
40
- paginate = {
41
- "paginator_class": EnhancedPaginator,
42
- "per_page": get_paginate_count(request),
43
- }
44
- RequestConfig(request, paginate).configure(tenant_table)
45
-
46
- return {"tenant_table": tenant_table, **super().get_extra_context(request, instance)}
47
-
48
-
49
- class TenantGroupEditView(generic.ObjectEditView):
50
- queryset = TenantGroup.objects.all()
51
- model_form = forms.TenantGroupForm
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 TenantListView(generic.ObjectListView):
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
- filterset = filters.TenantFilterSet
77
- filterset_form = forms.TenantFilterForm
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
@@ -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(child=ChoiceField(choices=RadioProfileChannelWidthChoices), allow_empty=True)
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:
@@ -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(NautobotModelViewSet):
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(NautobotModelViewSet):
31
+ class ControllerManagedDeviceGroupRadioProfileAssignmentViewSet(ModelViewSet):
32
32
  queryset = models.ControllerManagedDeviceGroupRadioProfileAssignment.objects.all()
33
33
  serializer_class = serializers.ControllerManagedDeviceGroupRadioProfileAssignmentSerializer
34
34
  filterset_class = filters.ControllerManagedDeviceGroupRadioProfileAssignmentFilterSet
@@ -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 RadioProfile, SupportedDataRate, WirelessNetwork
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 = ControllerManagedDeviceGroup
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 = ControllerManagedDeviceGroup
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.2
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.18,<4.3.0)
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.1.0,<3.2.0)
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 (>=24.2,<24.3)
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.0,<10.0.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 (>=31.0.0,<32.0.0)
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.2,<5.5.0)
72
- Requires-Dist: social-auth-core[saml] (>=4.5.3,<4.6.0) ; extra == "all" or extra == "sso"
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 **#nautobot** channel on [Network to Code's Slack community](https://slack.networktocode.com/)!
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