106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
from django.conf import settings
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib.auth.models import Group, Permission
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
from apps.accounts.menus import DEFAULT_MENUS
|
|
from apps.accounts.models import MenuItem, UserGroup
|
|
from apps.accounts.permissions import DEFAULT_GROUPS, PERMISSIONS
|
|
|
|
|
|
def seed_permissions() -> dict[str, Permission]:
|
|
content_type, _ = ContentType.objects.get_or_create(
|
|
app_label="system",
|
|
model="platformpermission",
|
|
)
|
|
|
|
permissions_by_codename: dict[str, Permission] = {}
|
|
for spec in PERMISSIONS:
|
|
permission, _ = Permission.objects.get_or_create(
|
|
content_type=content_type,
|
|
codename=spec.codename,
|
|
defaults={"name": spec.name},
|
|
)
|
|
if permission.name != spec.name:
|
|
permission.name = spec.name
|
|
permission.save(update_fields=["name"])
|
|
permissions_by_codename[spec.codename] = permission
|
|
return permissions_by_codename
|
|
|
|
|
|
def seed_roles(permissions_by_codename: dict[str, Permission]) -> None:
|
|
for group_name, codenames in DEFAULT_GROUPS.items():
|
|
group, _ = Group.objects.get_or_create(name=group_name)
|
|
group.permissions.set(permissions_by_codename[codename] for codename in codenames)
|
|
|
|
|
|
def seed_user_groups() -> None:
|
|
UserGroup.objects.update_or_create(
|
|
code="default",
|
|
defaults={
|
|
"name": "默认用户组",
|
|
"description": "系统初始化创建的默认业务用户组。",
|
|
"is_active": True,
|
|
},
|
|
)
|
|
|
|
|
|
def seed_menus() -> None:
|
|
menus_by_code: dict[str, MenuItem] = {}
|
|
for spec in DEFAULT_MENUS:
|
|
parent = menus_by_code.get(spec.parent_code) if spec.parent_code else None
|
|
menu, _ = MenuItem.objects.update_or_create(
|
|
code=spec.code,
|
|
defaults={
|
|
"title": spec.title,
|
|
"path": spec.path,
|
|
"icon": spec.icon,
|
|
"parent": parent,
|
|
"sort_order": spec.sort_order,
|
|
"permission_code": spec.permission_code,
|
|
"is_visible": spec.is_visible,
|
|
"is_enabled": spec.is_enabled,
|
|
},
|
|
)
|
|
menus_by_code[spec.code] = menu
|
|
|
|
|
|
def seed_admin_user() -> None:
|
|
username = getattr(settings, "DJANGO_SUPERUSER_USERNAME", None) or "admin"
|
|
password = getattr(settings, "DJANGO_SUPERUSER_PASSWORD", None) or "admin12345"
|
|
email = getattr(settings, "DJANGO_SUPERUSER_EMAIL", None) or "admin@example.com"
|
|
user_model = get_user_model()
|
|
user, created = user_model.objects.get_or_create(
|
|
username=username,
|
|
defaults={
|
|
"email": email,
|
|
"is_staff": True,
|
|
"is_superuser": True,
|
|
},
|
|
)
|
|
changed_fields: list[str] = []
|
|
if user.email != email:
|
|
user.email = email
|
|
changed_fields.append("email")
|
|
if not user.is_staff:
|
|
user.is_staff = True
|
|
changed_fields.append("is_staff")
|
|
if not user.is_superuser:
|
|
user.is_superuser = True
|
|
changed_fields.append("is_superuser")
|
|
if created or not user.check_password(password):
|
|
user.set_password(password)
|
|
changed_fields.append("password")
|
|
if changed_fields:
|
|
user.save(update_fields=changed_fields)
|
|
admin_role = Group.objects.get(name="系统管理员")
|
|
user.groups.add(admin_role)
|
|
|
|
|
|
def bootstrap_governance() -> None:
|
|
permissions_by_codename = seed_permissions()
|
|
seed_roles(permissions_by_codename)
|
|
seed_user_groups()
|
|
seed_menus()
|
|
seed_admin_user()
|