Files
Django/jituan/services/admin_assignments.py

145 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""admin_assignment 任职 CRUD修复停用不生效、重复插入"""
from django.db.models import Q
from django.utils import timezone
from jituan.constants import DATA_SCOPE_ALL, DATA_SCOPE_SINGLE
from jituan.models import AdminAssignment
def _club_filter(qs, club_id):
if club_id is None or club_id == '':
return qs.filter(Q(club_id__isnull=True) | Q(club_id=''))
return qs.filter(club_id=club_id)
def find_assignment(yonghuid, club_id, role_code):
qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code)
return _club_filter(qs, club_id).order_by('-id').first()
def find_active_assignment(yonghuid, club_id, role_code):
qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code, status=1)
return _club_filter(qs, club_id).order_by('-id').first()
def clear_other_primary_assignments(yonghuid, except_id=None):
qs = AdminAssignment.query.filter(yonghuid=yonghuid, status=1, is_primary=True)
if except_id:
qs = qs.exclude(id=except_id)
ids = list(qs.values_list('id', flat=True))
if ids:
AdminAssignment.objects.filter(pk__in=ids).update(
is_primary=False,
UpdateTime=timezone.now(),
)
def _clear_other_primary(yonghuid, except_id=None):
clear_other_primary_assignments(yonghuid, except_id=except_id)
def create_or_reactivate_assignment(
yonghuid,
club_id,
role_code,
data_scope,
is_primary,
granted_by,
):
active = find_active_assignment(yonghuid, club_id, role_code)
if active:
return None, '该任职记录已存在且有效'
if is_primary:
_clear_other_primary(yonghuid)
# MySQL 下 club_id=NULL 唯一约束不生效,可能有多条停用重复行,全部复活改只复活最新一条
inactive_qs = _club_filter(
AdminAssignment.objects.filter(yonghuid=yonghuid, role_code=role_code).exclude(status=1),
club_id,
).order_by('-id')
inactive = inactive_qs.first()
if inactive:
if is_primary:
_clear_other_primary(yonghuid)
# 同键其它停用重复行保持停用,只启用一条
inactive_qs.exclude(pk=inactive.pk).update(status=0, UpdateTime=timezone.now())
AdminAssignment.objects.filter(pk=inactive.id).update(
status=1,
data_scope=data_scope,
is_primary=is_primary,
granted_by=granted_by,
UpdateTime=timezone.now(),
)
return inactive.id, None
row = AdminAssignment.query.create(
yonghuid=yonghuid,
club_id=club_id,
role_code=role_code,
data_scope=data_scope,
is_primary=is_primary,
granted_by=granted_by,
status=1,
)
return row.id, None
def deactivate_assignment(assignment_id):
"""
停用任职。必须连同「同人+同角色+同俱乐部」的全部有效行一起停用:
MySQL 对 club_id=NULL 的 unique 不生效,集团任职常会积多条,只停一条等于没停。
"""
try:
pk = int(assignment_id)
except (TypeError, ValueError):
return False, '任职 id 无效'
row = AdminAssignment.objects.filter(pk=pk).first()
if not row:
return False, '任职记录不存在'
qs = AdminAssignment.objects.filter(
yonghuid=row.yonghuid,
role_code=row.role_code,
status=1,
)
qs = _club_filter(qs, row.club_id)
updated = qs.update(status=0, UpdateTime=timezone.now())
# 目标行若已是停用,仍视为成功(幂等)
if updated or int(row.status or 0) != 1:
return True, None
return True, None
def deactivate_all_assignments_for_user(yonghuid):
"""账号禁用时:停用该用户全部有效任职。"""
yonghuid = (yonghuid or '').strip()
if not yonghuid:
return 0
return AdminAssignment.objects.filter(yonghuid=yonghuid, status=1).update(
status=0,
UpdateTime=timezone.now(),
)
def dedupe_active_assignments():
"""停用重复的有效任职,每组 (yonghuid, club_id, role_code) 只保留一条。"""
rows = list(
AdminAssignment.query.filter(status=1).order_by('yonghuid', 'club_id', 'role_code', 'id')
)
seen = {}
dup_ids = []
for row in rows:
key = (row.yonghuid, row.club_id or '', row.role_code)
if key in seen:
dup_ids.append(row.id)
else:
seen[key] = row.id
if dup_ids:
AdminAssignment.objects.filter(pk__in=dup_ids).update(
status=0,
UpdateTime=timezone.now(),
)
return len(dup_ids)