From 86dea9862a1c68b752a0b43b34ff3dea6aaff9c0 Mon Sep 17 00:00:00 2001 From: Dodothereal <129273127+Dodothereal@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:17:51 +0200 Subject: [PATCH 1/2] Avoid wide distinct scans for visible captures Assisted-by: Claude Code Co-Authored-By: Claude --- ami/base/models.py | 6 ++++-- ami/main/tests.py | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ami/base/models.py b/ami/base/models.py index 2f245b745..18c94f1dd 100644 --- a/ami/base/models.py +++ b/ami/base/models.py @@ -66,7 +66,8 @@ def visible_for_user(self, user: User | AnonymousUser) -> QuerySet: if not is_anonymous: filter_condition |= Q(owner=user) | Q(members=user) - return self.filter(filter_condition).distinct() + visible_project_ids = self.filter(filter_condition).order_by().values_list("pk", flat=True) + return self.filter(pk__in=visible_project_ids) # For models related to Project project_accessor = model.get_project_accessor() @@ -85,7 +86,8 @@ def visible_for_user(self, user: User | AnonymousUser) -> QuerySet: if not is_anonymous: filter_condition |= Q(**{f"{project_field}owner": user}) | Q(**{f"{project_field}members": user}) - return self.filter(filter_condition).distinct() + visible_object_ids = self.filter(filter_condition).order_by().values_list("pk", flat=True) + return self.filter(pk__in=visible_object_ids) class BaseModel(models.Model): diff --git a/ami/main/tests.py b/ami/main/tests.py index c9e3b0d8f..3044e9986 100644 --- a/ami/main/tests.py +++ b/ami/main/tests.py @@ -3232,6 +3232,12 @@ def test_deployment_list_draft_project(self): ids = [d["id"] for d in response.data["results"]] assert self.deployment.pk not in ids + def test_visible_for_user_deduplicates_captures_in_a_primary_key_subquery(self): + queryset = SourceImage.objects.visible_for_user(self.member) + + self.assertIn(self.deployment.captures.first(), queryset) + self.assertNotIn("SELECT DISTINCT", str(queryset.query)) + def test_visible_for_user_across_all_models(self): all_users = { "superuser": self.superuser, From 50a4909819d2406972c26a1b0eb17d1828cd7e9b Mon Sep 17 00:00:00 2001 From: Dodothereal <129273127+Dodothereal@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:39:31 +0200 Subject: [PATCH 2/2] Cover duplicate visibility joins Assisted-by: Claude Code Co-Authored-By: Claude --- ami/base/models.py | 3 +++ ami/main/tests.py | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ami/base/models.py b/ami/base/models.py index 18c94f1dd..f08cd334e 100644 --- a/ami/base/models.py +++ b/ami/base/models.py @@ -66,6 +66,9 @@ def visible_for_user(self, user: User | AnonymousUser) -> QuerySet: if not is_anonymous: filter_condition |= Q(owner=user) | Q(members=user) + if is_anonymous: + return self.filter(filter_condition) + visible_project_ids = self.filter(filter_condition).order_by().values_list("pk", flat=True) return self.filter(pk__in=visible_project_ids) diff --git a/ami/main/tests.py b/ami/main/tests.py index 3044e9986..90704db0b 100644 --- a/ami/main/tests.py +++ b/ami/main/tests.py @@ -3233,9 +3233,12 @@ def test_deployment_list_draft_project(self): assert self.deployment.pk not in ids def test_visible_for_user_deduplicates_captures_in_a_primary_key_subquery(self): - queryset = SourceImage.objects.visible_for_user(self.member) + self.project.members.add(self.outsider) + queryset = SourceImage.objects.visible_for_user(self.owner) self.assertIn(self.deployment.captures.first(), queryset) + capture_ids = list(queryset.values_list("pk", flat=True)) + self.assertEqual(len(capture_ids), len(set(capture_ids))) self.assertNotIn("SELECT DISTINCT", str(queryset.query)) def test_visible_for_user_across_all_models(self):