diff --git a/backend/app/admin/crud/crud_data_scope.py b/backend/app/admin/crud/crud_data_scope.py index ccbf409d..cd05586b 100644 --- a/backend/app/admin/crud/crud_data_scope.py +++ b/backend/app/admin/crud/crud_data_scope.py @@ -117,11 +117,13 @@ class CRUDDataScope(CRUDPlus[DataScope]): data_scope_rule_stmt = delete(data_scope_rule).where(data_scope_rule.c.data_scope_id == pk) await db.execute(data_scope_rule_stmt) - data_scope_rule_data = [ - CreateDataScopeRuleParam(data_scope_id=pk, data_rule_id=rule_id).model_dump() for rule_id in rule_ids.rules - ] - data_scope_rule_stmt = insert(data_scope_rule) - await db.execute(data_scope_rule_stmt, data_scope_rule_data) + if rule_ids.rules: + data_scope_rule_data = [ + CreateDataScopeRuleParam(data_scope_id=pk, data_rule_id=rule_id).model_dump() + for rule_id in rule_ids.rules + ] + data_scope_rule_stmt = insert(data_scope_rule) + await db.execute(data_scope_rule_stmt, data_scope_rule_data) return len(rule_ids.rules) diff --git a/backend/app/admin/crud/crud_role.py b/backend/app/admin/crud/crud_role.py index 775b5916..2a6b38bf 100644 --- a/backend/app/admin/crud/crud_role.py +++ b/backend/app/admin/crud/crud_role.py @@ -135,11 +135,12 @@ class CRUDRole(CRUDPlus[Role]): role_menu_stmt = delete(role_menu).where(role_menu.c.role_id == role_id) await db.execute(role_menu_stmt) - role_menu_data = [ - CreateRoleMenuParam(role_id=role_id, menu_id=menu_id).model_dump() for menu_id in menu_ids.menus - ] - role_menu_stmt = insert(role_menu) - await db.execute(role_menu_stmt, role_menu_data) + if menu_ids.menus: + role_menu_data = [ + CreateRoleMenuParam(role_id=role_id, menu_id=menu_id).model_dump() for menu_id in menu_ids.menus + ] + role_menu_stmt = insert(role_menu) + await db.execute(role_menu_stmt, role_menu_data) return len(menu_ids.menus) @@ -156,11 +157,13 @@ class CRUDRole(CRUDPlus[Role]): role_scope_stmt = delete(role_data_scope).where(role_data_scope.c.role_id == role_id) await db.execute(role_scope_stmt) - role_scope_data = [ - CreateRoleScopeParam(role_id=role_id, data_scope_id=scope_id).model_dump() for scope_id in scope_ids.scopes - ] - role_scope_stmt = insert(role_data_scope) - await db.execute(role_scope_stmt, role_scope_data) + if scope_ids.scopes: + role_scope_data = [ + CreateRoleScopeParam(role_id=role_id, data_scope_id=scope_id).model_dump() + for scope_id in scope_ids.scopes + ] + role_scope_stmt = insert(role_data_scope) + await db.execute(role_scope_stmt, role_scope_data) return len(scope_ids.scopes) diff --git a/backend/app/admin/crud/crud_user.py b/backend/app/admin/crud/crud_user.py index 65d7c6c7..4eb6a955 100644 --- a/backend/app/admin/crud/crud_user.py +++ b/backend/app/admin/crud/crud_user.py @@ -122,13 +122,14 @@ class CRUDUser(CRUDPlus[User]): db.add(new_user) await db.flush() - role_stmt = select(Role).where(Role.id.in_(obj.roles)) - result = await db.execute(role_stmt) - roles = result.scalars().all() + if obj.roles: + role_stmt = select(Role).where(Role.id.in_(obj.roles)) + result = await db.execute(role_stmt) + roles = result.scalars().all() - user_role_data = [AddUserRoleParam(user_id=new_user.id, role_id=role.id).model_dump() for role in roles] - user_role_stmt = insert(user_role) - await db.execute(user_role_stmt, user_role_data) + user_role_data = [AddUserRoleParam(user_id=new_user.id, role_id=role.id).model_dump() for role in roles] + user_role_stmt = insert(user_role) + await db.execute(user_role_stmt, user_role_data) async def add_by_oauth2(self, db: AsyncSession, obj: AddOAuth2UserParam) -> None: """ @@ -165,16 +166,17 @@ class CRUDUser(CRUDPlus[User]): count = await self.update_model(db, user_id, obj) - role_stmt = select(Role).where(Role.id.in_(role_ids)) - result = await db.execute(role_stmt) - roles = result.scalars().all() - user_role_stmt = delete(user_role).where(user_role.c.user_id == user_id) await db.execute(user_role_stmt) - user_role_data = [AddUserRoleParam(user_id=user_id, role_id=role.id).model_dump() for role in roles] - user_role_stmt = insert(user_role) - await db.execute(user_role_stmt, user_role_data) + if role_ids: + role_stmt = select(Role).where(Role.id.in_(role_ids)) + result = await db.execute(role_stmt) + roles = result.scalars().all() + + user_role_data = [AddUserRoleParam(user_id=user_id, role_id=role.id).model_dump() for role in roles] + user_role_stmt = insert(user_role) + await db.execute(user_role_stmt, user_role_data) return count diff --git a/backend/app/admin/service/data_scope_service.py b/backend/app/admin/service/data_scope_service.py index 5ed739ff..70b054d0 100644 --- a/backend/app/admin/service/data_scope_service.py +++ b/backend/app/admin/service/data_scope_service.py @@ -3,6 +3,7 @@ from typing import Any from sqlalchemy.ext.asyncio import AsyncSession +from backend.app.admin.crud.crud_data_rule import data_rule_dao from backend.app.admin.crud.crud_data_scope import data_scope_dao from backend.app.admin.model import DataScope from backend.app.admin.schema.data_scope import ( @@ -117,6 +118,13 @@ class DataScopeService: :param rule_ids: 规则 ID 列表 :return: """ + data_scope = await data_scope_dao.get(db, pk) + if not data_scope: + raise errors.NotFoundError(msg='数据范围不存在') + for rule_id in rule_ids.rules: + rule = await data_rule_dao.get(db, rule_id) + if not rule: + raise errors.NotFoundError(msg='数据规则不存在') count = await data_scope_dao.update_rules(db, pk, rule_ids) await user_cache_manager.clear_by_data_scope_id(db, [pk]) return count