perf: optimize password change log filtering by organization

This commit is contained in:
feng
2026-07-08 17:48:15 +08:00
committed by Jiangjie Bai
parent b12cc919f8
commit bb4e2f5c28

View File

@@ -6,7 +6,8 @@ from importlib import import_module
from django.conf import settings
from django.core.cache import caches
from django.db import models
from django.db.models import Q
from django.db.models import Q, CharField, F, Value
from django.db.models.functions import Cast, Coalesce, Concat
from django.utils import timezone
from django.utils.translation import gettext, gettext_lazy as _
@@ -181,6 +182,16 @@ class ActivityLog(OrgModelMixin):
return super(ActivityLog, self).save(*args, **kwargs)
def user_display_expression():
return Concat(
Coalesce(Cast(F('name'), CharField()), Value('None')),
Value('('),
Coalesce(Cast(F('username'), CharField()), Value('None')),
Value(')'),
output_field=CharField(),
)
class PasswordChangeLog(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)
user = models.CharField(max_length=128, verbose_name=_("User"))
@@ -199,7 +210,11 @@ class PasswordChangeLog(models.Model):
@staticmethod
def filter_queryset_by_org(queryset):
if not current_org.is_root():
users = current_org.get_members()
users = (
current_org.get_members()
.annotate(user_display=user_display_expression())
.values_list('user_display', flat=True)
)
queryset = queryset.filter(
user__in=[str(user) for user in users]
)