nautobot 2.4.4__py3-none-any.whl → 2.4.6__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 (139) hide show
  1. nautobot/__init__.py +19 -3
  2. nautobot/core/api/mixins.py +10 -0
  3. nautobot/core/celery/__init__.py +5 -3
  4. nautobot/core/celery/encoders.py +2 -2
  5. nautobot/core/forms/fields.py +21 -5
  6. nautobot/core/forms/utils.py +1 -0
  7. nautobot/core/jobs/__init__.py +3 -2
  8. nautobot/core/jobs/bulk_actions.py +1 -1
  9. nautobot/core/management/commands/generate_test_data.py +1 -1
  10. nautobot/core/models/name_color_content_types.py +9 -0
  11. nautobot/core/models/validators.py +7 -0
  12. nautobot/core/settings.py +0 -14
  13. nautobot/core/settings.yaml +0 -28
  14. nautobot/core/tables.py +6 -1
  15. nautobot/core/templates/generic/object_retrieve.html +1 -1
  16. nautobot/core/testing/__init__.py +2 -0
  17. nautobot/core/testing/api.py +18 -0
  18. nautobot/core/testing/mixins.py +9 -0
  19. nautobot/core/tests/nautobot_config.py +0 -2
  20. nautobot/core/tests/runner.py +17 -140
  21. nautobot/core/tests/test_api.py +4 -4
  22. nautobot/core/tests/test_authentication.py +83 -4
  23. nautobot/core/tests/test_forms.py +11 -8
  24. nautobot/core/tests/test_graphql.py +9 -0
  25. nautobot/core/tests/test_jobs.py +33 -27
  26. nautobot/core/ui/object_detail.py +31 -0
  27. nautobot/dcim/factory.py +2 -0
  28. nautobot/dcim/filters/__init__.py +5 -0
  29. nautobot/dcim/forms.py +17 -1
  30. nautobot/dcim/migrations/0068_alter_softwareimagefile_download_url.py +19 -0
  31. nautobot/dcim/migrations/0069_softwareimagefile_external_integration.py +25 -0
  32. nautobot/dcim/models/devices.py +9 -2
  33. nautobot/dcim/tables/devices.py +1 -0
  34. nautobot/dcim/templates/dcim/softwareimagefile_retrieve.html +4 -0
  35. nautobot/dcim/tests/test_api.py +74 -31
  36. nautobot/dcim/tests/test_filters.py +2 -0
  37. nautobot/dcim/tests/test_jobs.py +4 -6
  38. nautobot/dcim/tests/test_models.py +65 -0
  39. nautobot/dcim/tests/test_views.py +3 -0
  40. nautobot/extras/choices.py +8 -3
  41. nautobot/extras/forms/forms.py +7 -3
  42. nautobot/extras/jobs.py +181 -103
  43. nautobot/extras/management/utils.py +13 -2
  44. nautobot/extras/models/datasources.py +4 -1
  45. nautobot/extras/models/jobs.py +20 -17
  46. nautobot/extras/plugins/marketplace_manifest.yml +18 -0
  47. nautobot/extras/tables.py +29 -34
  48. nautobot/extras/templates/extras/inc/panel_changelog.html +1 -1
  49. nautobot/extras/templates/extras/inc/panel_jobhistory.html +1 -1
  50. nautobot/extras/templates/extras/status.html +1 -37
  51. nautobot/extras/test_jobs/atomic_transaction.py +6 -6
  52. nautobot/extras/test_jobs/fail.py +75 -1
  53. nautobot/extras/tests/integration/test_notes.py +1 -1
  54. nautobot/extras/tests/test_api.py +23 -8
  55. nautobot/extras/tests/test_changelog.py +4 -4
  56. nautobot/extras/tests/test_customfields.py +3 -0
  57. nautobot/extras/tests/test_datasources.py +64 -54
  58. nautobot/extras/tests/test_jobs.py +69 -62
  59. nautobot/extras/tests/test_models.py +1 -1
  60. nautobot/extras/tests/test_plugins.py +19 -13
  61. nautobot/extras/tests/test_relationships.py +14 -5
  62. nautobot/extras/tests/test_tags.py +2 -2
  63. nautobot/extras/tests/test_views.py +15 -6
  64. nautobot/extras/urls.py +1 -30
  65. nautobot/extras/views.py +17 -55
  66. nautobot/ipam/forms.py +15 -0
  67. nautobot/ipam/querysets.py +6 -0
  68. nautobot/ipam/tables.py +6 -2
  69. nautobot/ipam/templates/ipam/namespace_retrieve.html +0 -41
  70. nautobot/ipam/templates/ipam/rir.html +1 -43
  71. nautobot/ipam/templates/ipam/service.html +2 -46
  72. nautobot/ipam/templates/ipam/service_edit.html +1 -17
  73. nautobot/ipam/templates/ipam/service_retrieve.html +7 -0
  74. nautobot/ipam/tests/migration/__init__.py +0 -0
  75. nautobot/ipam/tests/migration/test_migrations.py +510 -0
  76. nautobot/ipam/tests/test_api.py +66 -36
  77. nautobot/ipam/tests/test_filters.py +0 -10
  78. nautobot/ipam/tests/test_models.py +16 -0
  79. nautobot/ipam/tests/test_views.py +44 -2
  80. nautobot/ipam/urls.py +2 -67
  81. nautobot/ipam/utils/migrations.py +185 -152
  82. nautobot/ipam/utils/testing.py +177 -0
  83. nautobot/ipam/views.py +119 -198
  84. nautobot/project-static/docs/code-reference/nautobot/apps/jobs.html +43 -5
  85. nautobot/project-static/docs/code-reference/nautobot/apps/models.html +47 -0
  86. nautobot/project-static/docs/code-reference/nautobot/apps/tables.html +18 -0
  87. nautobot/project-static/docs/code-reference/nautobot/apps/testing.html +35 -0
  88. nautobot/project-static/docs/code-reference/nautobot/apps/ui.html +63 -0
  89. nautobot/project-static/docs/development/apps/api/testing.html +0 -87
  90. nautobot/project-static/docs/development/apps/migration/dependency-updates.html +1 -1
  91. nautobot/project-static/docs/development/core/best-practices.html +3 -3
  92. nautobot/project-static/docs/development/core/getting-started.html +78 -107
  93. nautobot/project-static/docs/development/core/release-checklist.html +1 -1
  94. nautobot/project-static/docs/development/core/style-guide.html +1 -1
  95. nautobot/project-static/docs/development/core/testing.html +24 -198
  96. nautobot/project-static/docs/development/jobs/index.html +27 -14
  97. nautobot/project-static/docs/media/user-guide/administration/getting-started/nautobot-cloud.png +0 -0
  98. nautobot/project-static/docs/objects.inv +0 -0
  99. nautobot/project-static/docs/overview/application_stack.html +1 -1
  100. nautobot/project-static/docs/release-notes/version-2.4.html +409 -1
  101. nautobot/project-static/docs/requirements.txt +1 -1
  102. nautobot/project-static/docs/search/search_index.json +1 -1
  103. nautobot/project-static/docs/sitemap.xml +290 -290
  104. nautobot/project-static/docs/sitemap.xml.gz +0 -0
  105. nautobot/project-static/docs/user-guide/administration/configuration/settings.html +2 -48
  106. nautobot/project-static/docs/user-guide/administration/guides/permissions.html +71 -0
  107. nautobot/project-static/docs/user-guide/administration/installation/http-server.html +3 -1
  108. nautobot/project-static/docs/user-guide/administration/installation/index.html +257 -16
  109. nautobot/project-static/docs/user-guide/administration/tools/nautobot-server.html +1 -1
  110. nautobot/project-static/docs/user-guide/administration/upgrading/upgrading.html +2 -2
  111. nautobot/project-static/docs/user-guide/core-data-model/dcim/softwareimagefile.html +4 -0
  112. nautobot/project-static/docs/user-guide/feature-guides/contacts-and-teams.html +11 -11
  113. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-devices.html +8 -8
  114. nautobot/project-static/docs/user-guide/feature-guides/getting-started/creating-location-types-and-locations.html +1 -0
  115. nautobot/project-static/docs/user-guide/feature-guides/getting-started/interfaces.html +40 -25
  116. nautobot/project-static/docs/user-guide/feature-guides/getting-started/ipam.html +4 -4
  117. nautobot/project-static/docs/user-guide/feature-guides/getting-started/platforms.html +1 -1
  118. nautobot/project-static/docs/user-guide/feature-guides/getting-started/search-bar.html +77 -5
  119. nautobot/project-static/docs/user-guide/feature-guides/getting-started/tenants.html +1 -1
  120. nautobot/project-static/docs/user-guide/feature-guides/getting-started/vlans-and-vlan-groups.html +0 -1
  121. nautobot/project-static/docs/user-guide/feature-guides/git-data-source.html +1 -1
  122. nautobot/project-static/docs/user-guide/index.html +89 -2
  123. nautobot/project-static/docs/user-guide/platform-functionality/webhook.html +207 -122
  124. nautobot/virtualization/forms.py +20 -0
  125. nautobot/virtualization/templates/virtualization/clustergroup.html +1 -39
  126. nautobot/virtualization/templates/virtualization/clustertype.html +1 -0
  127. nautobot/virtualization/tests/test_api.py +14 -3
  128. nautobot/virtualization/tests/test_views.py +10 -2
  129. nautobot/virtualization/urls.py +10 -93
  130. nautobot/virtualization/views.py +33 -72
  131. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/METADATA +8 -7
  132. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/RECORD +137 -132
  133. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/WHEEL +1 -1
  134. nautobot/core/tests/performance_baselines.yml +0 -8900
  135. nautobot/ipam/tests/test_migrations.py +0 -462
  136. /nautobot/ipam/templates/ipam/{namespace_ipaddresses.html → namespace_ip_addresses.html} +0 -0
  137. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/LICENSE.txt +0 -0
  138. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/NOTICE +0 -0
  139. {nautobot-2.4.4.dist-info → nautobot-2.4.6.dist-info}/entry_points.txt +0 -0
