forked from erp-dev/erp
132 lines
4.0 KiB
Python
132 lines
4.0 KiB
Python
#!/usr/bin/env python
|
||
"""
|
||
PlateOrder PATCH 权限诊断脚本
|
||
用于检查用户是否有正确的权限
|
||
"""
|
||
import os
|
||
import django
|
||
|
||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'flower.settings')
|
||
django.setup()
|
||
|
||
from django.contrib.auth import get_user_model
|
||
from django.contrib.auth.models import Permission
|
||
from printing.models import PlateOrder
|
||
|
||
User = get_user_model()
|
||
|
||
def diagnose_user_permissions(username):
|
||
"""诊断用户权限"""
|
||
print(f"\n{'='*60}")
|
||
print(f"诊断用户: {username}")
|
||
print(f"{'='*60}\n")
|
||
|
||
try:
|
||
user = User.objects.get(username=username)
|
||
except User.DoesNotExist:
|
||
print(f"❌ 用户 '{username}' 不存在!")
|
||
return
|
||
|
||
print(f"✅ 用户存在: {user.username} ({user.email})")
|
||
print(f" - is_active: {user.is_active}")
|
||
print(f" - is_staff: {user.is_staff}")
|
||
print(f" - is_superuser: {user.is_superuser}")
|
||
|
||
if user.is_superuser:
|
||
print("\n✅ 用户是超级管理员,拥有所有权限!")
|
||
return
|
||
|
||
# 检查 PlateOrder 相关权限
|
||
required_perms = [
|
||
'printing.view_plateorder',
|
||
'printing.add_plateorder',
|
||
'printing.change_plateorder', # ⚠️ PATCH 需要这个
|
||
'printing.delete_plateorder',
|
||
]
|
||
|
||
print("\n📋 PlateOrder 权限检查:")
|
||
print("-" * 60)
|
||
|
||
for perm in required_perms:
|
||
has_perm = user.has_perm(perm)
|
||
icon = "✅" if has_perm else "❌"
|
||
action = perm.split('.')[1].replace('_', ' ').title()
|
||
print(f"{icon} {action:30} ({perm})")
|
||
|
||
if perm == 'printing.change_plateorder' and not has_perm:
|
||
print(" ⚠️ 缺少此权限会导致 PATCH/PUT 请求返回 401/403!")
|
||
|
||
# 检查用户所属组
|
||
groups = user.groups.all()
|
||
if groups.exists():
|
||
print(f"\n👥 用户所属组: {', '.join(g.name for g in groups)}")
|
||
for group in groups:
|
||
print(f"\n 组 '{group.name}' 的权限:")
|
||
group_perms = group.permissions.filter(
|
||
content_type__app_label='printing',
|
||
content_type__model='plateorder'
|
||
)
|
||
for perm in group_perms:
|
||
print(f" - {perm.codename}")
|
||
else:
|
||
print("\n👥 用户不属于任何组")
|
||
|
||
# 检查直接授予的权限
|
||
direct_perms = user.user_permissions.filter(
|
||
content_type__app_label='printing',
|
||
content_type__model='plateorder'
|
||
)
|
||
if direct_perms.exists():
|
||
print(f"\n🔑 直接授予的权限:")
|
||
for perm in direct_perms:
|
||
print(f" - {perm.codename}")
|
||
else:
|
||
print("\n🔑 没有直接授予的权限")
|
||
|
||
print("\n" + "="*60)
|
||
|
||
# 提供修复建议
|
||
if not user.has_perm('printing.change_plateorder'):
|
||
print("\n💡 修复方法:")
|
||
print("-" * 60)
|
||
print("在 Django shell 中运行以下代码:")
|
||
print(f"""
|
||
from django.contrib.auth import get_user_model
|
||
from django.contrib.auth.models import Permission
|
||
|
||
User = get_user_model()
|
||
user = User.objects.get(username='{username}')
|
||
change_perm = Permission.objects.get(codename='change_plateorder')
|
||
user.user_permissions.add(change_perm)
|
||
print("✅ 权限已添加!")
|
||
""")
|
||
|
||
|
||
def list_all_users():
|
||
"""列出所有用户"""
|
||
users = User.objects.all()
|
||
if not users.exists():
|
||
print("❌ 系统中没有用户!")
|
||
return
|
||
|
||
print(f"\n{'='*60}")
|
||
print("系统中的所有用户:")
|
||
print(f"{'='*60}\n")
|
||
|
||
for user in users:
|
||
has_change = user.has_perm('printing.change_plateorder')
|
||
icon = "✅" if has_change else "❌"
|
||
print(f"{icon} {user.username:20} (is_active: {user.is_active}, has_change_plateorder: {has_change})")
|
||
|
||
|
||
if __name__ == '__main__':
|
||
import sys
|
||
|
||
if len(sys.argv) > 1:
|
||
username = sys.argv[1]
|
||
diagnose_user_permissions(username)
|
||
else:
|
||
list_all_users()
|
||
print("\n💡 使用方法: python diagnose_permissions.py <username>")
|
||
|