perf: 优化 acl 默认排序和manager

pull/10681/head
ibuler 2023-06-12 13:59:54 +08:00 committed by Jiangjie.Bai
parent fc90ced2b0
commit dc35a8c52b
6 changed files with 38 additions and 25 deletions

View File

@ -43,7 +43,7 @@ class LoginAssetCheckAPI(CreateAPIView):
queryset = queryset.filter(accounts__contains=account_username) queryset = queryset.filter(accounts__contains=account_username)
with tmp_to_org(self.serializer.asset.org): with tmp_to_org(self.serializer.asset.org):
acl = queryset.order_by('priority').valid().first() acl = queryset.valid().first()
if acl: if acl:
need_review = True need_review = True

View File

@ -1,14 +1,14 @@
# Generated by Django 3.1 on 2021-03-11 09:53 # Generated by Django 3.1 on 2021-03-11 09:53
from django.conf import settings
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
import uuid import uuid
import django.core.validators
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -24,37 +24,51 @@ class Migration(migrations.Migration):
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('name', models.CharField(max_length=128, verbose_name='Name')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('priority', models.IntegerField(default=50, help_text='1-100, the lower the value will be match first', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)], verbose_name='Priority')), ('priority', models.IntegerField(default=50, help_text='1-100, the lower the value will be match first',
validators=[django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(100)],
verbose_name='Priority')),
('is_active', models.BooleanField(default=True, verbose_name='Active')), ('is_active', models.BooleanField(default=True, verbose_name='Active')),
('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
('ip_group', models.JSONField(default=list, verbose_name='Login IP')), ('ip_group', models.JSONField(default=list, verbose_name='Login IP')),
('action', models.CharField(choices=[('reject', 'Reject'), ('allow', 'Allow')], default='reject', max_length=64, verbose_name='Action')), ('action',
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='login_acls', to=settings.AUTH_USER_MODEL, verbose_name='User')), models.CharField(choices=[('reject', 'Reject'), ('allow', 'Allow')], default='reject', max_length=64,
verbose_name='Action')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='login_acls',
to=settings.AUTH_USER_MODEL, verbose_name='User')),
], ],
options={ options={
'ordering': ('priority', '-date_updated', 'name'), 'ordering': ('priority', 'name'),
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='LoginAssetACL', name='LoginAssetACL',
fields=[ fields=[
('org_id', models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')), ('org_id',
models.CharField(blank=True, db_index=True, default='', max_length=36, verbose_name='Organization')),
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)), ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')), ('created_by', models.CharField(blank=True, max_length=32, null=True, verbose_name='Created by')),
('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')), ('date_created', models.DateTimeField(auto_now_add=True, null=True, verbose_name='Date created')),
('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')), ('date_updated', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('name', models.CharField(max_length=128, verbose_name='Name')), ('name', models.CharField(max_length=128, verbose_name='Name')),
('priority', models.IntegerField(default=50, help_text='1-100, the lower the value will be match first', validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(100)], verbose_name='Priority')), ('priority', models.IntegerField(default=50, help_text='1-100, the lower the value will be match first',
validators=[django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(100)],
verbose_name='Priority')),
('is_active', models.BooleanField(default=True, verbose_name='Active')), ('is_active', models.BooleanField(default=True, verbose_name='Active')),
('comment', models.TextField(blank=True, default='', verbose_name='Comment')), ('comment', models.TextField(blank=True, default='', verbose_name='Comment')),
('users', models.JSONField(verbose_name='User')), ('users', models.JSONField(verbose_name='User')),
('system_users', models.JSONField(verbose_name='System User')), ('system_users', models.JSONField(verbose_name='System User')),
('assets', models.JSONField(verbose_name='Asset')), ('assets', models.JSONField(verbose_name='Asset')),
('action', models.CharField(choices=[('login_confirm', 'Login confirm')], default='login_confirm', max_length=64, verbose_name='Action')), ('action',
('reviewers', models.ManyToManyField(blank=True, related_name='review_login_asset_acls', to=settings.AUTH_USER_MODEL, verbose_name='Reviewers')), models.CharField(choices=[('login_confirm', 'Login confirm')], default='login_confirm', max_length=64,
verbose_name='Action')),
('reviewers',
models.ManyToManyField(blank=True, related_name='review_login_asset_acls', to=settings.AUTH_USER_MODEL,
verbose_name='Reviewers')),
], ],
options={ options={
'ordering': ('priority', '-date_updated', 'name'), 'ordering': ('priority', 'name'),
'unique_together': {('name', 'org_id')}, 'unique_together': {('name', 'org_id')},
}, },
), ),

