70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import os
|
|
|
|
from django.conf import settings
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
|
|
from accounts.models import User
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "仅在 DEBUG 环境创建或修复本地测试管理员"
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
"--username",
|
|
default=os.getenv("LOCAL_ADMIN_USERNAME", "local_admin"),
|
|
)
|
|
parser.add_argument(
|
|
"--password",
|
|
default=os.getenv("LOCAL_ADMIN_PASSWORD", "LocalAdmin2026!"),
|
|
)
|
|
parser.add_argument(
|
|
"--email",
|
|
default=os.getenv("LOCAL_ADMIN_EMAIL", "local-admin@example.test"),
|
|
)
|
|
parser.add_argument(
|
|
"--reset-password",
|
|
action="store_true",
|
|
help="已存在账号时也重置密码",
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
if not settings.DEBUG:
|
|
raise CommandError("init_local_admin 仅允许在 DJANGO_DEBUG=true 时运行")
|
|
|
|
username = options["username"].strip()
|
|
password = options["password"]
|
|
if not username or len(password) < 8:
|
|
raise CommandError("用户名不能为空,密码至少需要 8 个字符")
|
|
|
|
user, created = User.objects.get_or_create(
|
|
username=username,
|
|
defaults={
|
|
"nickname": "本地管理员",
|
|
"email": options["email"],
|
|
"is_staff": True,
|
|
"is_superuser": True,
|
|
"is_active": True,
|
|
},
|
|
)
|
|
changed_fields = []
|
|
for field in ("is_staff", "is_superuser", "is_active"):
|
|
if not getattr(user, field):
|
|
setattr(user, field, True)
|
|
changed_fields.append(field)
|
|
if not user.nickname:
|
|
user.nickname = "本地管理员"
|
|
changed_fields.append("nickname")
|
|
if created or options["reset_password"] or not user.has_usable_password():
|
|
user.set_password(password)
|
|
changed_fields.append("password")
|
|
if changed_fields:
|
|
user.save(update_fields=changed_fields)
|
|
|
|
action = "已创建" if created else "已确认"
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f"{action}本地管理员 {username};后台地址 http://127.0.0.1:8000/admin/"
|
|
)
|
|
)
|