fix: 集团任职硬删除,杜绝 NULL 重复冒出多条

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-29 06:53:06 +08:00
parent 52e714b9b2
commit c3a0143eff
3 changed files with 122 additions and 126 deletions

View File

@@ -1,6 +1,6 @@
"""紧急封杀后台账号:摘超管、停全部任职、禁用客服、改密、清角色。
"""紧急封杀后台账号:硬删任职、摘超管、禁用客服、改密、清角色。
用法(服务器):
用法:
python manage.py nuke_kefu_admin 13837714110
"""
from django.core.management.base import BaseCommand
@@ -8,14 +8,14 @@ from django.utils import timezone
class Command(BaseCommand):
help = '紧急封杀指定手机号的后台权限(非交互'
help = '紧急封杀指定手机号的后台权限(硬删除任职'
def add_arguments(self, parser):
parser.add_argument('phone', type=str, help='要封杀的手机号')
parser.add_argument(
'--also-whitelist',
action='store_true',
help='连代码白名单手机号也允许封(默认拒绝封白名单)',
help='连代码白名单手机号也允许封',
)
def handle(self, *args, **options):
@@ -27,40 +27,33 @@ class Command(BaseCommand):
from jituan.constants import SUPER_ADMIN_PHONES
if phone in SUPER_ADMIN_PHONES and not options['also_whitelist']:
self.stderr.write(
f'{phone} SUPER_ADMIN_PHONES 白名单,拒绝封杀。'
f'确要封再加 --also-whitelist'
f'{phone}白名单,拒绝。确要封加 --also-whitelist'
)
return
from users.business_models import User
from jituan.models import AdminAssignment
from gvsdsdk.models import UserRole as SdkUserRole
import bcrypt
users = list(User.objects.filter(Phone=phone))
if not users:
self.stderr.write(f'未找到手机号 {phone}')
self.stderr.write(f'未找到 {phone}')
return
import bcrypt
from gvsdsdk.models import UserRole as SdkUserRole
new_pwd = f'LOCKED_{phone}_REVOKED'
for u in users:
self.stdout.write(
f'处理 UserUID={u.UserUID} IsSuperuser={u.IsSuperuser} IsStaff={u.IsStaff}'
)
self.stdout.write(f'HIT uid={u.UserUID} super={u.IsSuperuser}')
u.IsSuperuser = False
u.IsStaff = False
u.SetPassword(new_pwd)
u.save()
n_asg = AdminAssignment.objects.filter(yonghuid=u.UserUID).update(
status=0,
UpdateTime=timezone.now(),
)
self.stdout.write(f' 任职停用行数={n_asg}')
n, _ = AdminAssignment.objects.filter(yonghuid=u.UserUID).delete()
self.stdout.write(f' 硬删任职={n}')
n_role = SdkUserRole.objects.filter(UserUUID=u.UserUUID).delete()
self.stdout.write(f' 功能角色删除={n_role}')
self.stdout.write(f' 功能角色={n_role}')
try:
kefu = u.KefuProfile
@@ -69,11 +62,15 @@ class Command(BaseCommand):
b'LOCKED_REVOKED', bcrypt.gensalt(rounds=12)
).decode('utf-8')
kefu.save(update_fields=['zhuangtai', 'erjimima', 'UpdateTime'])
self.stdout.write(' 客服状态已禁用 + 二级密码已废')
self.stdout.write(' 客服已禁用')
except Exception as e:
self.stdout.write(f' 无客服扩展或跳过: {e}')
self.stdout.write(f' 无客服扩展: {e}')
# 顺手清全库 NULL 俱乐部垃圾重复
from jituan.services.admin_assignments import dedupe_active_assignments
d = dedupe_active_assignments()
self.stdout.write(f'全库去重硬删重复={d}')
self.stdout.write(self.style.SUCCESS(
f'已封杀 {phone}(共 {len(users)} 个账号)。对方旧 token 需重新登录才会彻底失效;'
f'主密码已改为 LOCKED_{phone}_REVOKED勿外传事后请再改。'
f'已封杀 {phone}。密码={new_pwd}。请 restart gunicorn。'
))