From 91062dda27e06bf29eaa78eff47ba505ad19b7a2 Mon Sep 17 00:00:00 2001 From: zhaoqingang <zhaoqg0118@163.com> Date: 星期三, 18 十二月 2024 16:00:31 +0800 Subject: [PATCH] 机构接口优化 --- app/models/organization_model.py | 12 ++ app/service/organization.py | 63 ++++++++++++++- app/api/organization.py | 22 +++-- app/api/chat.py | 2 app/config/const.py | 10 ++ app/task/fetch_agent.py | 8 +- app/service/user.py | 73 ++++++++++------- 7 files changed, 136 insertions(+), 54 deletions(-) diff --git a/app/api/chat.py b/app/api/chat.py index 90c8b4a..a824acd 100644 --- a/app/api/chat.py +++ b/app/api/chat.py @@ -235,7 +235,7 @@ if not question: await websocket.send_json({"message": "Invalid request", "type": "error"}) continue - logger.error(agent.type) + # logger.error(agent.type) if chat_type == "questionTalk": try: diff --git a/app/api/organization.py b/app/api/organization.py index a660c16..eab77c7 100644 --- a/app/api/organization.py +++ b/app/api/organization.py @@ -1,11 +1,11 @@ from fastapi import APIRouter, Depends from app.api import Response, pwd_context, get_current_user -from app.models import DeptList, DeptInfo, DeptParent +from app.models import DeptList, DeptInfo, DeptParent, DeptStatus from app.models.base_model import get_db from app.models.user import PageParameter, UserStatus, UserInfo, LoginData from app.models.user_model import UserModel from app.service.organization import get_organization_list, create_dept, edit_dept_data, edit_dept_parent, \ - get_organization_info, delete_organization_info + get_organization_info, delete_organization_info, edit_organization_status dept_router = APIRouter() @@ -54,15 +54,17 @@ @dept_router.delete("/{deptId}", response_model=Response) async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): - is_edit = await delete_organization_info(db, deptId) - if not is_edit: - return Response(code=500, msg="dept delete failure", data={}) + msg = await delete_organization_info(db, deptId) + if msg: + return Response(code=400, msg=f"{msg}", data={}) return Response(code=200, msg="dept delete successfully", data={}) -@dept_router.delete("/{deptId}", response_model=Response) -async def delete_dept(deptId, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): - is_edit = await delete_organization_info(db, deptId) - if not is_edit: - return Response(code=500, msg="dept delete failure", data={}) +@dept_router.put("/status", response_model=Response) +async def edit_status_api(dept: DeptStatus, current_user: UserModel = Depends(get_current_user), db=Depends(get_db)): + if dept.status not in ["0", '1']: + return Response(code=400, msg="鏈煡鐘舵�侊紒", data={}) + msg = await edit_organization_status(db, dept.deptId, dept.status) + if msg: + return Response(code=400, msg=f"{msg}", data={}) return Response(code=200, msg="dept delete successfully", data={}) diff --git a/app/config/const.py b/app/config/const.py index 96f0829..800ebf0 100644 --- a/app/config/const.py +++ b/app/config/const.py @@ -22,4 +22,12 @@ USER_STATSU_ON = "1" USER_STATSU_OFF = "0" -Dialog_STATSU_DELETE = "2" \ No newline at end of file +Dialog_STATSU_DELETE = "2" + +DEPT_STATUS_DELETE = "2" +DEPT_STATUS_ON = "1" +DEPT_STATUS_OFF = "0" + +ROLE_STATUS_DELETE = "2" +ROLE_STATUS_ON = "1" +ROLE_STATUS_OFF = "0" \ No newline at end of file diff --git a/app/models/organization_model.py b/app/models/organization_model.py index 43a9354..b780496 100644 --- a/app/models/organization_model.py +++ b/app/models/organization_model.py @@ -5,6 +5,7 @@ from sqlalchemy import Column, Integer, String, Table, ForeignKey, DateTime from sqlalchemy.orm import relationship, backref +from app.config.const import DEPT_STATUS_DELETE from app.models.base_model import Base # organization_group_table = Table('organization_group', Base.metadata, @@ -29,7 +30,7 @@ leader = Column(String(255)) phone = Column(String(32)) email = Column(String(64)) - status = Column(String(10), nullable=False, default="0") + status = Column(String(10), nullable=False, default="1") # groups = relationship('GroupModel', # secondary=organization_group_table, @@ -65,7 +66,7 @@ 'roles': [self.role_json(role) for role in self.roles], # 'groups': [self.group_json(group) for group in self.groups], 'children': [ - org.to_json() for org in self.children + org.to_json() for org in self.children if org.status != DEPT_STATUS_DELETE ] } @@ -168,7 +169,7 @@ orderNum: int address: Optional[str] = "" parentId: Optional[str] = "" - status: str + status: Optional[str] = "" roles: Optional[list] = [] groups: Optional[list] = [] @@ -177,3 +178,8 @@ deptId: str parentId: str orderNum: int + + +class DeptStatus(BaseModel): + deptId: str + status: str \ No newline at end of file diff --git a/app/service/organization.py b/app/service/organization.py index 13b9d08..db4152c 100644 --- a/app/service/organization.py +++ b/app/service/organization.py @@ -1,6 +1,7 @@ import uuid from Log import logger +from app.config.const import DEPT_STATUS_DELETE, DEPT_STATUS_ON, DEPT_STATUS_OFF from app.models import OrganizationModel from app.models.role_model import RoleModel @@ -40,7 +41,7 @@ dept_model.address = address dept_model.phone = phone dept_model.leader = leader - dept_model.status = status + # dept_model.status = status dept_model.seq = order_num # if parent_id: # dept_model.parent = db.get(OrganizationModel, parent_id) @@ -75,15 +76,67 @@ async def get_organization_info(db, dept_id: str): dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first() - return {"total": 0, "data": dept.to_json()} + return {"total": 0, "data": dept.to_dict()} async def delete_organization_info(db, dept_id: str): + delete_list = [] + dept_list = [] + next_dept_list = [] + base_dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first() + dept_list.append(base_dept) + while dept_list: + for dept in dept_list: + delete_list.append(dept.id) + if dept.roles: + return "閮ㄩ棬锛歿}宸查厤缃鑹诧紝涓嶅厑璁稿垹闄わ紒".format(dept.name) + for child_dept in dept.children: + next_dept_list.append(child_dept) + + dept_list = next_dept_list + next_dept_list = [] + + try: - db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).delete() + db.query(OrganizationModel).filter(OrganizationModel.id.in_(delete_list)).update({"status": DEPT_STATUS_DELETE}) db.commit() except Exception as e: logger.error(e) db.rollback() - return False - return True \ No newline at end of file + return '鏈嶅姟寮傚父 锛�' + return "" + + +async def edit_organization_status(db, dept_id: str, status:str): + delete_list = [] + dept_list = [] + next_dept_list = [] + base_dept = db.query(OrganizationModel).filter(OrganizationModel.id.__eq__(dept_id)).first() + if status == DEPT_STATUS_ON: + try: + base_dept.status=status + db.commit() + except Exception as e: + logger.error(e) + db.rollback() + return '鏈嶅姟寮傚父 锛�' + else: + dept_list.append(base_dept) + while dept_list: + for dept in dept_list: + delete_list.append(dept.id) + if dept.roles: + return "閮ㄩ棬锛歿}宸查厤缃鑹诧紝涓嶅厑璁革紒".format(dept.name) + for child_dept in dept.children: + next_dept_list.append(child_dept) + + dept_list = next_dept_list + next_dept_list = [] + try: + db.query(OrganizationModel).filter(OrganizationModel.id.in_(delete_list)).update({"status": DEPT_STATUS_OFF}) + db.commit() + except Exception as e: + logger.error(e) + db.rollback() + return '鏈嶅姟寮傚父 锛�' + return "" \ No newline at end of file diff --git a/app/service/user.py b/app/service/user.py index 09a82ad..0cf305c 100644 --- a/app/service/user.py +++ b/app/service/user.py @@ -4,8 +4,9 @@ from app.api import pwd_context from app.api.dialog import dialog_list from app.config.config import settings -from app.config.const import RAGFLOW, BISHENG, DIFY, USER_STATSU_DELETE -from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel, OrganizationModel +from app.config.const import RAGFLOW, BISHENG, DIFY, USER_STATSU_DELETE, ROLE_STATUS_ON, DEPT_STATUS_ON +from app.models import RoleModel, GroupModel, AgentType, role_resource_table, DialogModel, OrganizationModel, \ + ResourceModel from app.models.menu_model import WebMenuModel, MenuCapacityModel from app.models.user_model import UserModel, UserAppModel from Log import logger @@ -168,6 +169,8 @@ user = db.query(UserModel).filter(UserModel.id==user_id,UserModel.status !=USER_STATSU_DELETE).first() await role_resource(role_set, roles, permissions, user.roles) for ogt in user.organizations: + if ogt.status != DEPT_STATUS_ON: + continue dept.append(ogt.to_json()) if ogt.roles: await role_resource(role_set, roles, permissions, user.roles) @@ -185,11 +188,11 @@ async def role_resource(role_set, role_list, permissions, roles): for role in roles: - if role.id not in role_set: + if role.id not in role_set and role.status == ROLE_STATUS_ON: role_set.add(role.id) role_list.append(role.to_dict()) for r in role.resources: - if r.resource_type_id == "1": + if r.resource_type_id == "1" and r.status==DEPT_STATUS_ON: permissions.add(r.perms) @@ -199,33 +202,43 @@ dept_set = set() user = db.query(UserModel).filter_by(id=user_id).first() parent_id = "" - - async def role_resource(role_set, permissions, roles): - nonlocal parent_id - for role in roles: - if role.id not in role_set: - role_set.add(role.id) - - for r in role.resources: - if r.resource_type_id != "1": - if not r.resource_id: - parent_id = r.id - continue - permissions[r.id] = r.to_router_dict() - - await role_resource(role_set, permissions, user.roles) - for ogt in user.organizations: - if ogt.roles: - await role_resource(role_set, permissions, user.roles) - parent_ogt = ogt.parent - while parent_ogt: - if parent_ogt.id not in dept_set: - await role_resource(role_set, permissions, parent_ogt.roles) - dept_set.add(parent_ogt.id) - parent_ogt = parent_ogt.parent - else: - break tmp_dit = {} + if user.permission == "admin": + dept_list = db.query(ResourceModel).filter(ResourceModel.status==DEPT_STATUS_ON, ResourceModel.resource_type_id != "1").all() + for dept in dept_list: + if not dept.resource_id: + parent_id = dept.id + continue + permissions[dept.id] = dept.to_router_dict() + else: + async def role_resource(role_set, permissions, roles): + nonlocal parent_id + for role in roles: + if role.id not in role_set and role.status == ROLE_STATUS_ON: + role_set.add(role.id) + + for r in role.resources: + if r.resource_type_id != "1" and r.status==DEPT_STATUS_ON: + if not r.resource_id: + parent_id = r.id + continue + permissions[r.id] = r.to_router_dict() + + await role_resource(role_set, permissions, user.roles) + for ogt in user.organizations: + if ogt.status != DEPT_STATUS_ON: + continue + if ogt.roles: + await role_resource(role_set, permissions, user.roles) + parent_ogt = ogt.parent + while parent_ogt: + if parent_ogt.id not in dept_set: + await role_resource(role_set, permissions, parent_ogt.roles) + dept_set.add(parent_ogt.id) + parent_ogt = parent_ogt.parent + else: + break + for permission in permissions.values(): tmp_dit[permission["parentId"]] = tmp_dit.get(permission["parentId"], []) + [permission] diff --git a/app/task/fetch_agent.py b/app/task/fetch_agent.py index ea9a2e6..6373653 100644 --- a/app/task/fetch_agent.py +++ b/app/task/fetch_agent.py @@ -318,9 +318,9 @@ dify_data = get_data_from_dify_v2([]) if dify_data: update_ids_in_local_v2(dify_data, "4") - print("Agents synchronized successfully") + print("v2 Agents synchronized successfully") except Exception as e: - print(f"Failed to sync agents: {str(e)}") + print(f"v2 Failed to sync agents: {str(e)}") def update_ids_in_local_knowledge(data, klg_type): type_dict = {"1": RAGFLOW, "2": BISHENG, "4": DIFY} @@ -380,9 +380,9 @@ # elif app["id"] == DIFY: # dify_data = get_data_from_dify_v2([]) # update_ids_in_local_v2(dify_data, "4") - print("Agents synchronized successfully") + print("sync knowledge successfully") except Exception as e: - print(f"Failed to sync agents: {str(e)}") + print(f"Failed to sync knowledge: {str(e)}") if __name__ == "__main__": -- Gitblit v1.8.0