Files
Django/jituan/services/admin_audit.py
T

136 lines
4.4 KiB
Python

"""后台操作日志:xiugaijilu 按俱乐部过滤 + admin_audit_log 写入。"""
import logging
from jituan.constants import DATA_SCOPE_ALL
from jituan.models import AdminAuditLog
from jituan.services.club_context import resolve_club_id_from_request, resolve_club_scope
from jituan.services.club_user import get_user_club_id
logger = logging.getLogger(__name__)
def club_id_for_yonghuid(yonghuid):
from users.business_models import User
user = User.query.filter(UserUID=str(yonghuid)).first()
return get_user_club_id(user)
def filter_admin_audit_by_request(qs, request):
"""集团 ALL 视图看全部;子公司按 club_id 过滤。"""
if resolve_club_scope(request) == DATA_SCOPE_ALL:
return qs
return qs.filter(club_id=resolve_club_id_from_request(request))
def list_admin_audit_logs(request, page=1, page_size=20, **filters):
"""分页查询 admin_audit_log。"""
qs = AdminAuditLog.query.all().order_by('-CreateTime')
qs = filter_admin_audit_by_request(qs, request)
operator = (filters.get('operator_yonghuid') or '').strip()
target = (filters.get('target_yonghuid') or '').strip()
action = (filters.get('action') or '').strip()
keyword = (filters.get('keyword') or '').strip()
if operator:
qs = qs.filter(operator_yonghuid=operator)
if target:
qs = qs.filter(target_yonghuid=target)
if action:
qs = qs.filter(action=action)
if keyword:
qs = qs.filter(remark__icontains=keyword)
page = max(1, int(page or 1))
page_size = min(100, max(1, int(page_size or 20)))
total = qs.count()
start = (page - 1) * page_size
rows = qs[start:start + page_size]
data_list = []
for r in rows:
data_list.append({
'id': r.id,
'club_id': r.club_id,
'operator_yonghuid': r.operator_yonghuid,
'operator_role_code': r.operator_role_code,
'target_yonghuid': r.target_yonghuid,
'action': r.action,
'resource_type': r.resource_type,
'resource_id': r.resource_id,
'field_name': r.field_name,
'value_before': r.value_before,
'value_after': r.value_after,
'remark': r.remark,
'request_ip': r.request_ip,
'CreateTime': r.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if r.CreateTime else '',
})
return {
'list': data_list,
'total': total,
'page': page,
'page_size': page_size,
}
def filter_xiugaijilu_by_request(qs, request):
"""集团 ALL 视图看全部;子公司仅看本 club 用户相关记录。"""
if resolve_club_scope(request) == DATA_SCOPE_ALL:
return qs
club_id = resolve_club_id_from_request(request)
from users.business_models import User
uids = User.query.filter(ClubID=club_id).values_list('UserUID', flat=True)
uid_list = [str(u) for u in uids]
if not uid_list:
return qs.none()
return qs.filter(yonghuid__in=uid_list)
def resolve_operator_yonghuid(xiugaiid):
"""
xiugaijilu.xiugaiid 多为客服手机号;admin_audit_log.operator_yonghuid 存 UserUID。
解析失败时回落为原值(列宽已放宽至 16)。
"""
s = str(xiugaiid or '').strip()
if not s:
return ''
if len(s) <= 7:
return s
from users.business_models import User
u = User.query.filter(Phone=s).first()
if u and getattr(u, 'UserUID', None):
return str(u.UserUID)
u = User.query.filter(UserUID=s).first()
if u and getattr(u, 'UserUID', None):
return str(u.UserUID)
return s[:16]
def log_admin_audit_from_xiugai(
*,
yonghuid,
xiugaiid,
leixing,
qitashuoming,
club_id=None,
request_ip='',
):
"""与 write_xiugai_log 同步写入 admin_audit_log(失败不影响主流程)。"""
try:
cid = club_id or club_id_for_yonghuid(yonghuid)
operator_uid = resolve_operator_yonghuid(xiugaiid)
AdminAuditLog.query.create(
club_id=cid,
operator_yonghuid=operator_uid,
target_yonghuid=str(yonghuid),
action='xiugaijilu',
resource_type='user',
resource_id=str(yonghuid),
field_name=str(leixing),
remark=(qitashuoming or '')[:500],
request_ip=(request_ip or '')[:64],
)
except Exception as e:
logger.warning('写入 admin_audit_log 失败: %s', e)