Просмотр исходного кода

Fixes #22539: Restore available IP display for users with constrained permissions

Amir Bakar 1 день назад
Родитель
Сommit
34c21d3d69
1 измененных файлов с 8 добавлено и 2 удалено
  1. 8 2
      netbox/ipam/views.py

+ 8 - 2
netbox/ipam/views.py

@@ -1,4 +1,5 @@
 from django.contrib.contenttypes.models import ContentType
+from django.core.exceptions import EmptyResultSet
 from django.db.models import Prefetch
 from django.db.models.expressions import RawSQL
 from django.shortcuts import get_object_or_404, redirect, render
@@ -556,8 +557,13 @@ class ChildAvailabilityMixin:
 
     @staticmethod
     def _where_signature(queryset):
-        # query.where is Django-internal, but it is the closest signal for "narrowed by a filter".
-        return str(queryset.query.where)
+        # Compare compiled SQL rather than str(query.where): the WHERE tree embeds default
+        # object reprs (memory addresses) for permission-constraint subqueries, so two
+        # otherwise identical querysets built via restrict() never match (#22539).
+        try:
+            return queryset.query.get_compiler(using=queryset.db).as_sql()
+        except EmptyResultSet:
+            return None
 
     def _set_children_filtered(self, is_filtered):
         self._child_queryset_is_filtered = is_filtered