@@ -18,7 +18,7 @@ from nautobot.virtualization.models import (
18
18
  )
19
19
 
20
20
 
21
- class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
21
+ class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase, ViewTestCases.BulkEditObjectsViewTestCase):
22
22
  model = ClusterGroup
23
23
 
24
24
  @classmethod
@@ -30,8 +30,12 @@ class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
30
30
  "description": "A new cluster group",
31
31
  }
32
32
 
33
+ cls.bulk_edit_data = {
34
+ "description": "New description",
35
+ }
36
+
33
37
 
34
- class ClusterTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
38
+ class ClusterTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase, ViewTestCases.BulkEditObjectsViewTestCase):
35
39
  model = ClusterType
36
40
 
37
41
  @classmethod
@@ -48,6 +52,10 @@ class ClusterTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
48
52
  "description": "A new cluster type",
49
53
  }
50
54
 
55
+ cls.bulk_edit_data = {
56
+ "description": "New description",
57
+ }
58
+
51
59
 
52
60
  class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase):
53
61
  model = Cluster
@@ -1,105 +1,20 @@
1
1
  from django.urls import path
2
2
 
3
+ from nautobot.core.views.routers import NautobotUIViewSetRouter
3
4
  from nautobot.extras.views import ObjectChangeLogView, ObjectDynamicGroupsView, ObjectNotesView
