Skip to content

Commit 8aa2c14

Browse files
committed
feat: add workspace validation for knowledge id across serializers
1 parent 337461b commit 8aa2c14

File tree

5 files changed

+171
-5
lines changed

5 files changed

+171
-5
lines changed

apps/knowledge/serializers/document.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,20 @@ class Migrate(serializers.Serializer):
259259
document_id_list = serializers.ListField(required=True, label=_('document list'),
260260
child=serializers.UUIDField(required=True, label=_('document id')))
261261

262+
def is_valid(self, *, raise_exception=False):
263+
super().is_valid(raise_exception=True)
264+
workspace_id = self.data.get('workspace_id')
265+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
266+
if workspace_id:
267+
query_set = query_set.filter(workspace_id=workspace_id)
268+
if not query_set.exists():
269+
raise AppApiException(500, _('Knowledge id does not exist'))
270+
query_set = QuerySet(Knowledge).filter(id=self.data.get('target_knowledge_id'))
271+
if workspace_id:
272+
query_set = query_set.filter(workspace_id=workspace_id)
273+
if not query_set.exists():
274+
raise AppApiException(500, _('Knowledge id does not exist'))
275+
262276
@transaction.atomic
263277
def migrate(self, with_valid=True):
264278
if with_valid:
@@ -416,6 +430,12 @@ class Sync(serializers.Serializer):
416430

417431
def is_valid(self, *, raise_exception=False):
418432
super().is_valid(raise_exception=True)
433+
workspace_id = self.data.get('workspace_id')
434+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
435+
if workspace_id:
436+
query_set = query_set.filter(workspace_id=workspace_id)
437+
if not query_set.exists():
438+
raise AppApiException(500, _('Knowledge id does not exist'))
419439
document_id = self.data.get('document_id')
420440
first = QuerySet(Document).filter(id=document_id).first()
421441
if first is None:
@@ -510,6 +530,12 @@ class Operate(serializers.Serializer):
510530

511531
def is_valid(self, *, raise_exception=False):
512532
super().is_valid(raise_exception=True)
533+
workspace_id = self.data.get('workspace_id')
534+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
535+
if workspace_id:
536+
query_set = query_set.filter(workspace_id=workspace_id)
537+
if not query_set.exists():
538+
raise AppApiException(500, _('Knowledge id does not exist'))
513539
document_id = self.data.get('document_id')
514540
if not QuerySet(Document).filter(id=document_id).exists():
515541
raise AppApiException(500, _('document id not exist'))
@@ -930,6 +956,12 @@ class Split(serializers.Serializer):
930956

931957
def is_valid(self, *, instance=None, raise_exception=True):
932958
super().is_valid(raise_exception=True)
959+
workspace_id = self.data.get('workspace_id')
960+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
961+
if workspace_id:
962+
query_set = query_set.filter(workspace_id=workspace_id)
963+
if not query_set.exists():
964+
raise AppApiException(500, _('Knowledge id does not exist'))
933965
files = instance.get('file')
934966
knowledge = Knowledge.objects.filter(id=self.data.get('knowledge_id')).first()
935967
for f in files:
@@ -1023,6 +1055,15 @@ class Batch(serializers.Serializer):
10231055
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
10241056
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
10251057

1058+
def is_valid(self, *, raise_exception=False):
1059+
super().is_valid(raise_exception=True)
1060+
workspace_id = self.data.get('workspace_id')
1061+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
1062+
if workspace_id:
1063+
query_set = query_set.filter(workspace_id=workspace_id)
1064+
if not query_set.exists():
1065+
raise AppApiException(500, _('Knowledge id does not exist'))
1066+
10261067
@staticmethod
10271068
def link_file(source_file_id, document_id):
10281069
if source_file_id is None:
@@ -1206,6 +1247,15 @@ class BatchGenerateRelated(serializers.Serializer):
12061247
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
12071248
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
12081249

1250+
def is_valid(self, *, raise_exception=False):
1251+
super().is_valid(raise_exception=True)
1252+
workspace_id = self.data.get('workspace_id')
1253+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
1254+
if workspace_id:
1255+
query_set = query_set.filter(workspace_id=workspace_id)
1256+
if not query_set.exists():
1257+
raise AppApiException(500, _('Knowledge id does not exist'))
1258+
12091259
def batch_generate_related(self, instance: Dict, with_valid=True):
12101260
if with_valid:
12111261
self.is_valid(raise_exception=True)

