fix: 删除用户报错

This commit is contained in:
shaohuzhang1 2024-03-21 18:33:35 +08:00
parent ee270a8fa9
commit d59aac4a2a
5 changed files with 43 additions and 1 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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