Files
Django/jituan/services/admin_audit.py

136 lines
4.4 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.
"""后台操作日志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)