apps/knowledge/serializers/knowledge.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import uuid_utils.compat as uuid
1111
from celery_once import AlreadyQueued
1212
from django.core import validators
13-
from django.core.cache import cache
1413
from django.db import transaction, models
1514
from django.db.models import QuerySet
1615
from django.db.models.functions import Reverse, Substr
@@ -20,8 +19,6 @@
2019

2120
from application.models import ApplicationKnowledgeMapping
2221
from common.config.embedding_config import VectorStore
23-
from common.constants.cache_version import Cache_Version
24-
from common.constants.permission_constants import ResourceAuthType, ResourcePermission, ResourcePermissionRole
2522
from common.database_model_manage.database_model_manage import DatabaseModelManage
2623
from common.db.search import native_search, get_dynamics_model, native_page_search
2724
from common.db.sql_execute import select_list
@@ -227,6 +224,15 @@ class Operate(serializers.Serializer):
227224
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
228225
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
229226

227+
def is_valid(self, *, raise_exception=False):
228+
super().is_valid(raise_exception=True)
229+
workspace_id = self.data.get('workspace_id')
230+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
231+
if workspace_id:
232+
query_set = query_set.filter(workspace_id=workspace_id)
233+
if not query_set.exists():
234+
raise AppApiException(500, _('Knowledge id does not exist'))
235+
230236
@transaction.atomic
231237
def embedding(self, with_valid=True):
232238
if with_valid:
@@ -618,6 +624,12 @@ class SyncWeb(serializers.Serializer):
618624

619625
def is_valid(self, *, raise_exception=False):
620626
super().is_valid(raise_exception=True)
627+
workspace_id = self.data.get('workspace_id')
628+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
629+
if workspace_id:
630+
query_set = query_set.filter(workspace_id=workspace_id)
631+
if not query_set.exists():
632+
raise AppApiException(500, _('Knowledge id does not exist'))
621633
first = QuerySet(Knowledge).filter(id=self.data.get("knowledge_id")).first()
622634
if first is None:
623635
raise AppApiException(300, _('id does not exist'))
@@ -700,6 +712,12 @@ class HitTest(serializers.Serializer):
700712

701713
def is_valid(self, *, raise_exception=True):
702714
super().is_valid(raise_exception=True)
715+
workspace_id = self.data.get('workspace_id')
716+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
717+
if workspace_id:
718+
query_set = query_set.filter(workspace_id=workspace_id)
719+
if not query_set.exists():
720+
raise AppApiException(500, _('Knowledge id does not exist'))
703721
if not QuerySet(Knowledge).filter(id=self.data.get("knowledge_id")).exists():
704722
raise AppApiException(300, _('id does not exist'))
705723

apps/knowledge/serializers/paragraph.py

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from celery_once import AlreadyQueued
77
from django.db import transaction
88
from django.db.models import QuerySet, Count, F
9-
from django.db.models.aggregates import Max
109
from django.utils.translation import gettext_lazy as _
1110
from rest_framework import serializers
1211

@@ -67,12 +66,19 @@ class ParagraphSerializers(serializers.Serializer):
6766
content = serializers.CharField(required=True, max_length=102400, label=_('section title'))
6867

6968
class Problem(serializers.Serializer):
69+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
7070
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
7171
document_id = serializers.UUIDField(required=True, label=_('document id'))
7272
paragraph_id = serializers.UUIDField(required=True, label=_('paragraph id'))
7373

7474
def is_valid(self, *, raise_exception=False):
7575
super().is_valid(raise_exception=True)
76+
workspace_id = self.data.get('workspace_id')
77+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
78+
if workspace_id:
79+
query_set = query_set.filter(workspace_id=workspace_id)
80+
if not query_set.exists():
81+
raise AppApiException(500, _('Knowledge id does not exist'))
7682
if not QuerySet(Paragraph).filter(id=self.data.get('paragraph_id')).exists():
7783
raise AppApiException(500, _('Paragraph id does not exist'))
7884

@@ -127,7 +133,11 @@ def save(self, instance: Dict, with_valid=True, with_embedding=True, embedding_b
127133
}, model_id)
128134