View File

@ -2,7 +2,6 @@
import django import django
from django.conf import settings from django.conf import settings
from django.db import migrations, models, transaction from django.db import migrations, models, transaction
from acls.models import LoginACL
LOGIN_CONFIRM_ZH = '登录复核' LOGIN_CONFIRM_ZH = '登录复核'
LOGIN_CONFIRM_EN = 'Login confirm' LOGIN_CONFIRM_EN = 'Login confirm'
@ -90,10 +89,10 @@ class Migration(migrations.Migration):
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='loginacl', name='loginacl',
options={'ordering': ('priority', '-date_updated', 'name'), 'verbose_name': 'Login acl'}, options={'ordering': ('priority', 'name'), 'verbose_name': 'Login acl'},
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='loginassetacl', name='loginassetacl',
options={'ordering': ('priority', '-date_updated', 'name'), 'verbose_name': 'Login asset acl'}, options={'ordering': ('priority', 'name'), 'verbose_name': 'Login asset acl'},
), ),
] ]

View File

@ -4,7 +4,6 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('acls', '0002_auto_20210926_1047'), ('acls', '0002_auto_20210926_1047'),
] ]
@ -12,10 +11,10 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='loginacl', name='loginacl',
options={'ordering': ('priority', '-date_updated', 'name'), 'verbose_name': 'Login acl'}, options={'ordering': ('priority', 'name'), 'verbose_name': 'Login acl'},
), ),
migrations.AlterModelOptions( migrations.AlterModelOptions(
name='loginassetacl', name='loginassetacl',
options={'ordering': ('priority', '-date_updated', 'name'), 'verbose_name': 'Login asset acl'}, options={'ordering': ('priority', 'name'), 'verbose_name': 'Login asset acl'},
), ),
] ]

View File

@ -63,7 +63,7 @@ class Migration(migrations.Migration):
], ],
options={ options={
'verbose_name': 'Command acl', 'verbose_name': 'Command acl',
'ordering': ('priority', '-date_updated', 'name'), 'ordering': ('priority', 'name'),
'unique_together': {('name', 'org_id')}, 'unique_together': {('name', 'org_id')},
}, },
), ),

View File

@ -6,7 +6,7 @@ from common.db.fields import JSONManyToManyField
from common.db.models import JMSBaseModel from common.db.models import JMSBaseModel
from common.utils import contains_ip from common.utils import contains_ip
from common.utils.time_period import contains_time_period from common.utils.time_period import contains_time_period
from orgs.mixins.models import OrgModelMixin from orgs.mixins.models import OrgModelMixin, OrgManager
__all__ = [ __all__ = [
'BaseACL', 'UserBaseACL', 'UserAssetAccountBaseACL', 'BaseACL', 'UserBaseACL', 'UserAssetAccountBaseACL',
@ -48,7 +48,7 @@ class BaseACL(JMSBaseModel):
objects = BaseACLQuerySet.as_manager() objects = BaseACLQuerySet.as_manager()
class Meta: class Meta:
ordering = ('priority', 'date_updated', 'name') ordering = ('priority', 'name')
abstract = True abstract = True
def is_action(self, action): def is_action(self, action):
@ -97,6 +97,7 @@ class UserAssetAccountBaseACL(OrgModelMixin, UserBaseACL):
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
assets = JSONManyToManyField('assets.Asset', default=dict, verbose_name=_('Assets')) assets = JSONManyToManyField('assets.Asset', default=dict, verbose_name=_('Assets'))
accounts = models.JSONField(default=list, verbose_name=_("Accounts")) accounts = models.JSONField(default=list, verbose_name=_("Accounts"))
objects = OrgManager.from_queryset(BaseACLQuerySet)()
class Meta(UserBaseACL.Meta): class Meta(UserBaseACL.Meta):
unique_together = [('name', 'org_id')] unique_together = [('name', 'org_id')]
@ -125,4 +126,4 @@ class UserAssetAccountBaseACL(OrgModelMixin, UserBaseACL):
kwargs['org_id'] = org_id kwargs['org_id'] = org_id
if kwargs: if kwargs:
queryset = queryset.filter(**kwargs) queryset = queryset.filter(**kwargs)
return queryset.filter(is_active=True).distinct().order_by('priority', 'date_created') return queryset.valid().distinct()