diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index ae562fda6..3e3d2ec3a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.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 diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index bef1ce587..5f0a17aa7 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.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 diff --git a/docs/release-notes/version-3.3.md b/docs/release-notes/version-3.3.md index 6af0586b4..a693ec1e0 100644 --- a/docs/release-notes/version-3.3.md +++ b/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 --- diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 1cf9369ae..19de84791 100644 --- a/netbox/dcim/api/serializers.py +++ b/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, diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 8a8fc03d6..e04849c13 100644 --- a/netbox/ipam/api/serializers.py +++ b/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 ) diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 9db3d7953..9ea38758d 100644 --- a/netbox/ipam/api/views.py +++ b/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') diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index e1fe10a69..2898fbd75 100644 --- a/netbox/netbox/settings.py +++ b/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 diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 1ebbda208..d95568a22 100644 --- a/netbox/tenancy/views.py +++ b/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 diff --git a/requirements.txt b/requirements.txt index f7c57588b..8d748cb82 100644 --- a/requirements.txt +++ b/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