Repository navigation
Expand file tree
/
Copy pathhandler.py
More file actions
134 lines (114 loc) · 5.3 KB
/
Copy pathhandler.py
File metadata and controls
134 lines (114 loc) · 5.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# coding=utf-8
import re
import traceback
from common.utils.fork import ChildLink, Fork
from common.utils.logger import maxkb_logger
from common.utils.split_model import get_split_model
from django.db.models import QuerySet
from django.utils.translation import gettext_lazy as _
from knowledge.models import State
from knowledge.models.knowledge import Document, Knowledge, KnowledgeType
def get_save_handler(knowledge_id, user_id, selector):
from knowledge.serializers.document import DocumentSerializers
def handler(child_link: ChildLink, response: Fork.Response):
if response.status == 200:
try:
document_name = (
child_link.tag.text
if child_link.tag is not None and len(child_link.tag.text.strip()) > 0
else child_link.url
)
paragraphs = get_split_model("web.md").parse(response.content)
DocumentSerializers.Create(data={"knowledge_id": knowledge_id, "user_id": user_id}).save(
{
"name": document_name,
"paragraphs": paragraphs,
"meta": {"source_url": child_link.url, "selector": selector},
"type": KnowledgeType.WEB,
},
with_valid=True,
)
except Exception as e:
maxkb_logger.error(f"{str(e)}:{traceback.format_exc()}")
return handler
def get_sync_handler(knowledge_id, user_id):
from knowledge.serializers.document import DocumentSerializers
knowledge = QuerySet(Knowledge).filter(id=knowledge_id).first()
def handler(child_link: ChildLink, response: Fork.Response):
if response.status == 200:
try:
document_name = (
child_link.tag.text
if child_link.tag is not None and len(child_link.tag.text.strip()) > 0
else child_link.url
)
paragraphs = get_split_model("web.md").parse(response.content)
first = QuerySet(Document).filter(meta__source_url=child_link.url.strip(), knowledge=knowledge).first()
if first is not None:
# 如果存在,使用文档同步
DocumentSerializers.Sync(data={"document_id": first.id}).sync()
else:
# 插入
DocumentSerializers.Create(data={"knowledge_id": knowledge.id, "user_id": user_id}).save(
{
"name": document_name,
"paragraphs": paragraphs,
"meta": {"source_url": child_link.url.strip(), "selector": knowledge.meta.get("selector")},
"type": KnowledgeType.WEB,
},
with_valid=True,
)
except Exception as e:
maxkb_logger.error(f"{str(e)}:{traceback.format_exc()}")
return handler
def get_sync_web_document_handler(knowledge_id, user_id):
from knowledge.serializers.document import DocumentSerializers
def handler(source_url: str, selector, response: Fork.Response):
if response.status == 200:
try:
paragraphs = get_split_model("web.md").parse(response.content)
# 插入
DocumentSerializers.Create(data={"knowledge_id": knowledge_id, "user_id": user_id}).save(
{
"name": source_url[0:128],
"paragraphs": paragraphs,
"meta": {"source_url": source_url, "selector": selector},
"type": KnowledgeType.WEB,
},
with_valid=True,
)
except Exception as e:
maxkb_logger.error(f"{str(e)}:{traceback.format_exc()}")
else:
Document(
name=source_url[0:128],
knowledge_id=knowledge_id,
meta={"source_url": source_url, "selector": selector, "allow_download": True},
type=KnowledgeType.WEB,
char_length=0,
status=State.FAILURE,
).save()
return handler
def save_problem(knowledge_id, document_id, paragraph_id, problem):
from knowledge.serializers.paragraph import ParagraphSerializers
# print(f"knowledge_id: {knowledge_id}")
# print(f"document_id: {document_id}")
# print(f"paragraph_id: {paragraph_id}")
# print(f"problem: {problem}")
problem = re.sub(r"^\d+\.\s*", "", problem)
match = re.search(r"<question>(.*?)<\/question>", problem, flags=re.DOTALL)
problem = match.group(1) if match else None
if problem is None or len(problem) == 0:
return
try:
workspace_id = QuerySet(Knowledge).filter(id=knowledge_id).first().workspace_id
ParagraphSerializers.Problem(
data={
"workspace_id": workspace_id,
"knowledge_id": knowledge_id,
"document_id": document_id,
"paragraph_id": paragraph_id,
}
).save(instance={"content": problem}, with_valid=True)
except Exception as e:
maxkb_logger.error(_("Association problem failed {error}").format(error=str(e)))