# !/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: 输入模糊查询参数值,对应username、nickname和email :param is_delete: 输入参数值,是否逻辑删除 :param page: 输入参数值,分页页号,为0时不分页 :param page_size: 输入参数值,分页页宽,page=0时无效 :param order_by: 输入参数值,排序字段 :param is_desc: 排序顺序,true为asc,false为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)