diff --git a/users/schema.py b/users/schema.py index d3b1afc..8a3dfe6 100644 --- a/users/schema.py +++ b/users/schema.py @@ -2,7 +2,53 @@ from datetime import datetime from typing import List, Optional -from ninja import Schema +from ninja import Schema, ModelSchema + +from users.models import User + + +# ========== 用户 Schema ========== + + +class UserOut(Schema): + id: int + username: str + cname: Optional[str] = None + phone: Optional[str] = None + email: Optional[str] = None + avatar: Optional[str] = None + + # dept: Optional[int] = None + # roles: List[int] = [] + + is_active: bool + is_staff: bool + is_superuser: bool + + last_login: Optional[datetime] = None + date_joined: datetime + + +class UserCreate(Schema): + username: str + password: str + cname: Optional[str] = None + phone: Optional[str] = None + email: Optional[str] = None + dept: Optional[int] = None + roles: List[int] = [] + is_active: bool = True + + +class UserUpdate(Schema): + username: Optional[str] + password: Optional[str] + cname: Optional[str] + phone: Optional[str] + email: Optional[str] + dept: Optional[int] + roles: Optional[List[int]] + is_active: Optional[bool] # ========== 菜单 Schema ========== diff --git a/users/users.py b/users/users.py new file mode 100644 index 0000000..802a2b8 --- /dev/null +++ b/users/users.py @@ -0,0 +1,94 @@ +from typing import List + +from django.db.models import Prefetch +from django.shortcuts import get_object_or_404 +from ninja import Router +from ninja.pagination import paginate, PageNumberPagination + +from users.models import User, Role +from users.schema import UserUpdate, UserOut, UserCreate + +router = Router(tags=['users']) + + +@router.get("/", response=List[UserOut], summary="获取用户列表") +@paginate(PageNumberPagination, page_size=20) +def list_users(request): + # if not has_permission(request.auth.id, "user:list"): + # raise HttpError(403, "权限不足") + return User.objects.all() + + +@router.get("/", response=dict) +def list_users(request, page: int = 1, page_size: int = 10, username: str = None): + qs = User.objects.all().order_by("-id") + + if username: + qs = qs.filter(username__icontains=username) + + total = qs.count() + start = (page - 1) * page_size + end = start + page_size + + items = list(qs[start:end].values( + "id", "username", "cname", "phone", "email", + "avatar", "dept", + "is_active", "is_staff", "is_superuser", + "last_login", "date_joined" + )) + + # roles 需要手动补 + for i, obj in enumerate(qs[start:end]): + items[i]["roles"] = list(obj.roles.values_list("id", flat=True)) + + return {"items": items, "count": total} + + +@router.get("/{id}", response=UserOut) +def get_user(request, id: int): + obj = get_object_or_404(User, id=id) + data = obj.__dict__ + data["roles"] = list(obj.roles.values_list("id", flat=True)) + return data + + +@router.post("/", response=UserOut) +def create_user(request, data: UserCreate): + user = User.objects.create_user( + username=data.username, + password=data.password + ) + + for k, v in data.dict(exclude={"password"}).items(): + setattr(user, k, v) + + user.save() + + if data.roles: + user.roles.set(data.roles) + + return user + + +@router.put("/{id}") +def update_user(request, id: int, data: UserUpdate): + user = get_object_or_404(User, id=id) + + if data.password: + user.set_password(data.password) + + for k, v in data.dict(exclude_unset=True, exclude={"password", "roles"}).items(): + setattr(user, k, v) + + user.save() + + if data.roles is not None: + user.roles.set(data.roles) + + return {"success": True} + + +@router.delete("/{id}") +def delete_user(request, id: int): + User.objects.filter(id=id).delete() + return {"success": True} diff --git a/users/views.py b/users/views.py index 29dc042..07c946d 100644 --- a/users/views.py +++ b/users/views.py @@ -1,4 +1,5 @@ from ninja import Router +from .users import router as users_router from .menus import router as menu_router from .roles import router as role_router from .permissions import router as perm_router @@ -7,6 +8,7 @@ from .departments import router as dept_router # Create your views here. router = Router(tags=['users']) +router.add_router("/users", users_router) # 用户基础接口 router.add_router("/perms", perm_router) # 用户基础接口 router.add_router("/menus", menu_router) # /menus/ router.add_router("/roles", role_router) # /roles/