4
5
  from nautobot.ipam.views import ServiceEditView
5
6
 
6
7
  from . import views
7
- from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
8
+ from .models import Cluster, VirtualMachine, VMInterface
8
9
 
9
10
  app_name = "virtualization"
11
+
12
+ router = NautobotUIViewSetRouter()
13
+ router.register("cluster-groups", views.ClusterGroupUIViewSet)
14
+ router.register("cluster-types", views.ClusterTypeUIViewSet)
15
+
16
+
10
17
  urlpatterns = [
11
- # Cluster types
12
- path("cluster-types/", views.ClusterTypeListView.as_view(), name="clustertype_list"),
13
- path(
14
- "cluster-types/add/",
15
- views.ClusterTypeEditView.as_view(),
16
- name="clustertype_add",
17
- ),
18
- path(
19
- "cluster-types/import/",
20
- views.ClusterTypeBulkImportView.as_view(), # 3.0 TODO: remove, unused
21
- name="clustertype_import",
22
- ),
23
- path(
24
- "cluster-types/delete/",
25
- views.ClusterTypeBulkDeleteView.as_view(),
26
- name="clustertype_bulk_delete",
27
- ),
28
- path(
29
- "cluster-types/<uuid:pk>/",
30
- views.ClusterTypeView.as_view(),
31
- name="clustertype",
32
- ),
33
- path(
34
- "cluster-types/<uuid:pk>/edit/",
35
- views.ClusterTypeEditView.as_view(),
36
- name="clustertype_edit",
37
- ),
38
- path(
39
- "cluster-types/<uuid:pk>/delete/",
40
- views.ClusterTypeDeleteView.as_view(),
41
- name="clustertype_delete",
42
- ),
43
- path(
44
- "cluster-types/<uuid:pk>/changelog/",
45
- ObjectChangeLogView.as_view(),
46
- name="clustertype_changelog",
47
- kwargs={"model": ClusterType},
48
- ),
49
- path(
50
- "cluster-types/<uuid:pk>/notes/",
51
- ObjectNotesView.as_view(),
52
- name="clustertype_notes",
53
- kwargs={"model": ClusterType},
54
- ),
55
- # Cluster groups
56
- path(
57
- "cluster-groups/",
58
- views.ClusterGroupListView.as_view(),
59
- name="clustergroup_list",
60
- ),
61
- path(
62
- "cluster-groups/add/",
63
- views.ClusterGroupEditView.as_view(),
64
- name="clustergroup_add",
65
- ),
66
- path(
67
- "cluster-groups/import/",
68
- views.ClusterGroupBulkImportView.as_view(), # 3.0 TODO: remove, unused
69
- name="clustergroup_import",
70
- ),
71
- path(
72
- "cluster-groups/delete/",
73
- views.ClusterGroupBulkDeleteView.as_view(),
74
- name="clustergroup_bulk_delete",
75
- ),
76
- path(
77
- "cluster-groups/<uuid:pk>/",
78
- views.ClusterGroupView.as_view(),
79
- name="clustergroup",
80
- ),
81
- path(
82
- "cluster-groups/<uuid:pk>/edit/",
83
- views.ClusterGroupEditView.as_view(),
84
- name="clustergroup_edit",
85
- ),
86
- path(
87
- "cluster-groups/<uuid:pk>/delete/",
88
- views.ClusterGroupDeleteView.as_view(),
89
- name="clustergroup_delete",
90
- ),
91
- path(
92
- "cluster-groups/<uuid:pk>/changelog/",
93
- ObjectChangeLogView.as_view(),
94
- name="clustergroup_changelog",
95
- kwargs={"model": ClusterGroup},
96
- ),
97
- path(
98
- "cluster-groups/<uuid:pk>/notes/",
99
- ObjectNotesView.as_view(),
100
- name="clustergroup_notes",
101
- kwargs={"model": ClusterGroup},
102
- ),
103
18
  # Clusters
104
19
  path("clusters/", views.ClusterListView.as_view(), name="cluster_list"),
105
20
  path("clusters/add/", views.ClusterEditView.as_view(), name="cluster_add"),
@@ -266,3 +181,5 @@ urlpatterns = [
266
181
  name="virtualmachine_bulk_add_vminterface",
267
182
  ),
268
183
  ]
