Files
Django/merchant_ops/services/audit.py

67 lines
1.6 KiB
Python

"""操作审计。"""
from decimal import Decimal
from merchant_ops.constants import ACTOR_MERCHANT, ACTOR_STAFF
from merchant_ops.models import MerchantStaffAuditLog
def write_audit(
merchant_id,
operator_user_id,
operator_type,
action,
*,
staff_member_id=None,
resource_type='',
resource_id='',
value_before=None,
value_after=None,
amount=None,
request_ip='',
remark='',
):
MerchantStaffAuditLog.objects.create(
merchant_id=merchant_id,
operator_user_id=operator_user_id,
operator_type=operator_type,
staff_member_id=staff_member_id,
action=action,
resource_type=resource_type,
resource_id=str(resource_id) if resource_id else '',
value_before=value_before,
value_after=value_after,
amount=Decimal(str(amount)) if amount is not None else None,
request_ip=request_ip or '',
remark=remark or '',
)
def audit_staff(member, action, request, **kwargs):
write_audit(
member.merchant_id,
member.staff_user_id,
ACTOR_STAFF,
action,
staff_member_id=member.id,
request_ip=_client_ip(request),
**kwargs,
)
def audit_owner(merchant_id, operator_id, action, request, **kwargs):
write_audit(
merchant_id,
operator_id,
ACTOR_MERCHANT,
action,
request_ip=_client_ip(request),
**kwargs,
)
def _client_ip(request):
xff = request.META.get('HTTP_X_FORWARDED_FOR')
if xff:
return xff.split(',')[0].strip()
return request.META.get('REMOTE_ADDR', '') or ''