From 1c95b6715412789dc1970c198af1f56e64bdadd2 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 8 Jun 2023 18:19:32 +0800 Subject: [PATCH 1/2] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=20LoginACL=20?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=EF=BC=8C=E9=81=BF=E5=85=8D=20uniq=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/acls/migrations/0016_auto_20230606_1857.py | 8 ++++++++ apps/acls/models/login_acl.py | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/acls/migrations/0016_auto_20230606_1857.py b/apps/acls/migrations/0016_auto_20230606_1857.py index 305f0e49b..2838b5d1f 100644 --- a/apps/acls/migrations/0016_auto_20230606_1857.py +++ b/apps/acls/migrations/0016_auto_20230606_1857.py @@ -1,4 +1,5 @@ # Generated by Django 3.2.17 on 2023-06-06 10:57 +from collections import defaultdict from django.db import migrations, models @@ -7,7 +8,13 @@ import common.db.fields def migrate_users_login_acls(apps, schema_editor): login_acl_model = apps.get_model('acls', 'LoginACL') + name_used = defaultdict(int) + for login_acl in login_acl_model.objects.all(): + name = login_acl.name + if name_used[name] > 0: + login_acl.name += "_{}".format(name_used[name]) + name_used[name] += 1 login_acl.users = { "type": "ids", "ids": [str(login_acl.user_id)] } @@ -25,6 +32,7 @@ class Migration(migrations.Migration): name='users', field=common.db.fields.JSONManyToManyField(default=dict, to='users.User', verbose_name='Users'), ), + migrations.RunPython(migrate_users_login_acls), migrations.RemoveField( model_name='loginacl', name='user', diff --git a/apps/acls/models/login_acl.py b/apps/acls/models/login_acl.py index 68e6aa22a..80f5357ea 100644 --- a/apps/acls/models/login_acl.py +++ b/apps/acls/models/login_acl.py @@ -28,14 +28,14 @@ class LoginACL(UserBaseACL): from tickets import const from tickets.models import ApplyLoginTicket from orgs.models import Organization - title = _('Login confirm') + ' {}'.format(self.user) + title = _('Login confirm') + ' {}'.format(request.user) login_ip = get_request_ip(request) if request else '' login_ip = login_ip or '0.0.0.0' login_city = get_ip_city(login_ip) login_datetime = local_now_display() data = { 'title': title, - 'applicant': self.user, + 'applicant': request.user, 'apply_login_ip': login_ip, 'org_id': Organization.ROOT_ID, 'apply_login_city': login_city, From 998505e99985f696ce341da3c79e28e20b6ac66f Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 8 Jun 2023 18:33:43 +0800 Subject: [PATCH 2/2] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=20acl=20?= =?UTF-8?q?=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/acls/models/base.py | 4 ++-- apps/acls/models/login_acl.py | 4 ---- apps/authentication/mixins.py | 2 +- apps/common/db/fields.py | 6 +++++- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/acls/models/base.py b/apps/acls/models/base.py index 0fe16d7d1..05994e4d2 100644 --- a/apps/acls/models/base.py +++ b/apps/acls/models/base.py @@ -90,7 +90,7 @@ class UserBaseACL(BaseACL): queryset = cls.objects.all() q = cls.users.get_filter_q(user) queryset = queryset.filter(q) - return queryset.valid().distinct() + return queryset.filter(is_active=True).distinct() class UserAssetAccountBaseACL(UserBaseACL, OrgModelMixin): @@ -125,4 +125,4 @@ class UserAssetAccountBaseACL(UserBaseACL, OrgModelMixin): kwargs['org_id'] = org_id if kwargs: queryset = queryset.filter(**kwargs) - return queryset.valid().distinct().order_by('priority', 'date_created') + return queryset.filter(is_active=True).distinct().order_by('priority', 'date_created') diff --git a/apps/acls/models/login_acl.py b/apps/acls/models/login_acl.py index 80f5357ea..ce678e236 100644 --- a/apps/acls/models/login_acl.py +++ b/apps/acls/models/login_acl.py @@ -20,10 +20,6 @@ class LoginACL(UserBaseACL): def is_action(self, action): return self.action == action - @classmethod - def filter_acl(cls, user): - return user.login_acls.all().valid().distinct() - def create_confirm_ticket(self, request): from tickets import const from tickets.models import ApplyLoginTicket diff --git a/apps/authentication/mixins.py b/apps/authentication/mixins.py index c1fb2720d..d3d84f560 100644 --- a/apps/authentication/mixins.py +++ b/apps/authentication/mixins.py @@ -369,7 +369,7 @@ class AuthACLMixin: logger.debug('Login confirm acl id: {}'.format(acl_id)) if not acl_id: return - acl = LoginACL.filter_acl(user).filter(id=acl_id).first() + acl = LoginACL.get_user_acls(user).filter(id=acl_id).first() if not acl: return if not acl.is_action(acl.ActionChoices.review): diff --git a/apps/common/db/fields.py b/apps/common/db/fields.py index bc0795eab..adc3a3b89 100644 --- a/apps/common/db/fields.py +++ b/apps/common/db/fields.py @@ -10,7 +10,7 @@ from django.apps import apps from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models -from django.db.models import Q, Manager +from django.db.models import Q, Manager, QuerySet from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from rest_framework.utils.encoders import JSONEncoder @@ -486,6 +486,10 @@ class JSONManyToManyDescriptor: elif rule['match'] == 'm2m': if isinstance(value, Manager): value = value.values_list('id', flat=True) + elif isinstance(value, QuerySet): + value = value.values_list('id', flat=True) + elif isinstance(value, models.Model): + value = [value.id] value = set(map(str, value)) rule_value = set(map(str, rule_value)) res &= rule_value.issubset(value)