|
| 1 | +# coding=utf-8 |
| 2 | + |
| 3 | +from typing import Dict |
| 4 | + |
| 5 | +import uuid_utils.compat as uuid |
| 6 | +from django.db import transaction |
| 7 | +from django.db.models import QuerySet |
| 8 | +from django.utils.translation import gettext_lazy as _ |
| 9 | +from rest_framework import serializers |
| 10 | + |
| 11 | +from common.exception.app_exception import AppApiException |
| 12 | +from knowledge.models import KnowledgeScope, Knowledge, KnowledgeType, KnowledgeWorkflow |
| 13 | +from knowledge.serializers.knowledge import KnowledgeModelSerializer |
| 14 | +from system_manage.models import AuthTargetType |
| 15 | +from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer |
| 16 | + |
| 17 | + |
| 18 | +class KnowledgeWorkflowSerializer(serializers.Serializer): |
| 19 | + class Create(serializers.Serializer): |
| 20 | + user_id = serializers.UUIDField(required=True, label=_('user id')) |
| 21 | + workspace_id = serializers.CharField(required=True, label=_('workspace id')) |
| 22 | + scope = serializers.ChoiceField( |
| 23 | + required=False, label=_('scope'), default=KnowledgeScope.WORKSPACE, choices=KnowledgeScope.choices |
| 24 | + ) |
| 25 | + |
| 26 | + @transaction.atomic |
| 27 | + def save_workflow(self, instance: Dict): |
| 28 | + self.is_valid(raise_exception=True) |
| 29 | + |
| 30 | + folder_id = instance.get('folder_id', self.data.get('workspace_id')) |
| 31 | + if QuerySet(Knowledge).filter( |
| 32 | + workspace_id=self.data.get('workspace_id'), folder_id=folder_id, name=instance.get('name') |
| 33 | + ).exists(): |
| 34 | + raise AppApiException(500, _('Knowledge base name duplicate!')) |
| 35 | + |
| 36 | + knowledge_id = uuid.uuid7() |
| 37 | + knowledge = Knowledge( |
| 38 | + id=knowledge_id, |
| 39 | + name=instance.get('name'), |
| 40 | + desc=instance.get('desc'), |
| 41 | + user_id=self.data.get('user_id'), |
| 42 | + type=instance.get('type', KnowledgeType.WORKFLOW), |
| 43 | + scope=self.data.get('scope', KnowledgeScope.WORKSPACE), |
| 44 | + folder_id=folder_id, |
| 45 | + workspace_id=self.data.get('workspace_id'), |
| 46 | + embedding_model_id=instance.get('embedding_model_id'), |
| 47 | + meta={}, |
| 48 | + ) |
| 49 | + knowledge.save() |
| 50 | + # 自动资源给授权当前用户 |
| 51 | + UserResourcePermissionSerializer(data={ |
| 52 | + 'workspace_id': self.data.get('workspace_id'), |
| 53 | + 'user_id': self.data.get('user_id'), |
| 54 | + 'auth_target_type': AuthTargetType.KNOWLEDGE.value |
| 55 | + }).auth_resource(str(knowledge_id)) |
| 56 | + |
| 57 | + knowledge_workflow = KnowledgeWorkflow( |
| 58 | + id=uuid.uuid7(), |
| 59 | + knowledge_id=knowledge_id, |
| 60 | + workspace_id=self.data.get('workspace_id'), |
| 61 | + work_flow=instance.get('work_flow', {}), |
| 62 | + |
| 63 | + ) |
| 64 | + |
| 65 | + knowledge_workflow.save() |
| 66 | + |
| 67 | + return {**KnowledgeModelSerializer(knowledge).data, 'document_list': []} |
0 commit comments