Sfoglia il codice sorgente

Merge branch 'develop' into feature

jeremystretch 3 anni fa
parent
commit
0b24d3d892

+ 1 - 1
.github/ISSUE_TEMPLATE/bug_report.yaml

@@ -14,7 +14,7 @@ body:
     attributes:
       label: NetBox version
       description: What version of NetBox are you currently running?
-      placeholder: v3.3.6
+      placeholder: v3.3.7
     validations:
       required: true
   - type: dropdown

+ 1 - 1
.github/ISSUE_TEMPLATE/feature_request.yaml

@@ -14,7 +14,7 @@ body:
     attributes:
       label: NetBox version
       description: What version of NetBox are you currently running?
-      placeholder: v3.3.6
+      placeholder: v3.3.7
     validations:
       required: true
   - type: dropdown

+ 13 - 1
docs/release-notes/version-3.3.md

@@ -1,6 +1,18 @@
 # NetBox v3.3
 
-## v3.3.7 (FUTURE)
+## v3.3.8 (FUTURE)
+
+---
+
+## v3.3.7 (2022-11-01)
+
+### Bug Fixes
+
+* [#10282](https://github.com/netbox-community/netbox/issues/10282) - Enforce advisory locks when allocating available IP addresses to prevent race conditions
+* [#10770](https://github.com/netbox-community/netbox/issues/10282) - Fix social authentication for new users
+* [#10791](https://github.com/netbox-community/netbox/issues/10791) - Permit nullifying VLAN group `scope_type` via REST API
+* [#10803](https://github.com/netbox-community/netbox/issues/10803) - Fix exception when ordering contacts by number of assignments
+* [#10809](https://github.com/netbox-community/netbox/issues/10809) - Permit nullifying site `time_zone` via REST API
 
 ---
 

+ 1 - 1
netbox/dcim/api/serializers.py

@@ -130,7 +130,7 @@ class SiteSerializer(NetBoxModelSerializer):
     region = NestedRegionSerializer(required=False, allow_null=True)
     group = NestedSiteGroupSerializer(required=False, allow_null=True)
     tenant = NestedTenantSerializer(required=False, allow_null=True)
-    time_zone = TimeZoneSerializerField(required=False)
+    time_zone = TimeZoneSerializerField(required=False, allow_null=True)
     asns = SerializedPKRelatedField(
         queryset=ASN.objects.all(),
         serializer=NestedASNSerializer,

+ 1 - 0
netbox/ipam/api/serializers.py

@@ -175,6 +175,7 @@ class VLANGroupSerializer(NetBoxModelSerializer):
         queryset=ContentType.objects.filter(
             model__in=VLANGROUP_SCOPE_TYPES
         ),
+        allow_null=True,
         required=False,
         default=None
     )

+ 12 - 0
netbox/ipam/api/views.py

@@ -112,6 +112,18 @@ class IPAddressViewSet(NetBoxModelViewSet):
     serializer_class = serializers.IPAddressSerializer
     filterset_class = filtersets.IPAddressFilterSet
 
+    @advisory_lock(ADVISORY_LOCK_KEYS['available-ips'])
+    def create(self, request, *args, **kwargs):
+        return super().create(request, *args, **kwargs)
+
+    @advisory_lock(ADVISORY_LOCK_KEYS['available-ips'])
+    def update(self, request, *args, **kwargs):
+        return super().update(request, *args, **kwargs)
+
+    @advisory_lock(ADVISORY_LOCK_KEYS['available-ips'])
+    def destroy(self, request, *args, **kwargs):
+        return super().destroy(request, *args, **kwargs)
+
 
 class FHRPGroupViewSet(NetBoxModelViewSet):
     queryset = FHRPGroup.objects.prefetch_related('ip_addresses', 'tags')

+ 1 - 1
netbox/netbox/settings.py

@@ -496,7 +496,7 @@ for param in dir(configuration):
 
 # Force usage of PostgreSQL's JSONB field for extra data
 SOCIAL_AUTH_JSONFIELD_ENABLED = True
-SOCIAL_AUTH_CLEAN_USERNAME_FUNCTION = 'netbox.users.utils.clean_username'
+SOCIAL_AUTH_CLEAN_USERNAME_FUNCTION = 'users.utils.clean_username'
 
 #
 # Django Prometheus

+ 8 - 2
netbox/tenancy/views.py

@@ -195,6 +195,8 @@ class ContactGroupView(generic.ObjectView):
 
         contacts = Contact.objects.restrict(request.user, 'view').filter(
             group=instance
+        ).annotate(
+            assignment_count=count_related(ContactAssignment, 'contact')
         )
         contacts_table = tables.ContactTable(contacts, user=request.user, exclude=('group',))
         contacts_table.configure(request)
@@ -353,14 +355,18 @@ class ContactBulkImportView(generic.BulkImportView):
 
 
 class ContactBulkEditView(generic.BulkEditView):
-    queryset = Contact.objects.all()
+    queryset = Contact.objects.annotate(
+        assignment_count=count_related(ContactAssignment, 'contact')
+    )
     filterset = filtersets.ContactFilterSet
     table = tables.ContactTable
     form = forms.ContactBulkEditForm
 
 
 class ContactBulkDeleteView(generic.BulkDeleteView):
-    queryset = Contact.objects.all()
+    queryset = Contact.objects.annotate(
+        assignment_count=count_related(ContactAssignment, 'contact')
+    )
     filterset = filtersets.ContactFilterSet
     table = tables.ContactTable
 

+ 2 - 2
requirements.txt

@@ -22,7 +22,7 @@ Markdown==3.3.7
 mkdocs-material==8.5.7
 mkdocstrings[python-legacy]==0.19.0
 netaddr==0.8.0
-Pillow==9.2.0
+Pillow==9.3.0
 psycopg2-binary==2.9.5
 PyYAML==6.0
 sentry-sdk==1.10.1
@@ -30,7 +30,7 @@ social-auth-app-django==5.0.0
 social-auth-core[openidconnect]==4.3.0
 svgwrite==1.4.3
 tablib==3.2.1
-tzdata==2022.5
+tzdata==2022.6
 
 # Workaround for #7401
 jsonschema==3.2.0