116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
|
|
from apps.user.models import Users
|
|||
|
|
from django.contrib.auth.models import Group
|
|||
|
|
from ninja_schema import ModelSchema, model_validator, Schema
|
|||
|
|
from ninja_extra.exceptions import APIException
|
|||
|
|
from ninja_extra import status
|
|||
|
|
from datetime import datetime
|
|||
|
|
from typing import List
|
|||
|
|
from ninja import Field
|
|||
|
|
|
|||
|
|
UserModel = Users
|
|||
|
|
|
|||
|
|
# 定义用户名异常
|
|||
|
|
class UsernameException(APIException):
|
|||
|
|
status_code = status.HTTP_400_BAD_REQUEST
|
|||
|
|
default_detail = "用户名已存在,注册失败"
|
|||
|
|
default_code = 400
|
|||
|
|
|
|||
|
|
class GroupSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
# 因为保证唯一性,所以ninja_schema使用set集合
|
|||
|
|
model = Group
|
|||
|
|
# 注意ninja_schema(include)和ninja(model_fields)
|
|||
|
|
include = ("name",)
|
|||
|
|
|
|||
|
|
# schema:作用于创建用户请求
|
|||
|
|
class CreateUserSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
include = ('username', 'name', 'password', 'phone', 'status',)
|
|||
|
|
|
|||
|
|
# username判重
|
|||
|
|
@model_validator("username")
|
|||
|
|
@classmethod
|
|||
|
|
def unique_username(cls, value):
|
|||
|
|
if UserModel.objects.filter(username__icontains=value).exists():
|
|||
|
|
raise UsernameException()
|
|||
|
|
return value
|
|||
|
|
|
|||
|
|
def create(self):
|
|||
|
|
# 注意这里使用exclude_none,dict()方式属于pydantic
|
|||
|
|
return UserModel.objects.create_user(**self.dict(exclude_none=True), email='xxx@qq.com')
|
|||
|
|
|
|||
|
|
# schema:作用于创建用户后response
|
|||
|
|
class CreateUserOutSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
exclude = ('password',)
|
|||
|
|
|
|||
|
|
# schema:定义前端查询用户信息的输出
|
|||
|
|
class UserInfoOutSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
exclude = ("password",)
|
|||
|
|
|
|||
|
|
# schema:作用于用户检索以及其他
|
|||
|
|
class UserRetrieveInputSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
include = ("name", "username", "phone", "status",)
|
|||
|
|
# ninja_schema的可选字段
|
|||
|
|
optional = ("name", "username", "phone", "status",)
|
|||
|
|
|
|||
|
|
# schema:作用于检索后的输出定义
|
|||
|
|
class UserRetrieveOutSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
exclude = ("password",)
|
|||
|
|
|
|||
|
|
# 删除和更新用户
|
|||
|
|
class UpdateDeleteUserSchema(ModelSchema):
|
|||
|
|
class Config:
|
|||
|
|
model = UserModel
|
|||
|
|
include = ("name", "username", "phone", "status")
|
|||
|
|
|
|||
|
|
def validate_unique_username(self, id: int):
|
|||
|
|
user_filters = UserModel.objects.filter(username=self.username)
|
|||
|
|
if len(user_filters) > 1:
|
|||
|
|
raise UsernameException()
|
|||
|
|
elif len(user_filters) == 1:
|
|||
|
|
if user_filters[0].id == id:
|
|||
|
|
return
|
|||
|
|
else:
|
|||
|
|
raise UsernameException()
|
|||
|
|
else:
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
class UpdateDeleteUserOutSchema(Schema):
|
|||
|
|
message: str
|
|||
|
|
|
|||
|
|
class DeleteUserSchema(Schema):
|
|||
|
|
ids: List[int]
|
|||
|
|
|
|||
|
|
# ~~~~~~~~~~~~~~~~~~~~日志schema~~~~~~~~~~~~~~~~~~~~
|
|||
|
|
# 操作日志的schema
|
|||
|
|
class LogOutSchema(Schema):
|
|||
|
|
id: int
|
|||
|
|
user: str = Field(..., alias='user__username')
|
|||
|
|
operate_obj: str
|
|||
|
|
create_datetime: datetime
|
|||
|
|
operate_des: str
|
|||
|
|
|
|||
|
|
# 操作日志的查询
|
|||
|
|
class LogInputSchema(Schema):
|
|||
|
|
user: str = Field("", alias='user')
|
|||
|
|
create_datetime: List = ['2000-01-01', '9999-01-01']
|
|||
|
|
|
|||
|
|
# 操作日志的删除输入
|
|||
|
|
class LogDeleteInSchema(Schema):
|
|||
|
|
day: int = Field(7, ge=0, description='删除多少天前的数据')
|
|||
|
|
|
|||
|
|
# 管理员修改密码
|
|||
|
|
class AdminModifyPasswordSchema(Schema):
|
|||
|
|
newPassword: str
|
|||
|
|
newPassword_confirmation: str
|
|||
|
|
oldPassword: str
|