from ninja import Router from core.models import AppUser from django.shortcuts import get_object_or_404 from ninja import Schema from typing import List, Optional from datetime import datetime router = Router() class UserSchema(Schema): id: int username: str email: str is_staff: bool is_superuser: bool is_active: bool date_joined: datetime class UserCreateSchema(Schema): username: str email: str password: str is_superuser: bool = False class UserUpdateSchema(Schema): username: Optional[str] = None email: Optional[str] = None is_active: Optional[bool] = None @router.get("/", response=List[UserSchema]) def list_users(request): return AppUser.objects.all() @router.get("/{user_id}", response=UserSchema) def get_user(request, user_id: int): return get_object_or_404(AppUser, id=user_id) @router.post("/", response={201: UserSchema}) def create_user(request, payload: UserCreateSchema): if payload.is_superuser: user = AppUser.objects.create_superuser(payload.username, payload.email, payload.password) else: user = AppUser.objects.create_user(payload.username, payload.email, payload.password) return 201, user @router.patch("/{user_id}", response=UserSchema) def update_user(request, user_id: int, payload: UserUpdateSchema): user = get_object_or_404(AppUser, id=user_id) for attr, value in payload.dict(exclude_unset=True).items(): setattr(user, attr, value) user.save() return user @router.delete("/{user_id}", response={204: None}) def delete_user(request, user_id: int): user = get_object_or_404(AppUser, id=user_id) user.delete() return 204, None