You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.0 KiB

3 years ago
# !/usr/bin/env python3
# -*- encoding : utf-8 -*-
# @Filename : role.py
# @Software : VSCode
# @Datetime : 2021/11/15 21:25:46
# @Author : leo liu
# @Version : 1.0
# @Description :
from loguru import logger
from pydantic.types import conint
from sqlalchemy import func, desc
from sqlalchemy.orm import Session
from sqlalchemy.sql.expression import and_, or_
from extensions.curd_base import CRUDBase
from models import Role, user_role, role_menu
from .menu import crud_menu
from ..schemas import role_schema
class CRUDRole(CRUDBase[Role, role_schema.RoleCreate, role_schema.RoleUpdate]):
@staticmethod
def query_all(db: Session, *, col_val: str = "", is_delete: int = 0, page: int = 0, page_size: conint(le=50) = 20, order_by: str = "id", is_desc: bool = False) -> dict:
"""
查询角色列表
:param db:
:param col_val: 输入模糊查询参数值对应usernamenickname和email
:param is_delete: 输入参数值是否逻辑删除
:param page: 输入参数值分页页号为0时不分页
:param page_size: 输入参数值分页页宽page=0时无效
:param order_by: 输入参数值排序字段
:param is_desc: 排序顺序true为ascfalse为desc
:return: Role字典
"""
temp_page = (page - 1) * page_size
search = None
order_type = None
# 处理多个字段的模糊查询name
if col_val:
search = and_(Role.is_delete == is_delete, or_(Role.name.like('%' + col_val + "%"), Role.title.like('%' + col_val + "%")))
else:
search = Role.is_delete == is_delete
# 处理排序方式
# 利用属性名反射类属性
if is_desc:
order_type = desc(Role.getAttrFromName(Role, order_by))
else:
order_type = Role.getAttrFromName(Role, order_by)
# 查询数量
total = db.query(func.count(Role.role_id)).filter(search).scalar()
# 查询结果集
if page > 0:
query_obj = db.query(Role).filter(search).order_by(order_type).offset(temp_page).limit(page_size).all()
else:
query_obj = db.query(Role).filter(search).order_by(order_type).all()
items = [{
"id": obj.id,
"role_id": obj.role_id,
"name": obj.name,
"title": obj.title,
"menus": obj.menus,
"create_time": obj.create_time,
"is_delete": obj.is_delete,
"update_time": obj.update_time
} for obj in query_obj]
return {
"items": items,
"total": total
}
@staticmethod
def get_by_id(db: Session, *, role_id: str) -> Role:
return db.query(Role).filter(Role.role_id == role_id).first()
@staticmethod
def is_exist(db: Session, role_in: role_schema.BaseRole) -> bool:
role = db.query(Role).filter(or_(
Role.role_id == role_in.role_id,
Role.name == role_in.name,
Role.title == role_in.title
)).first()
if role:
return True
else:
return False
@staticmethod
def update(db: Session, *, obj_in: role_schema.RoleUpdate) -> Role:
db_obj = db.query(Role).filter(Role.role_id == obj_in.role_id).first()
if db_obj:
if (obj_in.title):
db_obj.title = obj_in.title
if (obj_in.menus):
db_obj.menus.clear()
for m in obj_in.menus:
menu = crud_menu.get_by_path(db, path=m['path'])
if (menu):
db_obj.menus.append(menu)
db_obj.is_delete = obj_in.is_delete
if (obj_in.is_delete):
db.query(user_role).filter(user_role.c.role_id == db_obj.role_id).delete()
db.query(role_menu).filter(role_menu.c.role_id == db_obj.role_id).delete()
db.commit()
db.refresh(db_obj)
return db_obj
crud_role = CRUDRole(Role)