184
+
185
+ urlpatterns += router.urls
@@ -4,18 +4,18 @@ from django.db.models import Prefetch
4
4
  from django.shortcuts import get_object_or_404, redirect, render
5
5
  from django.urls import reverse
6
6
  from django.utils.functional import cached_property
7
- from django_tables2 import RequestConfig
8
7
 
9
8
  from nautobot.core.ui import object_detail
10
9
  from nautobot.core.ui.choices import SectionChoices
11
10
  from nautobot.core.utils.requests import normalize_querydict
12
11
  from nautobot.core.views import generic
13
- from nautobot.core.views.paginator import EnhancedPaginator, get_paginate_count
12
+ from nautobot.core.views.viewsets import NautobotUIViewSet
14
13
  from nautobot.dcim.models import Device
15
14
  from nautobot.dcim.tables import DeviceTable
16
15
  from nautobot.extras.views import ObjectConfigContextView
17
16
  from nautobot.ipam.models import IPAddress, Service
18
17
  from nautobot.ipam.tables import InterfaceIPAddressTable, InterfaceVLANTable, VRFDeviceAssignmentTable
18
+ from nautobot.virtualization.api import serializers
19
19
 
20
20
  from . import filters, forms, tables
21
21
  from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
@@ -25,15 +25,15 @@ from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterf
25
25
  #
