Skip to content

Commit 3205ff2

Browse files
committed
feat: add knowledge management
1 parent ec643fc commit 3205ff2

File tree

10 files changed

+132
-35
lines changed

10 files changed

+132
-35
lines changed

apps/common/constants/permission_constants.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,14 @@ class PermissionConstants(Enum):
146146
TOOL_EXPORT = Permission(group=Group.TOOL, operate=Operate.USE, role_list=[RoleConstants.ADMIN,
147147
RoleConstants.USER])
148148

149+
KNOWLEDGE_MODULE_CREATE = Permission(group=Group.KNOWLEDGE, operate=Operate.CREATE, role_list=[RoleConstants.ADMIN,
150+
RoleConstants.USER])
151+
KNOWLEDGE_MODULE_READ = Permission(group=Group.KNOWLEDGE, operate=Operate.READ, role_list=[RoleConstants.ADMIN,
152+
RoleConstants.USER])
153+
KNOWLEDGE_MODULE_EDIT = Permission(group=Group.KNOWLEDGE, operate=Operate.EDIT, role_list=[RoleConstants.ADMIN,
154+
RoleConstants.USER])
155+
KNOWLEDGE_MODULE_DELETE = Permission(group=Group.KNOWLEDGE, operate=Operate.DELETE, role_list=[RoleConstants.ADMIN,
156+
RoleConstants.USER])
149157
def get_workspace_application_permission(self):
150158
return lambda r, kwargs: Permission(group=self.value.group, operate=self.value.operate,
151159
resource_path=
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# Generated by Django 5.2 on 2025-04-25 06:42
2+
3+
import django.db.models.deletion
4+
import knowledge.models.knowledge
5+
import mptt.fields
6+
import uuid_utils.compat
7+
from django.db import migrations, models
8+
9+
from knowledge.models import KnowledgeModule
10+
11+
12+
def insert_default_data(apps, schema_editor):
13+
# 创建一个根模块(没有父节点)
14+
KnowledgeModule.objects.create(id='root', name='根目录', user_id='f0dd8f71-e4ee-11ee-8c84-a8a1595801ab')
15+
16+
17+
18+
class Migration(migrations.Migration):
19+
20+
initial = True
21+
22+
dependencies = [
23+
('models_provider', '0001_initial'),
24+
('users', '0001_initial'),
25+
]
26+
27+
operations = [
28+
migrations.CreateModel(
29+
name='File',
30+
fields=[
31+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
32+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
33+
('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
34+
('file_name', models.CharField(default='', max_length=256, verbose_name='文件名称')),
35+
('loid', models.IntegerField(verbose_name='loid')),
36+
('meta', models.JSONField(default=dict, verbose_name='文件关联数据')),
37+
],
38+
options={
39+
'db_table': 'file',
40+
},
41+
),
42+
migrations.CreateModel(
43+
name='Knowledge',
44+
fields=[
45+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
46+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
47+
('id', models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False, verbose_name='主键id')),
48+
('name', models.CharField(max_length=150, verbose_name='知识库名称')),
49+
('desc', models.CharField(max_length=256, verbose_name='描述')),
50+
('type', models.IntegerField(choices=[(0, '通用类型'), (1, 'web站点类型'), (2, '飞书类型'), (3, '语雀类型')], default=0, verbose_name='类型')),
51+
('meta', models.JSONField(default=dict, verbose_name='元数据')),
52+
('embedding_mode', models.ForeignKey(default=knowledge.models.knowledge.default_model, on_delete=django.db.models.deletion.DO_NOTHING, to='models_provider.model', verbose_name='向量模型')),
53+
('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='users.user', verbose_name='所属用户')),
54+
],
55+
options={
56+
'db_table': 'knowledge',
57+
},
58+
),
59+
migrations.CreateModel(
60+
name='KnowledgeModule',
61+
fields=[
62+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
63+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
64+
('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False, verbose_name='主键id')),
65+
('name', models.CharField(max_length=64, verbose_name='文件夹名称')),
66+
('workspace_id', models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')),
67+
('lft', models.PositiveIntegerField(editable=False)),
68+
('rght', models.PositiveIntegerField(editable=False)),
69+
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
70+
('level', models.PositiveIntegerField(editable=False)),
71+
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='knowledge.knowledgemodule')),
72+
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.user', verbose_name='用户id')),
73+
],
74+
options={
75+
'db_table': 'knowledge_module',
76+
},
77+
),
78+
migrations.RunPython(insert_default_data),
79+
]

apps/knowledge/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .knowledge import *

apps/knowledge/models/knowledge.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
from django.db import models
33
from django.db.models.signals import pre_delete
44
from django.dispatch import receiver
5+
from mptt.fields import TreeForeignKey
6+
from mptt.models import MPTTModel
57

68
from common.db.sql_execute import select_one
79
from common.mixins.app_model_mixin import AppModelMixin
810
from models_provider.models import Model
911
from users.models import User
1012

1113

12-
class KnowledgeType(models.TextChoices):
14+
class KnowledgeType(models.IntegerChoices):
1315
base = 0, '通用类型'
1416
web = 1, 'web站点类型'
1517
lark = 2, '飞书类型'
@@ -21,7 +23,21 @@ def default_model():
2123
return uuid.UUID('42f63a3d-427e-11ef-b3ec-a8a1595801ab')
2224

2325

24-
class DataSet(AppModelMixin):
26+
class KnowledgeModule(MPTTModel, AppModelMixin):
27+
id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id")
28+
name = models.CharField(max_length=64, verbose_name="文件夹名称")
29+
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
30+
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
31+
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
32+
33+
class Meta:
34+
db_table = "knowledge_module"
35+
36+
class MPTTMeta:
37+
order_insertion_by = ['name']
38+
39+
40+
class Knowledge(AppModelMixin):
2541
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
2642
name = models.CharField(max_length=150, verbose_name="知识库名称")
2743
desc = models.CharField(max_length=256, verbose_name="描述")

apps/maxkb/settings/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
'drf_spectacular_sidecar',
4141
'users.apps.UsersConfig',
4242
'tools.apps.ToolConfig',
43+
'knowledge.apps.KnowledgeConfig',
4344
'common',
4445
'system_manage',
4546
'models_provider',

apps/modules/serializers/module.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from rest_framework import serializers
77

88
from common.constants.permission_constants import Group
9+
from knowledge.models import KnowledgeModule
910
from modules.api.module import ModuleCreateRequest
1011
from tools.models import ToolModule
1112
from tools.serializers.tool_module import ToolModuleTreeSerializer
@@ -18,8 +19,7 @@ def get_module_type(source):
1819
# todo app module
1920
return None
2021
elif source == Group.KNOWLEDGE.name:
21-
# todo knowledge module
22-
return None
22+
return KnowledgeModule
2323
else:
2424
return None
2525

apps/tools/migrations/0001_initial.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ class Migration(migrations.Migration):
2424
migrations.CreateModel(
2525
name='ToolModule',
2626
fields=[
27+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
28+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
2729
('id', models.CharField(editable=False, max_length=64, primary_key=True, serialize=False,
2830
verbose_name='主键id')),
2931
('name', models.CharField(max_length=64, verbose_name='文件夹名称')),
3032
('workspace_id',
3133
models.CharField(db_index=True, default='default', max_length=64, verbose_name='工作空间id')),
32-
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
33-
('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
3434
('lft', models.PositiveIntegerField(editable=False)),
3535
('rght', models.PositiveIntegerField(editable=False)),
3636
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
@@ -49,6 +49,8 @@ class Migration(migrations.Migration):
4949
migrations.CreateModel(
5050
name='Tool',
5151
fields=[
52+
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
53+
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
5254
('id',
5355
models.UUIDField(default=uuid_utils.compat.uuid7, editable=False, primary_key=True, serialize=False,
5456
verbose_name='主键id')),
@@ -68,8 +70,6 @@ class Migration(migrations.Migration):
6870
('template_id', models.UUIDField(default=None, null=True, verbose_name='模版id')),
6971
('workspace_id', models.CharField(default='default', max_length=64, verbose_name='工作空间id', db_index=True)),
7072
('init_params', models.CharField(max_length=102400, null=True, verbose_name='初始化参数')),
71-
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
72-
('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
7373
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.user',
7474
verbose_name='用户id')),
7575
('module',

apps/tools/models/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
# -*- coding: utf-8 -*-
22

33
from .tool import *
4-
from .tool_module import *

apps/tools/models/tool.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
import uuid_utils.compat as uuid
22
from django.db import models
3+
from mptt.fields import TreeForeignKey
4+
from mptt.models import MPTTModel
35

6+
from common.mixins.app_model_mixin import AppModelMixin
47
from users.models import User
5-
from .tool_module import ToolModule
8+
9+
10+
class ToolModule(MPTTModel, AppModelMixin):
11+
id = models.CharField(primary_key=True, max_length=64, editable=False, verbose_name="主键id")
12+
name = models.CharField(max_length=64, verbose_name="文件夹名称")
13+
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
14+
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
15+
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
16+
17+
class Meta:
18+
db_table = "tool_module"
19+
20+
class MPTTMeta:
21+
order_insertion_by = ['name']
622

723

824
class ToolScope(models.TextChoices):
@@ -15,7 +31,7 @@ class ToolType(models.TextChoices):
1531
CUSTOM = "CUSTOM", "自定义"
1632

1733

18-
class Tool(models.Model):
34+
class Tool(AppModelMixin):
1935
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid7, editable=False, verbose_name="主键id")
2036
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户id")
2137
name = models.CharField(max_length=64, verbose_name="工具名称")
@@ -33,8 +49,6 @@ class Tool(models.Model):
3349
module = models.ForeignKey(ToolModule, on_delete=models.CASCADE, verbose_name="模块id", default='root')
3450
workspace_id = models.CharField(max_length=64, verbose_name="工作空间id", default="default", db_index=True)
3551
init_params = models.CharField(max_length=102400, verbose_name="初始化参数", null=True)
36-
create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, null=True)
37-
update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, null=True)
3852

3953
class Meta:
40-
db_table = "tool"
54+
db_table = "tool"

apps/tools/models/tool_module.py

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)