Skip to content

Commit adba182

Browse files
Merge remote-tracking branch 'origin/v2' into v2
2 parents ced932b + 4dcd150 commit adba182

File tree

12 files changed

+555
-90
lines changed

12 files changed

+555
-90
lines changed

apps/common/constants/permission_constants.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,13 @@ class PermissionConstants(Enum):
211211
)
212212
KNOWLEDGE_READ = Permission(group=Group.KNOWLEDGE, operate=Operate.READ, role_list=[RoleConstants.ADMIN,
213213
RoleConstants.USER],
214-
resource_permission_group_list=[
215-
ResourcePermissionGroup.VIEW
216-
]
217-
)
214+
resource_permission_group_list=[ResourcePermissionGroup.VIEW])
218215
KNOWLEDGE_CREATE = Permission(group=Group.KNOWLEDGE, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
219216
RoleConstants.USER])
217+
KNOWLEDGE_EDIT = Permission(group=Group.KNOWLEDGE, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN,
218+
RoleConstants.USER])
219+
KNOWLEDGE_DELETE = Permission(group=Group.KNOWLEDGE, operate=Operate.DELETE, role_list=[RoleConstants.ADMIN,
220+
RoleConstants.USER])
220221

221222
def get_workspace_application_permission(self):
222223
return lambda r, kwargs: Permission(group=self.value.group, operate=self.value.operate,

apps/common/db/search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def get_dynamics_model(attr: dict, table_name='dynamics'):
2424
:return: django 模型
2525
"""
2626
attributes = {
27-
"__module__": "dataset.models",
27+
"__module__": "knowledge.models",
2828
"Meta": type("Meta", (), {'db_table': table_name}),
2929
**attr
3030
}

apps/knowledge/api/knowledge.py

Lines changed: 136 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,40 @@
33

44
from common.mixins.api_mixin import APIMixin
55
from common.result import ResultSerializer
6-
from knowledge.serializers.knowledge import KnowledgeBaseCreateRequest, KnowledgeModelSerializer
6+
from knowledge.serializers.knowledge import KnowledgeBaseCreateRequest, KnowledgeModelSerializer, KnowledgeEditRequest, \
7+
KnowledgeWebCreateRequest
78

89

910
class KnowledgeCreateResponse(ResultSerializer):
1011
def get_data(self):
1112
return KnowledgeModelSerializer()
1213

1314

15+
class KnowledgeReadAPI(APIMixin):
16+
@staticmethod
17+
def get_parameters():
18+
return [
19+
OpenApiParameter(
20+
name="workspace_id",
21+
description="工作空间id",
22+
type=OpenApiTypes.STR,
23+
location='path',
24+
required=True,
25+
),
26+
OpenApiParameter(
27+
name="knowledge_id",
28+
description="知识库id",
29+
type=OpenApiTypes.STR,
30+
location='path',
31+
required=True,
32+
)
33+
]
34+
35+
@staticmethod
36+
def get_response():
37+
return KnowledgeCreateResponse
38+
39+
1440
class KnowledgeBaseCreateAPI(APIMixin):
1541
@staticmethod
1642
def get_parameters():
@@ -48,14 +74,43 @@ def get_parameters():
4874

4975
@staticmethod
5076
def get_request():
51-
return KnowledgeBaseCreateRequest
77+
return KnowledgeWebCreateRequest
78+
79+
@staticmethod
80+
def get_response():
81+
return KnowledgeCreateResponse
82+
83+
84+
class KnowledgeEditAPI(APIMixin):
85+
@staticmethod
86+
def get_parameters():
87+
return [
88+
OpenApiParameter(
89+
name="workspace_id",
90+
description="工作空间id",
91+
type=OpenApiTypes.STR,
92+
location='path',
93+
required=True,
94+
),
95+
OpenApiParameter(
96+
name="knowledge_id",
97+
description="知识库id",
98+
type=OpenApiTypes.STR,
99+
location='path',
100+
required=True,
101+
)
102+
]
103+
104+
@staticmethod
105+
def get_request():
106+
return KnowledgeEditRequest
52107

53108
@staticmethod
54109
def get_response():
55110
return KnowledgeCreateResponse
56111

57112

58-
class KnowledgeTreeReadAPI(APIMixin):
113+
class KnowledgeTreeReadAPI(KnowledgeReadAPI):
59114
@staticmethod
60115
def get_parameters():
61116
return [
@@ -71,6 +126,83 @@ def get_parameters():
71126
description="文件夹id",
72127
type=OpenApiTypes.STR,
73128
location='query',
129+
required=True,
130+
),
131+
OpenApiParameter(
132+
name="user_id",
133+
description="用户id",
134+
type=OpenApiTypes.STR,
135+
location='query',
74136
required=False,
75-
)
137+
),
138+
OpenApiParameter(
139+
name="name",
140+
description="名称",
141+
type=OpenApiTypes.STR,
142+
location='query',
143+
required=False,
144+
),
145+
OpenApiParameter(
146+
name="desc",
147+
description="描述",
148+
type=OpenApiTypes.STR,
149+
location='query',
150+
required=False,
151+
),
152+
]
153+
154+
155+
class KnowledgePageAPI(KnowledgeReadAPI):
156+
@staticmethod
157+
def get_parameters():
158+
return [
159+
OpenApiParameter(
160+
name="workspace_id",
161+
description="工作空间id",
162+
type=OpenApiTypes.STR,
163+
location='path',
164+
required=True,
165+
),
166+
OpenApiParameter(
167+
name="current_page",
168+
description="当前页码",
169+
type=OpenApiTypes.INT,
170+
location='path',
171+
required=True,
172+
),
173+
OpenApiParameter(
174+
name="page_size",
175+
description="每页条数",
176+
type=OpenApiTypes.INT,
177+
location='path',
178+
required=True,
179+
),
180+
OpenApiParameter(
181+
name="folder_id",
182+
description="文件夹id",
183+
type=OpenApiTypes.STR,
184+
location='query',
185+
required=True,
186+
),
187+
OpenApiParameter(
188+
name="user_id",
189+
description="用户id",
190+
type=OpenApiTypes.STR,
191+
location='query',
192+
required=False,
193+
),
194+
OpenApiParameter(
195+
name="name",
196+
description="名称",
197+
type=OpenApiTypes.STR,
198+
location='query',
199+
required=False,
200+
),
201+
OpenApiParameter(
202+
name="desc",
203+
description="描述",
204+
type=OpenApiTypes.STR,
205+
location='query',
206+
required=False,
207+
),
76208
]
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Generated by Django 5.2 on 2025-04-29 08:02
2+
3+
import django.db.models.deletion
4+
import knowledge.models.knowledge
5+
import uuid_utils.compat
6+
from django.db import migrations, models
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('knowledge', '0002_document_paragraph_embedding_problem_and_more'),
13+
]
14+
15+
operations = [
16+
migrations.AlterField(
17+
model_name='document',
18+
name='status',
19+
field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'),
20+
),
21+
migrations.AlterField(
22+
model_name='paragraph',
23+
name='status',
24+
field=models.CharField(default=knowledge.models.knowledge.Status.__str__, max_length=20, verbose_name='状态'),
25+
),
26+
migrations.CreateModel(
27+
name='ApplicationKnowledgeMapping',
28+
fields=[
29+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
30+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
31+
('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
32+
('knowledge', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='knowledge.knowledge')),
33+
],
34+
options={
35+
'db_table': 'application_knowledge_mapping',
36+
},
37+
),
38+
]

apps/knowledge/models/knowledge.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,15 @@ class ProblemParagraphMapping(AppModelMixin):
197197
class Meta:
198198
db_table = "problem_paragraph_mapping"
199199

200+
class ApplicationKnowledgeMapping(AppModelMixin):
201+
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
202+
# application = models.ForeignKey(Application, on_delete=models.CASCADE)
203+
knowledge = models.ForeignKey(Knowledge, on_delete=models.CASCADE)
204+
205+
class Meta:
206+
db_table = "application_knowledge_mapping"
207+
208+
200209

201210
class SourceType(models.IntegerChoices):
202211
"""订单类型"""

apps/knowledge/serializers/common.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -160,18 +160,26 @@ def to_problem_model_list(self):
160160
content__in=problem_list).all()
161161
problem_content_dict = {}
162162
problem_model_list = [
163-
or_get(exists_problem_list, problemParagraphObject.problem_content, problemParagraphObject.knowledge_id,
164-
problemParagraphObject.document_id, problemParagraphObject.paragraph_id, problem_content_dict) for
165-
problemParagraphObject in self.problem_paragraph_object_list]
163+
or_get(
164+
exists_problem_list,
165+
problemParagraphObject.problem_content,
166+
problemParagraphObject.knowledge_id,
167+
problemParagraphObject.document_id,
168+
problemParagraphObject.paragraph_id, problem_content_dict
169+
) for problemParagraphObject in self.problem_paragraph_object_list]
166170

167171
problem_paragraph_mapping_list = [
168-
ProblemParagraphMapping(id=uuid.uuid7(), document_id=document_id, problem_id=problem_model.id,
169-
paragraph_id=paragraph_id,
170-
knowledge_id=self.knowledge_id) for
171-
problem_model, document_id, paragraph_id in problem_model_list]
172-
173-
result = [problem_model for problem_model, is_create in problem_content_dict.values() if
174-
is_create], problem_paragraph_mapping_list
172+
ProblemParagraphMapping(
173+
id=uuid.uuid7(),
174+
document_id=document_id,
175+
problem_id=problem_model.id,
176+
paragraph_id=paragraph_id,
177+
knowledge_id=self.knowledge_id
178+
) for problem_model, document_id, paragraph_id in problem_model_list]
179+
180+
result = [
181+
problem_model for problem_model, is_create in problem_content_dict.values() if is_create
182+
], problem_paragraph_mapping_list
175183
return result
176184

177185

apps/knowledge/serializers/document.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,17 @@ def refresh(self, state_list=None, with_valid=True):
7272
if embedding_model.permission_type == 'PRIVATE' and knowledge_user_id != embedding_model.user_id:
7373
raise AppApiException(500, _('No permission to use this model') + f"{embedding_model.name}")
7474
document_id = self.data.get("document_id")
75-
ListenerManagement.update_status(QuerySet(Document).filter(id=document_id), TaskType.EMBEDDING,
76-
State.PENDING)
77-
ListenerManagement.update_status(QuerySet(Paragraph).annotate(
78-
reversed_status=Reverse('status'),
79-
task_type_status=Substr('reversed_status', TaskType.EMBEDDING.value, 1),
80-
).filter(task_type_status__in=state_list, document_id=document_id).values('id'),
81-
TaskType.EMBEDDING, State.PENDING)
75+
ListenerManagement.update_status(
76+
QuerySet(Document).filter(id=document_id), TaskType.EMBEDDING, State.PENDING
77+
)
78+
ListenerManagement.update_status(
79+
QuerySet(Paragraph).annotate(
80+
reversed_status=Reverse('status'),
81+
task_type_status=Substr('reversed_status', TaskType.EMBEDDING.value, 1),
82+
).filter(task_type_status__in=state_list, document_id=document_id).values('id'),
83+
TaskType.EMBEDDING,
84+
State.PENDING
85+
)
8286
ListenerManagement.get_aggregation_document_status(document_id)()
8387

8488
try:
@@ -122,8 +126,9 @@ def save(self, instance: Dict, with_valid=False, **kwargs):
122126
# 批量插入问题
123127
QuerySet(Problem).bulk_create(problem_model_list) if len(problem_model_list) > 0 else None
124128
# 批量插入关联问题
125-
QuerySet(ProblemParagraphMapping).bulk_create(problem_paragraph_mapping_list) if len(
126-
problem_paragraph_mapping_list) > 0 else None
129+
QuerySet(ProblemParagraphMapping).bulk_create(
130+
problem_paragraph_mapping_list
131+
) if len(problem_paragraph_mapping_list) > 0 else None
127132
document_id = str(document_model.id)
128133
return (DocumentSerializers.Operate(
129134
data={'knowledge_id': knowledge_id, 'document_id': document_id}
@@ -160,13 +165,15 @@ def get_document_paragraph_model(knowledge_id, instance: Dict):
160165
'knowledge_id': knowledge_id,
161166
'id': uuid.uuid7(),
162167
'name': instance.get('name'),
163-
'char_length': reduce(lambda x, y: x + y,
164-
[len(p.get('content')) for p in instance.get('paragraphs', [])],
165-
0),
168+
'char_length': reduce(
169+
lambda x, y: x + y,
170+
[len(p.get('content')) for p in instance.get('paragraphs', [])],
171+
0),
166172
'meta': instance.get('meta') if instance.get('meta') is not None else {},
167173
'type': instance.get('type') if instance.get('type') is not None else KnowledgeType.BASE
168174
})
169175

170-
return DocumentSerializers.Create.get_paragraph_model(document_model,
171-
instance.get('paragraphs') if
172-
'paragraphs' in instance else [])
176+
return DocumentSerializers.Create.get_paragraph_model(
177+
document_model,
178+
instance.get('paragraphs') if 'paragraphs' in instance else []
179+
)

0 commit comments

Comments
 (0)