diff --git a/apps/common/event/listener_manage.py b/apps/common/event/listener_manage.py index eebc3d406..93613a02a 100644 --- a/apps/common/event/listener_manage.py +++ b/apps/common/event/listener_manage.py @@ -67,6 +67,7 @@ class ListenerManagement: sync_web_document_signal = signal('sync_web_document') update_problem_signal = signal('update_problem') delete_embedding_by_source_ids_signal = signal('delete_embedding_by_source_ids') + delete_embedding_by_dataset_id_list_signal = signal("delete_embedding_by_dataset_id_list") @staticmethod def embedding_by_problem(args): @@ -208,6 +209,10 @@ class ListenerManagement: def delete_embedding_by_source_ids(source_ids: List[str]): VectorStore.get_embedding_vector().delete_by_source_ids(source_ids, SourceType.PROBLEM) + @staticmethod + def delete_embedding_by_dataset_id_list(source_ids: List[str]): + VectorStore.get_embedding_vector().delete_by_dataset_id_list(source_ids) + @staticmethod @poxy def init_embedding_model(ags): @@ -248,3 +253,4 @@ class ListenerManagement: # 更新问题向量 ListenerManagement.update_problem_signal.connect(self.update_problem) ListenerManagement.delete_embedding_by_source_ids_signal.connect(self.delete_embedding_by_source_ids) + ListenerManagement.delete_embedding_by_dataset_id_list_signal.connect(self.delete_embedding_by_dataset_id_list) diff --git a/apps/dataset/serializers/dataset_serializers.py b/apps/dataset/serializers/dataset_serializers.py index 226502786..cdcca8ec6 100644 --- a/apps/dataset/serializers/dataset_serializers.py +++ b/apps/dataset/serializers/dataset_serializers.py @@ -588,6 +588,7 @@ class DataSetSerializers(serializers.ModelSerializer): self.is_valid() dataset = QuerySet(DataSet).get(id=self.data.get("id")) QuerySet(Document).filter(dataset=dataset).delete() + QuerySet(ProblemParagraphMapping).filter(dataset=dataset).delete() QuerySet(Paragraph).filter(dataset=dataset).delete() QuerySet(Problem).filter(dataset=dataset).delete() dataset.delete() diff --git a/apps/embedding/vector/base_vector.py b/apps/embedding/vector/base_vector.py index f12c49895..c031e1143 100644 --- a/apps/embedding/vector/base_vector.py +++ b/apps/embedding/vector/base_vector.py @@ -155,6 +155,10 @@ class BaseVectorStore(ABC): def delete_bu_document_id_list(self, document_id_list: List[str]): pass + @abstractmethod + def delete_by_dataset_id_list(self, dataset_id_list: List[str]): + pass + @abstractmethod def delete_by_source_id(self, source_id: str, source_type: str): pass diff --git a/apps/embedding/vector/pg_vector.py b/apps/embedding/vector/pg_vector.py index 3c539e707..6f9d25b2a 100644 --- a/apps/embedding/vector/pg_vector.py +++ b/apps/embedding/vector/pg_vector.py @@ -125,6 +125,9 @@ class PGVector(BaseVectorStore): def delete_by_dataset_id(self, dataset_id: str): QuerySet(Embedding).filter(dataset_id=dataset_id).delete() + def delete_by_dataset_id_list(self, dataset_id_list: List[str]): + QuerySet(Embedding).filter(dataset_id__in=dataset_id_list).delete() + def delete_by_document_id(self, document_id: str): QuerySet(Embedding).filter(document_id=document_id).delete() return True diff --git a/apps/users/serializers/user_serializers.py b/apps/users/serializers/user_serializers.py index 17e8c7f26..0c0adcff2 100644 --- a/apps/users/serializers/user_serializers.py +++ b/apps/users/serializers/user_serializers.py @@ -20,16 +20,19 @@ from django.db.models import Q, QuerySet from drf_yasg import openapi from rest_framework import serializers +from application.models import Application from common.constants.authentication_type import AuthenticationType from common.constants.exception_code_constants import ExceptionCodeConstants from common.constants.permission_constants import RoleConstants, get_permission_list_by_role from common.db.search import page_search +from common.event import ListenerManagement from common.exception.app_exception import AppApiException from common.mixins.api_mixin import ApiMixin from common.response.result import get_api_response from common.util.field_message import ErrMessage from common.util.lock import lock -from setting.models import Team, SystemSetting, SettingType +from dataset.models import DataSet, Document, Paragraph, Problem, ProblemParagraphMapping +from setting.models import Team, SystemSetting, SettingType, Model, TeamMember, TeamMemberPermission from smartdoc.conf import PROJECT_DIR from users.models.user import User, password_encrypt, get_user_dynamics_permission @@ -700,12 +703,37 @@ class UserManageSerializer(serializers.Serializer): if not QuerySet(User).filter(id=self.data.get('id')).exists(): raise AppApiException(1004, "用户不存在") + @transaction.atomic def delete(self, with_valid=True): if with_valid: self.is_valid(raise_exception=True) user = QuerySet(User).filter(id=self.data.get('id')).first() if user.role == RoleConstants.ADMIN.name: raise AppApiException(1004, "无法删除管理员") + user_id = self.data.get('id') + + team_member_list = QuerySet(TeamMember).filter(team_id=user_id) + # 删除团队成员权限 + QuerySet(TeamMemberPermission).filter( + member_id__in=[team_member.id for team_member in team_member_list]).delete() + # 删除团队成员 + team_member_list.delete() + # 删除应用相关 因为应用相关都是级联删除所以不需要手动删除 + QuerySet(Application).filter(user_id=self.data.get('id')).delete() + # 删除数据集相关 + dataset_list = QuerySet(DataSet).filter(user_id=self.data.get('id')) + dataset_id_list = [str(dataset.id) for dataset in dataset_list] + QuerySet(Document).filter(dataset_id__in=dataset_id_list).delete() + QuerySet(Paragraph).filter(dataset_id__in=dataset_id_list).delete() + QuerySet(ProblemParagraphMapping).filter(dataset_id__in=dataset_id_list).delete() + QuerySet(Problem).filter(dataset_id__in=dataset_id_list).delete() + ListenerManagement.delete_embedding_by_dataset_id_list_signal.send(dataset_id_list) + dataset_list.delete() + # 删除团队 + QuerySet(Team).filter(user_id=self.data.get('id')).delete() + # 删除模型 + QuerySet(Model).filter(user_id=self.data.get('id')).delete() + # 删除用户 QuerySet(User).filter(id=self.data.get('id')).delete() return True