from tortoise import fields, models from tortoise.indexes import Index from tortoise.contrib.pydantic import pydantic_model_creator from tortoise.signals import post_save from typing import Type from helper.tools import genRandomStr class User(models.Model): id = fields.UUIDField(pk=True) username = fields.CharField(max_length=255, description='账号') name = fields.CharField(max_length=255, description='姓名') phone = fields.CharField(null=True, description="手机号", max_length=11) email = fields.CharField(max_length=255, null=True, description='邮箱') created_at = fields.DatetimeField(auto_now_add=True) updated_at = fields.DatetimeField(auto_now=True) tag = fields.CharField(max_length=255, null=True, description='标签') level = fields.IntField(default=1, description='账号等级') is_admin = fields.BooleanField(default=False, description='管理员账号') is_staff = fields.BooleanField(default=False, description='员工账号') is_locked = fields.BooleanField(default=False, description='是否锁定') is_valid = fields.BooleanField(default=False, description='是否有效') is_active = fields.BooleanField(default=False, description='是否删除') class PydanticMeta: # Let's exclude the created timestamp exclude = ("created_at",) class Meta: table = 'users' table_description = '用户表' indexes = [ Index(fields={"username"}, name="usernameidx"), Index(fields={"name"}, name="nameidx"), Index(fields={"phone"}, name="phoneidx"), Index(fields={"email"}, name="emailidx"), Index(fields={"is_admin"}, name="is_adminidx"), Index(fields={"is_staff"}, name="is_staffidx"), Index(fields={"is_locked"}, name="is_lockedidx"), Index(fields={"is_valid"}, name="is_valididx"), Index(fields={"is_active"}, name="is_activeidx"), ] def as_json(self): return dict(id="{}".format(self.id), username=self.username, name=self.name, is_locked=self.is_locked, phone=self.phone, email=self.email) def __str__(self): return f'User(id={self.id} username={self.username}, name={self.name}, is_locked={self.is_locked})' @property def nickname(self): '''用户昵称''' return self.name or self.username User_Pydantic = pydantic_model_creator(User, name="User") # # UserIn_Pydantic = pydantic_model_creator(User, name="UserIn", exclude=("is_active", "is_valid")) # UserIn_Pydantic = pydantic_model_creator(User, name="UserIn") # @post_save(User) # async def user_post_save( # sender: "Type[User]", # instance: User, # created, # using_db, # update_fields, # ) -> None: # if not instance.email or "null" == instance.email: # print("instance.email: ", instance.email) # # check duplicated num # async def checkNum(): # email = genRandomStr(4) # print("new Email: ", email) # if await User.filter(email = email).exists(): # print("Email exist, ", email) # checkNum() # else: # print("Email not exist, ", email) # instance.email = email # await instance.save() # await checkNum()