129135
return ProblemSerializers.Operate(
130-
data={'knowledge_id': self.data.get('knowledge_id'), 'problem_id': problem.id}
136+
data={
137+
'workspace_id': self.data.get('workspace_id'),
138+
'knowledge_id': self.data.get('knowledge_id'),
139+
'problem_id': problem.id
140+
}
131141
).one(with_valid=True)
132142

133143
class Operate(serializers.Serializer):
@@ -141,6 +151,12 @@ class Operate(serializers.Serializer):
141151

142152
def is_valid(self, *, raise_exception=True):
143153
super().is_valid(raise_exception=True)
154+
workspace_id = self.data.get('workspace_id')
155+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
156+
if workspace_id:
157+
query_set = query_set.filter(workspace_id=workspace_id)
158+
if not query_set.exists():
159+
raise AppApiException(500, _('Knowledge id does not exist'))
144160
if not QuerySet(Paragraph).filter(id=self.data.get('paragraph_id')).exists():
145161
raise AppApiException(500, _('Paragraph id does not exist'))
146162

@@ -321,11 +337,21 @@ def or_get(exists_problem_list, content, knowledge_id):
321337
return Problem(id=uuid.uuid7(), content=content, knowledge_id=knowledge_id)
322338

323339
class Query(serializers.Serializer):
340+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
324341
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
325342
document_id = serializers.UUIDField(required=True, label=_('document id'))
326343
title = serializers.CharField(required=False, label=_('section title'))
327344
content = serializers.CharField(required=False)
328345