26
26
 
27
27
 
28
- class ClusterTypeListView(generic.ObjectListView):
28
+ class ClusterTypeUIViewSet(NautobotUIViewSet):
29
+ bulk_update_form_class = forms.ClusterTypeBulkEditForm
30
+ filterset_class = filters.ClusterTypeFilterSet
31
+ filterset_form_class = forms.ClusterTypeFilterForm
32
+ form_class = forms.ClusterTypeForm
33
+ serializer_class = serializers.ClusterTypeSerializer
34
+ table_class = tables.ClusterTypeTable
29
35
  queryset = ClusterType.objects.all()
30
- filterset = filters.ClusterTypeFilterSet
31
- filterset_form = forms.ClusterTypeFilterForm
32
- table = tables.ClusterTypeTable
33
36
 
34
-
35
- class ClusterTypeView(generic.ObjectView):
36
- queryset = ClusterType.objects.all()
37
37
  object_detail_content = object_detail.ObjectDetailContent(
38
38
  panels=(
39
39
  object_detail.ObjectFieldsPanel(
@@ -48,79 +48,40 @@ class ClusterTypeView(generic.ObjectView):
48
48
  table_filter="cluster_type",
49
49
  exclude_columns=["cluster_type"],
50
50
  ),
51
- ),
51
+ )
52
52
  )
53
53
 
54
54
 
55
- class ClusterTypeEditView(generic.ObjectEditView):
56
- queryset = ClusterType.objects.all()
57
- model_form = forms.ClusterTypeForm
58
-
59
-
60
- class ClusterTypeDeleteView(generic.ObjectDeleteView):
61
- queryset = ClusterType.objects.all()
62
-
63
-
64
- class ClusterTypeBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
65
- queryset = ClusterType.objects.all()
66
- table = tables.ClusterTypeTable
67
-
68
-
69
- class ClusterTypeBulkDeleteView(generic.BulkDeleteView):
70
- queryset = ClusterType.objects.all()
71
- table = tables.ClusterTypeTable
72
- filterset = filters.ClusterTypeFilterSet
73
-
74
-
75
55
  #
76
56
  # Cluster groups
77
57
  #
78
58
 
79
59
 
80
- class ClusterGroupListView(generic.ObjectListView):
81
- queryset = ClusterGroup.objects.all()
82
- filterset = filters.ClusterGroupFilterSet
83
- filterset_form = forms.ClusterGroupFilterForm
84
- table = tables.ClusterGroupTable
85
-
86
-
87
- class ClusterGroupView(generic.ObjectView):
60
+ class ClusterGroupUIViewSet(NautobotUIViewSet):
61
+ bulk_update_form_class = forms.ClusterGroupBulkEditForm
62
+ filterset_class = filters.ClusterGroupFilterSet
63
+ filterset_form_class = forms.ClusterGroupFilterForm
64
+ form_class = forms.ClusterGroupForm
65
+ serializer_class = serializers.ClusterGroupSerializer
66
+ table_class = tables.ClusterGroupTable
88
67
  queryset = ClusterGroup.objects.all()
89
68
 
