Skip to content

Commit 775a706

Browse files
committed
fix: Application workspace restrictions
1 parent d1fe600 commit 775a706

15 files changed

+153
-33
lines changed

apps/application/serializers/application.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def get_query_set(self, instance: Dict, workspace_manage: bool, is_x_pack_ee: bo
325325
auth_target_type="APPLICATION",
326326
workspace_id=workspace_id,
327327
user_id=user_id)} if (
328-
not workspace_manage and is_x_pack_ee) else {
328+
not workspace_manage) else {
329329
'folder_query_set': folder_query_set,
330330
'application_query_set': application_query_set,
331331
'application_custom_sql': application_custom_sql_query_set
@@ -551,7 +551,11 @@ class ApplicationOperateSerializer(serializers.Serializer):
551551

552552
def is_valid(self, *, raise_exception=False):
553553
super().is_valid(raise_exception=True)
554-
if not QuerySet(Application).filter(id=self.data.get('application_id')).exists():
554+
workspace_id = self.data.get('workspace_id')
555+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
556+
if workspace_id:
557+
query_set = query_set.filter(workspace_id=workspace_id)
558+
if not query_set.exists():
555559
raise AppApiException(500, _('Application id does not exist'))
556560

557561
def delete(self, with_valid=True):

apps/application/serializers/application_access_token.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
@desc:
88
"""
99
import hashlib
10-
import uuid_utils.compat as uuid
1110

11+
import uuid_utils.compat as uuid
1212
from django.core.cache import cache
1313
from django.db.models import QuerySet
1414
from django.utils.translation import gettext_lazy as _
1515
from rest_framework import serializers
1616

17-
from application.models import ApplicationAccessToken
17+
from application.models import ApplicationAccessToken, Application
1818
from common.constants.cache_version import Cache_Version
1919
from common.database_model_manage.database_model_manage import DatabaseModelManage
20+
from common.exception.app_exception import AppApiException
2021

2122

2223
class AccessTokenEditSerializer(serializers.Serializer):
@@ -44,6 +45,16 @@ class AccessTokenEditSerializer(serializers.Serializer):
4445

4546
class AccessTokenSerializer(serializers.Serializer):
4647
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
48+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
49+
50+
def is_valid(self, *, raise_exception=False):
51+
super().is_valid(raise_exception=True)
52+
workspace_id = self.data.get('workspace_id')
53+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
54+
if workspace_id:
55+
query_set = query_set.filter(workspace_id=workspace_id)
56+
if not query_set.exists():
57+
raise AppApiException(500, _('Application id does not exist'))
4758

4859
def edit(self, instance):
4960
self.is_valid(raise_exception=True)

apps/application/serializers/application_api_key.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@ class EditApplicationKeySerializer(serializers.Serializer):
3030

3131

3232
class ApplicationKeySerializer(serializers.Serializer):
33-
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
33+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
3434
application_id = serializers.UUIDField(required=True, label=_('application id'))
3535

3636
def is_valid(self, *, raise_exception=False):
3737
super().is_valid(raise_exception=True)
38-
application_id = self.data.get("application_id")
39-
application = QuerySet(Application).filter(id=application_id).first()
40-
if application is None:
41-
raise AppApiException(1001, _("Application does not exist"))
38+
workspace_id = self.data.get('workspace_id')
39+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
40+
if workspace_id:
41+
query_set = query_set.filter(workspace_id=workspace_id)
42+
if not query_set.exists():
43+
raise AppApiException(500, _('Application id does not exist'))
4244

4345
def generate(self, with_valid=True):
4446
if with_valid:
@@ -61,10 +63,19 @@ def list(self, with_valid=True):
6163
QuerySet(ApplicationApiKey).filter(application_id=application_id)]
6264

6365
class Operate(serializers.Serializer):
64-
workspace_id = serializers.CharField(required=True, label=_('workspace id'))
66+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
6567
application_id = serializers.UUIDField(required=True, label=_('application id'))
6668
api_key_id = serializers.UUIDField(required=True, label=_('ApiKeyId'))
6769

70+
def is_valid(self, *, raise_exception=False):
71+
super().is_valid(raise_exception=True)
72+
workspace_id = self.data.get('workspace_id')
73+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
74+
if workspace_id:
75+
query_set = query_set.filter(workspace_id=workspace_id)
76+
if not query_set.exists():
77+
raise AppApiException(500, _('Application id does not exist'))
78+
6879
def delete(self, with_valid=True):
6980
if with_valid:
7081
self.is_valid(raise_exception=True)

apps/application/serializers/application_chat.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
from openpyxl.cell.cell import ILLEGAL_CHARACTERS_RE
2323
from rest_framework import serializers
2424

25-
from application.models import Chat
25+
from application.models import Chat, Application
2626
from common.db.search import get_dynamics_model, native_search, native_page_search
27+
from common.exception.app_exception import AppApiException
2728
from common.utils.common import get_file_content
2829
from maxkb.conf import PROJECT_DIR
2930
from maxkb.settings import TIME_ZONE
@@ -48,6 +49,7 @@ class ApplicationChatRecordExportRequest(serializers.Serializer):
4849

4950

5051
class ApplicationChatQuerySerializers(serializers.Serializer):
52+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
5153
abstract = serializers.CharField(required=False, allow_blank=True, allow_null=True, label=_("summary"))
5254
start_time = serializers.DateField(format='%Y-%m-%d', label=_("Start time"))
5355
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))
@@ -61,6 +63,15 @@ class ApplicationChatQuerySerializers(serializers.Serializer):
6163
message=_("Only supports and|or"), code=500)
6264
])
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(Application).filter(id=self.data.get('application_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, _('Application id does not exist'))
74+
6475
def get_end_time(self):
6576
return datetime.datetime.combine(
6677
datetime.datetime.strptime(self.data.get('end_time'), '%Y-%m-%d'),

apps/application/serializers/application_chat_record.py

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
from rest_framework import serializers
1818
from rest_framework.utils.formatting import lazy_format
1919

20-
from application.models import ChatRecord, ApplicationAccessToken
20+
from application.models import ChatRecord, ApplicationAccessToken, Application
2121
from application.serializers.common import ChatInfo
2222
from common.db.search import page_search
2323
from common.exception.app_exception import AppApiException
2424
from common.utils.common import post
25-
from knowledge.models import Paragraph, Document, Problem, ProblemParagraphMapping
25+
from knowledge.models import Paragraph, Document, Problem, ProblemParagraphMapping, Knowledge
2626
from knowledge.serializers.common import get_embedding_model_id_by_knowledge_id, update_document_char_length
2727
from knowledge.serializers.paragraph import ParagraphSerializers
2828
from knowledge.task.embedding import embedding_by_paragraph, embedding_by_paragraph_list
@@ -39,12 +39,18 @@ class Meta:
3939

4040
class ChatRecordOperateSerializer(serializers.Serializer):
4141
chat_id = serializers.UUIDField(required=True, label=_("Conversation ID"))
42-
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
42+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
4343
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
4444
chat_record_id = serializers.UUIDField(required=True, label=_("Conversation record id"))
4545

4646
def is_valid(self, *, debug=False, raise_exception=False):
4747
super().is_valid(raise_exception=True)
48+
workspace_id = self.data.get('workspace_id')
49+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
50+
if workspace_id:
51+
query_set = query_set.filter(workspace_id=workspace_id)
52+
if not query_set.exists():
53+
raise AppApiException(500, _('Application id does not exist'))
4854
application_access_token = QuerySet(ApplicationAccessToken).filter(
4955
application_id=self.data.get('application_id')).first()
5056
if application_access_token is None:
@@ -72,10 +78,20 @@ def one(self, debug):
7278

7379

7480
class ApplicationChatRecordQuerySerializers(serializers.Serializer):
81+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
7582
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
7683
chat_id = serializers.UUIDField(required=True, label=_("Chat ID"))
7784
order_asc = serializers.BooleanField(required=False, allow_null=True, label=_("Is it in order"))
7885

86+
def is_valid(self, *, raise_exception=False):
87+
super().is_valid(raise_exception=True)
88+
workspace_id = self.data.get('workspace_id')
89+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
90+
if workspace_id:
91+
query_set = query_set.filter(workspace_id=workspace_id)
92+
if not query_set.exists():
93+
raise AppApiException(500, _('Application id does not exist'))
94+
7995
def list(self, with_valid=True):
8096
if with_valid:
8197
self.is_valid(raise_exception=True)
@@ -137,11 +153,24 @@ class Meta:
137153

138154

139155
class ChatRecordImproveSerializer(serializers.Serializer):
156+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
157+
158+
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
159+
140160
chat_id = serializers.UUIDField(required=True, label=_("Conversation ID"))
141161

142162
chat_record_id = serializers.UUIDField(required=True,
143163
label=_("Conversation record id"))
144164

165+
def is_valid(self, *, raise_exception=False):
166+
super().is_valid(raise_exception=True)
167+
workspace_id = self.data.get('workspace_id')
168+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
169+
if workspace_id:
170+
query_set = query_set.filter(workspace_id=workspace_id)
171+
if not query_set.exists():
172+
raise AppApiException(500, _('Application id does not exist'))
173+
145174
def get(self, with_valid=True):
146175
if with_valid:
147176
self.is_valid(raise_exception=True)
@@ -173,13 +202,21 @@ class ApplicationChatRecordImproveInstanceSerializer(serializers.Serializer):
173202

174203

175204
class ApplicationChatRecordAddKnowledgeSerializer(serializers.Serializer):
205+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
206+
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
176207
knowledge_id = serializers.UUIDField(required=True, label=_("Knowledge base id"))
177208
document_id = serializers.UUIDField(required=True, label=_("Document id"))
178209
chat_ids = serializers.ListSerializer(child=serializers.UUIDField(), required=True,
179210
label=_("Conversation ID"))
180211

181212
def is_valid(self, *, raise_exception=False):
182213
super().is_valid(raise_exception=True)
214+
workspace_id = self.data.get('workspace_id')
215+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
216+
if workspace_id:
217+
query_set = query_set.filter(workspace_id=workspace_id)
218+
if not query_set.exists():
219+
raise AppApiException(500, _('Application id does not exist'))
183220
if not Document.objects.filter(id=self.data['document_id'], knowledge_id=self.data['knowledge_id']).exists():
184221
raise AppApiException(500, gettext("The document id is incorrect"))
185222

@@ -255,6 +292,19 @@ class ApplicationChatRecordImproveSerializer(serializers.Serializer):
255292

256293
def is_valid(self, *, raise_exception=False):
257294
super().is_valid(raise_exception=True)
295+
workspace_id = self.data.get('workspace_id')
296+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
297+
if workspace_id:
298+
query_set = query_set.filter(workspace_id=workspace_id)
299+
if not query_set.exists():
300+
raise AppApiException(500, _('Application id does not exist'))
301+
302+
query_set = QuerySet(Knowledge).filter(id=self.data.get('knowledge_id'))
303+
if workspace_id:
304+
query_set = query_set.filter(workspace_id=workspace_id)
305+
if not query_set.exists():
306+
raise AppApiException(500, _('Knowledge id does not exist'))
307+
258308
if not QuerySet(Document).filter(id=self.data.get('document_id'),
259309
knowledge_id=self.data.get('knowledge_id')).exists():
260310
raise AppApiException(500, gettext("The document id is incorrect"))

apps/application/serializers/application_folder.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from rest_framework import serializers
22

33
from application.models import ApplicationFolder
4-
from knowledge.models import KnowledgeFolder
54

65

76
class ApplicationFolderTreeSerializer(serializers.ModelSerializer):

apps/application/serializers/application_stats.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
from django.utils.translation import gettext_lazy as _
1616
from rest_framework import serializers
1717

18-
from application.models import ApplicationChatUserStats
18+
from application.models import ApplicationChatUserStats, Application
1919
from common.db.search import native_search, get_dynamics_model
20+
from common.exception.app_exception import AppApiException
2021
from common.utils.common import get_file_content
2122
from maxkb.conf import PROJECT_DIR
2223

@@ -32,10 +33,20 @@ class ApplicationStatsSerializer(serializers.Serializer):
3233

3334

3435
class ApplicationStatisticsSerializer(serializers.Serializer):
36+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
3537
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
3638
start_time = serializers.DateField(format='%Y-%m-%d', label=_("Start time"))
3739
end_time = serializers.DateField(format='%Y-%m-%d', label=_("End time"))
3840

41+
def is_valid(self, *, raise_exception=False):
42+
super().is_valid(raise_exception=True)
43+
workspace_id = self.data.get('workspace_id')
44+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
45+
if workspace_id:
46+
query_set = query_set.filter(workspace_id=workspace_id)
47+
if not query_set.exists():
48+
raise AppApiException(500, _('Application id does not exist'))
49+
3950
def get_end_time(self):
4051
return datetime.datetime.combine(
4152
datetime.datetime.strptime(self.data.get('end_time'), '%Y-%m-%d'),

apps/application/serializers/application_version.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from django.utils.translation import gettext_lazy as _
1313
from rest_framework import serializers
1414

15-
from application.models import WorkFlowVersion
15+
from application.models import WorkFlowVersion, Application
1616
from common.db.search import page_search
1717
from common.exception.app_exception import AppApiException
1818

@@ -40,6 +40,7 @@ class ApplicationVersionSerializer(serializers.Serializer):
4040
workspace_id = serializers.CharField(required=False, label=_("Workspace ID"))
4141

4242
class Query(serializers.Serializer):
43+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
4344

4445
def get_query_set(self, query):
4546
query_set = QuerySet(WorkFlowVersion).filter(application_id=query.get('application_id'))
@@ -64,10 +65,20 @@ def page(self, query, current_page, page_size, with_valid=True):
6465
post_records_handler=lambda v: ApplicationVersionModelSerializer(v).data)
6566

6667
class Operate(serializers.Serializer):
68+
workspace_id = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_("Workspace ID"))
6769
application_id = serializers.UUIDField(required=True, label=_("Application ID"))
6870
work_flow_version_id = serializers.UUIDField(required=True,
6971
label=_("Workflow version id"))
7072

73+
def is_valid(self, *, raise_exception=False):
74+
super().is_valid(raise_exception=True)
75+
workspace_id = self.data.get('workspace_id')
76+
query_set = QuerySet(Application).filter(id=self.data.get('application_id'))
77+
if workspace_id:
78+
query_set = query_set.filter(workspace_id=workspace_id)
79+
if not query_set.exists():
80+
raise AppApiException(500, _('Application id does not exist'))
81+
7182
def one(self, with_valid=True):
7283
if with_valid:
7384
self.is_valid(raise_exception=True)

apps/application/sql/list_application_user.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ from (select application."id"::text,
1414
from application left join "user" on user_id = "user".id
1515
where application."id" in (select target
1616
from workspace_user_resource_permission
17-
where auth_target_type = 'APPLICATION'
17+
${workspace_user_resource_permission_query_set}
1818
and 'VIEW' = any (permission_list))
1919
UNION
2020
select application_folder."id",

apps/application/views/application_access_token.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AccessToken(APIView):
3737
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
3838
def put(self, request: Request, workspace_id: str, application_id: str):
3939
return result.success(
40-
AccessTokenSerializer(data={'application_id': application_id}).edit(
40+
AccessTokenSerializer(data={'workspace_id': workspace_id, 'application_id': application_id}).edit(
4141
request.data))
4242

4343
@extend_schema(
@@ -54,4 +54,5 @@ def put(self, request: Request, workspace_id: str, application_id: str):
5454
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
5555
)
5656
def get(self, request: Request, workspace_id: str, application_id: str):
57-
return result.success(AccessTokenSerializer(data={'application_id': application_id}).one())
57+
return result.success(
58+
AccessTokenSerializer(data={'workspace_id': workspace_id, 'application_id': application_id}).one())

0 commit comments

Comments
 (0)