346+
def is_valid(self, *, raise_exception=False):
347+
super().is_valid(raise_exception=True)
348+
workspace_id = self.data.get('workspace_id')
349+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
350+
if workspace_id:
351+
query_set = query_set.filter(workspace_id=workspace_id)
352+
if not query_set.exists():
353+
raise AppApiException(500, _('Knowledge id does not exist'))
354+
329355
def get_query_set(self):
330356
query_set = QuerySet(model=Paragraph)
331357
query_set = query_set.filter(
@@ -357,6 +383,12 @@ def is_valid(self, *, raise_exception=True):
357383
knowledge_id = self.data.get('knowledge_id')
358384
paragraph_id = self.data.get('paragraph_id')
359385
problem_id = self.data.get("problem_id")
386+
workspace_id = self.data.get('workspace_id')
387+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
388+
if workspace_id:
389+
query_set = query_set.filter(workspace_id=workspace_id)
390+
if not query_set.exists():
391+
raise AppApiException(500, _('Knowledge id does not exist'))
360392
if not QuerySet(Paragraph).filter(knowledge_id=knowledge_id, id=paragraph_id).exists():
361393
raise AppApiException(500, _('Paragraph does not exist'))
362394
if not QuerySet(Problem).filter(knowledge_id=knowledge_id, id=problem_id).exists():
@@ -398,9 +430,19 @@ def un_association(self, with_valid=True):
398430
return True
399431

400432
class Batch(serializers.Serializer):
433+
workspace_id = serializers.CharField(required=False, label=_('workspace id'))
401434
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
402435
document_id = serializers.UUIDField(required=True, label=_('document id'))
403436

437+
def is_valid(self, *, raise_exception=False):
438+
super().is_valid(raise_exception=True)
439+
workspace_id = self.data.get('workspace_id')
440+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
441+
if workspace_id:
442+
query_set = query_set.filter(workspace_id=workspace_id)
443+
if not query_set.exists():
444+
raise AppApiException(500, _('Knowledge id does not exist'))
445+
404446
@transaction.atomic
405447
def batch_delete(self, instance: Dict, with_valid=True):
406448
if with_valid:
@@ -448,6 +490,12 @@ class Migrate(serializers.Serializer):
448490

449491
def is_valid(self, *, raise_exception=False):
450492
super().is_valid(raise_exception=True)
493+
workspace_id = self.data.get('workspace_id')
494+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
495+
if workspace_id:
496+
query_set = query_set.filter(workspace_id=workspace_id)
497+
if not query_set.exists():
498+
raise AppApiException(500, _('Knowledge id does not exist'))
451499
document_list = QuerySet(Document).filter(
452500
id__in=[self.data.get('document_id'), self.data.get('target_document_id')])
453501
document_id = self.data.get('document_id')
@@ -589,6 +637,15 @@ class AdjustPosition(serializers.Serializer):
589637
document_id = serializers.UUIDField(required=True, label=_('document id'))
590638
paragraph_id = serializers.UUIDField(required=True, label=_('paragraph id'))
591639

640+
def is_valid(self, *, raise_exception=False):
641+
super().is_valid(raise_exception=True)
642+
workspace_id = self.data.get('workspace_id')
643+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
644+
if workspace_id:
645+
query_set = query_set.filter(workspace_id=workspace_id)
646+
if not query_set.exists():
647+
raise AppApiException(500, _('Knowledge id does not exist'))
648+
592649
@transaction.atomic
593650
def adjust_position(self, new_position):
594651
"""

apps/knowledge/serializers/problem.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from rest_framework import serializers
1010

1111
from common.db.search import native_search, native_page_search
12+
from common.exception.app_exception import AppApiException
1213
from common.utils.common import get_file_content
1314
from knowledge.models import Problem, ProblemParagraphMapping, Paragraph, Knowledge, SourceType
1415
from knowledge.serializers.common import get_embedding_model_id_by_knowledge_id
@@ -59,8 +60,18 @@ class BatchAssociation(serializers.Serializer):
5960

6061
class ProblemSerializers(serializers.Serializer):
6162
class BatchOperate(serializers.Serializer):
63+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
6264
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
6365

66+
def is_valid(self, *, raise_exception=False):
67+
super().is_valid(raise_exception=True)
68+
workspace_id = self.data.get('workspace_id')
69+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
70+
if workspace_id:
71+
query_set = query_set.filter(workspace_id=workspace_id)
72+
if not query_set.exists():
73+
raise AppApiException(500, _('Knowledge id does not exist'))
74+
6475
def delete(self, problem_id_list: List, with_valid=True):
6576
if with_valid:
6677
self.is_valid(raise_exception=True)
@@ -123,9 +134,19 @@ def association(self, instance: Dict, with_valid=True):
123134
embedding_by_data_list(data_list, model_id=model_id)
124135

125136
class Operate(serializers.Serializer):
137+
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
126138
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
127139
problem_id = serializers.UUIDField(required=True, label=_('problem id'))
128140

141+
def is_valid(self, *, raise_exception=False):
142+
super().is_valid(raise_exception=True)
143+
workspace_id = self.data.get('workspace_id')
144+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
145+
if workspace_id:
146+
query_set = query_set.filter(workspace_id=workspace_id)
147+
if not query_set.exists():
148+
raise AppApiException(500, _('Knowledge id does not exist'))
149+
129150
def list_paragraph(self, with_valid=True):
130151
if with_valid:
131152
self.is_valid(raise_exception=True)
@@ -176,6 +197,15 @@ class Create(serializers.Serializer):
176197
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
177198
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
178199

200+
def is_valid(self, *, raise_exception=False):
201+
super().is_valid(raise_exception=True)
202+
workspace_id = self.data.get('workspace_id')
203+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
204+
if workspace_id:
205+
query_set = query_set.filter(workspace_id=workspace_id)
206+
if not query_set.exists():
207+
raise AppApiException(500, _('Knowledge id does not exist'))
208+
179209
def batch(self, problem_list, with_valid=True):
180210
if with_valid:
181211
self.is_valid(raise_exception=True)
@@ -205,6 +235,15 @@ class Query(serializers.Serializer):
205235
knowledge_id = serializers.UUIDField(required=True, label=_('knowledge id'))
206236
content = serializers.CharField(required=False, label=_('content'))
207237

238+
def is_valid(self, *, raise_exception=False):
239+
super().is_valid(raise_exception=True)
240+
workspace_id = self.data.get('workspace_id')
241+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
242+
if workspace_id:
243+
query_set = query_set.filter(workspace_id=workspace_id)
244+
if not query_set.exists():
245+
raise AppApiException(500, _('Knowledge id does not exist'))
246+
208247
def get_query_set(self):
209248
query_set = QuerySet(model=Problem)
210249
query_set = query_set.filter(

apps/knowledge/task/handler.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,10 @@ def save_problem(knowledge_id, document_id, paragraph_id, problem):
108108
if problem is None or len(problem) == 0:
109109
return
110110
try:
111+
workspace_id = QuerySet(Knowledge).filter(id=knowledge_id).first().workspace_id
111112
ParagraphSerializers.Problem(
112113
data={
114+
'workspace_id': workspace_id,
113115
"knowledge_id": knowledge_id,
114116
'document_id': document_id,
115117
'paragraph_id': paragraph_id

0 commit comments

Comments
 (0)