mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-07-11 09:25:03 +00:00
perf: optimize password change log filtering by organization
This commit is contained in:
@@ -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]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user