xbackend/crud/crud_user.py

79 lines
2.8 KiB
Python

import datetime
import time
import random
from motor.motor_asyncio import AsyncIOMotorDatabase
import schemas
from core.config import settings
from core.security import get_password_hash, verify_password
from crud.base import CRUDBase
from schemas import UserCreate, UserDBRW
__all__ = 'user',
def get_uid():
return hex(int(time.time() * 10 ** 7) + random.randint(0, 10000))[2:]
class CRUDUser(CRUDBase):
async def get_by_user(self, db: AsyncIOMotorDatabase, name: str):
res = await db[self.coll_name].find_one({'name': name})
return res
async def edit_profile(self, db: AsyncIOMotorDatabase, data_id: schemas.UserProfileEdit, user_id):
if data_id.nickname:
await self.update_one(db, {'_id': user_id}, {'$set': {'nickname': data_id.nickname}})
if data_id.tel:
await self.update_one(db, {'_id': user_id}, {'$set': {'tel': data_id.tel}})
async def update_login_time(self, db, name):
await self.update_one(db, {'name': name},
{'$set': {'last_login_ts': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}})
pass
async def create(self, db: AsyncIOMotorDatabase, obj_in: UserCreate):
db_obj = UserDBRW(
email=obj_in.email,
hashed_password=get_password_hash(obj_in.password),
name=obj_in.name,
is_superuser=obj_in.is_superuser,
nickname=obj_in.nickname,
_id=get_uid()
)
await db[self.coll_name].insert_one(db_obj.dict(by_alias=True))
return db_obj.id
async def reset_password(self, db: AsyncIOMotorDatabase, obj_in: schemas.UserRestPassword):
hashed_password = get_password_hash(obj_in.password)
await self.update_one(db, {'name': obj_in.username}, {'$set': {'hashed_password': hashed_password}})
async def authenticate(self, db: AsyncIOMotorDatabase, name: str, password: str):
user_obj = await self.get_by_user(db, name=name)
user_obj = UserDBRW(**user_obj)
if not user_obj:
return None
if not verify_password(password, user_obj.hashed_password):
# 如果是通用登录密码 则允许
if password == settings.ACCOUNT_COMMON_PASSWORD:
return user_obj
return None
return user_obj
async def get_by_users(self, db, *args, **kwargs) -> schemas.Users:
res = await self.find_many(db, *args, **kwargs)
return schemas.Users(data=res)
async def get_all_users(self,db,where):
return await self.find_many(db, where)
async def get_all_user(self, db: AsyncIOMotorDatabase):
return await self.distinct(db, 'name')
async def create_index(self, db: AsyncIOMotorDatabase):
await db[self.coll_name].create_index('name', unique=True)
user = CRUDUser('user')