126 lines
5.3 KiB
Python
126 lines
5.3 KiB
Python
"""写入资金冻结相关权限码,并可按俱乐部挂到角色(可重复执行)。
|
||
|
||
权限码:
|
||
djcfg001 资金冻结规则配置
|
||
djled001 资金冻结明细/手动解冻
|
||
djrisk001 罚款投诉风险指标
|
||
|
||
用法:
|
||
python manage.py seed_fund_freeze_perm
|
||
python manage.py seed_fund_freeze_perm --club-id lxs --role-name 管理员
|
||
python manage.py seed_fund_freeze_perm --all-clubs --role-name 管理员 --dry-run
|
||
"""
|
||
import uuid
|
||
|
||
from django.core.management.base import BaseCommand
|
||
from django.db import transaction
|
||
from django.utils import timezone
|
||
|
||
from gvsdsdk.models import Permission, Role, RolePermission
|
||
|
||
from jituan.models import Club
|
||
|
||
PERMS = [
|
||
('djcfg001', '资金冻结规则配置', '配置本俱乐部各角色冻结比例/分期/解冻条件', '资金冻结'),
|
||
('djled001', '资金冻结明细', '查看冻结流水并手动解冻', '资金冻结'),
|
||
('djrisk001', '罚款投诉风险指标', '查看罚款率/投诉率等解冻相关指标', '资金冻结'),
|
||
]
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '写入资金冻结权限码,并按俱乐部挂到角色'
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument('--club-id', default='', help='仅处理该俱乐部')
|
||
parser.add_argument('--all-clubs', action='store_true')
|
||
parser.add_argument('--role-name', default='', help='角色名;空则只确保权限码')
|
||
parser.add_argument('--dry-run', action='store_true')
|
||
|
||
def handle(self, *args, **options):
|
||
dry_run = options['dry_run']
|
||
club_id = (options.get('club_id') or '').strip()
|
||
all_clubs = options.get('all_clubs')
|
||
role_name = (options.get('role_name') or '').strip()
|
||
|
||
sample = Permission.objects.filter(PermStatus=1).first()
|
||
tenant_uuid = sample.TenantUUID if sample else uuid.UUID(
|
||
'00000000-0000-0000-0000-000000000001'
|
||
).bytes
|
||
|
||
perm_objs = []
|
||
for code, name, desc, cat in PERMS:
|
||
perm = Permission.objects.filter(PermCode=code).first()
|
||
if perm:
|
||
self.stdout.write(f' 权限码已存在: {code}')
|
||
if not dry_run:
|
||
changed = False
|
||
if perm.PermName != name:
|
||
perm.PermName = name
|
||
changed = True
|
||
if (perm.PermDesc or '') != desc:
|
||
perm.PermDesc = desc
|
||
changed = True
|
||
if (perm.PermCategory or '') != cat:
|
||
perm.PermCategory = cat
|
||
changed = True
|
||
if changed:
|
||
perm.save(update_fields=['PermName', 'PermDesc', 'PermCategory'])
|
||
else:
|
||
if dry_run:
|
||
self.stdout.write(f'would create perm {code}')
|
||
else:
|
||
perm = Permission.objects.create(
|
||
PermUUID=uuid.uuid4().bytes,
|
||
TenantUUID=tenant_uuid,
|
||
PermCode=code,
|
||
PermName=name,
|
||
PermDesc=desc,
|
||
PermCategory=cat,
|
||
PermStatus=1,
|
||
CreateTime=timezone.now(),
|
||
UpdateTime=timezone.now(),
|
||
)
|
||
self.stdout.write(self.style.SUCCESS(f' 已创建权限码: {code}'))
|
||
if perm:
|
||
perm_objs.append(perm)
|
||
|
||
if not role_name:
|
||
self.stdout.write('未指定 --role-name,跳过挂角色')
|
||
return
|
||
|
||
clubs = []
|
||
if all_clubs:
|
||
clubs = list(Club.query.filter(status=1).values_list('club_id', flat=True))
|
||
elif club_id:
|
||
clubs = [club_id]
|
||
else:
|
||
self.stdout.write(self.style.WARNING('请指定 --club-id 或 --all-clubs'))
|
||
return
|
||
|
||
with transaction.atomic():
|
||
for cid in clubs:
|
||
roles = Role.objects.filter(RoleName=role_name, ClubID=cid, RoleStatus=1)
|
||
if not roles.exists():
|
||
# 兼容无 ClubID 字段旧数据:仅精确 club 时再试全局同名
|
||
roles = Role.objects.filter(RoleName=role_name, RoleStatus=1)
|
||
roles = [r for r in roles if (getattr(r, 'ClubID', None) or '') == cid]
|
||
for role in roles:
|
||
for perm in perm_objs:
|
||
exists = RolePermission.objects.filter(
|
||
RoleUUID=role.RoleUUID, PermUUID=perm.PermUUID,
|
||
).exists()
|
||
if exists:
|
||
self.stdout.write(f' 已挂: {cid} {role_name} <- {perm.PermCode}')
|
||
continue
|
||
if dry_run:
|
||
self.stdout.write(f'would link {cid} {role_name} <- {perm.PermCode}')
|
||
else:
|
||
RolePermission.objects.create(
|
||
RoleUUID=role.RoleUUID,
|
||
PermUUID=perm.PermUUID,
|
||
CreateTime=timezone.now(),
|
||
)
|
||
self.stdout.write(self.style.SUCCESS(
|
||
f' 已挂: {cid} {role_name} <- {perm.PermCode}'
|
||
))
|