dy-dashboard/scripts/repair_spot_confirmation_follower_permission.py
2026-10-28 11:14:17 +08:00

48 lines
2.7 KiB
Python

"""按管理员授权补齐采购跟单的采样确认编辑权限,不改个人覆盖或其他岗位。"""
import argparse
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--local', action='store_true')
parser.add_argument('--apply', action='store_true')
args = parser.parse_args()
if args.local:
from test_wsgi import app
else:
from app import app
from routes import auth, spot
from services.db import query
position = 'procurement_follower'
page = 'spot_confirmation'
with app.test_request_context():
before = query('SELECT page,operation,permission FROM position_operation_permissions '
'WHERE position_code=%s AND page=%s', (position, page))
print('before:', before)
if args.apply and not any(p['operation'] == 'edit' and p['permission'] == 1 for p in before):
auth._ensure_permission_baseline('position', position)
query('INSERT INTO position_operation_permissions (position_code,page,operation,permission) '
'VALUES (%s,%s,%s,1) ON DUPLICATE KEY UPDATE permission=1', (position, page, 'edit'))
detail = '修复权限矩阵漏项:按管理员要求为采购跟单启用现货采样确认编辑详情权限'
auth._create_permission_version('position', position, detail)
auth._record_permission_change('position', position, 'repair_missing_edit', before=before,
after={'page': page, 'operation': 'edit', 'permission': 1}, detail=detail)
users = query('SELECT id,username,real_name,role,position FROM dashboard_users WHERE username=%s', ('范亚欢',))
assert len(users) == 1 and users[0]['position'] == position, users
user = users[0]
auth.session.update(user_id=user['id'], username=user['username'], real_name=user['real_name'], role=user['role'])
allowed = auth.operation_required(page, 'edit')
profile = auth.profile.__wrapped__().get_json()['data']['permissions']
print('effective edit:', allowed, 'frontend permissions:', profile.get(page))
if args.apply:
assert allowed and profile[page]['edit'] == 1
# 空请求应通过权限判断,止于参数校验;不会读写业务记录。
with app.test_request_context('/api/spot/confirmation/save', method='POST', json={}):
auth.session.update(user_id=user['id'], role=user['role'])
response = spot.confirmation_save.__wrapped__()
payload = response[0].get_json()
assert payload['code'] == 400, payload
print('save endpoint: permission accepted; invalid empty payload rejected without data writes')