子客服管理接口禁止对自己划收额度、换角色、封禁;成员列表返回 isSelf;具备 staff_manage 的总管可读角色列表用于给他人换角色。
This commit is contained in:
@@ -84,6 +84,12 @@ def _resolve_wallet_operator(request, perm_code):
|
|||||||
return member.merchant_id, member
|
return member.merchant_id, member
|
||||||
|
|
||||||
|
|
||||||
|
def _assert_not_self_target(operator_member, target_member):
|
||||||
|
"""子客服不得对自己做管理类操作(划收额度、换角色、封禁等)。"""
|
||||||
|
if operator_member and target_member.id == operator_member.id:
|
||||||
|
raise StaffAuthError(400, '不能对本人执行此操作')
|
||||||
|
|
||||||
|
|
||||||
class StaffInviteCreateView(APIView):
|
class StaffInviteCreateView(APIView):
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
@@ -212,6 +218,7 @@ class StaffMemberListView(APIView):
|
|||||||
'quota_available': str(wallet.quota_available),
|
'quota_available': str(wallet.quota_available),
|
||||||
'quota_total': str(wallet.quota_total),
|
'quota_total': str(wallet.quota_total),
|
||||||
'quota_used': str(wallet.quota_used),
|
'quota_used': str(wallet.quota_used),
|
||||||
|
'isSelf': m.staff_user_id == request.user.UserUID,
|
||||||
})
|
})
|
||||||
return Response({'code': 0, 'msg': '成功', 'data': {'list': result}})
|
return Response({'code': 0, 'msg': '成功', 'data': {'list': result}})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -223,12 +230,13 @@ class StaffMemberUpdateRoleView(APIView):
|
|||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
mid, _ = _resolve_manage_context(request, need_staff_manage=True)
|
mid, operator = _resolve_manage_context(request, need_staff_manage=True)
|
||||||
member_id = request.data.get('member_id')
|
member_id = request.data.get('member_id')
|
||||||
role_id = request.data.get('role_id')
|
role_id = request.data.get('role_id')
|
||||||
m = MerchantStaffMember.query.get(
|
m = MerchantStaffMember.query.get(
|
||||||
id=member_id, merchant_id=mid, status=MEMBER_STATUS_ACTIVE,
|
id=member_id, merchant_id=mid, status=MEMBER_STATUS_ACTIVE,
|
||||||
)
|
)
|
||||||
|
_assert_not_self_target(operator, m)
|
||||||
role = MerchantStaffRole.query.get(id=role_id, merchant_id=mid, status=1)
|
role = MerchantStaffRole.query.get(id=role_id, merchant_id=mid, status=1)
|
||||||
old = m.role_id
|
old = m.role_id
|
||||||
m.role = role
|
m.role = role
|
||||||
@@ -271,10 +279,11 @@ class StaffMemberDisableView(APIView):
|
|||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
mid, _ = _resolve_manage_context(request, need_staff_manage=True)
|
mid, operator = _resolve_manage_context(request, need_staff_manage=True)
|
||||||
member_id = request.data.get('member_id')
|
member_id = request.data.get('member_id')
|
||||||
disable = request.data.get('disable', True)
|
disable = request.data.get('disable', True)
|
||||||
m = MerchantStaffMember.query.get(id=member_id, merchant_id=mid)
|
m = MerchantStaffMember.query.get(id=member_id, merchant_id=mid)
|
||||||
|
_assert_not_self_target(operator, m)
|
||||||
m.status = MEMBER_STATUS_DISABLED if disable else MEMBER_STATUS_ACTIVE
|
m.status = MEMBER_STATUS_DISABLED if disable else MEMBER_STATUS_ACTIVE
|
||||||
m.save(update_fields=['status'])
|
m.save(update_fields=['status'])
|
||||||
action = 'MEMBER_DISABLE' if disable else 'MEMBER_ENABLE'
|
action = 'MEMBER_DISABLE' if disable else 'MEMBER_ENABLE'
|
||||||
@@ -290,8 +299,12 @@ class StaffRoleListView(APIView):
|
|||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
from merchant_ops.constants import PERMISSION_DEFINITIONS, SYSTEM_ROLE_TEMPLATES
|
from merchant_ops.constants import PERMISSION_DEFINITIONS, SYSTEM_ROLE_TEMPLATES
|
||||||
ensure_owner_merchant(request.user.UserUID, request.user)
|
if is_merchant_owner(request.user):
|
||||||
roles = MerchantStaffRole.query.filter(merchant_id=request.user.UserUID, status=1)
|
mid = request.user.UserUID
|
||||||
|
ensure_owner_merchant(mid, request.user)
|
||||||
|
else:
|
||||||
|
mid, _ = _resolve_manage_context(request, need_staff_manage=True)
|
||||||
|
roles = MerchantStaffRole.query.filter(merchant_id=mid, status=1)
|
||||||
tpl_desc = {t['role_code']: t['role_name'] for t in SYSTEM_ROLE_TEMPLATES}
|
tpl_desc = {t['role_code']: t['role_name'] for t in SYSTEM_ROLE_TEMPLATES}
|
||||||
data = []
|
data = []
|
||||||
for r in roles:
|
for r in roles:
|
||||||
@@ -401,12 +414,13 @@ class StaffWalletAllocateView(APIView):
|
|||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
mid, _ = _resolve_wallet_operator(request, 'wallet_allocate')
|
mid, operator = _resolve_wallet_operator(request, 'wallet_allocate')
|
||||||
member_id = request.data.get('member_id')
|
member_id = request.data.get('member_id')
|
||||||
amount = request.data.get('amount')
|
amount = request.data.get('amount')
|
||||||
m = MerchantStaffMember.query.get(
|
m = MerchantStaffMember.query.get(
|
||||||
id=member_id, merchant_id=mid, status=MEMBER_STATUS_ACTIVE,
|
id=member_id, merchant_id=mid, status=MEMBER_STATUS_ACTIVE,
|
||||||
)
|
)
|
||||||
|
_assert_not_self_target(operator, m)
|
||||||
get_or_create_wallet(m)
|
get_or_create_wallet(m)
|
||||||
wallet = allocate_quota(m, amount, request.user.UserUID, remark='划额度')
|
wallet = allocate_quota(m, amount, request.user.UserUID, remark='划额度')
|
||||||
audit_owner(mid, request.user.UserUID, 'WALLET_ALLOCATE', request,
|
audit_owner(mid, request.user.UserUID, 'WALLET_ALLOCATE', request,
|
||||||
@@ -428,7 +442,7 @@ class StaffWalletRevokeView(APIView):
|
|||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
mid, _ = _resolve_wallet_operator(request, 'wallet_revoke')
|
mid, operator = _resolve_wallet_operator(request, 'wallet_revoke')
|
||||||
member_id = request.data.get('member_id')
|
member_id = request.data.get('member_id')
|
||||||
amount = request.data.get('amount')
|
amount = request.data.get('amount')
|
||||||
remark = (request.data.get('remark') or '').strip() or '收回未使用额度'
|
remark = (request.data.get('remark') or '').strip() or '收回未使用额度'
|
||||||
@@ -437,6 +451,7 @@ class StaffWalletRevokeView(APIView):
|
|||||||
merchant_id=mid,
|
merchant_id=mid,
|
||||||
status__in=[MEMBER_STATUS_ACTIVE, MEMBER_STATUS_DISABLED],
|
status__in=[MEMBER_STATUS_ACTIVE, MEMBER_STATUS_DISABLED],
|
||||||
)
|
)
|
||||||
|
_assert_not_self_target(operator, m)
|
||||||
wallet = revoke_quota(m, amount, request.user.UserUID, remark=remark)
|
wallet = revoke_quota(m, amount, request.user.UserUID, remark=remark)
|
||||||
audit_owner(mid, request.user.UserUID, 'WALLET_REVOKE', request,
|
audit_owner(mid, request.user.UserUID, 'WALLET_REVOKE', request,
|
||||||
resource_type='wallet', resource_id=member_id, amount=amount)
|
resource_type='wallet', resource_id=member_id, amount=amount)
|
||||||
|
|||||||
Reference in New Issue
Block a user