154 lines
6.1 KiB
Python
154 lines
6.1 KiB
Python
"""确保提现审核权限码 005bb,并按俱乐部挂到指定角色(可重复执行)。
|
||
|
||
权限码全局共用;隔离靠 Role.ClubID + 请求头俱乐部。
|
||
集团高管仍可跨俱乐部;俱乐部管理员仅本俱乐部。
|
||
|
||
用法示例:
|
||
python manage.py seed_club_withdraw_audit_perm
|
||
python manage.py seed_club_withdraw_audit_perm --club-id lxs --role-name 管理员
|
||
python manage.py seed_club_withdraw_audit_perm --all-clubs --role-name 管理员
|
||
python manage.py seed_club_withdraw_audit_perm --all-clubs --role-name 管理员 --dry-run
|
||
"""
|
||
import uuid
|
||
|
||
from django.core.management.base import BaseCommand, CommandError
|
||
from django.db import transaction
|
||
from django.utils import timezone
|
||
|
||
from gvsdsdk.models import Permission, Role, RolePermission
|
||
|
||
from jituan.models import Club
|
||
|
||
WITHDRAW_AUDIT_PERM = '005bb'
|
||
WITHDRAW_AUDIT_NAME = '提现审核(按俱乐部)'
|
||
WITHDRAW_AUDIT_DESC = (
|
||
'审核本俱乐部提现申请(同意/拒绝/自动打款待收款)。'
|
||
'跨俱乐部仅集团高管可操作;须配合后台角色 ClubID 与数据范围任职。'
|
||
)
|
||
WITHDRAW_AUDIT_CATEGORY = '提现管理'
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = '写入 005bb 提现审核权限码,并按俱乐部挂到角色'
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument(
|
||
'--club-id', default='', help='仅处理该俱乐部角色(如 lxs / xq)',
|
||
)
|
||
parser.add_argument(
|
||
'--all-clubs', action='store_true', help='处理全部启用中的俱乐部',
|
||
)
|
||
parser.add_argument(
|
||
'--role-name', default='',
|
||
help='角色名(如「管理员」);为空则只确保权限码存在,不挂角色',
|
||
)
|
||
parser.add_argument(
|
||
'--dry-run', action='store_true', help='只打印不写入',
|
||
)
|
||
|
||
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 = Permission.objects.filter(PermCode=WITHDRAW_AUDIT_PERM).first()
|
||
if perm:
|
||
self.stdout.write(f' 权限码已存在: {WITHDRAW_AUDIT_PERM}')
|
||
if not dry_run and (perm.PermName != WITHDRAW_AUDIT_NAME or not perm.PermDesc):
|
||
perm.PermName = WITHDRAW_AUDIT_NAME
|
||
perm.PermDesc = WITHDRAW_AUDIT_DESC
|
||
perm.PermCategory = WITHDRAW_AUDIT_CATEGORY
|
||
perm.save(update_fields=['PermName', 'PermDesc', 'PermCategory'])
|
||
self.stdout.write(self.style.SUCCESS(' 已更新 005bb 名称/说明'))
|
||
else:
|
||
if dry_run:
|
||
self.stdout.write(f'would create perm {WITHDRAW_AUDIT_PERM}')
|
||
else:
|
||
perm = Permission.objects.create(
|
||
PermUUID=uuid.uuid4().bytes,
|
||
TenantUUID=tenant_uuid,
|
||
PermCode=WITHDRAW_AUDIT_PERM,
|
||
PermName=WITHDRAW_AUDIT_NAME,
|
||
PermDesc=WITHDRAW_AUDIT_DESC,
|
||
PermCategory=WITHDRAW_AUDIT_CATEGORY,
|
||
PermStatus=1,
|
||
CreateTime=timezone.now(),
|
||
)
|
||
self.stdout.write(self.style.SUCCESS(f' 新增权限: {WITHDRAW_AUDIT_PERM}'))
|
||
|
||
if not role_name:
|
||
self.stdout.write(
|
||
self.style.WARNING(
|
||
'未指定 --role-name:仅确保权限码。'
|
||
'给俱乐部挂权请加:--club-id lxs --role-name 管理员'
|
||
)
|
||
)
|
||
return
|
||
|
||
if not club_id and not all_clubs:
|
||
raise CommandError('挂角色时请指定 --club-id 或 --all-clubs')
|
||
|
||
if all_clubs:
|
||
club_ids = list(
|
||
Club.query.filter(status=1).values_list('club_id', flat=True)
|
||
)
|
||
else:
|
||
if not Club.query.filter(club_id=club_id, status=1).exists():
|
||
raise CommandError(f'俱乐部不存在或未启用: {club_id}')
|
||
club_ids = [club_id]
|
||
|
||
if not perm and dry_run:
|
||
self.stdout.write('dry-run: skip role binding (perm not loaded)')
|
||
return
|
||
|
||
linked = 0
|
||
missing_roles = 0
|
||
with transaction.atomic():
|
||
for cid in club_ids:
|
||
role = Role.objects.filter(
|
||
RoleName=role_name, ClubID=cid, RoleStatus=1,
|
||
).first()
|
||
if not role:
|
||
missing_roles += 1
|
||
self.stdout.write(
|
||
self.style.WARNING(f' [{cid}] 无角色「{role_name}」,跳过')
|
||
)
|
||
continue
|
||
exists = RolePermission.objects.filter(
|
||
RoleUUID=role.RoleUUID, PermUUID=perm.PermUUID,
|
||
).exists()
|
||
if exists:
|
||
self.stdout.write(f' [{cid}] 角色「{role_name}」已有 {WITHDRAW_AUDIT_PERM}')
|
||
continue
|
||
if dry_run:
|
||
self.stdout.write(
|
||
f'would link {WITHDRAW_AUDIT_PERM} -> [{cid}] {role_name}'
|
||
)
|
||
linked += 1
|
||
continue
|
||
RolePermission.objects.create(
|
||
RolePermUUID=uuid.uuid4().bytes,
|
||
RoleUUID=role.RoleUUID,
|
||
PermUUID=perm.PermUUID,
|
||
CreateTime=timezone.now(),
|
||
)
|
||
linked += 1
|
||
self.stdout.write(
|
||
self.style.SUCCESS(
|
||
f' [{cid}] 已给角色「{role_name}」挂上 {WITHDRAW_AUDIT_PERM}'
|
||
)
|
||
)
|
||
|
||
self.stdout.write(
|
||
self.style.SUCCESS(
|
||
f'完成:挂权 {linked},缺角色 {missing_roles}。'
|
||
f'另请确认该账号在「数据范围配置」有对应俱乐部 SINGLE_CLUB 任职。'
|
||
)
|
||
)
|