90
- def get_extra_context(self, request, instance):
91
- # Clusters
92
- clusters = Cluster.objects.restrict(request.user, "view").filter(cluster_group=instance)
93
-
94
- cluster_table = tables.ClusterTable(clusters)
95
- cluster_table.columns.hide("cluster_group")
96
-
97
- paginate = {
98
- "paginator_class": EnhancedPaginator,
99
- "per_page": get_paginate_count(request),
100
- }
101
- RequestConfig(request, paginate).configure(cluster_table)
102
-
103
- return {"cluster_table": cluster_table, **super().get_extra_context(request, instance)}
104
-
105
-
106
- class ClusterGroupEditView(generic.ObjectEditView):
107
- queryset = ClusterGroup.objects.all()
108
- model_form = forms.ClusterGroupForm
109
-
110
-
111
- class ClusterGroupDeleteView(generic.ObjectDeleteView):
112
- queryset = ClusterGroup.objects.all()
113
-
114
-
115
- class ClusterGroupBulkImportView(generic.BulkImportView): # 3.0 TODO: remove, unused
116
- queryset = ClusterGroup.objects.all()
117
- table = tables.ClusterGroupTable
118
-
119
-
120
- class ClusterGroupBulkDeleteView(generic.BulkDeleteView):
121
- queryset = ClusterGroup.objects.all()
122
- table = tables.ClusterGroupTable
123
- filterset = filters.ClusterGroupFilterSet
69
+ object_detail_content = object_detail.ObjectDetailContent(
70
+ panels=(
71
+ object_detail.ObjectFieldsPanel(
72
+ weight=100,
73
+ section=SectionChoices.LEFT_HALF,
74
+ fields="__all__",
75
+ ),
76
+ object_detail.ObjectsTablePanel(
77
+ weight=100,
78
+ section=SectionChoices.RIGHT_HALF,
79
+ table_class=tables.ClusterTable,
80
+ table_filter="cluster_group",
81
+ exclude_columns=["cluster_group"],
82
+ ),
83
+ )
84
+ )
124
85
 
125
86
 
126
87
  #
@@ -1,34 +1,35 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nautobot
3
- Version: 2.4.4
3
+ Version: 2.4.6
4
4
  Summary: Source of truth and network automation platform.
5
5
  Home-page: https://nautobot.com
6
6
  License: Apache-2.0
7
7
  Keywords: Nautobot
8
8
  Author: Network to Code
9
9
  Author-email: opensource@networktocode.com
10
- Requires-Python: >=3.9,<3.13
10
+ Requires-Python: >=3.9.2,<3.13
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: Apache Software License
14
14
  Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.9
16
15
  Classifier: Programming Language :: Python :: 3.10
17
16
  Classifier: Programming Language :: Python :: 3.11
18
17
  Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.9
19
19
  Provides-Extra: all
20
20
  Provides-Extra: ldap
21
21
  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.19,<4.3.0)
25
+ Requires-Dist: Django (>=4.2.20,<4.3.0)
26
26
  Requires-Dist: GitPython (>=3.1.44,<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.6,<3.7)
29
29
  Requires-Dist: Pillow (>=11.0.0,<11.1.0)
30
30
  Requires-Dist: PyYAML (>=6.0.2,<6.1.0)
31
31
  Requires-Dist: celery (>=5.3.6,<5.4.0)
32
+ Requires-Dist: cryptography (>=44.0.2,<44.1.0)
32
33
  Requires-Dist: django-ajax-tables (>=1.1.1,<1.2.0)
33
34
  Requires-Dist: django-auth-ldap (>=5.1.0,<5.2.0) ; extra == "all" or extra == "ldap"
34
35
  Requires-Dist: django-celery-beat (>=2.6.0,<2.7.0)
@@ -57,12 +58,12 @@ Requires-Dist: graphene-django (>=2.16.0,<2.17.0)
57
58
  Requires-Dist: graphene-django-optimizer (>=0.8.0,<0.9.0)
58
59
  Requires-Dist: jsonschema (>=4.7.0,<5.0.0)
59
60
  Requires-Dist: kombu (>=5.4.2,<5.5.0)
60
- Requires-Dist: kubernetes (>=32.0.0,<33.0.0)
61
+ Requires-Dist: kubernetes (>=32.0.1,<33.0.0)
61
62
  Requires-Dist: mysqlclient (>=2.2.7,<2.3.0) ; extra == "all" or extra == "mysql"
62
63
  Requires-Dist: napalm (>=4.1.0,<6.0.0) ; extra == "all" or extra == "napalm"
63
64
  Requires-Dist: netaddr (>=1.3.0,<1.4.0)
64
65
  Requires-Dist: netutils (>=1.6.0,<2.0.0)
65
- Requires-Dist: nh3 (>=0.2.20,<0.3.0)
66
+ Requires-Dist: nh3 (>=0.2.21,<0.3.0)
66
67
  Requires-Dist: packaging (>=23.1)
67
68
  Requires-Dist: prometheus-client (>=0.20.0,<0.21.0)
68
69
  Requires-Dist: psycopg2-binary (>=2.9.10,<2.10.0)